基于Java+MySQL实现(Web)高校资源综合发布系统【100010343】
一、需求分析
设计背景和意义
随着互联网的发展,各类网络社区层出不穷。但自从人人网倒塌后,再没有一个网络平台专为高校学生量身打造。但这个需求还在,只是被分流到了微博、微信、贴吧、QQ 空间、知乎、豆瓣等地方。但这些社交平台要么太封闭,无法通过弱关系的连接发出共同的声音,要么太开放,没有舆论的缓冲带往往让问题集中暴露[1]。在功能方面,这些社交平台也不能很好满足学生用户的基本需求,例如发布寻物启事和二手交易信息。这些功能对于学生群体是如此的重要,以至于可以在每一个高校你都能发现发挥类似功能的 QQ 群和微信群。
大学校园作为半开放半封闭的环境,其本身的特殊性使得要建立一个符合当下大学生价值观的现代化资源分享社区,需要紧密结合大学生的社交活动以及其对于网络社区的需求。因此,开发出一个网络平台或社区用于高校学生之间的资讯交流和资源分享显得分外重要。本系统的设计将以“资源分享”作为开端,以“校园社交” 为目的,建立一个面向资讯发布及资源分享的网络社区,为高校学生提供一个便捷实用的资讯及资源分享交流平台。随着平台的不断发展,还可能成为外界作为了解该校人文环境的一个窗口,不可谓一举多得。
国内外研究现状
社会上大量存在的论坛,基本上都是基于 WEB 的论坛[2]。在网络上以校园论坛或 BBS 作为关键词进行搜索,可以很容易在结果中找到北大未名 BBS(北京大学校园论坛)、清水河畔(电子科技大学官方论坛)、饮水思源(上海交通大学 BBS)等校园论坛或校园 BBS。以其中的例子,北大未名 BBS 进行分析,其涵盖了 BBS 系统、校园热点、版面分区讨论、失物招领、校长信箱等功能。用户与系统的交互主要为发帖回帖功能。整体上,北大未名 BBS 功能完善,版面划分丰富,为高校社区的建立提供了一个很好的参考模板。
将目光进一步扩大,放眼国内外,可以发现互联网上存在着如 GitHub、Stack Overflow、掘金等这样的技术型社区,Quora、知乎这类问答型社区,豆瓣、哔哩哔哩这类休闲型社区,也有 edX、慕课网、中国大学 MOOC 这样的教学型社区,更有 Facebook、微信朋友圈这类专注社交的网络社区等。从社交平台和网络社区的演变可以看出用户对于网络社交的需求不再是发帖回帖这类简单功能,更多的是追求良好的交互体验以及丰富实用的功能要素。
设计内容
系统的设计将以“资源分享”作为开端,以“校园社交”为目的,建立一个面向资讯发布及资源分享的网络社区,为高校学生提供一个便捷实用的资讯及资源分享交流平台,其需要满足的主要功能如下:
实现登录、注册、修改个人信息等功能。
用户登录后能够发布、编辑和查看自己的资源。
用户登录后能够对他人发布的资源进行点赞和评价。
对部分资源实现全文检索功能。
实现 Web 端即时聊天功能。
实现系统管理后台,对系统各项资源信息进行管理。
系统功能结构
依据上文所述需求分析,系统功能模块设计如图 1.1 所示。
图 1.1 系统功能模块图
可行性分析
实用可行性
系统定位为高校资源综合发布分享平台,其不但实现了其他网络平台所提供的
基本功能,还切实围绕高校学生的需求进行构建,实现了资讯分享和资源共享功能,提供了诸如二手交易、失物寻物启事发布等实用功能,弥补了其他平台对于学生群体所缺漏的功能。将该系统作为校园社交的一座桥梁,能更好的实现高校学生之间的信息交流和资源分享。
技术可行性
为方便日后的扩展,本系统的设计基于 B/S(浏览器/服务器)架构[3],以前后端分离的形式进行开发,这种交互模型结构清晰,关注点分离[4]。
前端方面,为了提高开发效率和代码复用率[5],利用了基于 MVVM 模式的轻量级响应式框架 Vue.js 开发[6],有效简化了 Web 前端开发流程,提高了系统的灵活性和可扩展性[7]。系统 UI 借助了 iView 和 Semantic-ui-vue,实现了较为精美的操作界面。
后端方向,本系统将使用 Java Web 体系框架 Spring Boot 和 MyBatis 作为应用后台的核心框架。Spring Boot 是由 Pivotal 团队开发的全新的开源开发框架,从诞生初期它就着有明确的目的,简化应用 Spring 开发项目[8]。最突出的特点是配置方式,大大简化了 Spring 应用各个方面的配置。另外 Spring Boot 能够集成大量的框架,解决了之前很重要的项目之间包的版本依赖和稳定性问题,大大简化了原 Spring 项目开发配置,对于 MySQL、Elasticsearch、Redis 等数据源也提供了统一的访问接口,改变了 web 应用的开发模式[9]。本系统后台借助 Spring Boot 实现了 MVC 模式的系统设计,提高了系统的伸缩性和扩展性[10]。MyBatis 作为系统持久层框架[11],它集成了 SQL 查询、存储过程调用和高级映射,对 JDBC 代码进行了封装,通过简单的 XML 配置和注解即可对数据库进行灵活的操作,提高了数据操作的便利性[12]。
二、概要设计
开发环境
本系统开发和测试借助以下环境:
JDK:1.8
MySQL:8.0.15
Elasticsearch:6.5.1
开发工具:IntelliJ IDEA
测试工具:Postman、Apache Jmeter
系统总体要求
系统功能需求
系统功能需求主要分为以下 7 条:
权限管理:用于分配用户角色,配置角色权限,对不同角色的用户进行系统访问时加以授权和权限验证。
资源管理:可以对用户发布的各项资源,文章、动态、文件、二手交易、失物寻物等信息进行集中管理。此外,还可以对系统设计中用到的字典数据进行集中管理,以维护系统设计中字典数据的一致性。
系统管理:系统管理包括系统接口文档管理和 SQL 监控。
账户管理:用于用户进行登录、注册、个人信息查看和修改功能。
资源业务:提供文章、动态、文件、二手交易、失物寻物等模块的添加、查看、更新服务。
全文搜索:对于文章,提供全文搜索服务,用户可以借助此模块实现对文章的全文搜索,相较简单的模糊搜索,全文搜索能获取更精确和更有用的搜索结果。
即时通讯:实现 Web 端即时聊天,实现用户之间的消息交流。
以系统管理员为例,整理出的用例图如图 2.1 所示。
图 2.1 后台管理系统用例图以普通用户为例,整理出的用例图如图 2.2 所示。
图 2.2 普通用户用例图
系统性能需求
系统虽为单机应用,但应该满足全校学生和资源的数据管理,即 40000 人的所产生的数据。系统在稳定和正确运行的情况下,用户在访问网站时,为不影响用户体验,应在 5s 以内做出响应。文件上传下载,应做到平均 10M 文件花费 1 分钟。
系统设计目标
本系统为面向高校学生之间信息交流和资源分享平台,整体目标以学生需求为蓝本进行设计。为方便后期对本系统的扩展和维护,应做到以下设计目标:
扩展和开放:为便于后期的需求变更和功能改进,系统 API 的设计应考虑到良好的可扩展性和维护性。此外,为方便后续为本系统开发其他平台,如手机端的应用,后台的接口应予以开放。
可配置和易管理:为使本系统适应不同的使用环境,系统各项关键参数如数据库面等应易于配置。此外,还需提供完善的后台管理界面,方便管理员对系统各项数据进行管理。
稳定和易用:系统应提供交互友好的界面,方便用户快速上手。此外,系统需要保证稳定性,满足长时间运行。
系统体系结构设计
本系统在架构上共分为五层:
展示层:本层为普通用户提供前台访问界面,普通用户通过本层与系统进行交互。为管理员提供了后台管理界面,用于管理系统中的数据和配置等。该层用到的框架为 Vue.js。使用 Vue.js 可以避免 DOM 操作,开发者只需要将重心放在数据上, 这一特性使得展示层的开发变得相对容易。
控制层:本层为展示层提供 API 接口,将来自展示层的不同请求分流到对应的业务层方法中,同时将业务层响应结果发送给展示层。其提供了切面处理、错误拦截、序列化、数据校验、统一交互和访问限流等功能。该层用到的核心框架为 Spring Boot。
业务层:业务层根据用户请求完成一系列的逻辑运算、数据库操作等内容。本层作为系统实现的核心层,其代码要求最高,实现时应尽可能地实现高内聚、低耦合。其主要业务有内容管理、用户管理、权限控制、即时通信、搜索服务、定时任务和缓存服务等。除了 Spring Boot 外,该层还用到的框架有 Shiro 和 Netty。Shiro 用以实现认证和授权系统,Netty 配合 WebSocket 实现 Web 端即时聊天功能。
数据层:数据层主要用于操作数据库层,操纵 MySQL 借助了对象关系映射框架 MyBatis,并开启了事务机制和 SQL 检测功能。此外,操作 Elasticsearch 的代码也写在此层。
数据库层:采用 MySQL 作为数据库、Elasticsearch 作为全文搜索引擎。
系统体系结构设计如图 2.3 所示。
图 2.3 系统体系结构图
系统功能模块设计
权限管理模块
权限管理模块类图如图所示 2.4 所示。
图 2.4 权限管理模块类图权限管理模块类图说明如表 2.1 所示。
表 2.1 权限管理模块类图说明
类名 | 说明 |
---|---|
UserRoleService | 处理用户与角色关联的业务类 |
UserRole | 数据库用户角色关联表对应的实体类 |
RolePermissionService | 处理角色与权限关联的业务类 |
RolePermission | 数据库角色权限关联表对应的实体类 |
PermissionService | 处理权限的业务类 |
Permision | 数据库权限表对应的实体类 |
权限管理模块方法说明如表 2.2 所示。
表 2.2 权限管理模块类图说明
方法名 | 说明 |
---|---|
UserRoleService::add | 添加用户角色关联信息 |
UserRoleService::delete | 删除用户角色关联信息 |
RolePermissionService::add | 添加角色权限关联信息 |
RolePermissionService::delete | 删除角色权限关联信息 |
续表 2.2
方法名 | 说明 |
---|---|
PermissionService::add | 添加权限信息 |
PermissionService::update | 更新权限信息 |
PermissionService::get | 获取权限信息 |
PermissionService::delete | 删除权限信息 |
资源管理模块
资源管理模块(以动态管理模块为例)类图如图 2.5 所示。
图 2.5 动态管理模块类图
资源管理模块(以动态管理模块为例)类图说明如表 2.3 所示。表 2.3 动态管理模块类图说明
类名 | 说明 |
---|---|
MomentService | 处理与动态相关的业务类 |
MomentQueryForm | 接收前端动态查询参数 |
Page | 处理分页 |
Moment | 数据库动态表对应的实体类 |
资源管理模块(以动态管理模块为例)方法说明如表 2.4 所示。
表 2.4 动态管理模块方法说明
方法名 | 说明 |
---|---|
MomentService::getMoment | 通过 ID 获取指定动态 |
MomentService::pageMoment | 分页查询获取动态 |
MomentService::update | 更新指定动态 |
账户业务模块
账户业务模块类图如图 2.6 所示。
图 2.6 账户业务模块类图账户业务模块类图说明如表 2.5 所示。
表 2.5 账户业务模块类图说明
类名 | 说明 |
---|---|
UserService | 处理账户相关的业务类 |
UserService | 处理账户相关的业务类 |
账户业务模块方法说明如表 2.6 所示。
表 2.6 账户业务模块方法说明
方法名 | 说明 |
---|---|
UserService::login | 处理用户登录 |
UserService::register | 处理用户注册 |
UserService::update | 更新用户信息 |
续表 2.6
方法名 | 说明 |
---|---|
UserService::getUser | 获取用户信息 |
资源业务模块
资源业务模块(以文件业务模块为例)类图如图 2.7 所示。
图 2.7 文件业务模块类图
资源业务模块(以文件业务模块为例)类图说明如表 2.7 所示。
表 2.7 文件业务模块类图说明
类名 | 说明 |
---|---|
FileService | 处理文件相关的业务类 |
File | 数据库文件表对应的实体类 |
ResourceService | 处理资源相关的业务类 |
Resource | 数据库资源表对应的实体类 |
资源业务模块(以文件业务模块为例)方法说明如表 2.8 所示。
表 2.8 文件业务模块方法说明
方法名 | 说明 |
---|---|
FileService::getFile | 获取指定文件信息 |
FileService::addFile | 添加新文件信息 |
FileService::pageFile | 分页获取文件信息 |
FileService::update | 更新文件信息 |
ResourceService::addResource | 添加新资源信息 |
ResourceService::getResource | 获取指定资源信息 |
ResourceService::addCommentCount | 更新资源对应评论数 |
ResourceService::addZanCount | 更新资源对应点赞数 |
全文搜索模块
全文搜索模块类图如图 2.8 所示。
图 2.8 全文搜索模块类图
全文搜索模块类图说明如表 2.9 所示。
表 2.9 全文搜索模块类图说明
类名 | 说明 |
---|---|
ArticleService | 处理文章相关的业务类 |
ElasticsearchTemplate | 用于执行 Elasticsearch 相关方法的类 |
Tag | 热门标签实体类 |
Article | 数据库文章表对应的实体类 |
全文搜索模块方法说明如表 2.10 所示。
表 2.10 全文搜索模块方法说明
方法名 | 说明 |
---|---|
ArticleService::listHotTag | 获取热门标签信息 |
ArticleService::search | 搜索文章信息 |
ElasticsearchTemplate::query | Elasticsearch 全文搜索方法 |
即时通讯模块
即时通讯模块类图如图 2.9 所示。
图 2.9 即时通讯模块类图
即时通讯模块类图说明如表 2.11 所示。
表 2.11 即时通讯模块类图说明
类名 | 说明 |
---|---|
WebSocketServer | WebSocket 服务器类 |
ChatHandler | 自定义消息处理器类 |
HeartbeatHandler | 自定义心跳机制处理器类 |
ChildChannelInitializer | Netty 子通道初始化类 |
MessageService | 消息相关的业务处理类 |
Message | 数据库消息表对应的实体类 |
即时通讯模块方法说明如表 2.12 所示。
表 2.12 即时通讯模块方法说明
方法名 | 说明 |
---|---|
WebSocketServer::start | WebSocket 服务器启动方法 |
WebSocketServer::destroy | WebSocket 服务器销毁方法 |
ChatHandler::channelRead0 | 接收客户端消息方法 |
ChatHandler::handlerAdded | 客户端连接回调方法 |
ChatHandler::handlerRemoved | 客户端断开回调方法 |
ChatHandler::exceptionCaught | 异常发生时回调方法 |
ChatHandler::sendTo | 发送消息方法 |
HeartbeatHandler::addZanCount | 更新资源对应点赞数 |
ChildChannelInitializer::initChannel | 初始化通道 |
MessageService::addMessage | 添加新消息 |
MessageService::getUnsignedMessageList | 获取未签收消息 |
MessageService::signMessage | 对消息进行签收 |
数据库设计
本系统的数据库核心设计中包括用户、角色、权限、用户角色、角色权限、资源、动态、文章、文件、失物寻物、二手交易、评论、点赞、好友和消息实体。系统数据库的 E-R 模型如图 2.10 所示。
图 2.10 系统 E-R 模型图各张表的详细设计如下:
用户表(user)的结构如表 2.13 所示。
表 2.13 用户表
字段 | 类型 | 字段说明 |
---|---|---|
id | int(11) | 主键 ID |
username | varchar(50) | 用户名 |
password | varchar(80) | 密码 |
nickname | varchar(50) | 昵称 |
avatar | varchar(255) | 头像 URL |
sex | varchar(5) | 性别 |
birthday | datetime | 生日 |
sign | varchar(255) | 签名 |
intro | varchar(1000) | 简介 |
grade | varchar(10) | 年级 |
college | varchar(50) | 学院 |
major | varchar(50) | 专业 |
phone | varchar(20) | 手机 |
varchar(50) | 邮箱 | |
state | int(1) | 状态 |
remark | varchar(255) | 备注 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
deleted | tinyint(1) | 软删除 |
表 2.14 角色表
字段 | 类型 | 字段说明 |
---|---|---|
id | int(11) | 主键 ID |
name | varchar(20) | 角色名 |
description | varchar(255) | 角色描述 |
state | int(1) | 状态 |
remark | varchar(255) | 备注 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
deleted | tinyint(1) | 软删除 |
表 2.15 权限表
字段 | 类型 | 字段说明 |
---|---|---|
id | int(11) | 主键 ID |
parent_id | int(11) | 父级 ID |
name | varchar(255) | 权限名 |
description | varchar(255) | 权限描述 |
url | varchar(255) | 请求地址 |
type | int(1) | 类型 |
seq | int(11) | 顺序 |
state | int(1) | 状态 |
remark | varchar(255) | 备注 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
deleted | tinyint(1) | 软删除 |
用户角色表(user_role)的结构如表 2.16 所示。
表 2.16 用户角色表
字段 | 类型 | 字段说明 |
---|---|---|
id | int(11) | 主键 ID |
user_id | int(11) | 用户 ID |
role_id | int(11) | 角色 ID |
state | int(1) | 状态 |
remark | varchar(255) | 备注 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
deleted | tinyint(1) | 软删除 |
角色权限表(role_permission)的结构如表 2.17 所示。
表 2.17 角色权限表
字段 | 类型 | 字段说明 |
---|---|---|
id | int(11) | 主键 ID |
role_id | int(11) | 角色 ID |
permission_id | int(11) | 权限 ID |
state | int(1) | 状态 |
remark | varchar(255) | 备注 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
deleted | tinyint(1) | 软删除 |
资源表(resource)的结构如表 2.18 所示。
表 2.18 资源表
字段 | 类型 | 字段说明 |
---|---|---|
id | int(11) | 主键 ID |
user_id | int(11) | 发布用户 ID |
resource_dic_type | varchar(20) | 资源所属字典类型 |
resource_dic_item | varchar(20) | 资源所属字典项目 |
zan_count | int(11) | 点赞数 |
pv_count | int(11) | 浏览量 |
comment_count | int(11) | 评论数 |
state | int(1) | 状态 |
remark | varchar(255) | 备注 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
deleted | tinyint(1) | 软删除 |
动态表(moment)的结构如表 2.19 所示。
表 2.19 动态表
字段 | 类型 | 字段说明 |
---|---|---|
id | int(11) | 主键 ID |
user_id | int(11) | 发布用户 ID |
resource_id | int(11) | 资源 ID |
moment_category | varchar(20) | 动态类别 |
content | varchar(1000) | 内容 |
images | json | 图片 |
state | int(1) | 状态 |
remark | varchar(255) | 备注 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
deleted | tinyint(1) | 软删除 |
文章表(article)的结构如表 2.20 所示。
表 2.20 文章表
字段 | 类型 | 字段说明 |
---|---|---|
id | int(11) | 主键 ID |
user_id | int(11) | 发布用户 ID |
resource_id | int(11) | 资源 ID |
article_category | varchar(20) | 文章类别 |
title | varchar(255) | 标题 |
brief | varchar(255) | 简介 |
tags | json | 标签 |
cover | varchar(255) | 封面 |
markdown_content | text | 内容(Markdown 格式) |
html_content | text | 内容(HTML 格式) |
state | int(1) | 状态 |
remark | varchar(255) | 备注 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
deleted | tinyint(1) | 软删除 |
文件表(file)的结构如表 2.21 所示。
表 2.21 文件表
字段 | 类型 | 字段说明 |
---|---|---|
id | int(11) | 主键 ID |
user_id | int(11) | 发布用户 ID |
resource_id | int(11) | 资源 ID |
file_category | varchar(20) | 文件类别 |
title | varchar(255) | 标题 |
description | varchar(1000) | 描述 |
name | varchar(255) | 文件名 |
size | varchar(10) | 文件大小 |
url | varchar(255) | 文件链接 |
download_count | int(11) | 下载量 |
state | int(1) | 状态 |
remark | varchar(255) | 备注 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
deleted | tinyint(1) | 软删除 |
失物寻物表(lost_found)的结构如表 2.22 所示。
表 2.22 失物寻物表
字段 | 类型 | 字段说明 |
---|---|---|
id | int(11) | 主键 ID |
user_id | int(11) | 发布用户 ID |
resource_id | int(11) | 资源 ID |
lost_found_category | varchar(20) | 失物寻物类别 |
title | varchar(255) | 标题 |
description | varchar(1000) | 描述 |
item_name | varchar(255) | 物品名 |
time | datetime | 拾取/丢失时间 |
address | varchar(255) | 拾取/丢失地点 |
images | json | 图片 |
state | int(1) | 状态 |
remark | varchar(255) | 备注 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
deleted | tinyint(1) | 软删除 |
二手交易表(second_hand)的结构如表 2.23 所示。
表 2.23 二手交易表
字段 | 类型 | 字段说明 |
---|---|---|
id | int(11) | 主键 ID |
user_id | int(11) | 发布用户 ID |
resource_id | int(11) | 资源 ID |
second_hand_category | varchar(20) | 二手交易类别 |
title | varchar(255) | 标题 |
name | varchar(255) | 物品名 |
price | double(8,2) | 物品价格 |
address | varchar(255) | 交易地址 |
images | json | 图片 |
description | varchar(1000) | 描述 |
state | int(1) | 状态 |
remark | varchar(255) | 备注 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
deleted | tinyint(1) | 软删除 |
评论表(comment)的结构如表 2.24 所示。
表 2.24 评论表
字段 | 类型 | 字段说明 |
---|---|---|
id | int(11) | 主键 ID |
parent_id | int(11) | 父级 ID |
user_id | int(11) | 评论用户 ID |
resource_id | int(11) | 评论资源 ID |
reply_user_id | int(11) | 回复用户 ID |
content | varchar(1000) | 内容 |
state | int(1) | 状态 |
remark | varchar(255) | 备注 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
deleted | tinyint(1) | 软删除 |
点赞表(zan)的结构如表所示 2.25 所示。
表 2.25 点赞表
字段 | 类型 | 字段说明 |
---|---|---|
id | int(11) | 主键 ID |
user_id | int(11) | 点赞用户 ID |
resource_id | int(11) | 点赞资源 ID |
state | int(1) | 状态 |
remark | varchar(255) | 备注 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
deleted | tinyint(1) | 软删除 |
好友表(friend)的结构如表 2.26 所示。
表 2.26 好友表
字段 | 类型 | 字段说明 |
---|---|---|
字段 | 类型 | 字段说明 |
id | int(11) | 主键 ID |
user_id | int(11) | 用户 ID |
friend_user_id | int(11) | 好友 ID |
state | int(1) | 状态 |
remark | varchar(255) | 备注 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
deleted | tinyint(1) | 软删除 |
表 2.27 消息表消息表(message)的结构如表 2.27 所示。
表 2.27 消息表
字段 | 类型 | 字段说明 |
---|---|---|
id | int(11) | 主键 ID |
send_user_id | int(11) | 发送用户 ID |
receive_user_id | int(11) | 接收用户 ID |
type | int(1) | 消息类型 |
content | text | 内容 |
state | int(1) | 状态 |
remark | varchar(255) | 备注 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
deleted | tinyint(1) | 软删除 |
三、详细设计
系统前端分为后台管理界面和前台业务界面两大模块。后台管理界面分为左右两栏,左侧为功能选择区,主要分为权限管理、资源管理和系统管理三大板块,右侧为数据展示和操作区。前台业务界面分为上中下三栏,头部区域包含导航菜单、搜索框、消息提示和头像菜单,中部区域为数据展示和交互操作区,尾部为版权信息区。前台主要实现了账户业务、资源业务、全文搜索和即时通讯等功能。
权限管理模块
因本应用包含后台管理部分,为了隔离不同类型的用户,实现接口的访问控制,权限管理模块应运而生。本系统权限管理模块依靠 Apache Shiro 框架进行实现, Shiro 是 Apache 软件基金会下的一个功能强大、健壮、易用的 Java 开源安全开发框架[13],它提供了认证、授权、加密和会话管理等功能,可以为网络应用提供安全解决方案[14]。设计方面,权限管理采用 RBAC(基于角色的访问控制)模型,用户被授予相应的角色,不与具体的权限相关联[15]。RBAC 模型将用户与权限在逻辑上进行分离,极大的方便了权限管理[16]。
在权限管理模块下的用户管理模块,管理员可以检索用户,并为用户赋予不同的角色,如图 3.1 所示。
图 3.1 用户管理
在权限管理模块下的角色管理模块,管理员可以管理系统中的角色,添加新角色或为已有角色配置权限,如图 3.2 所示。
图 3.2 角色管理
在权限管理下的权限配置模块,管理员可以浏览和配置系统中的权限信息,如图 3.3 所示。
图 3.3 权限配置
除上述功能外,在权限管理模块下还添加了规则映射模块,用以实现 Shiro 过滤器链映射的动态配置。规则映射主要为不同的 URL 设置不同的权限控制规则,如访问该 URL 是否需要登录验证,需要何种角色,何种权限等。如图 3.4 所示。
图 3.4 规则映射权限管理核心代码:
// 添加新权限
public PermissionVO add(PermissionAddForm form) {Integer parentId = form.getParentId(); if (parentId != null && permissionMapper.selectByPrimaryKey(parentId) == null) { throw new SmilcoolException("父级权限不存在");}Permission selected =permissionMapper.selectByName(form.getName()); if (selected != null){ throw new SmilcoolException("权限已存在");}Permission permission = BeanUtil.copyProp(form, Permission.class);permissionMapper.insertSelective(permission); return getById(permission.getId());
}
资源管理模块
资源管理模块主要包括文章管理、动态管理、文件管理、二手交易管理、失物寻物管理以及字典管理。
以文章管理为例,可以进行的操作有分类检索、关键词查询、详情查看以及编辑等,方便管理员管理系统后台产生的数据。如图 3.5 所示。
图 3.5 文章管理
字典管理主要用于管理系统中的枚举字段,例如文章类别,文件类别和二手交易类别等,保证系统枚举字段的一致性。如图 3.6 所示。
图 3.6 字典管理
字典管理模块核心代码:
// 添加字典类型
public DicType addDicType(DicTypeAddForm form) {
// 检查字典类型名或字典类型码是否已存在int count = dicTypeMapper.countByNameOrCode(form.getName(), form.getCode()); if (count != 0) { throw new SmilcoolException("字典类型已存在");}DicType dicType = BeanUtil.copyProp(form, DicType.class); dicTypeMapper.insertSelective(dicType); return getDicType(dicType.getCode());
}
// 添加字典项目
public DicItem addDicItem(DicItemAddForm form) {
// 检查字典类型是否存在DicType dicType =dicTypeMapper.selectByCode(form.getDicTypeCode()); if (dicType == null) { throw new SmilcoolException("字典类型不存在");}
// 检查该字典类型下字典项目名或字典项目码是否已存在int count = dicItemMapper.countByDicTypeCodeAndNameOrCode(form.getDicTypeCode(), form.getName(), form.getCode()); if (count != 0) {throw new SmilcoolException("字典类型下已存在该字典项目");}
// 为指定字典类型添加新项目DicItem dicItem = BeanUtil.copyProp(form, DicItem.class); dicItemMapper.insertSelective(dicItem);return getDicItem(dicItem.getDicTypeCode(), dicItem.getCode());
}
系统管理模块
系统管理主要分为接口文档管理和 SQL 检测管理两部分。
接口文档借助 Swagger 框架生成,可以方便管理员对系统中的各项接口进行管理和测试。如图 3.7 所示。
图 3.7 接口文档
后台 SQL 监控由 Druid 提供,Druid 连接池是阿里巴巴开源的数据库连接池项目,其为监控而生,内置强大的监控功能,监控特性不影响性能[17]。其监控界面如图 3.8 所示。
图 3.8 后台 SQL 监控
账户业务模块
账户业务模块主要包含登录、注册、信息更改三部分。登录验证功能由 Shiro 的认证授权功能实现,登录成功后,后台会将登录信息存放在 Shiro session 中,用于之后操作的权限验证,前台会将账户信息存放在 Vue 框架的全局状态管理 Vuex 中。登录和注册界面如图 3.9 所示。
图 3.9 登录/注册
个人信息包括昵称、生日、邮箱等,用户可以点击“修改个人信息”按钮进行修
改。在该界面,还可以看见用户发布的文章,上传的文件等信息,如图 3.10 所示。
图 3.10 个人主页
账户业务模块核心代码:
// 用户登录
public UserVO login(UserLoginForm form) {
// Shiro 身份认证Subject currentUser = SecurityUtils.getSubject();UsernamePasswordToken token = new UsernamePasswordToken(form.getUsername(), form.getPassword()); currentUser.login(token);return this.getUserVO((Integer) currentUser.getPrincipal());
}
// 用户注册
public UserVO register(UserRegisterForm form) {User selected = userMapper.selectByUsername(form.getUsername()); if (selected != null) {throw new SmilcoolException("用户名已存在");}selected = userMapper.selectByEmail(form.getEmail()); if (selected != null) {throw new SmilcoolException("邮箱已注册");}
// 添加用户记录User user = BeanUtil.copyProp(form, User.class); userMapper.insertSelective(user); userRoleService.addDefault(user.getId());
// 返回用户信息return this.getUserVO(user.getId());
}
// 用户更新public UserVO updateUser(UserUpdateForm form) { Integer currentUserId = currentUserId();userMapper.updateByPrimaryKeyAndForm(currentUserId, form); return getUserVO(currentUserId);
}
资源业务模块
资源业务模块主要实现了各类资源的浏览、分类检索、查询、添加和编辑功能。文章资讯主页实现的功能有文章展示,热门标签和最新评论。其中热门标签功能通过 Elasticsearch 的聚集搜索功能完成,可以展示排名前 20 的文章标签,方便用户了解当前的热门文章。文章资讯主界面如 3.11 所示。
图 3.11 文章资讯
在文章的详情页面可以查看文章的具体信息,包括文章内容、标签、作者信息等,也可在该页面对文章进行评价和点赞。文章的详情界面如图 3.12 所示。
图 3.12 文章详情
在文章的分类浏览页面,可以通过点击不同的类别检索相应类型的文章,也提供了简单的查询功能用于搜索。如图 3.13 所示。
图 3.13 文章分类
文章的编辑页面,使用了开源 Markdown 编辑器 Mavon Editor,除基本的 markdown 语法外,其还支持 LaTeX 公式、流程图和时序图等。添加文章时需要为文章指定类别、标题、内容、标签和简介。文章编辑页面如图 3.14 所示。
图 3.14 文章编辑
校园动态页面布局方式采用时下流行的瀑布流布局进行设计,其可以展示时下最新和热门的校园动态。用户登录后在该界面可以发布图文动态,用于彼此之间的资讯分享。校园动态页面如图 3.15 所示。
图 3.15 校园动态
文件仓库页面提供了文件资料的上传和下载功能,也提供了分类检索和模糊搜索功能,方便用户下载他人分享的资料文件。用户登录后,在该页面可进行资源分享,点击上传文件按钮,填写必要的信息:文件类别、标题、描述,再将文件进行上传后即可将资源分享给全校同学。文件仓库页面如图 3.16 所示。
图 3.16 文件仓库
二手交易页面为高校学生之间的二手物品交易提供了一个便捷的平台,其主要功能包括发布闲置,分类浏览和模糊搜索。用户登录后可在此页面发布二手交易信息,亦可对他人发布的二手交易信息进行评论和点赞。二手交易页面如图 3.17 所示。
图 3.17 二手交易
失物寻物页面提供了信息发布和检索功能,用以帮助用户发布和检索失物招领和寻物启事信息,弥补了其他平台在这方面的缺漏。为失物寻物信息提供专门的栏目有助于该类信息展示的及时性,准确性和有效性,满足校园用户的使用需求。失物寻物页面如图 3.18 所示。
图 3.18 失物寻物
资源业务模块主要代码:
// 添加资源
public Integer addResource(Integer userId, String resourceDicType,String resourceDicItem) {Resource resource = new Resource(userId, resourceDicType,resourceDicItem);resourceMapper.insertSelective(resource); return resource.getId();
}
// 更新评论数
public void addCommentCount(Integer id)
{ resourceMapper.updateCommentCountByPrimayKey(id, 1);
}
// 更新点赞数
public void addZanCount(Integer id)
{resourceMapper.updateZanCountByPrimaryKey(id, 1);
}
全文搜索模块
该模块后台主要借助 Elasticsearch 作为搜索引擎,Elasticsearch 是一个基于 Lucene 的搜索引擎,它提供了一个可扩展、分布式、支持多租户的全文搜索引擎,可以用于搜索各种文档,具有接近实时的搜索[18]。借助 Elasticsearch 的功能,在该模块实现了文章的全文搜索,其页面如图 3.19 所示。
图 3.19 全文搜索
全文搜索模块核心代码:
// 对文章进行全文搜索
public Page<ArticleDocument> search(String q, Integer page, Integer size) {
// 创建一个 SearchQuery 对象SearchQuery searchQuery = new NativeSearchQueryBuilder()
// 设置查询条件,此处可以使用 QueryBuilders 创建多种查询.withQuery(QueryBuilders.queryStringQuery(q))
// 高亮配置(未匹配时仍然显示 100 字符).withHighlightBuilder(new HighlightBuilder().noMatchSize(100))
// 高亮字段.withHighlightFields(new HighlightBuilder.Field("title"), new HighlightBuilder.Field("brief"))
// 分页信息.withPageable(PageRequest.of(page, size))
// 创建 SearchQuery 对象.build();return elasticsearchTemplate.queryForPage(searchQuery, ArticleDocument.class, new HighlightResultMapper()); }
即时通讯模块
即时通讯模块后台主要借助 Netty 框架和 WebSocket 协议进行实现。Netty 是一款用于创建高性能网络应用程序的高级框架[19],而 WebSocket 是为 Web 上双向数据传输问题所提供的一个重新设计的协议[20],将两者结合即可实现客户端与服务器之间即时高效的通信。该模块实现了 Web 端用户之间的聊天功能,其界面如图
所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sEa8x2fe-1676428505341)(null)]
图 3.20 即时通讯
即时通讯模块核心代码:
// 接收客户端发送消息
protected void channelRead0(ChannelHandlerContext ctx,TextWebSocketFrame msgFrame) throws Exception
{Channel channel = ctx.channel();
// 获取客户端传输过来的消息Message receiveMessage = JSONUtil.toBean(msgFrame.text(), Message.class);log.debug("[{}] 发送消息:{}", channel.remoteAddress(), receiveMessage);
// 根据消息类型,进行不同的业务switch (MessageType.of(receiveMessage.getType())) { case CONNECT: {
// 建立连接时,将 channel 与 userId 进行进行关联Integer userId = receiveMessage.getSendUserId(); userIdChannelMap.put(userId, channel); log.debug("CONNECT 消息: userId = {}, channel = {}",userId, channel.id().asShortText());
// 获取未签收信息并发送messageService.getUnsignedMessageList(userId).forEach(this::sendTo); break; } case CHAT: {
// 把聊天记录保存到数据库log.debug("CHAT 消息: sendUserId = {}, receiveUserId= {}", receiveMessage.getSendUserId(), receiveMessage.getReceiveUserId());Message sendMessage = messageService.addMessage(receiveMessage);
// 发送消息sendTo(sendMessage); break; } case SIGNED: {
// 针对具体的消息进行签收Integer signedMessageId =Integer.valueOf(receiveMessage.getContent()); log.debug("SIGNED 消息: signedMessageId = {}", signedMessageId);messageService.signMessage(signedMessageId); break;}case KEEP_ALIVE: {
// 心跳:心跳消息,维持连接log.debug("KEEP_ALIVE 消息: channel = {}",channel.id().asShortText()); break; }default:log.debug("未知消息类型");}
}
四、结论
本系统采用 B/S 架构,以前后端分离的形式进行开发。后端采用的框架和技术主要为 Spring Boot、MyBatis、Shiro、Netty 和 Elasticsearch,数据库使用 MySQL,网页端使用 Vue.js 框架进行开发。
本系统基本完成了高校资源发布分享平台所应具有的功能。基础功能方面实现了用户的登录注册、信息修改功能。实现了资讯文章发布、动态发布、文件分享、二手交易、失物寻物启事发布和查看等功能。实现了基于 RBAC 模型的认证和授权管理系统。在后台管理方面实现了权限管理、资源管理和系统管理功能。借助 Netty 框架和 WebSocket 实现了 Web 端即时聊天功能。借助 Elasticsearch 实现了文章热门标签和文章检索服务。
♻️ 资源
大小: 22.4MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87364009
基于Java+MySQL实现(Web)高校资源综合发布系统【100010343】相关推荐
- [附源码]Java计算机毕业设计SSM高校学生综合素质测评系统
项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...
- java计算机毕业设计高校学生综合素质测评系统源码+mysql数据库+系统+lw文档+部署
java计算机毕业设计高校学生综合素质测评系统源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计高校学生综合素质测评系统源码+mysql数据库+系统+lw文档+部署 本源码技术栈: ...
- 计算机毕业设计Java高校学生综合素质测评系统(源码+系统+mysql数据库+Lw文档)
计算机毕业设计Java高校学生综合素质测评系统(源码+系统+mysql数据库+Lw文档) 计算机毕业设计Java高校学生综合素质测评系统(源码+系统+mysql数据库+Lw文档) 本源码技术栈: 项目 ...
- 基于JAVA高校学生综合素质测评系统计算机毕业设计源码+数据库+lw文档+系统+部署
基于JAVA高校学生综合素质测评系统计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA高校学生综合素质测评系统计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目架构:B ...
- 教你手把手基于java实现兼职招聘系统、基于SSM+mysql的Web校园招聘网站
Java实现的兼职招聘系统.基于SSM+mysql的Web校园招聘网站 后期会继续实现springboot版本 需要学习的可以一起交流 项目环境 SSM JSP.JSTL.jQuery.HTML.CS ...
- 带你手把手实现基于Java的兼职招聘系统、基于SSM+mysql的Web校园招聘网站啊啊啊
Java实现的兼职招聘系统.基于SSM+mysql的Web校园招聘网站 项目环境 SSM JSP.JSTL.jQuery.HTML.CSS.JS Mysql bootstrap 开发工具和环境 Ecl ...
- 基于Java毕业设计写手管理平台源码+系统+mysql+lw文档+部署软件
基于Java毕业设计写手管理平台源码+系统+mysql+lw文档+部署软件 基于Java毕业设计写手管理平台源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B/S架构 开发语言: ...
- 基于Java毕业设计学校旧书交易网站源码+系统+mysql+lw文档+部署软件
基于Java毕业设计学校旧书交易网站源码+系统+mysql+lw文档+部署软件 基于Java毕业设计学校旧书交易网站源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B/S架构 开 ...
- java毕业生设计医保局综合办公系统计算机源码+系统+mysql+调试部署+lw
java毕业生设计医保局综合办公系统计算机源码+系统+mysql+调试部署+lw java毕业生设计医保局综合办公系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B/S架构 ...
最新文章
- python统计小说人物_Python数据分析之基情的择天记
- 数据结构与算法:05 Leetcode同步练习(一)
- c#对象集合去重_《C#编程入门》概览
- mybatis date类型映射_MapStruct 映射工具
- 【数据结构与算法】之深入解析“求根节点到叶节点数字之和”的求解思路与算法示例
- Linux系统编程----7(信号集,信号屏蔽,信号捕捉)
- java简单的事务处理_JAVA之JDBC简单事务处理
- App应用之提交到各大市场渠道
- IDC销售系统前台模板知了云模板
- 关于IMDB,-------Internet Movie Database(互联网电影数据库)
- mac下统计代码行数方法
- gcc编译-m32、-mx32有什么区别
- 三万字硬核详解:yolov1、yolov2、yolov3、yolov4、yolov5、yolov7
- 从深度学习到LSTM
- 04-项目立项:项目方案、可行性分析、产品规划、立项评审
- Dev C++ 安装教程(图文)
- 安卓开发,组件的单位设置问题
- ppt密码忘了怎么打开
- 有字库API方法使用一二
- 【智慧农业】如何建造智能温室大棚