!77 update 对象存储配置 重构到数据库 动态配置
* 增加对象存储配置sql
* 修改对象存储配置
* Merge branch 'dev' of https://gitee.com/JavaLionLi/RuoYi-Vue-Plus into dev
* 增加对象存储配置
* 增加对象存储配置
已添加11个文件
1309 ■■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOssConfig.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysOssConfigBo.java 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysOssConfigVo.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOssConfigMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOssConfigService.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysOssConfigMapper.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/api/system/sysOssConfig.js 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/views/system/ossConfig/index.vue 495 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/sys_oss_config.sql 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,126 @@
package com.ruoyi.web.controller.system;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.annotation.RepeatSubmit;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysOssConfig;
import com.ruoyi.system.domain.bo.SysOssConfigBo;
import com.ruoyi.system.domain.vo.SysOssConfigVo;
import com.ruoyi.system.service.ISysOssConfigService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Arrays;
import java.util.List;
/**
 * äº‘存储配置Controller
 *
 * @author ruoyi
 * @date 2021-08-11
 */
@Validated
@Api(value = "云存储配置控制器", tags = {"云存储配置管理"})
@RequiredArgsConstructor(onConstructor_ = @Autowired)
@RestController
@RequestMapping("/system/sysOssConfig")
public class SysOssConfigController extends BaseController {
    private final ISysOssConfigService iSysOssConfigService;
    /**
     * æŸ¥è¯¢äº‘存储配置列表
     */
    @ApiOperation("查询云存储配置列表")
    @PreAuthorize("@ss.hasPermi('system:sysOssConfig:list')")
    @GetMapping("/list")
    public TableDataInfo<SysOssConfigVo> list(@Validated SysOssConfigBo bo) {
        return iSysOssConfigService.queryPageList(bo);
    }
    /**
     * èŽ·å–äº‘å­˜å‚¨é…ç½®è¯¦ç»†ä¿¡æ¯
     */
    @ApiOperation("获取云存储配置详细信息")
    @PreAuthorize("@ss.hasPermi('system:sysOssConfig:query')")
    @GetMapping("/{ossConfigId}")
    public AjaxResult<SysOssConfigVo> getInfo(@NotNull(message = "主键不能为空")
                                              @PathVariable("ossConfigId") Integer ossConfigId) {
        return AjaxResult.success(iSysOssConfigService.queryById(ossConfigId));
    }
    /**
     * æ–°å¢žäº‘存储配置
     */
    @ApiOperation("新增云存储配置")
    @PreAuthorize("@ss.hasPermi('system:sysOssConfig:add')")
    @Log(title = "云存储配置", businessType = BusinessType.INSERT)
    @RepeatSubmit()
    @PostMapping()
    public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody SysOssConfigBo bo) {
        if (StringUtils.isNotEmpty(bo.getConfigKey())
            && UserConstants.NOT_UNIQUE.equals(iSysOssConfigService.checkConfigKeyUnique(bo))) {
            return AjaxResult.error("新增云配置'" + bo.getConfigKey() + "'失败,configKey已存在");
        }
        return toAjax(iSysOssConfigService.insertByBo(bo) ? 1 : 0);
    }
    /**
     * ä¿®æ”¹äº‘存储配置
     */
    @ApiOperation("修改云存储配置")
    @PreAuthorize("@ss.hasPermi('system:sysOssConfig:edit')")
    @Log(title = "云存储配置", businessType = BusinessType.UPDATE)
    @RepeatSubmit()
    @PutMapping()
    public AjaxResult<Void> edit(@Validated(EditGroup.class) @RequestBody SysOssConfigBo bo) {
        if (StringUtils.isNotEmpty(bo.getConfigKey())
            && UserConstants.NOT_UNIQUE.equals(iSysOssConfigService.checkConfigKeyUnique(bo))) {
            return AjaxResult.error("修改云配置'" + bo.getConfigKey() + "'失败,configKey已存在");
        }
        return toAjax(iSysOssConfigService.updateByBo(bo) ? 1 : 0);
    }
    /**
     * åˆ é™¤äº‘存储配置
     */
    @ApiOperation("删除云存储配置")
    @PreAuthorize("@ss.hasPermi('system:sysOssConfig:remove')")
    @Log(title = "云存储配置", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ossConfigIds}")
    public AjaxResult<Void> remove(@NotEmpty(message = "主键不能为空")
                                   @PathVariable Integer[] ossConfigIds) {
        List<SysOssConfig> list = iSysOssConfigService.list();
        if(ObjectUtil.isNotNull(list)&&list.size()==1){
            return AjaxResult.error("必须保留一条云配置文件");
        }
        return toAjax(iSysOssConfigService.deleteWithValidByIds(Arrays.asList(ossConfigIds), true) ? 1 : 0);
    }
    /**
     * çŠ¶æ€ä¿®æ”¹
     */
    @PreAuthorize("@ss.hasPermi('system:sysOssConfig:edit')")
    @Log(title = "云存储状态修改", businessType = BusinessType.UPDATE)
    @PutMapping("/changeStatus")
    public AjaxResult changeStatus(@RequestBody SysOssConfig sysOssConfig) {
        return toAjax(iSysOssConfigService.updateOssConfigStatus(sysOssConfig));
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOssConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
package com.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
import java.math.BigDecimal;
/**
 * äº‘存储配置对象 sys_oss_config
 *
 * @author ruoyi
 * @date 2021-08-11
 */
@Data
@NoArgsConstructor
@Accessors(chain = true)
@TableName("sys_oss_config")
public class SysOssConfig implements Serializable {
    private static final long serialVersionUID=1L;
    /**
     * ä¸»å»º
     */
    @TableId(value = "oss_config_id")
    private Integer ossConfigId;
    /**
     * é…ç½®key
     */
    private String configKey;
    /**
     * accessKey
     */
    private String accessKey;
    /**
     * ç§˜é’¥
     */
    private String secretKey;
    /**
     * æ¡¶åç§°
     */
    private String bucketName;
    /**
     * å‰ç¼€
     */
    private String prefix;
    /**
     * è®¿é—®ç«™ç‚¹
     */
    private String endpoint;
    /**
     * æ˜¯å¦htpps(0否 1是)
     */
    private String isHttps;
    /**
     * åŸŸ
     */
    private String region;
    /**
     * çŠ¶æ€(0正常 1停用)
     */
    private String status;
    /**
     * æ‰©å±•字段
     */
    private String ext1;
    /**
     * åˆ›å»ºè€…
     */
    @TableField(fill = FieldFill.INSERT)
    private String createBy;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    /**
     * æ›´æ–°è€…
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    /**
     * å¤‡æ³¨
     */
    private String remark;
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysOssConfigBo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,126 @@
package com.ruoyi.system.domain.bo;
import com.baomidou.mybatisplus.annotation.TableId;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.util.Date;
import com.ruoyi.common.core.domain.BaseEntity;
/**
 * äº‘存储配置业务对象 sys_oss_config
 *
 * @author ruoyi
 * @date 2021-08-11
 */
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel("云存储配置业务对象")
public class SysOssConfigBo extends BaseEntity {
    /**
     * ä¸»å»º
     */
    @ApiModelProperty("主建")
    private Integer ossConfigId;
    /**
     * é…ç½®key
     */
    @ApiModelProperty(value = "configKey", required = true)
    @NotBlank(message = "configKey不能为空", groups = { AddGroup.class, EditGroup.class })
    @Size(min = 2, max = 100, message = "configKey长度必须介于2和20 ä¹‹é—´")
    private String configKey;
    /**
     * accessKey
     */
    @ApiModelProperty(value = "accessKey")
    @NotBlank(message = "accessKey不能为空", groups = { AddGroup.class, EditGroup.class })
    @Size(min = 2, max = 100, message = "accessKey长度必须介于2和100 ä¹‹é—´")
    private String accessKey;
    /**
     * ç§˜é’¥
     */
    @ApiModelProperty(value = "secretKey")
    @NotBlank(message = "secretKey不能为空", groups = { AddGroup.class, EditGroup.class })
    @Size(min = 2, max = 100, message = "secretKey长度必须介于2和100 ä¹‹é—´")
    private String secretKey;
    /**
     * æ¡¶åç§°
     */
    @ApiModelProperty(value = "bucketName")
    @NotBlank(message = "bucketName不能为空", groups = { AddGroup.class, EditGroup.class })
    @Size(min = 2, max = 100, message = "bucketName长度必须介于2和100之间")
    private String bucketName;
    /**
     * å‰ç¼€
     */
    @ApiModelProperty(value = "前缀")
    private String prefix;
    /**
     * è®¿é—®ç«™ç‚¹
     */
    @ApiModelProperty(value = "endpoint")
    @NotBlank(message = "endpoint不能为空", groups = { AddGroup.class, EditGroup.class })
    @Size(min = 2, max = 100, message = "endpoint长度必须介于2和100之间")
    private String endpoint;
    /**
     * æ˜¯å¦htpps(0否 1是)
     */
    @ApiModelProperty(value = "是否htpps(0否 1是)")
    private String isHttps;
    /**
     * åŸŸ
     */
    @ApiModelProperty(value = "region")
    private String region;
    /**
     * æ‰©å±•字段
     */
    @ApiModelProperty(value = "扩展字段")
    private String ext1;
    /**
     * åˆ†é¡µå¤§å°
     */
    @ApiModelProperty("分页大小")
    private Integer pageSize;
    /**
     * å½“前页数
     */
    @ApiModelProperty("当前页数")
    private Integer pageNum;
    /**
     * æŽ’序列
     */
    @ApiModelProperty("排序列")
    private String orderByColumn;
    /**
     * æŽ’序的方向desc或者asc
     */
    @ApiModelProperty(value = "排序的方向", example = "asc,desc")
    private String isAsc;
    /**
     * çŠ¶æ€(0正常 1停用)
     */
    @ApiModelProperty("状态(0正常 1停用)")
    private String status;
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysOssConfigVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,94 @@
package com.ruoyi.system.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.ruoyi.common.annotation.ExcelDictFormat;
import com.ruoyi.common.convert.ExcelDictConvert;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * äº‘存储配置视图对象 sys_oss_config
 *
 * @author ruoyi
 * @date 2021-08-11
 */
@Data
@ApiModel("云存储配置视图对象")
@ExcelIgnoreUnannotated
public class SysOssConfigVo {
    private static final long serialVersionUID = 1L;
    /**
     *  ä¸»å»º
     */
    @ApiModelProperty("主建")
    private Integer ossConfigId;
    /**
     * é…ç½®key
     */
    @ApiModelProperty("配置key")
    private String configKey;
    /**
     * accessKey
     */
    @ApiModelProperty("accessKey")
    private String accessKey;
    /**
     * ç§˜é’¥
     */
    @ApiModelProperty("secretKey")
    private String secretKey;
    /**
     * æ¡¶åç§°
     */
    @ApiModelProperty("桶名称")
    private String bucketName;
    /**
     * å‰ç¼€
     */
    @ApiModelProperty("前缀")
    private String prefix;
    /**
     * è®¿é—®ç«™ç‚¹
     */
    @ApiModelProperty("访问站点")
    private String endpoint;
    /**
     * æ˜¯å¦htpps(0否 1是)
     */
    @ApiModelProperty("是否htpps(0否 1是)")
    private String isHttps;
    /**
     * åŸŸ
     */
    @ApiModelProperty("域")
    private String region;
    /**
     * çŠ¶æ€(0正常 1停用)
     */
    @ApiModelProperty("状态(0正常 1停用)")
    private String status;
    /**
     * æ‰©å±•字段
     */
    @ApiModelProperty("扩展字段")
    private String ext1;
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOssConfigMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.system.mapper;
import com.ruoyi.system.domain.SysOssConfig;
import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus;
import com.ruoyi.common.core.mybatisplus.cache.MybatisPlusRedisCache;
import org.apache.ibatis.annotations.CacheNamespace;
/**
 * äº‘存储配置Mapper接口
 *
 * @author ruoyi
 * @date 2021-08-11
 */
public interface SysOssConfigMapper extends BaseMapperPlus<SysOssConfig> {
}
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOssConfigService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.ruoyi.system.service;
import com.ruoyi.system.domain.SysOssConfig;
import com.ruoyi.system.domain.vo.SysOssConfigVo;
import com.ruoyi.system.domain.bo.SysOssConfigBo;
import com.ruoyi.common.core.mybatisplus.core.IServicePlus;
import com.ruoyi.common.core.page.TableDataInfo;
import java.util.Collection;
import java.util.List;
/**
 * äº‘存储配置Service接口
 *
 * @author ruoyi
 * @date 2021-08-11
 */
public interface ISysOssConfigService extends IServicePlus<SysOssConfig, SysOssConfigVo> {
    /**
     * æŸ¥è¯¢å•个
     * @return
     */
    SysOssConfigVo queryById(Integer ossConfigId);
    /**
     * æŸ¥è¯¢åˆ—表
     */
    TableDataInfo<SysOssConfigVo> queryPageList(SysOssConfigBo bo);
    /**
     * æ ¹æ®æ–°å¢žä¸šåŠ¡å¯¹è±¡æ’å…¥äº‘å­˜å‚¨é…ç½®
     * @param bo äº‘存储配置新增业务对象
     * @return
     */
    Boolean insertByBo(SysOssConfigBo bo);
    /**
     * æ ¹æ®ç¼–辑业务对象修改云存储配置
     * @param bo äº‘存储配置编辑业务对象
     * @return
     */
    Boolean updateByBo(SysOssConfigBo bo);
    /**
     * æ ¡éªŒå¹¶åˆ é™¤æ•°æ®
     * @param ids ä¸»é”®é›†åˆ
     * @param isValid æ˜¯å¦æ ¡éªŒ,true-删除前校验,false-不校验
     * @return
     */
    Boolean deleteWithValidByIds(Collection<Integer> ids, Boolean isValid);
    /**
     * å¯ç”¨åœç”¨çŠ¶æ€
     * @param sysOssConfig
     * @return
     */
    int updateOssConfigStatus(SysOssConfig sysOssConfig);
    /**
     * åˆ¤æ–­configkey是否唯一
     * @param bo
     * @return
     */
    String checkConfigKeyUnique(SysOssConfigBo bo);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,145 @@
package com.ruoyi.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.CustomException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.core.page.PagePlus;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.oss.constant.CloudConstant;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.mapper.SysConfigMapper;
import com.ruoyi.system.service.ISysConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.system.domain.bo.SysOssConfigBo;
import com.ruoyi.system.domain.vo.SysOssConfigVo;
import com.ruoyi.system.domain.SysOssConfig;
import com.ruoyi.system.mapper.SysOssConfigMapper;
import com.ruoyi.system.service.ISysOssConfigService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
 * äº‘存储配置Service业务层处理
 *
 * @author ruoyi
 * @date 2021-08-11
 */
@Service
public class SysOssConfigServiceImpl extends ServicePlusImpl<SysOssConfigMapper, SysOssConfig, SysOssConfigVo> implements ISysOssConfigService {
    @Autowired
    private ISysConfigService iSysConfigService;
    @Autowired
    private SysConfigMapper sysConfigMapper;
    @Autowired
    private RedisCache redisCache;
    @Override
    public SysOssConfigVo queryById(Integer ossConfigId){
        return getVoById(ossConfigId);
    }
    @Override
    public TableDataInfo<SysOssConfigVo> queryPageList(SysOssConfigBo bo) {
        PagePlus<SysOssConfig, SysOssConfigVo> result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo));
        return PageUtils.buildDataInfo(result);
    }
    private LambdaQueryWrapper<SysOssConfig> buildQueryWrapper(SysOssConfigBo bo) {
        Map<String, Object> params = bo.getParams();
        LambdaQueryWrapper<SysOssConfig> lqw = Wrappers.lambdaQuery();
        lqw.eq(StringUtils.isNotBlank(bo.getConfigKey()), SysOssConfig::getConfigKey, bo.getConfigKey());
        lqw.like(StringUtils.isNotBlank(bo.getBucketName()), SysOssConfig::getBucketName, bo.getBucketName());
        return lqw;
    }
    @Override
    public Boolean insertByBo(SysOssConfigBo bo) {
        SysOssConfig add = BeanUtil.toBean(bo, SysOssConfig.class);
        validEntityBeforeSave(add);
        return save(add);
    }
    @Override
    public Boolean updateByBo(SysOssConfigBo bo) {
        SysOssConfig update = BeanUtil.toBean(bo, SysOssConfig.class);
        validEntityBeforeSave(update);
        return updateById(update);
    }
    /**
     * ä¿å­˜å‰çš„æ•°æ®æ ¡éªŒ
     *
     * @param entity å®žä½“类数据
     */
    private void validEntityBeforeSave(SysOssConfig entity){
        //TODO åšä¸€äº›æ•°æ®æ ¡éªŒ,如唯一约束
    }
    @Override
    public Boolean deleteWithValidByIds(Collection<Integer> ids, Boolean isValid) {
        return removeByIds(ids);
    }
    /**
     * åˆ¤æ–­configKey是否唯一
     * @param bo
     * @return
     */
    @Override
    public String checkConfigKeyUnique(SysOssConfigBo bo) {
        Long ossConfigId = StringUtils.isNull(bo.getOssConfigId()) ? -1L : bo.getOssConfigId();
        SysOssConfig info = getOne(new LambdaQueryWrapper<SysOssConfig>()
            .select(SysOssConfig::getOssConfigId, SysOssConfig::getConfigKey)
            .eq(SysOssConfig::getConfigKey, bo.getConfigKey()).last("limit 1"));
        if (StringUtils.isNotNull(info) && info.getOssConfigId().longValue() != ossConfigId.longValue()) {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }
    /**
     * å¯ç”¨ç¦ç”¨çŠ¶æ€
     * @param sysOssConfig
     * @return
     */
    @Override
    public int updateOssConfigStatus(SysOssConfig sysOssConfig) {
        LambdaQueryWrapper<SysConfig> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SysConfig::getConfigKey, CloudConstant.CLOUD_STORAGE_CONFIG_KEY);
        SysConfig sysConfig = sysConfigMapper.selectOne(queryWrapper);
        if(ObjectUtil.isNotNull(sysConfig)){
            sysConfig.setConfigValue(sysOssConfig.getConfigKey());
            iSysConfigService.updateConfig(sysConfig);
        }
        return baseMapper.updateById(sysOssConfig);
    }
    /**
     * è®¾ç½®cache key
     *
     * @param configKey å‚æ•°é”®
     * @return ç¼“存键key
     */
    private String getCacheKey(String configKey) {
        return Constants.SYS_CONFIG_KEY + configKey;
    }
}
ruoyi-system/src/main/resources/mapper/system/SysOssConfigMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
<?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.ruoyi.system.mapper.SysOssConfigMapper">
    <resultMap type="com.ruoyi.system.domain.SysOssConfig" id="SysOssConfigResult">
        <result property="ossConfigId" column="oss_config_id"/>
        <result property="configKey" column="config_key"/>
        <result property="accessKey" column="access_key"/>
        <result property="secretKey" column="secret_key"/>
        <result property="bucketName" column="bucket_name"/>
        <result property="prefix" column="prefix"/>
        <result property="endpoint" column="endpoint"/>
        <result property="isHttps" column="is_https"/>
        <result property="region" column="region"/>
        <result property="status" column="status"/>
        <result property="ext1" column="ext1"/>
        <result property="createBy" column="create_by"/>
        <result property="createTime" column="create_time"/>
        <result property="updateBy" column="update_by"/>
        <result property="updateTime" column="update_time"/>
        <result property="remark" column="remark"/>
    </resultMap>
</mapper>
ruoyi-ui/src/api/system/sysOssConfig.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
import request from '@/utils/request'
// æŸ¥è¯¢äº‘存储配置列表
export function listSysOssConfig(query) {
  return request({
    url: '/system/sysOssConfig/list',
    method: 'get',
    params: query
  })
}
// æŸ¥è¯¢äº‘存储配置详细
export function getSysOssConfig(ossConfigId) {
  return request({
    url: '/system/sysOssConfig/' + ossConfigId,
    method: 'get'
  })
}
// æ–°å¢žäº‘存储配置
export function addSysOssConfig(data) {
  return request({
    url: '/system/sysOssConfig',
    method: 'post',
    data: data
  })
}
// ä¿®æ”¹äº‘存储配置
export function updateSysOssConfig(data) {
  return request({
    url: '/system/sysOssConfig',
    method: 'put',
    data: data
  })
}
// åˆ é™¤äº‘存储配置
export function delSysOssConfig(ossConfigId) {
  return request({
    url: '/system/sysOssConfig/' + ossConfigId,
    method: 'delete'
  })
}
// ç”¨æˆ·çŠ¶æ€ä¿®æ”¹
export function changeOssConfigStatus(ossConfigId, status,configKey) {
  const data = {
    ossConfigId,
    status,
    configKey
  }
  return request({
    url: '/system/sysOssConfig/changeStatus',
    method: 'put',
    data: data
  })
}
ruoyi-ui/src/views/system/ossConfig/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,495 @@
<template>
  <div class="app-container">
    <el-form
      :model="queryParams"
      ref="queryForm"
      :inline="true"
      v-show="showSearch"
      label-width="100px"
    >
      <el-form-item label="configKey" prop="configKey">
        <el-input
          v-model="queryParams.configKey"
          placeholder="请输入configKey"
          clearable
          size="small"
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item label="bucketName" prop="bucketName">
        <el-input
          v-model="queryParams.bucketName"
          placeholder="请输入bucketName"
          clearable
          size="small"
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item>
        <el-button
          type="primary"
          icon="el-icon-search"
          size="mini"
          @click="handleQuery"
          >搜索</el-button
        >
        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
          >重置</el-button
        >
      </el-form-item>
    </el-form>
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button
          type="primary"
          plain
          icon="el-icon-plus"
          size="mini"
          @click="handleAdd"
          v-hasPermi="['system:sysOssConfig:add']"
          >新增</el-button
        >
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="success"
          plain
          icon="el-icon-edit"
          size="mini"
          :disabled="single"
          @click="handleUpdate"
          v-hasPermi="['system:sysOssConfig:edit']"
          >修改</el-button
        >
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="warning"
          plain
          icon="el-icon-download"
          size="mini"
          :loading="exportLoading"
          @click="handleExport"
          v-hasPermi="['system:sysOssConfig:export']"
          >导出</el-button
        >
      </el-col>
      <right-toolbar
        :showSearch.sync="showSearch"
        @queryTable="getList"
      ></right-toolbar>
    </el-row>
    <el-table v-loading="loading" :data="sysOssConfigList">
      <el-table-column
        label="主建"
        align="center"
        prop="ossConfigId"
        v-if="false"
      />
      <el-table-column label="configKey" align="center" prop="configKey" />
      <el-table-column label="accessKey" align="center" prop="accessKey" />
      <el-table-column label="seretKey" align="center" prop="secretKey" />
      <el-table-column label="bucketName" align="center" prop="bucketName" />
      <el-table-column
        label="endpoint"
        width="200"
        align="center"
        prop="endpoint"
      />
      <el-table-column label="前缀" align="center" prop="prefix" />
      <el-table-column
        label="是否htpps"
        align="center"
        prop="isHttps"
        :formatter="isHttpsFormat"
      />
      <el-table-column label="region" align="center" prop="region" />
      <el-table-column label="状态" align="center" prop="status">
        <template slot-scope="scope">
          <el-switch
            v-model="scope.row.status"
            active-value="0"
            inactive-value="1"
            @change="handleStatusChange(scope.row)"
          ></el-switch>
        </template>
      </el-table-column>
      <el-table-column
        label="操作"
        align="center"
        class-name="small-padding fixed-width"
      >
        <template slot-scope="scope">
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="handleUpdate(scope.row)"
            v-hasPermi="['system:sysOssConfig:edit']"
            >修改</el-button
          >
          <el-button
            size="mini"
            type="text"
            icon="el-icon-delete"
            @click="handleDelete(scope.row)"
            v-hasPermi="['system:sysOssConfig:remove']"
            >删除</el-button
          >
        </template>
      </el-table-column>
    </el-table>
    <pagination
      v-show="total > 0"
      :total="total"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />
    <!-- æ·»åŠ æˆ–ä¿®æ”¹äº‘å­˜å‚¨é…ç½®å¯¹è¯æ¡† -->
    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
        <el-form-item label="configKey" prop="configKey">
          <el-row>
            <el-col :span="12">
              <el-select v-model="form.configKey" placeholder="请选择">
                <el-option
                  v-for="item in configKeyOptions"
                  :key="item.configKey"
                  :label="item.label"
                  :value="item.configKey"
                >
                  <span style="float: left">{{ item.configKey }}</span>
                  <span style="float: right; color: #8492a6; font-size: 13px">{{
                    item.label
                  }}</span>
                </el-option>
              </el-select>
            </el-col>
            <el-col :span="12">
              <el-form-item label="bucketName" prop="bucketName">
                <el-input
                  v-model="form.bucketName"
                  placeholder="请输入bucketName"
                />
              </el-form-item>
            </el-col>
          </el-row>
        </el-form-item>
        <el-row>
          <el-col :span="12">
            <el-form-item label="accessKey" prop="accessKey">
              <el-input
                v-model="form.accessKey"
                placeholder="请输入accessKey"
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="secretKey" prop="secretKey">
              <el-input
                v-model="form.secretKey"
                placeholder="请输入secretKey"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-form-item label="endpoint" prop="endpoint">
          <el-input v-model="form.endpoint" placeholder="请输入endpoint" />
        </el-form-item>
        <el-form-item label="前缀" prop="prefix">
          <el-input v-model="form.prefix" placeholder="请输入前缀" />
        </el-form-item>
        <el-row>
          <el-col :span="12">
            <el-form-item label="状态">
              <el-radio-group v-model="form.status">
                <el-radio label="0">启用</el-radio>
                <el-radio label="1">禁用</el-radio>
              </el-radio-group>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="是否htpps">
              <el-radio-group v-model="form.isHttps">
                <el-radio label="0">否</el-radio>
                <el-radio label="1">是</el-radio>
              </el-radio-group>
            </el-form-item>
          </el-col>
        </el-row>
        <el-form-item label="region" prop="region">
          <el-input v-model="form.region" placeholder="请输入region" />
        </el-form-item>
        <el-form-item label="备注" prop="remark">
          <el-input
            v-model="form.remark"
            type="textarea"
            placeholder="请输入内容"
          />
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button :loading="buttonLoading" type="primary" @click="submitForm"
          >ç¡® å®š</el-button
        >
        <el-button @click="cancel">取 æ¶ˆ</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import {
  listSysOssConfig,
  getSysOssConfig,
  delSysOssConfig,
  addSysOssConfig,
  updateSysOssConfig,
  changeOssConfigStatus,
} from "@/api/system/sysOssConfig";
import { downLoadExcel } from "@/utils/download";
export default {
  name: "SysOssConfig",
  data() {
    return {
      // æŒ‰é’®loading
      buttonLoading: false,
      // é®ç½©å±‚
      loading: true,
      // å¯¼å‡ºé®ç½©å±‚
      exportLoading: false,
      // é€‰ä¸­æ•°ç»„
      ids: [],
      // éžå•个禁用
      single: true,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      // æ€»æ¡æ•°
      total: 0,
      // äº‘存储配置表格数据
      sysOssConfigList: [],
      //configKeyOptions
      configKeyOptions: [],
      configKeyDatas: [
        { configKey: "monio", label: "minio" },
        { configKey: "qcloud", label: "腾讯云" },
        { configKey: "aliyun", label: "阿里云" },
        { configKey: "qiniu", label: "七牛云" },
      ],
      // å¼¹å‡ºå±‚标题
      title: "",
      // æ˜¯å¦æ˜¾ç¤ºå¼¹å‡ºå±‚
      open: false,
      // æŸ¥è¯¢å‚æ•°
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        configKey: undefined,
        bucketName: undefined,
      },
      // è¡¨å•参数
      form: {},
      // è¡¨å•校验
      rules: {
        configKey: [
          { required: true, message: "configKey不能为空", trigger: "blur" },
        ],
        accessKey: [
          { required: true, message: "accessKey不能为空", trigger: "blur" },
          {
            min: 2,
            max: 200,
            message: "accessKey长度必须介于 2 å’Œ 100 ä¹‹é—´",
            trigger: "blur",
          },
        ],
        secretKey: [
          { required: true, message: "secretKey不能为空", trigger: "blur" },
          {
            min: 2,
            max: 100,
            message: "secretKey长度必须介于 2 å’Œ 100 ä¹‹é—´",
            trigger: "blur",
          },
        ],
        bucketName: [
          { required: true, message: "bucketName不能为空", trigger: "blur" },
          {
            min: 2,
            max: 100,
            message: "bucketName长度必须介于 2 å’Œ 100 ä¹‹é—´",
            trigger: "blur",
          },
        ],
        endpoint: [
          { required: true, message: "endpoint不能为空", trigger: "blur" },
          {
            min: 2,
            max: 100,
            message: "endpoint名称长度必须介于 2 å’Œ 100 ä¹‹é—´",
            trigger: "blur",
          },
        ],
      },
    };
  },
  created() {
    this.getList();
    this.configKeyOptions = this.configKeyDatas;
  },
  methods: {
    /** æŸ¥è¯¢äº‘存储配置列表 */
    getList() {
      this.loading = true;
      listSysOssConfig(this.queryParams).then((response) => {
        this.sysOssConfigList = response.rows;
        this.total = response.total;
        this.loading = false;
      });
    },
    // æ˜¯å¦htpps字典翻译
    isHttpsFormat(row, column) {
      return row.isHttps == "0" ? "否" : "是";
    },
    // å–消按钮
    cancel() {
      this.open = false;
      this.reset();
    },
    // è¡¨å•重置
    reset() {
      this.form = {
        ossConfigId: undefined,
        configKey: undefined,
        accessKey: undefined,
        secretKey: undefined,
        bucketName: undefined,
        prefix: undefined,
        endpoint: undefined,
        isHttps: "0",
        region: undefined,
        status: "1",
        remark: undefined,
      };
      this.resetForm("form");
    },
    /** æœç´¢æŒ‰é’®æ“ä½œ */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** é‡ç½®æŒ‰é’®æ“ä½œ */
    resetQuery() {
      this.resetForm("queryForm");
      this.handleQuery();
    },
    /** æ–°å¢žæŒ‰é’®æ“ä½œ */
    handleAdd() {
      this.reset();
      this.open = true;
      this.title = "添加云存储配置";
    },
    /** ä¿®æ”¹æŒ‰é’®æ“ä½œ */
    handleUpdate(row) {
      this.loading = true;
      this.reset();
      const ossConfigId = row.ossConfigId || this.ids;
      getSysOssConfig(ossConfigId).then((response) => {
        this.loading = false;
        this.form = response.data;
        this.open = true;
        this.title = "修改云存储配置";
      });
    },
    /** æäº¤æŒ‰é’® */
    submitForm() {
      this.$refs["form"].validate((valid) => {
        if (valid) {
          this.buttonLoading = true;
          if (this.form.ossConfigId != null) {
            updateSysOssConfig(this.form)
              .then((response) => {
                this.msgSuccess("修改成功");
                this.open = false;
                this.getList();
              })
              .finally(() => {
                this.buttonLoading = false;
              });
          } else {
            addSysOssConfig(this.form)
              .then((response) => {
                this.msgSuccess("新增成功");
                this.open = false;
                this.getList();
              })
              .finally(() => {
                this.buttonLoading = false;
              });
          }
        }
      });
    },
    /** åˆ é™¤æŒ‰é’®æ“ä½œ */
    handleDelete(row) {
      const ossConfigIds = row.ossConfigId || this.ids;
      this.$confirm(
        '是否确认删除configKey为"' + row.configKey + '"的数据项?',
        "警告",
        {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning",
        }
      )
        .then(() => {
          return delSysOssConfig(ossConfigIds);
        })
        .then(() => {
          this.loading = false;
          this.getList();
          this.msgSuccess("删除成功");
        })
        .catch(() => {});
    },
    /** å¯¼å‡ºæŒ‰é’®æ“ä½œ */
    handleExport() {
      downLoadExcel("/system/sysOssConfig/export", this.queryParams);
    },
    // äº‘存储配置状态修改
    handleStatusChange(row) {
      let text = row.status === "0" ? "启用" : "停用";
      this.$confirm(
        '确认要"' + text + '""' + row.configKey + '"配置吗?',
        "警告",
        {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning",
        }
      )
        .then(function () {
          return changeOssConfigStatus(
            row.ossConfigId,
            row.status,
            row.configKey
          );
        })
        .then(() => {
          this.msgSuccess(text + "成功");
        })
        .catch(function () {
          row.status = row.status === "0" ? "1" : "0";
        });
    },
  },
};
</script>
sql/sys_oss_config.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
/*
Navicat MySQL Data Transfer
Source Server         : mysql57
Source Server Version : 50735
Source Host           : localhost:3306
Source Database       : ry-vue
Target Server Type    : MYSQL
Target Server Version : 50735
File Encoding         : 65001
Date: 2021-08-12 09:01:33
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for sys_oss_config
-- ----------------------------
DROP TABLE IF EXISTS `sys_oss_config`;
CREATE TABLE `sys_oss_config` (
  `oss_config_id` int(5) NOT NULL AUTO_INCREMENT COMMENT '主建',
  `config_key` varchar(255) NOT NULL DEFAULT '' COMMENT '配置key',
  `access_key` varchar(255) DEFAULT '' COMMENT 'access_key',
  `secret_key` varchar(255) DEFAULT '' COMMENT '秘钥',
  `bucket_name` varchar(255) DEFAULT '' COMMENT '桶名称',
  `prefix` varchar(255) DEFAULT '' COMMENT '前缀',
  `endpoint` varchar(255) DEFAULT '' COMMENT '访问站点',
  `is_https` char(1) DEFAULT '0' COMMENT '是否htpps(0否 1是)',
  `region` varchar(255) DEFAULT '' COMMENT '域',
  `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
  `ext1` varchar(255) DEFAULT '' COMMENT '扩展字段',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`oss_config_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='云存储配置表';
-- ----------------------------
-- Records of sys_oss_config
-- ----------------------------
INSERT INTO `sys_oss_config` VALUES ('1', 'minio3', 'ruoyi', 'ruoyi123', 'ruoyi', '', 'http://localhost:9000', '0', '', '0', '', 'admin', '2021-08-11 21:29:37', 'admin', '2021-08-11 22:52:41', null);