diff --git a/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/controller/admin/file/FileController.java b/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/controller/admin/file/FileController.java index 0a037c8..a9b5cf1 100644 --- a/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/controller/admin/file/FileController.java +++ b/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/controller/admin/file/FileController.java @@ -52,6 +52,12 @@ public class FileController { return success(fileService.getFilePresignedUrl(path)); } + @GetMapping("/domain") + @Operation(summary = "获取本地文件的url了服务器地址", description = "本地文件服务的资源,前缀不一致时转换为当前服务器的的地址和端口地址") + public CommonResult getDomain() { + return success(fileService.getDomain()); + } + @PostMapping("/create") @Operation(summary = "创建文件", description = "模式二:前端上传文件:配合 presigned-url 接口,记录上传了上传的文件") public CommonResult createFile(@Valid @RequestBody FileCreateReqVO createReqVO) { diff --git a/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/framework/file/core/client/local/LocalFileClient.java b/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/framework/file/core/client/local/LocalFileClient.java index 71e10a0..cb33a64 100644 --- a/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/framework/file/core/client/local/LocalFileClient.java +++ b/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/framework/file/core/client/local/LocalFileClient.java @@ -47,15 +47,8 @@ public class LocalFileClient extends AbstractFileClient { private static final String SAVE_DIRECTORY; static { // 将文件保存到项目上级目录下 uploads - String dir = System.getProperty("user.dir") + File.separator; + String dir = System.getProperty("user.dir") + File.separator+"uploads"; File file = new File(dir); - String parent = file.getParent(); - // 检查是否有父目录 - if (parent != null) { - file = new File(parent, "uploads"); - } else { - file = new File(dir, "uploads"); - } if (!file.exists()) { file.mkdirs(); } diff --git a/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/service/config/YmlUtils.java b/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/service/config/YmlUtils.java new file mode 100644 index 0000000..d7555d9 --- /dev/null +++ b/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/service/config/YmlUtils.java @@ -0,0 +1,37 @@ +package cn.hangtag.module.infra.service.config; + +import org.springframework.context.EnvironmentAware; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +/** + * 系统文件配置操作工具 + */ +@Component +public class YmlUtils implements EnvironmentAware { + + private static Environment env; + + /** + * 设置环境变量 + * + * @author fzr + * @param environment 环境变量 + */ + @Override + public void setEnvironment(Environment environment) { + YmlUtils.env = environment; + } + + /** + * 根据Key获取值 + * + * @author fzr + * @param key 键 + * @return String + */ + public static String get(String key) { + return env.getProperty(key); + } + +} diff --git a/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/service/file/FileService.java b/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/service/file/FileService.java index bc44b2e..314fd0c 100644 --- a/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/service/file/FileService.java +++ b/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/service/file/FileService.java @@ -63,4 +63,10 @@ public interface FileService { */ FilePresignedUrlRespVO getFilePresignedUrl(String path) throws Exception; + /** + * 获取当前服务的资源域名 + * + * @return {@link String} + */ + String getDomain(); } diff --git a/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/service/file/FileServiceImpl.java b/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/service/file/FileServiceImpl.java index 069ceb1..76d9275 100644 --- a/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/service/file/FileServiceImpl.java +++ b/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/service/file/FileServiceImpl.java @@ -1,5 +1,7 @@ package cn.hangtag.module.infra.service.file; +import cn.hangtag.framework.common.util.FuncUtil; +import cn.hangtag.module.infra.service.config.YmlUtils; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import cn.hangtag.framework.common.pojo.PageResult; @@ -14,9 +16,16 @@ import cn.hangtag.module.infra.controller.admin.file.vo.file.FilePresignedUrlRes import cn.hangtag.module.infra.dal.dataobject.file.FileDO; import cn.hangtag.module.infra.dal.mysql.file.FileMapper; import lombok.SneakyThrows; +import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.stereotype.Service; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +import java.util.Arrays; +import java.util.List; import static cn.hangtag.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.hangtag.module.infra.enums.ErrorCodeConstants.FILE_NOT_EXISTS; @@ -35,6 +44,9 @@ public class FileServiceImpl implements FileService { @Resource private FileMapper fileMapper; + @Resource + private ServerProperties serverProperties; + @Override public PageResult getFilePage(FilePageReqVO pageReqVO) { return fileMapper.selectPage(pageReqVO); @@ -114,4 +126,48 @@ public class FileServiceImpl implements FileService { object -> object.setConfigId(fileClient.getId())); } + @Override + public String getDomain() { + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if(FuncUtil.isEmpty(servletRequestAttributes)){ + return ""; + } + HttpServletRequest request = servletRequestAttributes.getRequest(); + // yml 配置 localupload: 8080 + String port = YmlUtils.get("localupload.port"); + if(FuncUtil.isEmpty(port)){ + // 默认端口 + port = FuncUtil.toStr(serverProperties.getPort()); + } + String domain = domain(request); + if (!Arrays.asList("443","80","0").contains(port)) { + domain += ":" + port; + } + return domain; + } + public static String domain(HttpServletRequest request) { + String domain = YmlUtils.get("localupload.domain"); + if(FuncUtil.isNotEmpty(domain)){ + // 优先返回配置中的域名 + return domain; + } + String port = YmlUtils.get("localupload.port"); + + if (request != null) { + String origin = request.getHeader("Origin"); + if(FuncUtil.isEmpty(origin)){ + origin = request.getRequestURL().toString(); + } + List urls = Arrays.asList(origin.split("/")); + + String agree = "http:"; + + if (Arrays.asList("443","80","0").contains(port) || request.getServerPort() == 443) { + agree = "https:"; + } + + return agree + "//" + urls.get(2).split(":")[0]; + } + return null; + } } diff --git a/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java b/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java index d2a12b4..6ef98ea 100644 --- a/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java +++ b/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java @@ -6,4 +6,5 @@ public interface ErrorCodeConstants extends cn.hangtag.module.system.enums.Erro // ========== 产品资料 TODO 补充编号 ========== ErrorCode PRODUCT_INFO_NOT_EXISTS = new ErrorCode(3200, "产品资料 不存在"); + ErrorCode SHAPE_TEMPLATE_NOT_EXISTS = new ErrorCode(3200, "图形模板管理 不存在"); } diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/shapetemplate/ShapeTemplateController.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/shapetemplate/ShapeTemplateController.java new file mode 100644 index 0000000..78b496b --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/shapetemplate/ShapeTemplateController.java @@ -0,0 +1,95 @@ +package cn.hangtag.module.oms.controller.admin.shapetemplate; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.hangtag.framework.common.pojo.PageParam; +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.pojo.CommonResult; +import cn.hangtag.framework.common.util.object.BeanUtils; +import static cn.hangtag.framework.common.pojo.CommonResult.success; + +import cn.hangtag.framework.excel.core.util.ExcelUtils; + +import cn.hangtag.framework.apilog.core.annotation.ApiAccessLog; +import static cn.hangtag.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.hangtag.module.oms.controller.admin.shapetemplate.vo.*; +import cn.hangtag.module.oms.dal.dataobject.shapetemplate.ShapeTemplateDO; +import cn.hangtag.module.oms.service.shapetemplate.ShapeTemplateService; + +@Tag(name = "管理后台 - 图形模板管理 ") +@RestController +@RequestMapping("/oms/shape-template") +@Validated +public class ShapeTemplateController { + + @Resource + private ShapeTemplateService shapeTemplateService; + + @PostMapping("/create") + @Operation(summary = "创建图形模板管理 ") + @PreAuthorize("@ss.hasPermission('oms:shape-template:create')") + public CommonResult createShapeTemplate(@Valid @RequestBody ShapeTemplateSaveReqVO createReqVO) { + return success(shapeTemplateService.createShapeTemplate(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新图形模板管理 ") + @PreAuthorize("@ss.hasPermission('oms:shape-template:update')") + public CommonResult updateShapeTemplate(@Valid @RequestBody ShapeTemplateSaveReqVO updateReqVO) { + shapeTemplateService.updateShapeTemplate(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除图形模板管理 ") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('oms:shape-template:delete')") + public CommonResult deleteShapeTemplate(@RequestParam("id") Long id) { + shapeTemplateService.deleteShapeTemplate(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得图形模板管理 ") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('oms:shape-template:query')") + public CommonResult getShapeTemplate(@RequestParam("id") Long id) { + ShapeTemplateDO shapeTemplate = shapeTemplateService.getShapeTemplate(id); + return success(BeanUtils.toBean(shapeTemplate, ShapeTemplateRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得图形模板管理 分页") + @PreAuthorize("@ss.hasPermission('oms:shape-template:query')") + public CommonResult> getShapeTemplatePage(@Valid ShapeTemplatePageReqVO pageReqVO) { + PageResult pageResult = shapeTemplateService.getShapeTemplatePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, ShapeTemplateRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出图形模板管理 Excel") + @PreAuthorize("@ss.hasPermission('oms:shape-template:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportShapeTemplateExcel(@Valid ShapeTemplatePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = shapeTemplateService.getShapeTemplatePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "图形模板管理 .xls", "数据", ShapeTemplateRespVO.class, + BeanUtils.toBean(list, ShapeTemplateRespVO.class)); + } + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/shapetemplate/vo/ShapeTemplatePageReqVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/shapetemplate/vo/ShapeTemplatePageReqVO.java new file mode 100644 index 0000000..a09b5ff --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/shapetemplate/vo/ShapeTemplatePageReqVO.java @@ -0,0 +1,31 @@ +package cn.hangtag.module.oms.controller.admin.shapetemplate.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.hangtag.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.hangtag.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 图形模板管理 分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ShapeTemplatePageReqVO extends PageParam { + + @Schema(description = "形状类型", example = "2") + private String shapeType; + + @Schema(description = "名称", example = "张三") + private String name; + + @Schema(description = "初始数据 json") + private String initData; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/shapetemplate/vo/ShapeTemplateRespVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/shapetemplate/vo/ShapeTemplateRespVO.java new file mode 100644 index 0000000..8ff30b4 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/shapetemplate/vo/ShapeTemplateRespVO.java @@ -0,0 +1,35 @@ +package cn.hangtag.module.oms.controller.admin.shapetemplate.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 图形模板管理 Response VO") +@Data +@ExcelIgnoreUnannotated +public class ShapeTemplateRespVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "17429") + @ExcelProperty("id") + private Long id; + + @Schema(description = "形状类型", example = "2") + @ExcelProperty("形状类型") + private String shapeType; + + @Schema(description = "名称", example = "张三") + @ExcelProperty("名称") + private String name; + + @Schema(description = "初始数据 json") + @ExcelProperty("初始数据 json") + private String initData; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/shapetemplate/vo/ShapeTemplateSaveReqVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/shapetemplate/vo/ShapeTemplateSaveReqVO.java new file mode 100644 index 0000000..f9c9cdc --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/shapetemplate/vo/ShapeTemplateSaveReqVO.java @@ -0,0 +1,24 @@ +package cn.hangtag.module.oms.controller.admin.shapetemplate.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 图形模板管理 新增/修改 Request VO") +@Data +public class ShapeTemplateSaveReqVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "17429") + private Long id; + + @Schema(description = "形状类型", example = "2") + private String shapeType; + + @Schema(description = "名称", example = "张三") + private String name; + + @Schema(description = "初始数据 json") + private String initData; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/shapetemplate/ShapeTemplateDO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/shapetemplate/ShapeTemplateDO.java new file mode 100644 index 0000000..968f359 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/shapetemplate/ShapeTemplateDO.java @@ -0,0 +1,43 @@ +package cn.hangtag.module.oms.dal.dataobject.shapetemplate; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.hangtag.framework.mybatis.core.dataobject.BaseDO; + +/** + * 图形模板管理 DO + * + * @author YuanFeng + */ +@TableName("oms_shape_template") +@KeySequence("oms_shape_template_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ShapeTemplateDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 形状类型 + */ + private String shapeType; + /** + * 名称 + */ + private String name; + /** + * 初始数据 json + */ + private String initData; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/shapetemplate/ShapeTemplateMapper.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/shapetemplate/ShapeTemplateMapper.java new file mode 100644 index 0000000..5bb88f7 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/shapetemplate/ShapeTemplateMapper.java @@ -0,0 +1,29 @@ +package cn.hangtag.module.oms.dal.mysql.shapetemplate; + +import java.util.*; + +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.hangtag.framework.mybatis.core.mapper.BaseMapperX; +import cn.hangtag.module.oms.dal.dataobject.shapetemplate.ShapeTemplateDO; +import org.apache.ibatis.annotations.Mapper; +import cn.hangtag.module.oms.controller.admin.shapetemplate.vo.*; + +/** + * 图形模板管理 Mapper + * + * @author YuanFeng + */ +@Mapper +public interface ShapeTemplateMapper extends BaseMapperX { + + default PageResult selectPage(ShapeTemplatePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ShapeTemplateDO::getShapeType, reqVO.getShapeType()) + .likeIfPresent(ShapeTemplateDO::getName, reqVO.getName()) + .eqIfPresent(ShapeTemplateDO::getInitData, reqVO.getInitData()) + .betweenIfPresent(ShapeTemplateDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ShapeTemplateDO::getId)); + } + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/shapetemplate/ShapeTemplateService.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/shapetemplate/ShapeTemplateService.java new file mode 100644 index 0000000..0f7908f --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/shapetemplate/ShapeTemplateService.java @@ -0,0 +1,55 @@ +package cn.hangtag.module.oms.service.shapetemplate; + +import java.util.*; +import javax.validation.*; +import cn.hangtag.module.oms.controller.admin.shapetemplate.vo.*; +import cn.hangtag.module.oms.dal.dataobject.shapetemplate.ShapeTemplateDO; +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.pojo.PageParam; + +/** + * 图形模板管理 Service 接口 + * + * @author YuanFeng + */ +public interface ShapeTemplateService { + + /** + * 创建图形模板管理 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createShapeTemplate(@Valid ShapeTemplateSaveReqVO createReqVO); + + /** + * 更新图形模板管理 + * + * @param updateReqVO 更新信息 + */ + void updateShapeTemplate(@Valid ShapeTemplateSaveReqVO updateReqVO); + + /** + * 删除图形模板管理 + * + * @param id 编号 + */ + void deleteShapeTemplate(Long id); + + /** + * 获得图形模板管理 + * + * @param id 编号 + * @return 图形模板管理 + */ + ShapeTemplateDO getShapeTemplate(Long id); + + /** + * 获得图形模板管理 分页 + * + * @param pageReqVO 分页查询 + * @return 图形模板管理 分页 + */ + PageResult getShapeTemplatePage(ShapeTemplatePageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/shapetemplate/ShapeTemplateServiceImpl.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/shapetemplate/ShapeTemplateServiceImpl.java new file mode 100644 index 0000000..82b9973 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/shapetemplate/ShapeTemplateServiceImpl.java @@ -0,0 +1,74 @@ +package cn.hangtag.module.oms.service.shapetemplate; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.hangtag.module.oms.controller.admin.shapetemplate.vo.*; +import cn.hangtag.module.oms.dal.dataobject.shapetemplate.ShapeTemplateDO; +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.pojo.PageParam; +import cn.hangtag.framework.common.util.object.BeanUtils; + +import cn.hangtag.module.oms.dal.mysql.shapetemplate.ShapeTemplateMapper; + +import static cn.hangtag.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.hangtag.module.oms.enums.ErrorCodeConstants.*; + +/** + * 图形模板管理 Service 实现类 + * + * @author YuanFeng + */ +@Service +@Validated +public class ShapeTemplateServiceImpl implements ShapeTemplateService { + + @Resource + private ShapeTemplateMapper shapeTemplateMapper; + + @Override + public Long createShapeTemplate(ShapeTemplateSaveReqVO createReqVO) { + // 插入 + ShapeTemplateDO shapeTemplate = BeanUtils.toBean(createReqVO, ShapeTemplateDO.class); + shapeTemplateMapper.insert(shapeTemplate); + // 返回 + return shapeTemplate.getId(); + } + + @Override + public void updateShapeTemplate(ShapeTemplateSaveReqVO updateReqVO) { + // 校验存在 + validateShapeTemplateExists(updateReqVO.getId()); + // 更新 + ShapeTemplateDO updateObj = BeanUtils.toBean(updateReqVO, ShapeTemplateDO.class); + shapeTemplateMapper.updateById(updateObj); + } + + @Override + public void deleteShapeTemplate(Long id) { + // 校验存在 + validateShapeTemplateExists(id); + // 删除 + shapeTemplateMapper.deleteById(id); + } + + private void validateShapeTemplateExists(Long id) { + if (shapeTemplateMapper.selectById(id) == null) { + throw exception(SHAPE_TEMPLATE_NOT_EXISTS); + } + } + + @Override + public ShapeTemplateDO getShapeTemplate(Long id) { + return shapeTemplateMapper.selectById(id); + } + + @Override + public PageResult getShapeTemplatePage(ShapeTemplatePageReqVO pageReqVO) { + return shapeTemplateMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/shapetemplate/ShapeTemplateMapper.xml b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/shapetemplate/ShapeTemplateMapper.xml new file mode 100644 index 0000000..9b49560 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/shapetemplate/ShapeTemplateMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/test/java/cn/hangtag/module/oms/service/shapetemplate/ShapeTemplateServiceImplTest.java b/hangtag-module-oms/hangtag-module-oms-biz/src/test/java/cn/hangtag/module/oms/service/shapetemplate/ShapeTemplateServiceImplTest.java new file mode 100644 index 0000000..bfbc30a --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/test/java/cn/hangtag/module/oms/service/shapetemplate/ShapeTemplateServiceImplTest.java @@ -0,0 +1,142 @@ +package cn.hangtag.module.oms.service.shapetemplate; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import cn.hangtag.framework.test.core.ut.BaseDbUnitTest; + +import cn.hangtag.module.oms.controller.admin.shapetemplate.vo.*; +import cn.hangtag.module.oms.dal.dataobject.shapetemplate.ShapeTemplateDO; +import cn.hangtag.module.oms.dal.mysql.shapetemplate.ShapeTemplateMapper; +import cn.hangtag.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static cn.hangtag.module.oms.enums.ErrorCodeConstants.*; +import static cn.hangtag.framework.test.core.util.AssertUtils.*; +import static cn.hangtag.framework.test.core.util.RandomUtils.*; +import static cn.hangtag.framework.common.util.date.LocalDateTimeUtils.*; +import static cn.hangtag.framework.common.util.object.ObjectUtils.*; +import static cn.hangtag.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * {@link ShapeTemplateServiceImpl} 的单元测试类 + * + * @author YuanFeng + */ +@Import(ShapeTemplateServiceImpl.class) +public class ShapeTemplateServiceImplTest extends BaseDbUnitTest { + + @Resource + private ShapeTemplateServiceImpl shapeTemplateService; + + @Resource + private ShapeTemplateMapper shapeTemplateMapper; + + @Test + public void testCreateShapeTemplate_success() { + // 准备参数 + ShapeTemplateSaveReqVO createReqVO = randomPojo(ShapeTemplateSaveReqVO.class).setId(null); + + // 调用 + Long shapeTemplateId = shapeTemplateService.createShapeTemplate(createReqVO); + // 断言 + assertNotNull(shapeTemplateId); + // 校验记录的属性是否正确 + ShapeTemplateDO shapeTemplate = shapeTemplateMapper.selectById(shapeTemplateId); + assertPojoEquals(createReqVO, shapeTemplate, "id"); + } + + @Test + public void testUpdateShapeTemplate_success() { + // mock 数据 + ShapeTemplateDO dbShapeTemplate = randomPojo(ShapeTemplateDO.class); + shapeTemplateMapper.insert(dbShapeTemplate);// @Sql: 先插入出一条存在的数据 + // 准备参数 + ShapeTemplateSaveReqVO updateReqVO = randomPojo(ShapeTemplateSaveReqVO.class, o -> { + o.setId(dbShapeTemplate.getId()); // 设置更新的 ID + }); + + // 调用 + shapeTemplateService.updateShapeTemplate(updateReqVO); + // 校验是否更新正确 + ShapeTemplateDO shapeTemplate = shapeTemplateMapper.selectById(updateReqVO.getId()); // 获取最新的 + assertPojoEquals(updateReqVO, shapeTemplate); + } + + @Test + public void testUpdateShapeTemplate_notExists() { + // 准备参数 + ShapeTemplateSaveReqVO updateReqVO = randomPojo(ShapeTemplateSaveReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> shapeTemplateService.updateShapeTemplate(updateReqVO), SHAPE_TEMPLATE_NOT_EXISTS); + } + + @Test + public void testDeleteShapeTemplate_success() { + // mock 数据 + ShapeTemplateDO dbShapeTemplate = randomPojo(ShapeTemplateDO.class); + shapeTemplateMapper.insert(dbShapeTemplate);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbShapeTemplate.getId(); + + // 调用 + shapeTemplateService.deleteShapeTemplate(id); + // 校验数据不存在了 + assertNull(shapeTemplateMapper.selectById(id)); + } + + @Test + public void testDeleteShapeTemplate_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> shapeTemplateService.deleteShapeTemplate(id), SHAPE_TEMPLATE_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetShapeTemplatePage() { + // mock 数据 + ShapeTemplateDO dbShapeTemplate = randomPojo(ShapeTemplateDO.class, o -> { // 等会查询到 + o.setShapeType(null); + o.setName(null); + o.setInitData(null); + o.setCreateTime(null); + }); + shapeTemplateMapper.insert(dbShapeTemplate); + // 测试 shapeType 不匹配 + shapeTemplateMapper.insert(cloneIgnoreId(dbShapeTemplate, o -> o.setShapeType(null))); + // 测试 name 不匹配 + shapeTemplateMapper.insert(cloneIgnoreId(dbShapeTemplate, o -> o.setName(null))); + // 测试 initData 不匹配 + shapeTemplateMapper.insert(cloneIgnoreId(dbShapeTemplate, o -> o.setInitData(null))); + // 测试 createTime 不匹配 + shapeTemplateMapper.insert(cloneIgnoreId(dbShapeTemplate, o -> o.setCreateTime(null))); + // 准备参数 + ShapeTemplatePageReqVO reqVO = new ShapeTemplatePageReqVO(); + reqVO.setShapeType(null); + reqVO.setName(null); + reqVO.setInitData(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = shapeTemplateService.getShapeTemplatePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbShapeTemplate, pageResult.getList().get(0)); + } + +} \ No newline at end of file diff --git a/hangtag-server/src/main/resources/application.yaml b/hangtag-server/src/main/resources/application.yaml index 67a3ac3..886dc82 100644 --- a/hangtag-server/src/main/resources/application.yaml +++ b/hangtag-server/src/main/resources/application.yaml @@ -1,3 +1,9 @@ + +# 本地文件上传配置 +#localupload: +# port: 18080 +# domain: http://127.0.0.1 + spring: application: name: hangtag-server diff --git a/hangtag-ui/src/api/infra/file/index.ts b/hangtag-ui/src/api/infra/file/index.ts index 0e1b2e7..20834f9 100644 --- a/hangtag-ui/src/api/infra/file/index.ts +++ b/hangtag-ui/src/api/infra/file/index.ts @@ -43,3 +43,9 @@ export const createFile = (data: any) => { export const updateFile = (data: any) => { return request.upload({ url: '/infra/file/upload', data }) } +/** + * 获取资源的域名 + */ +export const getDomain = () => { + return request.get({ url: '/infra/file/domain'}) +} diff --git a/hangtag-ui/src/api/oms/shapetemplate/index.ts b/hangtag-ui/src/api/oms/shapetemplate/index.ts new file mode 100644 index 0000000..a30fbaa --- /dev/null +++ b/hangtag-ui/src/api/oms/shapetemplate/index.ts @@ -0,0 +1,42 @@ +import request from '@/config/axios' + +// 图形模板管理 VO +export interface ShapeTemplateVO { + id: number // id + shapeType: string // 形状类型 + name: string // 名称 + initData: string // 初始数据 json +} + +// 图形模板管理 API +export const ShapeTemplateApi = { + // 查询图形模板管理 分页 + getShapeTemplatePage: async (params: any) => { + return await request.get({ url: `/oms/shape-template/page`, params }) + }, + + // 查询图形模板管理 详情 + getShapeTemplate: async (id: number) => { + return await request.get({ url: `/oms/shape-template/get?id=` + id }) + }, + + // 新增图形模板管理 + createShapeTemplate: async (data: ShapeTemplateVO) => { + return await request.post({ url: `/oms/shape-template/create`, data }) + }, + + // 修改图形模板管理 + updateShapeTemplate: async (data: ShapeTemplateVO) => { + return await request.put({ url: `/oms/shape-template/update`, data }) + }, + + // 删除图形模板管理 + deleteShapeTemplate: async (id: number) => { + return await request.delete({ url: `/oms/shape-template/delete?id=` + id }) + }, + + // 导出图形模板管理 Excel + exportShapeTemplate: async (params) => { + return await request.download({ url: `/oms/shape-template/export-excel`, params }) + }, +} \ No newline at end of file diff --git a/hangtag-ui/src/components/DraftDesign/components/ColorPickerTool.vue b/hangtag-ui/src/components/DraftDesign/components/ColorPickerTool.vue index 0ac773e..feeead5 100644 --- a/hangtag-ui/src/components/DraftDesign/components/ColorPickerTool.vue +++ b/hangtag-ui/src/components/DraftDesign/components/ColorPickerTool.vue @@ -1,5 +1,8 @@ + + + + diff --git a/hangtag-ui/src/components/DraftDesign/components/EmptyPrompt.vue b/hangtag-ui/src/components/DraftDesign/components/EmptyPrompt.vue deleted file mode 100644 index d8e27f3..0000000 --- a/hangtag-ui/src/components/DraftDesign/components/EmptyPrompt.vue +++ /dev/null @@ -1,52 +0,0 @@ - - - - - diff --git a/hangtag-ui/src/components/DraftDesign/components/FlowContentMenu.vue b/hangtag-ui/src/components/DraftDesign/components/FlowContentMenu.vue new file mode 100644 index 0000000..78d5924 --- /dev/null +++ b/hangtag-ui/src/components/DraftDesign/components/FlowContentMenu.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/hangtag-ui/src/components/DraftDesign/components/FunctionPrompt.vue b/hangtag-ui/src/components/DraftDesign/components/FunctionPrompt.vue new file mode 100644 index 0000000..b216dda --- /dev/null +++ b/hangtag-ui/src/components/DraftDesign/components/FunctionPrompt.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/hangtag-ui/src/components/DraftDesign/components/ImageLibraryManage.vue b/hangtag-ui/src/components/DraftDesign/components/ImageLibraryManage.vue new file mode 100644 index 0000000..42a193b --- /dev/null +++ b/hangtag-ui/src/components/DraftDesign/components/ImageLibraryManage.vue @@ -0,0 +1,373 @@ + + + + + + diff --git a/hangtag-ui/src/components/DraftDesign/components/layout/LeftPanel.vue b/hangtag-ui/src/components/DraftDesign/components/layout/LeftPanel.vue index 2d87231..1d2acc4 100644 --- a/hangtag-ui/src/components/DraftDesign/components/layout/LeftPanel.vue +++ b/hangtag-ui/src/components/DraftDesign/components/layout/LeftPanel.vue @@ -1,21 +1,80 @@ - -
+ +
-
+
Settings
-
+ +
+ +
+ + + +
+
+ + + +
+
+ + + +
+
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
- - -
-
leftTop
+ +
- +
leftTop
+
+ +
-
-
+ - -
-
rightTop
-
- -
-
-
-
+ +
+
rightTop
+
+ +
+
+
+ @@ -161,8 +351,10 @@
leftBottom
- +
@@ -171,16 +363,21 @@
rightBottom
- +
- - + +
@@ -188,8 +385,38 @@
+
+ + + +
+
+
-