SpringBoot学习笔记-创建个人中心页面(上)

笔记内容转载自 AcWing 的 SpringBoot 框架课讲义,课程链接:AcWing SpringBoot 框架课。

CONTENTS

  • 1. 更新数据库表
  • 2. 实现后端API

本节实现存储用户 Bot 信息的数据表以及操作 Bot 数据的增删改查 API。

1. 更新数据库表

我们需要创建一个表来保存 Bot 的信息,新建一个 bot 表,包含以下几个列:

  • id: int:非空、自动增加、唯一、主键。
  • user_id: int:非空。注意:在 pojo 中需要定义成 userId,在 queryWrapper 中的名称仍然为 user_id
  • title: varchar(100)
  • description: varchar(300)
  • content:varchar(10000)
  • rating: int:默认值为1500。
  • createtime: datetime,注意:在 pojo 中定义日期格式的注解:@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  • modifytime: datetime

可以使用如下 SQL 语句一键创建好该表:

CREATE TABLE `kob`.`bot` (`id` int NOT NULL AUTO_INCREMENT,`user_id` int NOT NULL,`title` varchar(100) NULL,`description` varchar(300) NULL,`content` varchar(10000) NULL,`rating` int NULL DEFAULT 1500,`createtime` datetime NULL,`modifytime` datetime NULL,PRIMARY KEY (`id`)
);

创建好数据库表后我们需要创建一个 pojo,在 pojo 目录下创建 Bot 类:

package com.kob.backend.pojo;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Bot {@TableId(value = "id", type = IdType.AUTO)  // 声明id为自增类型private Integer id;private Integer userId;  // 注意驼峰命名,userId之后会被解析为user_id,别写成userID,因为这样会解析成user_i_dprivate String title;private String description;private String content;private Integer rating;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")  // 注意日期格式的设置private Date createtime;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date modifytime;
}

然后就可以实现 mapper,在 mapper 目录下创建 BotMapper 接口:

package com.kob.backend.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.kob.backend.pojo.Bot;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface BotMapper extends BaseMapper<Bot> {
}

2. 实现后端API

首先在 service.user 包下创建 bot 包存放与 Bot 相关的 Service 代码,然后在 service.impl.user 包下创建 bot 包存放相应的 Service 实现代码,最后在 controller.user 包下创建 bot 包存放 Controller。

我们需要实现以下四个 API:

  • /user/bot/add/:创建一个 Bot。
  • /user/bot/remove/:删除一个 Bot。
  • /user/bot/update/:修改一个 Bot。
  • /user/bot/getlist/:查询 Bot 列表。

service.user.bot 包下创建这四个 API 的 Service 接口:

(1)AddService

package com.kob.backend.service.user.bot;import java.util.Map;public interface AddService {Map<String, String> add(Map<String, String> data);
}

(2)RemoveService

package com.kob.backend.service.user.bot;import java.util.Map;public interface RemoveService {Map<String, String> remove(Map<String, String> data);
}

(3)UpdateService

package com.kob.backend.service.user.bot;import java.util.Map;public interface UpdateService {Map<String, String> update(Map<String, String> data);
}

(4)GetListService

package com.kob.backend.service.user.bot;import com.kob.backend.pojo.Bot;import java.util.List;public interface GetListService {List<Bot> getList();  // 根据用户信息获取Bot,用户信息存放在令牌中,因此不用传参数
}

接下来在 service.impl.user.bot 包下创建这四个 Service 接口的实现:

(1)AddServiceImpl

package com.kob.backend.service.impl.user.bot;import com.kob.backend.mapper.BotMapper;
import com.kob.backend.pojo.Bot;
import com.kob.backend.pojo.User;
import com.kob.backend.service.impl.utils.UserDetailsImpl;
import com.kob.backend.service.user.bot.AddService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;import java.util.Date;
import java.util.HashMap;
import java.util.Map;@Service
public class AddServiceImpl implements AddService {@Autowiredprivate BotMapper botMapper;@Overridepublic Map<String, String> add(Map<String, String> data) {UsernamePasswordAuthenticationToken authenticationToken =(UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();UserDetailsImpl loginUser = (UserDetailsImpl) authenticationToken.getPrincipal();User user = loginUser.getUser();  // 获取当前登录的用户String title = data.get("title");String description = data.get("description");String content = data.get("content");Map<String, String> res = new HashMap<>();if (title == null || title.isEmpty()) {res.put("result", "The title can't be empty!");return res;}if (title.length() > 100) {res.put("result", "Title length can't exceed 100!");return res;}if (description == null || description.isEmpty()) {description = "这个用户很懒,什么也没留下~";}if (description.length() > 300) {res.put("result", "Description length can't exceed 300!");return res;}if (content == null || content.isEmpty()) {res.put("result", "The content can't be empty!");return res;}if (content.length() > 10000) {res.put("result", "Code length can't exceed 10000!");return res;}Date now = new Date();Bot bot = new Bot(null, user.getId(), title, description, content, 1500, now, now);botMapper.insert(bot);res.put("result", "success");return res;}
}

(2)RemoveServiceImpl

package com.kob.backend.service.impl.user.bot;import com.kob.backend.mapper.BotMapper;
import com.kob.backend.pojo.Bot;
import com.kob.backend.pojo.User;
import com.kob.backend.service.impl.utils.UserDetailsImpl;
import com.kob.backend.service.user.bot.RemoveService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;import java.util.HashMap;
import java.util.Map;@Service
public class RemoveServiceImpl implements RemoveService {@Autowiredprivate BotMapper botMapper;@Overridepublic Map<String, String> remove(Map<String, String> data) {UsernamePasswordAuthenticationToken authenticationToken =(UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();UserDetailsImpl loginUser = (UserDetailsImpl) authenticationToken.getPrincipal();User user = loginUser.getUser();  // 需要判断要删除的Bot是不是当前登录用户的Botint bot_id = Integer.parseInt(data.get("bot_id"));Bot bot = botMapper.selectById(bot_id);Map<String, String> res = new HashMap<>();if (bot == null) {res.put("result", "Bot doesn't exist!");return res;}if (!bot.getUserId().equals(user.getId())) {res.put("result", "No permission to delete the bot!");return res;}botMapper.deleteById(bot_id);res.put("result", "success");return res;}
}

(3)UpdateServiceImpl

package com.kob.backend.service.impl.user.bot;import com.kob.backend.mapper.BotMapper;
import com.kob.backend.pojo.Bot;
import com.kob.backend.pojo.User;
import com.kob.backend.service.impl.utils.UserDetailsImpl;
import com.kob.backend.service.user.bot.UpdateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;import java.util.Date;
import java.util.HashMap;
import java.util.Map;@Service
public class UpdateServiceImpl implements UpdateService {@Autowiredprivate BotMapper botMapper;@Overridepublic Map<String, String> update(Map<String, String> data) {UsernamePasswordAuthenticationToken authenticationToken =(UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();UserDetailsImpl loginUser = (UserDetailsImpl) authenticationToken.getPrincipal();User user = loginUser.getUser();int bot_id = Integer.parseInt(data.get("bot_id"));String title = data.get("title");String description = data.get("description");String content = data.get("content");Map<String, String> res = new HashMap<>();if (title == null || title.isEmpty()) {res.put("result", "The title can't be empty!");return res;}if (title.length() > 100) {res.put("result", "Title length can't exceed 100!");return res;}if (description == null || description.isEmpty()) {description = "这个用户很懒,什么也没留下~";}if (description.length() > 300) {res.put("result", "Description length can't exceed 300!");return res;}if (content == null || content.isEmpty()) {res.put("result", "The content can't be empty!");return res;}if (content.length() > 10000) {res.put("result", "Code length can't exceed 10000!");return res;}Bot bot = botMapper.selectById(bot_id);if (bot == null) {res.put("result", "Bot doesn't exist!");return res;}if (!bot.getUserId().equals(user.getId())) {res.put("result", "No permission to update the bot!");return res;}Bot new_bot = new Bot(bot.getId(), user.getId(), title, description, content, bot.getRating(), bot.getCreatetime(), new Date());botMapper.updateById(new_bot);res.put("result", "success");return res;}
}

(4)GetListServiceImpl

package com.kob.backend.service.impl.user.bot;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.kob.backend.mapper.BotMapper;
import com.kob.backend.pojo.Bot;
import com.kob.backend.pojo.User;
import com.kob.backend.service.impl.utils.UserDetailsImpl;
import com.kob.backend.service.user.bot.GetListService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class GetListServiceImpl implements GetListService {@Autowiredprivate BotMapper botMapper;@Overridepublic List<Bot> getList() {UsernamePasswordAuthenticationToken authenticationToken =(UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();UserDetailsImpl loginUser = (UserDetailsImpl) authenticationToken.getPrincipal();User user = loginUser.getUser();QueryWrapper<Bot> queryWrapper = new QueryWrapper<>();queryWrapper.eq("user_id", user.getId());return botMapper.selectList(queryWrapper);}
}

最后在 controller.user.bot 包下创建对应的 Controller:

(1)AddController

package com.kob.backend.controller.user.bot;import com.kob.backend.service.user.bot.AddService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.Map;@RestController
public class AddController {@Autowiredprivate AddService addService;@PostMapping("/user/bot/add/")public Map<String, String> add(@RequestParam Map<String, String> data) {return addService.add(data);}
}

(2)RemoveController

package com.kob.backend.controller.user.bot;import com.kob.backend.service.user.bot.RemoveService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.Map;@RestController
public class RemoveController {@Autowiredprivate RemoveService removeService;@PostMapping("/user/bot/remove/")public Map<String, String> remove(@RequestParam Map<String, String> data) {return removeService.remove(data);}
}

(3)UpdateController

package com.kob.backend.controller.user.bot;import com.kob.backend.service.user.bot.UpdateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.Map;@RestController
public class UpdateController {@Autowiredprivate UpdateService updateService;@PostMapping("/user/bot/update/")public Map<String, String> update(@RequestParam Map<String, String> data) {return updateService.update(data);}
}

(4)GetListController

package com.kob.backend.controller.user.bot;import com.kob.backend.pojo.Bot;
import com.kob.backend.service.user.bot.GetListService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class GetListController {@Autowiredprivate GetListService getListService;@GetMapping("/user/bot/getlist/")public List<Bot> getList() {return getListService.getList();}
}

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

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

相关文章

解锁数据分析的神器:ChatGPT引领人工智能革命

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在当今数字化时代&#xff0c;数据分析成为决策…

VB.net WebBrowser网页元素抓取分析方法

在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…

通过bat命令启动jar后缀软件

要通过bat命令启动一个带有.jar后缀的软件&#xff0c;可以使用以下的bat文件命令&#xff1a; echo off java -jar "路径\文件名.jar" pause请将路径\文件名.jar替换为实际的文件路径和文件名。例如&#xff0c;如果你的文件位于C:\Program Files\MyApp\app.jar&am…

十倍增量的海外客户开发新方式来了!外贸企业可直接照做

外贸和B2大C型&#xff08;汽车、房产、保险、教育等&#xff09;企业出海过程中&#xff0c;除了常见的数字营销&#xff08;投放&#xff09;、平台营销、活动营销&#xff08;线下展会&#xff09;和内容营销&#xff0c;还有一个批量化可快速复制起量的营销方式&#xff1a…

JavaScript 判断变量/对象类型是否为Object

前言 本文示例运行环境&#xff1a;JavaScript V8 8.6.395.25&#xff08;注&#xff1a;使用命令 chrome://version/ 查看 JavaScript 版本&#xff09;javascript 查看变量类型 JavaScript 判断变量/对象类型的方法 typeof 判断数据类型Object.prototype.toString方法检测…

某个订单项目记录,涉及MQ消息处理、分布式问题、幂等性等问题解决设计

文章目录 消息队列&#xff08;Message Queue&#xff09;什么场景下&#xff0c;使用消息队列&#xff1f;消息队列 概述 RabbitMQ 消息队列RabbitMQ 概念名词 概念RabbitMQ 流程 RabbitMQ 安装RabbitMQ 页面介绍Exchange 交换机类型Spring Boot 整合RabbitMQAmqpAdmin 与 Rab…

资源整合集

gradle下载&#xff1a;http://services.gradle.org/distributions

如何快速将txt类型的日志文件转换为excel表格并进行数据分析报表统计图(如:饼图、折线图、柱状图)?

打开excel创建空白文档 选择一个txt文件 一动下面箭头↑竖线&#xff0c;可以拖拽左右调整要判断转换为一列的数据宽度 根据情况设置不同列的数据格式&#xff08;每一列可以点击&#xff09;&#xff0c;设置好后点击【完成】 设置单元格数据格式 手动插入第一行为每列数据的…

ospf路由选路及路由汇总

一、知识补充 1、ABR和ASBR 1.1 ABR ABR指的是边界路由&#xff0c;通常位于两个或多个区域之间&#xff0c;用于在不同的OSPF区域之间传递信息。当一个路由器同时连接到两个或多个区域时&#xff0c;它就成为了ABR&#xff0c;它需要维护每个区域的拓扑信息和路由表&#x…

Linux+qt:创建动态库so,以及如何使用(详细步骤)

目录 1、根据安装Qt Creator的向导进行创建 2、开发动态库注意的一些细节 3、给动态库添加一个对外开放的接口文件 4、了解下Qt的 .pri文件&#xff08;非常实用&#xff09; 5、如何调用动态库.so 1、根据安装Qt Creator的向导进行创建 &#xff08;1&#xff09;选择“…

华为摄像头通过stm32叠加字符串

void sendtoHuawei(uint8_t *cameraIp,uint16_t cameraSrcPort,uint16_t cameraDstPort,uint8_t *userName,uint8_t *pwd,uint8_t lineNum,int camNo)//华为 { int flag = 1; int sock = -1,connected; uint8_t ret; int recv_data_len; memset(str1, 0, …

任务流之间的调度依赖

检查任务 import java.sql.SQLException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit;/*** 每一个有依赖其他flow的flow&#xff0c;都要先进行依赖的检查* 这是一个切面*/ public…

使用Sqoop命令从Oracle同步数据到Hive,修复数据乱码 %0A的问题

一、创建一张Hive测试表 create table test_oracle_hive(id_code string,phone_code string,status string,create_time string ) partitioned by(partition_date string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ,; 创建分区字段partition_date&#xff0c…

C语言基础篇4:变量、存储、库函数

1 局部变量和全局变量 在介绍局部变量和全局变量前&#xff0c;先了解一些关于作用域方面的内容。作用域的作用就是决定程序中的哪些语句是可用的&#xff0c;换句话说&#xff0c;就是程序中的可见性。作用域有局部作用域和全局作用域&#xff0c;那么局部变量就具有局部作用域…

应用软件安全编程--21避免使用不安全的哈希算法

在安全性要求较高的系统中&#xff0c;不可使用被业界公认不安全的哈希算法(如 MD2、MD4、MD5、SHA、 SHA1 等)来保证数据的完整性。 对于避免使用不安全的哈希算法的情况&#xff0c;示例1给出了不规范用法(Java 语言)示例。示例2给出 了规范用法(Java 语言)示例。 示例1:…

Docker部署MinIO对象存储服务器结合Cpolar实现远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远…

YB506AB是一款理电池充、放电管理专用芯片,集成锂电池充电管理和降压DC-DC电路。

YB506AB 锂电转可充电AA/AAA电池专用SOC芯片 概述: YB506AB是一款理电池充、放电管理专用芯片&#xff0c;集成锂电池充电管理和降压DC-DC电路。充电过程满足锂电池三段式滑流/恒流/恒压充电规范&#xff0c;B506内部的线性充电电路采用了恒流可配置模式&#xff0c;可以通过…

【shell】 1、bash语法超详细介绍

文章目录 修改前缀路径dirname set常用函数参数变量local 返回值正则打印第 n 行获取行号核对数据库各表数量jq查询检查日志 sshpassexpect数组xargs bash manual 修改前缀 参考 export PS1"bash> "路径 dirname strip last component from file name dir$(…

数据存储模型

1、前言 写点什么东西呢 之前大学毕设搞了个高并发模型&#xff0c;里面使用到了select模型&#xff0c;里面用到了一个内存池&#xff0c;支持多客户端连接、登录、消息发送&#xff0c;现在工作经验三年多了&#xff0c;开发经验积累了不少&#xff0c;但是对喜爱的C的一些知…

Nodejs--Express框架使用

目录 一.概念 二.项目目录结构 三.app.js 四.项目需要的中间件 五.Mysql连接 六.日志配置 七.实体模型配置 八.统一结果封装 九.app.js的详细配置 十.自定义登录拦截器 十一.route路由配置 十二.controller处理 十二&#xff1a;静态页面&#xff1a; 十三&#xff…