当前位置: 首页 > news >正文

开始尝试从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);//文件上传失败的常量;}}

相关文章:

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

器材管理 和员工管理基本一致&#xff0c;就不赘述&#xff0c;展示代码为主 新增器材 表设计&#xff1a; 字段名 数据类型 说明 备注 id bigint 主键 自增 name varchar(32) 器材名字 img varchar(255) 图片 number BIGINT 器材数量 comment VARC…...

2024年7月解决Docker拉取镜像失败的实用方案,亲测有效

在Ubuntu 16.04、Debian 8、CentOS 7系统中&#xff0c;若遇到Docker拉取镜像失败的问题&#xff0c;以下是一些亲测有效的解决方案&#xff1a; 配置加速地址 首先&#xff0c;创建Docker配置目录&#xff1a;sudo mkdir -p /etc/docker然后&#xff0c;编辑daemon.json文件…...

基于内容的音乐推荐网站/基于ssm的音乐推荐系统/基于协同过滤推荐的音乐网站/基于vue的音乐平台

获取源码联系方式请查看文末&#x1f345; 摘 要 随着信息化时代的到来&#xff0c;系统管理都趋向于智能化、系统化&#xff0c;音乐推荐网站也不例外&#xff0c;但目前国内的有些公司仍然都使用人工管理&#xff0c;公司规模越来越大&#xff0c;同时信息量也越来越庞大&…...

STM32智能工业监控系统教程

目录 引言环境准备智能工业监控系统基础代码实现&#xff1a;实现智能工业监控系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;工业监控与优化问题解决方案与优化收尾与总结 1. 引言 智能工业监控系统通…...

WEB渗透Web突破篇-SQL注入(MYSQL)

注释符 # -- 注意这里有个空格 /* hello */ /*! hello */ /*!32302 10*/ MYSQL version 3.23.02联合查询 得到列数 order by或group by 不断增加数字&#xff0c;直到得到报错响应 1 ORDER BY 1-- #True 1 ORDER BY 2-- #True 1 ORDER BY 3-- #True 1 ORDER BY 4-- #Fal…...

PDF解锁网站

https://smallpdf.com/cn/unlock-pdfhttps://smallpdf.com/cn/unlock-pdfhttps://www.freemypdf.comhttps://www.freemypdf.com...

【Redis】主从复制分析-基础

1 主从节点运行数据的存储 在主从复制中, 对于主节点, 从节点就是自身的一个客户端, 所以和普通的客户端一样, 会被组织为一个 client 的结构体。 typedef struct client {// 省略 } client;同时无论是从节点, 还是主节点, 在运行中的数据都存放在一个 redisServer 的结构体中…...

Transformer自然语言处理实战pdf阅读

一.第一章 欢迎来到transformer的世界 1.解码器-编码器框架 在Transformer出现之前&#xff0c;NLP的最新技术是LSTM等循环架构。这些架 构通过在神经网络连接使用反馈循环&#xff0c;允许信息从一步传播到另一 步&#xff0c;使其成为对文本等序列数据进行建模的理想选择。如…...

Python 高阶语法

前言&#xff1a; 我们通过上篇文章学习了Python的基础语法&#xff0c;接下来我们来学习Python的高阶语法 1.初识对象 在Python中我们可以做到和生活中那样&#xff0c;设计表格、生产表格、填写表格的组织形式的 面向对象包含 3 大主要特性&#xff1a;  封装  继承 …...

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

器材管理板块 添加器材管理导航 src\views\home\Home.vue src\router\index.js src\views\equipment\Equipment.vue <template><div>hello!</div></template> 测试 搜索导航分页查询 src\views\equipment\Equipment.vue <template><div&…...

Visual stdio code 运行C项目环境搭建

参考 [1]VS Code 配置 C/C 编程运行环境&#xff08;保姆级教程&#xff09;_visual studio code c配置-CSDN博客 [2]最新VS code配置C/C环境(tasks.json, launch.json,c_cpp_properties.json)及运行多个文件、配置Cmake_vscode launch.json如何配置-CSDN博客 先装visual stdi…...

免杀笔记 -->API的整理Shellcode加密(过DeFender)

最近更新频率明显下降我懒&#xff0c;那么今天就来记录一下我们的一些常用的API的整理以及ShellCode的加密。 1.WinAPI整理 问我为什么要整理&#xff1f; 就是用起来的时候要左翻右翻 &#xff1a;&#xff1a; 烦死了 1.VirtualAlloc VirtualAlloc(NULL,sizeof(buf),MEM_…...

Stable Diffusion 使用详解(3)---- ControlNet

背景 炼丹师在AI绘画的过程中&#xff0c;由于Stable Diffusion的原理是水滴式的扩散作图原理&#xff0c;其实在前面也有提到&#xff0c;他的发挥是‘不稳定’的&#xff0c;因为你没有办法做到精确控制&#xff0c;只能说是大致符合你的预期。你不能总依赖抽卡固定随机数种…...

pythonGame-实现简单的贪食蛇游戏

通过python简单复现贪食蛇游戏。 使用到的库函数&#xff1a; import pygame import time import random 游戏源码&#xff1a; import pygame import time import randompygame.init()white (255, 255, 255) yellow (255, 255, 102) black (0, 0, 0) red (213, 50, 80…...

2024年软件系统与信息处理国际会议(ICSSIP 2024)即将召开!

2024年软件系统与信息处理国际会议&#xff08;ICSSIP 2024&#xff09;将于2024年10月25-27日在中国昆明举行。引领技术前沿&#xff0c;共谋创新未来。ICSSIP 2024将汇聚来自世界各地的专家学者&#xff0c;他们将在会上分享最新的研究成果、技术突破及实践经验。会议议题涵盖…...

使用vscode连接开发机进行python debug

什么是debug&#xff1f; 当你刚开始学习Python编程时&#xff0c;可能会遇到代码不按预期运行的情况。这时&#xff0c;你就需要用到“debug”了。简单来说&#xff0c;“debug”就是能再程序中设置中断点并支持一行一行地运行代码&#xff0c;观测程序中变量的变化&#xff…...

(家用)汽车充电桩项目总结分析

1. 项目选题背景 &#xff08;1&#xff09;社招&#xff1a;公司想做这个方向&#xff0c;先让学习测试一下&#xff0c;而且不做Web或者APP&#xff0c;以某一个模块或者某一个部分为主 &#xff08;2&#xff09;非社招&#xff1a;之前在学校做的一个学习的项目 2. 充电…...

JMeter接口测试:测试中奖概率!

介绍 Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具&#xff0c;用于对软件做压力测试。JMeter 最初被设计用于 Web 应用测试&#xff0c;但后来扩展到了其他测试领域&#xff0c;可用于测试静态和动态资源&#xff0c;如静态文件、Java 小服务程序、CGI 脚本、J…...

生成式人工智能之路,从马尔可夫链到生成对抗网络

人工智能&#xff08;Artificial intelligence&#xff0c;AI&#xff09;技术在过去几年中取得了显著进展&#xff0c;其中生成式AI&#xff08;Generative AI&#xff09;因其强大的内容生成能力而备受关注。生成式AI可以创建新的文本、图像、音频、视频、代码以及其他形式的…...

qt做的分页控件

介绍 qt做的分页控件 如何使用 创建 Pagination必须基于一个QWidget创建&#xff0c;否则会引发错误。 Pagination* pa new Pagination(QWidget*);设置总页数 Pagination需要设置一个总的页数&#xff0c;来初始化页码。 pa->SetTotalItem(count);设置可选的每页数量…...

MySQL with recursive 用法浅析

目录 写在前面 语句功能 with recursive 语法讲解 细节补充 “union all”语句 添加递归终止条件 写在前面 介绍“with recursive”用法的文章不少&#xff0c;但我都觉得讲的不够通俗&#xff0c;所以干脆自己写一篇。话不多说&#xff0c;进入正题。 语句功能 with r…...

ROS2常用命令集合

文章目录 指令帮助创建功能包功能包查找编译执行节点查看话题服务命令接口命令动作命令参数命令录制控制命令 指令帮助 ros2 --help # 帮助查看命令创建功能包 ros2 pkg create 包名 --build-type 构建类型 --dependencies 依赖列表 --node-name 可执行程序名称功能包查找 …...

VUE 子组件可以直接改变父组件的数据吗

子组件不可以直接改变父组件的数据。‌在Vue中&#xff0c;‌数据流是单向的&#xff0c;‌即父组件通过props向子组件传递数据&#xff0c;‌而子组件不能直接修改父组件的数据。‌这是为了维护数据流动的单向性和数据的可维护性。‌ 如果子组件需要修改父组件的数据&#xf…...

Redis 持久化详解

AOF 持久化 AOF持久化数据恢复相对RDB慢&#xff0c;文件也更大&#xff0c;但数据丢失的风险更小。 AOF 写入 将数据写入Redis内存后&#xff0c;将写数据的命令记录到AOP磁盘文件。 【结构】server.aof_buf 主线程写操作执行完之后&#xff0c;命令会先追加到 Redis 的 se…...

基于riscv64架构的Dayu800开发板的napi_demo开发介绍

itopen组织1、提供OpenHarmony优雅实用的小工具2、手把手适配riscv qemu linux的三方库移植3、未来计划riscv qemu ohos的三方库移植 小程序开发4、一切拥抱开源&#xff0c;拥抱国产化 一、环境准备工作 1.1 Ubuntu20.04环境配置 如果已经配置OpenHarmony的编译环境则…...

HAL STM32 SPI/ABZ/PWM方式读取MT6816磁编码器数据

HAL STM32 SPI/ABZ/PWM方式读取MT6816磁编码器数据 &#x1f4da;MT6816相关资料&#xff08;来自商家的相关资料&#xff09;&#xff1a; 资料&#xff1a;https://pan.baidu.com/s/1CAbdLBRi2dmL4D7cFve1XA?pwd8888 提取码&#xff1a;8888&#x1f4cd;驱动代码编写&…...

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 多选题序号5

基础认证题库请移步&#xff1a;HarmonyOS应用开发者基础认证题库 注&#xff1a;有读者反馈&#xff0c;题库的代码块比较多&#xff0c;打开文章时会卡死。所以笔者将题库拆分&#xff0c;单选题20个为一组&#xff0c;多选题10个为一组&#xff0c;题库目录如下&#xff0c;…...

Tekion 选择 ClickHouse Cloud 提升应用性能和指标监控

本文字数&#xff1a;4187&#xff1b;估计阅读时间&#xff1a;11 分钟 作者&#xff1a;ClickHouse team 本文在公众号【ClickHouseInc】首发 Tekion 由前 Tesla CIO Jay Vijayan 于 2016 年创立&#xff0c;利用大数据、人工智能和物联网等技术&#xff0c;为其汽车客户解决…...

mysql之触发器的使用

cr一&#xff1a;创建goods表和orders表&#xff1b; mysql> use mydb16_tirgeer Database changed mysql> create table goods(-> gid char(8) primary key,-> name varchar(10),-> price decimal(8,2),->-> num int); Query OK, 0 rows affected (0.0…...

使用Java和Hazelcast实现分布式数据存储

使用Java和Hazelcast实现分布式数据存储 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在分布式系统中&#xff0c;实现高效的数据存储和管理是非常重要的。Hazelcast作为一个内存数据网格(IMDG)&…...

Hi3751V560_SELinux

Hi3751V560_SELinux setenforce Enforcing setenforce Permissive(或“setenforce 0”) getenforce V560:demo本身的: [ 13.765161] type=1400 audit(1628821512.905:4): avc: denied { read } for pid=1926 comm="system_server" name="ifindex" d…...

邮件安全篇:邮件反垃圾系统运作机制简介

1. 什么是邮件反垃圾系统&#xff1f; 邮件反垃圾系统是一种专门设计用于检测、过滤和阻止垃圾邮件的技术解决方案。用于保护用户的邮箱免受未经请求的商业广告、诈骗信息、恶意软件、钓鱼攻击和其他非用户意愿接收的电子邮件的侵扰。 反垃圾系统的常见部署形式 2. 邮件反垃圾…...

LoRaWAN设备的两种入网方式(ABP和OTAA)

目录 一、OTAA 1、名词解释 2、入网流程 二、ABP 三、两种入网方式的比较 一、OTAA 1、名词解释 &#xff08;1&#xff09;AppEUI&#xff1a;64位&#xff08;8字节&#xff09;的唯一标识符&#xff0c;用于标识特定的应用程序或组织&#xff08;如果用的是chirpstac…...

【Rust光年纪】极致性能与灵活选择:Rust语言数学优化库详解

Rust语言中的数学优化&#xff1a;六大利器汇总 前言 在当今信息时代&#xff0c;数据处理和数学优化成为了各行各业中不可或缺的重要环节。为了满足对高效、快速计算的需求&#xff0c;Rust语言逐渐成为了许多开发者的首选&#xff0c;因其性能优越、并发安全等特点。本文将…...

机器学习 | 回归算法原理——最小二乘法

Hi&#xff0c;大家好&#xff0c;我是半亩花海。很早便想学习并总结一本很喜欢的机器学习图书——立石贤吾的《白话机器学习的数学》&#xff0c;可谓通俗易懂&#xff0c;清晰形象。那就在此分享并作为学习笔记来记录我的学习过程吧&#xff01;本章的回归算法原理基于《基于…...

.NET Core 中的字符串压缩方法

字符串压缩的概念 字符串压缩通常指的是通过算法减少字符串表示所需的数据量&#xff0c;同时保持字符串的原始信息或能够无损地恢复原始字符串。这种压缩可以是针对文本数据的特定算法&#xff0c;也可以是更通用的数据压缩算法。 .NET Core 中的字符串压缩方法 使用数据压…...

SQL 基础知识

SQL&#xff08;结构化查询语言&#xff09;是一种用于管理和操作关系数据库的标准编程语言。以下是一些 SQL 的基础知识&#xff1a; 基本概念 数据库&#xff08;Database&#xff09;&#xff1a; 存储和管理数据的容器。一个数据库可以包含多个表。 表&#xff08;Table&…...

【数据结构初阶】单链表经典算法题十二道——得道飞升(上篇)

目录 1、移除元素 2、反转链表 3、链表的中间节点 4、合并两个有序链表 Relaxing Time&#xff01;&#xff01;&#xff01; ———————————————— 天气之子幻 ———————————————— 1、移除元素 思路&#xff1a; 创建一个新链表&#xff0…...

Python爬虫技术 第16节 XPath

XPath是一种在XML文档中查找信息的语言&#xff0c;尽管XML和HTML在语法上有区别&#xff0c;但XPath同样适用于HTML文档的解析&#xff0c;尤其是在使用如lxml这样的库时。XPath提供了一种强大的方法来定位和提取XML/HTML文档中的元素和属性。 XPath基础 XPath表达式由路径表…...

本地部署,Whisper: 开源语音识别模型

目录 简介 特点 应用 使用方法 总结 GitHub - openai/whisper: Robust Speech Recognition via Large-Scale Weak SupervisionRobust Speech Recognition via Large-Scale Weak Supervision - openai/whisperhttps://github.com/openai/whisper 简介 Whisper 是一个由 O…...

history,hash缓存那些事

vue-router 中的 createWebHistory&#xff0c;createWebHashHistory两种模式 createWebHistory 是基于 window.history 对象是HTML5提供的用于维护当前标签页浏览历史的对象&#xff0c;主要功能是前进后退和在不刷新页面的情况下&#xff0c;修改地址栏里的URL地址。histor…...

Spring Boot的Web开发

目录 Spring Boot的Web开发 1.静态资源映射规则 第一种静态资源映射规则 2.enjoy模板引擎 3.springMVC 3.1请求处理 RequestMapping DeleteMapping 删除 PutMapping 修改 GetMapping 查询 PostMapping 新增 3.2参数绑定 一.支持数据类型: 3.3常用注解 一.Request…...

Spark 解析嵌套的 JSON 文件

1、什么是嵌套的JSON文件&#xff1f; 嵌套的JSON文件是指文件中包含了嵌套的JSON对象或数组。例如&#xff0c;以下是一个嵌套的JSON文件的示例&#xff1a; {"name": "John","age": 30,"address": {"street": "123…...

VMware虚拟机中CentOS7自定义ip地址并且固定ip

配置固定ip(虚拟机) 前提&#xff1a;虚拟机网络配置成&#xff0c;自定义网络并选择VMnet8(NAT 模式) 操作(如下图)&#xff1a;点击虚拟机–》设置–》–》硬件–》网络适配器–》自定义&#xff1a;特定虚拟网络–》选择&#xff1a;VMnet8(NAT 模式) 虚拟机网络设置 需要记…...

CCS(Code Composer Studio 10.4.0)编译软件中文乱码怎么解决

如果是所有文件都出现了中文乱码这时建议直接在窗口首选项中修改&#xff1a;选择"Window" -> "Preferences"&#xff0c;找到"General" -> "Workspace"&#xff0c;将"Text file encoding"选项设置为"Other&quo…...

Flutter 3 完全支持网页端

Flutter 3 可以用于开发网页端应用。自 Flutter 2.0 起&#xff0c;Flutter 就已经支持 Web 平台&#xff0c;并且在 Flutter 3 中得到了进一步的改进和优化。以下是使用 Flutter 3 开发网页端的一些优势和特点&#xff1a; Flutter 3 开发网页端的优势&#xff1a; 跨平台一致…...

vue.js入门

目录 一. 框架概述 二. vue常用命令 2.1 插值表达式 2.2 v-text 2.3 v-html 2.4 v-on 2.5 v-model 2.6 v-show 2.7 v-if 2.8 v-else 2.9 v-bind 2.10 v-for 三. vue生命周期函数 目录 一. 框架概述 二. vue常用命令 2.1 插值表达式 2.2 v-text 2.3 v-html 2…...

API签名认证

前言&#xff08;项目背景&#xff09;&#xff1a; 这个API签名认证是API开放平台得一个重要环节&#xff0c;我们知道&#xff0c;这个API开发平台&#xff0c;用处就是给客户去调用现成得接口来完成某些事情得。 在讲API签名认证之前&#xff0c;我们先模拟一个场景并且介绍…...

C#进阶-基于.NET Framework 4.x框架实现ASP.NET WebForms项目IP拦截器

在这篇文章中&#xff0c;我们将探讨如何在 ASP.NET WebForms 中实现IP拦截器&#xff0c;以便在 ASMX Web 服务方法 和 HTTP 请求 中根据IP地址进行访问控制。我们将使用自定义的 SoapExtension 和 IHttpModule 来实现这一功能&#xff0c;并根据常用的两种文本传输协议&#…...

前端(1)HTML

1、标签 创建1.html文件&#xff0c;浏览器输入E:/frontheima/1.html&#xff0c;可以访问页面 页面展示 在VSCODE安装IDEA的快捷键&#xff0c;比如ctld复制一行、ctrlx剪切 <p id"p1" title"标题1">Hello,world!</p> <p id"p2"…...