项目编号:BS-YL-023
一,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
开发技术:Springboot+Mybatis+HTML
二,项目简介
药店管理系统在国内外都有相关的研究和应用。国内外研究背景主要包括以下几个方面:
- 国内医药信息化发展:随着我国医疗卫生事业的不断发展,医药信息化已成为国家战略发展的一部分。国内很多高校、科研机构和企业对医药信息化管理系统进行了深入研究,包括药品管理、库存管理、销售管理、财务管理等方面。
- 国外医疗信息化应用:在美国、欧洲等发达国家,医疗信息化水平较高,药店管理系统也得到了广泛应用和研究。许多医药连锁企业和零售药店采用先进的信息技术来管理药品、订单、客户关系等,提高了运营效率和服务水平。
- 学术研究成果:学术界也对药店管理系统进行了一定的研究,涉及信息技术、管理学、医药学等多个领域,提出了许多关于系统设计、应用案例、管理模式等方面的理论成果和实践经验。
- 实际案例与经验总结:在实际应用中,一些药店管理系统的设计与应用案例也为国内外的研究提供了宝贵的经验和借鉴。
总的来说,国内外在药店管理系统方面的研究背景丰富多样,涉及医药、信息技术、管理学等多个领域,通过借鉴和总结这些研究成果,可以为药店管理系统的设计和实际应用提供更好的理论指导和实践经验。
本次项目主要基于Springboot+HTML开发实现一个药店管理系统。面向的用户有两类,一个是消费者用户,一类是药店的员工,不同的用户登录系统实现的功能操作不同。
员工用户注册登录后可以实现的主要操作为:图形报表信息统计,药品数量统计,供货商数量统计,客户数量统计,销量信息统计。个人信息管理、药品类别管理、药品管理、客户管理、供货商管理、进货管理、退货管理、销售管理等模块。
个人用户注册登录后可以实现的操作为:个人信息管理、药品查询与购买、个人订单查询管理等。
三,系统展示
消费者用户操作:
注册登录
个人信息管理
药品查询与购买
己购商品查询
员工登录系统后
信息统计
个人信息管理
客户管理
药品类别管理
药品管理
客户管理
供货商管理
进货管理
退货管理
销售账单管理
四,核心代码展示
package cn.tedu.drug.controller; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpSession; import org.springframework.web.bind.annotation.ExceptionHandler; import cn.tedu.drug.service.exception.BarCodeDuplicateException; import cn.tedu.drug.service.exception.CategoryNameDuplicateException; import cn.tedu.drug.service.exception.DeleteException; import cn.tedu.drug.service.exception.EmailDuplicateException; import cn.tedu.drug.service.exception.ForeignKeyReferenceException; import cn.tedu.drug.service.exception.InsertException; import cn.tedu.drug.service.exception.InventoryException; import cn.tedu.drug.service.exception.InventoryFoundException; import cn.tedu.drug.service.exception.OnExistException; import cn.tedu.drug.service.exception.PasswordNotMatchException; import cn.tedu.drug.service.exception.PermissionsInsufficientException; import cn.tedu.drug.service.exception.PhoneDuplicateException; import cn.tedu.drug.service.exception.PhoneNotFoundException; import cn.tedu.drug.service.exception.ServiceException; import cn.tedu.drug.service.exception.SupplierNotFoundException; import cn.tedu.drug.service.exception.UpdateException; import cn.tedu.drug.service.exception.UserNotFoundException; import cn.tedu.drug.service.exception.YearMonthException; import cn.tedu.drug.util.ResponseResult; /** * 控制器类的基类 * * */ public abstract class BaseController { /** * 相应结果状态,成功 */ public static final Integer SUCCESS = 200; /** * 文件上传路径 */ public static final String UPLOAD_DIR = "upload"; /** * 确定允许上传的文件的大小为一兆 */ public static final long UPLOAD_MAX_SIZE = 1*1024*1024; /** * 确定允许上传的文件类型列表 */ public static final List<String> UPLOAD_CONTENT_TYPE = new ArrayList<String>(); static { UPLOAD_CONTENT_TYPE.add("image/png"); UPLOAD_CONTENT_TYPE.add("image/jpeg"); UPLOAD_CONTENT_TYPE.add("image/gif"); UPLOAD_CONTENT_TYPE.add("image/bmp"); } /** * 通过session获取uid * @param session * @return */ protected final Integer getUidFromSession(HttpSession session) { return Integer.valueOf( session.getAttribute("uid").toString() ); } /** * 处理异常 * @param e * @return */ @ExceptionHandler(ServiceException.class) public ResponseResult<Void> handleException(Throwable e){ ResponseResult<Void> rr = new ResponseResult<Void>(); rr.setMessage( e.getMessage() ); if( e instanceof PhoneDuplicateException ) { rr.setState(400); //400-电话冲突 }else if(e instanceof EmailDuplicateException){ rr.setState(401); //401-邮箱冲突 }else if(e instanceof OnExistException){ rr.setState(402); //402-入库单号冲突 }else if(e instanceof CategoryNameDuplicateException){ rr.setState(403); //403-药品类别名称重复异常 }else if(e instanceof UserNotFoundException){ rr.setState(404); //404-用户不存在异常 }else if(e instanceof BarCodeDuplicateException){ rr.setState(405); //405-药品条形码重复异常 }else if(e instanceof PhoneNotFoundException){ rr.setState(406); //手机号不存在异常 }else if(e instanceof PasswordNotMatchException){ rr.setState(407); //密码不存在异常 }else if(e instanceof YearMonthException){ rr.setState(406); //客户时间异常 }else if(e instanceof SupplierNotFoundException){ rr.setState(407); //供货商不存在异常 }else if(e instanceof PermissionsInsufficientException){ rr.setState(406); //员工权限不足异常 }else if(e instanceof InventoryFoundException){ rr.setState(407); //库存不足异常 }else if(e instanceof InventoryException){ rr.setState(406); //修改库存异常 }else if(e instanceof ForeignKeyReferenceException){ rr.setState(407); //外键引用异常 } else if(e instanceof InsertException){ rr.setState(500); //500插入数据异常 }else if(e instanceof UpdateException){ rr.setState(501); //501修改数据异常 }else if(e instanceof DeleteException){ rr.setState(502); //501删除改数据异常 } return rr; } }
package cn.tedu.drug.controller; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import com.fasterxml.jackson.core.JsonProcessingException; import cn.tedu.drug.controller.exception.FileContentTypeException; import cn.tedu.drug.controller.exception.FileEmptyException; import cn.tedu.drug.controller.exception.FileIOException; import cn.tedu.drug.controller.exception.FileIllegalStateException; import cn.tedu.drug.controller.exception.FileSizeException; import cn.tedu.drug.entity.Customer; import cn.tedu.drug.entity.CustomerTime; import cn.tedu.drug.entity.domain.PaginationVO; import cn.tedu.drug.service.ICustomerService; import cn.tedu.drug.util.ResponseResult; @RestController //相当于配置文件(Controller,ResponseBody) @RequestMapping("/customer") public class CustomerController extends BaseController { @Autowired //自动装配 private ICustomerService customerService; /** * 注册用户 * @param user * @return 返回成功 */ @RequestMapping("/reg") public ResponseResult<Void> reg(Customer customer) { customerService.reg(customer); return new ResponseResult<Void>(SUCCESS); } /** * 登录 * @param username * @param password * @return */ @PostMapping("/login") public ResponseResult<Customer> login(String phone,String password,HttpSession session) { Customer customer = customerService.getloginCustomer(phone, password); session.setAttribute( "user", customer ); session.setAttribute( "uid", customer.getUid()); session.setAttribute( "username", customer.getUsername() ); return new ResponseResult<Customer>(SUCCESS,customer); } /** * 查询客户数据,多条件查询 * @param drugCategory * @return * @throws JsonProcessingException */ @RequestMapping("/selectCustomer") public ResponseResult<PaginationVO<Customer>> selectCustomer (String username,String gender,String address,String pageNoStr,String pageSizeStr) throws JsonProcessingException { //获取参数 long pageNo = 1; //如果没有传数据,默认为第一页 if( pageNoStr != null && pageNoStr.trim().length()>0 ){ pageNo = Long.parseLong(pageNoStr); } int pageSize = 1; //如果没有传数据,默认为10条数据 if( pageSizeStr != null && pageSizeStr.trim().length()>0 ){ pageSize = Integer.parseInt(pageSizeStr); } long beginNo = (pageNo-1)*pageSize; Map<String ,Object> map = new HashMap<String ,Object>(); map.put("beginNo", beginNo); map.put("pageSize", pageSize); map.put("username", username); map.put("gender", gender); map.put("address", address); PaginationVO<Customer> vo = customerService.getSelectCustomer(map); return new ResponseResult<PaginationVO<Customer>>(SUCCESS,vo); } /** * 删除客户数据 * @param uid * @param session * @return */ @RequestMapping("/deleteCustomer") public ResponseResult<Void> deleteCustomer(Integer uid,HttpSession session){ String username = (String) session.getAttribute("username"); customerService.getdeleteId(uid, username); return new ResponseResult<Void>(SUCCESS); } /** * 修改客户数据 */ @RequestMapping("/updateCustomer") public ResponseResult<Void> updateCustomer(Customer customer,HttpSession session){ String username = (String) session.getAttribute("username"); customerService.getupdateCustomer(customer, username); return new ResponseResult<Void>(SUCCESS); } /** * 展示个人信息 */ @RequestMapping("/getfindByUid") public ResponseResult<Customer> getfindByUid(Integer uid){ Customer customer = customerService.getfindByUid(uid); return new ResponseResult<Customer>(SUCCESS,customer); } /** * 修改密码 */ @RequestMapping("/getfindByUidPassword") public ResponseResult<Void> getfindByUidPassword(Integer uid,HttpSession session,String oldPassword,String newPassword){ String username = (String) session.getAttribute("username"); customerService.getfindByUidPassword(uid, username, oldPassword, newPassword); return new ResponseResult<Void>(SUCCESS); } /** * 上传头像 * @param request * @param file * @return MultipartFile file */ @RequestMapping("/change_avatar") public ResponseResult<String> changeAvatar(HttpServletRequest request,@RequestParam("file") MultipartFile file){ if(file.isEmpty()) { throw new FileEmptyException("上传头像错误!上传文件不能为空!"); } if(!UPLOAD_CONTENT_TYPE.contains(file.getContentType())) { throw new FileContentTypeException("上传头像错误!不支持所选的文件类型!"); } if(file.getSize()>UPLOAD_MAX_SIZE) { throw new FileSizeException("上传文件过大!请选择小于"+UPLOAD_MAX_SIZE+"的文件!"); } String parentPath = request.getServletContext().getRealPath(UPLOAD_DIR); File parent = new File(parentPath); if(!parent.exists()) { parent.mkdirs(); } String originalFilename = file.getOriginalFilename(); //使用系统纳秒值给头像命名 //String prefic = System.nanoTime()+""; //使用uid+username为头像文件命名,新头像会将旧头像替换 HttpSession session = request.getSession(); String prefic = session.getAttribute("uid").toString()+session.getAttribute("username").toString(); int beginIndex = originalFilename.lastIndexOf("."); String suffix = ""; if(beginIndex > 0) { suffix = originalFilename.substring(beginIndex); } String filename = prefic+suffix; File dest = new File(parent,filename); try { file.transferTo(dest); } catch (IllegalStateException e) { e.printStackTrace(); throw new FileIllegalStateException("上传头像错误!存储头像文件时状态异常!"); } catch (IOException e) { e.printStackTrace(); throw new FileIOException("上传头像错误!读写文件时出现错误!"); } Integer uid = getUidFromSession(session); String avatar = "/"+UPLOAD_DIR+"/"+filename; customerService.changeAvatar(avatar,uid); return new ResponseResult<String>(SUCCESS,avatar); } /** * 查询客户的数量 */ @RequestMapping("/selectIdCount") public ResponseResult<Long> selectIdCount(){ Long count = customerService.getselectIdCount(); return new ResponseResult<Long>(SUCCESS,count); } /** * 图表展示,客户流量,输入年份,展示该年每一个月的客户注册量 * @param createdTime * @return */ @RequestMapping("/selectYearTime") public ResponseResult<List<CustomerTime>> selectYearTime(String createdTime){ String str = createdTime.substring(0, createdTime.indexOf("-")); Map<String,Object> map = new HashMap<String,Object>(); map.put("createdTime", str); List<CustomerTime> customerTimeList = customerService.getselectYearMonth(map); return new ResponseResult<List<CustomerTime>>(SUCCESS,customerTimeList); } }
五,相关作品展示
基于Java开发、Python开发、PHP开发、C#开发等相关语言开发的实战项目
基于Nodejs、Vue等前端技术开发的前端实战项目
基于微信小程序和安卓APP应用开发的相关作品
基于51单片机等嵌入式物联网开发应用
基于各类算法实现的AI智能应用
基于大数据实现的各类数据管理和推荐系统