springboot+vue3组合式api练手级项目:‘微商城’后台管理系统

springboot练手实战项目说明

项目简单易懂,这里只有后端内容,前端方面不难就不多赘述,大家可以参考后端接口完成前端页面内容

后端使用了七牛云服务存储头像图片,redis缓存登录信息,使用mybatisPlus提高开发效率,有需要学习的同学可以接着往下看了

我的前端是用的vue3+vite  先做前端再做后端,保持好习惯

常用知识(先学习再实战)

Spring常用注解

myBatis的Dao层,Mapper层,controller层,service层,model层,entity层简介

MyBatisPlus的学习文档

必装插件:

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 三种不同的表示?期待大家的表现😀

提示:

【资源说明】 1、基于SpringBoot+Vue3的博客系统源码+项目说明(适合课程设计和毕业设计).zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 4、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于SpringBoot+Vue3的博客系统源码+项目说明(适合课程设计和毕业设计).zip 基于SpringBoot+Vue3的博客系统源码+项目说明(适合课程设计和毕业设计).zip 基于SpringBoot+Vue3的博客系统源码+项目说明(适合课程设计和毕业设计).zip 基于SpringBoot+Vue3的博客系统源码+项目说明(适合课程设计和毕业设计).zip 基于SpringBoot+Vue3的博客系统源码+项目说明(适合课程设计和毕业设计).zip 基于SpringBoot+Vue3的博客系统源码+项目说明(适合课程设计和毕业设计).zip 基于SpringBoot+Vue3的博客系统源码+项目说明(适合课程设计和毕业设计).zip 基于SpringBoot+Vue3的博客系统源码+项目说明(适合课程设计和毕业设计).zip 基于SpringBoot+Vue3的博客系统源码+项目说明(适合课程设计和毕业设计).zip 基于SpringBoot+Vue3的博客系统源码+项目说明(适合课程设计和毕业设计).zip 基于SpringBoot+Vue3的博客系统源码+项目说明(适合课程设计和毕业设计).zip 基于SpringBoot+Vue3的博客系统源码+项目说明(适合课程设计和毕业设计).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值