博主介绍:👉全网个人号和企业号粉丝40W+,每年辅导几千名大学生较好的完成毕业设计,专注计算机软件领域的项目研发,不断的进行新技术的项目实战👈
⭐️热门专栏推荐订阅⭐️ 订阅收藏起来,防止下次找不到🔎百套Python实战项目持续更新中~
有需求的各位可以先收藏起来,还有大家在毕设选题,开题报告有疑惑的都可以找我,帮你完成文档⚠️文末联系方式获取完整资料⚠️
四 系统设计
4.1系统设计总体描述
总体上看,医药校园理发预约APP具有注册登录、个人中心、学生管理、发型师管理、发型师信息管理、预约发型师管理、取消预约管理、理发信息管理、系统管理等功能模块。
系统总体功能结构图如下所示:
图4-1系统总体结构图
4.2数据库设计
4.2.1 数据库系统
构建一个医药校园理发预约App数据库是必不可少的,而我们使用的是MySQL关系数据库,开发工具是时下热门的Navicat for MySQL开发。MySQL有着信息卓越、服务稳定并且开源,可以不用担心费用问题,对于个人的管理及维护上也十分便捷,Navicat有着简洁的界面和稳定的开发环境,还拥有着优秀的图形用户界面。
4.2.2数据库实体及属性
取消预约实体属性图,如图4-2所示。
图4-2取消预约实体属性图
公告信息实体属性图,如图4-3所示。
图4-3公告信息实体属性图
理发信息实体属性图,如图4-4所示。
图4-4理发信息实体属性图
发型师实体属性图,如图4-5所示。
图4-5发型师实体属性图
学生实体属性图,如图4-6所示。
图4-6学生实体属性图
4.2.3数据库设计表
在我们建立数据表的时候,我们需要考虑标语表之间、数据之间的关系,数据库的设计显得尤为重要,它关系着开发软件过程中各个方面的效率、应用、设计。详细信息如下。
表4-1:用户表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
id | bigint | 主键 | 主键 | ||
username | varchar | 100 | 用户名 | ||
password | varchar | 100 | 密码 | ||
role | varchar | 100 | 角色 | 管理员 | |
addtime | timestamp | 新增时间 | CURRENT_TIMESTAMP |
表4-2:token表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
id | bigint | 主键 | 主键 | ||
userid | bigint | 用户id | |||
username | varchar | 100 | 用户名 | ||
tablename | varchar | 100 | 表名 | ||
role | varchar | 100 | 角色 | ||
token | varchar | 200 | 密码 | ||
addtime | timestamp | 新增时间 | CURRENT_TIMESTAMP | ||
expiratedtime | timestamp | 过期时间 | CURRENT_TIMESTAMP |
表4-3:关于我们
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
title | varchar | 200 | 标题 | ||
subtitle | varchar | 200 | 副标题 | ||
content | longtext | 4294967295 | 内容 | ||
picture1 | longtext | 4294967295 | 图片1 | ||
picture2 | longtext | 4294967295 | 图片2 | ||
picture3 | longtext | 4294967295 | 图片3 |
表4-4:取消预约
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
yuyuebianhao | varchar | 200 | 预约编号 | ||
faxingshizhanghao | varchar | 200 | 发型师账号 | ||
faxingshixingming | varchar | 200 | 发型师姓名 | ||
tupian | longtext | 4294967295 | 图片 | ||
quxiaoshijian | date | 取消时间 | |||
quxiaoyuanyin | longtext | 4294967295 | 取消原因 | ||
xueshengzhanghao | varchar | 200 | 学生账号 | ||
xueshengxingming | varchar | 200 | 学生姓名 | ||
dianhuahaoma | varchar | 200 | 电话号码 | ||
sfsh | varchar | 200 | 是否审核 | 待审核 | |
shhf | longtext | 4294967295 | 审核回复 |
表4-5:公告信息
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
title | varchar | 200 | 标题 | ||
introduction | longtext | 4294967295 | 简介 | ||
picture | longtext | 4294967295 | 图片 | ||
content | longtext | 4294967295 | 内容 |
表4-6:理发信息
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
lifabianhao | varchar | 200 | 理发编号 | ||
faxingshizhanghao | varchar | 200 | 发型师账号 | ||
faxingshixingming | varchar | 200 | 发型师姓名 | ||
tupian | longtext | 4294967295 | 图片 | ||
zhuangtai | varchar | 200 | 状态 | ||
lifashijian | date | 理发时间 | |||
xueshengzhanghao | varchar | 200 | 学生账号 | ||
xueshengxingming | varchar | 200 | 学生姓名 | ||
dianhuahaoma | varchar | 200 | 电话号码 | ||
ispay | varchar | 200 | 是否支付 | 未支付 |
表4-7:发型师信息
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
faxingshizhanghao | varchar | 200 | 发型师账号 | ||
faxingshixingming | varchar | 200 | 发型师姓名 | ||
tupian | longtext | 4294967295 | 图片 | ||
jiage | int | 价格 | |||
renshu | int | 人数(当前人数) | |||
fuwufanwei | varchar | 200 | 服务范围 | ||
faxingshigongling | varchar | 200 | 发型师工龄 | ||
faxingshijianjie | longtext | 4294967295 | 发型师简介 |
表4-8:发型师
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
faxingshizhanghao | varchar | 200 | 发型师账号 | ||
faxingshixingming | varchar | 200 | 发型师姓名 | ||
mima | varchar | 200 | 密码 | ||
xingbie | varchar | 200 | 性别 | ||
touxiang | longtext | 4294967295 | 头像 | ||
dianhuahaoma | varchar | 200 | 电话号码 |
表4-9:配置文件
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
id | bigint | 主键 | 主键 | ||
name | varchar | 100 | 配置参数名称 | ||
value | varchar | 100 | 配置参数值 |
表4-10:预约发型师
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
yuyuebianhao | varchar | 200 | 预约编号 | ||
faxingshizhanghao | varchar | 200 | 发型师账号 | ||
faxingshixingming | varchar | 200 | 发型师姓名 | ||
tupian | longtext | 4294967295 | 图片 | ||
renshu | int | 人数 | |||
yuyueshijian | date | 预约时间 | |||
xueshengzhanghao | varchar | 200 | 学生账号 | ||
xueshengxingming | varchar | 200 | 学生姓名 | ||
dianhuahaoma | varchar | 200 | 电话号码 | ||
sfsh | varchar | 200 | 是否审核 | 待审核 | |
shhf | longtext | 4294967295 | 审核回复 |
表4-11:学生
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
xueshengzhanghao | varchar | 200 | 学生账号 | ||
xueshengxingming | varchar | 200 | 学生姓名 | ||
mima | varchar | 200 | 密码 | ||
xingbie | varchar | 200 | 性别 | ||
touxiang | longtext | 4294967295 | 头像 | ||
nianling | int | 年龄 | |||
dianhuahaoma | varchar | 200 | 电话号码 |
五 App的实现
5.1 App前台功能的实现
5.1.1登录界面的实现
首先双击打开App,连上网络之后会显示出本系统的登录界面,这是进入App的第初始页面“登录”,能成功进入到该登录界面则代表App的开启是成功的,接下来就可以操作本系统所带有的其他所有的功能。登录界面如图5-1所示。
图5-1 登录界面
5.1.2注册界面的实现
第一次使用本app的使用者,首先是要进行注册,点击“注册”,然后就会进入到注册的页面里面,将用户信息录入注册表,确认信息正确后,系统才会进入登录界面,用户登录成功后可使用本app所提供的所有功能。注册界面如图5-2所示。
图5-2 注册界面
系统首页是学生注册登录后进入的第一个界面,学生可通过app端首页的最下面的那一行导航栏中的“发型师信息”进入到相应的网页进行操作;点击“我的”进入我的页面,在我的页面可以对预约发型师、取消预约和理发信息等进行详细操作。我的界面如图5-3所示。
图5-3 app我的界面图
发型师信息:在发型师信息界面可以看到发型师详情信息,并根据需要对发型师进行预约操作。发型师信息详情如图5-4所示。
图5-4 发型师信息详情界面图
5.2 APP后台的实现
后台登录,通过填写用户名和密码等信息进行登录操作,如图5-5所示。
图5-5后台登录界面图
管理员登录进入app可以查看首页、个人中心、学生管理、发型师管理、发型师信息管理、预约发型师管理、取消预约管理、理发信息管理、系统管理等功能进行详细操作,如图5-6所示。
图5-6管理员功能界面图
管理员点击学生管理;在学生页面输入学生账号和学生姓名进行查询,新增或删除学生列表,并根据需要对学生详细信息进行详情,修改和删除操作;如图5-7所示。
图5-7学生管理界面图
管理员点击发型师管理;在发型师页面输入发型师账号和发型师姓名进行查询,新增或删除发型师列表,并根据需要对发型师信息进行详情,修改和删除操作;如图5-8所示。
图5-8发型师管理界面图
管理员点击预约发型师管理;在预约发型师页面输入发型师账号和选择是否通过进行查询或删除预约发型师列表,并根据需要对预约发型师信息进行详情,修改和删除操作;如图5-9所示。
图5-9预约发型师管理界面图
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();
}
}
源码获取
大家点赞、收藏、关注 ,让更多需要的同学看到
不同开发语言专栏推荐订阅:
👇下方有我的微信名片👇