博主介绍:👉全网个人号和企业号粉丝40W+,每年辅导几千名大学生较好的完成毕业设计,专注计算机软件领域的项目研发,不断的进行新技术的项目实战👈
⭐️热门专栏推荐订阅⭐️ 订阅收藏起来,防止下次找不到🔎百套Python实战项目持续更新中~
有需求的各位可以先收藏起来,还有大家在毕设选题,开题报告有疑惑的都可以找我,给你参考意见,需要开题模板的可以私信留言告诉我❤️文末获取源码联系❤️ ⚠️一定要先收藏⚠️
第4章 系统设计
4.1 基于Django的鱼类知识网站功能结构设计
基于Django的鱼类知识网站根据现实生活中的实际情况对系统用户分为前台和后台两部分,前台部分主要包括首页,注册登录,鱼类知识,视频信息,交流论坛,新闻公告,留言板,后台管理等功能,后台部分包括系统首页,个人中心,用户管理,鱼类分类管理,鱼类知识管理,视频类型管理,视频信息管理,留言板,交流论坛,系统管理等功能,通过这些功能基本可以满足鱼类知识科普的需要。具体如下图4-1所示
图4-2 基于Django的鱼类知识网站功能结构图
4.2 基于Django的鱼类知识网站数据库设计
本系统共包含15个表:分别是关于我们表,配置文件表,视频信息评论表表,鱼类知识评论表表,交流论坛表,留言板表,新闻公告表,视频类型表,视频信息表,收藏表表,关于我们表,用户表表,用户表,鱼类分类表,鱼类知识表等信息表
表名 | 说明 | 功能 |
aboutus | 关于我们 | 主要用来存放关于我们的相关内容 |
config | 配置文件 | 主要用来存放配置文件的相关内容 |
discussshipinxinxi | 视频信息评论表 | 主要用来存放视频信息评论表的相关内容 |
discussyuleizhishi | 鱼类知识评论表 | 主要用来存放鱼类知识评论表的相关内容 |
forum | 交流论坛 | 主要用来存放交流论坛的相关内容 |
messages | 留言板 | 主要用来存放留言板的相关内容 |
news | 新闻公告 | 主要用来存放新闻公告的相关内容 |
shipinleixing | 视频类型 | 主要用来存放视频类型的相关内容 |
shipinxinxi | 视频信息 | 主要用来存放视频信息的相关内容 |
storeup | 收藏表 | 主要用来存放收藏表的相关内容 |
systemintro | 关于我们 | 主要用来存放关于我们的相关内容 |
users | 用户表 | 主要用来存放用户表的相关内容 |
yonghu | 用户 | 主要用来存放用户的相关内容 |
yuleifenlei | 鱼类分类 | 主要用来存放鱼类分类的相关内容 |
yuleizhishi | 鱼类知识 | 主要用来存放鱼类知识的相关内容 |
表 4-2 关于我们信息(aboutus)表
编号 | 数据字段名 | 数据类型 | 允许空 | 是否主键 | 说明 |
NO.1 | id | int | NO | PK | 主键 |
NO.2 | addtime | timestamp | NO | NO | 创建时间 |
NO.3 | title | varchar(200) | NO | NO | 标题 |
NO.4 | subtitle | varchar(200) | NO | NO | 副标题 |
NO.5 | content | longtext | NO | NO | 内容 |
NO.6 | picture1 | longtext | NO | NO | 图片1 |
NO.7 | picture2 | longtext | NO | NO | 图片2 |
NO.8 | picture3 | longtext | NO | NO | 图片3 |
表 4-3 配置文件信息(config)表
编号 | 数据字段名 | 数据类型 | 允许空 | 是否主键 | 说明 |
NO.1 | id | int | NO | PK | 主键 |
NO.2 | name | varchar(100) | NO | NO | 配置参数名称 |
NO.3 | value | varchar(100) | NO | NO | 配置参数值 |
表 4-4 视频信息评论表信息(discussshipinxinxi)表
编号 | 数据字段名 | 数据类型 | 允许空 | 是否主键 | 说明 |
NO.1 | id | int | NO | PK | 主键 |
NO.2 | addtime | timestamp | NO | NO | 创建时间 |
NO.3 | refid | bigint(20) | NO | NO | 关联表id |
NO.4 | userid | bigint(20) | NO | NO | 用户id |
NO.5 | avatarurl | longtext | NO | NO | 头像 |
NO.6 | nickname | varchar(200) | NO | NO | 用户名 |
NO.7 | content | longtext | NO | NO | 评论内容 |
NO.8 | reply | longtext | NO | NO | 回复内容 |
表 4-5 鱼类知识评论表信息(discussyuleizhishi)表
编号 | 数据字段名 | 数据类型 | 允许空 | 是否主键 | 说明 |
NO.1 | id | int | NO | PK | 主键 |
NO.2 | addtime | timestamp | NO | NO | 创建时间 |
NO.3 | refid | bigint(20) | NO | NO | 关联表id |
NO.4 | userid | bigint(20) | NO | NO | 用户id |
NO.5 | avatarurl | longtext | NO | NO | 头像 |
NO.6 | nickname | varchar(200) | NO | NO | 用户名 |
NO.7 | content | longtext | NO | NO | 评论内容 |
NO.8 | reply | longtext | NO | NO | 回复内容 |
表 4-6 交流论坛信息(forum)表
编号 | 数据字段名 | 数据类型 | 允许空 | 是否主键 | 说明 |
NO.1 | id | int | NO | PK | 主键 |
NO.2 | addtime | timestamp | NO | NO | 创建时间 |
NO.3 | title | varchar(200) | NO | NO | 帖子标题 |
NO.4 | content | longtext | NO | NO | 帖子内容 |
NO.5 | parentid | bigint(20) | NO | NO | 父节点id |
NO.6 | userid | bigint(20) | NO | NO | 用户id |
NO.7 | username | varchar(200) | NO | NO | 用户名 |
NO.8 | avatarurl | longtext | NO | NO | 头像 |
NO.9 | isdone | varchar(200) | NO | NO | 状态 |
表 4-7 留言板信息(messages)表
编号 | 数据字段名 | 数据类型 | 允许空 | 是否主键 | 说明 |
NO.1 | id | int | NO | PK | 主键 |
NO.2 | addtime | timestamp | NO | NO | 创建时间 |
NO.3 | userid | bigint(20) | NO | NO | 留言人id |
NO.4 | username | varchar(200) | NO | NO | 用户名 |
NO.5 | avatarurl | longtext | NO | NO | 头像 |
NO.6 | content | longtext | NO | NO | 留言内容 |
NO.7 | cpicture | longtext | NO | NO | 留言图片 |
NO.8 | reply | longtext | NO | NO | 回复内容 |
NO.9 | rpicture | longtext | NO | NO | 回复图片 |
表 4-8 新闻公告信息(news)表
编号 | 数据字段名 | 数据类型 | 允许空 | 是否主键 | 说明 |
NO.1 | id | int | NO | PK | 主键 |
NO.2 | addtime | timestamp | NO | NO | 创建时间 |
NO.3 | title | varchar(200) | NO | NO | 标题 |
NO.4 | introduction | longtext | NO | NO | 简介 |
NO.5 | picture | longtext | NO | NO | 图片 |
NO.6 | content | longtext | NO | NO | 内容 |
表 4-9 视频类型信息(shipinleixing)表
编号 | 数据字段名 | 数据类型 | 允许空 | 是否主键 | 说明 |
NO.1 | id | int | NO | PK | 主键 |
NO.2 | addtime | timestamp | NO | NO | 创建时间 |
NO.3 | shipinleixing | varchar(200) | NO | NO | 视频类型 |
表 4-10 视频信息(shipinxinxi)表
编号 | 数据字段名 | 数据类型 | 允许空 | 是否主键 | 说明 |
NO.1 | id | int | NO | PK | 主键 |
NO.2 | addtime | timestamp | NO | NO | 创建时间 |
NO.3 | shipinbianhao | varchar(200) | NO | NO | 视频编号 |
NO.4 | shipinmingcheng | varchar(200) | NO | NO | 视频名称 |
NO.5 | shipinleixing | varchar(200) | NO | NO | 视频类型 |
NO.6 | shipinfengmian | longtext | NO | NO | 视频封面 |
NO.7 | shipin | longtext | NO | NO | 视频 |
NO.8 | shipinjieshao | longtext | NO | NO | 视频介绍 |
NO.9 | faburiqi | date | NO | NO | 发布日期 |
NO.10 | clicktime | datetime | NO | NO | 最近点击时间 |
NO.11 | clicknum | int(11) | NO | NO | 点击次数 |
表 4-11 收藏表信息(storeup)表
编号 | 数据字段名 | 数据类型 | 允许空 | 是否主键 | 说明 |
NO.1 | id | int | NO | PK | 主键 |
NO.2 | addtime | timestamp | NO | NO | 创建时间 |
NO.3 | userid | bigint(20) | NO | NO | 用户id |
NO.4 | refid | bigint(20) | NO | NO | 商品id |
NO.5 | tablename | varchar(200) | NO | NO | 表名 |
NO.6 | name | varchar(200) | NO | NO | 名称 |
NO.7 | picture | longtext | NO | NO | 图片 |
NO.8 | type | varchar(200) | NO | NO | 类型(1:收藏,21:赞,22:踩,31:竞拍参与,41:关注) |
NO.9 | inteltype | varchar(200) | NO | NO | 推荐类型 |
NO.10 | remark | varchar(200) | NO | NO | 备注 |
表 4-12 关于我们信息(systemintro)表
编号 | 数据字段名 | 数据类型 | 允许空 | 是否主键 | 说明 |
NO.1 | id | int | NO | PK | 主键 |
NO.2 | addtime | timestamp | NO | NO | 创建时间 |
NO.3 | title | varchar(200) | NO | NO | 标题 |
NO.4 | subtitle | varchar(200) | NO | NO | 副标题 |
NO.5 | content | longtext | NO | NO | 内容 |
NO.6 | picture1 | longtext | NO | NO | 图片1 |
NO.7 | picture2 | longtext | NO | NO | 图片2 |
NO.8 | picture3 | longtext | NO | NO | 图片3 |
表 4-13 用户表信息(users)表
编号 | 数据字段名 | 数据类型 | 允许空 | 是否主键 | 说明 |
NO.1 | id | int | NO | PK | 主键 |
NO.2 | username | varchar(100) | NO | NO | 用户名 |
NO.3 | password | varchar(100) | NO | NO | 密码 |
NO.4 | role | varchar(100) | NO | NO | 角色 |
NO.5 | addtime | timestamp | NO | NO | 新增时间 |
表 4-14 用户信息(yonghu)表
编号 | 数据字段名 | 数据类型 | 允许空 | 是否主键 | 说明 |
NO.1 | id | int | NO | PK | 主键 |
NO.2 | addtime | timestamp | NO | NO | 创建时间 |
NO.3 | yonghuzhanghao | varchar(200) | NO | NO | 用户账号 |
NO.4 | mima | varchar(200) | NO | NO | 密码 |
NO.5 | yonghuxingming | varchar(200) | NO | NO | 用户姓名 |
NO.6 | xingbie | varchar(200) | NO | NO | 性别 |
NO.7 | lianxifangshi | varchar(200) | NO | NO | 联系方式 |
NO.8 | touxiang | longtext | NO | NO | 头像 |
表 4-15 鱼类分类信息(yuleifenlei)表
编号 | 数据字段名 | 数据类型 | 允许空 | 是否主键 | 说明 |
NO.1 | id | int | NO | PK | 主键 |
NO.2 | addtime | timestamp | NO | NO | 创建时间 |
NO.3 | yuleifenlei | varchar(200) | NO | NO | 鱼类分类 |
表 4-16 鱼类知识信息(yuleizhishi)表
编号 | 数据字段名 | 数据类型 | 允许空 | 是否主键 | 说明 |
NO.1 | id | int | NO | PK | 主键 |
NO.2 | addtime | timestamp | NO | NO | 创建时间 |
NO.3 | zhishibiaoti | varchar(200) | NO | NO | 知识标题 |
NO.4 | yuleifenlei | varchar(200) | NO | NO | 鱼类分类 |
NO.5 | zhishifengmian | longtext | NO | NO | 知识封面 |
NO.6 | zhishifujian | longtext | NO | NO | 知识附件 |
NO.7 | zhishijianjie | longtext | NO | NO | 知识简介 |
NO.8 | faburiqi | date | NO | NO | 发布日期 |
NO.9 | clicktime | datetime | NO | NO | 最近点击时间 |
NO.10 | clicknum | int(11) | NO | NO | 点击次数 |
第五章 系统详细设计
5.1 基于Django的鱼类知识网站前台部分设计
本系统是一个专门针对鱼类知识的网站,为了满足用户的操作习惯,我们在页面设计的时候大量的参考了一些成功网站的布局。在首页布局的时候我们采用的是三段式的布局,在头部是网站的导航菜单,方便用户对各类功能进行点击和操作,中间部分是一些最新鱼类知识资讯和鱼类知识信息,基于Django的鱼类知识网站首页部分具体效果如图5-1所示
图5-1 基于Django的鱼类知识网站首页界面
在本基于Django的鱼类知识网站是为了鱼类知识而开发的,所以网站内可能会有大量的用户,如果不对用户进行区分的话用户在发帖和评论等操作的时候不能有效区分用户的信息。在注册的时候输入用户名+密码+姓名+联系电话等信息即可完成注册,其中电话部分我们进行了验证,必须是手机号码格式才可以注册,否则会给出相应的提示,并要求重新输入基于Django的鱼类知识网站用户注册效果如图5-2所示
图5-2 基于Django的鱼类知识网站用户注册界面
5.1.3用户登录
基于Django的鱼类知识网站的用户在注册成功之后账号相关的信息就已经存在了系统中的数据库里了,但是如果不登录还是不能有效的区分用户的发帖和评论信息的,这时候就需要用户登录后才可以进行发帖和评论相关操作了。在登录界面输入注册时的账号+密码,然后点击登录即可完成登录相关操作,基于Django的鱼类知识网站用户登陆界面如图5-3所示
图5-3 基于Django的鱼类知识网站用户登陆界面
5.1.4鱼类知识资讯
为了让用户了解更多的和鱼类知识相关的新闻资讯我们开发了鱼类知识资讯模块,在鱼类知识资讯模块中用户可以看到最新的一些鱼类知识相关的鱼类知识信息,基于Django的鱼类知识网站鱼类知识资讯列表界面效果如图5-4所示
图5-4 基于Django的鱼类知识网站鱼类知识资讯列表界面
当用户在鱼类知识信息中点击了鱼类知识信息的标题之后可以看到鱼类知识相关鱼类知识信息的详细信息,基于Django的鱼类知识网站鱼类知识资讯详情界面如图5-5所示
图5-5 基于Django的鱼类知识网站鱼类知识资讯详细界面
5.2 基于Django的鱼类知识网站后台部分设计
基于Python的基于Django的鱼类知识网站后台主要是给管理员使用的,管理员需要登录以后才可以对系统内的一些功能进行操作,所以系统打开之后的第一个界面就是登录界面,在登录界面中输入不同类型的账号和密码并选择角色即可完成登录,后台登录界面5-11所示
图5-11 基于Django的鱼类知识网站管理员登录页面
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();
}
}
源码获取
大家点赞、收藏、关注 ,让更多需要的同学看到
不同开发语言专栏推荐订阅:
👇下方有我的微信名片👇