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

news2024/9/21 16:47:34

器材管理

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

新增器材

表设计:

字段名

数据类型

说明

备注

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);//文件上传失败的常量;

    }

}

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

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

相关文章

Elasticsearch 使用误区之三——分片设置不合理

Elasticsearch 是一个强大的搜索和分析引擎&#xff0c;它通过将数据分散到多个节点的分片中来进行分布式处理。 本文将探讨分片大小和策略的概念&#xff0c;以优化 Elasticsearch 的性能并防止过度分片或分片过大等问题。 先看个分片设置不合理的真实企业案例&#xff1a; 10…

陶晶驰串口屏使用记录与教程

首先把串口屏想象成和正点原子usmart调试程序一样的程序&#xff0c;串口屏主芯片有些是GD32 STM32都是主流单片机&#xff0c;里面下载了一些固件形成了现在的操作系统 其实我更喜欢把他们&#xff08;usmart&#xff0c;串口屏主程序&#xff0c;micropython&#xff0c;at指…

uniapp vue3 使用画布分享或者收藏功能

使用HBuilder X 开发小程序&#xff0c;大多数的画布插件很多都是vue2的写法&#xff0c;vue3的很少 我自己也试了很多个插件&#xff0c;但是有一些还是有问题&#xff0c;不好用 海报画板 - DCloud 插件市场 先将插件导入项目中 自己项目亲自用过&#xff0c;功能基本是完善…

GraphRAG:基于实体的本地搜索方法:知识图谱与非结构化数据的融合

GraphRAG&#xff1a;基于实体的本地搜索方法:知识图谱与非结构化数据的融合 在自然语言处理和信息检索领域,如何有效地结合结构化知识和非结构化文本数据一直是一个重要的研究方向。本文介绍一种基于实体的本地搜索方法,该方法巧妙地融合了知识图谱中的结构化数据和输入文档中…

优化冗余代码:提升前端项目开发效率的实用方法

目录 前言代码复用与组件化模块化开发与代码分割工具辅助与自动化结束语 前言 在前端开发中&#xff0c;我们常常会遇到代码冗余的问题&#xff0c;这不仅增加了代码量&#xff0c;还影响了项目的可维护性和开发效率。还有就是有时候会接到紧急业务需求&#xff0c;要求立马完…

打造一篇完美的【数学建模竞赛论文】:从准备到撰写的全面指南

目录 一、赛前准备 1.1 报名与纪律要求 1.2 MD5码上传 1.3 竞赛准备 1.4 时间分配 二、论文格式规范 2.1 摘要 2.2 参考文献 2.3 排版要求 三、建模过程与方法 3.1 问题分析与模型假设 3.2 模型构建与求解 3.3 结果分析与检验 四、论文撰写技巧 4.1 论文结构 4…

Redisson中分布式锁继承体系

直接上图 画了好久 关于非公平锁和公平锁中差异化函数如tryLockInnerAsyc 和unsubscribe还没有时间进行探索&#xff0c;这应该是公平锁和非公平锁之间的差异所在。 说一说Redisson中的类之间关系设计 参考抽象类实现接口_一个抽象之类 如果要实现某个接口怎么办-CSDN博客 众…

电脑文件误删除如何恢复?数据恢复第一步是什么?这五点要第一时间处理!

电脑文件误删除如何恢复&#xff1f;数据删除恢复的第一时间要做什么&#xff0c;你知道吗&#xff1f; 在使用电脑的过程中&#xff0c;误删除重要文件的情况时有发生。面对这种情况&#xff0c;不必过于慌张&#xff0c;因为有多种方法可以帮助你恢复误删除的文件。以下是恢复…

金字塔监督在人脸反欺骗中的应用

介绍 论文地址&#xff1a;https://arxiv.org/pdf/2011.12032.pdf 近年来&#xff0c;人脸识别技术越来越普及。在智能手机解锁和进出机场时&#xff0c;理所当然地会用到它。人脸识别也有望被用于管理今年奥运会的相关人员。但与此同时&#xff0c;人们对人脸欺骗的关注度也…

醒醒,别睡了...讲《数据分析pandas库》了—/—<3>

直接上知识点 一、 1、新建数据框时建立索引 所有的数据框默认都已经使用从 0 开始的自然数索引&#xff0c;因此这里的"建立”索引指的是自定 df pd.DataFrame( {varl : 1.0, var2 :[1,2,3,4], var3 :[test,python,test,hello] , var4 : cons} , index [0,1,2,3]) …

【ESP32 IDF SPI硬件驱动W25Q64】

目录 SPISPI介绍idf配置初始化配置通信 驱动代码 SPI SPI介绍 详细SPI介绍内容参考我之前写的内容【ESP32 IDF 软件模拟SPI驱动 W25Q64存储与读取数组】 idf配置 初始化配置 spi_bus_initialize() 参数1 &#xff1a;spi几&#xff0c;例如spi2,spi3 参数2&#xff1a;…

MySQL体系结构与查询执行流程详解

MySQL 体系结构与查询执行过程详解 MySQL 是一个采用单进程多线程架构模式的关系型数据库管理系统。本文将详细介绍 MySQL 的体系结构及其查询语句的执行过程,并探讨性能优化的关键点。 MySQL 体系结构 MySQL 的架构为 Client-Server 架构。总体上,我们可以将 MySQL 的体系…

python—pandas基础(2)

文章目录 列操作修改变量列筛选变量列使用.loc[]&#xff08;基于标签)使用.iloc[]&#xff08;基于整数位置&#xff09;使用.filter()方法 删除变量列添加变量列 变量类型的转换Pandas 支持的数据类型在不同数据类型间转换 建立索引新建数据框时建立索引读入数据时建立索引指…

如何在宝塔面板给域名配置 SSL 证书

首先需要有证书 这里以阿里云为例 1. 首先进入到 SSL 证书管理控制台 选择个人测试证书&#xff0c;并点击购买 免费的可以使用三个月。 购买完成之后回到控制台。 点击创建证书&#xff0c;将标红的地方填写&#xff0c;其他默认就好。 然后提交审核就行。 这里需要对域名…

JS逆向高级爬虫

JS逆向高级爬虫 JS逆向的目的是通过运行本地JS的文件或者代码,以实现脱离他的网站和浏览器,并且还能拿到和浏览器加密一样的效果。 10.1、编码算法 【1】摘要算法&#xff1a;一切从MD5开始 MD5是一个非常常见的摘要(hash)逻辑. 其特点就是小巧. 速度快. 极难被破解. 所以,…

图像生成中图像质量评估指标—FID介绍

文章目录 1. 背景介绍2. 实际应用3. 总结和讨论 1. 背景介绍 Frchet Inception Distance&#xff08;\textbf{FID}&#xff09;是一种衡量生成模型性能的指标&#xff0c;它基于Inception网络提取的特征来计算模型生成的图像与真实图像集合之间的距离。 FID利用了Inception模…

repo中的default.xml文件project name为什么一样?

文章目录 default.xml文件介绍为什么 name 是一样的&#xff0c;path 不一样&#xff1f;总结 default.xml文件介绍 在 repo 工具的 default.xml 文件中&#xff0c;定义了多个 project 元素&#xff0c;每个元素都代表一个 Git 仓库。 XML 定义了多个不同的 project 元素&…

64.隐藏指定模块

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;63.利用PEB获取模块列表 效果图&#xff1a; 隐藏模块简单实现&#xff1a; #include …

苍穹外卖浏览器前端界面修改

背景&#xff1a; 客户原始方案是期望做一个Spring Boot Vue的饿了么系统&#xff0c;但时间上太仓促&#xff0c;所以建议选择开源的苍穹外码目作为作业提交。 客户接受了建议的方案后&#xff0c;期望对前端页面做一些个性化的定制修改。 过程&#xff1a; 苍穹外卖简单介…

【C++进阶】C++11特性(上)

1、统一列表初始化 1.1 {}初始化 C98的特性用{}统一初始化数组或结构体。 //{}初始化 struct Point {int _x;int _y; }; int main() {int array1[] { 1, 2, 3, 4, 5 };int array2[5] { 0 };Point p { 1, 2 };return 0; } C11则扩大其特性&#xff0c;可以不带进行初始化&…