医药|基于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;
}
}
六、论文参考
七、源码获取
点赞、收藏、关注、评论啦。
联系即送开题报告和任务书,欢迎咨询
👇🏻获取联系方式在文章末尾👇🏻