Java项目:springboot私人牙医管理系统

news2025/7/4 21:34:45

作者主页:源码空间站2022

 简介:Java领域优质创作者、Java项目、学习资料、技术互助

文末获取源码

项目介绍

私人牙医管理系统。该项目分为前后台,共三种角色:管理员、医生、客户;

前台主要功能包括:首页、医生介绍、新闻资讯、关于我们、联系我们等功能;
后台管理员主要功能包括:
客户管理:客户信息统计、客户列表、添加客户;
医生管理:医生列表、病例列表、新增病例、添加医生;
药品管理:药品信息统计、药品列表、药品添加;
文章管理:文章列表、添加文章;

医生登录主要功能包括:
病例管理:在诊病历、历史病例、新增病例;
客户管理:客户列表、新增客户、预约信息;

普通客户登录主要功能包括:
基本信息、修改密码、预约信息、病例查看;

共10张表;

环境需要

1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。

2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;
3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可
4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS;
5.是否Maven项目: 是;查看源码目录中是否包含pom.xml;若包含,则为maven项目,否则为非maven项目 

6.数据库:MySql 8.0版本;

技术栈

1. 后端:SpringBoot

2. 前端:html+jQuery+layui+echarts

使用说明

1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;
2. 将项目中db.properties配置文件中的数据库配置改为自己的配置

3. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;

若为maven项目,导入成功后请执行maven clean;maven install命令,配置tomcat,然后运行;

4. 运行项目,
前台网站运行地址:http://localhost:8087/user/toCusWel
普通用户登录地址:http://localhost:8087/login/toUserLogin

后台运行地址:管理员及医生登录:http://localhost:8087/login/toDocLogin

运行截图

 

后台界面

代码相关

登录拦截器

@Component
public class UserLoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        HttpSession session = request.getSession(true);
        Object username = session.getAttribute("userName");
        String userId = (String) session.getAttribute("userId");
        if(username != null && userId != null){
            return true;
        }else {
            response.sendRedirect(request.getContextPath()+"/login/toDocLogin");
            return false;
        }
    }
}

 客户管理控制器

@Controller
@RequestMapping("/admin")
public class AdminHandler {
    @Resource
    private CustomerService customerService;

    @RequestMapping("/toCusList")
    public String toList(){
        return "admin/customer/cus_list";
    }

    @RequestMapping("/toCaseList")
    public String toCaseList(){
        return "admin/doctor/case_list";
    }

    @RequestMapping("/toAdminRePass")
    public String toRePass(){
        return "admin/admin_mess";
    }

    @RequestMapping("/toIndex")
    public String toIndex(){
        return "admin/customer/cus_index";
    }

    @RequestMapping("/toAdminWel")
    public String toWel(HttpSession session){
        String userId = (String) session.getAttribute("userId");
        if(userId.equals("admin")){
            return "admin/admin_wel";
        }else {
            return "redirect:/login/toDocLogin";
        }
    }

    @RequestMapping("/toAddCus")
    public String toAddCus(){
        return "admin/customer/cus_add";
    }

    // 按ID搜索客户信息
    @ResponseBody
    @GetMapping("/findById")
    public LayData findById(String customerId){
        LayData layData = customerService.layFindById(customerId);
        return layData;
    }

    // 按Name搜索客户信息
    @ResponseBody
    @GetMapping("/findByName")
    public LayData findByName(String customerName){
        LayData layData = customerService.layFindByName(customerName);
        return layData;
    }

    // 按ID删除客户信息
    @ResponseBody
    @GetMapping("/deleteById")
    public Integer deleteById(String customerId){
        Integer index = customerService.deleteById(customerId);
        return index;
    }

    //    执行弹出窗的操作
    @RequestMapping("/toCusInfo")
    public ModelAndView toCusInfo(String customerId){
        ModelAndView model = new ModelAndView();
        model.setViewName("admin/customer/cus_info");
        Customer customer = customerService.findById(customerId);
        model.addObject("cus",customer);
        return model;
    }
    // 修改客户信息
    @ResponseBody
    @RequestMapping("/saveCus")
    public Integer saveCus(@RequestBody Customer customer){
        System.out.println("获取到的Customer信息:" + customer);
        int index = customerService.update(customer);
        return index;
    }
    // 新增客户信息
    @ResponseBody
    @RequestMapping("/insertCus")
    public Integer insertCus(@RequestBody Customer customer){
        System.out.println("insertCus中的Customer信息:" + customer);
        int index = customerService.save(customer);
        return index;
    }
    @ResponseBody
    @RequestMapping("/toCusIndex")
    private CustomerAreaData toCusIndex(){
        CustomerAreaData cusAreaData = customerService.findCusAreaData();
        return cusAreaData;
    }
    //获取客户年龄段接口
    @ResponseBody
    @RequestMapping("/toCusIndex1")
    private CustomerLoginData toCusIndex1(){
        CustomerLoginData cusLoginMes = customerService.findCusLoginMes();
        return cusLoginMes;
    }
    @ResponseBody
    @RequestMapping("/toCusIndex2")
    private List<CustomerSexData> toCusIndex2(){
        List<CustomerSexData> cusSexData = customerService.findCusSexData();
        return cusSexData;
    }
}

客户逻辑

@Service
public class CustomerService {
    @Resource
    private CustomerRepository customerRepository;
    @Resource
    private CaseInfoRepository caseInfoRepository;
    @Resource
    private LoginInfoRepository loginInfoRepository;
    public int getAllCount(){
        return customerRepository.getAllCount();
    }

    public LayData findAllByDoc(String docId){
        LayData layData = new LayData();
        List<Customer> cusList = new ArrayList<>();
        List<CaseInfo> byDocId = caseInfoRepository.findByDocId(docId);
        Set<String> cusId = new HashSet<>();
        // 去除重复
        for (CaseInfo c:byDocId) {
            cusId.add(c.getCustomerId());
        }
        for(String id : cusId){
            Customer byId = customerRepository.findById(id);
            cusList.add(byId);
        }
        if(cusList.size() > 0){
            layData.setCode(0);
            layData.setData(cusList);
            layData.setCount(cusList.size());
            layData.setMsg("该医生的所有客户");
        }else {
            layData.setCode(0);
        }
        return layData;
    }

    public LayData findAll(Integer page, Integer limit) {
        LayData cusList = new LayData();
        List<Customer> all = customerRepository.findAll(((page - 1) * limit), limit);
        int count = customerRepository.getAllCount();
        if (all != null) {
            cusList.setCode(0);
            cusList.setData(all);
            cusList.setCount(count);
            cusList.setMsg("所有用户信息");
        } else {
            cusList.setCode(0);
        }
        return cusList;
    }
    // 分页展示查询
    public List<Customer> findAllCus() {
        int allCount = customerRepository.getAllCount();
        return customerRepository.findAll(0, allCount);
    }

    public Customer findById(String customerId) {
        Customer customer = customerRepository.findById(customerId);
        return customer;
    }
    // 用户列表界面:按ID搜索
    public LayData<Customer> layFindById(String customerId) {
        LayData cus = new LayData();
        Customer customer = customerRepository.findById(customerId);
        if(customer != null){
            List<Customer> cust = new ArrayList<>();
            cust.add(customer);
            cus.setData(cust);
            cus.setCount(1);
            cus.setMsg("按ID查找信息");
            cus.setCode(0);
        }else {
            cus.setCode(0);
        }
        return cus;
    }
    // 用户列表界面:按Name搜索
    public LayData layFindByName(String customerName) {
        LayData cus = new LayData();
        List<Customer> byName = customerRepository.findByName(customerName);
        if(byName.size() > 0){
            cus.setData(byName);
            cus.setCount(byName.size());
            cus.setMsg("按Name查找信息");
            cus.setCode(0);
        }else {
            cus.setCode(0);
        }
        return cus;
    }

    public int save(Customer customer) {
        customer.setCustomerId(getCustomerId());
        LoginInfo loginInfo = new LoginInfo();
        loginInfo.setUserId(customer.getCustomerId());
        loginInfo.setUsername(customer.getCustomerName());
        loginInfo.setPassword("123123");
        loginInfo.setUserSort(1);
        Integer save = loginInfoRepository.save(loginInfo);
        System.out.println("客户 账号信息存储状态:" + save);
        return customerRepository.save(customer);
    }

    public int update(Customer customer) {
        return customerRepository.update(customer);
    }

    public Integer getCount(String CustomerIdPrefix) {
        return customerRepository.getCount(CustomerIdPrefix);
    }

    public Integer deleteById(String customerId) {
        Integer index = loginInfoRepository.deleteById(customerId);
        System.out.println("客户 账号信息删除结果:" + index);
        return customerRepository.deleteById(customerId);
    }

    /*管理员模块*/
    // 获取客户的住址数据(重点)
    public CustomerAreaData findCusAreaData() {
        CustomerAreaData index = new CustomerAreaData();
        List<CustomerAddress> addr = new ArrayList<>();
        int allCount = customerRepository.getAllCount();
        List<Customer> all = customerRepository.findAll(0, allCount);
        List<CustomerAddress> addr2 = new ArrayList<>();
        for (Customer customer : all) {
            // 每次循环开始前,先清空addr2
            addr2.clear();
            // 拷贝数组
            for (CustomerAddress cc : addr) {
                try {
                    addr2.add(cc.clone());
                } catch (CloneNotSupportedException e) {
                    e.printStackTrace();
                }
            }
            if (customer.getAddress() == null || !customer.getAddress().contains("省")) {
                continue;
            }
            String area = getArea(customer.getAddress());
            for (CustomerAddress c1 : addr) {
                if (area.equals(c1.getName())) {
                    c1.setValue(c1.getValue() + 1);
                    break;  //结束该循环
                }
            }
            if (null != addr && null != addr2) {
                if (addr.containsAll(addr2) && addr2.containsAll(addr)) {
                    CustomerAddress aa = new CustomerAddress();
                    aa.setValue(1);
                    aa.setName(area);
                    addr.add(aa);
                } else {
                    continue;
                }
            }
        }
        index.setAddressCount(addr);
        String[] areaName = new String[addr.size()];
        for (int j = 0; j < addr.size(); j++) {
            areaName[j] = addr.get(j).getName();
        }
        index.setAreaName(areaName);
        return index;
    }

    // 获取客户的年龄段信息
    public CustomerLoginData findCusLoginMes() {
        CustomerLoginData cLogin = new CustomerLoginData();
        int allCount = customerRepository.getAllCount();
        List<Customer> all = customerRepository.findAll(0, allCount);
        List<Integer> data = new ArrayList<>();
        Integer a1 = 0, a2 = 0, a3 = 0, a4 = 0, a5 = 0, a6 = 0, a7 = 0, a8 = 0, a9 = 0, a10 = 0, a11 = 0, a12 = 0, a13 = 0;
        for (Customer cc : all) {
            if (cc.getAge() < 5) {
                a1++;
            } else if (cc.getAge() >= 5 && cc.getAge() < 10) {
                a2++;
            } else if (cc.getAge() >= 10 && cc.getAge() < 15) {
                a3++;
            } else if (cc.getAge() >= 15 && cc.getAge() < 20) {
                a4++;
            } else if (cc.getAge() >= 20 && cc.getAge() < 25) {
                a5++;
            } else if (cc.getAge() >= 25 && cc.getAge() < 30) {
                a6++;
            } else if (cc.getAge() >= 30 && cc.getAge() < 35) {
                a7++;
            } else if (cc.getAge() >= 35 && cc.getAge() < 40) {
                a8++;
            } else if (cc.getAge() >= 40 && cc.getAge() < 45) {
                a9++;
            } else if (cc.getAge() >= 45 && cc.getAge() < 50) {
                a10++;
            } else if (cc.getAge() >= 50 && cc.getAge() < 55) {
                a11++;
            } else if (cc.getAge() >= 55 && cc.getAge() < 60) {
                a12++;
            } else if (cc.getAge() >= 60) {
                a13++;
            }
        }
        data.add(a1);
        data.add(a2);
        data.add(a3);
        data.add(a4);
        data.add(a5);
        data.add(a6);
        data.add(a7);
        data.add(a8);
        data.add(a9);
        data.add(a10);
        data.add(a11);
        data.add(a12);
        data.add(a13);
        cLogin.setData(data);
        return cLogin;
    }

    //获取客户性别比例信息
    public List<CustomerSexData> findCusSexData(){
        List<CustomerSexData> sexData = new ArrayList<>();
        CustomerSexData sex1 = new CustomerSexData();
        CustomerSexData sex2 = new CustomerSexData();
        sex1.setValue(0);
        sex1.setName("男性");
        sex2.setValue(0);
        sex2.setName("女性");
        int allCount = customerRepository.getAllCount();
        List<Customer> all = customerRepository.findAll(0, allCount);
        for (Customer cc : all) {
            if(cc.getSex().equals("男")){
                sex1.setValue(sex1.getValue()+1);
            }else if(cc.getSex().equals("女")){
                sex2.setValue(sex2.getValue()+1);
            }
        }
        sexData.add(sex1);
        sexData.add(sex2);
        return sexData;
    }

    // 工具方法
    private String getArea(String address) {
        String s1;
        int index = address.indexOf("省");
        s1 = address.substring(0, index + 1);
        return s1;
    }

    // 自动生成下一客户ID
    private String getCustomerId() {
        String NextCustomerId = "";
        // 获取当前日期并转化为字符串
        SimpleDateFormat s = new SimpleDateFormat("yyyyMMdd");
        String s1 = s.format(new Date());
        // 获取该日期下已注册的客户数量
        Integer count = customerRepository.getCount(s1);
        // 改数量加1,获取下一个客户的ID尾号
        count++;
        // 若下一编号ID长度不足4位,则前面补0
        int length = count.toString().length();
        if (length < 4) {
            int i = 4 - length;
            for (int j = 0; j < i; j++) {
                NextCustomerId = NextCustomerId + "0";
            }
            NextCustomerId = s1 + NextCustomerId + count;
        }
        while (true){
            Customer byId = customerRepository.findById(NextCustomerId);
            if(byId == null){
                break;
            }else {
                String pro = NextCustomerId.substring(0, NextCustomerId.length() - length);
                String end = NextCustomerId.substring(NextCustomerId.length() - length);
                Integer num = Integer.parseInt(end);
                num++;
                NextCustomerId = pro + num;
            }
        }

        return NextCustomerId;
    }
}

如果也想学习本系统,下面领取。回复:043springboot

 

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

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

相关文章

【记录】Tiff图像的前处理,median blur filter 及 linear stretch

文章目录读取Tiffmedian blur filter 中值滤波器替换百分位值值域变成[0,255]从Google Earth Engine上下载的sentinel-1遥感影像(float32)。对于SAR影像在使用前可以做如下前处理&#xff1a;去除SAR噪点替换百分位2%以下及百分位98%以上的点linear stretch 将sentinel-1的值域…

【web3】使用web3.js发布并执行智能合约

前言 昨天我们学习了使用 web3.js 库查询链上区块和交易的用法&#xff0c;今天我们来介绍一下使用 web3.js 与智能合约的交互。在学习本节前&#xff0c;你应该对智能合约有一定的了解。 智能合约的生命周期包括 创建、发布、执行 以及 销毁。 创建&#xff1a;在 Remix 中…

华为云CDN,助力电商平台无惧流量洪峰

对于电子商务平台来说&#xff0c;接连不断的促销活动支撑着电子商务的基本运作&#xff0c;并且频率越来越高。618、双11、双12等越来越多的购物节创造了消费高峰&#xff0c;这就要求企业的网络基础设施能够承受住用户流量的洪峰。 目前&#xff0c;电子商务在网站运营上常常…

JavaWeb学习之MVC、jstl、El表达式06

目录 1.MVC:开发模式 2 mvc三层架构 2.EL表达式 1.使用 2.获取值 1.${域名称.键名} 2 ${键名} 3.隐式对象 3.jstl学习 1.概念 2.作用 3.使用步骤 4,常用的]STL标签 1.MVC:开发模式 1.jsp演变历史 1,早期只有servlet,只能使用response输出标签数据&#xff0c;非常…

艾美捷 24孔细胞划痕试验试剂盒检测原理说明

受伤的组织会引发一系列复杂而结构化的事件&#xff0c;以修复受损的组织区域这些事件可能包括血管生成因子增加血管化增殖和细胞外基质沉积&#xff0c;以及炎症免疫细胞的浸润破坏坏死组织的过程。伤口愈合过程开始于细胞向伤口&#xff0c;开始突出&#xff0c;迁移&#xf…

Html+JavaScript+Css 二手车价格评估系统设计开发

目录 一、系统设计技术及平台介绍 二、系统总体设计图 三、软件模块实现 3.1 登陆注册模块 3.2 主界面 3.3 车辆评估界面 3.4 评估记录界面 3.5 评估结果界面 3.6 个人信息界面 四、数据库实体设计 五、重置成本法简介 六、相关代码 6.1 登陆界面代码 6.2 主界面…

【TypeScript】TS安装与使用

目录 初识TypeScript TypeScript给JS添加类型支持的原因 TypeScript相比JS的优势 TS工具包的安装 TS文件的编译和运行 简化TS的运行步骤 初识TypeScript TypeScript&#xff08;简称&#xff1a;TS&#xff09;是JavaScript的超集&#xff08;JS有的TS都有&#xff09;。…

Python编程 制作一个超级浪漫的新年倒计时(附源代码)

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.新年介绍 二.代码介绍 1.应用的技术 &#xff08;1&#xff09;Pyga…

Java项目:springboot电影推荐网站

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 springboot电影推荐网站。本系统采用企业级开发标准&#xff0c;使用SpringBoot架构&#xff0c;数据访问层采用Spring Data Jpa&#xff0c;业…

工具(二):Nginx 扩展 OpenResty

OpenResty 介绍OpenResty 原理Nginx 模块Nginx的 lua插载点案例 配置模板nginx.conf通过Lua找到静态文件 — 商品页通过Lua 获取 redis 只返回 — 库存test 其他Demo MysqlOps.luaRedisExtOps.luaredisOps.lua 辅助工具类说明 自动生成静态页FTP 工具 Nginx_有5大优点&#x…

职场经验:游戏测试的主要工作及主要流程

01 游戏测试主要内容 1、功能测试 功能测试是游戏测试中最常见的模式&#xff0c;主要测试方法为黑盒测试 功能测试主要用来验证功能是否符合需求设计 功能测试主要考虑正确性&#xff0c;而不考虑游戏底层结构及代码错误 功能测试通常从界面着手开始测试&#xff0c;尽量…

【架构师(第五十一篇)】 服务端开发之技术方案设计

接口设计 把 server 端当做一个黑盒&#xff0c;它将如何与前端通讯&#xff1f; 功能范围 B 端&#xff0c;用户注册&#xff0c;作品管理&#xff0c;模板管理编辑器&#xff0c;单个作品的内容获取&#xff0c;修改&#xff0c;预览和发布 功能拆分 用户信息相关作品管…

线上牛奶配送

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 基于Java的线上牛奶配送系统的设计与实现 风网站前台&#xff1a;网站介绍、联系我们、公告信息、套餐类型、牛奶套餐、…

Linux-4 文件管理

Linux-4 文件管理 文件管理概述 谈到Linux文件管理&#xff0c;首先我们需要了解的是&#xff0c;我们要对文件做些什么事&#xff1f;其实无非就是对一个文件进行创建&#xff0c;复制&#xff0c;移动&#xff0c;查看&#xff0c;编辑&#xff0c;压缩&#xff0c;查找&am…

自己个人拥有一个可以支付功能的网站?当然可以了!保姆级演示!

文章目录前提条件演示应用申请开通和配置应用创建应用配置代码开发后端实例前端代码实例源码前提条件 这是必要条件&#xff01;&#xff01;&#xff01; 这是必要条件&#xff01;&#xff01;&#xff01; 这是必要条件&#xff01;&#xff01;&#xff01; 开通当面付&am…

人脸检测和对齐算法MTCNN

1. 概述 人脸识别在实际的生活中有着广泛的应用&#xff0c;得益于深度学习的发展&#xff0c;使得人脸识别的准确率得到大幅度提升。然而&#xff0c;为了做好人脸识别&#xff0c;第一步需要做的是对人脸检测&#xff0c;主要是通过对图片分析&#xff0c;定位出图片中的人脸…

Java项目:springboot网上点餐系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 功能介绍 SpringBoot在线订餐系统项目。主要功能说明&#xff1a; 分为两个角色&#xff0c;餐厅老板、普通用户 餐厅老板可以登录&#xff0c;注册&…

质量不错的蓝牙耳机有哪些?2023年值得选购的四款蓝牙耳机

现如今&#xff0c;蓝牙耳机越多人使用&#xff0c;不同于有线耳机&#xff0c;蓝牙耳机更为方便&#xff0c;没有线束的困扰&#xff0c;走到哪也不用带上手机一起&#xff0c;特别便利。然而&#xff0c;随着蓝牙耳机市场的旷大&#xff0c;各种类型各种样式的耳机五花八门&a…

C++ 实现并查集结构

前言 并查集一般用于多元素&#xff0c;多集合的查找问题&#xff1b; 听说很有用&#xff0c;但是平时好像确实没有怎么见过。。 leetcode典型例题&#xff1a;岛屿数量 一、原理 其实并查集的每个小集合就是一张有向图&#xff0c;只不过是所有子节点指向父节点的图结构。…

认证鉴权对于 API 网关的重要性

认证鉴权作为 API 网关不可或缺的能力&#xff0c;已然成为用户在选型 API 网关时考量的重要因素之一。 作者钱勇&#xff0c;API7.ai 开发工程师&#xff0c;Apache APISIX Committer 在当下云原生越发成熟的环境下&#xff0c;API 网关最核心的功能可以概括为&#xff1a;连接…