云上社群學習系統部分接口設計詳解

目錄

一、項目簡介

二、技術選型

?三、數據庫設計

四、接口設計及思考

回復帖子部分

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.pswp.cn/news/37756.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37756.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37756.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

探索前端動畫之CSS魔法

引言 在現代網頁設計中&#xff0c;動畫已經成為了吸引用戶注意力、提升用戶體驗的重要手段之一。而在前端開發中&#xff0c;CSS動畫是一種常見且強大的實現方式。本篇博客將帶你深入探索前端動畫中的CSS魔法&#xff0c;通過清晰的思路和完整的示例代碼&#xff0c;幫助你掌…

tools/packtool/dragon: 沒有那個文件或目錄 明明有這個文件

tools/packtool/dragon: 沒有那個文件或目錄 明明有這個文件 在編譯一個工程時碰到這個問題&#xff0c;重裝虛擬機&#xff0c;更換ubuntu系統版本都沒有解決&#xff0c;看到網上的文章解決了。 ubuntu中執行可執行文件時報錯“沒有那個文件或目錄”的解決辦法&#xff08;…

Storm學習之使用官方Docker鏡像快速搭建Storm運行環境

文章目錄 0.前言搭建完的效果 1.教程1.1.docker 安裝 zookeeper1.2. 安裝 storm nimbus1.3.docker 安裝 supervisor1.4.docker 安裝 storm-ui1.5.查看已經啟動的容器1.6.提交topology到 storm集群 2.總結3.參考文檔 0.前言 Apache Storm 官方也出了Docker 鏡像 https://hub.do…

lua使用心得

lua語言的一些注意事項 在控制結構的條件中除了false和nil為假&#xff0c;其他值都為真。所以Lua認為0和空串都是真。lua5.3之前的版本只支持浮點數&#xff0c;lua5.3才引入了對整數的支持&#xff0c;/僅支持浮點數除法&#xff0c;要實現C里的整除效果必須使用雙斜杠//超過…

nodejs+vue+elementui美食網站的設計與實現演示錄像2023_0fh04

本次的畢業設計主要就是設計并開發一個美食網站軟件。運用當前Google提供的nodejs 框架來實現對美食信息查詢功能。當然使用的數據庫是mysql。系統主要包括個人信息修改&#xff0c;對餐廳管理、用戶管理、餐廳信息管理、菜系分類管理、美食信息管理、美食文化管理、系統管理、…

數據可視化工具的三大類報表制作流程分享

電腦&#xff08;pc&#xff09;、移動、大屏三大類型的BI數據可視化報表制作步驟基本相同&#xff0c;差別就在于尺寸調整和具體的報表布局。這對于采用點擊、拖拉拽方式來制作報表的奧威BI數據可視化工具來說就顯得特別簡單。接下來&#xff0c;我們就一起看看不這三大類型的…

界面組件DevExpress Reporting——支持圖表本地化和可綁定屬性

DevExpress Reporting是.NET Framework下功能完善的報表平臺&#xff0c;它附帶了易于使用的Visual Studio報表設計器和豐富的報表控件集&#xff0c;包括數據透視表、圖表&#xff0c;因此您可以構建無與倫比、信息清晰的報表。 在最近的更新(v23.1)中&#xff0c;官方擴展了…

centos7 部署kubernetes(帶自動部署腳本)

目錄 一、實驗規劃 1、規劃表 2、安裝前宿主機檢查 1.配置主機名 2.制作ssh免密&#xff08;VM1中執行&#xff09; 3.修改hosts 文件 4. 修改內核相關參數 5.加載模塊 6. 清空iptables、關閉防火墻、關閉交換空間、禁用selinux 7. 安裝ipvs與時鐘同步 8.配置docker的…

Three.js 監聽紋理加載

本文簡介 本文介紹 Three.js 的基礎方法&#xff1a;監聽材質加載。 在 《Three.js 基礎紋理貼圖》 里介紹了如何給圖形貼圖&#xff0c;貼圖前需要先把紋理加載好。我們基于這篇文章繼續講解如何監聽材質加載成功或者失敗。 監聽單個材質 我們使用 TextureLoader 的 load() 方…

TC3XX - MCAL知識點(二十六):GETH MCAL配置及代碼實戰(以太網)

目錄 1、概述 2、MCAL配置 2.1、配置目標 2.2、ETH配置 2.2.1、EthGeneral 2.2.2、EthCtrlOffloading 2.2.3、EthConfigSet 2.3、Port配置 2.4、IRQ配置 2.5、MC

ChatGPT收錄

VSCode插件-ChatGPT 多磨助手 多磨助手 (domore.run) Steamship Steamship 免費合集 免費chatGPT - Ant Design Pro 免費AI聊天室 (xyys.one)

解決flutter showDialog下拉框,復選框等無法及時響應的問題

使用StatefulBuilder _showDialogr() {showDialog(context: context,builder: (BuildContext ctx) {return StatefulBuilder(builder: (BuildContext context, StateSetter setState) {return Scaffold(body: Column(children: <Widget>[Container(height: 400,padding: …

使用nio代替傳統流實現文件上傳和下載功能

1.文件下載 /**NIO文件下載工具類* author olalu*/ public class NioDownloadUtils {/*** description:* param file: 要下在文件* return: void*/public static void downloadDoc(File file,HttpServletResponse response) throws IOException {OutputStream outputStream r…

武漢地鐵19號線完成5G專網全覆蓋,現場測試下行速率超千兆!

近日&#xff0c;極目新聞記者從中國移動湖北公司獲悉&#xff0c;隨著武漢地鐵19號線全線隧道正式貫通&#xff0c;湖北移動目前已完成新月溪公園至鼓架山站5G網絡覆蓋&#xff0c;軌行區5G專網全覆蓋&#xff0c;并成功進行試車驗證&#xff0c;19號線成為國內首條全線實現5G…

實習筆記(一)

自定義注解&#xff1a; 自定義注解中有三個元注解Target,Retention,Document /*** 系統日志注解** author Mark sunlightcsgmail.com*/ Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface SysLog {String value() default "…

2023全國大學生數學建模競賽C題思路模型代碼

目錄 1.C題思路模型&#xff1a;比賽開始后&#xff0c;第一時間更新&#xff0c;獲取見文末名片 2.比賽時間&#xff1a;2023年9月7日18點到2023年9月10日20點 3 全國大學生數學建模競賽常見數模問題 3.1 分類問題 3.2 優化問題 詳細思路見此名片&#xff0c;開賽第一時間…

面試題解析 | 為什么Redis使用單線程性能會優于多線程?

大家好&#xff0c;我是小米&#xff01;今天我要和大家聊一個有關Redis的熱門面試題&#xff1a;為什么Redis使用單線程性能會優于多線程&#xff1f;相信這個問題在很多同學心中都曾經糾結過&#xff0c;那么接下來&#xff0c;就讓我們一起來揭開這個技術之謎吧&#xff01;…

LeetCode 37題:解數獨

題目 編寫一個程序&#xff0c;通過填充空格來解決數獨問題。 數獨的解法需 遵循如下規則&#xff1a; 數字 1-9 在每一行只能出現一次。數字 1-9 在每一列只能出現一次。數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。&#xff08;請參考示例圖&#xff09; 數獨…

IDEA簡單拷貝一份新項目記錄

IDEA簡單拷貝項目記錄 拷貝后改項目名&#xff0c;然后iml 配置文件改項目名&#xff0c;然后 .idea 中的compiler.xml 里面的name標簽改項目名。 就可以了

【軟件工程】軟件測試

軟件測試的對象 軟件程序文檔 測試對象&#xff1a;各個階段產生的源程序和文檔。 軟件測試的目的 基于不同的立場&#xff0c;對軟件測試的目的存在著兩種完全對立的觀點。 &#xff08;1&#xff09;一種觀點是通過測試暴露出軟件中所包含的故障和缺陷(從用戶的角度)&#xf…