From fd0efdcc064a63bd5e993f94a5545aedbfc72b6e Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 01 Jul 2025 15:07:09 +0800
Subject: [PATCH] feat(mall): 添加衣服分类相关功能

---
 src/main/resources/templates/febs/views/modules/clothesType/typeInfo.html            |  281 ++
 src/main/resources/templates/febs/views/modules/clothesType/locationInfo.html        |  217 ++
 src/main/java/cc/mrbird/febs/mall/entity/ClothesTypeCloth.java                       |   17 
 src/main/resources/mapper/modules/ClothesTypeLocationMapper.xml                      |    5 
 src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeClothMapper.java                 |    7 
 src/main/java/cc/mrbird/febs/mall/entity/ClothesSize.java                            |   28 
 src/main/java/cc/mrbird/febs/mall/entity/ClothesType.java                            |   38 
 src/main/java/cc/mrbird/febs/mall/controller/clothes/AdminClothesTypeController.java |  255 ++
 src/main/java/cc/mrbird/febs/mall/entity/ClothesTypeLocation.java                    |   17 
 src/main/resources/mapper/modules/ClothesSizeMapper.xml                              |    5 
 src/main/java/cc/mrbird/febs/mall/mapper/ClothesPatternMapper.java                   |    7 
 src/main/resources/templates/febs/views/modules/clothesType/artList.html             |  184 +
 src/main/resources/templates/febs/views/modules/clothesType/clothAdd.html            |  187 +
 src/main/resources/templates/febs/views/modules/clothesType/locationAdd.html         |  187 +
 src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypePatternMapper.java               |    7 
 src/main/resources/mapper/modules/ClothesTypeSizeMapper.xml                          |    5 
 src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeLocationMapper.java              |    7 
 src/main/resources/templates/febs/views/modules/clothesType/artInfo.html             |  217 ++
 src/main/java/cc/mrbird/febs/mall/dto/clothes/AdminClothesTypeInfoDto.java           |   13 
 src/main/resources/mapper/modules/ClothesLocationMapper.xml                          |    5 
 src/main/java/cc/mrbird/febs/mall/entity/ClothesPattern.java                         |   28 
 src/main/resources/mapper/modules/ClothesPatternMapper.xml                           |    5 
 src/main/java/cc/mrbird/febs/mall/mapper/ClothesSizeMapper.java                      |    7 
 src/main/resources/templates/febs/views/modules/clothesType/artAdd.html              |  187 +
 src/main/java/cc/mrbird/febs/mall/entity/ClothesCloth.java                           |   26 
 src/main/resources/templates/febs/views/modules/clothesType/patternAdd.html          |  200 +
 src/main/resources/templates/febs/views/modules/clothesType/locationList.html        |  184 +
 src/main/resources/mapper/modules/ClothesArtMapper.xml                               |    5 
 src/main/resources/mapper/modules/ClothesTypeClothMapper.xml                         |    5 
 src/main/java/cc/mrbird/febs/mall/entity/ClothesArt.java                             |   27 
 src/main/resources/templates/febs/views/modules/clothesType/artSet.html              |  128 +
 src/main/resources/templates/febs/views/modules/clothesType/clothList.html           |  184 +
 src/main/resources/templates/febs/views/modules/clothesType/sizeInfo.html            |  230 ++
 src/main/resources/mapper/modules/ClothesTypeMapper.xml                              |    5 
 src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeSizeMapper.java                  |    7 
 src/main/resources/mapper/modules/ClothesTypeArtMapper.xml                           |    5 
 src/main/resources/templates/febs/views/modules/clothesType/clothSet.html            |  128 +
 src/main/resources/templates/febs/views/modules/clothesType/patternList.html         |  195 +
 src/main/resources/templates/febs/views/modules/clothesType/sizeList.html            |  195 +
 src/main/resources/templates/febs/views/modules/clothesType/patternSet.html          |  128 +
 src/main/java/cc/mrbird/febs/mall/controller/clothes/ViewClothesTypeController.java  |  495 ++++
 src/main/java/cc/mrbird/febs/mall/entity/ClothesTypePattern.java                     |   17 
 src/main/resources/templates/febs/views/modules/clothesType/sizeAdd.html             |  199 +
 src/main/java/cc/mrbird/febs/mall/mapper/ClothesLocationMapper.java                  |    7 
 src/main/resources/templates/febs/views/modules/clothesType/typeAdd.html             |  254 ++
 src/main/java/cc/mrbird/febs/mall/entity/ClothesTypeSize.java                        |   17 
 src/main/java/cc/mrbird/febs/mall/entity/ClothesTypeArt.java                         |   17 
 src/main/resources/mapper/modules/ClothesTypePatternMapper.xml                       |    5 
 src/main/java/cc/mrbird/febs/mall/service/ClothesTypeService.java                    |   59 
 src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeArtMapper.java                   |    7 
 src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesTypeInfoVo.java             |   11 
 src/main/java/cc/mrbird/febs/mall/service/impl/ClothesTypeServiceImpl.java           |  424 ++++
 src/main/resources/mapper/modules/ClothesClothMapper.xml                             |    5 
 src/main/resources/templates/febs/views/modules/clothesType/clothInfo.html           |  217 ++
 src/main/java/cc/mrbird/febs/mall/mapper/ClothesClothMapper.java                     |    7 
 src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeMapper.java                      |    7 
 src/main/resources/templates/febs/views/modules/clothesType/typeList.html            |  439 ++++
 src/main/java/cc/mrbird/febs/mall/entity/ClothesLocation.java                        |   26 
 src/main/resources/templates/febs/views/modules/clothesType/sizeSet.html             |  128 +
 src/main/resources/templates/febs/views/modules/clothesType/locationSet.html         |  128 +
 src/main/java/cc/mrbird/febs/mall/mapper/ClothesArtMapper.java                       |    7 
 src/main/resources/templates/febs/views/modules/clothesType/patternInfo.html         |  231 ++
 62 files changed, 6,275 insertions(+), 0 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/mall/controller/clothes/AdminClothesTypeController.java b/src/main/java/cc/mrbird/febs/mall/controller/clothes/AdminClothesTypeController.java
new file mode 100644
index 0000000..ba746f5
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/controller/clothes/AdminClothesTypeController.java
@@ -0,0 +1,255 @@
+package cc.mrbird.febs.mall.controller.clothes;
+
+import cc.mrbird.febs.common.annotation.ControllerEndpoint;
+import cc.mrbird.febs.common.controller.BaseController;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.entity.QueryRequest;
+import cc.mrbird.febs.mall.dto.clothes.AdminClothesTypeInfoDto;
+import cc.mrbird.febs.mall.dto.memberLevel.AdminMemberLabelAddDto;
+import cc.mrbird.febs.mall.dto.memberLevel.AdminMemberLabelDto;
+import cc.mrbird.febs.mall.dto.memberLevel.AdminMemberLabelUpdateDto;
+import cc.mrbird.febs.mall.entity.*;
+import cc.mrbird.febs.mall.service.ClothesTypeService;
+import cc.mrbird.febs.mall.vo.clothes.AdminClothesTypeInfoVo;
+import cc.mrbird.febs.mall.vo.memberLevel.AdminMemberLabelSetDto;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.Map;
+
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/admin/clothesType")
+public class AdminClothesTypeController extends BaseController {
+
+    private final ClothesTypeService clothesTypeService;
+    /**
+     * 分类列表
+     * @return
+     */
+    @GetMapping("typeList")
+    public FebsResponse typeList(ClothesType dto, QueryRequest request) {
+
+        Map<String, Object> data = getDataTable(clothesTypeService.adminTypeList(dto, request));
+        return new FebsResponse().success().data(data);
+    }
+    /**
+     * 分类-新增
+     */
+    @PostMapping("typeAdd")
+    @ControllerEndpoint(operation = " 分类-新增", exceptionMessage = "操作失败")
+    public FebsResponse typeAdd(@RequestBody @Valid ClothesType dto) {
+
+        return clothesTypeService.typeAdd(dto);
+    }
+    /**
+     * 分类-更新
+     */
+    @PostMapping("typeUpdate")
+    @ControllerEndpoint(operation = "分类-更新", exceptionMessage = "操作失败")
+    public FebsResponse typeUpdate(@RequestBody @Valid ClothesType dto) {
+
+        return clothesTypeService.typeUpdate(dto);
+    }
+    /**
+     * 分类-状态操作
+     */
+    @GetMapping("changeState/{id}/{type}/{state}")
+    @ControllerEndpoint(operation = "分类-状态操作", exceptionMessage = "操作失败")
+    public FebsResponse changeState(
+            @NotNull(message = "{required}") @PathVariable Long id,
+            @NotNull(message = "{required}") @PathVariable Integer type,
+            @NotNull(message = "{required}") @PathVariable Integer state
+    ) {
+
+        return clothesTypeService.changeState(id,type,state);
+    }
+    /**
+     * 尺码列表
+     * @return
+     */
+    @GetMapping("sizeList")
+    public FebsResponse sizeList(ClothesSize dto, QueryRequest request) {
+
+        Map<String, Object> data = getDataTable(clothesTypeService.adminSizeList(dto, request));
+        return new FebsResponse().success().data(data);
+    }
+    /**
+     * 尺码-新增
+     */
+    @PostMapping("sizeAdd")
+    @ControllerEndpoint(operation = "新增", exceptionMessage = "操作失败")
+    public FebsResponse sizeAdd(@RequestBody @Valid ClothesSize dto) {
+
+        return clothesTypeService.sizeAdd(dto);
+    }
+    /**
+     * 尺码-更新
+     */
+    @PostMapping("sizeUpdate")
+    @ControllerEndpoint(operation = "分类-更新", exceptionMessage = "操作失败")
+    public FebsResponse sizeUpdate(@RequestBody @Valid ClothesSize dto) {
+
+        return clothesTypeService.sizeUpdate(dto);
+    }
+    /**
+     * 图案列表
+     * @return
+     */
+    @GetMapping("patternList")
+    public FebsResponse patternList(ClothesPattern dto, QueryRequest request) {
+
+        Map<String, Object> data = getDataTable(clothesTypeService.adminPatternList(dto, request));
+        return new FebsResponse().success().data(data);
+    }
+    /**
+     * 图案-新增
+     */
+    @PostMapping("patternAdd")
+    @ControllerEndpoint(operation = "新增", exceptionMessage = "操作失败")
+    public FebsResponse patternAdd(@RequestBody @Valid ClothesPattern dto) {
+
+        return clothesTypeService.patternAdd(dto);
+    }
+    /**
+     * 图案-更新
+     */
+    @PostMapping("patternUpdate")
+    @ControllerEndpoint(operation = "分类-更新", exceptionMessage = "操作失败")
+    public FebsResponse patternUpdate(@RequestBody @Valid ClothesPattern dto) {
+
+        return clothesTypeService.patternUpdate(dto);
+    }
+
+
+    /**
+     * 位置列表
+     * @return
+     */
+    @GetMapping("locationList")
+    public FebsResponse locationList(ClothesLocation dto, QueryRequest request) {
+
+        Map<String, Object> data = getDataTable(clothesTypeService.adminLocationList(dto, request));
+        return new FebsResponse().success().data(data);
+    }
+    /**
+     * 位置-新增
+     */
+    @PostMapping("locationAdd")
+    @ControllerEndpoint(operation = "新增", exceptionMessage = "操作失败")
+    public FebsResponse locationAdd(@RequestBody @Valid ClothesLocation dto) {
+
+        return clothesTypeService.locationAdd(dto);
+    }
+    /**
+     * 位置-更新
+     */
+    @PostMapping("locationUpdate")
+    @ControllerEndpoint(operation = "分类-更新", exceptionMessage = "操作失败")
+    public FebsResponse locationUpdate(@RequestBody @Valid ClothesLocation dto) {
+
+        return clothesTypeService.locationUpdate(dto);
+    }
+
+
+    /**
+     * 布料列表
+     * @return
+     */
+    @GetMapping("clothList")
+    public FebsResponse clothList(ClothesCloth dto, QueryRequest request) {
+
+        Map<String, Object> data = getDataTable(clothesTypeService.adminClothList(dto, request));
+        return new FebsResponse().success().data(data);
+    }
+    /**
+     * 布料-新增
+     */
+    @PostMapping("clothAdd")
+    @ControllerEndpoint(operation = "新增", exceptionMessage = "操作失败")
+    public FebsResponse clothAdd(@RequestBody @Valid ClothesCloth dto) {
+
+        return clothesTypeService.clothAdd(dto);
+    }
+    /**
+     * 布料-更新
+     */
+    @PostMapping("clothUpdate")
+    @ControllerEndpoint(operation = "分类-更新", exceptionMessage = "操作失败")
+    public FebsResponse clothUpdate(@RequestBody @Valid ClothesCloth dto) {
+
+        return clothesTypeService.clothUpdate(dto);
+    }
+
+
+    /**
+     * 工艺列表
+     * @return
+     */
+    @GetMapping("artList")
+    public FebsResponse artList(ClothesArt dto, QueryRequest request) {
+
+        Map<String, Object> data = getDataTable(clothesTypeService.adminArtList(dto, request));
+        return new FebsResponse().success().data(data);
+    }
+    /**
+     * 工艺-新增
+     */
+    @PostMapping("artAdd")
+    @ControllerEndpoint(operation = "新增", exceptionMessage = "操作失败")
+    public FebsResponse artAdd(@RequestBody @Valid ClothesArt dto) {
+
+        return clothesTypeService.artAdd(dto);
+    }
+    /**
+     * 工艺-更新
+     */
+    @PostMapping("artUpdate")
+    @ControllerEndpoint(operation = "分类-更新", exceptionMessage = "操作失败")
+    public FebsResponse artUpdate(@RequestBody @Valid ClothesArt dto) {
+
+        return clothesTypeService.artUpdate(dto);
+    }
+
+    @PostMapping("artSet")
+    @ControllerEndpoint(operation = "设置", exceptionMessage = "操作失败")
+    public FebsResponse artSet(@RequestBody @Valid AdminClothesTypeInfoDto dto) {
+
+        return clothesTypeService.artSet(dto);
+    }
+
+    @PostMapping("sizeSet")
+    @ControllerEndpoint(operation = "设置", exceptionMessage = "操作失败")
+    public FebsResponse sizeSet(@RequestBody @Valid AdminClothesTypeInfoDto dto) {
+
+        return clothesTypeService.sizeSet(dto);
+    }
+
+    @PostMapping("clothSet")
+    @ControllerEndpoint(operation = "设置", exceptionMessage = "操作失败")
+    public FebsResponse clothSet(@RequestBody @Valid AdminClothesTypeInfoDto dto) {
+
+        return clothesTypeService.clothSet(dto);
+    }
+
+    @PostMapping("patternSet")
+    @ControllerEndpoint(operation = "设置", exceptionMessage = "操作失败")
+    public FebsResponse patternSet(@RequestBody @Valid AdminClothesTypeInfoDto dto) {
+
+        return clothesTypeService.patternSet(dto);
+    }
+
+    @PostMapping("locationSet")
+    @ControllerEndpoint(operation = "设置", exceptionMessage = "操作失败")
+    public FebsResponse locationSet(@RequestBody @Valid AdminClothesTypeInfoDto dto) {
+
+        return clothesTypeService.locationSet(dto);
+    }
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/clothes/ViewClothesTypeController.java b/src/main/java/cc/mrbird/febs/mall/controller/clothes/ViewClothesTypeController.java
new file mode 100644
index 0000000..43b1ddb
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/controller/clothes/ViewClothesTypeController.java
@@ -0,0 +1,495 @@
+package cc.mrbird.febs.mall.controller.clothes;
+
+import cc.mrbird.febs.common.controller.BaseController;
+import cc.mrbird.febs.common.entity.FebsConstant;
+import cc.mrbird.febs.common.utils.FebsUtil;
+import cc.mrbird.febs.mall.entity.*;
+import cc.mrbird.febs.mall.mapper.*;
+import cc.mrbird.febs.mall.service.ClothesTypeService;
+import cc.mrbird.febs.mall.service.IAdminBannerService;
+import cc.mrbird.febs.mall.vo.AdminLabelSetVo;
+import cc.mrbird.febs.mall.vo.clothes.AdminClothesTypeInfoVo;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@Controller("clothesTypeView")
+@RequestMapping(FebsConstant.VIEW_PREFIX + "modules/clothesType")
+@RequiredArgsConstructor
+public class ViewClothesTypeController extends BaseController {
+
+    private final ClothesTypeService clothesTypeService;
+    private final ClothesSizeMapper clothesSizeMapper;
+    private final ClothesPatternMapper clothesPatternMapper;
+    private final ClothesLocationMapper clothesLocationMapper;
+    private final ClothesClothMapper clothesClothMapper;
+    private final ClothesArtMapper clothesArtMapper;
+    private final ClothesTypeArtMapper clothesTypeArtMapper;
+    private final ClothesTypeSizeMapper clothesTypeSizeMapper;
+    private final ClothesTypeClothMapper clothesTypeClothMapper;
+    private final ClothesTypePatternMapper clothesTypePatternMapper;
+    private final ClothesTypeLocationMapper clothesTypeLocationMapper;
+
+    /**
+     * 种类列表
+     */
+    @GetMapping("typeList")
+    @RequiresPermissions("typeList:view")
+    public String typeList() {
+
+        return FebsUtil.view("modules/clothesType/typeList");
+    }
+
+    /**
+     * 种类新增
+     * @return
+     */
+    @GetMapping(value = "/typeAdd")
+    @RequiresPermissions("typeAdd:add")
+    public String typeAdd() {
+
+        return FebsUtil.view("modules/clothesType/typeAdd");
+    }
+
+
+    /**
+     * 种类编辑
+     * @param id
+     * @param model
+     * @return
+     */
+    @GetMapping("typeInfo/{id}")
+    @RequiresPermissions("typeInfo:view")
+    public String typeInfo(@PathVariable long id, Model model) {
+        ClothesType clothesType = clothesTypeService.getBaseMapper().selectById(id);
+        model.addAttribute("clothesType", clothesType);
+        return FebsUtil.view("modules/clothesType/typeInfo");
+    }
+
+    /**
+     * 尺码列表
+     */
+    @GetMapping("sizeList")
+    @RequiresPermissions("sizeList:view")
+    public String sizeList() {
+
+        return FebsUtil.view("modules/clothesType/sizeList");
+    }
+
+    /**
+     * 尺码新增
+     * @return
+     */
+    @GetMapping(value = "/sizeAdd")
+    @RequiresPermissions("sizeAdd:add")
+    public String sizeAdd() {
+
+        return FebsUtil.view("modules/clothesType/sizeAdd");
+    }
+
+    /**
+     * 尺码编辑
+     * @param id
+     * @param model
+     * @return
+     */
+    @GetMapping("sizeInfo/{id}")
+    @RequiresPermissions("sizeInfo:view")
+    public String sizeInfo(@PathVariable long id, Model model) {
+        ClothesSize clothesSize = clothesSizeMapper.selectById(id);
+        model.addAttribute("clothesSize", clothesSize);
+        return FebsUtil.view("modules/clothesType/sizeInfo");
+    }
+
+    /**
+     * 图案列表
+     */
+    @GetMapping("patternList")
+    @RequiresPermissions("patternList:view")
+    public String patternList() {
+
+        return FebsUtil.view("modules/clothesType/patternList");
+    }
+
+    /**
+     * 图案新增
+     * @return
+     */
+    @GetMapping(value = "/patternAdd")
+    @RequiresPermissions("patternAdd:add")
+    public String patternAdd() {
+
+        return FebsUtil.view("modules/clothesType/patternAdd");
+    }
+
+    /**
+     * 图案编辑
+     * @param id
+     * @param model
+     * @return
+     */
+    @GetMapping("patternInfo/{id}")
+    @RequiresPermissions("patternInfo:view")
+    public String patternInfo(@PathVariable long id, Model model) {
+        ClothesPattern clothesPattern = clothesPatternMapper.selectById(id);
+        model.addAttribute("clothesPattern", clothesPattern);
+        return FebsUtil.view("modules/clothesType/patternInfo");
+    }
+
+    /**
+     * 位置列表
+     */
+    @GetMapping("locationList")
+    @RequiresPermissions("locationList:view")
+    public String locationList() {
+
+        return FebsUtil.view("modules/clothesType/locationList");
+    }
+
+    /**
+     * 位置新增
+     * @return
+     */
+    @GetMapping(value = "/locationAdd")
+    @RequiresPermissions("locationAdd:add")
+    public String locationAdd() {
+
+        return FebsUtil.view("modules/clothesType/locationAdd");
+    }
+
+    /**
+     * 位置编辑
+     * @param id
+     * @param model
+     * @return
+     */
+    @GetMapping("locationInfo/{id}")
+    @RequiresPermissions("locationInfo:view")
+    public String locationInfo(@PathVariable long id, Model model) {
+        ClothesLocation clothesLocation = clothesLocationMapper.selectById(id);
+        model.addAttribute("clothesLocation", clothesLocation);
+        return FebsUtil.view("modules/clothesType/locationInfo");
+    }
+
+    /**
+     * 布料列表
+     */
+    @GetMapping("clothList")
+    @RequiresPermissions("clothList:view")
+    public String clothList() {
+
+        return FebsUtil.view("modules/clothesType/clothList");
+    }
+
+
+    /**
+     * 布料新增
+     * @return
+     */
+    @GetMapping(value = "/clothAdd")
+    @RequiresPermissions("clothAdd:add")
+    public String clothAdd() {
+
+        return FebsUtil.view("modules/clothesType/clothAdd");
+    }
+
+    /**
+     * 布料编辑
+     * @param id
+     * @param model
+     * @return
+     */
+    @GetMapping("clothInfo/{id}")
+    @RequiresPermissions("clothInfo:view")
+    public String clothInfo(@PathVariable long id, Model model) {
+        ClothesCloth clothesCloth = clothesClothMapper.selectById(id);
+        model.addAttribute("clothesCloth", clothesCloth);
+        return FebsUtil.view("modules/clothesType/clothInfo");
+    }
+
+    /**
+     * 工艺列表
+     */
+    @GetMapping("artList")
+    @RequiresPermissions("artList:view")
+    public String artList() {
+
+        return FebsUtil.view("modules/clothesType/artList");
+    }
+
+
+    /**
+     * 工艺新增
+     * @return
+     */
+    @GetMapping(value = "/artAdd")
+    @RequiresPermissions("artAdd:add")
+    public String artAdd() {
+
+        return FebsUtil.view("modules/clothesType/artAdd");
+    }
+
+    /**
+     * 工艺编辑
+     * @param id
+     * @param model
+     * @return
+     */
+    @GetMapping("artInfo/{id}")
+    @RequiresPermissions("artInfo:view")
+    public String artInfo(@PathVariable long id, Model model) {
+        ClothesArt clothesArt = clothesArtMapper.selectById(id);
+        model.addAttribute("clothesArt", clothesArt);
+        return FebsUtil.view("modules/clothesType/artInfo");
+    }
+
+    /**
+     * 工艺配置
+     * @param id
+     * @param model
+     * @return
+     */
+    @GetMapping("artSet/{id}")
+    @RequiresPermissions("artSet:view")
+    public String artSet(@PathVariable long id, Model model) {
+        List<AdminClothesTypeInfoVo> vos = new ArrayList<>();
+        Set<Long> artIds = new HashSet<>();
+
+        ClothesType clothesType = clothesTypeService.getBaseMapper().selectById(id);
+        if(ObjectUtil.isNotEmpty(clothesType)){
+            //右侧数据
+            List<ClothesTypeArt> clothesTypeArts = clothesTypeArtMapper.selectList(
+                    Wrappers.lambdaQuery(ClothesTypeArt.class)
+                            .eq(ClothesTypeArt::getTypeId, id)
+            );
+            if(CollUtil.isNotEmpty(clothesTypeArts)){
+                //stream流操作happyMemberLabelRecords,获取memberId的set集合
+                artIds = clothesTypeArts.stream().map(ClothesTypeArt::getArtId).collect(Collectors.toSet());
+            }
+
+            //左侧数据
+            List<ClothesArt> clothesArts = clothesArtMapper.selectList(
+                    Wrappers.lambdaQuery(ClothesArt.class)
+                            .select(ClothesArt::getId, ClothesArt::getName)
+            );
+            if(CollUtil.isNotEmpty(clothesArts)){
+                //stream流操作mallMembers,生成一个新的List<MallMemberVo>
+                vos = clothesArts.stream().map(ClothesArt -> {
+                    AdminClothesTypeInfoVo vo = new AdminClothesTypeInfoVo();
+                    vo.setId(ClothesArt.getId());
+                    vo.setName(ClothesArt.getName());
+                    return vo;
+                }).collect(Collectors.toList());
+            }
+        }
+
+        model.addAttribute("artTypeAll", vos);
+        model.addAttribute("artTypeChoose", artIds);
+        model.addAttribute("typeId", id);
+        return FebsUtil.view("modules/clothesType/artSet");
+    }
+
+    /**
+     * 尺码配置
+     * @param id
+     * @param model
+     * @return
+     */
+    @GetMapping("sizeSet/{id}")
+    @RequiresPermissions("sizeSet:view")
+    public String sizeSet(@PathVariable long id, Model model) {
+        List<AdminClothesTypeInfoVo> vos = new ArrayList<>();
+        Set<Long> ids = new HashSet<>();
+
+        ClothesType clothesType = clothesTypeService.getBaseMapper().selectById(id);
+        if(ObjectUtil.isNotEmpty(clothesType)){
+            //右侧数据
+            List<ClothesTypeSize> lists = clothesTypeSizeMapper.selectList(
+                    Wrappers.lambdaQuery(ClothesTypeSize.class)
+                            .eq(ClothesTypeSize::getTypeId, id)
+            );
+
+            if (CollUtil.isNotEmpty(lists)){
+                //stream流操作happyMemberLabelRecords,获取memberId的set集合
+                ids = lists.stream().map(ClothesTypeSize::getSizeId).collect(Collectors.toSet());
+            }
+
+            //左侧数据
+            List<ClothesSize> entities = clothesSizeMapper.selectList(
+                    Wrappers.lambdaQuery(ClothesSize.class)
+                            .select(ClothesSize::getId, ClothesSize::getName)
+            );
+            if(CollUtil.isNotEmpty(entities)){
+                //stream流操作mallMembers,生成一个新的List<MallMemberVo>
+                vos = entities.stream().map(ClothesSize -> {
+                    AdminClothesTypeInfoVo vo = new AdminClothesTypeInfoVo();
+                    vo.setId(ClothesSize.getId());
+                    vo.setName(ClothesSize.getName());
+                    return vo;
+                }).collect(Collectors.toList());
+            }
+        }
+
+        model.addAttribute("sizeTypeAll", vos);
+        model.addAttribute("sizeTypeChoose", ids);
+        model.addAttribute("typeId", id);
+        return FebsUtil.view("modules/clothesType/sizeSet");
+    }
+
+    /**
+     * 布料配置
+     * @param id
+     * @param model
+     * @return
+     */
+    @GetMapping("clothSet/{id}")
+    @RequiresPermissions("clothSet:view")
+    public String clothSet(@PathVariable long id, Model model) {
+        List<AdminClothesTypeInfoVo> vos = new ArrayList<>();
+        Set<Long> ids = new HashSet<>();
+
+        ClothesType clothesType = clothesTypeService.getBaseMapper().selectById(id);
+        if(ObjectUtil.isNotEmpty(clothesType)){
+            //右侧数据
+            List<ClothesTypeCloth> lists = clothesTypeClothMapper.selectList(
+                    Wrappers.lambdaQuery(ClothesTypeCloth.class)
+                            .eq(ClothesTypeCloth::getTypeId, id)
+            );
+
+            if (CollUtil.isNotEmpty(lists)){
+                //stream流操作happyMemberLabelRecords,获取memberId的set集合
+                ids = lists.stream().map(ClothesTypeCloth::getClothId).collect(Collectors.toSet());
+
+            }
+
+            //左侧数据
+            List<ClothesCloth> entities = clothesClothMapper.selectList(
+                    Wrappers.lambdaQuery(ClothesCloth.class)
+                            .select(ClothesCloth::getId, ClothesCloth::getName)
+            );
+            if(CollUtil.isNotEmpty(entities)){
+                //stream流操作mallMembers,生成一个新的List<MallMemberVo>
+                vos = entities.stream().map(ClothesCloth -> {
+                    AdminClothesTypeInfoVo vo = new AdminClothesTypeInfoVo();
+                    vo.setId(ClothesCloth.getId());
+                    vo.setName(ClothesCloth.getName());
+                    return vo;
+                }).collect(Collectors.toList());
+            }
+        }
+
+        model.addAttribute("clothTypeAll", vos);
+        model.addAttribute("clothTypeChoose", ids);
+        model.addAttribute("typeId", id);
+        return FebsUtil.view("modules/clothesType/clothSet");
+    }
+
+    /**
+     * 图案文字配置
+     * @param id
+     * @param model
+     * @return
+     */
+    @GetMapping("patternSet/{id}")
+    @RequiresPermissions("patternSet:view")
+    public String patternSet(@PathVariable long id, Model model) {
+        List<AdminClothesTypeInfoVo> vos = new ArrayList<>();
+        Set<Long> ids = new HashSet<>();
+
+        ClothesType clothesType = clothesTypeService.getBaseMapper().selectById(id);
+        if(ObjectUtil.isNotEmpty(clothesType)){
+            //右侧数据
+            List<ClothesTypePattern> lists = clothesTypePatternMapper.selectList(
+                    Wrappers.lambdaQuery(ClothesTypePattern.class)
+                            .eq(ClothesTypePattern::getTypeId, id)
+            );
+
+            if (CollUtil.isNotEmpty(lists)){
+                //stream流操作happyMemberLabelRecords,获取memberId的set集合
+                ids = lists.stream().map(ClothesTypePattern::getPatternId).collect(Collectors.toSet());
+            }
+
+            //左侧数据
+            List<ClothesPattern> entities = clothesPatternMapper.selectList(
+                    Wrappers.lambdaQuery(ClothesPattern.class)
+                            .select(ClothesPattern::getId, ClothesPattern::getName)
+            );
+            if(CollUtil.isNotEmpty(entities)){
+                //stream流操作mallMembers,生成一个新的List<MallMemberVo>
+                vos = entities.stream().map(ClothesPattern -> {
+                    AdminClothesTypeInfoVo vo = new AdminClothesTypeInfoVo();
+                    vo.setId(ClothesPattern.getId());
+                    vo.setName(ClothesPattern.getName());
+                    return vo;
+                }).collect(Collectors.toList());
+            }
+        }
+
+        model.addAttribute("patternTypeAll", vos);
+        model.addAttribute("patternTypeChoose", ids);
+        model.addAttribute("typeId", id);
+        return FebsUtil.view("modules/clothesType/patternSet");
+    }
+
+    /**
+     * 图案位置配置
+     * @param id
+     * @param model
+     * @return
+     */
+    @GetMapping("locationSet/{id}")
+    @RequiresPermissions("locationSet:view")
+    public String locationSet(@PathVariable long id, Model model) {
+        List<AdminClothesTypeInfoVo> vos = new ArrayList<>();
+        Set<Long> ids = new HashSet<>();
+
+        ClothesType clothesType = clothesTypeService.getBaseMapper().selectById(id);
+        if(ObjectUtil.isNotEmpty(clothesType)){
+            //右侧数据
+            List<ClothesTypeLocation> lists = clothesTypeLocationMapper.selectList(
+                    Wrappers.lambdaQuery(ClothesTypeLocation.class)
+                            .eq(ClothesTypeLocation::getTypeId, id)
+            );
+
+            if(CollUtil.isNotEmpty(lists)){
+                //stream流操作happyMemberLabelRecords,获取memberId的set集合
+                ids = lists.stream().map(ClothesTypeLocation::getLocationId).collect(Collectors.toSet());
+            }
+
+            //左侧数据
+            List<ClothesLocation> entities = clothesLocationMapper.selectList(
+                    Wrappers.lambdaQuery(ClothesLocation.class)
+                            .select(ClothesLocation::getId, ClothesLocation::getName)
+            );
+            if(CollUtil.isNotEmpty(entities)){
+                //stream流操作mallMembers,生成一个新的List<MallMemberVo>
+                vos = entities.stream().map(ClothesLocation -> {
+                    AdminClothesTypeInfoVo vo = new AdminClothesTypeInfoVo();
+                    vo.setId(ClothesLocation.getId());
+                    vo.setName(ClothesLocation.getName());
+                    return vo;
+                }).collect(Collectors.toList());
+            }
+        }
+
+        model.addAttribute("locationTypeAll", vos);
+        model.addAttribute("locationTypeChoose", ids);
+        model.addAttribute("typeId", id);
+        return FebsUtil.view("modules/clothesType/locationSet");
+    }
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/clothes/AdminClothesTypeInfoDto.java b/src/main/java/cc/mrbird/febs/mall/dto/clothes/AdminClothesTypeInfoDto.java
new file mode 100644
index 0000000..4744371
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/clothes/AdminClothesTypeInfoDto.java
@@ -0,0 +1,13 @@
+package cc.mrbird.febs.mall.dto.clothes;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AdminClothesTypeInfoDto {
+
+    private Long typeId;
+
+    private List<Long> chooseIds;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/ClothesArt.java b/src/main/java/cc/mrbird/febs/mall/entity/ClothesArt.java
new file mode 100644
index 0000000..f48e889
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/ClothesArt.java
@@ -0,0 +1,27 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@TableName("clothes_art")
+public class ClothesArt  extends BaseEntity {
+    /**
+     *
+     `name` varchar(100) DEFAULT NULL COMMENT '名称',
+     `image` varchar(200) DEFAULT NULL COMMENT '小图标',
+     `content` text COMMENT '简介',
+     `price` decimal(20,2) DEFAULT NULL COMMENT '价格',
+     `order_num` int(11) DEFAULT NULL COMMENT '排序',
+     */
+
+    private String code;
+    private String name;
+    private String image;
+    private String content;
+    private BigDecimal price;
+    private Integer orderNum;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/ClothesCloth.java b/src/main/java/cc/mrbird/febs/mall/entity/ClothesCloth.java
new file mode 100644
index 0000000..982c754
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/ClothesCloth.java
@@ -0,0 +1,26 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@TableName("clothes_cloth")
+public class ClothesCloth extends BaseEntity {
+    /**
+     *
+     `name` varchar(100) DEFAULT NULL COMMENT '名称',
+     `image` varchar(200) DEFAULT NULL COMMENT '小图标',
+     `content` text COMMENT '简介',
+     `price` decimal(20,2) DEFAULT NULL COMMENT '价格',
+     `order_num` int(11) DEFAULT NULL COMMENT '排序',
+     */
+    private String code;
+    private String name;
+    private String image;
+    private String content;
+    private BigDecimal price;
+    private Integer orderNum;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/ClothesLocation.java b/src/main/java/cc/mrbird/febs/mall/entity/ClothesLocation.java
new file mode 100644
index 0000000..6a53f71
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/ClothesLocation.java
@@ -0,0 +1,26 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@TableName("clothes_location")
+public class ClothesLocation extends BaseEntity {
+    /**
+     *
+     `name` varchar(100) DEFAULT NULL COMMENT '名称',
+     `image` varchar(200) DEFAULT NULL COMMENT '小图标',
+     `content` text COMMENT '简介',
+     `price` decimal(20,2) DEFAULT NULL COMMENT '价格',
+     `order_num` int(11) DEFAULT NULL COMMENT '排序',
+     */
+    private String code;
+    private String name;
+    private String image;
+    private String content;
+    private BigDecimal price;
+    private Integer orderNum;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/ClothesPattern.java b/src/main/java/cc/mrbird/febs/mall/entity/ClothesPattern.java
new file mode 100644
index 0000000..8fb2b5a
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/ClothesPattern.java
@@ -0,0 +1,28 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@TableName("clothes_pattern")
+public class ClothesPattern extends BaseEntity {
+    /**
+     *
+     `name` varchar(100) DEFAULT NULL COMMENT '名称',
+     `image` varchar(200) DEFAULT NULL COMMENT '小图标',
+     `content` text COMMENT '简介',
+     `price` decimal(20,2) DEFAULT NULL COMMENT '价格',
+     `order_num` int(11) DEFAULT NULL COMMENT '排序',
+     `type` int(11) DEFAULT NULL COMMENT '类型 1-仅文字 2-仅图案 3-文字加图案',
+     */
+    private String code;
+    private String name;
+    private String image;
+    private String content;
+    private BigDecimal price;
+    private Integer orderNum;
+    private Integer type;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/ClothesSize.java b/src/main/java/cc/mrbird/febs/mall/entity/ClothesSize.java
new file mode 100644
index 0000000..a93f446
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/ClothesSize.java
@@ -0,0 +1,28 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@TableName("clothes_size")
+public class ClothesSize  extends BaseEntity {
+    /**
+     *
+     `name` varchar(100) DEFAULT NULL COMMENT '名称',
+     `image` varchar(200) DEFAULT NULL COMMENT '小图标',
+     `content` text COMMENT '简介',
+     `price` decimal(20,2) DEFAULT NULL COMMENT '价格',
+     `type` int(11) DEFAULT NULL COMMENT '尺码类型 1-衣服 2-裤子',
+     `order_num` int(11) DEFAULT NULL COMMENT '排序',
+     */
+    private String code;
+    private String name;
+    private String image;
+    private String content;
+    private BigDecimal price;
+    private Integer type;
+    private Integer orderNum;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/ClothesType.java b/src/main/java/cc/mrbird/febs/mall/entity/ClothesType.java
new file mode 100644
index 0000000..22e7e10
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/ClothesType.java
@@ -0,0 +1,38 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("clothes_type")
+public class ClothesType extends BaseEntity {
+    /**
+     *
+     `name` varchar(100) DEFAULT NULL COMMENT '名称',
+     `image` varchar(200) DEFAULT NULL COMMENT '小图标',
+     `image_front` varchar(200) DEFAULT NULL COMMENT '正面',
+     `image_back` varchar(200) DEFAULT NULL COMMENT '反面',
+     `content` text COMMENT '描述',
+     `state` int(11) DEFAULT '0' COMMENT '是否上线 0-否 1-是',
+     `cloth_state` int(11) DEFAULT '0' COMMENT '是否允许选择布料 0-否 1-是',
+     `art_state` int(11) DEFAULT '0' COMMENT '是否允许选择工艺 0-否 1-是',
+     `pattern_state` int(11) DEFAULT '0' COMMENT '是否允许选择图案 0-否 1-是',
+     `location_state` int(11) DEFAULT '0' COMMENT '是否允许选择图案位置 0-否 1-是',
+     `size_state` int(11) DEFAULT '0' COMMENT '是否允许选择尺码 0-否 1-是',
+     `order_num` int(11) DEFAULT NULL COMMENT '排序',
+     */
+
+    private String name;
+    private String image;
+    private String imageFront;
+    private String imageBack;
+    private String content;
+    private Integer state;
+    private Integer clothState;
+    private Integer artState;
+    private Integer patternState;
+    private Integer locationState;
+    private Integer sizeState;
+    private Integer orderNum;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/ClothesTypeArt.java b/src/main/java/cc/mrbird/febs/mall/entity/ClothesTypeArt.java
new file mode 100644
index 0000000..a1c6be0
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/ClothesTypeArt.java
@@ -0,0 +1,17 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("clothes_type_art")
+public class ClothesTypeArt extends BaseEntity {
+    /**
+     *
+     `type_id` bigint(20) DEFAULT NULL,
+     `art_id` bigint(20) DEFAULT NULL,
+     */
+    private Long typeId;
+    private Long artId;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/ClothesTypeCloth.java b/src/main/java/cc/mrbird/febs/mall/entity/ClothesTypeCloth.java
new file mode 100644
index 0000000..8c932cc
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/ClothesTypeCloth.java
@@ -0,0 +1,17 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("clothes_type_cloth")
+public class ClothesTypeCloth extends BaseEntity {
+    /**
+     *
+     `type_id` bigint(20) DEFAULT NULL,
+     `cloth_id` bigint(20) DEFAULT NULL,
+     */
+    private Long typeId;
+    private Long clothId;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/ClothesTypeLocation.java b/src/main/java/cc/mrbird/febs/mall/entity/ClothesTypeLocation.java
new file mode 100644
index 0000000..e8471d4
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/ClothesTypeLocation.java
@@ -0,0 +1,17 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("clothes_type_location")
+public class ClothesTypeLocation extends BaseEntity {
+    /**
+     *
+     `type_id` bigint(20) DEFAULT NULL,
+     `location_id` bigint(20) DEFAULT NULL,
+     */
+    private Long typeId;
+    private Long locationId;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/ClothesTypePattern.java b/src/main/java/cc/mrbird/febs/mall/entity/ClothesTypePattern.java
new file mode 100644
index 0000000..5ef2b27
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/ClothesTypePattern.java
@@ -0,0 +1,17 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("clothes_type_pattern")
+public class ClothesTypePattern extends BaseEntity {
+    /**
+     *
+     `type_id` bigint(20) DEFAULT NULL,
+     `pattern_id` bigint(20) DEFAULT NULL,
+     */
+    private Long typeId;
+    private Long patternId;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/ClothesTypeSize.java b/src/main/java/cc/mrbird/febs/mall/entity/ClothesTypeSize.java
new file mode 100644
index 0000000..9e05b5d
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/ClothesTypeSize.java
@@ -0,0 +1,17 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("clothes_type_size")
+public class ClothesTypeSize extends BaseEntity {
+    /**
+     *
+     `type_id` bigint(20) DEFAULT NULL,
+     `size_id` bigint(20) DEFAULT NULL,
+     */
+    private Long typeId;
+    private Long sizeId;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/ClothesArtMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesArtMapper.java
new file mode 100644
index 0000000..5247b11
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesArtMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.ClothesArt;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface ClothesArtMapper extends BaseMapper<ClothesArt> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/ClothesClothMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesClothMapper.java
new file mode 100644
index 0000000..ad5123f
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesClothMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.ClothesCloth;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface ClothesClothMapper extends BaseMapper<ClothesCloth> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/ClothesLocationMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesLocationMapper.java
new file mode 100644
index 0000000..657d735
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesLocationMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.ClothesLocation;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface ClothesLocationMapper extends BaseMapper<ClothesLocation> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/ClothesPatternMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesPatternMapper.java
new file mode 100644
index 0000000..a3de0af
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesPatternMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.ClothesPattern;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface ClothesPatternMapper extends BaseMapper<ClothesPattern> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/ClothesSizeMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesSizeMapper.java
new file mode 100644
index 0000000..1a0ecac
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesSizeMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.ClothesSize;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface ClothesSizeMapper extends BaseMapper<ClothesSize> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeArtMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeArtMapper.java
new file mode 100644
index 0000000..13b4dd3
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeArtMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.ClothesTypeArt;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface ClothesTypeArtMapper extends BaseMapper<ClothesTypeArt> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeClothMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeClothMapper.java
new file mode 100644
index 0000000..cd7e5c9
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeClothMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.ClothesTypeCloth;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface ClothesTypeClothMapper extends BaseMapper<ClothesTypeCloth> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeLocationMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeLocationMapper.java
new file mode 100644
index 0000000..f661b05
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeLocationMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.ClothesTypeLocation;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface ClothesTypeLocationMapper extends BaseMapper<ClothesTypeLocation> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeMapper.java
new file mode 100644
index 0000000..3e888c7
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.ClothesType;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface ClothesTypeMapper extends BaseMapper<ClothesType> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypePatternMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypePatternMapper.java
new file mode 100644
index 0000000..ebc5ced
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypePatternMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.ClothesTypePattern;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface ClothesTypePatternMapper extends BaseMapper<ClothesTypePattern> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeSizeMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeSizeMapper.java
new file mode 100644
index 0000000..446cf04
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesTypeSizeMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.ClothesTypeSize;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface ClothesTypeSizeMapper extends BaseMapper<ClothesTypeSize> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/ClothesTypeService.java b/src/main/java/cc/mrbird/febs/mall/service/ClothesTypeService.java
new file mode 100644
index 0000000..869ada2
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/service/ClothesTypeService.java
@@ -0,0 +1,59 @@
+package cc.mrbird.febs.mall.service;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.entity.QueryRequest;
+import cc.mrbird.febs.mall.dto.clothes.AdminClothesTypeInfoDto;
+import cc.mrbird.febs.mall.entity.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface ClothesTypeService extends IService<ClothesType> {
+
+    IPage<ClothesType> adminTypeList(ClothesType dto, QueryRequest request);
+
+    FebsResponse typeAdd(ClothesType dto);
+
+    FebsResponse typeUpdate(ClothesType dto);
+
+    FebsResponse changeState(Long id, Integer type, Integer state);
+
+    IPage<ClothesSize> adminSizeList(ClothesSize dto, QueryRequest request);
+
+    FebsResponse sizeAdd(ClothesSize dto);
+
+    FebsResponse sizeUpdate(ClothesSize dto);
+
+    IPage<ClothesPattern> adminPatternList(ClothesPattern dto, QueryRequest request);
+
+    FebsResponse patternAdd(ClothesPattern dto);
+
+    FebsResponse patternUpdate(ClothesPattern dto);
+
+    IPage<ClothesLocation> adminLocationList(ClothesLocation dto, QueryRequest request);
+
+    FebsResponse locationAdd(ClothesLocation dto);
+
+    FebsResponse locationUpdate(ClothesLocation dto);
+
+    IPage<ClothesCloth> adminClothList(ClothesCloth dto, QueryRequest request);
+
+    FebsResponse clothAdd(ClothesCloth dto);
+
+    FebsResponse clothUpdate(ClothesCloth dto);
+
+    IPage<ClothesArt> adminArtList(ClothesArt dto, QueryRequest request);
+
+    FebsResponse artAdd(ClothesArt dto);
+
+    FebsResponse artUpdate(ClothesArt dto);
+
+    FebsResponse artSet(AdminClothesTypeInfoDto dto);
+
+    FebsResponse sizeSet(AdminClothesTypeInfoDto dto);
+
+    FebsResponse clothSet(AdminClothesTypeInfoDto dto);
+
+    FebsResponse patternSet(AdminClothesTypeInfoDto dto);
+
+    FebsResponse locationSet(AdminClothesTypeInfoDto dto);
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ClothesTypeServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ClothesTypeServiceImpl.java
new file mode 100644
index 0000000..90a02a0
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ClothesTypeServiceImpl.java
@@ -0,0 +1,424 @@
+package cc.mrbird.febs.mall.service.impl;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.entity.QueryRequest;
+import cc.mrbird.febs.common.enumerates.StateUpDownEnum;
+import cc.mrbird.febs.mall.dto.clothes.AdminClothesTypeInfoDto;
+import cc.mrbird.febs.mall.entity.*;
+import cc.mrbird.febs.mall.mapper.*;
+import cc.mrbird.febs.mall.service.ClothesTypeService;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+@Transactional
+public class ClothesTypeServiceImpl extends ServiceImpl<ClothesTypeMapper, ClothesType> implements ClothesTypeService {
+
+    private final ClothesTypeMapper clothesTypeMapper;
+    private final ClothesSizeMapper clothesSizeMapper ;
+    private final ClothesPatternMapper clothesPatternMapper;
+    private final ClothesLocationMapper clothesLocationMapper;
+    private final ClothesClothMapper clothesClothMapper;
+    private final ClothesArtMapper clothesArtMapper;
+    private final ClothesTypeArtMapper clothesTypeArtMapper;
+    private final ClothesTypeSizeMapper clothesTypeSizeMapper;
+    private final ClothesTypeClothMapper clothesTypeClothMapper;
+    private final ClothesTypePatternMapper clothesTypePatternMapper;
+    private final ClothesTypeLocationMapper clothesTypeLocationMapper;
+
+    @Override
+    public IPage<ClothesType> adminTypeList(ClothesType dto, QueryRequest request) {
+        Page<ClothesType> page = new Page<>(request.getPageNum(), request.getPageSize());
+        LambdaQueryWrapper<ClothesType> clothesTypeLambdaQueryWrapper = Wrappers.lambdaQuery(ClothesType.class);
+        Page<ClothesType> clothesTypePage = clothesTypeMapper.selectPage(page, clothesTypeLambdaQueryWrapper);
+        return clothesTypePage;
+    }
+
+    @Override
+    public FebsResponse typeAdd(ClothesType dto) {
+        ClothesType clothesType = new ClothesType();
+        clothesType.setName(dto.getName());
+        clothesType.setOrderNum(dto.getOrderNum());
+        clothesType.setImage(dto.getImage());
+        clothesType.setImageFront(dto.getImageFront());
+        clothesType.setImageBack(dto.getImageBack());
+        clothesType.setContent(dto.getContent());
+        clothesTypeMapper.insert(clothesType);
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public FebsResponse typeUpdate(ClothesType dto) {
+        Long id = dto.getId();
+        ClothesType clothesType = clothesTypeMapper.selectById(id);
+        if (ObjectUtil.isNotNull(clothesType)) {
+            clothesTypeMapper.update(null,
+                    Wrappers.lambdaUpdate(ClothesType.class)
+                            .eq(ClothesType::getId, id)
+                            .set(ClothesType::getName, dto.getName())
+                            .set(ClothesType::getOrderNum, dto.getOrderNum())
+                            .set(ClothesType::getImage, dto.getImage())
+                            .set(ClothesType::getImageFront, dto.getImageFront())
+                            .set(ClothesType::getImageBack, dto.getImageBack())
+                            .set(ClothesType::getContent, dto.getContent())
+                    );
+        }
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public FebsResponse changeState(Long id, Integer type, Integer state) {
+        ClothesType clothesType = clothesTypeMapper.selectById(id);
+        if(ObjectUtil.isNotEmpty(clothesType)){
+            switch (type) {
+                case 1:
+                    clothesType.setState( state);
+                    break;
+                case 2:
+                    clothesType.setClothState(state);
+                    break;
+                case 3:
+                    clothesType.setArtState(state);
+                    break;
+                case 4:
+                    clothesType.setPatternState(state);
+                    break;
+                case 5:
+                    clothesType.setLocationState(state);
+                    break;
+                case 6:
+                    clothesType.setSizeState(state);
+                    break;
+                default:
+                    break;
+            }
+            clothesTypeMapper.updateById(clothesType);
+        }
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public IPage<ClothesSize> adminSizeList(ClothesSize dto, QueryRequest request) {
+        Page<ClothesSize> page = new Page<>(request.getPageNum(), request.getPageSize());
+        LambdaQueryWrapper<ClothesSize> clothesSizeLambdaQueryWrapper = Wrappers.lambdaQuery(ClothesSize.class);
+        Page<ClothesSize> clothesSizePage = clothesSizeMapper.selectPage(page, clothesSizeLambdaQueryWrapper);
+        return clothesSizePage;
+    }
+
+    @Override
+    public FebsResponse sizeAdd(ClothesSize dto) {
+        ClothesSize clothesSize = new ClothesSize();
+        clothesSize.setName(dto.getName());
+        clothesSize.setOrderNum(dto.getOrderNum());
+        clothesSize.setPrice(dto.getPrice());
+        clothesSize.setType(dto.getType());
+        clothesSize.setImage(dto.getImage());
+        clothesSize.setContent(dto.getContent());
+        clothesSizeMapper.insert(clothesSize);
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public FebsResponse sizeUpdate(ClothesSize dto) {
+        Long id = dto.getId();
+        ClothesSize clothesSize = clothesSizeMapper.selectById(id);
+        if (ObjectUtil.isNotNull(clothesSize)) {
+            clothesSizeMapper.update(null,
+                    Wrappers.lambdaUpdate(ClothesSize.class)
+                        .eq(ClothesSize::getId, id)
+                        .set(ClothesSize::getName, dto.getName())
+                        .set(ClothesSize::getCode, dto.getCode())
+                        .set(ClothesSize::getOrderNum, dto.getOrderNum())
+                        .set(ClothesSize::getPrice, dto.getPrice())
+                        .set(ClothesSize::getType, dto.getType())
+                        .set(ClothesSize::getImage, dto.getImage())
+                        .set(ClothesSize::getContent, dto.getContent())
+            );
+        }
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public IPage<ClothesPattern> adminPatternList(ClothesPattern dto, QueryRequest request) {
+        Page<ClothesPattern> page = new Page<>(request.getPageNum(), request.getPageSize());
+        LambdaQueryWrapper<ClothesPattern> clothesPatternLambdaQueryWrapper = Wrappers.lambdaQuery(ClothesPattern.class);
+        Page<ClothesPattern> clothesPatternPage = clothesPatternMapper.selectPage(page, clothesPatternLambdaQueryWrapper);
+        return clothesPatternPage;
+    }
+
+    @Override
+    public FebsResponse patternAdd(ClothesPattern dto) {
+        ClothesPattern clothesPattern = new ClothesPattern();
+        clothesPattern.setName(dto.getName());
+        clothesPattern.setCode(dto.getCode());
+        clothesPattern.setType(dto.getType());
+        clothesPattern.setPrice(dto.getPrice());
+        clothesPattern.setOrderNum(dto.getOrderNum());
+        clothesPattern.setImage(dto.getImage());
+        clothesPattern.setContent(dto.getContent());
+        clothesPatternMapper.insert(clothesPattern);
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public FebsResponse patternUpdate(ClothesPattern dto) {
+        Long id = dto.getId();
+        ClothesPattern clothesPattern = clothesPatternMapper.selectById(id);
+        if (ObjectUtil.isNotNull(clothesPattern)) {
+            clothesPatternMapper.update(null,
+                    Wrappers.lambdaUpdate(ClothesPattern.class)
+                            .eq(ClothesPattern::getId, id)
+                            .set(ClothesPattern::getName, dto.getName())
+                            .set(ClothesPattern::getCode, dto.getCode())
+                            .set(ClothesPattern::getImage, dto.getImage())
+                            .set(ClothesPattern::getContent, dto.getContent())
+                            .set(ClothesPattern::getOrderNum, dto.getOrderNum())
+                            .set(ClothesPattern::getPrice, dto.getPrice())
+                            .set(ClothesPattern::getType, dto.getType())
+            );
+        }
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public IPage<ClothesLocation> adminLocationList(ClothesLocation dto, QueryRequest request) {
+        Page<ClothesLocation> page = new Page<>(request.getPageNum(), request.getPageSize());
+        LambdaQueryWrapper<ClothesLocation> queryWrapper = Wrappers.lambdaQuery(ClothesLocation.class);
+        Page<ClothesLocation> pages = clothesLocationMapper.selectPage(page, queryWrapper);
+        return pages;
+    }
+
+    @Override
+    public FebsResponse locationAdd(ClothesLocation dto) {
+        ClothesLocation clothesLocation = new ClothesLocation();
+        clothesLocation.setName(dto.getName());
+        clothesLocation.setCode(dto.getCode());
+        clothesLocation.setImage(dto.getImage());
+        clothesLocation.setContent(dto.getContent());
+        clothesLocation.setPrice(dto.getPrice());
+        clothesLocation.setOrderNum(dto.getOrderNum());
+        clothesLocationMapper.insert(clothesLocation);
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public FebsResponse locationUpdate(ClothesLocation dto) {
+        Long id = dto.getId();
+        ClothesLocation clothesLocation = clothesLocationMapper.selectById(id);
+        if (ObjectUtil.isNotNull(clothesLocation)) {
+            clothesLocationMapper.update(null,
+                    Wrappers.lambdaUpdate(ClothesLocation.class)
+                            .eq(ClothesLocation::getId, id)
+                            .set(ClothesLocation::getName, dto.getName())
+                            .set(ClothesLocation::getCode, dto.getCode())
+                            .set(ClothesLocation::getOrderNum, dto.getOrderNum())
+                            .set(ClothesLocation::getPrice, dto.getPrice())
+                            .set(ClothesLocation::getImage, dto.getImage())
+                            .set(ClothesLocation::getContent, dto.getContent())
+            );
+        }
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public IPage<ClothesCloth> adminClothList(ClothesCloth dto, QueryRequest request) {
+        Page<ClothesCloth> page = new Page<>(request.getPageNum(), request.getPageSize());
+        LambdaQueryWrapper<ClothesCloth> queryWrapper = Wrappers.lambdaQuery(ClothesCloth.class);
+        Page<ClothesCloth> pages = clothesClothMapper.selectPage(page, queryWrapper);
+        return pages;
+    }
+
+    @Override
+    public FebsResponse clothAdd(ClothesCloth dto) {
+        ClothesCloth clothesCloth = new ClothesCloth();
+        clothesCloth.setName(dto.getName());
+        clothesCloth.setCode(dto.getCode());
+        clothesCloth.setImage(dto.getImage());
+        clothesCloth.setContent(dto.getContent());
+        clothesCloth.setPrice(dto.getPrice());
+        clothesCloth.setOrderNum(dto.getOrderNum());
+        clothesClothMapper.insert(clothesCloth);
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public FebsResponse clothUpdate(ClothesCloth dto) {
+        Long id = dto.getId();
+        ClothesCloth clothesCloth = clothesClothMapper.selectById(id);
+        if (ObjectUtil.isNotNull(clothesCloth)) {
+            clothesClothMapper.update(null,
+                    Wrappers.lambdaUpdate(ClothesCloth.class)
+                            .eq(ClothesCloth::getId, id)
+                            .set(ClothesCloth::getName, dto.getName())
+                            .set(ClothesCloth::getCode, dto.getCode())
+                            .set(ClothesCloth::getOrderNum, dto.getOrderNum())
+                            .set(ClothesCloth::getPrice, dto.getPrice())
+                            .set(ClothesCloth::getImage, dto.getImage())
+                            .set(ClothesCloth::getContent, dto.getContent())
+            );
+        }
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public IPage<ClothesArt> adminArtList(ClothesArt dto, QueryRequest request) {
+        Page<ClothesArt> page = new Page<>(request.getPageNum(), request.getPageSize());
+        LambdaQueryWrapper<ClothesArt> queryWrapper = Wrappers.lambdaQuery(ClothesArt.class);
+        Page<ClothesArt> pages = clothesArtMapper.selectPage(page, queryWrapper);
+        return pages;
+    }
+
+    @Override
+    public FebsResponse artAdd(ClothesArt dto) {
+        ClothesArt clothesArt = new ClothesArt();
+        clothesArt.setName(dto.getName());
+        clothesArt.setCode(dto.getCode());
+        clothesArt.setImage(dto.getImage());
+        clothesArt.setContent(dto.getContent());
+        clothesArt.setPrice(dto.getPrice());
+        clothesArt.setOrderNum(dto.getOrderNum());
+        clothesArtMapper.insert(clothesArt);
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public FebsResponse artUpdate(ClothesArt dto) {
+        Long id = dto.getId();
+        ClothesArt clothesArt = clothesArtMapper.selectById(id);
+        if (ObjectUtil.isNotNull(clothesArt)) {
+            clothesArtMapper.update(null,
+                    Wrappers.lambdaUpdate(ClothesArt.class)
+                            .eq(ClothesArt::getId, id)
+                            .set(ClothesArt::getName, dto.getName())
+                            .set(ClothesArt::getCode, dto.getCode())
+                            .set(ClothesArt::getOrderNum, dto.getOrderNum())
+                            .set(ClothesArt::getPrice, dto.getPrice())
+                            .set(ClothesArt::getImage, dto.getImage())
+                            .set(ClothesArt::getContent, dto.getContent())
+            );
+        }
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public FebsResponse artSet(AdminClothesTypeInfoDto dto) {
+        Long typeId = dto.getTypeId();
+        List<Long> chooseIds = dto.getChooseIds();
+        ClothesType clothesType = clothesTypeMapper.selectById(typeId);
+        if (ObjectUtil.isNotEmpty(clothesType)) {
+            LambdaQueryWrapper<ClothesTypeArt> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(ClothesTypeArt::getTypeId,typeId);
+            clothesTypeArtMapper.delete(queryWrapper);
+            if(CollUtil.isNotEmpty(chooseIds)){
+                for (Long chooseId : chooseIds){
+                    ClothesTypeArt entity = new ClothesTypeArt();
+                    entity.setTypeId(typeId);
+                    entity.setArtId(chooseId);
+                    clothesTypeArtMapper.insert(entity);
+                }
+            }
+        }
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public FebsResponse sizeSet(AdminClothesTypeInfoDto dto) {
+        Long typeId = dto.getTypeId();
+        List<Long> chooseIds = dto.getChooseIds();
+        ClothesType clothesType = clothesTypeMapper.selectById(typeId);
+        if (ObjectUtil.isNotEmpty(clothesType)) {
+            LambdaQueryWrapper<ClothesTypeSize> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(ClothesTypeSize::getTypeId,typeId);
+            clothesTypeSizeMapper.delete(queryWrapper);
+            if(CollUtil.isNotEmpty(chooseIds)){
+                for (Long chooseId : chooseIds){
+                    ClothesTypeSize entity = new ClothesTypeSize();
+                    entity.setTypeId(typeId);
+                    entity.setSizeId(chooseId);
+                    clothesTypeSizeMapper.insert(entity);
+                }
+            }
+        }
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public FebsResponse clothSet(AdminClothesTypeInfoDto dto) {
+        Long typeId = dto.getTypeId();
+        List<Long> chooseIds = dto.getChooseIds();
+        ClothesType clothesType = clothesTypeMapper.selectById(typeId);
+        if (ObjectUtil.isNotEmpty(clothesType)) {
+            LambdaQueryWrapper<ClothesTypeCloth> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(ClothesTypeCloth::getTypeId,typeId);
+            clothesTypeClothMapper.delete(queryWrapper);
+            if(CollUtil.isNotEmpty(chooseIds)){
+                for (Long chooseId : chooseIds){
+                    ClothesTypeCloth entity = new ClothesTypeCloth();
+                    entity.setTypeId(typeId);
+                    entity.setClothId(chooseId);
+                    clothesTypeClothMapper.insert(entity);
+                }
+            }
+        }
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public FebsResponse patternSet(AdminClothesTypeInfoDto dto) {
+        Long typeId = dto.getTypeId();
+        List<Long> chooseIds = dto.getChooseIds();
+        ClothesType clothesType = clothesTypeMapper.selectById(typeId);
+        if (ObjectUtil.isNotEmpty(clothesType)) {
+            LambdaQueryWrapper<ClothesTypePattern> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(ClothesTypePattern::getTypeId,typeId);
+            clothesTypePatternMapper.delete(queryWrapper);
+            if(CollUtil.isNotEmpty(chooseIds)){
+                for (Long chooseId : chooseIds){
+                    ClothesTypePattern entity = new ClothesTypePattern();
+                    entity.setTypeId(typeId);
+                    entity.setPatternId(chooseId);
+                    clothesTypePatternMapper.insert(entity);
+                }
+            }
+        }
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public FebsResponse locationSet(AdminClothesTypeInfoDto dto) {
+        Long typeId = dto.getTypeId();
+        List<Long> chooseIds = dto.getChooseIds();
+        ClothesType clothesType = clothesTypeMapper.selectById(typeId);
+        if (ObjectUtil.isNotEmpty(clothesType)) {
+            LambdaQueryWrapper<ClothesTypeLocation> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(ClothesTypeLocation::getTypeId,typeId);
+            clothesTypeLocationMapper.delete(queryWrapper);
+            if(CollUtil.isNotEmpty(chooseIds)){
+                for (Long chooseId : chooseIds){
+                    ClothesTypeLocation entity = new ClothesTypeLocation();
+                    entity.setTypeId(typeId);
+                    entity.setLocationId(chooseId);
+                    clothesTypeLocationMapper.insert(entity);
+                }
+            }
+        }
+        return new FebsResponse().success().message("操作成功");
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesTypeInfoVo.java b/src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesTypeInfoVo.java
new file mode 100644
index 0000000..4b1d80d
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesTypeInfoVo.java
@@ -0,0 +1,11 @@
+package cc.mrbird.febs.mall.vo.clothes;
+
+import lombok.Data;
+
+@Data
+public class AdminClothesTypeInfoVo {
+
+    private Long id;
+
+    private String name;
+}
diff --git a/src/main/resources/mapper/modules/ClothesArtMapper.xml b/src/main/resources/mapper/modules/ClothesArtMapper.xml
new file mode 100644
index 0000000..fd58133
--- /dev/null
+++ b/src/main/resources/mapper/modules/ClothesArtMapper.xml
@@ -0,0 +1,5 @@
+<?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="cc.mrbird.febs.mall.mapper.ClothesArtMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/ClothesClothMapper.xml b/src/main/resources/mapper/modules/ClothesClothMapper.xml
new file mode 100644
index 0000000..50ebf52
--- /dev/null
+++ b/src/main/resources/mapper/modules/ClothesClothMapper.xml
@@ -0,0 +1,5 @@
+<?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="cc.mrbird.febs.mall.mapper.ClothesClothMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/ClothesLocationMapper.xml b/src/main/resources/mapper/modules/ClothesLocationMapper.xml
new file mode 100644
index 0000000..389ee2f
--- /dev/null
+++ b/src/main/resources/mapper/modules/ClothesLocationMapper.xml
@@ -0,0 +1,5 @@
+<?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="cc.mrbird.febs.mall.mapper.ClothesLocationMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/ClothesPatternMapper.xml b/src/main/resources/mapper/modules/ClothesPatternMapper.xml
new file mode 100644
index 0000000..b2e9c2d
--- /dev/null
+++ b/src/main/resources/mapper/modules/ClothesPatternMapper.xml
@@ -0,0 +1,5 @@
+<?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="cc.mrbird.febs.mall.mapper.ClothesPatternMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/ClothesSizeMapper.xml b/src/main/resources/mapper/modules/ClothesSizeMapper.xml
new file mode 100644
index 0000000..eb0d61c
--- /dev/null
+++ b/src/main/resources/mapper/modules/ClothesSizeMapper.xml
@@ -0,0 +1,5 @@
+<?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="cc.mrbird.febs.mall.mapper.ClothesSizeMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/ClothesTypeArtMapper.xml b/src/main/resources/mapper/modules/ClothesTypeArtMapper.xml
new file mode 100644
index 0000000..5db7fe3
--- /dev/null
+++ b/src/main/resources/mapper/modules/ClothesTypeArtMapper.xml
@@ -0,0 +1,5 @@
+<?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="cc.mrbird.febs.mall.mapper.ClothesTypeArtMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/ClothesTypeClothMapper.xml b/src/main/resources/mapper/modules/ClothesTypeClothMapper.xml
new file mode 100644
index 0000000..3be2cb7
--- /dev/null
+++ b/src/main/resources/mapper/modules/ClothesTypeClothMapper.xml
@@ -0,0 +1,5 @@
+<?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="cc.mrbird.febs.mall.mapper.ClothesTypeClothMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/ClothesTypeLocationMapper.xml b/src/main/resources/mapper/modules/ClothesTypeLocationMapper.xml
new file mode 100644
index 0000000..2aa61c7
--- /dev/null
+++ b/src/main/resources/mapper/modules/ClothesTypeLocationMapper.xml
@@ -0,0 +1,5 @@
+<?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="cc.mrbird.febs.mall.mapper.ClothesTypeLocationMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/ClothesTypeMapper.xml b/src/main/resources/mapper/modules/ClothesTypeMapper.xml
new file mode 100644
index 0000000..b0f8719
--- /dev/null
+++ b/src/main/resources/mapper/modules/ClothesTypeMapper.xml
@@ -0,0 +1,5 @@
+<?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="cc.mrbird.febs.mall.mapper.ClothesTypeMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/ClothesTypePatternMapper.xml b/src/main/resources/mapper/modules/ClothesTypePatternMapper.xml
new file mode 100644
index 0000000..5fadbef
--- /dev/null
+++ b/src/main/resources/mapper/modules/ClothesTypePatternMapper.xml
@@ -0,0 +1,5 @@
+<?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="cc.mrbird.febs.mall.mapper.ClothesTypePatternMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/ClothesTypeSizeMapper.xml b/src/main/resources/mapper/modules/ClothesTypeSizeMapper.xml
new file mode 100644
index 0000000..14ff45b
--- /dev/null
+++ b/src/main/resources/mapper/modules/ClothesTypeSizeMapper.xml
@@ -0,0 +1,5 @@
+<?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="cc.mrbird.febs.mall.mapper.ClothesTypeSizeMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/artAdd.html b/src/main/resources/templates/febs/views/modules/clothesType/artAdd.html
new file mode 100644
index 0000000..d6d0dc9
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/artAdd.html
@@ -0,0 +1,187 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-art-add" lay-title="新增">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="art-add">
+                <form class="layui-form" action="" lay-filter="art-add-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">名称:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">编码:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="code" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">排序:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="orderNum" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">价格:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="price" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">小图标:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="artImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="artImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="image" lay-verify="required" name="image" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label febs-form-item-require">详情介绍:</label>
+                                    <div class="layui-input-block">
+                                        <div style="border: 1px solid #ccc;">
+                                            <div id="art-toolbar-container" class="toolbar"></div>
+                                            <div id="art-text-container" class="text" style="height: 450px;"></div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="art-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect','jquery'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            table = layui.table,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            laydate = layui.laydate,
+            eleTree = layui.eleTree,
+            $view = $('#art-add'),
+            layedit = layui.layedit,
+            upload = layui.upload,
+            validate = layui.validate,
+            element = layui.element;
+
+        form.render();
+
+        const E = window.wangEditor;
+        const editor = new E('#art-toolbar-container', '#art-text-container'); // 传入两个元素
+        editor.config.showLinkImg = false;
+        editor.config.uploadFileName = 'file';
+        editor.config.customUploadImg = function (files, insertImgFn) {
+            // files 是 input 中选中的文件列表
+            // insertImgFn 是获取图片 url 后,插入到编辑器的方法
+            // 上传图片,返回结果,将图片插入到编辑器中
+            for (let i = 0; i < files.length; i++){
+                var form = new FormData();
+                form.append("file", files[0]);
+                $.ajax({
+                    url:'/admin/goods/uploadFileBase64',
+                    type: "post",
+                    processData: false,
+                    contentType: false,
+                    data: form,
+                    dataType: 'json',
+                    success(res) {
+                        // 上传代码返回结果之后,将图片插入到编辑器中
+                        insertImgFn(res.data.src, res.data.title, '')
+                    }
+                })
+            }
+        };
+        editor.create();
+
+        //图片上传
+        upload.render({
+            elem: '#artImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#artImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#image").val(res.data.src);
+            }
+        });
+
+        form.on('submit(art-form-submit)', function (data) {
+            data.field.content = editor.txt.html();
+            $.ajax({
+                'url':ctx + 'admin/clothesType/artAdd',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-art').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+    });
+</script>
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/artInfo.html b/src/main/resources/templates/febs/views/modules/clothesType/artInfo.html
new file mode 100644
index 0000000..500a846
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/artInfo.html
@@ -0,0 +1,217 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-art-Info" lay-title="编辑">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="art-info">
+                <form class="layui-form" action="" lay-filter="art-info-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <input type="text" name="id"
+                                   placeholder="" autoComplete="off" class="layui-input febs-hide">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">名称:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">编码:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="code" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">排序:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="orderNum" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">价格:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="price" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">小图标:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="artImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="artImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="image" lay-verify="required" name="image" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label febs-form-item-require">详情介绍:</label>
+                                    <div class="layui-input-block">
+                                        <div style="border: 1px solid #ccc;">
+                                            <div id="art-toolbar-container" class="toolbar"></div>
+                                            <div id="art-text-container" class="text" style="height: 450px;"></div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="art-info-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+<style>
+    .blue-border {
+        border-left-color: #2db7f5;
+        font-size: 18px;
+    }
+    .layui-table-cell {
+        height:auto;
+    }
+    .layui-upload-list {
+        margin: 0 !important;
+    }
+    .multi-images {
+        margin: 0 5px !important;
+    }
+</style>
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'validate','formSelects', 'table', 'upload'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            table = layui.table,
+            form = layui.form,
+            $view = $('#art-info'),
+            clothesArt = [[${clothesArt}]],
+            upload = layui.upload,
+            validate = layui.validate;
+
+        form.render();
+
+        const E = window.wangEditor;
+        const editor = new E('#art-toolbar-container', '#art-text-container'); // 传入两个元素
+        editor.config.showLinkImg = false;
+        editor.config.uploadFileName = 'file';
+        editor.config.customUploadImg = function (files, insertImgFn) {
+            // files 是 input 中选中的文件列表
+            // insertImgFn 是获取图片 url 后,插入到编辑器的方法
+            // 上传图片,返回结果,将图片插入到编辑器中
+            for (let i = 0; i < files.length; i++){
+                var form = new FormData();
+                form.append("file", files[0]);
+                $.ajax({
+                    url:'/admin/goods/uploadFileBase64',
+                    type: "post",
+                    processData: false,
+                    contentType: false,
+                    data: form,
+                    dataType: 'json',
+                    success(res) {
+                        // 上传代码返回结果之后,将图片插入到编辑器中
+                        insertImgFn(res.data.src, res.data.title, '')
+                    }
+                })
+            }
+        };
+        editor.create();
+
+        //图片上传
+        upload.render({
+            elem: '#artImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#artImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#image").val(res.data.src);
+            }
+        });
+
+        initArtInfo();
+
+        function initArtInfo() {
+            console.log("clothesArt:", clothesArt);
+            form.val("art-info-form", {
+                "id": clothesArt.id,
+                "name": clothesArt.name,
+                "code": clothesArt.code,
+                "price": clothesArt.price,
+                "orderNum": clothesArt.orderNum,
+            });
+
+
+            $('#artImageUpload').append('<img src="' + clothesArt.image + '" alt="" class="layui-upload-img single-image" style="width: 130px">');
+            $("#image").val(clothesArt.image);
+
+            editor.txt.html(clothesArt.content);
+
+        }
+
+        form.on('submit(art-info-form-submit)', function (data) {
+            data.field.content = editor.txt.html();
+            $.ajax({
+                'url':ctx + 'admin/clothesType/artUpdate',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-art').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/artList.html b/src/main/resources/templates/febs/views/modules/clothesType/artList.html
new file mode 100644
index 0000000..484df6c
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/artList.html
@@ -0,0 +1,184 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-art" lay-title="工艺管理">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <form class="layui-form layui-table-form" lay-filter="art-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                </div>
+                            </div>
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+                                    <i class="layui-icon">&#xe79b;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="artTable" lay-data="{id: 'artTable'}"></table>
+
+                    <style type="text/css">
+                        .layui-table-cell{
+                            text-align:center;
+                            height: auto;
+                            white-space: nowrap; /*文本不会换行,在同一行显示*/
+                            overflow: hidden; /*超出隐藏*/
+                            text-overflow: ellipsis; /*省略号显示*/
+                        }
+                        .layui-table img{
+                            max-width:100px
+                        }
+                        ::-webkit-scrollbar {
+                            height: 20px !important;
+                            background-color: #f4f4f4;
+                        }
+                    </style>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="artToolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="artAdd:add" lay-event="artAdd">新增</button>
+    </div>
+</script>
+
+<script type="text/html" id="artOption">
+    <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="artInfo:view" lay-event="artInfoEvent">编辑</button>
+</script>
+
+
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-art'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'orderNum', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initartTable();
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('tool(artTable)', function (obj) {
+            console.log("触发事件:", obj.event); // 调试信息
+            var data = obj.data,
+                layEvent = obj.event;
+
+            if (layEvent === 'seeartImage') {
+                var t = $view.find('#seeartImage'+data.id+'');
+                //页面层
+                layer.open({
+                    type: 1,
+                    title: "小图标",
+                    skin: 'layui-layer-rim', //加上边框
+                    area: ['100%', '100%'], //宽高
+                    shadeClose: true, //开启遮罩关闭
+                    end: function (index, layero) {
+                        return false;
+                    },
+                    content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>'
+                });
+            }
+
+            if (layEvent === 'artInfoEvent') {
+                febs.modal.open('编辑','modules/clothesType/artInfo/' + data.id, {
+                    btn: ['提交', '取消'],
+                    area: ['100%', '100%'],
+                    yes: function (index, layero) {
+                        $('#febs-art-Info').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+        });
+
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('toolbar(artTable)', function (obj) {
+            let data = obj.data,
+                layEvent = obj.event;
+            console.log("触发事件:", obj.event); // 调试信息
+            if(layEvent === 'artAdd'){
+                febs.modal.open('新增', 'modules/clothesType/artAdd/', {
+                    btn: ['提交', '取消'],
+                    area:['100%','100%'],
+                    yes: function (index, layero) {
+                        $('#febs-art-add').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+
+        });
+
+        function initartTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'artTable',
+                url: ctx + 'admin/clothesType/artList',
+                toolbar:"#artToolbar",
+                defaultToolbar:[],
+                cols: [[
+                    {type: 'checkbox'},
+                    {type: 'numbers', title: '', width: 80},
+                    {title: '操作', toolbar: '#artOption', minWidth: 200, align: 'center'},
+                    {field: 'name', title: '名称', minWidth: 150,align:'center'},
+                    {field: 'code', title: '编码', minWidth: 150,align:'center'},
+                    {field: 'orderNum', title: '序号', minWidth: 100,align:'center'},
+                    {field: 'price', title: '价格', minWidth: 150,align:'center'},
+                    {field: 'image',title: '小图标',
+                        templet: function (d) {
+                            return '<a lay-event="seeartImage">' +
+                                '<img id="seeartImage' + d.id + '" src="' + d.image +
+                                '" alt="小图标" style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px; cursor: pointer;">' +
+                                '</a>';
+                        },
+                    minWidth: 150,align: 'center'},
+                ]]
+            });
+        }
+
+
+        // 查询按钮
+        $query.on('click', function () {
+            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+            tableIns.reload({where: params, page: {curr: 1}});
+        });
+
+        // 刷新按钮
+        $reset.on('click', function () {
+            $searchForm[0].reset();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+                // name: $searchForm.find('input[name="name"]').val().trim(),
+                // state: $searchForm.find("select[name='state']").val(),
+                // categoryId: $searchForm.find("select[name='categoryId']").val(),
+            };
+        }
+
+    })
+</script>
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/artSet.html b/src/main/resources/templates/febs/views/modules/clothesType/artSet.html
new file mode 100644
index 0000000..64f76c2
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/artSet.html
@@ -0,0 +1,128 @@
+<div class="layui-fluid layui-anim febs-anim" id="art-set" lay-title="工艺配置">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="art-type-set">
+                <form class="layui-form" action="" lay-filter="art-type-set-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">工艺配置</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <input type="text" name="typeId"
+                                   placeholder="" autoComplete="off" class="layui-input febs-hide">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-form-item">
+                                    <div id="artSetMove"></div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="art-type-set-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script data-th-inline="javascript">
+    layui.use(['febs','form', 'transfer'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            form = layui.form,
+            transfer = layui.transfer,
+            artTypeAll = [[${artTypeAll}]],
+            artTypeChoose = [[${artTypeChoose}]],
+            typeId = [[${typeId}]],
+            $view = $('#art-set'),
+
+            $artSetMoveQuery = $view.find('#artSetMoveQuery')
+        ;
+
+        // 查询按钮
+        $artSetMoveQuery.on('click', function () {
+            console.log(transfer.getData('artSetMove-set'))
+
+            let data1 = transfer.getData('artSetMove-set');
+            //获取data1中的value,返回一个数组
+            let artIdList = data1.map(function(item){
+                return item.value;
+            });
+
+            console.log(artIdList)
+        });
+
+
+        form.render();
+
+        initArtTypeSet();
+
+        function initArtTypeSet() {
+            console.log("artTypeAll:", artTypeAll); // 调试信息
+            console.log("artTypeChoose:", artTypeChoose); // 调试信息
+            console.log("typeId:", typeId); // 调试信息
+            form.val("art-type-set-form", {
+                "typeId": typeId,
+            });
+            // 转换数据格式(假设接口返回的数据结构需要处理)
+            var dataLeft = artTypeAll.map(function(item){
+                return {
+                    value: item.id,  // 值字段
+                    title: item.name // 显示文本
+                }
+            });
+            var dataRight = artTypeChoose.map(function(item){
+                return {
+                    value: item,  // 值字段
+                }
+            });
+
+            // 渲染穿梭框
+            transfer.render({
+                elem: '#artSetMove',
+                data: dataLeft,
+                id: 'artSetMove-set', // 唯一标识
+                title: ['待选择列表', '已选择列表'],
+                width: 300,
+                height: 400,
+                showSearch: true,
+                value: artTypeChoose,
+            });
+        }
+
+        form.on('submit(art-type-set-form-submit)', function (data) {
+            let data1 = transfer.getData('artSetMove-set');
+            //获取data1中的value,返回一个数组
+            let artIdList = data1.map(function(item){
+                return item.value;
+            });
+            data.field.chooseIds = artIdList;
+            data.field.typeId = typeId;
+            $.ajax({
+                'url':ctx + 'admin/clothesType/artSet',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-type').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/clothAdd.html b/src/main/resources/templates/febs/views/modules/clothesType/clothAdd.html
new file mode 100644
index 0000000..84a8568
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/clothAdd.html
@@ -0,0 +1,187 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-cloth-add" lay-title="新增">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="cloth-add">
+                <form class="layui-form" action="" lay-filter="cloth-add-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">名称:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">编码:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="code" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">排序:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="orderNum" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">价格:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="price" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">小图标:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="clothImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="clothImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="image" lay-verify="required" name="image" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label febs-form-item-require">详情介绍:</label>
+                                    <div class="layui-input-block">
+                                        <div style="border: 1px solid #ccc;">
+                                            <div id="cloth-toolbar-container" class="toolbar"></div>
+                                            <div id="cloth-text-container" class="text" style="height: 450px;"></div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="cloth-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect','jquery'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            table = layui.table,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            laydate = layui.laydate,
+            eleTree = layui.eleTree,
+            $view = $('#cloth-add'),
+            layedit = layui.layedit,
+            upload = layui.upload,
+            validate = layui.validate,
+            element = layui.element;
+
+        form.render();
+
+        const E = window.wangEditor;
+        const editor = new E('#cloth-toolbar-container', '#cloth-text-container'); // 传入两个元素
+        editor.config.showLinkImg = false;
+        editor.config.uploadFileName = 'file';
+        editor.config.customUploadImg = function (files, insertImgFn) {
+            // files 是 input 中选中的文件列表
+            // insertImgFn 是获取图片 url 后,插入到编辑器的方法
+            // 上传图片,返回结果,将图片插入到编辑器中
+            for (let i = 0; i < files.length; i++){
+                var form = new FormData();
+                form.append("file", files[0]);
+                $.ajax({
+                    url:'/admin/goods/uploadFileBase64',
+                    type: "post",
+                    processData: false,
+                    contentType: false,
+                    data: form,
+                    dataType: 'json',
+                    success(res) {
+                        // 上传代码返回结果之后,将图片插入到编辑器中
+                        insertImgFn(res.data.src, res.data.title, '')
+                    }
+                })
+            }
+        };
+        editor.create();
+
+        //图片上传
+        upload.render({
+            elem: '#clothImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#clothImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#image").val(res.data.src);
+            }
+        });
+
+        form.on('submit(cloth-form-submit)', function (data) {
+            data.field.content = editor.txt.html();
+            $.ajax({
+                'url':ctx + 'admin/clothesType/clothAdd',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-cloth').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+    });
+</script>
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/clothInfo.html b/src/main/resources/templates/febs/views/modules/clothesType/clothInfo.html
new file mode 100644
index 0000000..0a27efc
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/clothInfo.html
@@ -0,0 +1,217 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-cloth-Info" lay-title="编辑">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="cloth-info">
+                <form class="layui-form" action="" lay-filter="cloth-info-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <input type="text" name="id"
+                                   placeholder="" autoComplete="off" class="layui-input febs-hide">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">名称:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">编码:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="code" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">排序:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="orderNum" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">价格:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="price" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">小图标:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="clothImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="clothImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="image" lay-verify="required" name="image" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label febs-form-item-require">详情介绍:</label>
+                                    <div class="layui-input-block">
+                                        <div style="border: 1px solid #ccc;">
+                                            <div id="cloth-toolbar-container" class="toolbar"></div>
+                                            <div id="cloth-text-container" class="text" style="height: 450px;"></div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="cloth-info-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+<style>
+    .blue-border {
+        border-left-color: #2db7f5;
+        font-size: 18px;
+    }
+    .layui-table-cell {
+        height:auto;
+    }
+    .layui-upload-list {
+        margin: 0 !important;
+    }
+    .multi-images {
+        margin: 0 5px !important;
+    }
+</style>
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'validate','formSelects', 'table', 'upload'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            table = layui.table,
+            form = layui.form,
+            $view = $('#cloth-info'),
+            clothesCloth = [[${clothesCloth}]],
+            upload = layui.upload,
+            validate = layui.validate;
+
+        form.render();
+
+        const E = window.wangEditor;
+        const editor = new E('#cloth-toolbar-container', '#cloth-text-container'); // 传入两个元素
+        editor.config.showLinkImg = false;
+        editor.config.uploadFileName = 'file';
+        editor.config.customUploadImg = function (files, insertImgFn) {
+            // files 是 input 中选中的文件列表
+            // insertImgFn 是获取图片 url 后,插入到编辑器的方法
+            // 上传图片,返回结果,将图片插入到编辑器中
+            for (let i = 0; i < files.length; i++){
+                var form = new FormData();
+                form.append("file", files[0]);
+                $.ajax({
+                    url:'/admin/goods/uploadFileBase64',
+                    type: "post",
+                    processData: false,
+                    contentType: false,
+                    data: form,
+                    dataType: 'json',
+                    success(res) {
+                        // 上传代码返回结果之后,将图片插入到编辑器中
+                        insertImgFn(res.data.src, res.data.title, '')
+                    }
+                })
+            }
+        };
+        editor.create();
+
+        //图片上传
+        upload.render({
+            elem: '#clothImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#clothImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#image").val(res.data.src);
+            }
+        });
+
+        initclothInfo();
+
+        function initclothInfo() {
+            console.log("clothesCloth:", clothesCloth);
+            form.val("cloth-info-form", {
+                "id": clothesCloth.id,
+                "name": clothesCloth.name,
+                "code": clothesCloth.code,
+                "price": clothesCloth.price,
+                "orderNum": clothesCloth.orderNum,
+            });
+
+
+            $('#clothImageUpload').append('<img src="' + clothesCloth.image + '" alt="" class="layui-upload-img single-image" style="width: 130px">');
+            $("#image").val(clothesCloth.image);
+
+            editor.txt.html(clothesCloth.content);
+
+        }
+
+        form.on('submit(cloth-info-form-submit)', function (data) {
+            data.field.content = editor.txt.html();
+            $.ajax({
+                'url':ctx + 'admin/clothesType/clothUpdate',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-cloth').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/clothList.html b/src/main/resources/templates/febs/views/modules/clothesType/clothList.html
new file mode 100644
index 0000000..174f5e1
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/clothList.html
@@ -0,0 +1,184 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-cloth" lay-title="布料管理">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <form class="layui-form layui-table-form" lay-filter="cloth-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                </div>
+                            </div>
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+                                    <i class="layui-icon">&#xe79b;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="clothTable" lay-data="{id: 'clothTable'}"></table>
+
+                    <style type="text/css">
+                        .layui-table-cell{
+                            text-align:center;
+                            height: auto;
+                            white-space: nowrap; /*文本不会换行,在同一行显示*/
+                            overflow: hidden; /*超出隐藏*/
+                            text-overflow: ellipsis; /*省略号显示*/
+                        }
+                        .layui-table img{
+                            max-width:100px
+                        }
+                        ::-webkit-scrollbar {
+                            height: 20px !important;
+                            background-color: #f4f4f4;
+                        }
+                    </style>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="clothToolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="clothAdd:add" lay-event="clothAdd">新增</button>
+    </div>
+</script>
+
+<script type="text/html" id="clothOption">
+    <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="clothInfo:view" lay-event="clothInfoEvent">编辑</button>
+</script>
+
+
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-cloth'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'orderNum', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initclothTable();
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('tool(clothTable)', function (obj) {
+            console.log("触发事件:", obj.event); // 调试信息
+            var data = obj.data,
+                layEvent = obj.event;
+
+            if (layEvent === 'seeclothImage') {
+                var t = $view.find('#seeclothImage'+data.id+'');
+                //页面层
+                layer.open({
+                    type: 1,
+                    title: "小图标",
+                    skin: 'layui-layer-rim', //加上边框
+                    area: ['100%', '100%'], //宽高
+                    shadeClose: true, //开启遮罩关闭
+                    end: function (index, layero) {
+                        return false;
+                    },
+                    content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>'
+                });
+            }
+
+            if (layEvent === 'clothInfoEvent') {
+                febs.modal.open('编辑','modules/clothesType/clothInfo/' + data.id, {
+                    btn: ['提交', '取消'],
+                    area: ['100%', '100%'],
+                    yes: function (index, layero) {
+                        $('#febs-cloth-Info').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+        });
+
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('toolbar(clothTable)', function (obj) {
+            let data = obj.data,
+                layEvent = obj.event;
+            console.log("触发事件:", obj.event); // 调试信息
+            if(layEvent === 'clothAdd'){
+                febs.modal.open('新增', 'modules/clothesType/clothAdd/', {
+                    btn: ['提交', '取消'],
+                    area:['100%','100%'],
+                    yes: function (index, layero) {
+                        $('#febs-cloth-add').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+
+        });
+
+        function initclothTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'clothTable',
+                url: ctx + 'admin/clothesType/clothList',
+                toolbar:"#clothToolbar",
+                defaultToolbar:[],
+                cols: [[
+                    {type: 'checkbox'},
+                    {type: 'numbers', title: '', width: 80},
+                    {title: '操作', toolbar: '#clothOption', minWidth: 200, align: 'center'},
+                    {field: 'name', title: '名称', minWidth: 150,align:'center'},
+                    {field: 'code', title: '编码', minWidth: 150,align:'center'},
+                    {field: 'orderNum', title: '序号', minWidth: 100,align:'center'},
+                    {field: 'price', title: '价格', minWidth: 150,align:'center'},
+                    {field: 'image',title: '小图标',
+                        templet: function (d) {
+                            return '<a lay-event="seeclothImage">' +
+                                '<img id="seeclothImage' + d.id + '" src="' + d.image +
+                                '" alt="小图标" style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px; cursor: pointer;">' +
+                                '</a>';
+                        },
+                    minWidth: 150,align: 'center'},
+                ]]
+            });
+        }
+
+
+        // 查询按钮
+        $query.on('click', function () {
+            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+            tableIns.reload({where: params, page: {curr: 1}});
+        });
+
+        // 刷新按钮
+        $reset.on('click', function () {
+            $searchForm[0].reset();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+                // name: $searchForm.find('input[name="name"]').val().trim(),
+                // state: $searchForm.find("select[name='state']").val(),
+                // categoryId: $searchForm.find("select[name='categoryId']").val(),
+            };
+        }
+
+    })
+</script>
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/clothSet.html b/src/main/resources/templates/febs/views/modules/clothesType/clothSet.html
new file mode 100644
index 0000000..fdd7d7b
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/clothSet.html
@@ -0,0 +1,128 @@
+<div class="layui-fluid layui-anim febs-anim" id="cloth-set" lay-title="布料配置">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="cloth-type-set">
+                <form class="layui-form" action="" lay-filter="cloth-type-set-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">布料配置</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <input type="text" name="typeId"
+                                   placeholder="" autoComplete="off" class="layui-input febs-hide">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-form-item">
+                                    <div id="clothSetMove"></div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="cloth-type-set-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script data-th-inline="javascript">
+    layui.use(['febs','form', 'transfer'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            form = layui.form,
+            transfer = layui.transfer,
+            clothTypeAll = [[${clothTypeAll}]],
+            clothTypeChoose = [[${clothTypeChoose}]],
+            typeId = [[${typeId}]],
+            $view = $('#cloth-set'),
+
+            $clothSetMoveQuery = $view.find('#clothSetMoveQuery')
+        ;
+
+        // 查询按钮
+        $clothSetMoveQuery.on('click', function () {
+            console.log(transfer.getData('clothSetMove-set'))
+
+            let data1 = transfer.getData('clothSetMove-set');
+            //获取data1中的value,返回一个数组
+            let clothIdList = data1.map(function(item){
+                return item.value;
+            });
+
+            console.log(clothIdList)
+        });
+
+
+        form.render();
+
+        clothTypeSetInit();
+
+        function clothTypeSetInit() {
+            console.log("clothTypeAll:", clothTypeAll); // 调试信息
+            console.log("clothTypeChoose:", clothTypeChoose); // 调试信息
+            console.log("typeId:", typeId); // 调试信息
+            form.val("cloth-type-set-form", {
+                "typeId": typeId,
+            });
+            // 转换数据格式(假设接口返回的数据结构需要处理)
+            var dataLeft = clothTypeAll.map(function(item){
+                return {
+                    value: item.id,  // 值字段
+                    title: item.name // 显示文本
+                }
+            });
+            var dataRight = clothTypeChoose.map(function(item){
+                return {
+                    value: item,  // 值字段
+                }
+            });
+
+            // 渲染穿梭框
+            transfer.render({
+                elem: '#clothSetMove',
+                data: dataLeft,
+                id: 'clothSetMove-set', // 唯一标识
+                title: ['待选择列表', '已选择列表'],
+                width: 300,
+                height: 400,
+                showSearch: true,
+                value: clothTypeChoose,
+            });
+        }
+
+        form.on('submit(cloth-type-set-form-submit)', function (data) {
+            let data1 = transfer.getData('clothSetMove-set');
+            //获取data1中的value,返回一个数组
+            let clothIdList = data1.map(function(item){
+                return item.value;
+            });
+            data.field.chooseIds = clothIdList;
+            data.field.typeId = typeId;
+            $.ajax({
+                'url':ctx + 'admin/clothesType/clothSet',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-type').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/locationAdd.html b/src/main/resources/templates/febs/views/modules/clothesType/locationAdd.html
new file mode 100644
index 0000000..3a4640a
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/locationAdd.html
@@ -0,0 +1,187 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-location-add" lay-title="新增">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="location-add">
+                <form class="layui-form" action="" lay-filter="location-add-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">名称:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">编码:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="code" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">排序:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="orderNum" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">价格:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="price" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">小图标:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="locationImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="locationImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="image" lay-verify="required" name="image" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label febs-form-item-require">详情介绍:</label>
+                                    <div class="layui-input-block">
+                                        <div style="border: 1px solid #ccc;">
+                                            <div id="location-toolbar-container" class="toolbar"></div>
+                                            <div id="location-text-container" class="text" style="height: 450px;"></div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="location-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect','jquery'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            table = layui.table,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            laydate = layui.laydate,
+            eleTree = layui.eleTree,
+            $view = $('#location-add'),
+            layedit = layui.layedit,
+            upload = layui.upload,
+            validate = layui.validate,
+            element = layui.element;
+
+        form.render();
+
+        const E = window.wangEditor;
+        const editor = new E('#location-toolbar-container', '#location-text-container'); // 传入两个元素
+        editor.config.showLinkImg = false;
+        editor.config.uploadFileName = 'file';
+        editor.config.customUploadImg = function (files, insertImgFn) {
+            // files 是 input 中选中的文件列表
+            // insertImgFn 是获取图片 url 后,插入到编辑器的方法
+            // 上传图片,返回结果,将图片插入到编辑器中
+            for (let i = 0; i < files.length; i++){
+                var form = new FormData();
+                form.append("file", files[0]);
+                $.ajax({
+                    url:'/admin/goods/uploadFileBase64',
+                    type: "post",
+                    processData: false,
+                    contentType: false,
+                    data: form,
+                    dataType: 'json',
+                    success(res) {
+                        // 上传代码返回结果之后,将图片插入到编辑器中
+                        insertImgFn(res.data.src, res.data.title, '')
+                    }
+                })
+            }
+        };
+        editor.create();
+
+        //图片上传
+        upload.render({
+            elem: '#locationImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#locationImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#image").val(res.data.src);
+            }
+        });
+
+        form.on('submit(location-form-submit)', function (data) {
+            data.field.content = editor.txt.html();
+            $.ajax({
+                'url':ctx + 'admin/clothesType/locationAdd',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-location').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+    });
+</script>
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/locationInfo.html b/src/main/resources/templates/febs/views/modules/clothesType/locationInfo.html
new file mode 100644
index 0000000..5714f84
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/locationInfo.html
@@ -0,0 +1,217 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-location-Info" lay-title="编辑">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="location-info">
+                <form class="layui-form" action="" lay-filter="location-info-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <input type="text" name="id"
+                                   placeholder="" autoComplete="off" class="layui-input febs-hide">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">名称:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">编码:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="code" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">排序:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="orderNum" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">价格:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="price" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">小图标:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="locationImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="locationImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="image" lay-verify="required" name="image" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label febs-form-item-require">详情介绍:</label>
+                                    <div class="layui-input-block">
+                                        <div style="border: 1px solid #ccc;">
+                                            <div id="location-toolbar-container" class="toolbar"></div>
+                                            <div id="location-text-container" class="text" style="height: 450px;"></div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="location-info-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+<style>
+    .blue-border {
+        border-left-color: #2db7f5;
+        font-size: 18px;
+    }
+    .layui-table-cell {
+        height:auto;
+    }
+    .layui-upload-list {
+        margin: 0 !important;
+    }
+    .multi-images {
+        margin: 0 5px !important;
+    }
+</style>
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'validate','formSelects', 'table', 'upload'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            table = layui.table,
+            form = layui.form,
+            $view = $('#location-info'),
+            clothesLocation = [[${clothesLocation}]],
+            upload = layui.upload,
+            validate = layui.validate;
+
+        form.render();
+
+        const E = window.wangEditor;
+        const editor = new E('#location-toolbar-container', '#location-text-container'); // 传入两个元素
+        editor.config.showLinkImg = false;
+        editor.config.uploadFileName = 'file';
+        editor.config.customUploadImg = function (files, insertImgFn) {
+            // files 是 input 中选中的文件列表
+            // insertImgFn 是获取图片 url 后,插入到编辑器的方法
+            // 上传图片,返回结果,将图片插入到编辑器中
+            for (let i = 0; i < files.length; i++){
+                var form = new FormData();
+                form.append("file", files[0]);
+                $.ajax({
+                    url:'/admin/goods/uploadFileBase64',
+                    type: "post",
+                    processData: false,
+                    contentType: false,
+                    data: form,
+                    dataType: 'json',
+                    success(res) {
+                        // 上传代码返回结果之后,将图片插入到编辑器中
+                        insertImgFn(res.data.src, res.data.title, '')
+                    }
+                })
+            }
+        };
+        editor.create();
+
+        //图片上传
+        upload.render({
+            elem: '#locationImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#locationImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#image").val(res.data.src);
+            }
+        });
+
+        initLocationInfo();
+
+        function initLocationInfo() {
+            console.log("clothesLocation:", clothesLocation);
+            form.val("location-info-form", {
+                "id": clothesLocation.id,
+                "name": clothesLocation.name,
+                "code": clothesLocation.code,
+                "price": clothesLocation.price,
+                "orderNum": clothesLocation.orderNum,
+            });
+
+
+            $('#locationImageUpload').append('<img src="' + clothesLocation.image + '" alt="" class="layui-upload-img single-image" style="width: 130px">');
+            $("#image").val(clothesLocation.image);
+
+            editor.txt.html(clothesLocation.content);
+
+        }
+
+        form.on('submit(location-info-form-submit)', function (data) {
+            data.field.content = editor.txt.html();
+            $.ajax({
+                'url':ctx + 'admin/clothesType/locationUpdate',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-location').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/locationList.html b/src/main/resources/templates/febs/views/modules/clothesType/locationList.html
new file mode 100644
index 0000000..94601e2
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/locationList.html
@@ -0,0 +1,184 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-location" lay-title="图案位置管理">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <form class="layui-form layui-table-form" lay-filter="location-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                </div>
+                            </div>
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+                                    <i class="layui-icon">&#xe79b;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="locationTable" lay-data="{id: 'locationTable'}"></table>
+
+                    <style type="text/css">
+                        .layui-table-cell{
+                            text-align:center;
+                            height: auto;
+                            white-space: nowrap; /*文本不会换行,在同一行显示*/
+                            overflow: hidden; /*超出隐藏*/
+                            text-overflow: ellipsis; /*省略号显示*/
+                        }
+                        .layui-table img{
+                            max-width:100px
+                        }
+                        ::-webkit-scrollbar {
+                            height: 20px !important;
+                            background-color: #f4f4f4;
+                        }
+                    </style>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="locationToolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="locationAdd:add" lay-event="locationAdd">新增</button>
+    </div>
+</script>
+
+<script type="text/html" id="locationOption">
+    <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="locationInfo:view" lay-event="locationInfoEvent">编辑</button>
+</script>
+
+
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-location'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'orderNum', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initlocationTable();
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('tool(locationTable)', function (obj) {
+            console.log("触发事件:", obj.event); // 调试信息
+            var data = obj.data,
+                layEvent = obj.event;
+
+            if (layEvent === 'seelocationImage') {
+                var t = $view.find('#seelocationImage'+data.id+'');
+                //页面层
+                layer.open({
+                    type: 1,
+                    title: "小图标",
+                    skin: 'layui-layer-rim', //加上边框
+                    area: ['100%', '100%'], //宽高
+                    shadeClose: true, //开启遮罩关闭
+                    end: function (index, layero) {
+                        return false;
+                    },
+                    content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>'
+                });
+            }
+
+            if (layEvent === 'locationInfoEvent') {
+                febs.modal.open('编辑','modules/clothesType/locationInfo/' + data.id, {
+                    btn: ['提交', '取消'],
+                    area: ['100%', '100%'],
+                    yes: function (index, layero) {
+                        $('#febs-location-Info').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+        });
+
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('toolbar(locationTable)', function (obj) {
+            let data = obj.data,
+                layEvent = obj.event;
+            console.log("触发事件:", obj.event); // 调试信息
+            if(layEvent === 'locationAdd'){
+                febs.modal.open('新增', 'modules/clothesType/locationAdd/', {
+                    btn: ['提交', '取消'],
+                    area:['100%','100%'],
+                    yes: function (index, layero) {
+                        $('#febs-location-add').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+
+        });
+
+        function initlocationTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'locationTable',
+                url: ctx + 'admin/clothesType/locationList',
+                toolbar:"#locationToolbar",
+                defaultToolbar:[],
+                cols: [[
+                    {type: 'checkbox'},
+                    {type: 'numbers', title: '', width: 80},
+                    {title: '操作', toolbar: '#locationOption', minWidth: 200, align: 'center'},
+                    {field: 'name', title: '名称', minWidth: 150,align:'center'},
+                    {field: 'code', title: '编码', minWidth: 150,align:'center'},
+                    {field: 'orderNum', title: '序号', minWidth: 100,align:'center'},
+                    {field: 'price', title: '价格', minWidth: 150,align:'center'},
+                    {field: 'image',title: '小图标',
+                        templet: function (d) {
+                            return '<a lay-event="seelocationImage">' +
+                                '<img id="seelocationImage' + d.id + '" src="' + d.image +
+                                '" alt="小图标" style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px; cursor: pointer;">' +
+                                '</a>';
+                        },
+                    minWidth: 150,align: 'center'},
+                ]]
+            });
+        }
+
+
+        // 查询按钮
+        $query.on('click', function () {
+            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+            tableIns.reload({where: params, page: {curr: 1}});
+        });
+
+        // 刷新按钮
+        $reset.on('click', function () {
+            $searchForm[0].reset();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+                // name: $searchForm.find('input[name="name"]').val().trim(),
+                // state: $searchForm.find("select[name='state']").val(),
+                // categoryId: $searchForm.find("select[name='categoryId']").val(),
+            };
+        }
+
+    })
+</script>
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/locationSet.html b/src/main/resources/templates/febs/views/modules/clothesType/locationSet.html
new file mode 100644
index 0000000..1ccf373
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/locationSet.html
@@ -0,0 +1,128 @@
+<div class="layui-fluid layui-anim febs-anim" id="location-set" lay-title="图案位置配置">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="location-type-set">
+                <form class="layui-form" action="" lay-filter="location-type-set-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">图案位置配置</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <input type="text" name="typeId"
+                                   placeholder="" autoComplete="off" class="layui-input febs-hide">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-form-item">
+                                    <div id="locationSetMove"></div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="location-type-set-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script data-th-inline="javascript">
+    layui.use(['febs','form', 'transfer'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            form = layui.form,
+            transfer = layui.transfer,
+            locationTypeAll = [[${locationTypeAll}]],
+            locationTypeChoose = [[${locationTypeChoose}]],
+            typeId = [[${typeId}]],
+            $view = $('#location-set'),
+
+            $locationSetMoveQuery = $view.find('#locationSetMoveQuery')
+        ;
+
+        // 查询按钮
+        $locationSetMoveQuery.on('click', function () {
+            console.log(transfer.getData('locationSetMove-set'))
+
+            let data1 = transfer.getData('locationSetMove-set');
+            //获取data1中的value,返回一个数组
+            let locationIdList = data1.map(function(item){
+                return item.value;
+            });
+
+            console.log(locationIdList)
+        });
+
+
+        form.render();
+
+        locationTypeSetInit();
+
+        function locationTypeSetInit() {
+            console.log("locationTypeAll:", locationTypeAll); // 调试信息
+            console.log("locationTypeChoose:", locationTypeChoose); // 调试信息
+            console.log("typeId:", typeId); // 调试信息
+            form.val("location-type-set-form", {
+                "typeId": typeId,
+            });
+            // 转换数据格式(假设接口返回的数据结构需要处理)
+            var dataLeft = locationTypeAll.map(function(item){
+                return {
+                    value: item.id,  // 值字段
+                    title: item.name // 显示文本
+                }
+            });
+            var dataRight = locationTypeChoose.map(function(item){
+                return {
+                    value: item,  // 值字段
+                }
+            });
+
+            // 渲染穿梭框
+            transfer.render({
+                elem: '#locationSetMove',
+                data: dataLeft,
+                id: 'locationSetMove-set', // 唯一标识
+                title: ['待选择列表', '已选择列表'],
+                width: 300,
+                height: 400,
+                showSearch: true,
+                value: locationTypeChoose,
+            });
+        }
+
+        form.on('submit(location-type-set-form-submit)', function (data) {
+            let data1 = transfer.getData('locationSetMove-set');
+            //获取data1中的value,返回一个数组
+            let locationIdList = data1.map(function(item){
+                return item.value;
+            });
+            data.field.chooseIds = locationIdList;
+            data.field.typeId = typeId;
+            $.ajax({
+                'url':ctx + 'admin/clothesType/locationSet',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-type').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/patternAdd.html b/src/main/resources/templates/febs/views/modules/clothesType/patternAdd.html
new file mode 100644
index 0000000..c09063a
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/patternAdd.html
@@ -0,0 +1,200 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-pattern-add" lay-title="新增">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="pattern-add">
+                <form class="layui-form" action="" lay-filter="pattern-add-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">名称:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">编码:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="code" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">图案类型:</label>
+                                        <div class="layui-input-block">
+                                            <select name="type">
+                                                <option value="1">文字</option>
+                                                <option value="2">图案</option>
+                                                <option value="3">文字和图案</option>
+                                            </select>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">排序:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="orderNum" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">价格:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="price" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">小图标:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="patternImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="patternImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="image" lay-verify="required" name="image" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label febs-form-item-require">详情介绍:</label>
+                                    <div class="layui-input-block">
+                                        <div style="border: 1px solid #ccc;">
+                                            <div id="pattern-toolbar-container" class="toolbar"></div>
+                                            <div id="pattern-text-container" class="text" style="height: 450px;"></div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="pattern-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect','jquery'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            table = layui.table,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            laydate = layui.laydate,
+            eleTree = layui.eleTree,
+            $view = $('#pattern-add'),
+            layedit = layui.layedit,
+            upload = layui.upload,
+            validate = layui.validate,
+            element = layui.element;
+
+        form.render();
+
+        const E = window.wangEditor;
+        const editor = new E('#pattern-toolbar-container', '#pattern-text-container'); // 传入两个元素
+        editor.config.showLinkImg = false;
+        editor.config.uploadFileName = 'file';
+        editor.config.customUploadImg = function (files, insertImgFn) {
+            // files 是 input 中选中的文件列表
+            // insertImgFn 是获取图片 url 后,插入到编辑器的方法
+            // 上传图片,返回结果,将图片插入到编辑器中
+            for (let i = 0; i < files.length; i++){
+                var form = new FormData();
+                form.append("file", files[0]);
+                $.ajax({
+                    url:'/admin/goods/uploadFileBase64',
+                    type: "post",
+                    processData: false,
+                    contentType: false,
+                    data: form,
+                    dataType: 'json',
+                    success(res) {
+                        // 上传代码返回结果之后,将图片插入到编辑器中
+                        insertImgFn(res.data.src, res.data.title, '')
+                    }
+                })
+            }
+        };
+        editor.create();
+
+        //图片上传
+        upload.render({
+            elem: '#patternImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#patternImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#image").val(res.data.src);
+            }
+        });
+
+        form.on('submit(pattern-form-submit)', function (data) {
+            data.field.content = editor.txt.html();
+            $.ajax({
+                'url':ctx + 'admin/clothesType/patternAdd',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-pattern').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+    });
+</script>
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/patternInfo.html b/src/main/resources/templates/febs/views/modules/clothesType/patternInfo.html
new file mode 100644
index 0000000..5bd799b
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/patternInfo.html
@@ -0,0 +1,231 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-pattern-Info" lay-title="编辑">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="pattern-info">
+                <form class="layui-form" action="" lay-filter="pattern-info-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <input type="text" name="id"
+                                   placeholder="" autoComplete="off" class="layui-input febs-hide">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">名称:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">编码:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="code" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">图案类型:</label>
+                                        <div class="layui-input-block">
+                                            <select name="type">
+                                                <option value="1">文字</option>
+                                                <option value="2">图案</option>
+                                                <option value="3">文字和图案</option>
+                                            </select>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">排序:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="orderNum" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">价格:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="price" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">小图标:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="patternImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="patternImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="image" lay-verify="required" name="image" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label febs-form-item-require">详情介绍:</label>
+                                    <div class="layui-input-block">
+                                        <div style="border: 1px solid #ccc;">
+                                            <div id="pattern-toolbar-container" class="toolbar"></div>
+                                            <div id="pattern-text-container" class="text" style="height: 450px;"></div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="pattern-info-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+<style>
+    .blue-border {
+        border-left-color: #2db7f5;
+        font-size: 18px;
+    }
+    .layui-table-cell {
+        height:auto;
+    }
+    .layui-upload-list {
+        margin: 0 !important;
+    }
+    .multi-images {
+        margin: 0 5px !important;
+    }
+</style>
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'validate','formSelects', 'table', 'upload'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            table = layui.table,
+            form = layui.form,
+            $view = $('#pattern-info'),
+            clothesPattern = [[${clothesPattern}]],
+            upload = layui.upload,
+            validate = layui.validate;
+
+        form.render();
+
+        const E = window.wangEditor;
+        const editor = new E('#pattern-toolbar-container', '#pattern-text-container'); // 传入两个元素
+        editor.config.showLinkImg = false;
+        editor.config.uploadFileName = 'file';
+        editor.config.customUploadImg = function (files, insertImgFn) {
+            // files 是 input 中选中的文件列表
+            // insertImgFn 是获取图片 url 后,插入到编辑器的方法
+            // 上传图片,返回结果,将图片插入到编辑器中
+            for (let i = 0; i < files.length; i++){
+                var form = new FormData();
+                form.append("file", files[0]);
+                $.ajax({
+                    url:'/admin/goods/uploadFileBase64',
+                    type: "post",
+                    processData: false,
+                    contentType: false,
+                    data: form,
+                    dataType: 'json',
+                    success(res) {
+                        // 上传代码返回结果之后,将图片插入到编辑器中
+                        insertImgFn(res.data.src, res.data.title, '')
+                    }
+                })
+            }
+        };
+        editor.create();
+
+        //图片上传
+        upload.render({
+            elem: '#patternImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#patternImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#image").val(res.data.src);
+            }
+        });
+
+        initPatternInfo();
+
+        function initPatternInfo() {
+            console.log("clothesPattern:", clothesPattern);
+            form.val("pattern-info-form", {
+                "id": clothesPattern.id,
+                "name": clothesPattern.name,
+                "code": clothesPattern.code,
+                "price": clothesPattern.price,
+                "type": clothesPattern.type,
+                "orderNum": clothesPattern.orderNum,
+            });
+
+
+            $('#patternImageUpload').append('<img src="' + clothesPattern.image + '" alt="" class="layui-upload-img single-image" style="width: 130px">');
+            $("#image").val(clothesPattern.image);
+
+            editor.txt.html(clothesPattern.content);
+
+        }
+
+        form.on('submit(pattern-info-form-submit)', function (data) {
+            data.field.content = editor.txt.html();
+            $.ajax({
+                'url':ctx + 'admin/clothesType/patternUpdate',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-pattern').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/patternList.html b/src/main/resources/templates/febs/views/modules/clothesType/patternList.html
new file mode 100644
index 0000000..5134a83
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/patternList.html
@@ -0,0 +1,195 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-pattern" lay-title="图案管理">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <form class="layui-form layui-table-form" lay-filter="pattern-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                </div>
+                            </div>
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+                                    <i class="layui-icon">&#xe79b;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="patternTable" lay-data="{id: 'patternTable'}"></table>
+
+                    <style type="text/css">
+                        .layui-table-cell{
+                            text-align:center;
+                            height: auto;
+                            white-space: nowrap; /*文本不会换行,在同一行显示*/
+                            overflow: hidden; /*超出隐藏*/
+                            text-overflow: ellipsis; /*省略号显示*/
+                        }
+                        .layui-table img{
+                            max-width:100px
+                        }
+                        ::-webkit-scrollbar {
+                            height: 20px !important;
+                            background-color: #f4f4f4;
+                        }
+                    </style>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="patternToolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="patternAdd:add" lay-event="patternAdd">新增</button>
+    </div>
+</script>
+
+<script type="text/html" id="patternOption">
+    <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="patternInfo:view" lay-event="patternInfoEvent">编辑</button>
+</script>
+<script type="text/html" id="patternTypeOption">
+    {{#
+    var type = {
+    1: {title: '文字', color: 'green'},
+    2: {title: '图案', color: 'blue'},
+    3: {title: '文字和图案', color: 'red'},
+    }[d.type];
+    }}
+    <span class="layui-badge febs-bg-{{type.color}}">{{ type.title }}</span>
+</script>
+
+
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-pattern'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'orderNum', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initPatternTable();
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('tool(patternTable)', function (obj) {
+            console.log("触发事件:", obj.event); // 调试信息
+            var data = obj.data,
+                layEvent = obj.event;
+
+            if (layEvent === 'seePatternImage') {
+                var t = $view.find('#seePatternImage'+data.id+'');
+                //页面层
+                layer.open({
+                    type: 1,
+                    title: "小图标",
+                    skin: 'layui-layer-rim', //加上边框
+                    area: ['100%', '100%'], //宽高
+                    shadeClose: true, //开启遮罩关闭
+                    end: function (index, layero) {
+                        return false;
+                    },
+                    content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>'
+                });
+            }
+
+            if (layEvent === 'patternInfoEvent') {
+                febs.modal.open('编辑','modules/clothesType/patternInfo/' + data.id, {
+                    btn: ['提交', '取消'],
+                    area: ['100%', '100%'],
+                    yes: function (index, layero) {
+                        $('#febs-pattern-Info').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+        });
+
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('toolbar(patternTable)', function (obj) {
+            let data = obj.data,
+                layEvent = obj.event;
+            console.log("触发事件:", obj.event); // 调试信息
+            if(layEvent === 'patternAdd'){
+                febs.modal.open('新增', 'modules/clothesType/patternAdd/', {
+                    btn: ['提交', '取消'],
+                    area:['100%','100%'],
+                    yes: function (index, layero) {
+                        $('#febs-pattern-add').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+
+        });
+
+        function initPatternTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'patternTable',
+                url: ctx + 'admin/clothesType/patternList',
+                toolbar:"#patternToolbar",
+                defaultToolbar:[],
+                cols: [[
+                    {type: 'checkbox'},
+                    {type: 'numbers', title: '', width: 80},
+                    {title: '操作', toolbar: '#patternOption', minWidth: 200, align: 'center'},
+                    {field: 'name', title: '名称', minWidth: 150,align:'center'},
+                    {field: 'code', title: '编码', minWidth: 150,align:'center'},
+                    {field: 'orderNum', title: '序号', minWidth: 100,align:'center'},
+                    {field: 'price', title: '价格', minWidth: 150,align:'center'},
+                    {title: '图案类型', templet: '#patternTypeOption', minWidth: 150,align:'center'},
+                    {field: 'image',title: '小图标',
+                        templet: function (d) {
+                            return '<a lay-event="seePatternImage">' +
+                                '<img id="seePatternImage' + d.id + '" src="' + d.image +
+                                '" alt="小图标" style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px; cursor: pointer;">' +
+                                '</a>';
+                        },
+                    minWidth: 150,align: 'center'},
+                ]]
+            });
+        }
+
+
+        // 查询按钮
+        $query.on('click', function () {
+            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+            tableIns.reload({where: params, page: {curr: 1}});
+        });
+
+        // 刷新按钮
+        $reset.on('click', function () {
+            $searchForm[0].reset();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+                // name: $searchForm.find('input[name="name"]').val().trim(),
+                // state: $searchForm.find("select[name='state']").val(),
+                // categoryId: $searchForm.find("select[name='categoryId']").val(),
+            };
+        }
+
+    })
+</script>
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/patternSet.html b/src/main/resources/templates/febs/views/modules/clothesType/patternSet.html
new file mode 100644
index 0000000..8856598
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/patternSet.html
@@ -0,0 +1,128 @@
+<div class="layui-fluid layui-anim febs-anim" id="pattern-set" lay-title="图案文字配置">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="pattern-type-set">
+                <form class="layui-form" action="" lay-filter="pattern-type-set-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">图案文字配置</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <input type="text" name="typeId"
+                                   placeholder="" autoComplete="off" class="layui-input febs-hide">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-form-item">
+                                    <div id="patternSetMove"></div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="pattern-type-set-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script data-th-inline="javascript">
+    layui.use(['febs','form', 'transfer'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            form = layui.form,
+            transfer = layui.transfer,
+            patternTypeAll = [[${patternTypeAll}]],
+            patternTypeChoose = [[${patternTypeChoose}]],
+            typeId = [[${typeId}]],
+            $view = $('#pattern-set'),
+
+            $patternSetMoveQuery = $view.find('#patternSetMoveQuery')
+        ;
+
+        // 查询按钮
+        $patternSetMoveQuery.on('click', function () {
+            console.log(transfer.getData('patternSetMove-set'))
+
+            let data1 = transfer.getData('patternSetMove-set');
+            //获取data1中的value,返回一个数组
+            let patternIdList = data1.map(function(item){
+                return item.value;
+            });
+
+            console.log(patternIdList)
+        });
+
+
+        form.render();
+
+        patternTypeSetInit();
+
+        function patternTypeSetInit() {
+            console.log("patternTypeAll:", patternTypeAll); // 调试信息
+            console.log("patternTypeChoose:", patternTypeChoose); // 调试信息
+            console.log("typeId:", typeId); // 调试信息
+            form.val("pattern-type-set-form", {
+                "typeId": typeId,
+            });
+            // 转换数据格式(假设接口返回的数据结构需要处理)
+            var dataLeft = patternTypeAll.map(function(item){
+                return {
+                    value: item.id,  // 值字段
+                    title: item.name // 显示文本
+                }
+            });
+            var dataRight = patternTypeChoose.map(function(item){
+                return {
+                    value: item,  // 值字段
+                }
+            });
+
+            // 渲染穿梭框
+            transfer.render({
+                elem: '#patternSetMove',
+                data: dataLeft,
+                id: 'patternSetMove-set', // 唯一标识
+                title: ['待选择列表', '已选择列表'],
+                width: 300,
+                height: 400,
+                showSearch: true,
+                value: patternTypeChoose,
+            });
+        }
+
+        form.on('submit(pattern-type-set-form-submit)', function (data) {
+            let data1 = transfer.getData('patternSetMove-set');
+            //获取data1中的value,返回一个数组
+            let patternIdList = data1.map(function(item){
+                return item.value;
+            });
+            data.field.chooseIds = patternIdList;
+            data.field.typeId = typeId;
+            $.ajax({
+                'url':ctx + 'admin/clothesType/patternSet',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-type').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/sizeAdd.html b/src/main/resources/templates/febs/views/modules/clothesType/sizeAdd.html
new file mode 100644
index 0000000..f0c5c06
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/sizeAdd.html
@@ -0,0 +1,199 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-size-add" lay-title="新增">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="size-add">
+                <form class="layui-form" action="" lay-filter="size-add-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">名称:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">编码:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="code" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">尺码类型:</label>
+                                        <div class="layui-input-block">
+                                            <select name="type">
+                                                <option value="1">衣服</option>
+                                                <option value="2">裤子</option>
+                                            </select>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">排序:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="orderNum" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">价格:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="price" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">小图标:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="sizeImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="sizeImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="image" lay-verify="required" name="image" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label febs-form-item-require">详情介绍:</label>
+                                    <div class="layui-input-block">
+                                        <div style="border: 1px solid #ccc;">
+                                            <div id="size-toolbar-container" class="toolbar"></div>
+                                            <div id="size-text-container" class="text" style="height: 450px;"></div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="size-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect','jquery'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            table = layui.table,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            laydate = layui.laydate,
+            eleTree = layui.eleTree,
+            $view = $('#size-add'),
+            layedit = layui.layedit,
+            upload = layui.upload,
+            validate = layui.validate,
+            element = layui.element;
+
+        form.render();
+
+        const E = window.wangEditor;
+        const editor = new E('#size-toolbar-container', '#size-text-container'); // 传入两个元素
+        editor.config.showLinkImg = false;
+        editor.config.uploadFileName = 'file';
+        editor.config.customUploadImg = function (files, insertImgFn) {
+            // files 是 input 中选中的文件列表
+            // insertImgFn 是获取图片 url 后,插入到编辑器的方法
+            // 上传图片,返回结果,将图片插入到编辑器中
+            for (let i = 0; i < files.length; i++){
+                var form = new FormData();
+                form.append("file", files[0]);
+                $.ajax({
+                    url:'/admin/goods/uploadFileBase64',
+                    type: "post",
+                    processData: false,
+                    contentType: false,
+                    data: form,
+                    dataType: 'json',
+                    success(res) {
+                        // 上传代码返回结果之后,将图片插入到编辑器中
+                        insertImgFn(res.data.src, res.data.title, '')
+                    }
+                })
+            }
+        };
+        editor.create();
+
+        //图片上传
+        upload.render({
+            elem: '#sizeImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#sizeImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#image").val(res.data.src);
+            }
+        });
+
+        form.on('submit(size-form-submit)', function (data) {
+            data.field.content = editor.txt.html();
+            $.ajax({
+                'url':ctx + 'admin/clothesType/sizeAdd',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-size').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+    });
+</script>
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/sizeInfo.html b/src/main/resources/templates/febs/views/modules/clothesType/sizeInfo.html
new file mode 100644
index 0000000..1f03b47
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/sizeInfo.html
@@ -0,0 +1,230 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-size-Info" lay-title="编辑">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="size-info">
+                <form class="layui-form" action="" lay-filter="size-info-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <input type="text" name="id"
+                                   placeholder="" autoComplete="off" class="layui-input febs-hide">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">名称:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">编码:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="code" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">尺码类型:</label>
+                                        <div class="layui-input-block">
+                                            <select name="type">
+                                                <option value="1">衣服</option>
+                                                <option value="2">裤子</option>
+                                            </select>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">排序:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="orderNum" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">价格:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="price" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">小图标:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="sizeImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="sizeImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="image" lay-verify="required" name="image" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label febs-form-item-require">详情介绍:</label>
+                                    <div class="layui-input-block">
+                                        <div style="border: 1px solid #ccc;">
+                                            <div id="size-toolbar-container" class="toolbar"></div>
+                                            <div id="size-text-container" class="text" style="height: 450px;"></div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="size-info-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+<style>
+    .blue-border {
+        border-left-color: #2db7f5;
+        font-size: 18px;
+    }
+    .layui-table-cell {
+        height:auto;
+    }
+    .layui-upload-list {
+        margin: 0 !important;
+    }
+    .multi-images {
+        margin: 0 5px !important;
+    }
+</style>
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'validate','formSelects', 'table', 'upload'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            table = layui.table,
+            form = layui.form,
+            $view = $('#size-info'),
+            clothesSize = [[${clothesSize}]],
+            upload = layui.upload,
+            validate = layui.validate;
+
+        form.render();
+
+        const E = window.wangEditor;
+        const editor = new E('#size-toolbar-container', '#size-text-container'); // 传入两个元素
+        editor.config.showLinkImg = false;
+        editor.config.uploadFileName = 'file';
+        editor.config.customUploadImg = function (files, insertImgFn) {
+            // files 是 input 中选中的文件列表
+            // insertImgFn 是获取图片 url 后,插入到编辑器的方法
+            // 上传图片,返回结果,将图片插入到编辑器中
+            for (let i = 0; i < files.length; i++){
+                var form = new FormData();
+                form.append("file", files[0]);
+                $.ajax({
+                    url:'/admin/goods/uploadFileBase64',
+                    type: "post",
+                    processData: false,
+                    contentType: false,
+                    data: form,
+                    dataType: 'json',
+                    success(res) {
+                        // 上传代码返回结果之后,将图片插入到编辑器中
+                        insertImgFn(res.data.src, res.data.title, '')
+                    }
+                })
+            }
+        };
+        editor.create();
+
+        //图片上传
+        upload.render({
+            elem: '#sizeImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#sizeImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#image").val(res.data.src);
+            }
+        });
+
+        initSizeInfo();
+
+        function initSizeInfo() {
+            console.log("clothesSize:", clothesSize);
+            form.val("size-info-form", {
+                "id": clothesSize.id,
+                "name": clothesSize.name,
+                "type": clothesSize.type,
+                "code": clothesSize.code,
+                "price": clothesSize.price,
+                "orderNum": clothesSize.orderNum,
+            });
+
+
+            $('#sizeImageUpload').append('<img src="' + clothesSize.image + '" alt="" class="layui-upload-img single-image" style="width: 130px">');
+            $("#image").val(clothesSize.image);
+
+            editor.txt.html(clothesSize.content);
+
+        }
+
+        form.on('submit(size-info-form-submit)', function (data) {
+            data.field.content = editor.txt.html();
+            $.ajax({
+                'url':ctx + 'admin/clothesType/sizeUpdate',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-size').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/sizeList.html b/src/main/resources/templates/febs/views/modules/clothesType/sizeList.html
new file mode 100644
index 0000000..957e0a0
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/sizeList.html
@@ -0,0 +1,195 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-size" lay-title="尺码管理">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <form class="layui-form layui-table-form" lay-filter="size-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                </div>
+                            </div>
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+                                    <i class="layui-icon">&#xe79b;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="sizeTable" lay-data="{id: 'sizeTable'}"></table>
+
+                    <style type="text/css">
+                        .layui-table-cell{
+                            text-align:center;
+                            height: auto;
+                            white-space: nowrap; /*文本不会换行,在同一行显示*/
+                            overflow: hidden; /*超出隐藏*/
+                            text-overflow: ellipsis; /*省略号显示*/
+                        }
+                        .layui-table img{
+                            max-width:100px
+                        }
+                        ::-webkit-scrollbar {
+                            height: 20px !important;
+                            background-color: #f4f4f4;
+                        }
+                    </style>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="sizeToolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="sizeAdd:add" lay-event="sizeAdd">新增</button>
+    </div>
+</script>
+
+<script type="text/html" id="sizeOption">
+    <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="sizeInfo:view" lay-event="sizeInfoEvent">编辑</button>
+</script>
+
+<script type="text/html" id="typeOption">
+    {{#
+    var type = {
+    1: {title: '衣服', color: 'green'},
+    2: {title: '裤子', color: 'blue'},
+    }[d.type];
+    }}
+    <span class="layui-badge febs-bg-{{type.color}}">{{ type.title }}</span>
+</script>
+
+
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-size'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'orderNum', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initSizeTable();
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('tool(sizeTable)', function (obj) {
+            console.log("触发事件:", obj.event); // 调试信息
+            var data = obj.data,
+                layEvent = obj.event;
+
+            if (layEvent === 'seeSizeImage') {
+                var t = $view.find('#seeSizeImage'+data.id+'');
+                //页面层
+                layer.open({
+                    type: 1,
+                    title: "小图标",
+                    skin: 'layui-layer-rim', //加上边框
+                    area: ['100%', '100%'], //宽高
+                    shadeClose: true, //开启遮罩关闭
+                    end: function (index, layero) {
+                        return false;
+                    },
+                    content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>'
+                });
+            }
+
+            if (layEvent === 'sizeInfoEvent') {
+                febs.modal.open('编辑','modules/clothesType/sizeInfo/' + data.id, {
+                    btn: ['提交', '取消'],
+                    area: ['100%', '100%'],
+                    yes: function (index, layero) {
+                        $('#febs-size-Info').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+        });
+
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('toolbar(sizeTable)', function (obj) {
+            let data = obj.data,
+                layEvent = obj.event;
+            console.log("触发事件:", obj.event); // 调试信息
+            if(layEvent === 'sizeAdd'){
+                febs.modal.open('新增', 'modules/clothesType/sizeAdd/', {
+                    btn: ['提交', '取消'],
+                    area:['100%','100%'],
+                    yes: function (index, layero) {
+                        $('#febs-size-add').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+
+        });
+
+        function initSizeTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'sizeTable',
+                url: ctx + 'admin/clothesType/sizeList',
+                toolbar:"#sizeToolbar",
+                defaultToolbar:[],
+                cols: [[
+                    {type: 'checkbox'},
+                    {type: 'numbers', title: '', width: 80},
+                    {title: '操作', toolbar: '#sizeOption', minWidth: 200, align: 'center'},
+                    {field: 'name', title: '名称', minWidth: 150,align:'center'},
+                    {field: 'code', title: '编码', minWidth: 150,align:'center'},
+                    {field: 'orderNum', title: '序号', minWidth: 100,align:'center'},
+                    {title: '尺码类型', templet: '#typeOption', minWidth: 150,align:'center'},
+                    {field: 'price', title: '价格', minWidth: 150,align:'center'},
+                    {field: 'image',title: '小图标',
+                        templet: function (d) {
+                            return '<a lay-event="seeSizeImage">' +
+                                '<img id="seeSizeImage' + d.id + '" src="' + d.image +
+                                '" alt="小图标" style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px; cursor: pointer;">' +
+                                '</a>';
+                        },
+                    minWidth: 150,align: 'center'},
+                ]]
+            });
+        }
+
+
+        // 查询按钮
+        $query.on('click', function () {
+            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+            tableIns.reload({where: params, page: {curr: 1}});
+        });
+
+        // 刷新按钮
+        $reset.on('click', function () {
+            $searchForm[0].reset();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+                // name: $searchForm.find('input[name="name"]').val().trim(),
+                // state: $searchForm.find("select[name='state']").val(),
+                // categoryId: $searchForm.find("select[name='categoryId']").val(),
+            };
+        }
+
+    })
+</script>
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/sizeSet.html b/src/main/resources/templates/febs/views/modules/clothesType/sizeSet.html
new file mode 100644
index 0000000..89a5906
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/sizeSet.html
@@ -0,0 +1,128 @@
+<div class="layui-fluid layui-anim febs-anim" id="size-set" lay-title="尺码配置">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="size-type-set">
+                <form class="layui-form" action="" lay-filter="size-type-set-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">尺码配置</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <input type="text" name="typeId"
+                                   placeholder="" autoComplete="off" class="layui-input febs-hide">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-form-item">
+                                    <div id="sizeSetMove"></div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="size-type-set-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script data-th-inline="javascript">
+    layui.use(['febs','form', 'transfer'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            form = layui.form,
+            transfer = layui.transfer,
+            sizeTypeAll = [[${sizeTypeAll}]],
+            sizeTypeChoose = [[${sizeTypeChoose}]],
+            typeId = [[${typeId}]],
+            $view = $('#size-set'),
+
+            $sizeSetMoveQuery = $view.find('#sizeSetMoveQuery')
+        ;
+
+        // 查询按钮
+        $sizeSetMoveQuery.on('click', function () {
+            console.log(transfer.getData('sizeSetMove-set'))
+
+            let data1 = transfer.getData('sizeSetMove-set');
+            //获取data1中的value,返回一个数组
+            let sizeIdList = data1.map(function(item){
+                return item.value;
+            });
+
+            console.log(sizeIdList)
+        });
+
+
+        form.render();
+
+        sizeTypeSetInit();
+
+        function sizeTypeSetInit() {
+            console.log("sizeTypeAll:", sizeTypeAll); // 调试信息
+            console.log("sizeTypeChoose:", sizeTypeChoose); // 调试信息
+            console.log("typeId:", typeId); // 调试信息
+            form.val("size-type-set-form", {
+                "typeId": typeId,
+            });
+            // 转换数据格式(假设接口返回的数据结构需要处理)
+            var dataLeft = sizeTypeAll.map(function(item){
+                return {
+                    value: item.id,  // 值字段
+                    title: item.name // 显示文本
+                }
+            });
+            var dataRight = sizeTypeChoose.map(function(item){
+                return {
+                    value: item,  // 值字段
+                }
+            });
+
+            // 渲染穿梭框
+            transfer.render({
+                elem: '#sizeSetMove',
+                data: dataLeft,
+                id: 'sizeSetMove-set', // 唯一标识
+                title: ['待选择列表', '已选择列表'],
+                width: 300,
+                height: 400,
+                showSearch: true,
+                value: sizeTypeChoose,
+            });
+        }
+
+        form.on('submit(size-type-set-form-submit)', function (data) {
+            let data1 = transfer.getData('sizeSetMove-set');
+            //获取data1中的value,返回一个数组
+            let sizeIdList = data1.map(function(item){
+                return item.value;
+            });
+            data.field.chooseIds = sizeIdList;
+            data.field.typeId = typeId;
+            $.ajax({
+                'url':ctx + 'admin/clothesType/sizeSet',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-type').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/typeAdd.html b/src/main/resources/templates/febs/views/modules/clothesType/typeAdd.html
new file mode 100644
index 0000000..4c34423
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/typeAdd.html
@@ -0,0 +1,254 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-type-add" lay-title="新增">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="clothes-type-add">
+                <form class="layui-form" action="" lay-filter="clothes-type-add-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">名称:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">排序:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="orderNum" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">小图标:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="typeImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="typeImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="image" lay-verify="required" name="image" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">正面图:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="imageFrontUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="imageFrontUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">正面图链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="imageFront" lay-verify="required" name="imageFront" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">反面图:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="imageBackUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="imageBackUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">反面图链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="imageBack" lay-verify="required" name="imageBack" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label febs-form-item-require">详情介绍:</label>
+                                    <div class="layui-input-block">
+                                        <div style="border: 1px solid #ccc;">
+                                            <div id="clothesType-toolbar-container" class="toolbar"></div>
+                                            <div id="clothesType-text-container" class="text" style="height: 450px;"></div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="type-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+<style>
+    .blue-border {
+        border-left-color: #2db7f5;
+        font-size: 18px;
+    }
+    .layui-table-cell {
+        height:auto;
+    }
+</style>
+
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect','jquery'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            table = layui.table,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            laydate = layui.laydate,
+            eleTree = layui.eleTree,
+            $view = $('#clothes-type-add'),
+            layedit = layui.layedit,
+            upload = layui.upload,
+            validate = layui.validate,
+            element = layui.element;
+
+        form.render();
+
+        const E = window.wangEditor;
+        const editor = new E('#clothesType-toolbar-container', '#clothesType-text-container'); // 传入两个元素
+        editor.config.showLinkImg = false;
+        editor.config.uploadFileName = 'file';
+        editor.config.customUploadImg = function (files, insertImgFn) {
+            // files 是 input 中选中的文件列表
+            // insertImgFn 是获取图片 url 后,插入到编辑器的方法
+            // 上传图片,返回结果,将图片插入到编辑器中
+            for (let i = 0; i < files.length; i++){
+                var form = new FormData();
+                form.append("file", files[0]);
+                $.ajax({
+                    url:'/admin/goods/uploadFileBase64',
+                    type: "post",
+                    processData: false,
+                    contentType: false,
+                    data: form,
+                    dataType: 'json',
+                    success(res) {
+                        // 上传代码返回结果之后,将图片插入到编辑器中
+                        insertImgFn(res.data.src, res.data.title, '')
+                    }
+                })
+            }
+        };
+        editor.create();
+
+        //图片上传
+        upload.render({
+            elem: '#typeImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#typeImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#image").val(res.data.src);
+            }
+        });
+
+        //图片上传
+        upload.render({
+            elem: '#imageFrontUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#imageFrontUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#imageFront").val(res.data.src);
+            }
+        });
+
+        //图片上传
+        upload.render({
+            elem: '#imageBackUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#imageBackUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#imageBack").val(res.data.src);
+            }
+        });
+
+        form.on('submit(type-form-submit)', function (data) {
+            data.field.content = editor.txt.html();
+            $.ajax({
+                'url':ctx + 'admin/clothesType/typeAdd',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-type').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+    });
+</script>
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/typeInfo.html b/src/main/resources/templates/febs/views/modules/clothesType/typeInfo.html
new file mode 100644
index 0000000..5e2d7d5
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/typeInfo.html
@@ -0,0 +1,281 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-type-Info" lay-title="编辑">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="type-info">
+                <form class="layui-form" action="" lay-filter="type-info-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <input type="text" name="id"
+                                   placeholder="" autoComplete="off" class="layui-input febs-hide">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">名称:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">排序:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="orderNum" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">小图标:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="typeImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="typeImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="image" lay-verify="required" name="image" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">正面图:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="imageFrontUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="imageFrontUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">正面图链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="imageFront" lay-verify="required" name="imageFront" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">反面图:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="imageBackUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="imageBackUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">反面图链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="imageBack" lay-verify="required" name="imageBack" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label febs-form-item-require">详情介绍:</label>
+                                    <div class="layui-input-block">
+                                        <div style="border: 1px solid #ccc;">
+                                            <div id="clothesType-toolbar-container" class="toolbar"></div>
+                                            <div id="clothesType-text-container" class="text" style="height: 450px;"></div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="type-info-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+<style>
+    .blue-border {
+        border-left-color: #2db7f5;
+        font-size: 18px;
+    }
+    .layui-table-cell {
+        height:auto;
+    }
+    .layui-upload-list {
+        margin: 0 !important;
+    }
+    .multi-images {
+        margin: 0 5px !important;
+    }
+</style>
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'validate','formSelects', 'table', 'upload'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            table = layui.table,
+            form = layui.form,
+            $view = $('#type-info'),
+            clothesType = [[${clothesType}]],
+            upload = layui.upload,
+            validate = layui.validate;
+
+        form.render();
+
+        const E = window.wangEditor;
+        const editor = new E('#clothesType-toolbar-container', '#clothesType-text-container'); // 传入两个元素
+        editor.config.showLinkImg = false;
+        editor.config.uploadFileName = 'file';
+        editor.config.customUploadImg = function (files, insertImgFn) {
+            // files 是 input 中选中的文件列表
+            // insertImgFn 是获取图片 url 后,插入到编辑器的方法
+            // 上传图片,返回结果,将图片插入到编辑器中
+            for (let i = 0; i < files.length; i++){
+                var form = new FormData();
+                form.append("file", files[0]);
+                $.ajax({
+                    url:'/admin/goods/uploadFileBase64',
+                    type: "post",
+                    processData: false,
+                    contentType: false,
+                    data: form,
+                    dataType: 'json',
+                    success(res) {
+                        // 上传代码返回结果之后,将图片插入到编辑器中
+                        insertImgFn(res.data.src, res.data.title, '')
+                    }
+                })
+            }
+        };
+        editor.create();
+
+        //图片上传
+        upload.render({
+            elem: '#typeImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#typeImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#image").val(res.data.src);
+            }
+        });
+
+        //图片上传
+        upload.render({
+            elem: '#imageFrontUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#imageFrontUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#imageFront").val(res.data.src);
+            }
+        });
+
+        //图片上传
+        upload.render({
+            elem: '#imageBackUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#imageBackUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#imageBack").val(res.data.src);
+            }
+        });
+
+        initClothesTypeInfo();
+
+        function initClothesTypeInfo() {
+            console.log("clothesType:", clothesType);
+            form.val("type-info-form", {
+                "id": clothesType.id,
+                "name": clothesType.name,
+                "orderNum": clothesType.orderNum,
+            });
+
+
+            $('#typeImageUpload').append('<img src="' + clothesType.image + '" alt="" class="layui-upload-img single-image" style="width: 130px">');
+            $("#image").val(clothesType.image);
+
+
+            $('#imageFrontUpload').append('<img src="' + clothesType.imageFront + '" alt="" class="layui-upload-img single-image" style="width: 130px">');
+            $("#imageFront").val(clothesType.imageFront);
+
+
+            $('#imageBackUpload').append('<img src="' + clothesType.imageBack + '" alt="" class="layui-upload-img single-image" style="width: 130px">');
+            $("#imageBack").val(clothesType.imageBack);
+
+            editor.txt.html(clothesType.content);
+
+        }
+
+        form.on('submit(type-info-form-submit)', function (data) {
+            data.field.content = editor.txt.html();
+            $.ajax({
+                'url':ctx + 'admin/clothesType/typeUpdate',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-type').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/typeList.html b/src/main/resources/templates/febs/views/modules/clothesType/typeList.html
new file mode 100644
index 0000000..69e3714
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/typeList.html
@@ -0,0 +1,439 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-type" lay-title="设计类型">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <form class="layui-form layui-table-form" lay-filter="clothesType-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                </div>
+                            </div>
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+                                    <i class="layui-icon">&#xe79b;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="clothesTypeTable" lay-data="{id: 'clothesTypeTable'}"></table>
+
+                    <style type="text/css">
+                        .layui-table-cell{
+                            text-align:center;
+                            height: auto;
+                            white-space: nowrap; /*文本不会换行,在同一行显示*/
+                            overflow: hidden; /*超出隐藏*/
+                            text-overflow: ellipsis; /*省略号显示*/
+                        }
+                        .layui-table img{
+                            max-width:100px
+                        }
+                        ::-webkit-scrollbar {
+                            height: 20px !important;
+                            background-color: #f4f4f4;
+                        }
+                    </style>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="user-option">
+    <span shiro:lacksPermission="list:view,add:add,votesActivityUpdate:update">
+        <span class="layui-badge-dot febs-bg-orange"></span> 无权限
+    </span>
+    <a lay-event="edit" shiro:hasPermission="votesActivityUpdate:update"><i
+            class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>
+</script>
+
+<script type="text/html" id="clothesTypeToolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="typeAdd:add" lay-event="typeAdd">新增</button>
+        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="artSet:view" lay-event="artSet">工艺配置</button>
+        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="sizeSet:view" lay-event="sizeSet">尺码配置</button>
+        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="clothSet:view" lay-event="clothSet">布料配置</button>
+        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="patternSet:view" lay-event="patternSet">图案文字配置</button>
+        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="locationSet:view" lay-event="locationSet">图案位置配置</button>
+    </div>
+</script>
+
+<script type="text/html" id="clothesTypeOption">
+    <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="typeInfo:view" lay-event="typeInfoEvent">编辑</button>
+</script>
+
+
+<script type="text/html" id="stateSwitch">
+    {{# if(d.state === 1) { }}
+    <input type="checkbox" value={{d.id}} lay-text="开启|关闭" checked lay-skin="switch" lay-filter="stateSwitch">
+    {{# } else { }}
+    <input type="checkbox" value={{d.id}} lay-text="开启|关闭" lay-skin="switch" lay-filter="stateSwitch">
+    {{# } }}
+</script>
+<script type="text/html" id="clothStateSwitch">
+    {{# if(d.clothState === 1) { }}
+    <input type="checkbox" value={{d.id}} lay-text="开启|关闭" checked lay-skin="switch" lay-filter="clothStateSwitch">
+    {{# } else { }}
+    <input type="checkbox" value={{d.id}} lay-text="开启|关闭" lay-skin="switch" lay-filter="clothStateSwitch">
+    {{# } }}
+</script>
+<script type="text/html" id="artStateSwitch">
+    {{# if(d.artState === 1) { }}
+    <input type="checkbox" value={{d.id}} lay-text="开启|关闭" checked lay-skin="switch" lay-filter="artStateSwitch">
+    {{# } else { }}
+    <input type="checkbox" value={{d.id}} lay-text="开启|关闭" lay-skin="switch" lay-filter="artStateSwitch">
+    {{# } }}
+</script>
+<script type="text/html" id="patternStateSwitch">
+    {{# if(d.patternState === 1) { }}
+    <input type="checkbox" value={{d.id}} lay-text="开启|关闭" checked lay-skin="switch" lay-filter="patternStateSwitch">
+    {{# } else { }}
+    <input type="checkbox" value={{d.id}} lay-text="开启|关闭" lay-skin="switch" lay-filter="patternStateSwitch">
+    {{# } }}
+</script>
+<script type="text/html" id="locationStateSwitch">
+    {{# if(d.locationState === 1) { }}
+    <input type="checkbox" value={{d.id}} lay-text="开启|关闭" checked lay-skin="switch" lay-filter="locationStateSwitch">
+    {{# } else { }}
+    <input type="checkbox" value={{d.id}} lay-text="开启|关闭" lay-skin="switch" lay-filter="locationStateSwitch">
+    {{# } }}
+</script>
+<script type="text/html" id="sizeStateSwitch">
+    {{# if(d.sizeState === 1) { }}
+    <input type="checkbox" value={{d.id}} lay-text="开启|关闭" checked lay-skin="switch" lay-filter="sizeStateSwitch">
+    {{# } else { }}
+    <input type="checkbox" value={{d.id}} lay-text="开启|关闭" lay-skin="switch" lay-filter="sizeStateSwitch">
+    {{# } }}
+</script>
+
+<style>
+    .layui-form-onswitch {
+        background-color: #5FB878 !important;
+    }
+</style>
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-type'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'orderNum', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initClothesTypeTable();
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('tool(clothesTypeTable)', function (obj) {
+            console.log("触发事件:", obj.event); // 调试信息
+            var data = obj.data,
+                layEvent = obj.event;
+
+            if (layEvent === 'seeImage') {
+                var t = $view.find('#seeImage'+data.id+'');
+                //页面层
+                layer.open({
+                    type: 1,
+                    title: "小图标",
+                    skin: 'layui-layer-rim', //加上边框
+                    area: ['100%', '100%'], //宽高
+                    shadeClose: true, //开启遮罩关闭
+                    end: function (index, layero) {
+                        return false;
+                    },
+                    content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>'
+                });
+            }
+
+            if (layEvent === 'seeImageFront') {
+                var t = $view.find('#seeImageFront'+data.id+'');
+                //页面层
+                layer.open({
+                    type: 1,
+                    title: "正面",
+                    skin: 'layui-layer-rim', //加上边框
+                    area: ['100%', '100%'], //宽高
+                    shadeClose: true, //开启遮罩关闭
+                    end: function (index, layero) {
+                        return false;
+                    },
+                    content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>'
+                });
+            }
+
+            if (layEvent === 'seeImageBack') {
+                var t = $view.find('#seeImageBack'+data.id+'');
+                //页面层
+                layer.open({
+                    type: 1,
+                    title: "反面",
+                    skin: 'layui-layer-rim', //加上边框
+                    area: ['100%', '100%'], //宽高
+                    shadeClose: true, //开启遮罩关闭
+                    end: function (index, layero) {
+                        return false;
+                    },
+                    content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>'
+                });
+            }
+            if (layEvent === 'typeInfoEvent') {
+                febs.modal.open('编辑','modules/clothesType/typeInfo/' + data.id, {
+                    btn: ['提交', '取消'],
+                    area: ['100%', '100%'],
+                    yes: function (index, layero) {
+                        $('#febs-type-Info').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+        });
+
+        form.on('switch(stateSwitch)', function (data) {
+            if (data.elem.checked) {
+                typeStateSwitch(1,data.value,1);
+            } else {
+                typeStateSwitch(1,data.value,0);
+            }
+        })
+
+        form.on('switch(clothStateSwitch)', function (data) {
+            if (data.elem.checked) {
+                typeStateSwitch(2,data.value,1);
+            } else {
+                typeStateSwitch(2,data.value,0);
+            }
+        })
+
+        form.on('switch(artStateSwitch)', function (data) {
+            if (data.elem.checked) {
+                typeStateSwitch(3,data.value,1);
+            } else {
+                typeStateSwitch(3,data.value,0);
+            }
+        })
+
+        form.on('switch(patternStateSwitch)', function (data) {
+            if (data.elem.checked) {
+                typeStateSwitch(4,data.value,1);
+            } else {
+                typeStateSwitch(4,data.value,0);
+            }
+        })
+
+        form.on('switch(locationStateSwitch)', function (data) {
+            if (data.elem.checked) {
+                typeStateSwitch(5,data.value,1);
+            } else {
+                typeStateSwitch(5,data.value,0);
+            }
+        })
+
+        form.on('switch(sizeStateSwitch)', function (data) {
+            if (data.elem.checked) {
+                typeStateSwitch(6,data.value,1);
+            } else {
+                typeStateSwitch(6,data.value,0);
+            }
+        })
+
+        function typeStateSwitch(type,id,state) {
+            febs.get(ctx + 'admin/clothesType/changeState/' + id+'/' + type+'/' + state, null, function (data) {
+                febs.alert.success(data.message);
+                $query.click();
+            });
+        }
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('toolbar(clothesTypeTable)', function (obj) {
+            let data = obj.data,
+                layEvent = obj.event;
+            console.log("触发事件:", obj.event); // 调试信息
+            if(layEvent === 'typeAdd'){
+                febs.modal.open('新增', 'modules/clothesType/typeAdd/', {
+                    btn: ['提交', '取消'],
+                    area:['100%','100%'],
+                    yes: function (index, layero) {
+                        $('#febs-type-add').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+
+            if (layEvent === 'artSet') {
+                var checkData = table.checkStatus('clothesTypeTable').data;
+                if (checkData.length > 1 || checkData.length === 0) {
+                    febs.alert.warn('每次操作只能操作一行数据');
+                    return;
+                }
+                febs.modal.open('工艺配置', 'modules/clothesType/artSet/' + checkData[0].id, {
+                    btn: ['提交', '取消'],
+                    area:['100%','100%'],
+                    yes: function (index, layero) {
+                        $('#art-set').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+
+            if (layEvent === 'sizeSet') {
+                var checkData = table.checkStatus('clothesTypeTable').data;
+                if (checkData.length > 1 || checkData.length === 0) {
+                    febs.alert.warn('每次操作只能操作一行数据');
+                    return;
+                }
+                febs.modal.open('尺码配置', 'modules/clothesType/sizeSet/' + checkData[0].id, {
+                    btn: ['提交', '取消'],
+                    area:['100%','100%'],
+                    yes: function (index, layero) {
+                        $('#size-set').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+
+            if (layEvent === 'clothSet') {
+                var checkData = table.checkStatus('clothesTypeTable').data;
+                if (checkData.length > 1 || checkData.length === 0) {
+                    febs.alert.warn('每次操作只能操作一行数据');
+                    return;
+                }
+                febs.modal.open('布料配置', 'modules/clothesType/clothSet/' + checkData[0].id, {
+                    btn: ['提交', '取消'],
+                    area:['100%','100%'],
+                    yes: function (index, layero) {
+                        $('#cloth-set').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+
+            if (layEvent === 'patternSet') {
+                var checkData = table.checkStatus('clothesTypeTable').data;
+                if (checkData.length > 1 || checkData.length === 0) {
+                    febs.alert.warn('每次操作只能操作一行数据');
+                    return;
+                }
+                febs.modal.open('图案文字配置', 'modules/clothesType/patternSet/' + checkData[0].id, {
+                    btn: ['提交', '取消'],
+                    area:['100%','100%'],
+                    yes: function (index, layero) {
+                        $('#pattern-set').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+
+            if (layEvent === 'locationSet') {
+                var checkData = table.checkStatus('clothesTypeTable').data;
+                if (checkData.length > 1 || checkData.length === 0) {
+                    febs.alert.warn('每次操作只能操作一行数据');
+                    return;
+                }
+                febs.modal.open('图案位置配置', 'modules/clothesType/locationSet/' + checkData[0].id, {
+                    btn: ['提交', '取消'],
+                    area:['100%','100%'],
+                    yes: function (index, layero) {
+                        $('#location-set').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+        });
+
+        function initClothesTypeTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'clothesTypeTable',
+                url: ctx + 'admin/clothesType/typeList',
+                toolbar:"#clothesTypeToolbar",
+                defaultToolbar:[],
+                cols: [[
+                    {type: 'checkbox'},
+                    {type: 'numbers', title: '', width: 80},
+                    {title: '操作', toolbar: '#clothesTypeOption', minWidth: 200, align: 'center'},
+                    {field: 'name', title: '名称', minWidth: 150,align:'center'},
+                    {field: 'orderNum', title: '序号', minWidth: 100,align:'center'},
+                    {field: 'state', title: '允许上线', templet: '#stateSwitch', minWidth: 130,align:'center'},
+                    {field: 'clothState', title: '允许选择布料', templet: '#clothStateSwitch', minWidth: 130,align:'center'},
+                    {field: 'artState', title: '允许选择工艺', templet: '#artStateSwitch', minWidth: 130,align:'center'},
+                    {field: 'patternState', title: '允许选择图案', templet: '#patternStateSwitch', minWidth: 130,align:'center'},
+                    {field: 'locationState', title: '允许选择图案位置', templet: '#locationStateSwitch', minWidth: 180,align:'center'},
+                    {field: 'sizeState', title: '允许选择尺码', templet: '#sizeStateSwitch', minWidth: 130,align:'center'},
+                    {field: 'image',title: '小图标',
+                        templet: function (d) {
+                            return '<a lay-event="seeImage">' +
+                                '<img id="seeImage' + d.id + '" src="' + d.image +
+                                '" alt="小图标" style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px; cursor: pointer;">' +
+                                '</a>';
+                        },
+                    minWidth: 150,align: 'center'},
+                    {field: 'imageFront',title: '正面',
+                        templet: function (d) {
+                            return '<a lay-event="seeImageFront">' +
+                                '<img id="seeImageFront' + d.id + '" src="' + d.imageFront +
+                                '" alt="正面" style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px; cursor: pointer;">' +
+                                '</a>';
+                        },
+                    minWidth: 150,align: 'center'},
+                    {field: 'imageBack',title: '反面',
+                        templet: function (d) {
+                            return '<a lay-event="seeImageBack">' +
+                                '<img id="seeImageBack' + d.id + '" src="' + d.imageBack +
+                                '" alt="反面" style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px; cursor: pointer;">' +
+                                '</a>';
+                        },
+                    minWidth: 150,align: 'center'},
+                ]]
+            });
+        }
+
+
+        // 查询按钮
+        $query.on('click', function () {
+            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+            tableIns.reload({where: params, page: {curr: 1}});
+        });
+
+        // 刷新按钮
+        $reset.on('click', function () {
+            $searchForm[0].reset();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+                // name: $searchForm.find('input[name="name"]').val().trim(),
+                // state: $searchForm.find("select[name='state']").val(),
+                // categoryId: $searchForm.find("select[name='categoryId']").val(),
+            };
+        }
+
+    })
+</script>

--
Gitblit v1.9.1