博主介绍
:????全网个人号和企业号
粉丝40W+
,每年辅导几千名大学生较好的完成毕业设计,专注计算机软件领域的项目研发,不断的进行新技术的项目实战????
⭐️
热门专栏
推荐订阅
⭐️
订阅收藏起来,防止下次找不到
????
千套JAVA实战项目持续更新中~
????
上百套小程序实战项目持续更新中~
????
上百套Python实战项目持续更新中
有需求的各位可以
先收藏起来
,还有大家在毕设选题,开题报告有疑惑的都可以找我,给你参考意见,需要
开题模板
的可以私信留言告诉我
❤️
文末获取源码联系
❤️
⚠️
一定要先收藏
⚠️
第
4
章
系统设计
系统设计必须参考当前社会最主流的页面设计,因为不主流的就是已经被淘汰的,随着软件设计多年发展,已经有了完整的设计理念。
4.1
界面设计原则
针对界面的模块以及操作部分,有些规则是需要提前设定的。
第一点:前后台主界面必须统一。统一的有整个网站的上部以及下部,中间显示关键内容,后台的菜单栏必须在左侧。颜色也要统一,不能有很明显的突兀,产生视觉厌恶的效果。
第二点:导航条必须美化。界面统一后,导航就是一个门户入口,就像大门一样,非常的引人注目,如果导航条不美化,随便弄一个导航条会与界面不匹配,并且有种设计不上档次的感觉。
第三点:输入框必须格式统一,并且相关核心数据要尽量的放到前面,要符合人们的正常认知。比如用户的属性有账号密码或者性别电话或者详细说明等这些,一般设定详细说明的为补充部分,尽量放到最下面,不能说把姓名或者电话放到最下面,这样一方面是页面布局不美观,另一方面就是违反人们的日常生活认知。
第四点:界面设计必须要考虑用户对象,他们可能对计算机的认知也就仅仅处于操作使用阶段,尽量要用贴合人们日常生活和操作的习惯设计到项目里面使用。
4.
2
功能
结构设计
站在使用者的角度来分析北京古城民宿管理系统的详细功能,最后使用结构图来展示设计结果。
管理员功能结构设计见图4.1。管理员管理商家,管理游记攻略,管理古城推荐,管理网站活动等信息。
图4.1 管理员功能结构图
商家功能结构设计见图4.2。商家需要回复用户咨询房间的信息,需要增删改查房间信息,需要使用房间预定订单等。
图4.2 商家功能结构图
用户功能结构设计见图4.3。用户可以对游记攻略,网站活动,古城推荐进行收藏,发布留言和查询,可以查看商家,可以查看房间,可以预定房间。
图4.3 用户功能结构图
4.
3
数据库设计
能满足当前项目数据所需要的数据库模式采用的是关系型数据库。首先关系型数据库发展历史悠久,功能完善,性价比也比较高,不管是开发成本还是使用成本都可以接收,不需要重新创建一种新的数据模型。
4.
3
.1
数据库E-R图设计
数据需要提前设计清楚,如何简单明了的表示数据实体与属性之间的关系,目前最优解决方法是采用画E-R图的方式来进行描述,用E-R图的好处有以下几点:
第一点:数据筛选,有时候用文字描述的数据不太直观,当用E-R来描述的时候可以更直观的看到数据之间的关系,有助于清空冗余的数据表达,让数据更清晰;
第二点:可以通过优化的E-R对数据进行优化,能提前对数据量进行预估,提前设定相关规则,避免数据混乱;
第三点:可以提高数据的完整性,当E-R画出的过程也是对文字逻辑的梳理过程,有助于大脑的理解;
第四点:优化好的数据在检索方面可以人为的提高检索效率;
本章主要表达各个数据模型直接有任何关系,通过E-R图可以更清楚的判断,有助于提高数据存储格式等一系列的后续操作的效率,优化开发步骤。
(1)图4.3为房间实体图。
图4.3 房间实体图
(2)图4.4为用户实体图。
图4.4 用户实体图
(3)图4.5为房间预定实体图。
图4.5 房间预定实体图
(4)图4.6为商家实体图。
图4.6 商家实体图
(5)图4.7为上述实体间关系E-R图。
图4.7 实体间关系E-R图
4.
3
.2 数据库表结构设计
三大范式基本上概括了数据库设计的必要规范,只有符合三大范式的数据才是合理的数据。
范式第一条:表与表之间,字段与字段之间,每个名字都不能产生混淆的概念,必须不一样,必须确保唯一性的存在。
范式第二条:在满足第一条范式的前提上要对主键进行规定,不能这个表的主键在第一列,后面的表的主键位置列数就变了,这样不可以,必须保证统一,让主键在相同列上。
范式第三条:满足前两条范式的同时,如果获取数据,必须可以通过主键就能查询到相关数据,尽量不要跨表获取。
三大范式是继续关系,每一个范式都要继承前面范式的要求,就像盖房子一样,必须先打地基,然后再在上面做其他事情,范式就是这样。通过三大范式要求的数据,不仅能规范数据库的设定,还可以提高数据库检索效率。
下面展示设计的北京古城民宿管理系统的数据表结构。
表4.1 房间表
字段
|
类型
|
说明
|
允许空
|
id (主键)
|
int(11)
|
主键
|
不允许空
|
shangjia_id
|
int(11)
|
商家
|
允许空
|
fangjian_name
|
varchar(200)
|
房间名称
|
允许空
|
fangjian_uuid_number
|
varchar(200)
|
房间编号
|
允许空
|
fangjian_photo
|
varchar(200)
|
房间照片
|
允许空
|
fangjian_address
|
varchar(200)
|
房间位置
|
允许空
|
zan_number
|
int(11)
|
赞
|
允许空
|
cai_number
|
int(11)
|
踩
|
允许空
|
fangjian_types
|
int(11)
|
房型
|
允许空
|
fangjian_kucun_number
|
int(11)
|
剩余房间数
|
允许空
|
fangjian_old_money
|
decimal(10,2)
|
房间原价
|
允许空
|
fangjian_new_money
|
decimal(10,2)
|
现价/间
|
允许空
|
fangjian_clicknum
|
int(11)
|
房间热度
|
允许空
|
fangjian_content
|
longtext
|
房间介绍
|
允许空
|
shangxia_types
|
int(11)
|
是否上架
|
允许空
|
fangjian_delete
|
int(11)
|
逻辑删除
|
允许空
|
insert_time
|
timestamp
|
录入时间
|
允许空
|
create_time
|
timestamp
|
创建时间
|
允许空
|
表4.2 房间咨询表
字段
|
类型
|
说明
|
允许空
|
id (主键)
|
int(11)
|
主键
|
不允许空
|
yonghu_id
|
int(11)
|
提问人
|
允许空
|
shangjia_id
|
int(11)
|
回答人
|
允许空
|
fangjian_chat_issue_text
|
longtext
|
问题
|
允许空
|
issue_time
|
timestamp
|
问题时间
|
允许空
|
fangjian_chat_reply_text
|
longtext
|
回复
|
允许空
|
reply_time
|
timestamp
|
回复时间
|
允许空
|
zhuangtai_types
|
int(255)
|
状态
|
允许空
|
fangjian_chat_types
|
int(11)
|
数据类型
|
允许空
|
insert_time
|
timestamp
|
提问时间
|
允许空
|
create_time
|
timestamp
|
创建时间
|
允许空
|
表4.3 管理员表
字段
|
类型
|
说明
|
允许空
|
id (主键)
|
bigint(20)
|
主键
|
不允许空
|
username
|
varchar(100)
|
用户名
|
不允许空
|
password
|
varchar(100)
|
密码
|
不允许空
|
role
|
varchar(100)
|
角色
|
允许空
|
addtime
|
timestamp
|
新增时间
|
不允许空
|
表4.4 房间点评表
字段
|
类型
|
说明
|
允许空
|
id (主键)
|
int(11)
|
主键
|
不允许空
|
fangjian_id
|
int(11)
|
房间
|
允许空
|
yonghu_id
|
int(11)
|
用户
|
允许空
|
fangjian_commentback_text
|
longtext
|
评价内容
|
允许空
|
insert_time
|
timestamp
|
评价时间
|
允许空
|
reply_text
|
longtext
|
回复内容
|
允许空
|
update_time
|
timestamp
|
回复时间
|
允许空
|
create_time
|
timestamp
|
创建时间
|
允许空
|
表4.5 房间预定表
字段
|
类型
|
说明
|
允许空
|
id (主键)
|
int(11)
|
主键
|
不允许空
|
fangjian_order_uuid_number
|
varchar(200)
|
订单编号
|
允许空
|
fangjian_id
|
int(11)
|
房间
|
允许空
|
yonghu_id
|
int(11)
|
用户
|
允许空
|
buy_number
|
int(11)
|
预约房间数量
|
允许空
|
fangjian_order_time
|
date
|
预约日期
|
允许空
|
fangjian_order_true_price
|
decimal(10,2)
|
实付价格
|
允许空
|
fangjian_order_types
|
int(11)
|
订单类型
|
允许空
|
fangjian_order_payment_types
|
int(11)
|
支付类型
|
允许空
|
insert_time
|
timestamp
|
订单创建时间
|
允许空
|
create_time
|
timestamp
|
创建时间
|
允许空
|
表4.6 游记攻略表
字段
|
类型
|
说明
|
允许空
|
id (主键)
|
int(11)
|
主键
|
不允许空
|
yonghu_id
|
int(11)
|
用户
|
允许空
|
gonglve_name
|
varchar(200)
|
游记攻略标题
|
允许空
|
gonglve_uuid_number
|
varchar(200)
|
游记攻略编号
|
允许空
|
gonglve_photo
|
varchar(200)
|
游记攻略照片
|
允许空
|
gonglve_address
|
varchar(200)
|
游玩位置
|
允许空
|
gonglve_biaoqian
|
varchar(200)
|
标签
|
允许空
|
gonglve_file
|
varchar(200)
|
攻略附件
|
允许空
|
zan_number
|
int(11)
|
赞
|
允许空
|
cai_number
|
int(11)
|
踩
|
允许空
|
gonglve_types
|
int(11)
|
游记攻略类型
|
允许空
|
gonglve_content
|
longtext
|
游记攻略内容
|
允许空
|
insert_time
|
timestamp
|
发布时间
|
允许空
|
create_time
|
timestamp
|
创建时间
|
允许空
|
表4.7 游记攻略点评表
字段
|
类型
|
说明
|
允许空
|
id (主键)
|
int(11)
|
主键
|
不允许空
|
gonglve_id
|
int(11)
|
游记攻略
|
允许空
|
yonghu_id
|
int(11)
|
用户
|
允许空
|
gonglve_liuyan_text
|
longtext
|
留言内容
|
允许空
|
insert_time
|
timestamp
|
留言时间
|
允许空
|
reply_text
|
longtext
|
回复内容
|
允许空
|
update_time
|
timestamp
|
回复时间
|
允许空
|
create_time
|
timestamp
|
创建时间
|
允许空
|
表4.8 古城推荐表
字段
|
类型
|
说明
|
允许空
|
id (主键)
|
int(11)
|
主键
|
不允许空
|
guchengtuijian_name
|
varchar(200)
|
古城标题
|
允许空
|
guchengtuijian_uuid_number
|
varchar(200)
|
古城推荐编号
|
允许空
|
guchengtuijian_photo
|
varchar(200)
|
古城照片
|
允许空
|
guchengtuijian_address
|
varchar(200)
|
古城位置
|
允许空
|
guchengtuijian_file
|
varchar(200)
|
古城资料
|
允许空
|
zan_number
|
int(11)
|
赞
|
允许空
|
cai_number
|
int(11)
|
踩
|
允许空
|
guchengtuijian_types
|
int(11)
|
古城类型
|
允许空
|
guchengtuijian_xingji_types
|
int(11)
|
推荐星级
|
允许空
|
guchengtuijian_content
|
longtext
|
古城介绍
|
允许空
|
shangxia_types
|
int(11)
|
是否上架
|
允许空
|
guchengtuijian_delete
|
int(11)
|
逻辑删除
|
允许空
|
insert_time
|
timestamp
|
上传时间
|
允许空
|
create_time
|
timestamp
|
创建时间
|
允许空
|
表4.9 古城留言表
字段
|
类型
|
说明
|
允许空
|
id (主键)
|
int(11)
|
主键
|
不允许空
|
guchengtuijian_id
|
int(11)
|
古城推荐
|
允许空
|
yonghu_id
|
int(11)
|
用户
|
允许空
|
guchengtuijian_liuyan_text
|
longtext
|
留言内容
|
允许空
|
insert_time
|
timestamp
|
留言时间
|
允许空
|
reply_text
|
longtext
|
回复内容
|
允许空
|
update_time
|
timestamp
|
回复时间
|
允许空
|
create_time
|
timestamp
|
创建时间
|
允许空
|
表4.10 用户表
字段
|
类型
|
说明
|
允许空
|
id (主键)
|
int(11)
|
主键
|
不允许空
|
username
|
varchar(200)
|
账户
|
允许空
|
password
|
varchar(200)
|
密码
|
允许空
|
yonghu_uuid_number
|
varchar(200)
|
用户编号
|
允许空
|
yonghu_name
|
varchar(200)
|
用户姓名
|
允许空
|
yonghu_phone
|
varchar(200)
|
用户手机号
|
允许空
|
yonghu_id_number
|
varchar(200)
|
用户身份证号
|
允许空
|
yonghu_photo
|
varchar(200)
|
用户头像
|
允许空
|
sex_types
|
int(11)
|
性别
|
允许空
|
yonghu_email
|
varchar(200)
|
用户邮箱
|
允许空
|
new_money
|
decimal(10,2)
|
余额
|
允许空
|
jinyong_types
|
int(11)
|
账户状态
|
允许空
|
create_time
|
timestamp
|
创建时间
|
允许空
|
表4.11 网站活动表
字段
|
类型
|
说明
|
允许空
|
id (主键)
|
int(11)
|
主键
|
不允许空
|
huodong_name
|
varchar(200)
|
活动标题
|
允许空
|
huodong_uuid_number
|
varchar(200)
|
网站活动编号
|
允许空
|
huodong_photo
|
varchar(200)
|
活动照片
|
允许空
|
huodong_address
|
varchar(200)
|
活动地点
|
允许空
|
zan_number
|
int(11)
|
赞
|
允许空
|
cai_number
|
int(11)
|
踩
|
允许空
|
huodong_types
|
int(11)
|
活动类型
|
允许空
|
kaishi_time
|
timestamp
|
活动开始时间
|
允许空
|
jieshu_time
|
timestamp
|
活动结束时间
|
允许空
|
huodong_content
|
longtext
|
活动内容
|
允许空
|
shangxia_types
|
int(11)
|
是否上架
|
允许空
|
huodong_delete
|
int(11)
|
逻辑删除
|
允许空
|
insert_time
|
timestamp
|
上传时间
|
允许空
|
create_time
|
timestamp
|
创建时间
|
允许空
|
表4.12 活动留言表
字段
|
类型
|
说明
|
允许空
|
id (主键)
|
int(11)
|
主键
|
不允许空
|
huodong_id
|
int(11)
|
网站活动
|
允许空
|
yonghu_id
|
int(11)
|
用户
|
允许空
|
huodong_liuyan_text
|
longtext
|
留言内容
|
允许空
|
insert_time
|
timestamp
|
留言时间
|
允许空
|
reply_text
|
longtext
|
回复内容
|
允许空
|
update_time
|
timestamp
|
回复时间
|
允许空
|
create_time
|
timestamp
|
创建时间
|
允许空
|
表4.13 商家表
字段
|
类型
|
说明
|
允许空
|
id (主键)
|
int(11)
|
主键
|
不允许空
|
username
|
varchar(200)
|
账户
|
允许空
|
password
|
varchar(200)
|
密码
|
允许空
|
shangjia_name
|
varchar(200)
|
商家名称
|
允许空
|
shangjia_phone
|
varchar(200)
|
联系方式
|
允许空
|
shangjia_email
|
varchar(200)
|
邮箱
|
允许空
|
shangjia_photo
|
varchar(200)
|
营业执照展示
|
允许空
|
shangjia_xingji_types
|
int(11)
|
商家信用类型
|
允许空
|
new_money
|
decimal(10,2)
|
现有余额
|
允许空
|
shangjia_content
|
longtext
|
商家介绍
|
允许空
|
shangjia_delete
|
int(11)
|
逻辑删除
|
允许空
|
jinyong_types
|
int(11)
|
账户状态
|
允许空
|
create_time
|
timestamp
|
创建时间
|
允许空
|
第
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.1.5 房间咨询管理
房间咨询管理界面如图5.5所示。
图5.5 房间咨询管理界面
房间咨询管理包括的基本信息有新消息,状态,发送时间等信息,作为管理员,其可以在房间咨询管理界面回复用户咨询房间的信息。
5.2 商家
功能实现
5.2.1 房间管理
房间管理界面如图5.6所示。
图5.6 房间管理界面
商家在房间管理界面可以修改房间位置,房型,房间热度,房间原价等信息,可以删除房间信息,下架房间。
5.2.2 房间点评管理
房间点评管理界面如图5.7所示。
图5.7 房间点评管理界面
商家在房间点评管理界面除了可以查看用户评价房间的信息,还可以点击右侧的“回复”按钮对该评价进行回复。
5.3 用户
功能实现
5.3.2 房间信息
房间信息界面如图5.10所示。
图5.10 房间信息界面
用户在房间信息界面可以预定房间,可以点击“房间咨询”按钮向房间所属商家进行咨询,可以查看房间所属的商家的具体信息等。
代码实现
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实战项目持续更新中~
????
上百套小程序实战项目持续更新中~
????
上百套Python实战项目持续更新中
????
下方有我的微信名片
????