博主介绍:全网个人号和企业号粉丝40W+,每年辅导几千名大学生较好的完成毕业设计,专注计算机软件领域的项目研发,不断的进行新技术的项目实战
️热门专栏推荐订阅️ 订阅收藏起来,防止下次找不到上百套Python实战项目持续更新中
有需求的各位可以先收藏起来,还有大家在毕设选题,开题报告有疑惑的都可以找我,给你参考意见,需要开题模板的可以私信留言告诉我️文末联系方式获取完整资料️
4 系统软件的总体设计
4.1系统的基本要求
(1)功能要求:管理人员可以管理自己的个人中心,对用户管理、营养师管理、预约订单管理、饮食计划管理、美食分类管理、热门美食管理、美食教程管理、美食店铺管理、美食社区、系统管理等进行管理 [3]。
(2)性能:可以准确无误的在不同的操作系统中登录到用户、营养师或者管理员的相应界面进行轻松的操作[4]。
(3)环境要求:支持不同的操纵系统和不同的平台,可用于Windows系列、Vista系统等多种操作系统。
4.2 系统开发目标
本美食推荐管理系统的主要开发目标如下:
(1)减少后台管理人员的工作量,对营养师的信息进行系统的管理;
(2)必须要方便快捷的查看搜索信息并管理信息;
(3)用户是具有多样性的,所以界面要设置的简单明了,操作更要方便快捷。
4.3 系统总体架构设计
本系统使用的数据库为MySQL数据库[10],选择该数据库的原因是因为该数据库开源、免费,且相对简便,且由于使用人数众多,在处理问题上会得到更多已知的帮助。本系统作为一个美食推荐管理系统,其体量并不会很大,也很适合MySQL数据库的特点。综上所述,本项目采用MySQL作为本项目的数据库和进行数据表的设计。
如图4-1是该系统软件的总体功能结构图:
图4-1 总体功能结构图
4.4 系统数据库的设计
4.4.1数据库设计原则
要学习程序设计,如果您想了解数据库管理系统或根据需要开发的系统接口,则必须创建一个数据库管理系统模型来存储数据。这样就不需要在应用程序编程期间将信息加载到操作系统页面中,从而提高了整个系统的效率。信息数据库管理系统中存储着大量的数据,可以说是管理信息系统建设的中心和基础。该信息库管理系统还提供了管理信息系统建设中添加、删除、修改和搜索的操作功能,使管理信息系统建设可以快速查询所需数据,而不是直接从程序代码中查找。信息库管理系统将信息表的各个组成部分按照具体的方法进行组合,准确地组合、分类并构成信息库管理系统。
4.4.2数据库E/R图
ER图是由实体及其关系构成的图,通过E/R图可以清楚地描述系统涉及到的实体之间的相互关系。在系统中对一些主要的几个关键实体如下图:
(1) 美食店铺实体属性图如下所示:
图4-2美食店铺实体属性图
(2) 美食社区实体属性图如下所示:
图4-3美食社区实体属性图
(3) 饮食计划实体属性图如下所示:
图4-4饮食计划实体属性图
(4) 营养师实体属性图如下所示:
图4-5营养师实体属性图
(5) 热门美食实体属性图如下所示:
4.4.3 数据库表
该系统采用的数据库是MySQL,根据该系统的数据存储特点进行数据库关系表的设计。下面是该系统中关键部分关系表的详细信息。
表4-1:美食分类
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
id |
bigint |
主键 |
主键 |
||
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
fenlei |
varchar |
200 |
分类 |
表4-2:美食店铺
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
id |
bigint |
主键 |
主键 |
||
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
dianpumingcheng |
varchar |
200 |
店铺名称 |
||
tupian |
varchar |
200 |
图片 |
||
yingyeshijian |
varchar |
200 |
营业时间 |
||
fuzeren |
varchar |
200 |
负责人 |
||
lianxidianhua |
varchar |
200 |
联系电话 |
||
dianpudizhi |
varchar |
200 |
店铺地址 |
||
dianpujieshao |
longtext |
4294967295 |
店铺介绍 |
||
jingdiancaipin |
longtext |
4294967295 |
经典菜品 |
||
thumbsupnum |
int |
赞 |
0 |
||
crazilynum |
int |
踩 |
0 |
表4-3:美食社区
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
id |
bigint |
主键 |
主键 |
||
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
title |
varchar |
200 |
帖子标题 |
||
content |
longtext |
4294967295 |
帖子内容 |
||
parentid |
bigint |
父节点id |
|||
userid |
bigint |
用户id |
|||
username |
varchar |
200 |
用户名 |
||
avatarurl |
varchar |
200 |
头像 |
||
isdone |
varchar |
200 |
状态 |
表4-4:预约订单
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
id |
bigint |
主键 |
主键 |
||
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
yuyuedanhao |
varchar |
200 |
预约单号 |
||
zhanghao |
varchar |
200 |
账号 |
||
xingming |
varchar |
200 |
姓名 |
||
yuyuefei |
int |
预约费 |
|||
dianhua |
varchar |
200 |
电话 |
||
yuyueshijian |
datetime |
预约时间 |
|||
xiadanshijian |
datetime |
下单时间 |
|||
yonghuzhanghao |
varchar |
200 |
用户账号 |
||
yonghuxingming |
varchar |
200 |
用户姓名 |
||
xingbie |
varchar |
200 |
性别 |
||
nianling |
int |
年龄 |
|||
shouji |
varchar |
200 |
手机 |
||
sfsh |
varchar |
200 |
是否审核 |
待审核 |
|
shhf |
longtext |
4294967295 |
审核回复 |
||
ispay |
varchar |
200 |
是否支付 |
未支付 |
表4-5:营养师评论表
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
id |
bigint |
主键 |
主键 |
||
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
refid |
bigint |
关联表id |
|||
userid |
bigint |
用户id |
|||
avatarurl |
varchar |
200 |
头像 |
||
nickname |
varchar |
200 |
用户名 |
||
content |
longtext |
4294967295 |
评论内容 |
||
reply |
longtext |
4294967295 |
回复内容 |
表4-6:用户
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
id |
bigint |
主键 |
主键 |
||
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
yonghuzhanghao |
varchar |
200 |
用户账号 |
||
yonghuxingming |
varchar |
200 |
用户姓名 |
||
mima |
varchar |
200 |
密码 |
||
touxiang |
varchar |
200 |
头像 |
||
xingbie |
varchar |
200 |
性别 |
||
nianling |
int |
年龄 |
|||
shouji |
varchar |
200 |
手机 |
表4-7:热门美食评论表
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
id |
bigint |
主键 |
主键 |
||
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
refid |
bigint |
关联表id |
|||
userid |
bigint |
用户id |
|||
avatarurl |
varchar |
200 |
头像 |
||
nickname |
varchar |
200 |
用户名 |
||
content |
longtext |
4294967295 |
评论内容 |
||
reply |
longtext |
4294967295 |
回复内容 |
表4-8:饮食计划
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
id |
bigint |
主键 |
主键 |
||
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
yonghuzhanghao |
varchar |
200 |
用户账号 |
||
yonghuxingming |
varchar |
200 |
用户姓名 |
||
zaocandapei |
longtext |
4294967295 |
早餐搭配 |
||
wucandapei |
longtext |
4294967295 |
午餐搭配 |
||
wancandapei |
longtext |
4294967295 |
晚餐搭配 |
||
jihuaxiangqing |
longtext |
4294967295 |
计划详情 |
||
zhanghao |
varchar |
200 |
账号 |
||
xingming |
varchar |
200 |
姓名 |
表4-9:用户表
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
id |
bigint |
主键 |
主键 |
||
username |
varchar |
100 |
用户名 |
||
password |
varchar |
100 |
密码 |
||
role |
varchar |
100 |
角色 |
管理员 |
|
addtime |
timestamp |
新增时间 |
CURRENT_TIMESTAMP |
表4-10:美食教程评论表
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
id |
bigint |
主键 |
主键 |
||
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
refid |
bigint |
关联表id |
|||
userid |
bigint |
用户id |
|||
avatarurl |
varchar |
200 |
头像 |
||
nickname |
varchar |
200 |
用户名 |
||
content |
longtext |
4294967295 |
评论内容 |
||
reply |
longtext |
4294967295 |
回复内容 |
表4-11: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-12:营养师
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
id |
bigint |
主键 |
主键 |
||
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
zhanghao |
varchar |
200 |
账号 |
||
xingming |
varchar |
200 |
姓名 |
||
mima |
varchar |
200 |
密码 |
||
zhaopian |
varchar |
200 |
照片 |
||
xingbie |
varchar |
200 |
性别 |
||
yuyuefei |
int |
预约费 |
|||
dianhua |
varchar |
200 |
电话 |
表4-13:美食店铺评论表
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
id |
bigint |
主键 |
主键 |
||
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
refid |
bigint |
关联表id |
|||
userid |
bigint |
用户id |
|||
avatarurl |
varchar |
200 |
头像 |
||
nickname |
varchar |
200 |
用户名 |
||
content |
longtext |
4294967295 |
评论内容 |
||
reply |
longtext |
4294967295 |
回复内容 |
表4-14:收藏表
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
id |
bigint |
主键 |
主键 |
||
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
userid |
bigint |
用户id |
|||
refid |
bigint |
商品id |
|||
tablename |
varchar |
200 |
表名 |
||
name |
varchar |
200 |
名称 |
||
picture |
varchar |
200 |
图片 |
||
type |
varchar |
200 |
类型(1:收藏,21:赞,22:踩,31:竞拍参与,41:关注) |
1 |
|
inteltype |
varchar |
200 |
推荐类型 |
||
remark |
varchar |
200 |
备注 |
表4-15:配置文件
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
id |
bigint |
主键 |
主键 |
||
name |
varchar |
100 |
配置参数名称 |
||
value |
varchar |
100 |
配置参数值 |
表4-16:热门美食
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
id |
bigint |
主键 |
主键 |
||
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
meishimingcheng |
varchar |
200 |
美食名称 |
||
fenlei |
varchar |
200 |
分类 |
||
tupian |
varchar |
200 |
图片 |
||
cailiao |
varchar |
200 |
材料 |
||
meishitese |
longtext |
4294967295 |
美食特色 |
||
thumbsupnum |
int |
赞 |
0 |
||
crazilynum |
int |
踩 |
0 |
||
clicktime |
datetime |
最近点击时间 |
|||
clicknum |
int |
点击次数 |
0 |
表4-17:美食资讯
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
id |
bigint |
主键 |
主键 |
||
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
title |
varchar |
200 |
标题 |
||
introduction |
longtext |
4294967295 |
简介 |
||
picture |
varchar |
200 |
图片 |
||
content |
longtext |
4294967295 |
内容 |
表4-18:美食教程
字段名称 |
类型 |
长度 |
字段说明 |
主键 |
默认值 |
id |
bigint |
主键 |
主键 |
||
addtime |
timestamp |
创建时间 |
CURRENT_TIMESTAMP |
||
meishimingcheng |
varchar |
200 |
美食名称 |
||
fenlei |
varchar |
200 |
分类 |
||
tupian |
varchar |
200 |
图片 |
||
yongliao |
varchar |
200 |
用料 |
||
pengrenfangfa |
varchar |
200 |
烹饪方法 |
||
pengrenshizhang |
varchar |
200 |
烹饪时长 |
||
meishitese |
longtext |
4294967295 |
美食特色 |
||
xiaotieshi |
longtext |
4294967295 |
小贴士 |
||
faburiqi |
date |
发布日期 |
|||
yonghuzhanghao |
varchar |
200 |
用户账号 |
||
yonghuxingming |
varchar |
200 |
用户姓名 |
||
thumbsupnum |
int |
赞 |
0 |
||
crazilynum |
int |
踩 |
0 |
5 系统软件功能的具体实现
5.1系统功能实现
当人们打开系统的网址后,首先看到的就是首页界面。在这里,人们能够看到系统的导航条,通过导航条导航进入各功能展示页面进行操作。系统首页界面如图5-1所示:
图5-1 系统首页界面
营养师:在营养师页面的输入栏中输入账号和姓名进行查询,可以查看到营养师详细信息,并根据需要进行预约、评论或收藏操作;营养师页面如图5-2所示:
图5-2营养师详细页面
美食教程:在美食教程页面的输入栏中输入美食名称、用料、用户账号和选择分类进行查询,可以查看到美食教程详细信息,并根据需要进行评论或收藏操作;美食教程页面如图5-3所示:
图5-3美食教程详细页面
美食店铺:在美食店铺页面的输入栏中输入店铺名称和店铺地址进行查询,可以查看到美食店铺详细信息,并进行评论或收藏操作,美食店铺页面如图5-4所示:
图5-4美食店铺详细页面
个人中心:在个人中心页面可以对个人中心、我的发布、我的收藏和我的关注进行详细操作;
个人中心:在个人中心页面通过填写个人资料进行信息更新操作;如图5-5所示:
图5-5个人中心界面
5.2后台模块实现
后台用户登录,在登录页面选择需要登录的角色,在正确输入用户名和密码后,进入操作系统进行操作;如图5-6所示。
图5-6 后台登录界面
5.2.1管理员模块实现
管理员进入主页面,主要功能包括对个人中心、用户管理、营养师管理、预约订单管理、饮食计划管理、美食分类管理、热门美食管理、美食教程管理、美食店铺管理、美食社区、系统管理等进行操作。管理员主页面如图5-7所示:
图5-7 管理员主界面
代码实现
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();
}
}
源码获取
大家点赞、收藏、关注 ,让更多需要的同学看到
不同开发语言专栏推荐订阅:
下方有我的微信名片
文章评论