云上社群学习系统部分接口设计详解

目录

一、项目简介

二、技术选型

 三、数据库设计

四、接口设计及思考

回复帖子部分

4.1 回复帖子

4.1.1.1 实现逻辑

4.1.1.2创建Service接⼝

4.1.1.3 实现Service接⼝

4.1.1.4 实现Controller

4.1.1.5 测试接口

4.1.1.6 实现前端页面

4.2 点赞帖子

4.2.1.1 参数要求

4.2.1.2 创建Service接⼝

4.2.1.3 实现Service接⼝

4.3 删除帖子

4.3.1.1 参数要求

 4.3.1.2 创建Service接口

4.3.1.3 实现Service接⼝

4.3.1.4 实现Controller


一、项目简介

本系统实现了基于 Spring 的前后端分离版本的社群系统, 后端主要采用了SSM架构,前端采用ajax和后端进行交互,采用MySQL 数据库,实现了用户登录注册、个人信息和帖子的查看、发布帖子、帖子回复、站内信等功能。
应用技术有:SpringBoot、SpringMVC、Mybaits、MySQL、CSS等。

二、技术选型

 三、数据库设计

数据库名: forum_db

公共字段:⽆特殊要求的情况下,每张表必须有⻓整型的⾃增主键,删除状态、创建时间、更新时 间,如下所⽰:

共建五张表 

 SQL脚本


-- ----------------------------
-- 创建数据库,并指定字符集
-- ----------------------------
drop database if exists forum_db;
create database forum_db character set utf8mb4 collate utf8mb4_general_ci;
-- 选择数据库
use forum_db;SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- 创建帖子表 t_article
-- ----------------------------
DROP TABLE IF EXISTS `t_article`;
CREATE TABLE `t_article`  (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '帖子编号,主键,自增',`boardId` bigint(20) NOT NULL COMMENT '关联板块编号,非空',`userId` bigint(20) NOT NULL COMMENT '发帖人,非空,关联用户编号',`title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标题,非空,最大长度100个字符',`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '帖子正文,非空',`visitCount` int(11) NOT NULL DEFAULT 0 COMMENT '访问量,默认0',`replyCount` int(11) NOT NULL DEFAULT 0 COMMENT '回复数据,默认0',`likeCount` int(11) NOT NULL DEFAULT 0 COMMENT '点赞数,默认0',`state` tinyint(4) NOT NULL DEFAULT 0 COMMENT '状态 0正常 1 禁用,默认0',`deleteState` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否删除 0 否 1 是,默认0',`createTime` datetime NOT NULL COMMENT '创建时间,精确到秒,非空',`updateTime` datetime NOT NULL COMMENT '修改时间,精确到秒,非空',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '帖子表' ROW_FORMAT = Dynamic;-- ----------------------------
-- 创建帖子回复表 t_article_reply
-- ----------------------------
DROP TABLE IF EXISTS `t_article_reply`;
CREATE TABLE `t_article_reply`  (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号,主键,自增',`articleId` bigint(20) NOT NULL COMMENT '关联帖子编号,非空',`postUserId` bigint(20) NOT NULL COMMENT '楼主用户,关联用户编号,非空',`replyId` bigint(20) NULL DEFAULT NULL COMMENT '关联回复编号,支持楼中楼',`replyUserId` bigint(20) NULL DEFAULT NULL COMMENT '楼主下的回复用户编号,支持楼中楼',`content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '回贴内容,长度500个字符,非空',`likeCount` int(11) NOT NULL DEFAULT 0 COMMENT '点赞数,默认0',`state` tinyint(4) NOT NULL DEFAULT 0 COMMENT '状态 0 正常,1禁用,默认0',`deleteState` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否删除 0否 1是,默认0',`createTime` datetime NOT NULL COMMENT '创建时间,精确到秒,非空',`updateTime` datetime NOT NULL COMMENT '更新时间,精确到秒,非空',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '帖子回复表' ROW_FORMAT = Dynamic;-- ----------------------------
-- 创建版块表 t_board
-- ----------------------------
DROP TABLE IF EXISTS `t_board`;
CREATE TABLE `t_board`  (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '版块编号,主键,自增',`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '版块名,非空',`articleCount` int(11) NOT NULL DEFAULT 0 COMMENT '帖子数量,默认0',`sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序优先级,升序,默认0,',`state` tinyint(4) NOT NULL DEFAULT 0 COMMENT '状态,0 正常,1禁用,默认0',`deleteState` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否删除 0否,1是,默认0',`createTime` datetime NOT NULL COMMENT '创建时间,精确到秒,非空',`updateTime` datetime NOT NULL COMMENT '更新时间,精确到秒,非空',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '版块表' ROW_FORMAT = Dynamic;-- ----------------------------
-- 创建站内信表 for t_message
-- ----------------------------
DROP TABLE IF EXISTS `t_message`;
CREATE TABLE `t_message`  (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '站内信编号,主键,自增',`postUserId` bigint(20) NOT NULL COMMENT '发送者,并联用户编号',`receiveUserId` bigint(20) NOT NULL COMMENT '接收者,并联用户编号',`content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '内容,非空,长度255个字符',`state` tinyint(4) NOT NULL DEFAULT 0 COMMENT '状态 0未读 1已读,默认0',`deleteState` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否删除 0否,1是,默认0',`createTime` datetime NOT NULL COMMENT '创建时间,精确到秒,非空',`updateTime` datetime NOT NULL COMMENT '更新时间,精确到秒,非空',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '站内信表' ROW_FORMAT = Dynamic;-- ----------------------------
-- 创建用户表 for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user`  (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户编号,主键,自增',`username` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名,非空,唯一',`password` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '加密后的密码',`nickname` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '昵称,非空',`phoneNum` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机号',`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱地址',`gender` tinyint(4) NOT NULL DEFAULT 2 COMMENT '0女 1男 2保密,非空,默认2',`salt` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '为密码加盐,非空',`avatarUrl` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户头像URL,默认系统图片',`articleCount` int(11) NOT NULL DEFAULT 0 COMMENT '发帖数量,非空,默认0',`isAdmin` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否管理员,0否 1是,默认0',`remark` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注,自我介绍',`state` tinyint(4) NOT NULL DEFAULT 0 COMMENT '状态 0 正常,1 禁言,默认0',`deleteState` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否删除 0否 1是,默认0',`createTime` datetime NOT NULL COMMENT '创建时间,精确到秒',`updateTime` datetime NOT NULL COMMENT '更新时间,精确到秒',PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `user_username_uindex`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;-- 写入版块信息数据INSERT INTO `t_board` (`id`, `name`, `articleCount`, `sort`, `state`, `deleteState`, `createTime`, `updateTime`) VALUES (1, 'Java', 0, 1, 0, 0, '2023-01-14 19:02:18', '2023-01-14 19:02:18');INSERT INTO `t_board` (`id`, `name`, `articleCount`, `sort`, `state`, `deleteState`, `createTime`, `updateTime`) VALUES (2, 'C++', 0, 2, 0, 0, '2023-01-14 19:02:41', '2023-01-14 19:02:41');INSERT INTO `t_board` (`id`, `name`, `articleCount`, `sort`, `state`, `deleteState`, `createTime`, `updateTime`) VALUES (3, '前端技术', 0, 3, 0, 0, '2023-01-14 19:02:52', '2023-01-14 19:02:52');INSERT INTO `t_board` (`id`, `name`, `articleCount`, `sort`, `state`, `deleteState`, `createTime`, `updateTime`) VALUES (4, 'MySQL', 0, 4, 0, 0, '2023-01-14 19:03:02', '2023-01-14 19:03:02');INSERT INTO `t_board` (`id`, `name`, `articleCount`, `sort`, `state`, `deleteState`, `createTime`, `updateTime`) VALUES (5, '面试宝典', 0, 5, 0, 0, '2023-01-14 19:03:24', '2023-01-14 19:03:24');INSERT INTO `t_board` (`id`, `name`, `articleCount`, `sort`, `state`, `deleteState`, `createTime`, `updateTime`) VALUES (6, '经验分享', 0, 6, 0, 0, '2023-01-14 19:03:48', '2023-01-14 19:03:48');INSERT INTO `t_board` (`id`, `name`, `articleCount`, `sort`, `state`, `deleteState`, `createTime`, `updateTime`) VALUES (7, '招聘信息', 0, 7, 0, 0, '2023-01-25 21:25:33', '2023-01-25 21:25:33');INSERT INTO `t_board` (`id`, `name`, `articleCount`, `sort`, `state`, `deleteState`, `createTime`, `updateTime`) VALUES (8, '福利待遇', 0, 8, 0, 0, '2023-01-25 21:25:58', '2023-01-25 21:25:58');INSERT INTO `t_board` (`id`, `name`, `articleCount`, `sort`, `state`, `deleteState`, `createTime`, `updateTime`) VALUES (9, '灌水区', 0, 9, 0, 0, '2023-01-25 21:26:12', '2023-01-25 21:26:12');-- 写入帖子表数据
insert into t_article values (null, 1, 1, '测试数据-标题1', '测试数据-内容1', 0,0,0,0,0, '2023-08-11 16:52:00','2023-08-11 16:52:00');
insert into t_article values (null, 1, 1, '测试数据-标题2', '测试数据-内容2', 0,0,0,0,0, '2023-08-11 16:53:00','2023-08-11 16:53:00');
insert into t_article values (null, 1, 1, '测试数据-标题3', '测试数据-内容3', 0,0,0,0,0, '2023-08-11 16:54:00','2023-08-11 16:54:00');
insert into t_article values (null, 2, 2, '测试数据-标题4', '测试数据-内容4', 0,0,0,0,0, '2023-08-11 16:55:00','2023-08-11 16:55:00');
insert into t_article values (null, 2, 2, '测试数据-标题5', '测试数据-内容5', 0,0,0,0,0, '2023-08-11 16:56:00','2023-08-11 16:56:00');-- 写入回复表数据
insert into t_article_reply values (NULL, 1, 1, NULL, NULL, '回复内容111', 0, 0, 0, '2023-08-14 16:52:00', '2023-08-14 16:52:00');
insert into t_article_reply values (NULL, 1, 1, NULL, NULL, '回复内容222', 0, 0, 0, '2023-08-14 16:53:00', '2023-08-14 16:53:00');
insert into t_article_reply values (NULL, 1, 1, NULL, NULL, '回复内容333', 0, 0, 0, '2023-08-14 16:54:00', '2023-08-14 16:54:00');
insert into t_article_reply values (NULL, 1, 2, NULL, NULL, '回复内容444', 0, 0, 0, '2023-08-14 16:55:00', '2023-08-14 16:55:00');
insert into t_article_reply values (NULL, 1, 2, NULL, NULL, '回复内容555', 0, 0, 0, '2023-08-14 16:56:00', '2023-08-14 16:56:00');

四、接口设计及思考

回复帖子部分

4.1 回复帖子

4.1.1 提交回复内容

在帖⼦详情⻚⾯⽤⼾可以发表回复

4.1.1.1 实现逻辑

1. 帖⼦在正常状态下允许⽤⼾回复   (校验1)
2. 填写回复内容,点击提交按钮后发送请求到服务器
3. 服务器校验回复内容、帖⼦与⽤⼾状态(校验二),通过后写⼊数据库 (回复表中新增一条数据)
4. 帖⼦回复数量加1 (帖子表的更新)
5. 返回结果
思考:根据3. 4.,发表回复时,需要对两张表进行更新操作,那么就需要用事务管理起来
使用事务的原则:当一个执行流程中,要进行多个更新操作(增删改),不论涉及几张表都需要用事务管理起来。

4.1.1.2创建Service接⼝

在IArticleReplyService定义⽅法
/*** 新增一个回复记录* @param articleReply*/@Transactionalvoid create (ArticleReply articleReply);
}

4.1.1.3 实现Service接⼝

在ArticleReplyServiceImpl中实现⽅法

4.1.1.4 实现Controller

新建ArticleReplyController并提供对外的API接⼝

4.1.1.5 测试接口

测试⽤例:
1. ⽤⼾在没有登录的情况下回复帖⼦,不成功
2. 回复已删除或已禁⽤的帖⼦,不成功 3. 回复不存在的帖⼦,不成功
4. 禁⾔⽤⼾回复帖⼦,不成功
5. ⽤⼾和帖⼦状态正常的情况下,回复帖⼦,成功
6. 回复成功,帖⼦回复数量加1
7. 在测试⼯具中编辑并在数据库中查看验证是否成功

4.1.1.6 实现前端页面

// ====================== 回复帖⼦ ======================$('#details_btn_article_reply').click(function () {let articleIdEl = $('#details_article_id');let replyContentEl = $('#details_article_reply_content');// ⾮空校验if (!replyContentEl.val()) {// 提⽰$.toast({heading: '提⽰',text: '请输⼊回复内容',icon: 'warning'});return;}// 构造帖⼦对象let articleReplyObj = {articleId: articleIdEl.val(),content: replyContentEl.val()}// 发送请求$.ajax({type: 'post',url: '/article/reply',// 发送的数据data: articleReplyObj,success: function (respData) {// ⽤状态码判断是否成功if (respData.code == 0) {// 清空输⼊区editor.setValue('');// 更新回贴数currentArticle.replyCount = currentArticle.replyCount + 1;$('#details_article_replyCount').html(currentArticle.replyCount);// 构建回贴⻚⾯loadArticleDetailsReply();$.toast({heading: '提⽰',text: respData.message,icon: 'success'});} else {// 提⽰$.toast({heading: '提⽰',text: respData.message,icon: 'info'});}},error: function () {$.toast({heading: '错误',text: '出错了,请联系管理员',icon: 'error'});}});
});

4.2 点赞帖子

⽤⼾在帖⼦详情⻚进⾏点赞操作

4.2.1.1 参数要求

 

4.2.1.2 创建Service接⼝

在IArticleService定义⽅法
/*** 点赞* @param id 帖子Id*/void thumbsUpById(Long id);
}

4.2.1.3 实现Service接⼝

在ArticleServiceImpl中实现⽅法
    @Overridepublic void thumbsUpById(Long id) {//非空校验if (id == null || id <= 0) {// 打印日志log.warn(ResultCode.FAILED_PARAMS_VALIDATE.toString());// 抛出异常throw new ApplicationException(AppResult.failed(ResultCode.FAILED_PARAMS_VALIDATE));}//查询帖子信息Article article = selectById(id);if (article == null || article.getState() == 1 || article.getDeleteState() == 1) {//打印日志log.info(ResultCode.FAILED_ARTICLE_NOT_EXISTS.toString());//抛出异常throw new ApplicationException(AppResult.failed(ResultCode.FAILED_NOT_EXISTS));}//构造更新对象Article update = new Article();update.setId(article.getId());update.setLikeCount(article.getLikeCount() + 1);//更新数据库int row = articleMapper.updateByPrimaryKeySelective(update);if (row != 1) {log.info(ResultCode.FAILED_CREATE.toString() + "userId = " + article.getUserId());throw new ApplicationException(AppResult.failed(ResultCode.FAILED_CREATE));}}
}
4.2.1.4   实现Controller
在ArticleController中提供对外的API接⼝
@ApiOperation("点赞")@PostMapping("/thumbsUp")public AppResult thumbsUp(HttpServletRequest request,@ApiParam(value = "帖子Id") @RequestParam(value = "id") @NonNull Long id){// 获取⽤⼾信息HttpSession session = request.getSession(false);User user = (User) session.getAttribute(AppConfig.SESSION_USER_KEY);// 判断是否被禁⾔if (user.getState() != 0) {// ⽇志log.warn(ResultCode.FAILED_USER_BANNED.toString() + ", userId = " +user.getId());// 返回错误信息return AppResult.failed(ResultCode.FAILED_USER_BANNED);}// 更新点赞数articleService.thumbsUpById(id);// 返回结果return AppResult.success();}

4.3 删除帖子

4.3.1.1 参数要求

 4.3.1.2 创建Service接口

在IBoardService定义⽅法
    /*** 版块中的帖子数量 -1* @param id 版块Id*/void subOneArticleCountById(Long id);
}
在IUserService定义⽅法
 /*** 用户发帖数 -1* @param id*/void subOneArticleCountById(Long id);
}
在IArticleService定义⽅法,并加⼊事务管理
/*** 根据Id删除帖子* @param id 帖子Id*/
@Transactionalvoid deleteById(Long id);
}

4.3.1.3 实现Service接⼝

在BoardServiceImpl中实现⽅法
    @Overridepublic void subOneArticleCountById(Long id) {//非空校验if (id == null || id < 0) {//打印日志log.warn(ResultCode.FAILED_ARTICLE_NOT_EXISTS.toString());// 抛出异常throw new ApplicationException(AppResult.failed(ResultCode.FAILED_ARTICLE_NOT_EXISTS));}//查询板块信息Board board = selectById(id);// 校验版块是否存在if (board == null) {// 打印日志log.warn(ResultCode.FAILED_BOARD_NOT_EXISTS.toString());// 抛出异常throw new ApplicationException(AppResult.failed(ResultCode.FAILED_BOARD_NOT_EXISTS));}// 构造要更新的对象Board updateBoard = new Board();updateBoard.setId(board.getId()); // 版块IDupdateBoard.setArticleCount(board.getArticleCount() - 1); // 帖子数量if (updateBoard.getArticleCount() < 0) {//如果小于0那么设置为0updateBoard.setArticleCount(0);}// 调用DAOint row = boardMapper.updateByPrimaryKeySelective(updateBoard);if (row != 1) {// 打印日志log.warn(ResultCode.FAILED.toString() + ",受影响的行数不等于1.");// 抛出异常throw new ApplicationException(AppResult.failed(ResultCode.FAILED));}}
}
在UserServiceImpl中实现⽅法
    @Overridepublic void subOneArticleCountById(Long id) {//非空校验if (id == null || id < 0) {//打印日志log.warn(ResultCode.FAILED_PARAMS_VALIDATE.toString());// 抛出异常throw new ApplicationException(AppResult.failed(ResultCode.FAILED_PARAMS_VALIDATE));}//根据用户名查询用户信息User user = userMapper.selectById(id);//校验用户是否存在if(user == null){// 打印日志log.warn(ResultCode.FAILED_ARTICLE_NOT_EXISTS.toString() + ", user id = " + id);// 抛出异常throw new ApplicationException(AppResult.failed(ResultCode.FAILED_ARTICLE_NOT_EXISTS));}//构造要更新的对象User updateUser = new User();updateUser.setId(user.getId());//用户IdupdateUser.setArticleCount(user.getArticleCount() - 1);//帖子数量-1//判断-1之后,用户的发帖数是否小于0if(updateUser.getArticleCount() < 0){//如果小于0,则设置为0updateUser.setArticleCount(0);}//调用DAOint row = userMapper.updateByPrimaryKeySelective(updateUser);if (row != 1) {// 打印日志log.warn(ResultCode.FAILED.toString() + ",受影响的行数不等于1.");// 抛出异常throw new ApplicationException(AppResult.failed(ResultCode.FAILED));}
在ArticleServiceImpl中实现⽅法
    @Overridepublic void deleteById(Long id) {//非空校验if (id == null || id <= 0) {// 打印日志log.warn(ResultCode.FAILED_PARAMS_VALIDATE.toString());// 抛出异常throw new ApplicationException(AppResult.failed(ResultCode.FAILED_PARAMS_VALIDATE));}//根据Id查询帖子信息Article article = articleMapper.selectByPrimaryKey(id);if (article == null || article.getDeleteState() == 1) {//打印日志log.info(ResultCode.FAILED_ARTICLE_NOT_EXISTS.toString() + ",article id = " + id);//抛出异常throw new ApplicationException(AppResult.failed(ResultCode.FAILED_NOT_EXISTS));}//构造更新对象Article updateArticle = new Article();updateArticle.setId(article.getId());updateArticle.setDeleteState((byte) 1);//更新数据库int row = articleMapper.updateByPrimaryKeySelective(updateArticle);if (row != 1) {log.info(ResultCode.ERROR_SERVICES.toString());throw new ApplicationException(AppResult.failed(ResultCode.ERROR_SERVICES));}//更新版块中的帖子数量boardService.subOneArticleCountById(article.getUserId());//更新用户发帖数userService.subOneArticleCountById(article.getUserId());log.info("删除帖子成功,article id = " + article.getId() + ",user id = " + article.getUserId() + ".");}

4.3.1.4 实现Controller

在ArticleController中提供对外的API接⼝
/*** 根据Id删除帖⼦** @param id 帖⼦Id* @return*/
@ApiOperation("删除帖⼦")
@PostMapping("/delete")
public AppResult deleteById (HttpServletRequest request,@ApiParam("帖⼦Id") @RequestParam("id") @NonNull Longid) {// 1. ⽤⼾是否禁⾔HttpSession session = request.getSession(false);User user = (User) session.getAttribute(AppConfig.SESSION_USER_KEY);if (user.getState() == 1) {// 返回错误描述return AppResult.failed(ResultCode.FAILED_USER_BANNED);}//查询帖子信息Article article = articleService.selectById(id);//2.帖子是否存在或已删除if (article == null || article.getDeleteState() == 1) {// 返回错误描述return AppResult.failed(ResultCode.FAILED_ARTICLE_NOT_EXISTS);}// 3. ⽤⼾是否是作者if (article.getUserId() != user.getId()) {// 返回错误描述return AppResult.failed(ResultCode.FAILED_FORBIDDEN);}// 调⽤Service执⾏删除articleService.deleteById(id);// 返回成功return AppResult.success();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/91078.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】堆的实现,堆排序以及TOP-K问题

目录 1.堆的概念及结构 2.堆的实现 2.1初始化堆 2.2销毁堆 2.3取堆顶元素 2.4返回堆的大小 2.5判断是否为空 2.6打印堆 2.7插入元素 2.8堆的向上调整 2.9弹出元素 2.10堆的向下调整 3. 建堆时间复杂度 4. 堆的应用 4.1 堆排序 4.2 TOP-K问题 1.堆的概念及结构 …

【Spring】统一事件的处理(拦截器、统一异常处理、统一数据格式返回)

文章目录 前言一、Spring 拦截器1.1 用户登录权限校验案例1.1.1 最初的用户登录验证1.1.2 使用 Spring AOP 实现登录验证的问题 1.2 Spring 拦截器的使用1.2.1 Spring 拦截器概念与使用步骤1.2.2 使用拦截器实现对用户登录权限的校验 1.3 拦截器实现原理1.4 Spring 拦截器和 Sp…

响应式设计是什么?怎么学习? - 易智编译EaseEditing

响应式设计是一种用于创建能够适应不同设备和屏幕尺寸的网站和应用程序的设计方法。它的目标是确保网站在各种设备上都能提供良好的用户体验&#xff0c;无论是在大屏幕的桌面电脑上还是在小屏幕的移动设备上。 在响应式设计中&#xff0c;页面的布局、字体、图像和其他元素会…

读《芯片浪潮》,学习台积电张忠谋的管理之道

大家知道&#xff0c;台积电一个公司就占据了全球晶圆代工市场一半的份额。 5纳米及以下最先进工艺的芯片&#xff0c;台积电可占到惊人的90%以上的市场。全球最新最强的智能手机、笔记本电脑的核心计算芯片都必须仰仗台积电一个企业的供应。 换一个说法&#xff0c;如果没有…

每天一道leetcode:剑指 Offer 12. 矩阵中的路径(中等DFS深度优先遍历)

今日份题目&#xff1a; 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元…

62、华为昇腾开发板Atlas 200I DK A2配置mmpose的hrnet模型推理python/c++

基本思想&#xff1a;适配mmpose模型&#xff0c;记录一下流水帐&#xff0c;环境配置和模型来自&#xff0c;请查看参考链接。 链接: https://pan.baidu.com/s/1IkiwuZf1anyKX1sZkYmD1g?pwdi51s 提取码: i51s 一、转模型 (base) rootdavinci-mini:~/sxj731533730# atc --mo…

docker pull 设置代理 centos

On CentOS the configuration file for Docker is at: /etc/sysconfig/docker 用 root 权限打开 text editor sudo gedit 注意 加引号 Adding the below line helped me to get the Docker daemon working behind a proxy server: HTTP_PROXY“http://<proxy_host>:&…

C++ 动态规划经典案例解析之最长公共子序列(LCS)_窥探递归和动态规划的一致性

1. 前言 动态规划处理字符相关案例中&#xff0c;求最长公共子序列以及求最短编辑距离&#xff0c;算是经典中的经典案例。 讲解此类问题的算法在网上一抓应用一大把&#xff0c;即便如此&#xff0c;还是忍不住有写此文的想法。毕竟理解、看懂都不算是真正掌握&#xff0c;唯…

浅谈统一权限管理服务的设计与开发

作者 | 天地练心 导读 本文详细探讨了统一权限管理服务&#xff08;MPS&#xff09;的设计与开发&#xff0c;针对企业内部多平台权限管理混乱的问题&#xff0c;提出了一套综合RBAC、ACL、DAC权限模型的解决方案。文章从需求分析、技术选型、功能设计等方面全面介绍了MPS的构建…

阿里云ACP知识点

前言&#xff1a;记录ACP错题 1、在创建阿里云ECS时&#xff0c;每台服务器必须要包含_______用来存储操作系统和核心配置。 系统盘&#xff08;不是实例&#xff0c;实例是一个虚拟的计算环境&#xff0c;由CPU、内存、系统盘和运行的操作系统组成&#xff1b;ESC实例作为云…

2023国赛数学建模E题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

纯js点击按钮切换首页部分页面

像我这种大数据的&#xff0c;不会前端的&#xff0c;懒得学框架&#xff0c;现在有gpt了&#xff0c;前端对于我来说&#xff0c;用原生的更加友好&#xff0c;毕竟算法gpt都能优化。 首页我有个页面&#xff0c;然后我现在想点击gm替换上面的统计&#xff0c;点击用户替换回…

Flask Web开发实战(狼书)| 笔记第1、2章

前言 2023-8-11 以前对网站开发萌生了想法&#xff0c;又有些急于求成&#xff0c;在B站照着视频敲了一个基于flask的博客系统。但对于程序的代码难免有些囫囵吞枣&#xff0c;存在许多模糊或不太理解的地方&#xff0c;只会照葫芦画瓢。 而当自己想开发一个什么网站的时&…

SpringCloud微服务之间如何进行用户信息传递(涉及:Gateway、OpenFeign组件)

目录 1、想达到的效果2、用户信息在微服务之间传递的两种途径3、用RuoYi-Cloud为例进行演示说明&#xff08;1&#xff09;网关将用户信息写在请求头中&#xff08;2&#xff09;业务微服务之间通过OpenFeign进行调用&#xff0c;并且将用户信息写在OpenFeign准备的请求头中&am…

Qt+C++自定义控件仪表盘动画仿真

程序示例精选 QtC自定义控件仪表盘动画仿真 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC自定义控件仪表盘动画仿真>>编写代码&#xff0c;代码整洁&#xff0c;规则&…

浅谈SMT行业MES系统生产管理的特点

一、SMT生产车间在电子制造中起重要作用的部分&#xff0c;主要具备以下生产特点&#xff1a; 1.高密度和高速度&#xff1a; SMT生产车间中的电子元器件一般来说较为精小&#xff0c;且被紧密地排列在PCB上。这就要求SMT生产车间的机械设备具备高精度和高速度&#xff0c;确保…

怎么对视频进行压缩?

怎么对视频进行压缩&#xff1f;视频压缩&#xff0c;我们都知道是将视频文件进行压缩变小的过程&#xff0c;是我们日常办公中较为常用的手段。现如今&#xff0c;在视频技术不断发展与创新的基础上&#xff0c;视频分辨率也在不断提高&#xff0c;进而导致文件占有量也非常大…

前后端分离------后端创建笔记(05)用户列表查询接口(下)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

设计HTML5图像和多媒体

在网页中的文本信息直观、明了&#xff0c;而多媒体信息更富内涵和视觉冲击力。恰当使用不同类型的多媒体可以展示个性&#xff0c;突出重点&#xff0c;吸引用户。在HTML5之前&#xff0c;需要借助插件为网页添加多媒体&#xff0c;如Adobe Flash Player、苹果的QuickTime等。…

DoIP学习笔记系列:(六)满足AES128-CMAC算法的“安全认证”.dll生成实践

文章目录 1. 算法Demo2. 算法实现传送门 DoIP学习笔记系列:导航篇 AES128-CMAC算法在汽车电子控制单元的软件开发中涉及到安全相关的需求经经常用到,具体的算法原理请各位小伙伴自行百度,本篇主要向大家分享该算法如何集成到.dll文件中,在OTA、刷写等场景作为$27服务的安全…