医药|基于springboot的医药管理系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书(可指定任意题目)

目录

一、摘要

二、相关技术

三、系统设计

四、数据库设计

五、核心代码

六、论文参考

七、源码获取


一、摘要

计算机网络发展到现在已经好几十年了,在理论上面已经有了很丰富的基础,并且在现实生活中也到处都在使用,可以说,经过几十年的发展,互联网技术已经把地域信息的隔阂给消除了,让整个世界都可以即时通话和联系,极大的方便了人们的生活。所以说,医药管理系统用计算机技术来进行设计,不仅在管理方面更加的系统化,操作性强,最重要的是关于数据的保存和使用都能节约大量的时间,该系统非常的好用。

医药管理系统管理数据的工具是MySQL,编码的语言是Java,运用的框架是Spring Boot框架。该系统可以实现供应商类型管理,供应商信用等级管理,药品类型管理,供应商管理,药品管理,进货管理,销售管理等功能。

医药管理系统不仅能让操作人员使用更加地方便,并且设计的也很合理,能有效的避免误操作,让数据在录入的环节就符合设计需要,极大的规避了源头性的输入误差,顺利的让数据变得更加可控并且可靠,让出错的几率降到最低。

关键词:医药管理系统;供应商;药品

二、相关技术

java、tomcat、mysql、spring、springBoot、mybatis、query、vue

三、系统设计

3.1 整体功能设计图

对管理员具体功能的设计结果将以图4.1所示的管理员功能结构图来进行体现。管理员对于医药管理系统操作的功能包括增删改查药品,供应商,员工信息,管理药品进货和销售信息,管理供应商信用等级和药品类型信息等。

对员工具体功能的设计结果将以图4.2所示的员工功能结构图来进行体现。员工对于医药管理系统操作的功能包括查看供应商信息,查询药品,新增药品进货,新增药品销售,查询药品进货和销售信息。

3.2 功能具体细节设计

1、管理员功能实现

药品管理

该功能主要用于实现对药品基本信息的管理,药品管理界面的运行效果见图5.1。在此界面,管理员需要对药品所治疾病,药品功效,药品库存,药品照片,供应商名称等信息进行添加,如果发现有登记错误的药品信息,管理员则可以使用修改功能及时更正,对于需要删除的药品信息则可以使用删除功能及时删除。同时,管理员也能对药品库存进行管理,包括增加药品库存,减少药品库存等操作。

员工管理

该功能主要用于实现对员工基本信息的管理,员工管理界面的运行效果见图5.2。在此界面,员工的姓名,性别,员工的手机号码等信息都可以让管理员添加以及修改,同时,对于需要删除的员工信息,管理员也能及时删除。

供应商管理

该功能主要用于实现对供应商基本信息的管理,供应商管理界面的运行效果见图5.3。在此界面,管理员对供应商的信用等级,供应商名称,还有供应商的类型进行添加,当供应商信息比较多时,就需要管理员使用查询功能对供应商信息进行查询,查询前只需要在查询框中编辑供应商名称即可查询。

销售管理

销售管理界面的运行效果见图5.4。在此界面,管理员查看销售药品的员工信息以及销售的药品信息,可以更改药品销售数据,可以使用销售编号实现对销售药品的查询。

销售药品统计报表

销售药品统计报表界面的运行效果见图5.5。在此界面,管理员查看各种药品的销售数量信息,同时管理员可以下载销售药品统计报表,可以把销售药品统计报表在柱状图与折线图之间进行切换。

2、员工功能实现

进货管理

进货管理界面的运行效果见图5.6。在此界面,员工对药品进货详情进行查看,包括进货数量,进货时间等信息,员工也有权限新增药品进货信息,可以对药品的进货信息通过进货编号,药品编号等查询条件进行查询。

销售管理

销售管理界面的运行效果见图5.7。在此界面,员工对药品销售的详情进行查看,包括销售药品名称,销售编号,销售数量等信息,员工也有权限新增药品销售信息,可以对药品销售信息通过销售编号,药品功效,所致疾病等查询条件进行查询。

药品查看

药品查看界面的运行效果见图5.8。在此界面,员工查看药品库存,查看药品进价,药品售价,药品功效等信息。员工查询药品可以根据药品功效,所治疾病等字段进行查询。

四、数据库设计

(1)进货包括的属性有药品,进货数量,进货时间等。其属性图如下。

(2)销售包括的属性有药品,销售数量,销售时间等。其属性图如下。

(3)员工包括的属性有账户,密码,姓名等。其属性图如下。

(4)药品包括的属性有药品名称,药品进价,药品照片等。其属性图如下。

(5)设计的各实体间关系E-R图如下。

五、核心代码

复制代码
package com.service.impl;

import com.utils.StringUtil;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.*;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import com.utils.PageUtils;
import com.utils.Query;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import com.dao.DictionaryDao;
import com.entity.DictionaryEntity;
import com.service.DictionaryService;
import com.entity.view.DictionaryView;

/**
 * 字典 服务实现类
 */
@Service("dictionaryService")
@Transactional
public class DictionaryServiceImpl extends ServiceImpl<DictionaryDao, DictionaryEntity> implements DictionaryService {

    @Override
    public PageUtils queryPage(Map<String,Object> params) {
        if(params != null && (params.get("limit") == null || params.get("page") == null)){
            params.put("page","1");
            params.put("limit","10");
        }
        Page<DictionaryView> page =new Query<DictionaryView>(params).getPage();
        page.setRecords(baseMapper.selectListView(page,params));
        return new PageUtils(page);
    }

     /**
     * 赋值给字典表
     * @param obj view对象
     */
    public void dictionaryConvert(Object obj, HttpServletRequest request) {
        try {
            if (obj == null) return;
            //当前view和entity中的所有types的字段
            List<String> fieldNameList = new ArrayList<>();
            Class tempClass = obj.getClass();
            while (tempClass !=null) {
                Field[] declaredFields = tempClass.getDeclaredFields();
                for (Field f : declaredFields) {
                    f.setAccessible(true);
                    if (f.getType().getName().equals("java.lang.Integer") && f.getName().contains("Types")) {
                        fieldNameList.add(f.getName());
                    }
                }
                tempClass = tempClass.getSuperclass(); //得到父类,然后赋给自己
            }

            // 获取监听器中的字典表
//            ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext();
            ServletContext servletContext = request.getServletContext();
            Map<String, Map<Integer, String>> dictionaryMap= (Map<String, Map<Integer, String>>) servletContext.getAttribute("dictionaryMap");

            //通过Types的值给Value字段赋值
            for (String s : fieldNameList) {
                Field types = null;
                if(hasField(obj.getClass(),s)){
                    //判断view中有没有这个字段,有就通过反射取出字段
                    types= obj.getClass().getDeclaredField(s);//获取Types私有字段
                }else{
                    //本表中没有这个字段,说明它是父表中的字段,也就是entity中的字段,从entity中取值
                    types=obj.getClass().getSuperclass().getDeclaredField(s);
                }
                Field value = obj.getClass().getDeclaredField(s.replace("Types", "Value"));//获取value私有字段
                //设置权限
                types.setAccessible(true);
                value.setAccessible(true);

                //赋值
                if (StringUtil.isNotEmpty(String.valueOf(types.get(obj)))) { //types的值不为空
                    int i = Integer.parseInt(String.valueOf(types.get(obj)));//type
                    //把s1字符中的所有大写转小写,并在前面加 _
                    char[] chars = s.toCharArray();
                    StringBuffer sbf = new StringBuffer();
                    for(int  b=0; b< chars.length; b++){
                        char ch = chars[b];
                        if(ch <= 90 && ch >= 65){
                            sbf.append("_");
                            ch += 32;
                        }
                        sbf.append(ch);
                    }
                    String s2 = dictionaryMap.get(sbf.toString()).get(i);
                    value.set(obj, s2);
                } else {
                    new Exception("字典表赋值出现问题::::"+value.getName());
                    value.set(obj, "");
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 判断本实体有没有这个字段
     * @param c
     * @param fieldName
     * @return
     */
    public boolean hasField(Class c, String fieldName){
        Field[] fields = c.getDeclaredFields();

        for (Field f : fields) {
            if (fieldName.equals(f.getName())) {
                return true;

            }

        }

        return false;
    }

}

六、论文参考

七、源码获取

点赞、收藏、关注、评论啦。

联系即送开题报告和任务书,欢迎咨询

相关推荐
苏渡苇几秒前
Seata 番外篇:使用 docker-compose 部署 Seata Server(TC)及 K8S 部署 Seata 高可用
spring boot·docker·微服务·容器·kubernetes·seata·springcloud
日月云棠几秒前
12 Enum —— 枚举类型的底层实现
java·后端
工位植物人1 分钟前
深入理解Java中的类、抽象类、接口与枚举类
后端
AugustRed1 分钟前
Flyway 数据库版本迁移 零基础完整学习文档
数据库·学习
用户2181697049302 分钟前
Gin (二) 参数 路由分组
后端
用户925807911485 分钟前
nacos服务注册源码浅析
后端
weixin_BYSJ19876 分钟前
springboot旅游管理系统04470(附源码+开发文档+部署教程)
java·spring boot·python·算法·django·flask·旅游
Yvonne爱编码9 分钟前
数据库---Day9 视图(附完整数据库脚本+练习题)
数据库·mysql·oracle
sukioe11 分钟前
Redis 入门:为什么出现、核心原理与安装配置
数据库·redis·缓存
SimonKing12 分钟前
Java程序员接入AI的另一种姿势:LangChain4j
java·后端·程序员