开始尝试从0写一个项目--后端(三)

器材管理

和员工管理基本一致,就不赘述,展示代码为主

新增器材

表设计:

|-------------|--------------|---------|---------|
| 字段名 | 数据类型 | 说明 | 备注 |
| id | bigint | 主键 | 自增 |
| name | varchar(32) | 器材名字 | |
| img | varchar(255) | 图片 | |
| number | BIGINT | 器材数量 | |
| comment | VARCHAR(99) | 器材描述 | |
| status | Int | 器材状态 | 1正常 0锁定 |
| create_time | Datetime | 创建时间 | |
| update_time | datetime | 最后修改时间 | 借走/归还 |
| create_user | bigint | 创建人id | |
| update_user | bigint | 最后修改人id | 借走或者归还 |

sql语句

CREATE TABLE equipment (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,  -- 自增主键
    name VARCHAR(32) NOT NULL,  -- 器材名字,不允许为空
    number BIGINT NOT NULL default 1,  -- 器材数量:默认为1
    comment VARCHAR(99) , -- 器材描述
    status INT NOT NULL DEFAULT 1,  -- 器材状态,默认为1(正常),0表示锁定
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,  -- 创建时间,默认为当前时间
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  -- 最后修改时间,默认为当前时间,并在每次更新时自动更新
    create_user BIGINT NOT NULL,  -- 创建人id,不允许为空
    update_user BIGINT NOT NULL,  -- 最后修改人id,不允许为空
    FOREIGN KEY (create_user) REFERENCES student(id),
    FOREIGN KEY (update_user) REFERENCES student(id)
-- 注意:这里假设create_user和update_user是用户ID,您需要确保这些ID在相应的用户表中存在
);
INSERT INTO equipment VALUES (1,'篮球',10,'这是篮球',1,'2024-07-12','2024-07-12',1,1);

ALTER TABLE equipment ADD COLUMN img VARCHAR(255);

接口设计

请求路径:/admin/equipment

请求方式:POST

请求参数:Headers:"Content-Type": "application/json"

请求体:Body:

id;name,img, number,comment;

返回数据:code;data;msg

代码开发

实体类

创建数据库的器材的封装实体类

sems-pojo/src/main/java/com/ljc/entity/Equipment.java

package com.ljc.entity;


import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.security.SecureRandom;
import java.time.LocalDateTime;

@Data
@Builder  //可是使用builder方式来定义数据
@NoArgsConstructor  //无参构造器
@AllArgsConstructor  //有参构造器
public class Equipment implements Serializable {

    private static final long serialVersionUID = 1L;//告诉Java虚拟机(JVM)这个类的对象是可以被序列化的。

    private Long id;

    private String name;

    //图片
    private String img;

    //器材数量
    private Long number;

    //器材描述
    private String comment;

    private Integer status;

    private LocalDateTime createTime;

    private LocalDateTime updateTime;

    private Long createUser;

    private Long updateUser;

}

接收前端的数据,创建实体类DTO

sems-pojo/src/main/java/com/ljc/dto/EquipmentDTO.java

package com.ljc.dto;

import lombok.Data;

import java.io.Serializable;

@Data
public class EquipmentDTO implements Serializable {

    //器材id
    private Long id;

    //器材名字
    private String name;

    //图片
    private String img;

    //器材数量
    private Long number;

    //器材描述
    private String comment;
}

controller

sems-server/src/main/java/com/ljc/controller/admin/EquipmentController.java

package com.ljc.controller.admin;


import com.ljc.dto.EquipmentDTO;
import com.ljc.result.Result;
import com.ljc.service.EquipmentService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/admin/equipment")
@Slf4j
public class EquipmentController {

    @Autowired
    private EquipmentService equipmentService;

    /**
     * 新增器材
     * @param equipmentDTO
     * @return
     */
    @PostMapping
    @ApiOperation("新增器材")
    public Result save(EquipmentDTO equipmentDTO){
        log.info("新增器材:{}", equipmentDTO);

        equipmentService.save(equipmentDTO);

        return Result.success();
    }
}

service

sems-server/src/main/java/com/ljc/service/EquipmentService.java

package com.ljc.service;

import com.ljc.dto.EquipmentDTO;

public interface EquipmentService {

    /**
     * 新增器材
     * @param equipmentDTO
     */
    void save(EquipmentDTO equipmentDTO);
}

serviceImpl

sems-server/src/main/java/com/ljc/service/impl/EquipmentServiceImpl.java

package com.ljc.service.impl;

import com.ljc.constant.StatusConstant;
import com.ljc.context.BaseContext;
import com.ljc.dto.EquipmentDTO;
import com.ljc.entity.Equipment;
import com.ljc.mapper.EquipmentMapper;
import com.ljc.service.EquipmentService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;

@Service
public class EquipmentServiceImpl implements EquipmentService {


    @Autowired
    private EquipmentMapper equipmentMapper;

    /**
     * 新增器材
     * @param equipmentDTO
     */
    @Override
    public void save(EquipmentDTO equipmentDTO) {

        //1. 先创建一个器材实体类
        Equipment equipment = new Equipment();

        //2. 将DTO数据copy到实体类去
        BeanUtils.copyProperties(equipmentDTO,equipment);

        //2.1 补充其余数据
        //状态:默认为1;
        equipment.setStatus(StatusConstant.ENABLE);

        //修改时间
        equipment.setCreateTime(LocalDateTime.now());
        equipment.setUpdateTime(LocalDateTime.now());

        //创建/修改人id
        equipment.setCreateUser(BaseContext.getCurrentId());
        equipment.setUpdateUser(BaseContext.getCurrentId());

        //3. 调用mapper层查询数据库
        equipmentMapper.insert(equipment);
    }
}

mapper

sems-server/src/main/java/com/ljc/mapper/EquipmentMapper.java

package com.ljc.mapper;


import com.ljc.entity.Equipment;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface EquipmentMapper {

    /**
     * 新增器材
     * @param equipment
     */
    @Insert("insert into equipment (name, img,status,number,comment, create_time, update_time, create_user, update_user)" +
            "VALUES " +
            "(#{name},#{img},#{status},#{number},#{comment},#{createTime},#{updateTime},#{createUser},#{updateUser})")
    void insert(Equipment equipment);
}

测试

//图片后面解决,使用OSS云存储

器材分页查询

接口设计

请求路径:/admin/equipment/page

请求方式:GET

请求参数: name, page, pageSize;

返回数据:code;msg ;data:total,records;

controller层

sems-server/src/main/java/com/ljc/controller/admin/EquipmentController.java

/**
     * 器材分页查询
     * @param equipmentPageQueryDTO
     * @return
     */
    @GetMapping("/page")
    @ApiOperation("器材分页查询")
    public Result<PageResult> page(EquipmentPageQueryDTO equipmentPageQueryDTO){
        log.info("器材分页查询:{}",equipmentPageQueryDTO);

        PageResult pageResult = equipmentService.page(equipmentPageQueryDTO);

        return Result.success(pageResult);

    }

service层

sems-server/src/main/java/com/ljc/service/EquipmentService.java

/**
     * 器材分页查询
     * @param equipmentPageQueryDTO
     * @return
     */
    PageResult page(EquipmentPageQueryDTO equipmentPageQueryDTO);

serviceImpl层

sems-server/src/main/java/com/ljc/service/impl/EquipmentServiceImpl.java

/**
     * 器材分页查询
     * @param equipmentPageQueryDTO
     * @return
     */
    @Override
    public PageResult page(EquipmentPageQueryDTO equipmentPageQueryDTO) {

        PageHelper.startPage(equipmentPageQueryDTO.getPage(),equipmentPageQueryDTO.getPageSize());

        Page<Equipment> page = equipmentMapper.page(equipmentPageQueryDTO);

        long total = page.getTotal();

        List<Equipment> records = page.getResult();

        return new PageResult(total,records);
    }

mapper层

sems-server/src/main/java/com/ljc/mapper/EquipmentMapper.java

/**
     * 器材分页查询
     * @param equipmentPageQueryDTO
     * @return
     */
    Page<Equipment> page(EquipmentPageQueryDTO equipmentPageQueryDTO);

sems-server/src/main/resources/mapper/EquipmentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.ljc.mapper.EquipmentMapper">
    <!--器材分页查询-->
    <select id="page" resultType="com.ljc.entity.Equipment">
        select * from equipment
        <where>
            <if test="name != null and name != ''">
                and name like concat('%',#{name},'%')
            </if>
        </where>
        order by create_time desc
    </select>
</mapper>

测试

禁用启用器材

接口设计

请求路径:/admin/equipment/status/{status}

请求方式:POST

请求参数:application/json

路径参数:status

query:id

返回数据:code;data;msg

代码设计

controller

sems-server/src/main/java/com/ljc/controller/admin/EquipmentController.java

/**
     * 禁用启用器材
     * @param status
     * @param id
     * @return
     */
    @PostMapping("/status/{status}")
    @ApiOperation("禁用启用器材")
    public Result startOrStopEquipmentStatus(@PathVariable Integer status,Long id){
        log.info("禁用启用器材...");

        equipmentService.startOrStopStatus(status,id);

        return Result.success();
    }

service和impl层

sems-server/src/main/java/com/ljc/service/EquipmentService.java

/**
     * 禁用启用器材
     * @param status
     * @param id
     */
    void startOrStopStatus(Integer status, Long id);

sems-server/src/main/java/com/ljc/service/impl/EquipmentServiceImpl.java

/**
     * 禁用启用器材
     * @param status
     * @param id
     */
    @Override
    public void startOrStopStatus(Integer status, Long id) {

        Equipment equipment = Equipment
                .builder()
                .id(id)
                .status(status)
                .build();

        equipmentMapper.update(equipment);
    }

mapper层

sems-server/src/main/java/com/ljc/mapper/EquipmentMapper.java

/**
     * 修改器材表
     * @param equipment
     */
    void update(Equipment equipment);

sems-server/src/main/resources/mapper/EquipmentMapper.xml

<!--修改-->
    <update id="update">
        update equipment
        <set>
            <if test="name != null">name = #{name},</if>
            <if test="img != null">img = #{img},</if>
            <if test="number != null">number = #{number},</if>
            <if test="comment != null">comment = #{comment},</if>
            <if test="status != null">status = #{status},</if>
            <if test="updateTime != null">update_Time = #{updateTime},</if>
            <if test="updateUser != null">update_User = #{updateUser},</if>
        </set>
        where id = #{id}
    </update>

测试

编辑器材信息

接口设计

根据id查询学生

请求路径:/admin/equipment/{id}

请求方法:GET

请求参数:id

返回数据:code;msg;data(equipment类)

编辑学生信息

请求路径:/admin/equipment

请求方法:PUT

请求参数:Headers:application/json

Body:id,name,img,number,comment,status

返回数据:code;msg;data

代码开发

controller

sems-server/src/main/java/com/ljc/controller/admin/EquipmentController.java

/**
     * 根据id查询器材信息
     * @param id
     * @return
     */
    @GetMapping("{id}")
    @ApiOperation("根据id查询器材信息")
    public Result<Equipment> getById(@PathVariable Integer id){
        log.info("根据id查询器材信息....");

        Equipment equipment = equipmentService.getById(id);

        return Result.success(equipment);
    }

    /**
     * 修改器材信息
     * @param equipmentDTO
     * @return
     */
    @PutMapping
    @ApiOperation("修改器材信息")
    public Result updateEquipmentInfo(@RequestBody EquipmentDTO equipmentDTO){
        log.info("修改器材信息...");

        equipmentService.updateEquipmentInfo(equipmentDTO);

        return Result.success();
    }

service

sems-server/src/main/java/com/ljc/service/EquipmentService.java

/**
     * 根据id查询信息
     * @param id
     * @return
     */
    Equipment getById(Integer id);

    /**
     * 修改器材信息
     * @param equipmentDTO
     */
    void updateEquipmentInfo(EquipmentDTO equipmentDTO);

sems-server/src/main/java/com/ljc/service/impl/EquipmentServiceImpl.java

 /**
     * 根据id查询信息
     * @param id
     * @return
     */
    @Override
    public Equipment getById(Integer id) {

        return equipmentMapper.getById(id);
    }

    /**
     * 修改器材信息
     * @param equipmentDTO
     */
    @Override
    public void updateEquipmentInfo(EquipmentDTO equipmentDTO) {
        Equipment equipment = new Equipment();

        BeanUtils.copyProperties(equipmentDTO,equipment);

        equipment.setUpdateUser(BaseContext.getCurrentId());
        equipment.setUpdateTime(LocalDateTime.now());

        equipmentMapper.update(equipment);

    }

mapper

sems-server/src/main/java/com/ljc/mapper/EquipmentMapper.java

/**
     * 根据id查找员工信息
     * @param id
     * @return
     */
    @Select("select * from equipment where id = #{id}")
    Equipment getById(Integer id);

    /**
     * 修改器材表
     * @param equipment
     */
    void update(Equipment equipment);

测试

完整代码

controller

sems-server/src/main/java/com/ljc/controller/admin/EquipmentController.java

package com.ljc.controller.admin;


import com.ljc.dto.EquipmentDTO;
import com.ljc.dto.EquipmentPageQueryDTO;
import com.ljc.entity.Equipment;
import com.ljc.result.PageResult;
import com.ljc.result.Result;
import com.ljc.service.EquipmentService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/admin/equipment")
@Slf4j
@Api(tags = "器材管理")
public class EquipmentController {

    @Autowired
    private EquipmentService equipmentService;

    /**
     * 新增器材
     * @param equipmentDTO
     * @return
     */
    @PostMapping
    @ApiOperation("新增器材")
    public Result save(@RequestBody EquipmentDTO equipmentDTO){
        log.info("新增器材:{}", equipmentDTO);

        equipmentService.save(equipmentDTO);

        return Result.success();
    }


    /**
     * 器材分页查询
     * @param equipmentPageQueryDTO
     * @return
     */
    @GetMapping("/page")
    @ApiOperation("器材分页查询")
    public Result<PageResult> page(EquipmentPageQueryDTO equipmentPageQueryDTO){
        log.info("器材分页查询:{}",equipmentPageQueryDTO);

        PageResult pageResult = equipmentService.page(equipmentPageQueryDTO);

        return Result.success(pageResult);

    }

    /**
     * 禁用启用器材
     * @param status
     * @param id
     * @return
     */
    @PostMapping("/status/{status}")
    @ApiOperation("禁用启用器材")
    public Result startOrStopEquipmentStatus(@PathVariable Integer status,Long id){
        log.info("禁用启用器材...");

        equipmentService.startOrStopStatus(status,id);

        return Result.success();
    }

    /**
     * 根据id查询器材信息
     * @param id
     * @return
     */
    @GetMapping("{id}")
    @ApiOperation("根据id查询器材信息")
    public Result<Equipment> getById(@PathVariable Integer id){
        log.info("根据id查询器材信息....");

        Equipment equipment = equipmentService.getById(id);

        return Result.success(equipment);
    }

    /**
     * 修改器材信息
     * @param equipmentDTO
     * @return
     */
    @PutMapping
    @ApiOperation("修改器材信息")
    public Result updateEquipmentInfo(@RequestBody EquipmentDTO equipmentDTO){
        log.info("修改器材信息...");

        equipmentService.updateEquipmentInfo(equipmentDTO);

        return Result.success();
    }


}

service

sems-server/src/main/java/com/ljc/service/EquipmentService.java

package com.ljc.service;

import com.ljc.dto.EquipmentDTO;
import com.ljc.dto.EquipmentPageQueryDTO;
import com.ljc.entity.Equipment;
import com.ljc.result.PageResult;

public interface EquipmentService {

    /**
     * 新增器材
     * @param equipmentDTO
     */
    void save(EquipmentDTO equipmentDTO);

    /**
     * 器材分页查询
     * @param equipmentPageQueryDTO
     * @return
     */
    PageResult page(EquipmentPageQueryDTO equipmentPageQueryDTO);

    /**
     * 禁用启用器材
     * @param status
     * @param id
     */
    void startOrStopStatus(Integer status, Long id);

    /**
     * 根据id查询信息
     * @param id
     * @return
     */
    Equipment getById(Integer id);

    /**
     * 修改器材信息
     * @param equipmentDTO
     */
    void updateEquipmentInfo(EquipmentDTO equipmentDTO);
}

sems-server/src/main/java/com/ljc/service/impl/EquipmentServiceImpl.java

package com.ljc.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.ljc.constant.StatusConstant;
import com.ljc.context.BaseContext;
import com.ljc.dto.EquipmentDTO;
import com.ljc.dto.EquipmentPageQueryDTO;
import com.ljc.entity.Equipment;
import com.ljc.mapper.EquipmentMapper;
import com.ljc.result.PageResult;
import com.ljc.service.EquipmentService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Service
public class EquipmentServiceImpl implements EquipmentService {


    @Autowired
    private EquipmentMapper equipmentMapper;

    /**
     * 新增器材
     * @param equipmentDTO
     */
    @Override
    public void save(EquipmentDTO equipmentDTO) {

        //1. 先创建一个器材实体类
        Equipment equipment = new Equipment();

        //2. 将DTO数据copy到实体类去
        BeanUtils.copyProperties(equipmentDTO,equipment);

        //2.1 补充其余数据
        //状态:默认为1;
        equipment.setStatus(StatusConstant.ENABLE);

        //修改时间
        equipment.setCreateTime(LocalDateTime.now());
        equipment.setUpdateTime(LocalDateTime.now());

        //创建/修改人id
        equipment.setCreateUser(BaseContext.getCurrentId());
        equipment.setUpdateUser(BaseContext.getCurrentId());

        //3. 调用mapper层查询数据库
        equipmentMapper.insert(equipment);
    }

    /**
     * 器材分页查询
     * @param equipmentPageQueryDTO
     * @return
     */
    @Override
    public PageResult page(EquipmentPageQueryDTO equipmentPageQueryDTO) {

        PageHelper.startPage(equipmentPageQueryDTO.getPage(),equipmentPageQueryDTO.getPageSize());

        Page<Equipment> page = equipmentMapper.page(equipmentPageQueryDTO);

        long total = page.getTotal();

        List<Equipment> records = page.getResult();

        return new PageResult(total,records);
    }

    /**
     * 禁用启用器材
     * @param status
     * @param id
     */
    @Override
    public void startOrStopStatus(Integer status, Long id) {

        Equipment equipment = Equipment
                .builder()
                .id(id)
                .status(status)
                .build();

        equipmentMapper.update(equipment);
    }

    /**
     * 根据id查询信息
     * @param id
     * @return
     */
    @Override
    public Equipment getById(Integer id) {

        return equipmentMapper.getById(id);
    }

    /**
     * 修改器材信息
     * @param equipmentDTO
     */
    @Override
    public void updateEquipmentInfo(EquipmentDTO equipmentDTO) {
        Equipment equipment = new Equipment();

        BeanUtils.copyProperties(equipmentDTO,equipment);

        equipment.setUpdateUser(BaseContext.getCurrentId());
        equipment.setUpdateTime(LocalDateTime.now());

        equipmentMapper.update(equipment);

    }
}

mapper

sems-server/src/main/java/com/ljc/mapper/EquipmentMapper.java

package com.ljc.mapper;


import com.github.pagehelper.Page;
import com.ljc.dto.EquipmentPageQueryDTO;
import com.ljc.entity.Equipment;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface EquipmentMapper {

    /**
     * 新增器材
     * @param equipment
     */
    @Insert("insert into equipment (name, img,status,number,comment, create_time, update_time, create_user, update_user)" +
            "VALUES " +
            "(#{name},#{img},#{status},#{number},#{comment},#{createTime},#{updateTime},#{createUser},#{updateUser})")
    void insert(Equipment equipment);

    /**
     * 器材分页查询
     * @param equipmentPageQueryDTO
     * @return
     */
    Page<Equipment> page(EquipmentPageQueryDTO equipmentPageQueryDTO);

    /**
     * 根据id查找员工信息
     * @param id
     * @return
     */
    @Select("select * from equipment where id = #{id}")
    Equipment getById(Integer id);

    /**
     * 修改器材表
     * @param equipment
     */
    void update(Equipment equipment);
}

sems-server/src/main/resources/mapper/EquipmentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.ljc.mapper.EquipmentMapper">
    <!--修改-->
    <update id="update">
        update equipment
        <set>
            <if test="name != null">name = #{name},</if>
            <if test="img != null">img = #{img},</if>
            <if test="number != null">number = #{number},</if>
            <if test="comment != null">comment = #{comment},</if>
            <if test="status != null">status = #{status},</if>
            <if test="updateTime != null">update_Time = #{updateTime},</if>
            <if test="updateUser != null">update_User = #{updateUser},</if>
        </set>
        where id = #{id}
    </update>

    <!--器材分页查询-->
    <select id="page" resultType="com.ljc.entity.Equipment">
        select * from equipment
        <where>
            <if test="name != null and name != ''">
                and name like concat('%',#{name},'%')
            </if>
        </where>
        order by create_time desc
    </select>
</mapper>

OSS云上传图片

实现步骤:

1). 定义OSS相关配置

sems-server/src/main/resources/application.yml

server:
  port: 8080

spring:
  profiles:
    active: dev
  main:
    allow-circular-references: true
  datasource:
    druid:
      driver-class-name: ${ljc.datasource.driver-class-name}
      url: jdbc:mysql://${ljc.datasource.host}:${ljc.datasource.port}/${ljc.datasource.database}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
      username: ${ljc.datasource.username}
      password: ${ljc.datasource.password}

mybatis:
  #mapper配置文件
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.ljc.entity
  configuration:
    #开启驼峰命名
    map-underscore-to-camel-case: true

logging:
  level:
    com:
      sky:
        mapper: debug
        service: info
        controller: info

ljc:
  jwt:
    # 设置jwt签名加密时使用的秘钥
    admin-secret-key: kussm
    # 设置jwt过期时间
    admin-ttl: 7200000
    # 设置前端传递过来的令牌名称
    admin-token-name: token

  alioss:
    bucket-name: ${ljc.alioss.bucket-name}
    access-key-secret: ${ljc.alioss.access-key-secret}
    access-key-id: ${ljc.alioss.access-key-id}
    endpoint: ${ljc.alioss.endpoint}

sems-server/src/main/resources/application-dev.yml

ljc:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    host: localhost
    port: 3306
    database: sems
    username: root
    password: 8888

  alioss:
    endpoint: oss-cn-hangzhou.aliyuncs.com
    access-key-id: LTAI5tBt5pkXempSC5vPAocu
    access-key-secret: XDMFmdEjA6c8Tl5a4xCg4dF4avoJtM
    bucket-name: kussmcx

2). 读取OSS配置

sems-common/src/main/java/com/ljc/properties/AliOssProperties.java

package com.ljc.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "ljc.alioss")
@Data
public class AliOssProperties {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;

}

3). 生成OSS工具类对象

sems-server/src/main/java/com/ljc/config/OssConfiguration.java

package com.ljc.config;

import com.ljc.properties.AliOssProperties;
import com.ljc.utils.AliOssUtil;
import com.ljc.utils.AliOssUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration//配置类特有的注释
@Slf4j
public class OssConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){
        log.info("开始创建阿里云文件上传工具类对象:{}",aliOssProperties);
        return new AliOssUtil(aliOssProperties.getEndpoint(),
                aliOssProperties.getAccessKeyId(),
                aliOssProperties.getAccessKeySecret(),
                aliOssProperties.getBucketName());
    }
}

其中sems-common/src/main/java/com/ljc/utils/AliOssUtil.java

package com.ljc.utils;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayInputStream;

@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;

    /**
     * 文件上传
     *
     * @param bytes
     * @param objectName
     * @return
     */
    public String upload(byte[] bytes, String objectName) {

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 创建PutObject请求。
            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }

        //文件访问路径规则 https://BucketName.Endpoint/ObjectName
        StringBuilder stringBuilder = new StringBuilder("https://");
        stringBuilder
                .append(bucketName)
                .append(".")
                .append(endpoint)
                .append("/")
                .append(objectName);

        log.info("文件上传到:{}", stringBuilder.toString());

        return stringBuilder.toString();
    }
}

4). 定义文件上传接口

在sems-server/src/main/java/com/ljc/controller/admin/CommonController.java

package com.ljc.controller.admin;

import com.ljc.utils.AliOssUtil;
import com.ljc.constant.MessageConstant;
import com.ljc.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.UUID;

/**
 * 通用接口,上传文件(图片)
 */
@RestController
@RequestMapping("/admin/common")
@Slf4j
@Api(tags = "通用接口")
public class CommonController {
    @Autowired
    private AliOssUtil aliOssUtil;


    @ApiOperation("文件上传")
    @PostMapping("/upload")
    public Result<String> upload(MultipartFile file){
        log.info("文件上传:{}" + file);

        try {
            //objectname使用UUID来生成
            //1.获取原始文件名称
            String originalFilename = file.getOriginalFilename();
            //2.截取文件的后缀
            String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));//获取文件.之后的部分
            //3.构建新文件名称
            String newFilename = UUID.randomUUID().toString() + suffix;
            String filePash =  aliOssUtil.upload(file.getBytes(), newFilename);//调用upload的方法
            return Result.success(filePash);//调用aliossUtil修改后的数据,这样才能将访问路劲改为oss云的;
        } catch (IOException e) {

            log.info(MessageConstant.UPLOAD_FAILED + e);

        }
        return Result.error(MessageConstant.UPLOAD_FAILED);//文件上传失败的常量;

    }

}
相关推荐
爱健身的小刘同学5 分钟前
安装 electron 依赖报错
前端·javascript·electron
耶啵奶膘5 分钟前
uniapp+vue2+uview2.0导航栏组件二次封装
前端·javascript·uni-app
布兰妮甜6 分钟前
如何使用 Tailwind CSS 构建响应式网站:详细指南
前端·css·tailwind css
MavenTalk8 分钟前
前端技术选型之uniapp
android·前端·flutter·ios·uni-app·前端开发
雨中奔跑的小孩10 分钟前
electron打包部署vue项目
javascript·vue.js·electron
paterWang10 分钟前
小程序-基于java+SpringBoot+Vue的美食推荐系统设计与实现
java·spring boot·小程序
《源码好优多》11 分钟前
基于Java Springboot餐饮美食分享平台
java·spring boot·美食
说书客啊14 分钟前
计算机毕业设计 | SpringBoot+vue美食推荐商城 食品零食购物平台(附源码+论文)
java·spring boot·node.js·vue·毕业设计·课程设计·美食
ZZZCY200322 分钟前
路由策略与路由控制实验
前端·网络
小宋102123 分钟前
实现java执行kettle并传参数
java·开发语言·etl