计算机毕业设计ssm基于SSM的网上购药系统0p84bn74
(配套有源码 程序 mysql数据库 论文)本套源码可以先看具体功能演示视频领取,文末有联xi 可分享
随着互联网技术的迅猛发展,电子商务逐渐渗透到各个行业,医疗行业也不例外。网上购药系统的出现,不仅方便了患者购买药品,还能有效解决传统购药过程中存在的时间和空间限制问题。基于SSM(Spring、Spring MVC、MyBatis)框架的网上购药系统,利用其高效、稳定和易于扩展的特点,能够为用户提供一个安全、便捷的购药平台。
文档的重要内容
该系统主要包括以下功能模块:
-
用户注册与登录:用户可以通过注册成为系统的会员,并使用账号和密码登录系统。
-
药品信息管理:系统提供药品的详细信息展示,包括药品名称、价格、规格、生产厂家等。
-
药品搜索与分类:用户可以通过关键字搜索或分类浏览药品,快速找到所需药品。
-
购物车管理:用户可以将选中的药品加入购物车,查看购物车中的药品清单,进行数量修改或删除操作。
-
订单管理:用户可以提交购物车中的药品生成订单,查看订单详情和订单状态。
-
在线支付:系统集成了在线支付功能,用户可以通过支付宝、微信等方式进行支付。
-
用户评价与反馈:用户可以对购买的药品进行评价,并提交反馈意见。
-
药品库存管理:系统实时更新药品库存信息,确保库存数据的准确性。
-
药品促销与推荐:系统根据用户的购买历史和偏好,推荐相关药品,并展示促销信息。
-
系统管理:包括用户管理、药品管理、订单管理、库存管理等后台管理功能。
功能总结
该系统通过用户注册与登录、药品信息管理、药品搜索与分类、购物车管理、订单管理、在线支付、用户评价与反馈、药品库存管理、药品促销与推荐以及系统管理等功能模块,为用户提供了一个全面的网上购药平台。系统不仅提升了用户的购药体验,还提高了药品管理的效率,具有广泛的应用前景。
注:完成的毕业设计程序以下面的的环境软件、功能图和界面为准。
系统所需要的环境软件:idea、eclipse+mysql5.7、8.0+Navicat+JDK1.8+tomcat7.0
管理员需求分析
管理员端的功能主要是开放给系统的管理人员使用,能够对用户的信息进行管理,包括对药品信息、留言反馈、订单信息进行查看,修改和删除、添加等,对系统整体运行情况进行了解。
管理员用例分析图,如图3-1所示。
图3-1管理员用例分析图
2、用户需求分析
用户的功能主要是对个人账号和密码进行更新管理,然后对首页、药品信息、公告信息、留言反馈、购物车、个人中心进行查询详情操作。
用户用例分析图,如图3-2所示。
图3-2用户用例分析图
3、员工需求分析
员工的功能主要是对个人账号和密码进行信息更新,然后对系统首页、个人中心、药品信息、订单管理进行查询详情操作。
员工用例分析图,如图3-3所示。
图3-3员工用例分析图
(二)系统可行性分析
1.技术可行性
该平台采用java语言,SSM框架,而Eclipse则是利用MySQL进行数据库的选择,在数据库的开发中,SQL是最高效、最简洁的,在这个体系中,Eclipse是最安全、最稳定的。由于它的使用方便,无论是开发者,还是管理员,都可以轻松地使用它们。综合来看,解决技术上的问题是切实可行的[9]。
2.经济可行性
针对本系统而言,需要一系列的硬软件支持,主要硬软件及相关费用如下:需要CPU为400MHz及以上的处理器的计算机,硬盘空间为100M及以上即可,除此之外,相关的设备的安装工作都比较简单,并且设计开发软件的本钱也不高,都相比照较简单,所以只需要对客户进展相关的提示工作便可以让其成功地使用本系统,故本系统的本钱是非常低的。综上所述,本系统在经济上也是可行的。
3.操作可行性
在网上购药系统方面,目前已经有许多成功的网上购药管理信息化系统在支撑系统的运营。就本系统而言,操作简捷,适合大部分药店或个人使用。无论是对业务过程的系统的处理,还是对药店的系统的运用,都能够很好地适应系统的正常运作需求。综上所述,本系统在操作上也是可行的[10]。
四、系统设计
(一)系统的框架设计
该体系结构将以B/S模型作为体系结构,其体系结构上将其划分为三个层次:表示级、服务级、数据库级。采用B/S模型的思路,实现了各个业务的分离,实现了多个功能的高内聚和低耦合。在代码编写中,对通用代码、相同逻辑代码进行精化和包装,以提升代码使用效率,并使代码逻辑更为清楚[11]。
1.表示层:网页浏览器是展示层面的主体,使用者可以透过网页浏览进入该网页。利用java技术在前端网页中的应用,通过Ajax技术来与后台的业务服务进行交互,以满足网页的局部动态改变。
2.逻辑层:当系统使用者在进入该体系之后,能够在该层呼叫该业务的业务函数界面。其中,有几个商业运作界面,即:药品信息、留言反馈系统运作的保证,它将随着统一的商业逻辑应用而被自动地应用。
3.数据库:该系统使用MySQL实现对数据的持久性管理,为了实现数据的标准化、简化和快速的存储,将会引进MybatisORM持久性架构。
(二)系统功能模块设计
网上购药系统在设计与实施时,采取了模块性的设计理念,把相似的系统的功能整合到一个模组中,以增强内部的功能,减少各组件之间的联系,从而达到减少相互影响的目的。如药品信息、留言反馈模块等[12]。
管理员后台主要功能是:用户、员工、药品类型、药品信息、留言反馈、系统管理、订单管理等功能。系统功能模块图如图4-1所示。
图4-1系统功能模块图
(三) 数据库设计与实现
在每一个系统中数据库有着非常重要的作用,数据库的设计得好将会增加系统的效率以及系统各逻辑功能的实现。所以数据库的设计我们要从系统的实际需要出发,才能使其更为完美的符合系统功能的实现。
1. 概念模型设计
概念模型是对现实中的问题出现的事物的进行描述,ER图是由实体及其关系构成的图,通过E-R图可以清楚地描述系统涉及到的实体之间的相互关系。
留言反馈E-R图如下所示。
图4-2留言反馈E-R图
用户信息E-R图如下所示。
图4-3用户信息E-R图
公告信息E-R图如下所示。
图4-4公告信息E-R图
员工信息E-R图如下所示。
图4-5员工信息E-R属图
购物车E-R图如下所示。
图4-6购物车E-R属图
网上购药系统的总体E-R图,如图4-7所示。
图4-7网上购药系统的总体E-R图
(一)前台用户功能模块
当游客打开系统的网址后,首先看到的就是首页界面。在这里,游客能够看到网上购药系统的导航条显示首页、药品信息、公告信息、留言反馈、个人中心等。系统首页界面如图5-1所示:
图5-1 系统首页界面
在注册流程中,用户在Vue前端填写必要信息(如用户名、密码等)并提交。前端将这些信息通过HTTP请求发送到Java后端。后端处理这些信息,检查用户名是否唯一,并将新用户数据存入MySQL数据库。完成后,后端向前端发送注册成功的确认,前端随后通知用户完成注册。这个过程实现了新用户的数据收集、验证和存储。具体的用户注册界面如图5-2所示;
图5-2用户注册界面图
以下是注册代码;
<script>
export default {
data() {
return {
ruleForm: {
},
pageFlag : '',
tableName:"",
rules: {},
};
},
mounted(){
this.pageFlag = this.$storage.get("pageFlag");
let table = this.$storage.get("loginTable");
this.tableName = table;
},
created() {
},
destroyed() {
},
methods: {
// 获取uuid
getUUID () {
return new Date().getTime();
},
close(){
this.$router.push({ path: "/login" });
},
yonghutouxiangUploadChange(fileUrls) {
this.ruleForm.touxiang = fileUrls;
},
// 多级联动参数
// 注册
login() {
var url=this.tableName+"/register";
if((!this.ruleForm.yonghuzhanghao) && `yonghu` == this.tableName){
this.$message.error(`用户账号不能为空`);
return
}
if((!this.ruleForm.yonghuxingming) && `yonghu` == this.tableName){
this.$message.error(`用户姓名不能为空`);
return
}
if((!this.ruleForm.mima) && `yonghu` == this.tableName){
this.$message.error(`密码不能为空`);
return
}
if((this.ruleForm.mima!=this.ruleForm.mima2) && `yonghu` == this.tableName){
this.$message.error(`两次密码输入不一致`);
return
}
if(`yonghu` == this.tableName && this.ruleForm.lianxidianhua&&(!this.$validate.isMobile(this.ruleForm.lianxidianhua))){
this.$message.error(`联系电话应输入手机格式`);
return
}
if(this.ruleForm.touxiang!=null) {
this.ruleForm.touxiang = this.ruleForm.touxiang.replace(new RegExp(this.$base.url,"g"),"");
}
this.$http({
url: url,
method: "post",
data:this.ruleForm
}).then(({ data }) => {
if (data && data.code === 0) {
this.$message({
message: "注册成功",
type: "success",
duration: 1500,
onClose: () => {
this.$router.replace({ path: "/login" });
}
});
} else {
this.$message.error(data.msg);
}
});
}
}
};
</script>
在登录流程中,用户首先在Vue前端界面输入用户名和密码。这些信息通过HTTP请求发送到Java后端。后端接收请求,通过与MySQL数据库交互验证用户凭证。如果认证成功,后端会返回给前端,允许用户访问系统。这个过程涵盖了从用户输入到系统验证和响应的全过程。详细的用户登录界面如图5-3所示;
图5-3用户登录界图
以下是登录代码;
mounted() {
let menus = menu.list();
this.menus = menus;
for (let i = 0; i < this.menus.length; i++) {
if (this.menus[i].hasBackLogin=='是') {
this.roles.push(this.menus[i])
}
}
},
created() {
this.getRandCode()
},
destroyed() {
},
components: {
},
methods: {
//注册
register(tableName){
this.$storage.set("loginTable", tableName);
this.$storage.set("pageFlag", "register");
this.$router.push({path:'/register'})
},
// 登陆
login() {
if (!this.rulesForm.username) {
this.$message.error("请输入用户名");
return;
}
if (!this.rulesForm.password) {
this.$message.error("请输入密码");
return;
}
if(this.roles.length>1) {
if (!this.rulesForm.role) {
this.$message.error("请选择角色");
return;
}
let menus = this.menus;
for (let i = 0; i < menus.length; i++) {
if (menus[i].roleName == this.rulesForm.role) {
this.tableName = menus[i].tableName;
}
}
} else {
this.tableName = this.roles[0].tableName;
this.rulesForm.role = this.roles[0].roleName;
}
this.$http({
url: `${this.tableName}/login?username=${this.rulesForm.username}&password=${this.rulesForm.password}`,
method: "post"
}).then(({ data }) => {
if (data && data.code === 0) {
this.$storage.set("Token", data.token);
this.$storage.set("role", this.rulesForm.role);
this.$storage.set("sessionTable", this.tableName);
this.$storage.set("adminName", this.rulesForm.username);
this.$router.replace({ path: "/index/" });
} else {
this.$message.error(data.msg);
}
});
},
getRandCode(len = 4){
this.randomString(len)
},
randomString(len = 4) {
let chars = [
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
"w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
"H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
"S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
"3", "4", "5", "6", "7", "8", "9"
]
let colors = ["0", "1", "2","3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]
let sizes = ['14', '15', '16', '17', '18']
let output = [];
for (let i = 0; i < len; i++) {
// 随机验证码
let key = Math.floor(Math.random()*chars.length)
this.codes[i].num = chars[key]
// 随机验证码颜色
let code = '#'
for (let j = 0; j < 6; j++) {
let key = Math.floor(Math.random()*colors.length)
code += colors[key]
}
this.codes[i].color = code
// 随机验证码方向
let rotate = Math.floor(Math.random()*60)
let plus = Math.floor(Math.random()*2)
if(plus == 1) rotate = '-'+rotate
this.codes[i].rotate = 'rotate('+rotate+'deg)'
// 随机验证码字体大小
let size = Math.floor(Math.random()*sizes.length)
this.codes[i].size = sizes[size]+'px'
}
},
}
};
购物车:用户将想要购买的商品加入购物车,加入购物车后可以增减数量、删除、点击购买,可一键清除失效商品,如图5-4所示:
图5-4购物车界面图
以下是购物车的代码;
@RestController
@RequestMapping("/address")
public class AddressController {
@Autowired
private AddressService addressService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,AddressEntity address,
HttpServletRequest request){
if(!request.getSession().getAttribute("role").toString().equals("管理员")) {
address.setUserid((Long)request.getSession().getAttribute("userId"));
}
EntityWrapper<AddressEntity> ew = new EntityWrapper<AddressEntity>();
PageUtils page = addressService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, address), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,AddressEntity address,
HttpServletRequest request){
if(!request.getSession().getAttribute("role").toString().equals("管理员")) {
address.setUserid((Long)request.getSession().getAttribute("userId"));
}
EntityWrapper<AddressEntity> ew = new EntityWrapper<AddressEntity>();
PageUtils page = addressService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, address), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( AddressEntity address){
EntityWrapper<AddressEntity> ew = new EntityWrapper<AddressEntity>();
ew.allEq(MPUtil.allEQMapPre( address, "address"));
return R.ok().put("data", addressService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(AddressEntity address){
EntityWrapper< AddressEntity> ew = new EntityWrapper< AddressEntity>();
ew.allEq(MPUtil.allEQMapPre( address, "address"));
AddressView addressView = addressService.selectView(ew);
return R.ok("查询地址成功").put("data", addressView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
AddressEntity address = addressService.selectById(id);
return R.ok().put("data", address);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
AddressEntity address = addressService.selectById(id);
return R.ok().put("data", address);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody AddressEntity address, HttpServletRequest request){
//ValidatorUtils.validateEntity(address);
address.setUserid((Long)request.getSession().getAttribute("userId"));
Long userId = (Long)request.getSession().getAttribute("userId");
if(address.getIsdefault().equals("是")) {
addressService.updateForSet("isdefault='否'", new EntityWrapper<AddressEntity>().eq("userid", userId));
}
address.setUserid(userId);
addressService.insert(address);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody AddressEntity address, HttpServletRequest request){
//ValidatorUtils.validateEntity(address);
address.setUserid((Long)request.getSession().getAttribute("userId"));
Long userId = (Long)request.getSession().getAttribute("userId");
if(address.getIsdefault().equals("是")) {
addressService.updateForSet("isdefault='否'", new EntityWrapper<AddressEntity>().eq("userid", userId));
}
address.setUserid(userId);
addressService.insert(address);
return R.ok();
}
/**
* 获取用户密保
*/
@RequestMapping("/security")
@IgnoreAuth
public R security(@RequestParam String username){
AddressEntity address = addressService.selectOne(new EntityWrapper<AddressEntity>().eq("", username));
return R.ok().put("data", address);
}
/**
* 修改
*/
@RequestMapping("/update")
@Transactional
@IgnoreAuth
public R update(@RequestBody AddressEntity address, HttpServletRequest request){
//ValidatorUtils.validateEntity(address);
if(address.getIsdefault().equals("是")) {
addressService.updateForSet("isdefault='否'", new EntityWrapper<AddressEntity>().eq("userid", request.getSession().getAttribute("userId")));
}
addressService.updateById(address);//全部更新
return R.ok();
}
/**
* 获取默认地址
*/
@RequestMapping("/default")
public R defaultAddress(HttpServletRequest request){
Wrapper<AddressEntity> wrapper = new EntityWrapper<AddressEntity>().eq("isdefault", "是").eq("userid", request.getSession().getAttribute("userId"));
AddressEntity address = addressService.selectOne(wrapper);
return R.ok().put("data", address);
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
addressService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
用户登录成功后,可以查看药品信息。用户可以在登录后的页面上方的搜索框中,输入药品名称、药品类型、主治功能、用法用量、交互作用进行查询,可以通过药品名称、药品类型、主治功能等,来查看相应的药品信息,也可以点击加入购物车、立即购买或者收藏评论,如图5-5所示:
图5-5药品信息界面图
在用户成功登录网上购药系统后,通过个人中心页面,用户可以方便地管理自己的个人信息,用户也可以点击页面显示的修改密码、我的订单、我的地址、我的收藏等进行操作。个人中心界面如图5-6所示:
图5-6个人中心界面图
(二)后台管理员功能模块
管理员登录,在登录页面选择登录角色,正确输入用户名和密码后,点击登录,跳转系统页面进行操作;如图5-7所示。
图5-7管理员登录界面
管理员进入系统主页面,主要功能包括对系统首页、首页、个人中心、用户、员工、药品类型、药品信息、留言反馈等进行操作。管理员主页面如图5-8所示:
图5-8管理员主界面
用户功能在视图层(view层)进行交互,比如点击“添加”按钮或填写用户需求信息表单。这些用户信息动作被视图层捕获并作为请求发送给相应的控制器层(control1er层)。控制器接收到这些请求后,调用服务层(service层)以执行相关的业务逻辑,例如验证输入数据的有效性和与数据库的交互。服务层处理完这些逻辑后,进一步与数据访问对象层(DAO层)交互,后者负责具体的数据操作如查询、添加、更新或删除用户信息,并将操作结果返回给控制器。最终,控制器根据这些结果更新视图层,以便用户信息功能可以看到最新的信息或相应的操作反馈。在用户信息页面的输入栏中输入用户账号、用户姓名进行搜索,可以查看到用户详细信息,并根据需要进行添加或者删除等操作;如图5-9所示:
图5-9用户界面
员工信息功能在视图层(view层)进行交互,比如点击“添加”按钮或填写员工需求信息表单。这些员工信息动作被视图层捕获并作为请求发送给相应的控制器层(control1er层)。控制器接收到这些请求后,调用服务层(service层)以执行相关的业务逻辑,例如验证输入数据的有效性和与数据库的交互。服务层处理完这些逻辑后,进一步与数据访问对象层(DAO层)交互,后者负责具体的数据操作如查询、添加、更新或删除员工信息,并将操作结果返回给控制器。最终,控制器根据这些结果更新视图层,以便员工信息功能可以看到最新的信息或相应的操作反馈。在员工信息页面的输入栏中输入员工账号、员工姓名进行搜索,可以查看到员工详细信息,并根据需要进行添加或者删除等操作;如图5-10所示:
图5-10员工界面
管理员可以在药品类型界面进行社药品类型的管理,包括增删改查操作,可以根据药品类型,查询到相应的药品类型,并进行增删改查操作。该模块实现的界面如图5-11所示:
图5-11药品类型界面图
管理员可以在药品信息界面进行药品信息的管理,包括增删改查操作,可以根据药品名称、药品类型、主治功能、用法用量、交互作用、价格,查询到相应的药品信息,并进行增删改查操作。该模块实现的界面如图5-12所示:
图5-12药品信息管理界面图
管理员可以在留言反馈界面进行留言反馈的管理,包括增删改查操作,可以根据用户名,查询到相应的留言反馈,并进行增删改查操作。该模块实现的界面如图5-13所示:
图5-13留言反馈界面图
(三)后台员工功能模块
在系统上员工点击登录按钮,在登录界面填写信息完成后,单击登录操作,如图5-14所示:
图5-14员工登录界面
员工登录系统后可以对首页、个人中心、药品信息、订单管理等功能进行操作。如图5-15所示:
图5-15 员工功能主界面
源码无偿分享,文未领取