博主介绍:👉全网个人号和企业号粉丝40W+,每年辅导几千名大学生较好的完成毕业设计,专注计算机软件领域的项目研发,不断的进行新技术的项目实战👈
⭐进主页热门专栏推荐订阅⭐ 订阅收藏起来,防止下次找不到
🔎千套Java / PHP / nod.js / asp.net/ Python等项目实战更新中~
🔎百套小程序APP项目实战更新中~
有需求的各位可以先收藏起来,还有大家在毕设选题,开题报告有疑惑的都可以找我,给你参考意见,需要开题模板的可以私信留言告诉我❤️文末获取源码联系❤️ ⚠️一定要先收藏⚠️
第4章 系统设计
4.1 系统设计的原则
在系统设计过程中,也需要遵循相应的设计原则,这些设计原则可以帮助设计者在短时间内设计出符合设计规范的设计方案。设计原则主要有可靠性,安全性,可定制化,可扩展性,可维护性,可升级性以及客户体验等原则。下面就对这些原则进行简要阐述。
可靠性:一个软件是否可靠决定了其是否被用户使用,设计不可靠的软件,用户很容易就遗弃;
安全性:程序软件承担了信息的保存与管理等事务,安全性不足的软件会导致使用者承担巨大的损失;所以系统安全也是需要考虑进入的;
可定制化:市场环境从来都不是一直固定不变,面对客户群体的改变,以及使用环境的改变,市场需求的改变等因素,程序软件也要易于调整以适应各种变化;
可扩展性:程序软件在运行使用期间,也需要及时引进当下的新技术来进行系统优化,主要就是在系统功能层面,系统性能层面上进行相应的扩展,只有这样才能让系统在实际生活中继续占有市场;
可维护性:程序软件的维护需要一定量的资金,不管是排除现有程序错误,还是变更软件的现有需求,都需要在软件技术上投入一定资金,所以易于维护的软件程序就可以降低技术层面的资金消耗;
可升级性:程序软件的投入使用,会面临用户数量增多的情况,用户对软件的使用率也会提升,所以系统面临这种情况,仍然需要通过升级保持性能的合理,这样才能够适应市场;
客户体验:设计出来的程序软件在界面上不能够太复杂,要遵循界面设计的原理设计出简单,方便操作的功能操作界面,让用户易于接受软件,并乐于使用软件提供的功能。
4.2 系统结构设计
在系统结构设计上,经综合考虑还是选择比js更加简洁的vue框架,现如今浏览器已经实现了普及,并在技术上逐渐完善和成熟,它在节约软件开发成本的基础上,还能实现原本用专业软件操作才能实现的强大功能。总之,小程序架构是当下全新的,认可度高的系统构造技术。系统结构设计图通过绘制,效果展示如下:
图4-1 系统结构设计图
4.3功能结构设计
在管理员功能模块确定下来的基础上,对管理员各个功能进行设计,确定管理员功能的详细模块。绘制的管理员功能结构见下图。
图4.3 管理员功能结构图
4.4数据库设计
与功能结构设计一样,数据库设计也是程序开发不可避免的设计环节,数据库设计最主要的目的就是帮助运行程序存储相应的数据信息。数据库设计包含的内容有数据表结构的设计,也包含了数据库E-R图的设计。
4.4.1 数据库E-R图
在绘制E-R图之前,先要找出数据库的实体,明确各个实体具有的属性,比如用户信息这个实体,它具备的属性包括了用户的姓名属性,用户的密码属性,用户的创建时间属性等,所以明确了用户这个实体,以及用户实体具备的属性之后,就需要根据这些信息绘制用户实体对应的实体属性图了。绘制软件选用当下认可度高,使用范围广,操作便利的微软旗下的Visio工具。
4.4.2 数据库表结构
在进行这部分设计之前,需要明白和掌握数据类型以及各个数据类型的长度范围等知识,因为在一张具体的数据表中,为了方便理解,这里就举个简单的例子。比如用户信息表,这个表格的字段就是用户这个实体具备的属性,这时就需要对字段进行数据类型,以及字段长度的设置,也要设置一个主键来作为用户信息表的唯一标识。这些都是数据库表结构设计需要完成的内容。根据在线打车租车系统的功能设计以及数据库设计要求,展示该系统的数据表结构。
表4.1车辆表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | shangjia_id | Integer | 租赁公司 | 是 |
3 | cheliang_name | String | 车辆名称 | 是 |
4 | cheliang_uuid_number | String | 车辆编号 | 是 |
5 | cheliang_photo | String | 车辆照片 | 是 |
6 | cheliang_address | String | 车辆位置 | 是 |
7 | cheliang_types | Integer | 车辆类型 | 是 |
8 | cheliang_kucun_number | Integer | 车辆数量 | 是 |
9 | cheliang_yajin_money | BigDecimal | 押金 | 是 |
10 | cheliang_old_money | BigDecimal | 租赁原价 | 是 |
11 | cheliang_new_money | BigDecimal | 现价/天 | 是 |
12 | cheliang_clicknum | Integer | 车辆热度 | 是 |
13 | cheliang_content | String | 车辆介绍 | 是 |
14 | shangxia_types | Integer | 是否上架 | 是 |
15 | cheliang_delete | Integer | 逻辑删除 | 是 |
16 | insert_time | Date | 录入时间 | 是 |
17 | create_time | Date | 创建时间 | 是 |
表4.2车辆收藏表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | cheliang_id | Integer | 车辆 | 是 |
3 | yonghu_id | Integer | 用户 | 是 |
4 | cheliang_collection_types | Integer | 类型 | 是 |
5 | insert_time | Date | 收藏时间 | 是 |
6 | create_time | Date | 创建时间 | 是 |
表4.3车辆评价表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | cheliang_id | Integer | 车辆 | 是 |
3 | yonghu_id | Integer | 用户 | 是 |
4 | cheliang_commentback_text | String | 评价内容 | 是 |
5 | insert_time | Date | 评价时间 | 是 |
6 | reply_text | String | 回复内容 | 是 |
7 | update_time | Date | 回复时间 | 是 |
8 | create_time | Date | 创建时间 | 是 |
表4.4车辆订单表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | cheliang_order_uuid_number | String | 订单号 | 是 |
3 | cheliang_id | Integer | 车辆 | 是 |
4 | yonghu_id | Integer | 用户 | 是 |
5 | buy_number | Integer | 租赁天数 | 是 |
6 | zulin_time | Date | 租赁日期 | 是 |
7 | huanche_time | Date | 还车日期 | 是 |
8 | cheliang_order_true_price | BigDecimal | 实付价格 | 是 |
9 | cheliang_order_types | Integer | 订单类型 | 是 |
10 | cheliang_order_payment_types | Integer | 支付类型 | 是 |
11 | insert_time | Date | 订单创建时间 | 是 |
12 | 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 | siji_id | Integer | 司机 | 是 |
3 | luxian_name | String | 路线名称 | 是 |
4 | luxian_uuid_number | String | 路线编号 | 是 |
5 | luxian_photo | String | 路线照片 | 是 |
6 | luxian_phone | String | 联系方式 | 是 |
7 | luxian_chepaihao | String | 车牌号 | 是 |
8 | cheliang_types | Integer | 车辆类型 | 是 |
9 | luxian_types | Integer | 路线类型 | 是 |
10 | chufa_time | Date | 出发时间 | 是 |
11 | luxian_shifa_address | String | 始发地 | 是 |
12 | luxian_daoda_address | String | 到达地 | 是 |
13 | luxian_kucun_number | Integer | 座位 | 是 |
14 | luxian_new_money | BigDecimal | 价格/人 | 是 |
15 | luxian_clicknum | Integer | 热度 | 是 |
16 | luxian_text | String | 途径地点 | 是 |
17 | luxian_content | String | 乘车要求 | 是 |
18 | insert_time | Date | 录入时间 | 是 |
19 | create_time | Date | 创建时间 | 是 |
表4.7路线收藏表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | luxian_id | Integer | 路线 | 是 |
3 | yonghu_id | Integer | 用户 | 是 |
4 | luxian_collection_types | Integer | 类型 | 是 |
5 | insert_time | Date | 收藏时间 | 是 |
6 | create_time | Date | 创建时间 | 是 |
表4.8路线评价表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | luxian_id | Integer | 路线 | 是 |
3 | yonghu_id | Integer | 用户 | 是 |
4 | luxian_commentback_text | String | 评价内容 | 是 |
5 | insert_time | Date | 评价时间 | 是 |
6 | reply_text | String | 回复内容 | 是 |
7 | update_time | Date | 回复时间 | 是 |
8 | create_time | Date | 创建时间 | 是 |
表4.9预约出行表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | luxian_order_uuid_number | String | 出行订单号 | 是 |
3 | luxian_id | Integer | 路线 | 是 |
4 | yonghu_id | Integer | 用户 | 是 |
5 | buy_number | Integer | 乘车人数 | 是 |
6 | luxian_order_true_price | BigDecimal | 实付价格 | 是 |
7 | luxian_order_types | Integer | 订单类型 | 是 |
8 | luxian_order_payment_types | Integer | 支付类型 | 是 |
9 | insert_time | Date | 订单创建时间 | 是 |
10 | create_time | Date | 创建时间 | 是 |
表4.10租赁公司表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | shangjia_name | String | 租赁公司名称 | 是 |
3 | shangjia_phone | String | 联系方式 | 是 |
4 | shangjia_email | String | 邮箱 | 是 |
5 | shangjia_photo | String | 租赁公司logo | 是 |
6 | shangjia_address | String | 租赁公司地址 | 是 |
7 | shangjia_xingji_types | Integer | 租赁公司信用类型 | 是 |
8 | new_money | BigDecimal | 现有余额 | 是 |
9 | shangjia_content | String | 租赁公司介绍 | 是 |
10 | shangjia_delete | Integer | 逻辑删除 | 是 |
11 | create_time | Date | 创建时间 | 是 |
表4.11司机表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | siji_name | String | 司机姓名 | 是 |
3 | siji_phone | String | 司机手机号 | 是 |
4 | siji_id_number | String | 司机身份证号 | 是 |
5 | siji_photo | String | 司机头像 | 是 |
6 | siji_email | String | 电子邮箱 | 是 |
7 | new_money | BigDecimal | 余额 | 是 |
8 | create_time | Date | 创建时间 | 是 |
表4.12用户表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
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.13优惠活动表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | youhuihuodong_name | String | 优惠活动名称 | 是 |
3 | youhuihuodong_photo | String | 优惠活动图片 | 是 |
4 | youhuihuodong_types | Integer | 优惠活动类型 | 是 |
5 | youhuihuodong_content | String | 优惠活动详情 | 是 |
6 | insert_time | Date | 活动发布时间 | 是 |
7 | create_time | Date | 创建时间 | 是 |
表4.14管理员表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | username | String | 用户名 | 是 |
3 | password | String | 密码 | 是 |
4 | role | String | 角色 | 是 |
5 | addtime | Date | 新增时间 | 是 |
系统实现这个章节的内容主要还是展示系统的功能界面设计效果,在实现系统基本功能,比如修改,比如添加,比如删除等管理功能的同时,也显示出系统各个功能的界面实现效果,该部分内容一方面与前面提到的系统分析,系统设计的内容相呼应,另一方面也是一个实际成果的展示。
5.1管理员功能实现
5.1.1 车辆管理
此页面让管理员管理车辆的数据,车辆管理页面见下图。此页面主要实现车辆的增加、修改、删除、查看的功能。
图5-1 车辆管理页面
5.1.2 路线信息管理
路线信息管理页面提供的功能操作有:新增路线,修改路线,删除路线操作。下图就是路线信息管理页面。
图5.3 路线信息管理页面
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项目实战更新中~👇下方有我的微信名片👇