博主介绍:👉全网个人号和企业号粉丝40W+,每年辅导几千名大学生较好的完成毕业设计,专注计算机软件领域的项目研发,不断的进行新技术的项目实战👈
⭐进主页热门专栏推荐订阅⭐ 订阅收藏起来,防止下次找不到
🔎千套Java / PHP / nod.js / asp.net/ Python等项目实战更新中~
🔎百套小程序APP项目实战更新中~
有需求的各位可以先收藏起来,还有大家在毕设选题,开题报告有疑惑的都可以找我,给你参考意见,需要开题模板的可以私信留言告诉我❤️文末获取源码联系❤️ ⚠️一定要先收藏⚠️
第4章 系统设计
用户对着浏览器操作,肯定会出现某些不可预料的问题,但是不代表着系统对于用户在浏览器上的操作不进行处理,所以说,要提前考虑可能会出现的问题。
4.1 系统设计思想
系统设计,肯定要把设计的思想进行统一,只有统一的思想才能指导程序的开发,并且可以让众多的程序开发人员更快速的进入状态,提高开发速度。根据当前系统的既定需求,下面将进行本系统设计思想的阐述。
(1)扩展性:开发任何一个系统的时候不可避免要考虑这个问题。软件版本的更迭是一种常识,任何一个软件都不会一次性开发就成永恒,软件是一个不断成长的东西。所以考虑问题的时候需要对当前问题进行数据上的扩大化,然后进行归纳整理,最终形成具有一定扩展性的程序。程序的可扩展性必然会影响开发进度,所以最终需要综合评估程序的可扩展程度,进而有的放矢,循序开发。
(2)实用性:程序设计是一个先高屋建瓴式的设想,然后再具体化,实用性就是具体化的第一个步骤,要充分考虑使用者是不懂程序设计的这一点,使用者只是懂得常规性的上网操作步骤,并不需要对程序进行理解,所以一定要让使用者感觉到便利,感觉到实用性的存在,如果使用者使用程序过程中没发现使用程序的好处,那么程序设计的实用性将大大降低。
(3)安全性:当使用者使用的过程中,会产生大量的相关数据,这些数据必须有安全性的保证,否则当使用者发现数据出现问题的原因是程序设计问题的时候,将会对程序开发者失去信任,甚至可能会产生大量的费用赔偿问题,这是一个不可避免的问题。所以安全性关系开发与使用者双方的经济利益,程序的安全性是一定要保证的。
(4)先进性:程序设计的先进性是开发者进行考虑的,必须要在满足系统功能的前提下,必须要选择好当下最合适的技术。最合适的技术要从开发成本,使用成本以及维护成本里面综合分析,经过综合分析后要让技术实现最优解,保持先进的技术生产力。
(5)维护性:程序开发之初就要考虑以后的维护问题。维护是在程序开发完毕,已经上线可以运作,进入生产试用过程和使用过程中才会发现需要维护的必要。要通过各方面降低维护成本,不是说维护的越少就代表程序开发的越完美,程序既然是人类进行设计制造的,肯定有很多不可避免的问题产生,那么如何维护好程序的正常运作也是一门很重要的学问。
4.2 功能结构设计
图4.1即为设计的管理员功能结构,管理员权限操作的功能包括管理公告,管理二手车交易管理平台信息,包括车辆管理,培训管理,到店预约管理,薪资管理等,可以管理公告。
图4.1 管理员功能结构
4.3 数据库设计
二手车交易管理平台管理系统运行中产生的数据需要按照提前设置的存储规则进行保存,设计出一个符合项目的最优数据存储格式,因为它能减少用户的等待时间,还可以对系统的请求在最短时间内进行响应。所以,对数据库设计时,需要对功能需求进行详细的拆分,以及对业务状态的细分,然后设计具体的存储规则,保证数据库能正常运作,缩短数据处理时间,并在一定程度上降低数据冗余,节省存储空间。
4.3.1 数据库概念设计
实体-联系图还有一个名称即E-R图,是Entity Relationship Diagram各英文单词首字母的缩写,它这种概念模型通常用于对现实世界进行描述。同时它还是一种能够直观表达数据中实体,联系,属性的有效手段。绘制E-R图能够选择的工具也有很多,但是Office Visio 这款软件在E-R图的绘制上一般都是作为首选工具,因为它是基于可视化处理,使用它创建E-R图非常简单。使用基本的E-R图构成元素,比如椭圆,菱形,矩形,还有实线段来表达对应的信息,椭圆代表属性,即实体的特征,矩形代表实体,即数据库中的一个具体数据表,菱形代表实体中相互关系,实线段主要是完成椭圆,矩形,菱形的连接。
(1)下图是客服聊天实体和其具备的属性。
客服聊天实体属性图
(2)下图是论坛实体和其具备的属性。
论坛实体属性图
(3)下图是车辆实体和其具备的属性。
车辆实体属性图
(4)下图是用户实体和其具备的属性。
用户实体属性图
(5)下图是公告实体和其具备的属性。
公告实体属性图
(6)下图是车辆评估实体和其具备的属性。
车辆评估实体属性图
(7)下图是车辆订单实体和其具备的属性。
车辆订单实体属性图
(8)下图是到店预约实体和其具备的属性。
到店预约实体属性图
4.3.2 数据库物理设计
本小节主要任务即是根据上述内容进行数据存储结构的设计,实体的属性就用来表示字段名称,不同的字段表示的数据类型以及取值都不相同,以及该表各个字段是否能够保持空等进行说明,设计完成一张数据表的结构之后,在保存时同样要命名,尽量选择英文名称进行命名并保存,还不容易导致系统出错。接下来就对设计的表进行简单说明。
表4.1客服聊天表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | yonghu_id | Integer | 提问用户 | 是 |
3 | chat_issue | String | 问题 | 是 |
4 | issue_time | Date | 问题时间 | 是 |
5 | chat_reply | String | 回复 | 是 |
6 | reply_time | Date | 回复时间 | 是 |
7 | zhuangtai_types | Integer | 状态 | 是 |
8 | chat_types | Integer | 数据类型 | 是 |
9 | insert_time | Date | 创建时间 | 是 |
表4.2车辆表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | cheliang_name | String | 标题 | 是 |
3 | cheliang_uuid_number | String | 车辆编号 | 是 |
4 | cheliang_photo | String | 车辆照片 | 是 |
5 | cheliang_types | Integer | 车辆品牌 | 是 |
6 | cheliang_cheling_types | Integer | 车辆车龄 | 是 |
7 | cheliang_licheng_types | Integer | 车辆里程 | 是 |
8 | cheliang_pailaing_types | Integer | 车辆排量 | 是 |
9 | cheliang_biansuxiang_types | Integer | 变速箱 | 是 |
10 | cheliang_chexing_types | Integer | 车型 | 是 |
11 | cheliang_nengyuan_types | Integer | 能源形式 | 是 |
12 | cheliang_shigu_types | Integer | 有无事故 | 是 |
13 | cheliang_paifangbiaozhun_types | Integer | 排放标准 | 是 |
14 | cheliang_new_money | BigDecimal | 订金 | 是 |
15 | shangpai_time | Date | 上牌时间 | 是 |
16 | chuchang_time | Date | 出厂日期 | 是 |
17 | cheliang_guishudi | String | 车牌归属地 | 是 |
18 | cheliang_yanse | String | 车身颜色 | 是 |
19 | cheliang_chexi | String | 车系 | 是 |
20 | cheliang_daoshou | BigDecimal | 到手价 | 是 |
21 | cheliang_cishu | Integer | 过户次数 | 是 |
22 | cheliang_yaoshi | Integer | 车辆钥匙 | 是 |
23 | cheliang_gongli | BigDecimal | 表显公里 | 是 |
24 | cheliang_content | String | 车辆介绍 | 是 |
25 | cheliang_delete | Integer | 逻辑删除 | 是 |
26 | insert_time | Date | 录入时间 | 是 |
27 | create_time | Date | 创建时间 | 是 |
表4.3车辆订单表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | cheliang_id | Integer | 车辆 | 是 |
3 | yonghu_id | Integer | 用户 | 是 |
4 | cheliang_order_true_price | BigDecimal | 缴纳订金 | 是 |
5 | cheliang_order_types | Integer | 订单类型 | 是 |
6 | insert_time | Date | 订单创建时间 | 是 |
7 | create_time | Date | 创建时间 | 是 |
表4.4到店预约表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | yonghu_id | Integer | 用户 | 是 |
3 | daodian_yuyue_text | String | 预约理由 | 是 |
4 | daodian_yuyue_yesno_types | Integer | 预约状态 | 是 |
5 | daodian_yuyue_maimai_types | Integer | 车辆买卖 | 是 |
6 | daodian_yuyue_yesno_text | String | 审核回复 | 是 |
7 | daodian_yuyue_shenhe_time | Date | 审核时间 | 是 |
8 | daodian_yuyue_time | Date | 预约时间 | 是 |
9 | insert_time | Date | 活动报名时间 | 是 |
10 | create_time | Date | 创建时间 | 是 |
表4.5字典表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | dic_code | String | 字段 | 是 |
3 | dic_name | String | 字段名 | 是 |
4 | code_index | Integer | 编码 | 是 |
5 | index_name | String | 编码名字 | 是 |
6 | super_id | Integer | 父字段id | 是 |
7 | beizhu | String | 备注 | 是 |
8 | create_time | Date | 创建时间 | 是 |
表4.6论坛表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | forum_name | String | 帖子标题 | 是 |
3 | yonghu_id | Integer | 用户 | 是 |
4 | users_id | Integer | 管理员 | 是 |
5 | forum_content | String | 发布内容 | 是 |
6 | super_ids | Integer | 父id | 是 |
7 | forum_state_types | Integer | 帖子状态 | 是 |
8 | insert_time | Date | 发帖时间 | 是 |
9 | update_time | Date | 修改时间 | 是 |
10 | create_time | Date | 创建时间 | 是 |
表4.7公告表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | gonggao_name | String | 公告名称 | 是 |
3 | gonggao_photo | String | 公告图片 | 是 |
4 | gonggao_types | Integer | 公告类型 | 是 |
5 | insert_time | Date | 公告发布时间 | 是 |
6 | gonggao_content | String | 公告详情 | 是 |
7 | create_time | Date | 创建时间 | 是 |
表4.8车辆评估表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | yonghu_id | Integer | 用户 | 是 |
3 | pinggu_yuyue_name | String | 标题 | 是 |
4 | pinggu_yuyue_photo | String | 车辆照片 | 是 |
5 | pinggu_yuyue_text | String | 报名理由 | 是 |
6 | pinggu_yuyue_yesno_types | Integer | 报名状态 | 是 |
7 | pinggu_yuyue_yesno_text | String | 审核回复 | 是 |
8 | pinggu_yuyue_shenhe_time | Date | 审核时间 | 是 |
9 | pinggu_yuyue_types | Integer | 车辆品牌 | 是 |
10 | pinggu_yuyue_cheling_types | Integer | 车辆车龄 | 是 |
11 | pinggu_yuyue_licheng_types | Integer | 车辆里程 | 是 |
12 | pinggu_yuyue_pailaing_types | Integer | 车辆排量 | 是 |
13 | pinggu_yuyue_biansuxiang_types | Integer | 变速箱 | 是 |
14 | pinggu_yuyue_chexing_types | Integer | 车型 | 是 |
15 | pinggu_yuyue_nengyuan_types | Integer | 能源形式 | 是 |
16 | pinggu_yuyue_shigu_types | Integer | 有无事故 | 是 |
17 | pinggu_yuyue_paifangbiaozhun_types | Integer | 排放标准 | 是 |
18 | shangpai_time | Date | 上牌时间 | 是 |
19 | chuchang_time | Date | 出厂日期 | 是 |
20 | pinggu_yuyue_guishudi | String | 车牌归属地 | 是 |
21 | pinggu_yuyue_yanse | String | 车身颜色 | 是 |
22 | pinggu_yuyue_chexi | String | 车系 | 是 |
23 | pinggu_yuyue_daoshou | BigDecimal | 到手价 | 是 |
24 | pinggu_yuyue_content | String | 车辆介绍 | 是 |
25 | pinggu_yuyue_delete | Integer | 逻辑删除 | 是 |
26 | insert_time | Date | 录入时间 | 是 |
27 | create_time | Date | 创建时间 | 是 |
表4.9用户表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | yonghu_name | String | 用户姓名 | 是 |
3 | yonghu_phone | String | 用户手机号 | 是 |
4 | yonghu_id_number | String | 用户身份证号 | 是 |
5 | yonghu_photo | String | 用户头像 | 是 |
6 | yonghu_email | String | 电子邮箱 | 是 |
7 | new_money | BigDecimal | 余额 | 是 |
8 | create_time | Date | 创建时间 | 是 |
表4.10管理员表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | username | String | 儿童名 | 是 |
3 | password | String | 密码 | 是 |
4 | role | String | 角色 | 是 |
5 | addtime | Date | 新增时间 | 是 |
第5章 系统实现
编程人员在搭建的开发环境中,会让各种编程技术一起呈现出最终效果。本节就展示关键部分的页面效果。
5.1 管理员功能实现
5.1.1 车辆管理
图5.1 即为编码实现的车辆管理界面,管理员在车辆管理界面中可以对界面中显示,可以对车辆信息的车辆状态进行查看,可以添加新的车辆信息等。
图5.1 车辆管理界面
5.1.2 到店预约管理
图5.2 即为编码实现的到店预约管理界面,管理员在到店预约管理界面中查看到店预约种类信息,到店预约描述信息,新增到店预约信息等。
图5.2 到店预约管理界面
5.1.3 公告管理
图5.3 即为编码实现的公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。
图5.3 公告管理界面
5.1.4 公告类型管理
图5.4 即为编码实现的公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
图5.4 公告类型管理界面
5.2 用户功能实现
5.2.1 车辆
图5.2.1 即为编码实现的车辆界面,
图5.2.1 车辆管理界面
5.2.2 到店预约
图5.2 即为编码实现的到店预约界面。
图5.2.2 到店预约管理界面
JAVA后端代码实现
package com.controller;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.TokenEntity;
import com.entity.UserEntity;
import com.service.TokenService;
import com.service.UserService;
import com.utils.CommonUtil;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.ValidatorUtils;
/**
* 登录相关
*/
@RequestMapping("users")
@RestController
public class UserController{
@Autowired
private UserService userService;
@Autowired
private TokenService tokenService;
/**
* 登录
*/
@IgnoreAuth
@PostMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
if(user==null || !user.getPassword().equals(password)) {
return R.error("账号或密码不正确");
}
String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
return R.ok().put("token", token);
}
/**
* 注册
*/
@IgnoreAuth
@PostMapping(value = "/register")
public R register(@RequestBody UserEntity user){
// ValidatorUtils.validateEntity(user);
if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
return R.error("用户已存在");
}
userService.insert(user);
return R.ok();
}
/**
* 退出
*/
@GetMapping(value = "logout")
public R logout(HttpServletRequest request) {
request.getSession().invalidate();
return R.ok("退出成功");
}
/**
* 密码重置
*/
@IgnoreAuth
@RequestMapping(value = "/resetPass")
public R resetPass(String username, HttpServletRequest request){
UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
if(user==null) {
return R.error("账号不存在");
}
user.setPassword("123456");
userService.update(user,null);
return R.ok("密码已重置为:123456");
}
/**
* 列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,UserEntity user){
EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/list")
public R list( UserEntity user){
EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
ew.allEq(MPUtil.allEQMapPre( user, "user"));
return R.ok().put("data", userService.selectListView(ew));
}
/**
* 信息
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") String id){
UserEntity user = userService.selectById(id);
return R.ok().put("data", user);
}
/**
* 获取用户的session用户信息
*/
@RequestMapping("/session")
public R getCurrUser(HttpServletRequest request){
Long id = (Long)request.getSession().getAttribute("userId");
UserEntity user = userService.selectById(id);
return R.ok().put("data", user);
}
/**
* 保存
*/
@PostMapping("/save")
public R save(@RequestBody UserEntity user){
// ValidatorUtils.validateEntity(user);
if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
return R.error("用户已存在");
}
userService.insert(user);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody UserEntity user){
// ValidatorUtils.validateEntity(user);
UserEntity u = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername()));
if(u!=null && u.getId()!=user.getId() && u.getUsername().equals(user.getUsername())) {
return R.error("用户名已存在。");
}
userService.updateById(user);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
userService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
}
源码获取
大家点赞、收藏、关注 ,让更多需要的同学看到
⭐进主页热门专栏推荐订阅⭐ 订阅收藏起来,防止下次找不到
🔎千套Java / PHP / nod.js / asp.net/ Python等项目实战更新中~
🔎百套小程序APP项目实战更新中~👇下方有我的微信名片👇