基于ssm宠物医院信息管理系统加论文

  🐱‍🏍 【晚安独角兽】:hello你好我是独角兽,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行!

 🎉   博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!

 🌹   吾等采石之人,应怀大教堂之心,愿我们奔赴在各自的热爱里…
 


数据库表结构

14张
开发工具

idea或者eclipse、navicat
⭐功能

【角色】管理员、用户、医生

【前台功能】

注册、登录、首页、医学知识、医生信息、医药信息、新闻资讯、留言反馈、我的、跳转到后台

【后台功能】

 登录、个人中心、用户管理、医生管理、医学知识管理、科室信息管理、医生信息管理、预约挂号管理、医嘱信息管理、药品信息管理、订单信息管理、留言板管理、系统管理(新闻资讯、轮播图管理)
🏆项目演示截图:   

1、前台首页

130859a01f51b5d17ecae31aceea3507.png

2、前台医学知识

301afe13753f3c0354da8bb744de24cd.png

3、前台医生信息

ddf8e04685f2a33a1bad0478b2c5a3d0.png

4、前台医生详情信息

4a32df7dae01bc7380388b5f5cdc2ee2.png

5、前台登录

8841c7bc17c6981fe5bd219cb845d5ea.png

6、前台注册用户

3f55da38f135fbb7a94883158ffe6036.png

7、前台预约医生

c0ff783da1822a772561d2dc89693654.png

8、前台药品信息

869b11cae2d8c65dbc4a6791ab0d42ac.png

9、前台药品详情

bf29fb64a57d4e4382fdb2d4b8d73abb.png

10、前台新闻资讯

492142f36aedc1eed3be7e6b849094c6.png

11、前台留言反馈

1dbab35da9b4b9ffb899333207e947f0.png

12、前台个人中心

783d45f7aa27585f81e8d35ef199c035.png

13、后台登录

ad424befea3117a40db397135cbe27ec.png

14、后台用户管理

cbbf334d14c5d6b9a64beb07731b914a.png

15、后台医生管理

4bff610beca5fb2620a29ad6a9eae350.png

16、后台医学知识管理

6bdff371cb330d1c2938e2959999bb6b.png

17、后台科室信息管理

e00db376d5ea2c677698b9d278cda04a.png

18、后台医生信息管理

81fa0985c19899565c30368cab5830b1.png

19、后台预约挂号管理

243b36fd377dc8263b80ba17535199c4.png

20、后台医嘱信息管理

fd02a1280dda452958aa8d8d677b9629.png

21、后台药品信息管理

df000df3419c4e55d934e88d502515d0.png

22、后台订单信息管理

f721031c491fc13291991ebb30886e3e.png

23、后台留言板管理

9e1626ee934b5d53a29dee9c4ada3e83.png

24、后台新闻资讯

0fccda761fed515698e38fff6dd7f4d7.png

核心功能代码实现

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page isELIgnored="true" %>
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     
      <title>登录</title>
      <link rel="stylesheet" href="../../layui/css/layui.css">
      <link rel="stylesheet" href="../../xznstatic/css/login.style.css">
    </head>
    <body>
      <div id="app">
        <div class="main">
          <h1 v-text="projectName"></h1>
          <div class="login-form">
            <h2>登 录</h2>
            <div class="agileits-top">
              <form class="layui-form">
                <div class="layui-form-item">
                  <div class="layui-input-block" style="margin-left: 0;">
                    <input type="text" name="username" required lay-verify="required" placeholder="请输入账号" autocomplete="off" class="layui-input" lay-ignore>
                  </div>
                </div>
                <div class="layui-form-item">
                  <div class="layui-input-block" style="margin-left: 0;">
                    <input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input" lay-ignore>
                  </div>
                </div>
                <div class="layui-form-item">
                  <div class="layui-input-block" style="text-align: left;margin-left: 0;">
                    <input v-if="item.tableName!='users'" v-for="(item,index) in menu" v-bind:key="index" type="radio" name="role" :value="item.tableName" :title="item.roleName">
                  </div>
                </div>
                <div class="layui-form-item" style="margin-bottom: 0;">
                  <div class="layui-input-block" style="margin-left: 0;">
                    <button class="layui-btn btn-submit layui-btn-fluid layui-btn-primary" lay-submit lay-filter="login">登录</button>
                  </div>
                </div>
                <div class="wthree-text" style="margin-top: 1em">
                  <ul>
                    <li><a style="margin-right: 10px;" v-if="item.tableName!='users'" v-for="(item,index) in menu" v-bind:key="index" :href="'javascript:registerClick(\''+item.tableName+'\')'">注册{{item.roleName.replace('注册','')}}</a></li>
                  </ul>
                  <div class="clear"></div>
                </div>
              </form>
            </div>
          </div>
        </div>
      </div>
     
      <script src="../../layui/layui.js"></script>
      <script src="../../js/vue.js"></script>
      <!-- 组件配置信息 -->
      <script src="../../js/config.js"></script>
      <!-- 扩展插件配置信息 -->
      <script src="../../modules/config.js"></script>
      <!-- 工具方法 -->
      <script src="../../js/utils.js"></script>
     
      <script>
        var vue = new Vue({
          el: '#app',
          data: {
            projectName: projectName,
            menu: menu
          },
          methods: {
            jump(url) {
              jump(url)
            }
          }
        });
     
        layui.use(['layer', 'element', 'carousel', 'form', 'http', 'jquery'], function() {
          var layer = layui.layer;
          var element = layui.element;
          var carousel = layui.carousel;
          var form = layui.form;
          var http = layui.http;
          var jquery = layui.jquery;
     
          // 登录
          form.on('submit(login)', function(data) {
            data = data.field;
            if (!data.role) {
              layer.msg('请选择登录用户类型', {
                time: 2000,
                icon: 5
              });
              return false;
            }
            http.request(data.role + '/login', 'get', data, function(res) {
              layer.msg('登录成功', {
                time: 2000,
                icon: 6
              });
              // 登录凭证
              localStorage.setItem('Token', res.token);
              localStorage.setItem('role', jquery('input[name="role"]:checked').attr('title'));
              // 当前登录用户角色
              localStorage.setItem('userTable', data.role);
              localStorage.setItem('sessionTable', data.role);
              // 用户名称
              localStorage.setItem('adminName', data.username);
              http.request(data.role + '/session', 'get', {}, function(res) {
                // 用户id
                localStorage.setItem('userid', res.data.id);
                // 路径访问设置
                window.location.href = '../../index.jsp';
              })
            });
            return false
          });
        });
     
        /**
          * 跳转登录
          * @param {Object} tablename
          */
        function registerClick(tablename) {
          window.location.href = '../' + tablename + '/register.jsp?tablename=' + tablename;
        }
      </script>
     
    </body>
     
    </html>

 2、登录Controller

    package com.controller;
     
     
    /**
     * 用户
     * 后端接口
     * @author 计算机编程-吉哥
     * @email
     * @date 2022-09-28 11:23:12
     */
    @RestController
    @RequestMapping("/yonghu")
    public class YonghuController {
     
        @Autowired
        private YonghuService yonghuService;
        
        @Autowired
        private TokenService tokenService;
        
        /**
         * 登录
         */
        @IgnoreAuth
        @RequestMapping(value = "/login")
        public R login(String username, String password, String captcha, HttpServletRequest request) {
            YonghuEntity user = yonghuService.selectOne(new EntityWrapper<YonghuEntity>().eq("yonghuming", username));
            if(user==null || !user.getMima().equals(password)) {
                return R.error("账号或密码不正确");
            }
            String token = tokenService.generateToken(user.getId(), username,"yonghu",  "用户" );
            return R.ok().put("token", token);
        }
        
        /**
         * 注册
         */
        @IgnoreAuth
        @RequestMapping("/register")
        public R register(@RequestBody YonghuEntity yonghu){
            //ValidatorUtils.validateEntity(yonghu);
            YonghuEntity user = yonghuService.selectOne(new EntityWrapper<YonghuEntity>().eq("yonghuming", yonghu.getYonghuming()));
            if(user!=null) {
                return R.error("注册用户已存在");
            }
            Long uId = new Date().getTime();
            yonghu.setId(uId);
            yonghuService.insert(yonghu);
            return R.ok();
        }
        
        /**
         * 退出
         */
        @RequestMapping("/logout")
        public R logout(HttpServletRequest request) {
            request.getSession().invalidate();
            return R.ok("退出成功");
        }
        
        /**
         * 获取用户的session用户信息
         */
        @RequestMapping("/session")
        public R getCurrUser(HttpServletRequest request){
            Long id = (Long)request.getSession().getAttribute("userId");
            YonghuEntity user = yonghuService.selectById(id);
            return R.ok().put("data", user);
        }
        
        /**
         * 密码重置
         */
        @IgnoreAuth
        @RequestMapping(value = "/resetPass")
        public R resetPass(String username, HttpServletRequest request){
            YonghuEntity user = yonghuService.selectOne(new EntityWrapper<YonghuEntity>().eq("yonghuming", username));
            if(user==null) {
                return R.error("账号不存在");
            }
            user.setMima("123456");
            yonghuService.updateById(user);
            return R.ok("密码已重置为:123456");
        }
     
    }

3、登录Service

    /**
     * 用户
     *
     * @author 计算机编程-吉哥
     * @email
     * @date 2022-09-28 11:23:12
     */
    public interface YonghuService extends IService<YonghuEntity> {
     
        PageUtils queryPage(Map<String, Object> params);
        
           List<YonghuVO> selectListVO(Wrapper<YonghuEntity> wrapper);
           
           YonghuVO selectVO(@Param("ew") Wrapper<YonghuEntity> wrapper);
           
           List<YonghuView> selectListView(Wrapper<YonghuEntity> wrapper);
           
           YonghuView selectView(@Param("ew") Wrapper<YonghuEntity> wrapper);
           
           PageUtils queryPage(Map<String, Object> params,Wrapper<YonghuEntity> wrapper);
           
    }

4、登录serviceImpl

    /**
     * @author 计算机编程-吉哥
     **/
    @Service("yonghuService")
    public class YonghuServiceImpl extends ServiceImpl<YonghuDao, YonghuEntity> implements YonghuService {
     
     
        @Override
        public PageUtils queryPage(Map<String, Object> params) {
            Page<YonghuEntity> page = this.selectPage(
                    new Query<YonghuEntity>(params).getPage(),
                    new EntityWrapper<YonghuEntity>()
            );
            return new PageUtils(page);
        }
        
        @Override
        public PageUtils queryPage(Map<String, Object> params, Wrapper<YonghuEntity> wrapper) {
              Page<YonghuView> page =new Query<YonghuView>(params).getPage();
                page.setRecords(baseMapper.selectListView(page,wrapper));
                PageUtils pageUtil = new PageUtils(page);
                return pageUtil;
         }
        
        @Override
        public List<YonghuVO> selectListVO(Wrapper<YonghuEntity> wrapper) {
             return baseMapper.selectListVO(wrapper);
        }
        
        @Override
        public YonghuVO selectVO(Wrapper<YonghuEntity> wrapper) {
             return baseMapper.selectVO(wrapper);
        }
        
        @Override
        public List<YonghuView> selectListView(Wrapper<YonghuEntity> wrapper) {
            return baseMapper.selectListView(wrapper);
        }
     
        @Override
        public YonghuView selectView(Wrapper<YonghuEntity> wrapper) {
            return baseMapper.selectView(wrapper);
        }
     
    }

5、登录Dao

    /**
     * 用户
     *
     * @author 计算机编程-吉哥
     * @email
     * @date 2022-09-29 11:23:12
     */
    public interface YonghuDao extends BaseMapper<YonghuEntity> {
        
        List<YonghuVO> selectListVO(@Param("ew") Wrapper<YonghuEntity> wrapper);
        
        YonghuVO selectVO(@Param("ew") Wrapper<YonghuEntity> wrapper);
        
        List<YonghuView> selectListView(@Param("ew") Wrapper<YonghuEntity> wrapper);
     
        List<YonghuView> selectListView(Pagination page,@Param("ew") Wrapper<YonghuEntity> wrapper);
        
        YonghuView selectView(@Param("ew") Wrapper<YonghuEntity> wrapper);
        
    }

6、登录Dao.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     
    <mapper namespace="com.dao.YonghuDao">
     
        <!-- 可根据自己的需求,是否要使用 -->
        <resultMap type="com.entity.YonghuEntity" id="yonghuMap">
            <result property="yonghuming" column="yonghuming"/>
            <result property="mima" column="mima"/>
            <result property="yonghuxingming" column="yonghuxingming"/>
            <result property="touxiang" column="touxiang"/>
            <result property="xingbie" column="xingbie"/>
            <result property="shoujihaoma" column="shoujihaoma"/>
        </resultMap>
     
        <select id="selectListVO"
            resultType="com.entity.vo.YonghuVO" >
            SELECT * FROM yonghu  yonghu         
            <where> 1=1 ${ew.sqlSegment}</where>
        </select>
        
        <select id="selectVO"
            resultType="com.entity.vo.YonghuVO" >
            SELECT  yonghu.* FROM yonghu  yonghu     
             <where> 1=1 ${ew.sqlSegment}</where>
        </select>
     
        <select id="selectListView"
            resultType="com.entity.view.YonghuView" >
     
            SELECT  yonghu.* FROM yonghu  yonghu             
            <where> 1=1 ${ew.sqlSegment}</where>
        </select>
        
        <select id="selectView"
            resultType="com.entity.view.YonghuView" >
            SELECT * FROM yonghu  yonghu <where> 1=1 ${ew.sqlSegment}</where>
        </select>
        
    </mapper>

四、专栏介绍

☕️最近开设的专栏整理了很多优秀Java项目,详细的分享了设计思路,计算机毕业生可以参考学习数据库设计,论文写作,项目优化等,每一篇博文均整理了相关系统可以设计的具体模块,以及详细的业务讲解,祝大家学业进步!

五、项目优化升级

📝希望有基础的学生可以自己做出更优质的项目

开发建议: 尽量基于SpringBoot框架搭建项目,因为潮流,简单,方便,易用!

数据库设计: 参考已有的类似项目设计数据库,深入挖掘自己选题要解决什么问题,即设计什么数据表

项目升级: 前端的话有条件使用vue +element等潮流的前端框架,前后端分离开发; 后台引入中间件 如消息队列+缓存Redis , 微信支付(根据业务定),Jwt单点登录,爬虫,算法等!


🐱‍👤希望我们未来更高处见……
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫叶(接毕设)QQ:3042127848

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值