开始尝试从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,  -- 器材数量:默认为1comment 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 {//器材idprivate 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 {@Autowiredprivate 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 {@Autowiredprivate EquipmentMapper equipmentMapper;/*** 新增器材* @param equipmentDTO*/@Overridepublic 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());//创建/修改人idequipment.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*/@Overridepublic 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*/@Overridepublic 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*/@Overridepublic Equipment getById(Integer id) {return equipmentMapper.getById(id);}/*** 修改器材信息* @param equipmentDTO*/@Overridepublic 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 {@Autowiredprivate 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 {@Autowiredprivate EquipmentMapper equipmentMapper;/*** 新增器材* @param equipmentDTO*/@Overridepublic 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());//创建/修改人idequipment.setCreateUser(BaseContext.getCurrentId());equipment.setUpdateUser(BaseContext.getCurrentId());//3. 调用mapper层查询数据库equipmentMapper.insert(equipment);}/*** 器材分页查询* @param equipmentPageQueryDTO* @return*/@Overridepublic 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*/@Overridepublic void startOrStopStatus(Integer status, Long id) {Equipment equipment = Equipment.builder().id(id).status(status).build();equipmentMapper.update(equipment);}/*** 根据id查询信息* @param id* @return*/@Overridepublic Equipment getById(Integer id) {return equipmentMapper.getById(id);}/*** 修改器材信息* @param equipmentDTO*/@Overridepublic 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: 8080spring:profiles:active: devmain:allow-circular-references: truedatasource: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=trueusername: ${ljc.datasource.username}password: ${ljc.datasource.password}mybatis:#mapper配置文件mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.ljc.entityconfiguration:#开启驼峰命名map-underscore-to-camel-case: truelogging:level:com:sky:mapper: debugservice: infocontroller: infoljc:jwt:# 设置jwt签名加密时使用的秘钥admin-secret-key: kussm# 设置jwt过期时间admin-ttl: 7200000# 设置前端传递过来的令牌名称admin-token-name: tokenalioss: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.Driverhost: localhostport: 3306database: semsusername: rootpassword: 8888alioss:endpoint: oss-cn-hangzhou.aliyuncs.comaccess-key-id: LTAI5tBt5pkXempSC5vPAocuaccess-key-secret: XDMFmdEjA6c8Tl5a4xCg4dF4avoJtMbucket-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@ConditionalOnMissingBeanpublic 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/ObjectNameStringBuilder 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 {@Autowiredprivate 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.mzph.cn/news/876165.shtml

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

相关文章

Hive3:基本介绍

一、概述 Apache Hive是一款分布式SQL计算的工具&#xff0c; 其主要功能是&#xff1a; 将SQL语句翻译成MapReduce程序运行 Hive是单机工具&#xff0c;只需要部署在一台服务器即可。 Hive虽然是单机的&#xff0c;但是它可以提交分布式运行的MapReduce程序运行。 二、基本…

友盟U-APM——优秀的前端性能监控工具

在数字化转型浪潮的推动下,移动应用已成为企业连接用户、驱动业务增长的核心载体。然而,随着应用复杂度的日益提升,用户对于应用性能稳定性的期待也水涨船高。面对应用崩溃、卡顿、加载缓慢等频发问题,如何确保应用的流畅运行,成为产研团队亟待解决的关键挑战。在此背景下,友盟…

苦学Opencv的第九天:模板匹配

Python OpenCV入门到精通学习日记&#xff1a;模板匹配 前言 模板匹配是一种最原始、最基本的识别方法&#xff0c;可以在原始图像中寻找特定图像的位置。模板匹配经常应用于简单的图像查找场景中&#xff0c;例如&#xff0c;在集体合照中找到某个人的位置。 #mermaid-svg-N…

PYTHON学习笔记(八、字符串及的使用)

目录 1、字符串 1.1、字符串的常用操作 1.2、格式化字符串 1.2.1、占位符格式化字符串 1.2.2、f-string格式化字符串 1.2.3、str.format( )格式化字符串 1.3、数据的验证 1.4、正则表达式 1.5.1元字符 1.5.2限定符 1.5.3其他字符 1.5.4re模块 1、字符串 1.1、字符…

PySimpleGUI的安装、使用介绍

PySimpleGUI的安装等介绍 如果直接使用pip命令是无法下载免费版的&#xff0c;通过设置的python Interpreter也不可以下载到5.0.0之前的版本了。 现在已经无法通过pycharm直接获取到PySimpleGUI的免费&#xff08;无需登录&#xff09;版&#xff0c;不过听说可以登入官网然后进…

【JS逆向课件:第十八课:JS操作2】

4.12、BOM对象&#xff08;了解&#xff09; BOM:Broswer object model,即浏览器提供我们开发者在javascript用于操作浏览器的对象。 4.12.1、window对象 窗口方法 // BOM Browser object model 浏览器对象模型// js中最大的一个对象.整个浏览器窗口出现的所有东西都是win…

C++笔记---缺省参数和函数重载

1. 缺省参数 1.1 定义 缺省参数是声明或定义函数时为函数的参数指定一个缺省值&#xff08;默认值&#xff09;。在调用该函数时&#xff0c;如果没有指定实参 则采用该形参的缺省值&#xff0c;否则使用指定的实参&#xff0c;缺省参数分为全缺省和半缺省参数。 void Func(…

docker 安装单机版redis

把这三个放上去 修改成自己的 按照自己需求来 照图片做 vim redis.conf vim startRedis.sh mv startRedis.sh deployRedis.sh sh deployRedis.sh docker run --privilegedtrue \ --name dev.redis --restartalways \ --network dev-net \ -v ./config/redis.conf:/etc/r…

《昇思25天学习打卡营第三十三天|7月26号》

昇思25天学习打卡营 在昇思25天学习打卡营的第33天7月26号&#xff0c;我深入学习了Python编程。通过课程的系统学习和实践编程项目&#xff0c;我逐渐掌握了Python语言的基本语法和核心概念。 特别是在函数定义和数据结构的应用上&#xff0c;我学习到了一些新的东西。以为平…

鸿蒙华为登录(以及导航页面跳转)

//登录华为登录界面以及跳转 //切记一定要写路径&#xff0c;不写路径&#xff0c;容易报错&#xff0c;还有一定要记得导一下包&#xff08;Arouter&#xff09; //接下来是鸿蒙界面导航跳转 //进行跳转 TabContent组件不支持设置通用宽度属性&#xff0c;其宽度默认撑满Tab…

RedHat9 | Ansible 处理任务失败

环境版本说明 RedHat9 [Red Hat Enterprise Linux release 9.0]Ansible [core 2.13.3]Python [3.9.10]jinja [3.1.2] 1. 忽略任务失败 Ansible评估各任务的返回代码&#xff0c;从而确定任务是成功还是失败通常而言&#xff0c;当任务失败时&#xff0c;Ansible将立即在该主…

C++从入门到起飞之——友元内部类匿名对象 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1、友元 2、内部类 3. 匿名对象 4、完结散花 1、友元 • 友元提供了⼀种突破类访问限定符封装的…

自定义prometheus监控获取nginx_upstream指标

1、前言 上篇文章介绍了nginx通过nginx_upstream_check_module模块实现后端健康检查&#xff0c;这篇介绍一下如何自定义prometheus监控获取nginx的upstream指标来实时监控nginx。 2、nginx_upstream_status状态 支持以下三种方式查看nginx_upstream的状态 /status?formatht…

数据结构-C语言-排序(4)

代码位置&#xff1a; test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言&#xff1a; 1.1-排序定义&#xff1a; 排序就是将一组杂乱无章的数据按照一定的规律&#xff08;升序或降序&#xff09;组织起来。(注&#xff1a;我们这里的排序采用的都为升序) 1.2-排…

Artix7系列FPGA实现SDI视频编解码+图像缩放+多路视频拼接,基于GTP高速接口,提供4套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的FPGA图像缩放方案本博已有的已有的FPGA视频拼接叠加融合方案本方案的无缩放应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用 3、详细设计方案设计原理框图S…

JavaScript(17)——事件监听

什么是事件&#xff1f; 事件是在编程时系统内发生的动作或发生的事情&#xff0c;比如用户在网页上单击一个按钮 什么是事件监听&#xff1f; 就是让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立刻调用一个函数做出响应&#xff0c;也称为绑定事件或…

【Javascript】前端面试基础2【每日学习并更新10】

模块化开发是怎样做的&#xff1f; 立即执行函数&#xff0c;不暴露私有成员 异步加载JS的方式有哪些 那些操作会造成内存泄漏 是什么&#xff1a;内存泄漏指任何对象在您不再拥有或需要它之后仍然存在造成内存泄漏&#xff1a; setTimeout的第一个参数使用字符串而非函数的…

认识漏洞-GitLab 远程命令执行漏洞、致远OA-ajax.do未授权任意文件上传漏洞

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 [GitLab 远程命令执行漏洞复现(CVE-2021-22205)](https://mp.weixin.qq.com/s/4QT-vxKpBn4ppNM9ipt-nQ)02 [致远OA-ajax.do未授权任意文件上传Getshell](https://mp.weixin.qq.com/s/TH2A5J5TXU36Y…

使用Claude 3.5 Sonnet和Stable Diffusion XL:如何通过Amazon Bedrock不断优化图像生成直到满足需求

在Amazon Bedrock的AI模型中&#xff0c;Anthropic Claude 3系列现在新增了图像识别功能。特别是最新的Anthropic Claude 3.5 Sonnet&#xff0c;图像识别能力得到了显著提升。我进行了一些简单的试验和比较&#xff0c;深入探索了这些Claude模型在OCR&#xff08;光学字符识别…

HarmonyOS和OpenHarmony区别联系

前言 相信我们在刚开始接触鸿蒙开发的时候经常看到HarmonyOS和OpenHarmony频繁的出现在文章和文档之中&#xff0c;那么这两个名词分别是什么意思&#xff0c;他们之间又有什么联系呢&#xff1f;本文将通过现有的文章和网站内容并与Google的AOSP和Android做对比&#xff0c;带…