SpringBoot+Vue实现前后端分离的宠物医院管理系统

news2024/11/26 12:52:29

文末获取源码

开发语言:Java

使用框架:spring boot

前端技术:JavaScript、Vue.js 、css3

开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code

数据库:MySQL 5.7/8.0

数据库管理工具:phpstudy/Navicat

JDK版本:Java jdk8

Maven:apache-maven 3.8.1-bin

目录

 

一、前言介绍 

二、功能需求分析

2.1用户功能分析

2.2管理员功能分析

三、系统前台模块

3.1系统首页页面

3.2宠物百科页面

3.3医生介绍页面 

3.4医生详情页面 

3.5预约挂号页面 

四、管理员功能模块

4.1用户管理页面

4.2宠物百科管理页面 

4.3医生介绍管理页面 

4.4预约挂号管理页面 

5.5病历记录管理页面 

五、医生功能模块

5.1预约挂号管理页面 

5.2在线咨询管理页面 

六、用户功能模块

6.1预约挂号页面 

七、部分核心代码

7.1病历记录管理的关键代码 

7.2密码修改关键代码

7.3登录界面关键代码


 

一、前言介绍 

本系统是基于浏览器与服务器架构平台,完整的办公信息处理的欢欢宠物医院管理系统。采用跨平台的JAVA语言开发,利用WEB浏览器就可以使工作人员操作本应用,实现对系统各方位信息的操作,无论大型宠物医院还是小型宠物诊所,均可自建局域网管理,方便办公,减少不必要的成本消耗。该系统沿用MVC思想,利用springboot类的封装进行逻辑控制,利用Java技术完成访问页面的展示,利用MySQL数据库存储数据,最后Tomcat服务器完成网站发布,系统可在多个环境下运行。

本课题在经过了宠物医院正常办公流程下的需求分析后,完成实现了系统用户、医生介绍、预约挂号、病历记录、医疗器械、在线咨询、维修上报等功能。

二、功能需求分析

欢欢宠物医院管理系统主要是为了更加地完善宠物医疗的服务情况,对用户的信息、宠物信息和用户管理、宠物热点管理、会员留言管理、疫苗药物管理、订单列表管理、遗弃宠物管理、宠物饲料情况、招聘员工、志愿者申请等提供了方便的机制。本系统有多类使用者,分别是管理员和用户注册。以下是从这两种用户的角度分别介绍本系统所要实现的功能。

2.1用户功能分析

注册:首先检查用户名和邮箱是否存在,如不存在即可进行注册,并将用户输入的密码进行MD5加密,注册成功后提示注册成功,并将用户信息保存到数据库中。

登录:使用欢欢宠物医院管理系统前是需要用户登录个人账号。

医生介绍:用户登录宠物医院管理系统首页时,可以浏览医生介绍信息,根据不同地医生可以查看每个不同医生介绍信息等。

宠物百科:用户可以浏览宠物百科可以自行搜索某样宠物列表相关评论详情。遗弃

预约挂号:用户可以查看预约信息表的挂号状态,可以根据预约状态发起挂号申请:包括填写订单号、医生工号、医生姓名、科室、挂号费、用户名。

2.2管理员功能分析

用户管理:对用户进行管理,用户的注册,包括用户昵称、用户名、用户的宠物信息(宠物类别、宠物性别、年龄等)用户的账号信息:

医生介绍信息管理:对医生介绍信息进行维护,添加、删除、修改信息。

预约挂号信息管理:对预约挂号信息进行维护,添加、删除、修改信息。

病历记录信息管理:对病历记录信息进行维护,添加、删除、修改信息。

医疗器械信息管理:对医疗器械信息进行维护,添加、删除、修改信息。

维修上报信息管理:对维修上报信息进行维护,添加、删除、修改信息。

三、系统前台模块

3.1系统首页页面

f8f3a91c1f954c89947fe278bee6d28d.png

3.2宠物百科页面

eec9d603753e4c5a82000cc94e22b56a.png

3.3医生介绍页面 

b29e63c3ba574a2b98f9bb80e4fd0063.png

3.4医生详情页面 

dfad56de8f824efcadd4c761662749ec.png

3.5预约挂号页面 

6fedfa1130cb4358ab675f9b088d528b.png

四、管理员功能模块

4.1用户管理页面

44b768c0024f482f823835004f28f8f0.png

4.2宠物百科管理页面 

767048b5b33446d08f9e1aa336886e1d.png

4.3医生介绍管理页面 

d6c7875b574444e9a4630d2721861978.png

4.4预约挂号管理页面 

777408ff92bd430094ae178e75bd04b5.png

5.5病历记录管理页面 

de3ad6b2854743a099ca8e2978e8963e.png

五、医生功能模块

5.1预约挂号管理页面 

b664d243b78b4799ae8f3fc7b257ca51.png

5.2在线咨询管理页面 

5e695e0ed456413dab1ab135f3f1f1ae.png

六、用户功能模块

6.1预约挂号页面 

295242e82f75403395959b56f842b035.png

七、部分核心代码

7.1病历记录管理的关键代码 

 @PostMapping("/add")

    @Transactional

    public Map<String, Object> add(HttpServletRequest request) throws IOException {

        service.insert(service.readBody(request.getReader()));

        return success(1);

    }

    @Transactional

    public Map<String, Object> addMap(Map<String,Object> map){

        service.insert(map);

        return success(1);

}

    public Map<String,Object> readBody(BufferedReader reader){

        BufferedReader br = null;

        StringBuilder sb = new StringBuilder("");

        try{

            br = reader;

            String str;

            while ((str = br.readLine()) != null){

                sb.append(str);

            }

            br.close();

            String json = sb.toString();

            return JSONObject.parseObject(json, Map.class);

        }catch (IOException e){

            e.printStackTrace();

        }finally{

            if (null != br){

                try{

                    br.close();

                }catch (IOException e){

                    e.printStackTrace();

                }

            }

        }

        return null;

}

    public void insert(Map<String,Object> body){

        StringBuffer sql = new StringBuffer("INSERT INTO ");

        sql.append("`").append(table).append("`").append(" (");

        for (Map.Entry<String,Object> entry:body.entrySet()){

            sql.append("`"+humpToLine(entry.getKey())+"`").append(",");

        }

        sql.deleteCharAt(sql.length()-1);

        sql.append(") VALUES (");

        for (Map.Entry<String,Object> entry:body.entrySet()){

            Object value = entry.getValue();

            if (value instanceof String){

                sql.append("'").append(entry.getValue()).append("'").append(",");

            }else {

                sql.append(entry.getValue()).append(",");

            }

        }

        sql.deleteCharAt(sql.length() - 1);

        sql.append(")");

        log.info("[{}] - 插入操作:{}",table,sql);

        Query query = runCountSql(sql.toString());

        query.executeUpdate();

    }

7.2密码修改关键代码

/**

     * 修改密码

     * @param data

     * @param request

     * @return

     */

    @PostMapping("change_password")

    public Map<String, Object> change_password(@RequestBody Map<String, String> data, HttpServletRequest request){

        // 根据Token获取UserId

        String token = request.getHeader("x-auth-token");

        Integer userId = tokenGetUserId(token);

        // 根据UserId和旧密码获取用户

        Map<String, String> query = new HashMap<>();

        String o_password = data.get("o_password");

        query.put("user_id" ,String.valueOf(userId));

        query.put("password" ,service.encryption(o_password));

        Query ret = service.count(query, service.readConfig(request));

        List list = ret.getResultList();

        Object s = list.get(0);

        int count = Integer.parseInt(list.get(0).toString());

        if(count > 0){

            // 修改密码

            Map<String,Object> form = new HashMap<>();

            form.put("password",service.encryption(data.get("password")));

            service.update(query,service.readConfig(request),form);

            return success(1);

        }

        return error(10000,"密码修改失败!");

    }

7.3登录界面关键代码

/**

     * 登录

     * @param data

     * @param httpServletRequest

     * @return

     */

    @PostMapping("login")

    public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {

        log.info("[执行登录接口]");

        String username = data.get("username");

        String email = data.get("email");

        String phone = data.get("phone");

        String password = data.get("password");

        List resultList = null;

        Map<String, String> map = new HashMap<>();

        if(username != null && "".equals(username) == false){

            map.put("username", username);

            resultList = service.select(map, new HashMap<>()).getResultList();

        }

        else if(email != null && "".equals(email) == false){

            map.put("email", email);

            resultList = service.select(map, new HashMap<>()).getResultList();

        }

        else if(phone != null && "".equals(phone) == false){

            map.put("phone", phone);

            resultList = service.select(map, new HashMap<>()).getResultList();

        }else{

            return error(30000, "账号或密码不能为空");

        }

        if (resultList == null || password == null) {

            return error(30000, "账号或密码不能为空");

        }

        //判断是否有这个用户

        if (resultList.size()<=0){

            return error(30000,"用户不存在");

        }

        User byUsername = (User) resultList.get(0);

        Map<String, String> groupMap = new HashMap<>();

        groupMap.put("name",byUsername.getUserGroup());

        List groupList = userGroupService.select(groupMap, new HashMap<>()).getResultList();

        if (groupList.size()<1){

            return error(30000,"用户组不存在");

        }

        UserGroup userGroup = (UserGroup) groupList.get(0);

        //查询用户审核状态

        if (!StringUtils.isEmpty(userGroup.getSourceTable())){

            String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();

            String res = String.valueOf(service.runCountSql(sql).getSingleResult());

            if (res==null){

                return error(30000,"用户不存在");

            }

            if (!res.equals("已通过")){

                return error(30000,"该用户审核未通过");

            }

        }

        //查询用户状态

        if (byUsername.getState()!=1){

            return error(30000,"用户非可用状态,不能登录");

        }

        String md5password = service.encryption(password);

        if (byUsername.getPassword().equals(md5password)) {

            // 存储Token到数据库

            AccessToken accessToken = new AccessToken();

            accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));

            accessToken.setUser_id(byUsername.getUserId());

            tokenService.save(accessToken);

            // 返回用户信息

            JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));

            user.put("token", accessToken.getToken());

            JSONObject ret = new JSONObject();

            ret.put("obj",user);

            return success(ret);

        } else {

            return error(30000, "账号或密码不正确");

        }

}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/50307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Fiddler抓包工具是最强大最好用的 Web 调试工具之一

Fiddler是最强大最好用的Web调试工具之一&#xff0c;它能记录所有客户端和服务器的http和https请求&#xff0c;允许你监视&#xff0c;设置断点&#xff0c;甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说&#xff0c;都有很大的帮助。 目录 Fiddler的基本介绍 …

【C++11重点语法上】lambda表达式,初始化列表

目录 引子&#xff1a;C11为什么的源来 语法1&#xff1a;初始化列表 1.2.2 多个对象的列表初始化 语法3&#xff1a;默认成员函数控制&#xff08;delete&#xff0c;default&#xff09; 语法4&#xff1a;lambda表达式 引子&#xff1a;C11为什么的源来 在2003年C标准…

22年11月-外包-面试题

目录背景题目Spring怎么解决循环依赖&#xff1f;什么是循环依赖第一种&#xff1a;互相依赖第二种&#xff1a;三者间依赖第三种&#xff1a;自我依赖三级缓存补充&#xff1a;那第三级缓存的作用是什么&#xff1f;补充&#xff1a;Spring 中哪些情况下&#xff0c;不能解决循…

【Hadoop】在云服务器上部署Hadoop2.7.1伪分布式集群

文章目录一、准备Hadoop压缩包并安装1、安装Hadoop&#xff08;1&#xff09;准备好hadoop压缩包&#xff08;2&#xff09;安装hadoop&#xff08;3&#xff09;查看是否安装成功2、将hadoop添加到环境变量&#xff08;1&#xff09;在文件末尾添加以下内容&#xff08;2&…

怎样图片转文字?两分钟让你实现快速转文字

在日常的办公中&#xff0c;我们经常会遇到需要将纸质文件里的文字提取出来&#xff0c;再转换为电子档的情况&#xff0c;如果我们采用手动输入的话&#xff0c;不仅速度太慢&#xff0c;而且还可能因此耽误到后边的工作&#xff0c;是不是已经有小伙伴遇到这种现象&#xff0…

[附源码]Python计算机毕业设计Django房产中介管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

[附源码]计算机毕业设计springboot路政管理信息系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

RFC(Remote function call)

文章目录1 Definition2 Call process3. Communication4 Communication module5 RFC version .6 RFC and Web service7 Remote object maintain8 Call RFC1 Definition 2 Call process 3. Communication 4 Communication module 5 RFC version . 6 RFC and Web service 7 Remote…

mysql的主从复制

文章目录前言主备原理binlog的三种格式循环复制问题主备的搭建总结前言 mysql在日常中的使用是比较多的&#xff0c;大部分可能也都搭建过主从复制&#xff0c;或者集群模式。但是其中的原理不知道大家是否清楚。今天我们主要介绍的就是mysql主从复制的原理。 主备原理 主备…

Transformer对接公司需求的调研报告

1. 结构 从宏观的视角开始 首先将这个模型看成是一个黑箱操作。在机器翻译中&#xff0c;就是输入一种语言&#xff0c;输出另一种语言。 那么拆开这个黑箱&#xff0c;我们可以看到它是由编码组件、解码组件和它们之间的连接组成。 编码组件部分由一堆编码器&#xff08;enc…

Open vSwitch系列之数据结构解析深入分析ofpbuf

上一篇我们分析了hmap&#xff0c;hamp可以说是Open vSwitch中基石结构&#xff0c;很多Open vSwitch中数据结构都依赖hmap。本篇我们来分析一下ofpbuf&#xff0c;这个结构&#xff0c;我们从名字上就可得知&#xff0c;此数据结构用于存储数据的&#xff0c;比如收发OpenFlow…

1543_AURIX_TC275_CPU子系统_CPU内核实现特性

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这个章节看的信息应该是针对内核设计实现上TC275的具体实现特点&#xff0c;应该是覆盖了很多内核中的实施相关的特性的。 1. 在上下文功能支持上&#xff0c;P和更灵活一些。E核只支持DSP…

[附源码]Python计算机毕业设计SSM辽宁科技大学二手车交易平台(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

非常强,批处理框架 Spring Batch 就该这么用!(场景实战)

前言 概念词就不多说了&#xff0c;我简单地介绍下 &#xff0c; spring batch 是一个 方便使用的 较健全的 批处理 框架。 为什么说是方便使用的&#xff0c;因为这是 基于spring的一个框架&#xff0c;接入简单、易理解、流程分明。 为什么说是较健全的&#xff0c; 因为它…

NVIDIA 7th SkyHackathon(八)使用 Flask 与 Vue 开发 Web

1.页面效果 Web 采用 flaskvue 开发&#xff0c;效果图如下 2.后端 import sys import subprocess import os from PIL import Image from datetime import datetime from ASR_metrics import utils as metricsfrom werkzeug.wrappers import Request, Response from …

卡尔曼滤波:过滤随机游走

本文是Quantitative Methods and Analysis: Pairs Trading此书的读书笔记。 我们知道&#xff0c;随机游走序列是到当前时间为止白噪声实现(white noise realization)的简单求和。换句话说&#xff0c;随机游走序列中的对下一个时间点值的估计&#xff08;预测&#xff09;是通…

为什么程序员买不起房子?

很多人都说程序员的收入那么高&#xff0c;为什么程序员还是买不起房呢&#xff1f;其实不是程序员不想买&#xff0c;是真的买不起…… 拿北京为例。北京的房价可谓是越来越奇葩&#xff0c;不仅仅是因为银行政策导致贷款越来越难审批下来&#xff0c;更重要的是进入地产市场…

音频3A算法详解

一、音频3A技术背景 手机电脑等智能设备的普及,AI智能、5G等技术的不断发展,语音通信成为了最方便快捷的远程交流方式,会议全向麦克风、会议一体化终端等会议系统逐渐成为企业经营中的重要工具。语音质量决定了企业远程沟通协作效果,其中噪音和回声能够严重影响到语音预处理…

图扑软件获评 2022 年“火炬瞪羚企业”

厦门火炬高新区 2022 年“火炬瞪羚企业”名单公布&#xff0c;图扑软件经过层层遴选&#xff0c;成功入围&#xff0c;获评 2022 年“火炬瞪羚企业”称号。 在 2021 年&#xff0c;图扑软件已经凭借领先的技术实力和发展潜力&#xff0c;入选福建省数字经济领域“瞪羚”创新企业…

连续学习入门(二):连续学习的三种类型

说明&#xff1a;本系列文章若无特别说明&#xff0c;则在技术上将 Continual Learning&#xff08;连续学习&#xff09;等同于 Incremental Learning&#xff08;增量学习&#xff09;、Lifelong Learning&#xff08;终身学习&#xff09;&#xff0c;关于 Continual Learni…