创建一个基于SSM框架的药品商超管理系统

创建一个基于SSM(Spring + Spring MVC + MyBatis)框架的药品商超管理系统是一个涉及多个步骤的过程。以下是一个详细的开发指南,包括项目结构、数据库设计、配置文件、Mapper接口、Service层、Controller层和前端页面的示例。
在这里插入图片描述

1. 需求分析

明确系统的主要功能需求,例如:

  • 用户注册与登录
  • 药品信息管理(增删改查)
  • 库存管理
  • 销售订单管理
  • 供应商管理
  • 报表统计
  • 管理员管理功能

2. 技术选型

确定使用的技术栈:

  • 后端:Spring, Spring MVC, MyBatis
  • 前端:HTML, CSS, JavaScript (可选框架如Vue.js或React.js)
  • 数据库:MySQL
  • 服务器:Tomcat

3. 数据库设计

设计数据库模型,比如用户表、药品表、库存表、订单表等。这里以用户表、药品表和订单表为例:

user
CREATE TABLE `user` (`id` INT AUTO_INCREMENT PRIMARY KEY,`username` VARCHAR(50) NOT NULL UNIQUE,`password` VARCHAR(100) NOT NULL,`email` VARCHAR(100),`phone` VARCHAR(20),`role` VARCHAR(50) DEFAULT 'user',`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP
);
medicine
CREATE TABLE `medicine` (`id` INT AUTO_INCREMENT PRIMARY KEY,`name` VARCHAR(255) NOT NULL,`description` TEXT,`category` VARCHAR(100),`unit_price` DECIMAL(10, 2),`stock_quantity` INT,`supplier_id` INT,`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (`supplier_id`) REFERENCES `supplier`(`id`)
);
order
CREATE TABLE `order` (`id` INT AUTO_INCREMENT PRIMARY KEY,`user_id` INT NOT NULL,`total_amount` DECIMAL(10, 2),`status` VARCHAR(50),`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (`user_id`) REFERENCES `user`(`id`)
);
order_detail
CREATE TABLE `order_detail` (`id` INT AUTO_INCREMENT PRIMARY KEY,`order_id` INT NOT NULL,`medicine_id` INT NOT NULL,`quantity` INT,`unit_price` DECIMAL(10, 2),FOREIGN KEY (`order_id`) REFERENCES `order`(`id`),FOREIGN KEY (`medicine_id`) REFERENCES `medicine`(`id`)
);

4. 创建项目结构

使用IDE(如IntelliJ IDEA或Eclipse)创建一个新的Maven项目,并添加必要的依赖项到pom.xml文件中。

5. 配置Spring和MyBatis

src/main/resources目录下创建配置文件,如applicationContext.xmlmybatis-config.xml,用于配置Spring和MyBatis。

applicationContext.xml 示例
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/pharmacy?useSSL=false&serverTimezone=UTC"/><property name="username" value="root"/><property name="password" value="password"/>
</bean><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.pharmacy.mapper"/>
</bean>

6. 编写Mapper接口

定义MyBatis的Mapper接口来操作数据库。例如,为用户表和药品表创建UserMapper.javaMedicineMapper.java

UserMapper.java
package com.pharmacy.mapper;import com.pharmacy.entity.User;
import org.apache.ibatis.annotations.*;@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE username = #{username}")User findByUsername(@Param("username") String username);@Insert("INSERT INTO user(username, password, email, phone, role) VALUES(#{username}, #{password}, #{email}, #{phone}, #{role})")int insert(User user);
}
MedicineMapper.java
package com.pharmacy.mapper;import com.pharmacy.entity.Medicine;
import org.apache.ibatis.annotations.*;@Mapper
public interface MedicineMapper {@Select("SELECT * FROM medicine")List<Medicine> findAll();@Select("SELECT * FROM medicine WHERE id = #{id}")Medicine findById(@Param("id") int id);@Insert("INSERT INTO medicine(name, description, category, unit_price, stock_quantity, supplier_id) VALUES(#{name}, #{description}, #{category}, #{unit_price}, #{stock_quantity}, #{supplier_id})")int insert(Medicine medicine);@Update("UPDATE medicine SET name=#{name}, description=#{description}, category=#{category}, unit_price=#{unit_price}, stock_quantity=#{stock_quantity}, supplier_id=#{supplier_id} WHERE id=#{id}")int update(Medicine medicine);@Delete("DELETE FROM medicine WHERE id=#{id}")int delete(@Param("id") int id);
}

7. 实现Service层

编写服务层来处理业务逻辑。例如,创建一个UserService.javaMedicineService.java

UserService.java
package com.pharmacy.service;import com.pharmacy.entity.User;
import com.pharmacy.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User login(String username, String password) {User user = userMapper.findByUsername(username);if (user != null && user.getPassword().equals(password)) {return user;}return null;}public void register(User user) {userMapper.insert(user);}
}
MedicineService.java
package com.pharmacy.service;import com.pharmacy.entity.Medicine;
import com.pharmacy.mapper.MedicineMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class MedicineService {@Autowiredprivate MedicineMapper medicineMapper;public List<Medicine> getAllMedicines() {return medicineMapper.findAll();}public Medicine getMedicineById(int id) {return medicineMapper.findById(id);}public void addMedicine(Medicine medicine) {medicineMapper.insert(medicine);}public void updateMedicine(Medicine medicine) {medicineMapper.update(medicine);}public void deleteMedicine(int id) {medicineMapper.delete(id);}
}

8. 控制器层

使用Spring MVC编写控制器来处理HTTP请求。例如,创建一个UserController.javaMedicineController.java

UserController.java
package com.pharmacy.controller;import com.pharmacy.entity.User;
import com.pharmacy.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;@Controller
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/login")public String login(@RequestParam("username") String username, @RequestParam("password") String password) {User user = userService.login(username, password);if (user != null) {// 登录成功后的处理return "redirect:/home";} else {// 登录失败后的处理return "login";}}@PostMapping("/register")public String register(@ModelAttribute User user) {userService.register(user);return "redirect:/login";}
}
MedicineController.java
package com.pharmacy.controller;import com.pharmacy.entity.Medicine;
import com.pharmacy.service.MedicineService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;import java.util.List;@Controller
@RequestMapping("/medicine")
public class MedicineController {@Autowiredprivate MedicineService medicineService;@GetMapping("/list")public String listMedicines(Model model) {List<Medicine> medicines = medicineService.getAllMedicines();model.addAttribute("medicines", medicines);return "medicineList";}@GetMapping("/view/{id}")public String viewMedicine(@PathVariable("id") int id, Model model) {Medicine medicine = medicineService.getMedicineById(id);model.addAttribute("medicine", medicine);return "medicineView";}@GetMapping("/add")public String showAddForm(Model model) {model.addAttribute("medicine", new Medicine());return "medicineAdd";}@PostMapping("/add")public String addMedicine(@ModelAttribute Medicine medicine) {medicineService.addMedicine(medicine);return "redirect:/medicine/list";}@GetMapping("/edit/{id}")public String showEditForm(@PathVariable("id") int id, Model model) {Medicine medicine = medicineService.getMedicineById(id);model.addAttribute("medicine", medicine);return "medicineEdit";}@PostMapping("/edit/{id}")public String editMedicine(@PathVariable("id") int id, @ModelAttribute Medicine medicine) {medicine.setId(id);medicineService.updateMedicine(medicine);return "redirect:/medicine/list";}@GetMapping("/delete/{id}")public String deleteMedicine(@PathVariable("id") int id) {medicineService.deleteMedicine(id);return "redirect:/medicine/list";}
}

9. 前端页面

根据需要设计前端页面,可以使用Thymeleaf作为模板引擎。例如,创建一个简单的登录页面login.html和药品列表页面medicineList.html

login.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>Login Page</title>
</head>
<body>
<form th:action="@{/user/login}" method="post"><label>Username:</label><input type="text" name="username"/><br/><label>Password:</label><input type="password" name="password"/><br/><button type="submit">Login</button>
</form>
</body>
</html>
medicineList.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>Medicine List</title>
</head>
<body>
<h1>Medicine List</h1>
<table border="1"><tr><th>ID</th><th>Name</th><th>Description</th><th>Category</th><th>Unit Price</th><th>Stock Quantity</th><th>Actions</th></tr><tr th:each="medicine : ${medicines}"><td th:text="${medicine.id}"></td><td th:text="${medicine.name}"></td><td th:text="${medicine.description}"></td><td th:text="${medicine.category}"></td><td th:text="${medicine.unit_price}"></td><td th:text="${medicine.stock_quantity}"></td><td><a th:href="@{/medicine/view/{id}(id=${medicine.id})}">View</a><a th:href="@{/medicine/edit/{id}(id=${medicine.id})}">Edit</a><a th:href="@{/medicine/delete/{id}(id=${medicine.id})}">Delete</a></td></tr>
</table>
<a href="/medicine/add">Add New Medicine</a>
</body>
</html>

10. 测试与部署

完成所有编码后,进行单元测试确保各部分工作正常。之后,可以将应用部署到Tomcat服务器上。

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

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

相关文章

二十七、Python基础语法(面向对象-上)

面向对象&#xff08;oop&#xff09;&#xff1a;是一种程序设计的方法&#xff0c;面向对象关注的是结果。 一、类和对象 类和对象&#xff1a;是面向对象编程中非常重要的两个概念。 类&#xff1a;具有相同特征或者行为的一类事物&#xff08;指多个&#xff09;的统称&…

UML图之对象图详解

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 零、什么是对象图 对象图&#xff08;Object Diagram&#xff09;是UML中一种重要的静态结构图&#xff0c;它用于表示在特定时间点上系统中的对…

同三维T80004EHH-4K30W 4K超清HDMI编解码器

1路HDMI输入1路3.5音频输入&#xff0c;1路HDMI输出1路3.5音频输出&#xff0c;1个USB1个TF卡槽&#xff0c;带RS485 支持4K30&#xff0c;支持2路解码2路转码&#xff0c;可选配WEBRTC/NDI协议&#xff0c;可选配硬件WEBRTC解码&#xff0c;编码、解码、转码、导播、录制多功…

设计一个灵活的RPC架构

RPC架构 RPC本质上就是一个远程调用&#xff0c;需要通过网络来传输数据。传输协议可以有多种选择&#xff0c;但考虑到可靠性&#xff0c;一般默认采用TCP协议。为了屏蔽网络传输的复杂性&#xff0c;需要封装一个单独的数据传输模块用来收发二进制数据&#xff0c;这个单独模…

网络安全入门学习路线 怎样科学的进行网络安全学习

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

“中信同业+”焕新升级 锚定数字金融新主线,做实金融“五篇大文章”

9月20日&#xff0c;“中信同业”升级发布会及生物多样性债券指数发布在京顺利举办&#xff0c;此次活动以“做强数字金融 服务实体经济”为主题&#xff0c;由中信金控指导&#xff0c;中信银行主办&#xff0c;中信各金融子公司联合承办。来自银行、证券、保险、基金等行业百…

ELK之路第四步——整合!打通任督二脉

ELK之路第四步——整合&#xff01;打通任督二脉 前言1.架构2.下载资源3.整合开始1.分别启动三个es2.启动kibana3.新建filebeat_logstash.yml配置文件4.修改logstash的启动配置文件5.启动logstash6.启动filebeat7.Kibana查看 4.结语 前言 在开始本篇之前&#xff0c;你需要用到…

[JAVAEE] 多线程的案例(四) - 定时器

目录 一. 什么是定时器? 二. java中的定时器类 三. 定时器的简单使用. 四. 模拟实现定时器 4.1 实现 MyTimerTask 4.2 实现 MyTimer 一. 什么是定时器? 定时器相当于闹钟, 时间到了就执行一些逻辑. 二. java中的定时器类 使用Timer类实例化一个定时器对象. Timer类中的…

江协科技STM32学习- P21 ADC模数转换器

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

OpenAI放弃自制AI芯片!伦敦场开发者日Hugging Face工程师现场“拷问”Sam Altman

OpenAI 2024年开发者大会第二场&#xff08;伦敦场&#xff09;刚结束。 10月初在旧金山举办了第一场 OpenAI 开发者大会&#xff0c;但这次没有像上一场放出很多花活&#xff0c;这次开始走剧透局了&#xff01; 现场的OpenAI 产品主管 曝光了 GPT o1即将更新的功能&#xf…

浅谈网络安全

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 网络安全是确保信息系统、网络及数据免受未授权访问、使用、披露、篡改或破坏的重要领域。随着数字化进程的加速和互联网的普及&#xff0c;网络安全的重要性显著提升。今天&#xff0c;网络威胁呈现出多样化…

在面试了些外包以后,我有了些自己的思考

大家好&#xff0c;我是洋子&#xff0c;最近公司在降本增效&#xff0c;需要把外包从北京迁移到陕西的某新一线城市&#xff0c;其实就是变相裁员&#xff0c;减少外包的成本&#xff0c;裁掉现有的员工&#xff0c;重新招聘新人 在整个测试行业&#xff0c;外包测试的比重是…

文心一言 VS 讯飞星火 VS chatgpt (381)-- 算法导论24.5 1题

一、给出图24-2的与图中两棵最短路径树不同的另外两棵最短路径树。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在图论中&#xff0c;最短路径树&#xff08;Shortest Path Tree, SPT&#xff09;是一种从单个源点到所有其他节点的最短路径形成的树。给定一个…

Vscode配置CC++编程环境的使用体验优化和补充说明

文章目录 快速编译运行&#x1f47a;code runner插件方案Code Runner Configuration 直接配置 相关指令和快捷键默认task配置和取消默认 配置文件补充介绍(可选 推荐阅读)&#x1f60a;使用vscode预置变量和环境变量环境变量的使用使用环境变量的好处环境变量可能引起的问题 检…

Canvas简历编辑器-选中绘制与拖拽多选交互设计

Canvas简历编辑器-选中绘制与拖拽多选交互设计 在之前我们聊了聊如何基于Canvas与基本事件组合实现了轻量级DOM&#xff0c;并且在此基础上实现了如何进行管理事件以及多层级渲染的能力设计。那么此时我们就依然在轻量级DOM的基础上&#xff0c;关注于实现选中绘制与拖拽多选交…

iQOO手机怎样将屏幕投射到MacBook?可以同步音频吗?

众所周知&#xff0c;苹果品牌的设备自己有AirPlay的投屏功能&#xff0c;iPhone要投屏到MacBook只要连接同一网络&#xff0c;然后开启AirPlay就可以投屏。但其他品牌的手机没有AirPlay&#xff0c;怎么将手机屏幕投射到MacBook呢&#xff1f; 安卓系统的手机可以使用无线投屏…

机器人和智能的进化速度远超预期-ROS-AI-

危机 通常&#xff0c;有危险也有机遇才称之为危机。 从2020年启动转型自救&#xff0c;到2021年发现危险迫在眉睫&#xff0c;直到2024年也没有找到自己满意的出路。 共识 中产阶级知识分子共有的特性和一致的推断。 200年前的推断&#xff0c;在如今得到了验证。 机器人…

Idea、VS Code 如何安装Fitten Code插件使用

博主主页:【南鸢1.0】 本文专栏&#xff1a;JAVA 目录 ​编辑 简介 所用工具 1、Idea如何安装插件 1.idea下载插件 2.需要从外部下载然后在安装&#xff0c; 2、VS Code如何安装插件 总结 简介 Fitten Code是由非十大模型驱动的AI编程助手&#xff0c;它可以自动生成代…

助力抑郁症初筛!上海交大团队构建Agent心理诊所,论文一作在线展示demo,分享技术亮点

「我有动手打她&#xff0c;甚至好几次掐着她脖子把她按到墙角。每次动完手&#xff0c;我都会后悔&#xff0c;我为什么要动手&#xff0c;我为什么控制不住自己&#xff0c;我是不是就是一个混蛋、一个疯子、一个十恶不赦的人&#xff0c;但我真的不知道该怎么办。」这是 18 …

【优选算法篇】前缀之美,后缀之韵:于数列深处追寻算法的动与静

文章目录 C 前缀和详解&#xff1a;进阶题解与思维分析前言第二章&#xff1a;前缀和进阶应用2.1 和为 k 的子数组&#xff08;medium&#xff09;解法一&#xff08;前缀和 哈希表&#xff09;示例分析C代码实现易错点提示代码解读 2.2 和可被 K 整除的子数组&#xff08;med…