springboot练手实战项目说明
项目简单易懂,这里只有后端内容,前端方面不难就不多赘述,大家可以参考后端接口完成前端页面内容
后端使用了七牛云服务存储头像图片,redis缓存登录信息,使用mybatisPlus提高开发效率,有需要学习的同学可以接着往下看了
我的前端是用的vue3+vite 先做前端再做后端,保持好习惯
常用知识(先学习再实战)
myBatis的Dao层,Mapper层,controller层,service层,model层,entity层简介
必装插件:
1.项目搭建和工具类准备
新建一个springboot 的maven工程
如果不会请看这里搭建一个spring maven工程
1.1 pom.xml(我的通用模板)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>VShop</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>VShop</name>
<description>VShop</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/joda-time/joda-time -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.10</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>[7.7.0, 7.7.99]</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.7</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>net.glxn</groupId>
<artifactId>qrgen</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.2 application.yml
server:
port: 8089
address: 127.0.0.1
spring:
data:
redis:
host: localhost
port: 6379
datasource:
url: jdbc:mysql://localhost:3306/[数据库名]?useUnicode=true&characterEncoding=UTF-8&serverTimeZone=UTC
username: [用户名]
password: [密码]
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
qiniu:
accessKey: 注册七牛云服务获取的AK
accessSecretKey: 七牛云服务的SK
1.3 项目结构:
1.4 MyBAtisPlusConfig.java
package com.example.vshop.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("com.example.vshop.dao.mapper")
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
1.5 ErrorCode.java(我的通用模板,可以留到以后说不定还能用)
package com.example.vshop.vo;
public enum ErrorCode {
PARAMS_ERROR(10001,"参数有误"),
ACCOUNT_PWD_NOT_EXIST(10002,"用户名或密码不存在"),
TOKEN_ERROR(10003,"Token不合法"),
ACCOUNT_EXIST(10004,"账号已存在"),
NO_PERMISSION(70001,"无访问权限"),
SESSION_TIME_OUT(90001,"会话超时"),
NO_LOGIN(90002,"未登录"),
CODE_ERROR(20001,"验证码错误"),
EMAIL_ERROR(20002,"邮箱格式输入错误"),
AVATAR_ERROR(20003,"头像上传失败");
private int code;
private String msg;
ErrorCode(int code, String msg){
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
1.6 Result.java
package com.example.vshop.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class Result {
private boolean success;
private int code;
private String msg;
private Object data;
public static Result success(Object data) {
return new Result(true,200,"success",data);
}
public static Result fail(int code, String msg){
return new Result(false, code, msg, null);
}
}
1.7 JWTUtil.java
package com.example.vshop.utils;
import io.jsonwebtoken.Jwt;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class JWTUtil {
private static final String jwtToken = "sharkToken!@#$$";
public static String createToken(Long userId){
Map<String,Object> claims = new HashMap<>();
claims.put("userId",userId);
JwtBuilder jwtBuilder = Jwts.builder()
.signWith(SignatureAlgorithm.HS256, jwtToken) // 签发算法,秘钥为jwtToken
.setClaims(claims) // body数据,要唯一,自行设置
.setIssuedAt(new Date()) // 设置签发时间
.setExpiration(new Date(System.currentTimeMillis() + 24 * 60 * 60 * 60 * 1000));// 一天的有效时间
String token = jwtBuilder.compact();
return token;
}
public static Map<String, Object> checkToken(String token){
try {
Jwt parse = Jwts.parser().setSigningKey(jwtToken).parse(token);
return (Map<String, Object>) parse.getBody();
}catch (Exception e){
e.printStackTrace();
}
return null;
}
public static Boolean verifyToken(String token){
try {
Jwt parse = Jwts.parser().setSigningKey(jwtToken).parse(token);
return true;
}catch (Exception e){
e.printStackTrace();
}
return false;
}
public static void main(String[] args) {
String token = JWTUtil.createToken(100L);
System.out.println(token);
Map<String, Object> map = JWTUtil.checkToken(token);
System.out.println(map.get("userId"));
}
}
1.8 QiniuUtil.java
package com.example.vshop.utils;
import com.alibaba.fastjson.JSON;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
@Component
public class QiniuUtil {
public static final String url = "http://scfd0gq5y.hb-bkt.clouddn.com/";
//修改以下两个值放到yml中,在密钥管理中获取
@Value("${qiniu.accessKey}")
private String accessKey;
@Value("${qiniu.accessSecretKey}")
private String accessSecretKey;
public boolean upload(MultipartFile file, String fileName) {
//构造一个带指定 Region 对象的配置类
Configuration cfg = new Configuration(Region.huabei());
//...其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);
//...生成上传凭证,然后准备上传,修改上传名称为自己创立空间的空间名称(是你自己的)
String bucket = "[这里是七牛云空间名]";
//默认不指定key的情况下,以文件内容的hash值作为文件名
try {
byte[] uploadBytes = file.getBytes();
Auth auth = Auth.create(accessKey, accessSecretKey);
String upToken = auth.uploadToken(bucket);
Response response = uploadManager.put(uploadBytes, fileName, upToken);
//解析上传成功的结果
DefaultPutRet putRet = JSON.parseObject(response.bodyString(), DefaultPutRet.class);
return true;
} catch (Exception ex) {
ex.printStackTrace();
}
return false;
}
}
现在可以跑起来了
2.用户
2.1页面:
2.2请求:
2.3数据库(忽略rid,这是我用来做测试的,与本项目无关)
2.4User.java
package com.example.vshop.dao.entity;
import lombok.Data;
@Data
public class User {
private Long id;
private String username;
private String userpsw;
private String avatar;
}
2.5 UserParam.java
package com.example.vshop.params;
import lombok.Data;
@Data
public class UserParam {
private Long id;
private String username;
private String userpsw;
private String avatar;
}
2.6 UserVo.java
package com.example.vshop.vo;
import lombok.Data;
@Data
public class UserVo {
private String id;
private String username;
private String userpsw;
private String avatar;
}
2.7 UserMapper.java
package com.example.vshop.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.vshop.dao.entity.User;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper extends BaseMapper<User> {
}
2.8 UserController.java
package com.example.vshop.controller;
import com.example.vshop.params.UserParam;
import com.example.vshop.service.UserService;
import com.example.vshop.utils.QiniuUtil;
import com.example.vshop.vo.Result;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.UUID;
@RestController
@CrossOrigin
@RequestMapping()
public class UserController {
@Autowired
private UserService userService;
@Autowired
private QiniuUtil qiniuUtil;
@PostMapping("login")
public Result login(@RequestBody UserParam userParam) {
return userService.login(userParam);
}
@GetMapping("getInfo")
public Result getInfo(@RequestHeader("Authorization") String token) {
// System.out.println("收到的token:"+token);
return userService.getInfo(token);
}
@GetMapping("logout")
public Result logout(@RequestHeader("Authorization") String token) {
return userService.logout(token);
}
@PostMapping("updatedUser")
public Result updateUser(@RequestBody UserParam userParam){
return userService.updateUser(userParam);
}
@PostMapping("upload")
public Result uploadAvatar(@RequestParam("file") MultipartFile file,@RequestParam("id") Long id,@RequestParam("token") String token) {
System.out.println("id="+id);
System.out.println("上传图片:"+file.getOriginalFilename());
System.out.println(file.getContentType());
String originalFilename = file.getOriginalFilename();
String filename = UUID.randomUUID().toString()+"."+ StringUtils.substringAfterLast(originalFilename,".");
// 上传到七牛云
boolean upload = qiniuUtil.upload(file, filename);
if (!upload) {
return Result.fail(20001,"上传失败");
}
System.out.println("上传成功:"+QiniuUtil.url+filename);
return userService.upload(QiniuUtil.url+filename,id,token);
}
}
2.9 UserService.java
package com.example.vshop.service;
import com.example.vshop.params.UserParam;
import com.example.vshop.vo.Result;
public interface UserService {
Result login(UserParam userParam);
Result getInfo(String token);
Result logout(String token);
Result updateUser(UserParam userParam);
Result upload(String url,Long id,String token);
}
2.10 UserServiceImpl.java
package com.example.vshop.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.vshop.dao.entity.User;
import com.example.vshop.dao.mapper.UserMapper;
import com.example.vshop.params.UserParam;
import com.example.vshop.service.UserService;
import com.example.vshop.utils.JWTUtil;
import com.example.vshop.vo.ErrorCode;
import com.example.vshop.vo.Result;
import com.example.vshop.vo.UserVo;
import io.micrometer.common.util.StringUtils;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private RedisTemplate<String,String> redisTemplate;
private static final String slat = "shark!@#";
@Override
public Result login(UserParam userParam) {
String username = userParam.getUsername();
String userpsw = userParam.getUserpsw();
if(StringUtils.isBlank(username) || StringUtils.isBlank(userpsw)){
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(),ErrorCode.PARAMS_ERROR.getMsg());
}
userpsw = DigestUtils.md5Hex(userpsw+slat);
System.out.println("密码:"+userpsw);
// 查找用户
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<User>();
queryWrapper.eq(User::getUsername, username);
queryWrapper.eq(User::getUserpsw, userpsw);
queryWrapper.select(User::getId,User::getUsername,User::getUserpsw,User::getAvatar);
queryWrapper.last("limit 1");
User user = userMapper.selectOne(queryWrapper);
if (user == null){
return Result.fail(ErrorCode.ACCOUNT_PWD_NOT_EXIST.getCode(),ErrorCode.ACCOUNT_PWD_NOT_EXIST.getMsg());
}
String token = JWTUtil.createToken(user.getId());
redisTemplate.opsForValue().set("TOKEN_"+token, JSON.toJSONString(user),1, TimeUnit.DAYS);
return Result.success(token);
}
@Override
public Result getInfo(String token) {
System.out.println("getInfo :"+token);
if (StringUtils.isBlank(token)){
return Result.fail(ErrorCode.TOKEN_ERROR.getCode(),ErrorCode.TOKEN_ERROR.getMsg());
}
Map<String,Object> stringObjectMap = JWTUtil.checkToken(token);
if (stringObjectMap == null){
return Result.fail(ErrorCode.TOKEN_ERROR.getCode(),ErrorCode.TOKEN_ERROR.getMsg());
}
String userJson = redisTemplate.opsForValue().get("TOKEN_"+token);
if (StringUtils.isBlank(userJson)){
return Result.fail(ErrorCode.TOKEN_ERROR.getCode(),ErrorCode.TOKEN_ERROR.getMsg());
}
User user = JSON.parseObject(userJson, User.class);
if (user == null){
return Result.fail(ErrorCode.TOKEN_ERROR.getCode(),ErrorCode.TOKEN_ERROR.getMsg());
}
UserVo userVo = new UserVo();
userVo.setId(String.valueOf(user.getId()));
userVo.setUsername(user.getUsername());
userVo.setAvatar(user.getAvatar());
return Result.success(userVo);
}
@Override
public Result logout(String token) {
redisTemplate.delete("TOKEN_"+token);
return Result.success(null);
}
@Override
public Result updateUser(UserParam userParam) {
Long id = userParam.getId();
String username = userParam.getUsername();
String userpsw = userParam.getUserpsw();
if(StringUtils.isBlank(String.valueOf(id))
||StringUtils.isBlank(username)
||StringUtils.isBlank(userpsw)){
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(),ErrorCode.PARAMS_ERROR.getMsg());
}
User user = new User();
user.setId(id);
user.setUsername(username);
user.setUserpsw(DigestUtils.md5Hex(userpsw+slat));
this.userMapper.updateById(user);
String token = JWTUtil.createToken(user.getId());
redisTemplate.opsForValue().set("TOKEN_"+token, JSON.toJSONString(user),1, TimeUnit.DAYS);
return Result.success(token);
}
@Override
public Result upload(String url, Long id,String token) {
if (StringUtils.isBlank(url)) {
return Result.fail(ErrorCode.AVATAR_ERROR.getCode(), ErrorCode.AVATAR_ERROR.getMsg());
}
User user = new User();
user.setId(id);
user.setAvatar(url);
this.userMapper.updateById(user);
User newUserInfo = this.userMapper.selectById(user.getId());
System.out.println("更新用户信息:"+newUserInfo);
redisTemplate.opsForValue().set("TOKEN_"+token, JSON.toJSONString(newUserInfo),1, TimeUnit.DAYS);
return Result.success(newUserInfo);
}
}
2.11 测试(别忘了把redis启动起来哦~)
其他也是一样的操作方式,去试试看返回结果怎么样吧
登录进来就是这样的
3.商品分类
3.1 页面(页面有偷懒成分,别介意~)
3.2 请求
3.3 数据库
我们一共也就完成四个功能:增删改查
现在就开始吧
3.4 Sort.java
package com.example.vshop.dao.entity;
import lombok.Data;
@Data
public class Sort {
private Long id;
private String sortname;
private String level;
private String image;
}
3.5 SortParam.java
package com.example.vshop.params;
import lombok.Data;
@Data
public class SortParam {
private String id;
private String sortname;
private String level;
private String image;
}
3.6 SortVo.java
package com.example.vshop.vo;
import lombok.Data;
@Data
public class SortVo {
private String id;
private String sortname;
private String level;
private String image;
}
3.7 SortMapper.java
package com.example.vshop.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.vshop.dao.entity.Sort;
import org.springframework.stereotype.Repository;
@Repository
public interface SortMapper extends BaseMapper<Sort> {
}
3.8 SortController.java
package com.example.vshop.controller;
import com.example.vshop.params.SortParam;
import com.example.vshop.service.SortService;
import com.example.vshop.vo.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@CrossOrigin
@RequestMapping("sorts")
public class SortController {
@Autowired
private SortService sortService;
@GetMapping("sortList")
public Result getSortList(){
return sortService.getSortList();
}
@PostMapping("insertSort")
public Result insertSort(@RequestBody SortParam sortParam){
return sortService.insertSort(sortParam);
}
@PostMapping("updateSort")
public Result updateSort(@RequestBody SortParam sortParam){
return sortService.updateSort(sortParam);
}
@PostMapping("deleteSort/{id}")
public Result deleteSort(@PathVariable("id") Long id){
return sortService.deleteSort(id);
}
}
3.9 SortService.java
package com.example.vshop.service;
import com.example.vshop.params.SortParam;
import com.example.vshop.vo.Result;
public interface SortService {
Result getSortList();
Result insertSort(SortParam sortParam);
Result updateSort(SortParam sort);
Result deleteSort(Long id);
}
3.10 SortServiceImpl.java(这里没写图片上传,因为在用户那部分已经实现了,就不过多展示了)
package com.example.vshop.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.vshop.dao.entity.Sort;
import com.example.vshop.dao.mapper.SortMapper;
import com.example.vshop.params.PageParam;
import com.example.vshop.params.SortParam;
import com.example.vshop.service.SortService;
import com.example.vshop.vo.Result;
import com.example.vshop.vo.SortVo;
import org.springframework.beans.factory.annotation.Autowired;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class SortServiceImpl implements SortService {
@Autowired
private SortMapper sortMapper;
@Override
public Result getSortList() {
LambdaQueryWrapper<Sort> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.select(Sort::getId,Sort::getSortname,Sort::getLevel,Sort::getImage);
List<Sort> sortList = sortMapper.selectList(lambdaQueryWrapper);
List<SortVo> sortVoList = new ArrayList<>();
for (Sort sort : sortList) {
SortVo sortVo = new SortVo();
sortVo.setId(String.valueOf(sort.getId()));
sortVo.setSortname(sort.getSortname());
sortVo.setLevel(sort.getLevel());
sortVo.setImage(sort.getImage());
sortVoList.add(sortVo);
}
return Result.success(sortVoList);
}
@Override
public Result insertSort(SortParam sortParam) {
Sort sort = new Sort();
sort.setSortname(sortParam.getSortname());
sort.setLevel(sortParam.getLevel());
sort.setImage("http://scfd0gq5y.hb-bkt.clouddn.com/606322b7-fbe6-4108-b133-20e404e25826.jpg");
this.sortMapper.insert(sort);
return Result.success(null);
}
@Override
public Result updateSort(SortParam sortParam) {
Sort sort = new Sort();
sort.setId(Long.valueOf(sortParam.getId()));
sort.setSortname(sortParam.getSortname());
sort.setLevel(sortParam.getLevel());
sort.setImage("http://scfd0gq5y.hb-bkt.clouddn.com/606322b7-fbe6-4108-b133-20e404e25826.jpg");
this.sortMapper.updateById(sort);
return Result.success(null);
}
@Override
public Result deleteSort(Long id) {
this.sortMapper.deleteById(id);
return Result.success(null);
}
}
3.11 测试
4. 留个作业
独立完成数据库设计、增删改查功能实现以及举一反三完成多表联查,在做作业的同时理解为什么一个实体类有entity,param和vo 三种不同的表示?期待大家的表现😀
提示: