源码获取
私信联系我即可~
大家点赞、收藏、关注、评论啦
精彩专栏推荐订阅:在下方专栏👇🏻
👇🏻 精彩专栏 推荐订阅👇🏻
Java精品项目案例【2000套】Java精品项目案例【2000套】
https://blog.csdn.net/weixin_bysj1987/category_13187075.html
Python精品项目案例【500套】
uniapp/微信小程序/安卓app【1800套】
✅文末获取源码✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️
功能性需求
3.1.1 学生用户功能
大学生提问箱系统主要面向学生用户和管理员这两个角色来设计功能。学生用户在使用系统之前需要进行注册、登录,登录时用账号、密码、验证码来进行身份认证。用户忘记密码时可以使用找回密码的功能来重新设置登录信息。登录成功之后,学生用户可以进入到系统首页,输入关键词进行搜索或者查看首页轮播图以及页面展示内容。个人账户模块里,学生用户可以进入到个人中心,对头像进行上传,对个人资料进行提交,取消修改以及退出登录等操作,还可以在修改密码页面完成密码的更改。
学生用户用实名提问和匿名提问两种方式参与系统的互动。实名提问模块包含搜索、排序、详情查看、点赞、收藏、发表评论、发表内容、回答问题、查看回答、提交等操作,匿名提问模块也具备相同的功能,可以满足学生在不同的场景下提出问题的需求。学生提问模块可以实现查询、重置、添加、删除、详情查看、提交、取消等操作,学生可以对自身发布的提问进行基本的管理。回答记录模块可以进行查询、重置以及查看详情,有利于学生了解自己参与回答过的全部内容。学生用户用例图如图3-1所示。
管理员功能
管理员登录系统之后可以进入到后台首页,对大学生提问箱系统中的用户数据、提问数据、分类数据、互动数据等进行统一的管理。系统用户管理模块主要对系统用户信息进行查看、修改等操作,方便管理员了解系统用户的使用情况。实名提问管理模块主要用来管理学生用实名发布的问题内容。提问分类管理模块支持查询、重置、删除、添加、提交、取消等操作,管理员可以对系统中已有的问答内容进行修改分类管理,以方便问题的查找与检索。
学生提问管理模块属于管理员端的主要功能,可以对学生的提问进行查询、重置、批量审核、删除、查看详情、审核、公开、私密、确定、取消、实名发布、匿名发布等操作。管理员可以对学生的提问进行审核,根据问题内容来决定是否公开展示或者私密处理,也可以根据实际情况选择实名发布或者匿名发布。匿名提问管理模块具备查询、重置、删除、查看评论、查看评论功能,可以有效地对匿名提问和评论内容进行监管。回答记录管理模块可以实现查询、重置、删除、查看详情的功能,问题点赞管理模块可以实现查询、重置、删除、查看详情的功能,可以满足后台对于问答互动数据的维护需求。管理员用例图如图3-2所示。
业务流程分析
用户注册登录流程
学生用户进入系统之后,如果已经存在账号,则可以在登录页面输入账号、密码以及验证码完成身份验证。系统验证成功之后,用户就会进入到首页;如果账号信息输入有误或者验证码填写不正确,系统就会提示用户重新输入。未注册用户可以进入注册页面,填写基本的账号信息后提交注册。注册成功之后,用户就会返回到登录页面进行登录。如果用户忘记了密码,可以通过找回密码的功能来重新设置密码,然后用新的密码登录系统。用户注册登录流程如图3-3所示。
学生提问流程
学生用户在实名提问或者匿名提问页面浏览问题的时候,可以利用关键词搜索找到相关的问题,然后点击进入详情页面。进入详情页之后,用户可以看到问题的内容以及已经给出的回答,还可以对问题进行点赞、收藏或者发表评论。用户如果想参与解答,在回答区输入回答内容并提交。提交成功之后,回答内容会出现在对应的题目下方,用户也可以在回答记录页面查看自己的回答历史。学生提问流程如图3-4所示。
问题互动流程
学生用户在实名提问或者匿名提问页面浏览问题的时候,可以利用关键词搜索找到相关的问题,然后点击进入详情页面。进入详情页之后,用户可以看到问题的内容以及已经给出的回答,还可以对问题进行点赞、收藏或者发表评论。用户如果想参与解答,在回答区输入回答内容并提交。提交成功之后,回答内容会出现在对应的题目下方,用户也可以在回答记录页面查看自己的回答历史。问题互动流程如图3-5所示。
数据库
DROP TABLE IF EXISTS `student_user`; CREATE TABLE `student_user`(student_user_id int(11) NOT NULL AUTO_INCREMENT COMMENT '学生用户ID', `student_user_id_number` varchar(64) NOT NULL UNIQUE comment '学生学号', `student_name` varchar(64) comment '学生姓名', `student_phone` varchar(64) comment '学生电话', `student_points` double(8,2) DEFAULT 0 comment '学生积分', `examine_state` varchar(16) DEFAULT '已通过' NOT NULL comment '审核状态', `user_id` int(11) DEFAULT '0' NOT NULL comment '用户ID', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `create_by` int(11) DEFAULT '1' NOT NULL comment '创建用户ID', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', DROP TABLE IF EXISTS `student_questions`; CREATE TABLE `student_questions`(student_questions_id int(11) NOT NULL AUTO_INCREMENT COMMENT '学生提问ID', `student_user` int(11) DEFAULT 0 comment '学生用户', `student_user_id_number` varchar(64) comment '学生学号', `student_name` varchar(64) comment '学生姓名', `anonymous_or_not` varchar(64) comment '是否匿名', `problem_title` varchar(64) NOT NULL UNIQUE comment '问题标题', `question_category` varchar(64) comment '提问分类', `number_of_questions` varchar(64) comment '提问次数', `question_date` date comment '提问日期', `question_picture` varchar(255) comment '提问图片', `problem_description` text comment '问题描述', `publish_status` varchar(64) comment '发布状态', `examine_state` varchar(16) DEFAULT '待审核' NOT NULL comment '审核状态', `examine_reply` varchar(255) DEFAULT '' comment '审核回复', `real_name_question_limit_times` int(8) DEFAULT 1 NOT NULL comment '实名发布限制次数', `anonymous_question_limit_times` int(8) DEFAULT 1 NOT NULL comment '匿名发布限制次数', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `create_by` int(11) DEFAULT '1' NOT NULL comment '创建用户ID', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', DROP TABLE IF EXISTS `real_name_question`; CREATE TABLE `real_name_question`(real_name_question_id int(11) NOT NULL AUTO_INCREMENT COMMENT '实名提问ID', `student_user` int(11) DEFAULT 0 comment '学生用户', `student_name` varchar(64) comment '学生姓名', `problem_title` varchar(64) NOT NULL UNIQUE comment '问题标题', `question_category` varchar(64) comment '提问分类', `question_date` date comment '提问日期', `number_of_likes` double(8,2) DEFAULT 0 comment '点赞数量', `question_picture` varchar(255) comment '提问图片', `problem_description` text comment '问题描述', `collect_len` int(11) DEFAULT 0 NOT NULL comment '收藏数', `comment_len` int(11) DEFAULT 0 NOT NULL comment '评论数', `answer_record_limit_times` int(8) DEFAULT 1 NOT NULL comment '回答问题限制次数', `problem_praise_limit_times` int(8) DEFAULT 1 NOT NULL comment '点赞问题限制次数', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `create_by` int(11) DEFAULT '1' NOT NULL comment '创建用户ID', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', DROP TABLE IF EXISTS `anonymous_question`; CREATE TABLE `anonymous_question`(anonymous_question_id int(11) NOT NULL AUTO_INCREMENT COMMENT '匿名提问ID', `student_user` int(11) DEFAULT 0 comment '学生用户', `problem_title` varchar(64) comment '问题标题', `question_category` varchar(64) comment '提问分类', `question_date` date comment '提问日期', `number_of_likes` double(8,2) DEFAULT 0 comment '点赞数量', `question_picture` varchar(255) comment '提问图片', `problem_description` text comment '问题描述', `collect_len` int(11) DEFAULT 0 NOT NULL comment '收藏数', `comment_len` int(11) DEFAULT 0 NOT NULL comment '评论数', `answer_record_limit_times` int(8) DEFAULT 1 NOT NULL comment '回答问题限制次数', `problem_praise_limit_times` int(8) DEFAULT 1 NOT NULL comment '点赞问题限制次数', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `create_by` int(11) DEFAULT '1' NOT NULL comment '创建用户ID', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',代码
@PostMapping("/add") @Transactional public Map<String, Object> add(HttpServletRequest request) throws IOException { service.insert(service.readBody(request.getReader())); return success(1); } @Transactional public Map<String, Object> addMap(Map<String,Object> map){ service.insert(map); return success(1); } @Transactional public Map<String, Object> addEntity(E entity){ service.insert(entity); return success(1); } @PostMapping("/set") @Transactional public Map<String, Object> set(HttpServletRequest request) throws IOException { service.update(service.readQuery(request), service.readConfig(request), service.readBody(request.getReader())); return success(1); } @Transactional public Map<String, Object> setEntity(Map<String,String> queryMap,Map<String,String> configMap,E entity) throws IOException { service.updateEntity(queryMap,configMap,entity); return success(1); } @RequestMapping(value = "/del") @Transactional public Map<String, Object> del(HttpServletRequest request) { service.delete(service.readQuery(request), service.readConfig(request)); return success(1); } @RequestMapping("/get_obj") public Map<String, Object> obj(HttpServletRequest request) { Map<String, String> config = service.readConfig(request); if (request.getParameter("like") == null || request.getParameter("like").trim().isEmpty()) { config.put("like", "0"); } List resultList = service.selectBaseList(service.select(service.readQuery(request), config)); if (resultList.size() > 0) { JSONObject jsonObject = new JSONObject(); jsonObject.put("obj",resultList.get(0)); return success(jsonObject); } else { return success(null); } } public Map<String, Object> getObjByMap(Map<String,String> queryMap) { List resultList = service.selectBaseList(service.select(queryMap, new HashMap<>())); if (resultList.size() > 0) { JSONObject jsonObject = new JSONObject(); jsonObject.put("obj",resultList.get(0)); return success(jsonObject); } else { return success(null); } } @RequestMapping("/get_list") public Map<String, Object> getList(HttpServletRequest request) { Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request)); return success(map); } public Map<String, Object> getListByMap(Map<String,String> queryMap) { Map<String, Object> map = service.selectToPage(queryMap, new HashMap<>()); return success(map); } @RequestMapping("/list_group") public Map<String, Object> listGroup(HttpServletRequest request) { Map<String,Object> map = service.selectToList(service.readQuery(request), service.readConfig(request)); Map<String,Object> result = new HashMap<>(); result.put("result",map); return result; } @RequestMapping("/bar_group") public Map<String, Object> barGroup(HttpServletRequest request) { Map<String, Object> map = service.selectBarGroup(service.readQuery(request), service.readConfig(request)); return success(map); }学生用户功能实现
首页功能实现
首页功能由SlidesController继承BaseController中的getList方法实现,用户进入首页后,前端向后端发送轮播图及列表查询请求,后端通过readQuery读取关键词条件,通过readConfig获取分页配置,再调用selectToPage返回页面展示数据。首页界面如图5-1所示。
图5-1 首页界面
核心代码实现如下:
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
注册功能实现
注册功能由UserController类中的signUp方法实现。用户提交注册信息后,方法先读取用户名并构造查询条件,通过selectBaseList判断账号是否已存在,若存在则返回提示,若不存在则调用insert方法保存用户数据。注册界面如图5-2所示。
图5-2 注册界面
核心代码实现如下:
@PostMapping("register")
public Map<String, Object> signUp(@RequestBody User user) {
Map<String, String> query = new HashMap<>();
query.put("username",user.getUsername());
List list = service.selectBaseList(service.select(query, new HashMap<>()));
if (list.size()>0){
return error(30000, "用户已存在");
登录功能实现
登录功能由UserController类中的login方法实现。前端提交账号和密码后,方法读取用户名、邮箱、手机号和密码字段,对密码进行解密处理,再依据账号类型查询用户记录,完成身份校验后返回登录结果。登录界面如图5-3所示。
图5-3 登录界面
核心代码实现如下:
@PostMapping("login")
public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
String username = data.get("username");
String email = data.get("email");
String phone = data.get("phone");
String password = data.get("password");
password = RsaUtils.decryptByPrivateKey(password);
我的账户功能实现
我的账户功能由UserController类中的state方法和quit方法实现。state方法通过请求头中的x-auth-token获取当前登录用户编号,并查询用户信息返回前端;quit方法删除Redis中的token记录,完成账户退出操作。我的账户界面如图5-4所示。
图5-4 我的账户界面
核心代码实现如下:
@GetMapping("state")
public Map<String, Object> state(HttpServletRequest request) {
JSONObject ret = new JSONObject();
String token = request.getHeader("x-auth-token");
Integer userId = tokenGetUserId(token);
log.info("[返回userId] {}",userId);
个人首页功能实现
个人首页功能由StudentUserController类中的set方法和BaseController类中的upload方法实现。用户上传头像时调用upload保存文件,修改资料时set方法读取请求体参数,封装学生用户对象后完成资料更新。个人首页界面如图5-5所示。
图5-5 个人首页界面
核心代码实现如下:
@PostMapping("/upload")
public Map<String, Object> upload(@RequestParam("file") MultipartFile file) {
log.info("进入方法");
if (file.isEmpty()) {
return error(30000, "没有选择文件");
}
修改密码功能实现
修改密码功能由UserController类中的change_password方法实现。系统根据请求头token取得当前用户编号,读取旧密码后构造查询条件,若原密码匹配成功,则通过update方法写入新密码并返回修改结果。修改密码界面如图5-6所示。
图5-6 修改密码界面
核心代码实现如下:
@PostMapping("change_password")
public Map<String, Object> change_password(@RequestBody Map<String, String> data, HttpServletRequest request){
String token = request.getHeader("x-auth-token");
Integer userId = tokenGetUserId(token);
Map<String, String> query = new HashMap<>();
String o_password = data.get("o_password");
实名提问功能实现
实名提问功能由RealNameQuestionController类中的add方法实现。学生提交实名问题后,方法读取请求体数据,设置学生用户、学生姓名和问题标题等字段,并对问题标题进行重复校验,最后调用addEntity保存记录。实名提问界面如图5-7所示。
图5-7 实名提问界面
核心代码实现如下:
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
Map<String,Object> paramMap = service.readBody(request.getReader());
RealNameQuestion real_name_question = new RealNameQuestion();
real_name_question.setStudent_user(paramMap.get("student_user")==null?null:Integer.valueOf(String.valueOf(paramMap.get("student_user"))));
匿名提问功能实现
匿名提问功能由AnonymousQuestionController类中的add方法实现。用户提交匿名问题后,方法读取问题标题、问题分类、提问日期和问题描述等字段,封装为匿名提问对象,并通过addEntity写入数据库。匿名提问界面如图5-8所示。
图5-8 匿名提问界面
源码获取
私信联系我即可~
大家点赞、收藏、关注、评论啦
精彩专栏推荐订阅:在下方专栏👇🏻