毕业设计|基于Springboot实现药店管理系统

简介: 毕业设计|基于Springboot实现药店管理系统

一,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

开发技术:Springboot+Mybatis+HTML

二,项目简介

药店管理系统在国内外都有相关的研究和应用。国内外研究背景主要包括以下几个方面:

  1. 国内医药信息化发展:随着我国医疗卫生事业的不断发展,医药信息化已成为国家战略发展的一部分。国内很多高校、科研机构和企业对医药信息化管理系统进行了深入研究,包括药品管理、库存管理、销售管理、财务管理等方面。
  2. 国外医疗信息化应用:在美国、欧洲等发达国家,医疗信息化水平较高,药店管理系统也得到了广泛应用和研究。许多医药连锁企业和零售药店采用先进的信息技术来管理药品、订单、客户关系等,提高了运营效率和服务水平。
  3. 学术研究成果:学术界也对药店管理系统进行了一定的研究,涉及信息技术、管理学、医药学等多个领域,提出了许多关于系统设计、应用案例、管理模式等方面的理论成果和实践经验。
  4. 实际案例与经验总结:在实际应用中,一些药店管理系统的设计与应用案例也为国内外的研究提供了宝贵的经验和借鉴。

总的来说,国内外在药店管理系统方面的研究背景丰富多样,涉及医药、信息技术、管理学等多个领域,通过借鉴和总结这些研究成果,可以为药店管理系统的设计和实际应用提供更好的理论指导和实践经验。

本次项目主要基于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智能应用

基于大数据实现的各类数据管理和推荐系统


相关文章
|
10天前
|
安全 Java API
SpringBoot + 事务钩子函数,打造高效支付系统!
【8月更文挑战第9天】在当今快速发展的数字支付时代,构建一个稳定、高效且安全的支付系统是企业数字化转型的关键一步。SpringBoot以其简洁的配置、快速的开发速度以及强大的生态支持,成为了构建支付系统的热门选择。而结合事务钩子函数(Transaction Hooks),则能进一步确保支付流程的完整性、一致性和可维护性。以下,我将分享如何利用SpringBoot与事务钩子函数来打造高效支付系统的技术实践。
39 15
SpringBoot + 事务钩子函数,打造高效支付系统!
|
1天前
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
|
1天前
|
NoSQL JavaScript 前端开发
SpringBoot+Vue实现校园二手系统。前后端分离技术【完整功能介绍+实现详情+源码】
文章介绍了如何使用SpringBoot和Vue实现一个校园二手系统,采用前后端分离技术。系统具备完整的功能,包括客户端和管理员端的界面设计、个人信息管理、商品浏览和交易、订单处理、公告发布等。技术栈包括Vue框架、ElementUI、SpringBoot、Mybatis-plus和Redis。文章还提供了部分源代码,展示了前后端的请求接口和Redis验证码功能实现,以及系统重构和模块化设计的一些思考。
SpringBoot+Vue实现校园二手系统。前后端分离技术【完整功能介绍+实现详情+源码】
|
5天前
|
JavaScript Java Spring
springboot+vue 实现校园二手商城(毕业设计一)
这篇文章介绍了一个使用Spring Boot和Vue实现的校园二手商城系统的毕业设计,包括用户和商家的功能需求,如登录注册、订单管理、商品评价、联系客服等,以及项目依赖项的安装过程。
springboot+vue 实现校园二手商城(毕业设计一)
|
5天前
|
JavaScript Java BI
Springboot+vue 实现汽车租赁系统(毕业设计二)(前后端项目分离)
这篇文章介绍了如何使用Springboot和Vue实现一个前后端分离的汽车租赁系统,包括系统的功能模块和管理员与业务员的使用界面。
Springboot+vue 实现汽车租赁系统(毕业设计二)(前后端项目分离)
|
5天前
|
Java 数据库连接 mybatis
基于SpringBoot+MyBatis的餐饮点餐系统
本文介绍了一个基于SpringBoot和MyBatis开发的餐饮点餐系统,包括系统的主控制器`IndexController`的代码实现,该控制器负责处理首页、点餐、登录、注册、订单管理等功能,适用于毕业设计项目。
9 0
基于SpringBoot+MyBatis的餐饮点餐系统
|
1月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的公园管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的公园管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
5天前
|
SQL JavaScript 前端开发
vue中使用分页组件、将从数据库中查询出来的数据分页展示(前后端分离SpringBoot+Vue)
这篇文章详细介绍了如何在Vue.js中使用分页组件展示从数据库查询出来的数据,包括前端Vue页面的表格和分页组件代码,以及后端SpringBoot的控制层和SQL查询语句。
vue中使用分页组件、将从数据库中查询出来的数据分页展示(前后端分离SpringBoot+Vue)
|
18小时前
|
JavaScript Java Maven
毕设项目&课程设计&毕设项目:springboot+vue实现的在线求职管理平台(含教程&源码&数据库数据)
本文介绍了一款基于Spring Boot和Vue.js实现的在线求职平台。该平台采用了前后端分离的架构,使用Spring Boot作为后端服务
毕设项目&课程设计&毕设项目:springboot+vue实现的在线求职管理平台(含教程&源码&数据库数据)
|
4天前
|
前端开发 JavaScript Java
SpringBoot+Vue+token实现(表单+图片)上传、图片地址保存到数据库。上传图片保存位置自己定义、图片可以在前端回显(一))
这篇文章详细介绍了在SpringBoot+Vue项目中实现表单和图片上传的完整流程,包括前端上传、后端接口处理、数据库保存图片路径,以及前端图片回显的方法,同时探讨了图片资源映射、token验证、过滤器配置等相关问题。