feat(icon_manage): 新增图标和图标组管理接口

This commit is contained in:
chenwenjian 2023-12-21 10:24:00 +08:00
parent 377d67b353
commit adbb9f1dfa
27 changed files with 1333 additions and 3 deletions

View File

@ -0,0 +1,38 @@
package cn.axzo.oss.client.icon.annotation;
import cn.axzo.oss.client.icon.validator.JsonStringValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 自定义注解用于判断是否是json字符串
*
* @author chenwenjian
* @version 1.0
* @date 2023/12/19 17:49
*/
@Documented
@Constraint(validatedBy = JsonStringValidator.class)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IsJsonString {
/**
* 是否允许为空默认允许
*
* @return true/false
*/
boolean allowBlank() default true;
String message() default "Invalid json string";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}

View File

@ -0,0 +1,83 @@
package cn.axzo.oss.client.icon.controller;
import cn.axzo.oss.client.icon.service.IconDetailService;
import cn.axzo.oss.client.icon.vo.request.IconDetailAddReq;
import cn.axzo.oss.client.icon.vo.request.IconDetailListReq;
import cn.axzo.oss.client.icon.vo.request.IconDetailUpdateReq;
import cn.axzo.oss.client.icon.vo.request.IconDetailUpdateStatus;
import cn.axzo.oss.client.icon.vo.response.IconDetailListResp;
import cn.azxo.framework.common.model.CommonResponse;
import cn.hutool.json.JSONUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 图标详情
*
* @author chenwenjian
* @version 1.0
* @date 2023/12/19 17:25
*/
@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping("/icon")
public class IconDetailController {
private final IconDetailService iconDetailService;
/**
* 新增图标
*
* @param req 图标信息 {@link IconDetailAddReq}
* @return true成功 false失败
*/
@PostMapping("/add")
public CommonResponse<Boolean> add(@RequestBody @Validated IconDetailAddReq req) {
log.info("图标详情req = {}", JSONUtil.toJsonStr(req));
return CommonResponse.success(iconDetailService.add(req));
}
/**
* 更新图标信息
*
* @param req 图标信息 {@link IconDetailUpdateReq}
* @return true成功 false失败
*/
@PostMapping("/update")
public CommonResponse<Boolean> update(@RequestBody @Validated IconDetailUpdateReq req) {
log.info("更新图标信息req = {}", JSONUtil.toJsonStr(req));
return CommonResponse.success(iconDetailService.update(req));
}
/**
* 更新图标状态
*
* @param req 图标信息 {@link IconDetailUpdateStatus}
* @return true成功 false失败
*/
@PostMapping("/updateStatus")
public CommonResponse<Boolean> updateStatus(@RequestBody @Validated IconDetailUpdateStatus req) {
log.info("更新图标状态req = {}", JSONUtil.toJsonStr(req));
return CommonResponse.success(iconDetailService.updateStatus(req.getId(), req.getStatus()));
}
/**
* 图标列表
*
* @param req 图标信息 {@link IconDetailListReq}
* @return 图标列表按创建时间倒序 {@link IconDetailListResp}
*/
@GetMapping("/list")
public CommonResponse<List<IconDetailListResp>> list(@RequestBody IconDetailListReq req) {
return CommonResponse.success(iconDetailService.list(req));
}
}

View File

@ -0,0 +1,84 @@
package cn.axzo.oss.client.icon.controller;
import cn.axzo.oss.client.icon.service.IconGroupService;
import cn.axzo.oss.client.icon.vo.request.IconGroupAddReq;
import cn.axzo.oss.client.icon.vo.request.IconGroupListReq;
import cn.axzo.oss.client.icon.vo.request.IconGroupUpdateReq;
import cn.axzo.oss.client.icon.vo.request.IconGroupUpdateStatusReq;
import cn.axzo.oss.client.icon.vo.response.IconGroupListResp;
import cn.azxo.framework.common.model.CommonResponse;
import cn.hutool.json.JSONUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 图标组管理
*
* @author chenwenjian
* @version 1.0
* @date 2023/12/19 17:27
*/
@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping("/icon/group")
public class IconGroupController {
private final IconGroupService iconGroupService;
/**
* 新增图标组
*
* @param req 图标组信息 {@link IconGroupAddReq}
* @return 响应结果成功返回true失败返回false
*/
@PostMapping("/add")
public CommonResponse<Boolean> add(@RequestBody @Validated IconGroupAddReq req) {
log.info("新增图标组req = {}", JSONUtil.toJsonStr(req));
return CommonResponse.success(iconGroupService.add(req));
}
/**
* 更新图标组信息
*
* @param req 图标组信息 {@link IconGroupUpdateReq}
* @return 响应结果成功返回true失败返回false
*/
@PostMapping("/update")
public CommonResponse<Boolean> update(@RequestBody @Validated IconGroupUpdateReq req) {
log.info("更新图标组信息req = {}", JSONUtil.toJsonStr(req));
return CommonResponse.success(iconGroupService.update(req));
}
/**
* 编辑图标组状态同时将该组下所有图标状态更新
*
* @param req 图标组信息 {@link IconGroupUpdateStatusReq}
* @return 响应结果成功返回true失败返回false
*/
@PostMapping("/updateStatus")
public CommonResponse<Boolean> updateStatus(@RequestBody @Validated IconGroupUpdateStatusReq req) {
log.info("更新图标组状态id = {}status = {}", req.getId(), req.getStatus());
return CommonResponse.success(iconGroupService.updateStatus(req.getId(), req.getStatus()));
}
/**
* 获取图标组列表
*
* @param req 图标组列表查询条件 {@link IconGroupListReq}
* @return 图标组列表按创建时间倒序 {@link IconGroupListResp}
*/
@PostMapping("/list")
public CommonResponse<List<IconGroupListResp>> list(@RequestBody IconGroupListReq req) {
log.info("获取图标组列表req = {}", JSONUtil.toJsonStr(req));
return CommonResponse.success(iconGroupService.list(req));
}
}

View File

@ -0,0 +1,99 @@
package cn.axzo.oss.client.icon.entity;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* 图标详情
*
* @author chenwenjian
* @version 1.0
* @date 2023/12/19 15:58
*/
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@TableName("icon_detail")
public class IconDetail extends Model<IconDetail> {
/**
* 主键
*/
@TableField("id")
private Long id;
/**
* 图标组ID
*/
@TableField("group_id")
private Long groupId;
/**
* 图标名称
*/
@TableField("name")
private String name;
/**
* 图标地址
*/
@TableField("url")
private String url;
/**
* 图标存储大小单位KB
*/
@TableField("size")
private Double size;
/**
* 尺寸-单位mm
*/
@TableField("weight")
private Integer weight;
/**
* 尺寸-单位mm
*/
@TableField("height")
private Integer height;
/**
* 图标状态0-未使用1-使用中2-已弃用默认0
*/
@TableField("status")
private Integer status;
/**
* 扩展信息json
*/
@TableField("ext")
private String ext;
/**
* 是否删除(0:未删除;1:已删除)
*/
@TableField("is_delete")
private Integer isDelete;
/**
* 创建时间
*/
@TableField("create_at")
private Date createAt;
/**
* 修改时间
*/
@TableField("update_at")
private Date updateAt;
}

View File

@ -0,0 +1,73 @@
package cn.axzo.oss.client.icon.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* 图标组
*
* @author chenwenjian
* @version 1.0
* @date 2023/12/19 17:11
*/
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@TableName("icon_group")
public class IconGroup extends Model<IconGroup> {
/**
* 主键
*/
@TableField("id")
private Long id;
/**
* 终端例如pch5
*/
@TableField("terminal")
private String terminal;
/**
* 图标组例如cmsomscmp
*/
@TableField("group")
private String group;
/**
* 图标组状态0-未使用1-使用中2-已弃用默认0
*/
@TableField("status")
private Integer status;
/**
* 扩展信息json
*/
@TableField("ext")
private String ext;
/**
* 是否删除(0:未删除;1:已删除)
*/
@TableField("is_delete")
private Integer isDelete;
/**
* 创建时间
*/
@TableField("create_at")
private Date createAt;
/**
* 修改时间
*/
@TableField("update_at")
private Date updateAt;
}

View File

@ -0,0 +1,16 @@
package cn.axzo.oss.client.icon.mapper;
import cn.axzo.oss.client.icon.entity.IconDetail;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 图标详情Mapper
*
* @author chenwenjian
* @version 1.0
* @date 2023/12/19 17:16
*/
@Mapper
public interface IconDetailMapper extends BaseMapper<IconDetail> {
}

View File

@ -0,0 +1,16 @@
package cn.axzo.oss.client.icon.mapper;
import cn.axzo.oss.client.icon.entity.IconGroup;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 图标分组Mapper
*
* @author chenwenjian
* @version 1.0
* @date 2023/12/19 17:18
*/
@Mapper
public interface IconGroupMapper extends BaseMapper<IconGroup> {
}

View File

@ -0,0 +1,8 @@
/**
* axzo图标管理
*
* @author chenwenjian
* @date 2023/12/19 15:57
* @version 1.0
*/
package cn.axzo.oss.client.icon;

View File

@ -0,0 +1,16 @@
package cn.axzo.oss.client.icon.repository;
import cn.axzo.oss.client.icon.entity.IconDetail;
import cn.axzo.oss.client.icon.mapper.IconDetailMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Repository;
/**
* @author chenwenjian
* @version 1.0
* @date 2023/12/19 17:19
*/
@Repository
public class IconDetailRepository extends ServiceImpl<IconDetailMapper, IconDetail> {
}

View File

@ -0,0 +1,15 @@
package cn.axzo.oss.client.icon.repository;
import cn.axzo.oss.client.icon.entity.IconGroup;
import cn.axzo.oss.client.icon.mapper.IconGroupMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Repository;
/**
* @author chenwenjian
* @version 1.0
* @date 2023/12/19 17:23
*/
@Repository
public class IconGroupRepository extends ServiceImpl<IconGroupMapper, IconGroup> {
}

View File

@ -0,0 +1,50 @@
package cn.axzo.oss.client.icon.service;
import cn.axzo.oss.client.icon.vo.request.IconDetailAddReq;
import cn.axzo.oss.client.icon.vo.request.IconDetailListReq;
import cn.axzo.oss.client.icon.vo.request.IconDetailUpdateReq;
import cn.axzo.oss.client.icon.vo.request.IconDetailUpdateStatus;
import cn.axzo.oss.client.icon.vo.response.IconDetailListResp;
import java.util.List;
/**
* @author chenwenjian
* @version 1.0
* @date 2023/12/19 17:24
*/
public interface IconDetailService {
/**
* 新增图标
*
* @param req 图标信息 {@link IconDetailAddReq}
* @return true成功 false失败
*/
Boolean add(IconDetailAddReq req);
/**
* 更新图标信息
*
* @param req 图标信息 {@link IconDetailUpdateReq}
* @return true成功 false失败
*/
Boolean update(IconDetailUpdateReq req);
/**
* 更新图标状态
*
* @param id 图标id
* @param status 状态
* @return true成功 false失败
*/
Boolean updateStatus(Long id, Integer status);
/**
* 图标列表
*
* @param req 图标列表请求 {@link IconDetailListReq}
* @return 图标列表
*/
List<IconDetailListResp> list(IconDetailListReq req);
}

View File

@ -0,0 +1,48 @@
package cn.axzo.oss.client.icon.service;
import cn.axzo.oss.client.icon.vo.request.IconGroupAddReq;
import cn.axzo.oss.client.icon.vo.request.IconGroupListReq;
import cn.axzo.oss.client.icon.vo.request.IconGroupUpdateReq;
import cn.axzo.oss.client.icon.vo.response.IconGroupListResp;
import java.util.List;
/**
* @author chenwenjian
* @version 1.0
* @date 2023/12/19 17:23
*/
public interface IconGroupService {
/**
* 添加图标组
*
* @param req 图标组信息 {@link IconGroupAddReq}
* @return true:添加成功 false:添加失败
*/
Boolean add(IconGroupAddReq req);
/**
* 修改图标组信息
*
* @param req 图标组信息 {@link IconGroupUpdateReq}
* @return true:修改成功 false:修改失败
*/
Boolean update(IconGroupUpdateReq req);
/**
* 修改图标组状态
*
* @param id 图标组id
* @param status 状态0-未使用1-使用中2-已弃用
* @return true:修改成功 false:修改失败
*/
Boolean updateStatus(Long id, Integer status);
/**
* 查询图标组列表
*
* @return 图标组列表 {@link IconGroupListResp}
*/
List<IconGroupListResp> list(IconGroupListReq req);
}

View File

@ -0,0 +1,145 @@
package cn.axzo.oss.client.icon.service.impl;
import cn.axzo.basics.common.BeanMapper;
import cn.axzo.oss.client.icon.entity.IconDetail;
import cn.axzo.oss.client.icon.entity.IconGroup;
import cn.axzo.oss.client.icon.mapper.IconDetailMapper;
import cn.axzo.oss.client.icon.repository.IconDetailRepository;
import cn.axzo.oss.client.icon.repository.IconGroupRepository;
import cn.axzo.oss.client.icon.service.IconDetailService;
import cn.axzo.oss.client.icon.vo.request.IconDetailAddReq;
import cn.axzo.oss.client.icon.vo.request.IconDetailListReq;
import cn.axzo.oss.client.icon.vo.request.IconDetailUpdateReq;
import cn.axzo.oss.client.icon.vo.response.IconDetailListResp;
import cn.axzo.oss.common.enums.CodeEnum;
import cn.axzo.oss.common.exception.BizException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author chenwenjian
* @version 1.0
* @date 2023/12/19 17:25
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class IconDetailServiceImpl implements IconDetailService {
private final IconGroupRepository iconGroupRepository;
private final IconDetailRepository iconDetailRepository;
/**
* 新增图标
*
* @param req 图标信息 {@link IconDetailAddReq}
* @return true成功 false失败
*/
@Override
public Boolean add(IconDetailAddReq req) {
IconDetail iconDetail = iconDetailRepository.lambdaQuery()
.eq(IconDetail::getGroupId, req.getGroupId())
.eq(IconDetail::getName, req.getName())
.eq(IconDetail::getIsDelete, 0)
.apply("limit 1")
.one();
// 存在
BizException.error(Objects.isNull(iconDetail), CodeEnum.ICON_EXIST);
return iconDetailRepository.save(BeanMapper.copyBean(req, IconDetail.class));
}
/**
* 修改图标
*
* @param req 图标信息 {@link IconDetailUpdateReq}
* @return true成功 false失败
*/
@Override
public Boolean update(IconDetailUpdateReq req) {
IconDetail iconDetail = iconDetailRepository.getById(req.getId());
if (Objects.isNull(iconDetail)) {
return true;
}
return iconDetailRepository.lambdaUpdate()
.eq(IconDetail::getId, req.getId())
.set(IconDetail::getGroupId, req.getGroupId())
.set(IconDetail::getName, req.getName())
.set(IconDetail::getExt, req.getExt())
.update();
}
/**
* 修改图标状态
*
* @param id 图标id
* @param status 状态
* @return true成功 false失败
*/
@Override
public Boolean updateStatus(Long id, Integer status) {
IconDetail iconDetail = iconDetailRepository.getById(id);
if (Objects.isNull(iconDetail)) {
return true;
}
// 状态未变则不修改
if (Objects.equals(iconDetail.getStatus(), status)) {
return true;
}
// 修改状态
iconDetail.setStatus(status);
return iconDetailRepository.updateById(iconDetail);
}
/**
* 图标列表
*
* @param req 图标列表查询参数 {@link IconDetailListReq}
* @return 图标列表 {@link IconDetailListResp}
*/
@Override
public List<IconDetailListResp> list(IconDetailListReq req) {
// 查询图标列表
List<IconDetail> iconDetailList = iconDetailRepository.lambdaQuery()
.eq(IconDetail::getIsDelete, 0)
.in(!CollectionUtils.isEmpty(req.getGroupIds()), IconDetail::getGroupId, req.getGroupIds())
.in(!CollectionUtils.isEmpty(req.getIds()), IconDetail::getId, req.getIds())
.like(StringUtils.hasText(req.getName()), IconDetail::getName, req)
.in(!CollectionUtils.isEmpty(req.getStatuses()), IconDetail::getStatus, req.getStatuses())
.orderByDesc(IconDetail::getCreateAt)
.list();
if (CollectionUtils.isEmpty(iconDetailList)) {
return Collections.emptyList();
}
List<Long> groupIds = iconDetailList.stream()
.mapToLong(IconDetail::getGroupId)
.distinct()
.boxed()
.collect(Collectors.toList());
// 查询分组信息
List<IconGroup> iconGroups = iconGroupRepository.listByIds(groupIds);
BizException.error(!CollectionUtils.isEmpty(iconGroups), 500, "数据异常");
Map<Long, IconGroup> groupMap = iconGroups.stream().collect(Collectors.toMap(IconGroup::getId, Function.identity()));
return BeanMapper.copyList(iconDetailList, IconDetailListResp.class, (iconDetail, iconDetailListResp) -> {
iconDetailListResp.setTerminal(groupMap.get(iconDetail.getGroupId()).getTerminal());
iconDetailListResp.setGroupName(groupMap.get(iconDetail.getGroupId()).getGroup());
});
}
}

View File

@ -0,0 +1,124 @@
package cn.axzo.oss.client.icon.service.impl;
import cn.axzo.basics.common.BeanMapper;
import cn.axzo.oss.client.icon.entity.IconDetail;
import cn.axzo.oss.client.icon.entity.IconGroup;
import cn.axzo.oss.client.icon.repository.IconDetailRepository;
import cn.axzo.oss.client.icon.repository.IconGroupRepository;
import cn.axzo.oss.client.icon.service.IconGroupService;
import cn.axzo.oss.client.icon.vo.request.IconGroupAddReq;
import cn.axzo.oss.client.icon.vo.request.IconGroupListReq;
import cn.axzo.oss.client.icon.vo.request.IconGroupUpdateReq;
import cn.axzo.oss.client.icon.vo.response.IconGroupListResp;
import cn.axzo.oss.common.enums.CodeEnum;
import cn.axzo.oss.common.exception.BizException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Objects;
/**
* @author chenwenjian
* @version 1.0
* @date 2023/12/19 17:24
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class IconGroupServiceImpl implements IconGroupService {
private final IconGroupRepository iconGroupRepository;
private final IconDetailRepository iconDetailRepository;
/**
* 新增图标组
*
* @param req 图标组信息
* @return true:添加成功 false:添加失败
*/
@Override
public Boolean add(IconGroupAddReq req) {
// 检查该图标组是否已存在
IconGroup iconGroup = iconGroupRepository.lambdaQuery()
.eq(IconGroup::getTerminal, req.getTerminal())
.eq(IconGroup::getGroup, req.getGroup())
.eq(IconGroup::getIsDelete, 0)
.apply("limit 1")
.one();
// 存在
BizException.error(Objects.isNull(iconGroup), CodeEnum.ICON_GROUP_EXIST);
return iconGroupRepository.save(BeanMapper.copyBean(req, IconGroup.class));
}
/**
* 修改图标组信息
*
* @param req 图标组信息
* @return true:修改成功 false:修改失败
*/
@Override
public Boolean update(IconGroupUpdateReq req) {
// 查询图标组信息
IconGroup iconGroup = iconGroupRepository.getById(req.getId());
if (Objects.isNull(iconGroup)) {
return true;
}
return iconGroupRepository.lambdaUpdate()
.eq(IconGroup::getId, req.getId())
.set(IconGroup::getGroup, req.getGroup())
.set(IconGroup::getExt, req.getExt())
.update();
}
/**
* 修改图标组状态
*
* @param id 图标组id
* @param status 状态0-未使用1-使用中2-已弃用
* @return true:修改成功 false:修改失败
*/
@Override
@Transactional
public Boolean updateStatus(Long id, Integer status) {
// 查询图标组信息
IconGroup iconGroup = iconGroupRepository.getById(id);
if (Objects.isNull(iconGroup)) {
return true;
}
// 状态未变则不修改
if (Objects.equals(iconGroup.getStatus(), status)) {
return true;
}
// 修改状态并修改该图标组下所有图标的状态
iconGroup.setStatus(status);
iconDetailRepository.lambdaUpdate()
.eq(IconDetail::getGroupId, iconGroup.getId())
.eq(IconDetail::getIsDelete, 0)
.set(IconDetail::getStatus, status)
.update();
return iconGroupRepository.updateById(iconGroup);
}
/**
* 查询图标组列表
*
* @param req 图标组列表条件
* @return 图标组列表
*/
@Override
public List<IconGroupListResp> list(IconGroupListReq req) {
List<IconGroup> iconGroups = iconGroupRepository.lambdaQuery()
.eq(IconGroup::getIsDelete, 0)
.in(!CollectionUtils.isEmpty(req.getTerminals()), IconGroup::getTerminal, req.getTerminals())
.in(!CollectionUtils.isEmpty(req.getGroups()), IconGroup::getGroup, req.getGroups())
.in(CollectionUtils.isEmpty(req.getStatuses()), IconGroup::getStatus, req.getStatuses())
.orderByDesc(IconGroup::getCreateAt)
.list();
return BeanMapper.copyList(iconGroups, IconGroupListResp.class);
}
}

View File

@ -0,0 +1,37 @@
package cn.axzo.oss.client.icon.validator;
import cn.axzo.oss.client.icon.annotation.IsJsonString;
import com.alibaba.fastjson.JSON;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* json字符串校验器
*
* @author chenwenjian
* @version 1.0
* @date 2023/12/19 17:55
*/
public class JsonStringValidator implements ConstraintValidator<IsJsonString, String> {
private boolean allowBlank = true;
@Override
public void initialize(IsJsonString constraintAnnotation) {
allowBlank = constraintAnnotation.allowBlank();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null || value.isEmpty()) {
return allowBlank;
}
try {
Object o = JSON.parse(value);
return true;
} catch (Exception e) {
return false;
}
}
}

View File

@ -0,0 +1,71 @@
package cn.axzo.oss.client.icon.vo.request;
import cn.axzo.oss.client.icon.annotation.IsJsonString;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
* @author chenwenjian
* @version 1.0
* @date 2023/12/20 17:32
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IconDetailAddReq {
/**
* 图标组ID
*/
@NotNull(message = "图标组id不能为空")
private Long groupId;
/**
* 图标名称
*/
@NotBlank(message = "图标名称不能为空")
private String name;
/**
* 图标地址
*/
@NotBlank(message = "图标地址不能为空")
private String url;
/**
* 图标存储大小单位KB
*/
@Min(value = 0, message = "图标存储大小不能小于0")
@NotNull(message = "图标存储大小不能为空")
private Double size;
/**
* 尺寸-单位mm@
*/
@Min(value = 0, message = "图标宽度不能小于0")
@NotNull(message = "图标宽度不能为空")
private Integer weight;
/**
* 尺寸-单位mm
*/
@Min(value = 0, message = "图标高度不能小于0")
@NotNull(message = "图标高度不能为空")
private Integer height;
/**
* 扩展信息json
*/
@IsJsonString(message = "扩展信息格式不正确")
private String ext;
}

View File

@ -0,0 +1,40 @@
package cn.axzo.oss.client.icon.vo.request;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author chenwenjian
* @version 1.0
* @date 2023/12/20 19:54
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IconDetailListReq {
/**
* 图标ID多个用逗号分隔
*/
private List<Long> ids;
/**
* 分组ID多个用逗号分隔
*/
private List<Long> groupIds;
/**
* 名称模糊查询
*/
private String name;
/**
* 状态0正常1禁用多个用逗号分隔
*/
private List<Integer> statuses;
}

View File

@ -0,0 +1,47 @@
package cn.axzo.oss.client.icon.vo.request;
import cn.axzo.oss.client.icon.annotation.IsJsonString;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @author chenwenjian
* @version 1.0
* @date 2023/12/20 18:11
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IconDetailUpdateReq {
/**
* 图标ID
*/
@NotNull(message = "图标id不能为空")
private Long id;
/**
* 图标组ID
*/
@NotNull(message = "图标组id不能为空")
private Long groupId;
/**
* 图标名称
*/
@NotBlank(message = "图标名称不能为空")
private String name;
/**
* 扩展信息json
*/
@IsJsonString(message = "扩展信息格式不正确")
private String ext;
}

View File

@ -0,0 +1,32 @@
package cn.axzo.oss.client.icon.vo.request;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
/**
* @author chenwenjian
* @version 1.0
* @date 2023/12/20 18:22
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IconDetailUpdateStatus {
/**
* 图标id
*/
@NotNull(message = "图标id不能为空")
private Long id;
/**
* 图标状态状态0-未使用1-使用中2-已弃用
*/
@NotNull(message = "图标状态不能为空")
private Integer status;
}

View File

@ -0,0 +1,40 @@
package cn.axzo.oss.client.icon.vo.request;
import cn.axzo.oss.client.icon.annotation.IsJsonString;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
/**
* @author chenwenjian
* @version 1.0
* @date 2023/12/19 17:37
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IconGroupAddReq {
/**
* 终端例如pch5
*/
@NotBlank(message = "段类型不能为空")
private String terminal;
/**
* 图标组例如cmsomscmp
*/
@NotBlank(message = "图标组不能为空")
private String group;
/**
* 扩展信息json
*/
@IsJsonString(message = "扩展信息格式不正确")
private String ext;
}

View File

@ -0,0 +1,35 @@
package cn.axzo.oss.client.icon.vo.request;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author chenwenjian
* @version 1.0
* @date 2023/12/20 18:31
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IconGroupListReq {
/**
* 终端pch5多个用逗号分隔
*/
List<String> terminals;
/**
* 图标组, 多个用逗号分隔
*/
List<String> groups;
/**
* 状态0正常1禁用多个用逗号分隔
*/
List<Integer> statuses;
}

View File

@ -0,0 +1,38 @@
package cn.axzo.oss.client.icon.vo.request;
import cn.axzo.oss.client.icon.annotation.IsJsonString;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
/**
* @author chenwenjian
* @version 1.0
* @date 2023/12/20 17:08
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IconGroupUpdateReq {
/**
* 图标组id
*/
private Long id;
/**
* 图标组例如cmsomscmp
*/
@NotBlank(message = "图标组名不能为空")
private String group;
/**
* 扩展信息json
*/
@IsJsonString(message = "扩展信息格式不正确")
private String ext;
}

View File

@ -0,0 +1,32 @@
package cn.axzo.oss.client.icon.vo.request;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
/**
* @author chenwenjian
* @version 1.0
* @date 2023/12/20 16:56
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IconGroupUpdateStatusReq {
/**
* 图标组id
*/
@NotNull(message = "图标组id不能为空")
private Long id;
/**
* 图标组状态状态0-未使用1-使用中2-已弃用
*/
@NotNull(message = "图标组状态不能为空")
private Integer status;
}

View File

@ -0,0 +1,87 @@
package cn.axzo.oss.client.icon.vo.response;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @author chenwenjian
* @version 1.0
* @date 2023/12/20 19:59
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IconDetailListResp {
/**
* 主键
*/
private Long id;
/**
* 终端例如pch5
*/
private String terminal;
/**
* 图标组ID
*/
private Long groupId;
/**
* 图标组名称
*/
private String groupName;
/**
* 图标名称
*/
private String name;
/**
* 图标地址
*/
private String url;
/**
* 图标存储大小单位KB
*/
private Double size;
/**
* 尺寸-单位mm
*/
private Integer weight;
/**
* 尺寸-单位mm
*/
private Integer height;
/**
* 图标状态0-未使用1-使用中2-已弃用默认0
*/
private Integer status;
/**
* 扩展信息json
*/
private String ext;
/**
* 创建时间
*/
private Date createAt;
/**
* 修改时间
*/
private Date updateAt;
}

View File

@ -0,0 +1,52 @@
package cn.axzo.oss.client.icon.vo.response;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @author chenwenjian
* @version 1.0
* @date 2023/12/19 17:30
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IconGroupListResp {
/**
* 主键
*/
private Long id;
/**
* 终端例如pch5
*/
private String terminal;
/**
* 图标组例如cmsomscmp
*/
private String group;
/**
* 扩展信息json
*/
private String ext;
/**
* 创建时间
*/
private Date createAt;
/**
* 修改时间
*/
private Date updateAt;
}

View File

@ -4,12 +4,12 @@ spring:
cloud:
nacos:
config:
server-addr: ${NACOS_HOST:dev-nacos.axzo.cn}:${NACOS_PORT:80}
server-addr: ${NACOS_HOST:https://dev-nacos.axzo.cn}:${NACOS_PORT:443}
file-extension: yaml
namespace: ${NACOS_NAMESPACE_ID:35eada10-9574-4db8-9fea-bc6a4960b6c7}
prefix: ${spring.application.name}
profiles:
active: ${NACOS_PROFILES_ACTIVE:local}
active: ${NACOS_PROFILES_ACTIVE:dev}
main:
allow-bean-definition-overriding: true

View File

@ -46,7 +46,11 @@ public enum CodeEnum implements EnumBase<Integer> {
FILE_NOT_FOUND(112, "文件不存在"),
MULTIPART_UPLOAD_INIT_ERROR(113, "文件类型初始化失败"),
MULTIPART_UPLOAD_ERROR(114, "文件上传失败"),
MULTIPART_UPLOAD_COMPLETE_ERROR(115, "文件上传失败")
MULTIPART_UPLOAD_COMPLETE_ERROR(115, "文件上传失败"),
ICON_GROUP_EXIST(116, "图标组已存在"),
ICON_EXIST(117, "图标已存在")
;