From d2f062b46a96a2083864d529aff28628eea26b58 Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期四, 13 三月 2025 13:58:35 +0800
Subject: [PATCH] add: 短信+内容+字典

---
 src/main/java/com/jsh/erp/datasource/mappers/SysDictMapper.java                  |   15 
 src/main/java/com/jsh/erp/service/redis/RedisUtil.java                           |   22 +
 src/main/java/com/jsh/erp/service/sms/impl/SmsServiceImpl.java                   |   83 ++++
 src/main/java/com/jsh/erp/service/sms/SmsService.java                            |    6 
 src/main/resources/mapper_xml/SysDictMapper.xml                                  |   51 ++
 src/main/java/com/jsh/erp/filter/LogCostFilter.java                              |   42 +
 src/main/resources/application.properties                                        |   14 
 src/main/java/com/jsh/erp/service/cloudContent/impl/CloudContentServiceImpl.java |   45 ++
 src/main/java/com/jsh/erp/datasource/entities/SysDictItem.java                   |   19 +
 src/main/java/com/jsh/erp/service/sys/impl/SysDictServiceImpl.java               |   83 ++++
 src/main/java/com/jsh/erp/service/user/UserService.java                          |    9 
 src/main/java/com/jsh/erp/datasource/mappers/SysDictItemMapper.java              |   26 +
 src/main/java/com/jsh/erp/datasource/mappers/CloudContentMapper.java             |   26 +
 src/main/java/com/jsh/erp/service/sys/SysDictService.java                        |   33 +
 src/main/java/com/jsh/erp/controller/CloudContentController.java                 |  142 +++++++
 src/main/resources/mapper_xml/CloudContentMapper.xml                             |   48 ++
 src/main/java/com/jsh/erp/config/Swagger2Config.java                             |   40 +
 src/main/java/com/jsh/erp/datasource/mappers/UserMapper.java                     |    4 
 src/main/java/com/jsh/erp/service/cloudContent/CloudContentService.java          |   19 +
 src/main/java/com/jsh/erp/utils/BaseResponseInfo.java                            |    2 
 src/main/resources/mapper_xml/SysDictItemMapper.xml                              |   42 ++
 src/main/java/com/jsh/erp/controller/SmsController.java                          |   68 +++
 src/main/java/com/jsh/erp/controller/SysDictController.java                      |  206 ++++++++++
 src/main/java/com/jsh/erp/datasource/entities/SysDict.java                       |   17 
 src/main/java/com/jsh/erp/datasource/entities/CloudContent.java                  |   18 
 src/main/java/com/jsh/erp/service/redis/RedisConfig.java                         |   19 +
 26 files changed, 1,085 insertions(+), 14 deletions(-)

diff --git a/src/main/java/com/jsh/erp/config/Swagger2Config.java b/src/main/java/com/jsh/erp/config/Swagger2Config.java
index 95c1f1a..042a93e 100644
--- a/src/main/java/com/jsh/erp/config/Swagger2Config.java
+++ b/src/main/java/com/jsh/erp/config/Swagger2Config.java
@@ -5,11 +5,14 @@
 import springfox.documentation.builders.ApiInfoBuilder;
 import springfox.documentation.builders.PathSelectors;
 import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.service.ApiInfo;
-import springfox.documentation.service.Contact;
+import springfox.documentation.service.*;
 import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.contexts.SecurityContext;
 import springfox.documentation.spring.web.plugins.Docket;
 import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 插件集成配置
@@ -26,19 +29,46 @@
         return new Docket(DocumentationType.SWAGGER_2)
                 .apiInfo(this.apiInfo())
                 .select()
-                .apis(RequestHandlerSelectors.any())
+                .apis(RequestHandlerSelectors.basePackage("com.jsh.erp.controller"))
                 .paths(PathSelectors.any())
-                .build();
+                .build()
+                // 添加登录认证
+                .securityContexts(securityContexts())
+                .securitySchemes(securitySchemes());
     }
 
     private ApiInfo apiInfo() {
         return new ApiInfoBuilder()
                 .title("云游管理系统 Restful Api")
                 .description("云游管理系统接口描述")
-                .termsOfServiceUrl("http://127.0.0.1")
+                .termsOfServiceUrl("http://localhost:8888/jshERP-boot")
                 .contact(new Contact("jishenghua", "", ""))
                 .version("3.0")
                 .build();
     }
 
+    private List<ApiKey> securitySchemes() {
+        List<ApiKey> apiKeys = new ArrayList<>();
+        apiKeys.add(new ApiKey("Authorization", "Authorization", "header"));
+        return apiKeys;
+    }
+
+    private List<SecurityContext> securityContexts() {
+        List<SecurityContext> securityContexts = new ArrayList<>();
+        securityContexts.add(SecurityContext.builder()
+                .securityReferences(defaultAuth())
+                .forPaths(PathSelectors.regex("^(?!auth).*$"))
+                .build());
+        return securityContexts;
+    }
+
+    private List<SecurityReference> defaultAuth() {
+        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
+        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
+        authorizationScopes[0] = authorizationScope;
+        List<SecurityReference> securityReferences = new ArrayList<>();
+        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
+        return securityReferences;
+    }
+
 }
diff --git a/src/main/java/com/jsh/erp/controller/CloudContentController.java b/src/main/java/com/jsh/erp/controller/CloudContentController.java
new file mode 100644
index 0000000..3c8a193
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/CloudContentController.java
@@ -0,0 +1,142 @@
+package com.jsh.erp.controller;
+
+import com.jsh.erp.datasource.entities.CloudContent;
+import com.jsh.erp.service.cloudContent.CloudContentService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/cloudContent")
+@Api(tags = "内容管理接口")
+public class CloudContentController {
+    @Resource
+    private CloudContentService cloudContentService;
+
+    @GetMapping("/list")
+    public BaseResponseInfo list(@RequestParam(value = "title", required = false) String title,
+                                 @RequestParam(value = "type", required = false) String type,
+                                 @RequestParam(value = "status", required = false) Integer status,
+                                 @RequestParam("currentPage") Integer currentPage,
+                                 @RequestParam("pageSize") Integer pageSize) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<>();
+        try {
+            CloudContent query = new CloudContent();
+            query.setTitle(title);
+            query.setType(type);
+            query.setStatus(status);
+
+            List<CloudContent> dataList = cloudContentService.getList(query);
+            int total = dataList.size();
+            map.put("total", total);
+            map.put("rows", dataList);
+            baseResponseInfo.code = 200;
+            baseResponseInfo.data = map;
+        } catch(Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.data = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+
+    @GetMapping("/getByType")
+    public BaseResponseInfo getByType(@RequestParam(value = "type", required = true) String type) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        try {
+            CloudContent cloudContent = cloudContentService.getByType(type);
+            baseResponseInfo.code = 200;
+            baseResponseInfo.data = cloudContent;
+        } catch (Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.data = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+
+    @GetMapping("/{id}")
+    public BaseResponseInfo getById(@PathVariable Long id) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        try {
+            CloudContent data = cloudContentService.getById(id);
+            baseResponseInfo.code = 200;
+            baseResponseInfo.data = data;
+        } catch(Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.data = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+
+    @PostMapping
+    public BaseResponseInfo add(@RequestBody CloudContent cloudContent) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        try {
+            int result = cloudContentService.add(cloudContent);
+            if(result > 0) {
+                baseResponseInfo.code = 200;
+                baseResponseInfo.data = "新增成功";
+            }
+        } catch(Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.data = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+
+    @PutMapping
+    public BaseResponseInfo update(@RequestBody CloudContent cloudContent) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        try {
+            int result = cloudContentService.update(cloudContent);
+            if(result > 0) {
+                baseResponseInfo.code = 200;
+                baseResponseInfo.data = "修改成功";
+            }
+        } catch(Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.data = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+
+    @DeleteMapping("/{id}")
+    public BaseResponseInfo delete(@PathVariable Long id) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        try {
+            int result = cloudContentService.deleteById(id);
+            if(result > 0) {
+                baseResponseInfo.code = 200;
+                baseResponseInfo.data = "删除成功";
+            }
+        } catch(Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.data = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+
+    @DeleteMapping("/deleteBatch")
+    public BaseResponseInfo deleteBatch(@RequestParam("ids") String ids) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        try {
+            String[] idArray = ids.split(",");
+            int result = 0;
+            for(String id : idArray) {
+                result += cloudContentService.deleteById(Long.parseLong(id));
+            }
+            if(result > 0) {
+                baseResponseInfo.code = 200;
+                baseResponseInfo.data = "删除成功";
+            }
+        } catch(Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.data = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/controller/SmsController.java b/src/main/java/com/jsh/erp/controller/SmsController.java
new file mode 100644
index 0000000..b52c13c
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/SmsController.java
@@ -0,0 +1,68 @@
+package com.jsh.erp.controller;
+
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.entities.UserEx;
+import com.jsh.erp.service.sms.SmsService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import lombok.RequiredArgsConstructor;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/api/sms")
+@RequiredArgsConstructor
+public class SmsController {
+    private final SmsService smsService;
+
+    @Resource
+    private UserService userService;
+
+    @PostMapping("/send-code")
+    public BaseResponseInfo sendCode(@RequestParam String phone) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        try {
+            boolean success = smsService.sendCode(phone);
+            baseResponseInfo.code = 200;
+            baseResponseInfo.data = success;
+        } catch (Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.data = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+
+    @PostMapping("/login")
+    public BaseResponseInfo loginByCode(@RequestParam String phone, @RequestParam String code) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        //验证验证码
+        if (smsService.verifyCode(phone, code)) {
+            try {
+                //登录处理逻辑
+                //查询用户表中有没有对应手机号的信息,没有就注册
+                User user = userService.getByPhone(phone);
+                if (ObjectUtils.isEmpty(user)) {
+                    UserEx userEx = new UserEx();
+                    userEx.setPhonenum(phone);
+                    userService.addUser(userEx);
+                }
+                baseResponseInfo.code = 200;
+                baseResponseInfo.data = true;
+            } catch (Exception e) {
+                baseResponseInfo.code = 500;
+                baseResponseInfo.data = e.getMessage();
+            }
+            return baseResponseInfo;
+        } else {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.data = false;
+            return baseResponseInfo;
+        }
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/controller/SysDictController.java b/src/main/java/com/jsh/erp/controller/SysDictController.java
new file mode 100644
index 0000000..f137897
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/SysDictController.java
@@ -0,0 +1,206 @@
+package com.jsh.erp.controller;
+
+import com.jsh.erp.datasource.entities.SysDict;
+import com.jsh.erp.datasource.entities.SysDictItem;
+import com.jsh.erp.service.sys.SysDictService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/sysDict")
+public class SysDictController {
+    @Resource
+    private SysDictService sysDictService;
+
+    @GetMapping("/list")
+    public BaseResponseInfo list(@RequestParam(value = "dictCode", required = false) String dictCode,
+                               @RequestParam(value = "dictName", required = false) String dictName,
+                               @RequestParam(value = "status", required = false) Integer status,
+                               @RequestParam("currentPage") Integer currentPage,
+                               @RequestParam("pageSize") Integer pageSize) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<>();
+        try {
+            SysDict query = new SysDict();
+            query.setDictCode(dictCode);
+            query.setDictName(dictName);
+            query.setStatus(status);
+            
+            List<SysDict> dataList = sysDictService.getList(query);
+            int total = dataList.size();
+            map.put("total", total);
+            map.put("rows", dataList);
+            baseResponseInfo.code = 200;
+            baseResponseInfo.data = map;
+        } catch(Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.msg = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+
+    @GetMapping("/{id}")
+    public BaseResponseInfo getById(@PathVariable Long id) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        try {
+            SysDict data = sysDictService.getById(id);
+            baseResponseInfo.code = 200;
+            baseResponseInfo.data = data;
+        } catch(Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.msg = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+
+    @PostMapping
+    public BaseResponseInfo add(@RequestBody SysDict sysDict) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        try {
+            int result = sysDictService.add(sysDict);
+            if(result > 0) {
+                baseResponseInfo.code = 200;
+                baseResponseInfo.msg = "新增成功";
+            }
+        } catch(Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.msg = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+
+    @PutMapping
+    public BaseResponseInfo update(@RequestBody SysDict sysDict) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        try {
+            int result = sysDictService.update(sysDict);
+            if(result > 0) {
+                baseResponseInfo.code = 200;
+                baseResponseInfo.msg = "修改成功";
+            }
+        } catch(Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.msg = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+
+    @DeleteMapping("/{id}")
+    public BaseResponseInfo delete(@PathVariable Long id) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        try {
+            int result = sysDictService.deleteById(id);
+            if(result > 0) {
+                baseResponseInfo.code = 200;
+                baseResponseInfo.msg = "删除成功";
+            }
+        } catch(Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.msg = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+
+    @DeleteMapping("/deleteBatch")
+    public BaseResponseInfo deleteBatch(@RequestParam("ids") String ids) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        try {
+            String[] idArray = ids.split(",");
+            int result = 0;
+            for(String id : idArray) {
+                result += sysDictService.deleteById(Long.parseLong(id));
+            }
+            if(result > 0) {
+                baseResponseInfo.code = 200;
+                baseResponseInfo.data = "删除成功";
+            }
+        } catch(Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.data = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+
+    // 字典项相关接口
+    @GetMapping("/items/{dictId}")
+    public BaseResponseInfo getItems(@PathVariable Long dictId) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        try {
+            List<SysDictItem> items = sysDictService.getItemsByDictId(dictId);
+            baseResponseInfo.code = 200;
+            baseResponseInfo.data = items;
+        } catch(Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.msg = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+
+    @PostMapping("/item")
+    public BaseResponseInfo addItem(@RequestBody SysDictItem sysDictItem) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        try {
+            int result = sysDictService.addItem(sysDictItem);
+            if(result > 0) {
+                baseResponseInfo.code = 200;
+                baseResponseInfo.msg = "新增成功";
+            }
+        } catch(Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.msg = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+
+    @PutMapping("/item")
+    public BaseResponseInfo updateItem(@RequestBody SysDictItem sysDictItem) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        try {
+            int result = sysDictService.updateItem(sysDictItem);
+            if(result > 0) {
+                baseResponseInfo.code = 200;
+                baseResponseInfo.msg = "修改成功";
+            }
+        } catch(Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.msg = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+
+    @DeleteMapping("/item/{id}")
+    public BaseResponseInfo deleteItem(@PathVariable Long id) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        try {
+            int result = sysDictService.deleteItemById(id);
+            if(result > 0) {
+                baseResponseInfo.code = 200;
+                baseResponseInfo.msg = "删除成功";
+            }
+        } catch(Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.msg = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+
+
+    @GetMapping("/getByDictCodeAndItemText")
+    public BaseResponseInfo getByDictCodeAndItemText(@RequestParam(value = "dictCode", required = true) String dictCode,
+                                                     @RequestParam(value = "itemText", required = true) String itemText) {
+        BaseResponseInfo baseResponseInfo = new BaseResponseInfo();
+        try {
+            SysDictItem sysDictItem = sysDictService.getByDictCodeAndItemText(dictCode,itemText);
+            baseResponseInfo.code = 200;
+            baseResponseInfo.data = sysDictItem;
+        } catch (Exception e) {
+            baseResponseInfo.code = 500;
+            baseResponseInfo.data = e.getMessage();
+        }
+        return baseResponseInfo;
+    }
+} 
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/CloudContent.java b/src/main/java/com/jsh/erp/datasource/entities/CloudContent.java
new file mode 100644
index 0000000..d2e9020
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/CloudContent.java
@@ -0,0 +1,18 @@
+package com.jsh.erp.datasource.entities;
+
+import lombok.Data;
+import java.util.Date;
+
+@Data
+public class CloudContent {
+    private Long id;
+    private String type;
+    private String title;
+    private String content;
+    private String version;
+    private Integer status;
+    private Date createTime;
+    private Long creator;
+    private Date updateTime;
+    private Long updater;
+} 
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/SysDict.java b/src/main/java/com/jsh/erp/datasource/entities/SysDict.java
new file mode 100644
index 0000000..9572518
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/SysDict.java
@@ -0,0 +1,17 @@
+package com.jsh.erp.datasource.entities;
+
+import lombok.Data;
+import java.util.Date;
+
+@Data
+public class SysDict {
+    private Long id;
+    private String dictCode;
+    private String dictName;
+    private String description;
+    private Integer status;
+    private Date createTime;
+    private Long creator;
+    private Date updateTime;
+    private Long updater;
+}
diff --git a/src/main/java/com/jsh/erp/datasource/entities/SysDictItem.java b/src/main/java/com/jsh/erp/datasource/entities/SysDictItem.java
new file mode 100644
index 0000000..5369338
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/SysDictItem.java
@@ -0,0 +1,19 @@
+package com.jsh.erp.datasource.entities;
+
+import lombok.Data;
+import java.util.Date;
+
+@Data
+public class SysDictItem {
+    private Long id;
+    private Long dictId;
+    private String itemText;
+    private String itemValue;
+    private String description;
+    private Integer sortOrder;
+    private Integer status;
+    private Date createTime;
+    private Long creator;
+    private Date updateTime;
+    private Long updater;
+}
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/CloudContentMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/CloudContentMapper.java
new file mode 100644
index 0000000..ce55559
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/CloudContentMapper.java
@@ -0,0 +1,26 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.CloudContent;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+@Mapper
+public interface CloudContentMapper {
+
+
+    @Select("select * from cloud_content where status = '1'  and type =#{type} limit 1")
+    CloudContent getByType(@Param("type") String type);
+
+    List<CloudContent> selectList(CloudContent cloudContent);
+
+    CloudContent selectById(Long id);
+
+    int insert(CloudContent cloudContent);
+
+    int update(CloudContent cloudContent);
+
+    int deleteById(Long id);
+} 
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/SysDictItemMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/SysDictItemMapper.java
new file mode 100644
index 0000000..d720a17
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/SysDictItemMapper.java
@@ -0,0 +1,26 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.SysDictItem;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+@Mapper
+public interface SysDictItemMapper {
+    List<SysDictItem> selectByDictId(Long dictId);
+
+    SysDictItem selectById(Long id);
+
+    int insert(SysDictItem sysDictItem);
+
+    int update(SysDictItem sysDictItem);
+
+    int deleteById(Long id);
+
+    int deleteByDictId(Long dictId);
+
+    //通过字典类型和字典code查询具体一条
+    @Select("SELECT * FROM sys_dict_item di LEFT JOIN sys_dict d ON di.dict_id = d.id WHERE d.dict_code = #{dictCode} AND di.item_text = #{itemText}")
+    SysDictItem getByDictCodeAndItemText(String dictCode, String itemText);
+}
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/SysDictMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/SysDictMapper.java
new file mode 100644
index 0000000..0db208e
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/SysDictMapper.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.SysDict;
+import org.apache.ibatis.annotations.Mapper;
+import java.util.List;
+
+@Mapper
+public interface SysDictMapper {
+    List<SysDict> selectList(SysDict sysDict);
+    SysDict selectById(Long id);
+    int insert(SysDict sysDict);
+    int update(SysDict sysDict);
+    int deleteById(Long id);
+    SysDict selectByCode(String dictCode);
+}
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/UserMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/UserMapper.java
index a6b9e79..3b628a7 100644
--- a/src/main/java/com/jsh/erp/datasource/mappers/UserMapper.java
+++ b/src/main/java/com/jsh/erp/datasource/mappers/UserMapper.java
@@ -4,6 +4,7 @@
 import com.jsh.erp.datasource.entities.UserExample;
 import java.util.List;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
 public interface UserMapper {
     long countByExample(UserExample example);
@@ -27,4 +28,7 @@
     int updateByPrimaryKeySelective(User record);
 
     int updateByPrimaryKey(User record);
+
+    @Select("select * from jsh_user where phonenum =#{phonenum}")
+    User getByPhone(String phonenum);
 }
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/filter/LogCostFilter.java b/src/main/java/com/jsh/erp/filter/LogCostFilter.java
index 8b8bee2..49c690d 100644
--- a/src/main/java/com/jsh/erp/filter/LogCostFilter.java
+++ b/src/main/java/com/jsh/erp/filter/LogCostFilter.java
@@ -17,7 +17,10 @@
                               "/jshERP-boot/user/registerUser#/jshERP-boot/user/randomImage#" +
                               "/jshERP-boot/platformConfig/getPlatform#/jshERP-boot/v2/api-docs#/jshERP-boot/webjars#" +
                               "/jshERP-boot/systemConfig/static#/jshERP-boot/api/plugin/wechat/weChat/share#" +
-                              "/jshERP-boot/api/plugin/general-ledger/pdf/voucher#/jshERP-boot/api/plugin/tenant-statistics/tenantClean")})
+                              "/jshERP-boot/api/plugin/general-ledger/pdf/voucher#/jshERP-boot/api/plugin/tenant-statistics/tenantClean#" +
+                              "/jshERP-boot/swagger-ui.html#/jshERP-boot/swagger-resources#" +
+                              "/jshERP-boot/doc.html#/jshERP-boot/swagger-resources/**#" +
+                              "/jshERP-boot/v2/api-docs/**#/jshERP-boot/webjars/**")})
 public class LogCostFilter implements Filter {
 
     private static final String FILTER_PATH = "filterPath";
@@ -40,14 +43,26 @@
         HttpServletRequest servletRequest = (HttpServletRequest) request;
         HttpServletResponse servletResponse = (HttpServletResponse) response;
         String requestUrl = servletRequest.getRequestURI();
-        //具体,比如:处理若用户未登录,则跳转到登录页
-        Object userId = redisService.getObjectFromSessionByKey(servletRequest,"userId");
-        if(userId!=null) { //如果已登录,不阻止
+
+        if (isSwaggerRequest(requestUrl)) {
             chain.doFilter(request, response);
             return;
         }
-        if (requestUrl != null && (requestUrl.contains("/doc.html") ||
-            requestUrl.contains("/user/login") || requestUrl.contains("/user/register"))) {
+
+        if (requestUrl != null && (
+            requestUrl.contains("/doc.html") ||
+            requestUrl.contains("/swagger-ui.html") ||
+            requestUrl.contains("/swagger-resources") ||
+            requestUrl.contains("/v2/api-docs") ||
+            requestUrl.contains("/webjars/") ||
+            requestUrl.contains("/user/login") || 
+            requestUrl.contains("/user/register"))) {
+            chain.doFilter(request, response);
+            return;
+        }
+
+        Object userId = redisService.getObjectFromSessionByKey(servletRequest,"userId");
+        if(userId!=null) { //如果已登录,不阻止
             chain.doFilter(request, response);
             return;
         }
@@ -64,6 +79,21 @@
             servletResponse.getWriter().write("loginOut");
         }
     }
+    private boolean isSwaggerRequest(String requestUrl) {
+        return requestUrl != null && (
+                requestUrl.contains("/doc.html") ||
+                        requestUrl.contains("/swagger-ui.html") ||
+                        requestUrl.contains("/swagger-resources") ||
+                        requestUrl.contains("/v2/api-docs") ||
+                        requestUrl.contains("/webjars/") ||
+                        requestUrl.contains("/user/login") ||
+                        requestUrl.contains("/user/register") ||
+                        // 添加API尝试请求
+                        requestUrl.contains("/cloudContent/getByType") ||  // 允许未登录访问的API
+                        requestUrl.contains("/cloudContent/list")  ||         // 允许未登录访问的API
+                        requestUrl.contains("/sysDict/getByDictCodeAndItemText")  //允许查询字典值API
+        );
+    }
 
     @Override
     public void destroy() {
diff --git a/src/main/java/com/jsh/erp/service/cloudContent/CloudContentService.java b/src/main/java/com/jsh/erp/service/cloudContent/CloudContentService.java
new file mode 100644
index 0000000..675cbd9
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/cloudContent/CloudContentService.java
@@ -0,0 +1,19 @@
+package com.jsh.erp.service.cloudContent;
+
+import com.jsh.erp.datasource.entities.CloudContent;
+
+import java.util.List;
+
+public interface CloudContentService {
+    List<CloudContent> getList(CloudContent cloudContent);
+
+    CloudContent getById(Long id);
+
+    int add(CloudContent cloudContent);
+
+    int update(CloudContent cloudContent);
+
+    int deleteById(Long id);
+
+    CloudContent getByType(String type);
+} 
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/service/cloudContent/impl/CloudContentServiceImpl.java b/src/main/java/com/jsh/erp/service/cloudContent/impl/CloudContentServiceImpl.java
new file mode 100644
index 0000000..4b03955
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/cloudContent/impl/CloudContentServiceImpl.java
@@ -0,0 +1,45 @@
+package com.jsh.erp.service.cloudContent.impl;
+
+import com.jsh.erp.datasource.entities.CloudContent;
+import com.jsh.erp.datasource.mappers.CloudContentMapper;
+import com.jsh.erp.service.cloudContent.CloudContentService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Service
+public class CloudContentServiceImpl implements CloudContentService {
+    @Resource
+    private CloudContentMapper cloudContentMapper;
+
+    @Override
+    public List<CloudContent> getList(CloudContent cloudContent) {
+        return cloudContentMapper.selectList(cloudContent);
+    }
+
+    @Override
+    public CloudContent getById(Long id) {
+        return cloudContentMapper.selectById(id);
+    }
+
+    @Override
+    public int add(CloudContent cloudContent) {
+        return cloudContentMapper.insert(cloudContent);
+    }
+
+    @Override
+    public int update(CloudContent cloudContent) {
+        return cloudContentMapper.update(cloudContent);
+    }
+
+    @Override
+    public int deleteById(Long id) {
+        return cloudContentMapper.deleteById(id);
+    }
+
+    @Override
+    public CloudContent getByType(String type) {
+        return cloudContentMapper.getByType(type);
+    }
+} 
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/service/redis/RedisConfig.java b/src/main/java/com/jsh/erp/service/redis/RedisConfig.java
new file mode 100644
index 0000000..31ff609
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/redis/RedisConfig.java
@@ -0,0 +1,19 @@
+package com.jsh.erp.service.redis;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+@Configuration
+public class RedisConfig {
+    @Bean
+    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
+        RedisTemplate<String, String> template = new RedisTemplate<>();
+        template.setConnectionFactory(factory);
+        template.setKeySerializer(new StringRedisSerializer());
+        template.setValueSerializer(new StringRedisSerializer());
+        return template;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/redis/RedisUtil.java b/src/main/java/com/jsh/erp/service/redis/RedisUtil.java
new file mode 100644
index 0000000..bf7054f
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/redis/RedisUtil.java
@@ -0,0 +1,22 @@
+package com.jsh.erp.service.redis;
+
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.TimeUnit;
+
+@Component
+@RequiredArgsConstructor
+public class RedisUtil {
+    private final RedisTemplate<String, String> redisTemplate;
+
+    public void setCode(String phone, String code) {
+        redisTemplate.opsForValue().set(phone, code, 2, TimeUnit.MINUTES);
+    }
+
+    public String getCode(String phone) {
+        return redisTemplate.opsForValue().get(phone);
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/sms/SmsService.java b/src/main/java/com/jsh/erp/service/sms/SmsService.java
new file mode 100644
index 0000000..48cb97d
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/sms/SmsService.java
@@ -0,0 +1,6 @@
+package com.jsh.erp.service.sms;
+
+public interface SmsService {
+    boolean sendCode(String phone);
+    boolean verifyCode(String phone, String code);
+}
diff --git a/src/main/java/com/jsh/erp/service/sms/impl/SmsServiceImpl.java b/src/main/java/com/jsh/erp/service/sms/impl/SmsServiceImpl.java
new file mode 100644
index 0000000..0ff9fba
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/sms/impl/SmsServiceImpl.java
@@ -0,0 +1,83 @@
+package com.jsh.erp.service.sms.impl;
+
+import com.jsh.erp.service.redis.RedisUtil;
+import com.jsh.erp.service.sms.SmsService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.Random;
+
+@Service
+@Slf4j
+public class SmsServiceImpl implements SmsService {
+    private final RedisUtil redisUtil;
+
+    private final String accessKey;
+    private final String secretKey;
+    private final String region;
+    private final String signName;
+    private final String templateId;
+
+    public SmsServiceImpl(RedisUtil redisUtil, @Value("${volc.sms.access-key}") String accessKey, @Value("${volc.sms.secret-key}") String secretKey, @Value("${volc.sms.region}") String region, @Value("${volc.sms.sign-name}") String signName, @Value("${volc.sms.template-id}") String templateId) {
+        this.redisUtil = redisUtil;
+        this.accessKey = accessKey;
+        this.secretKey = secretKey;
+        this.region = region;
+        this.signName = signName;
+        this.templateId = templateId;
+    }
+
+    @Override
+    public boolean sendCode(String phone) {
+        //测试生成固定的凑得
+        String code = "888888";
+        redisUtil.setCode(phone, code);
+        return true;
+//        // 生成6位随机验证码
+//        String code = String.format("%06d", new Random().nextInt(999999));
+//
+//        // 存储到Redis
+//        redisUtil.setCode(phone, code);
+//
+//        // 构造火山云请求
+//        try {
+//            // 使用火山云短信API(示例为简化版,需根据官方文档调整)
+//            String url = "https://sms.volcengineapi.com/v2/send";
+//            String jsonBody = String.format("{\"phone\":\"%s\",\"sign_name\":\"%s\",\"template_id\":\"%s\",\"template_param\":\"{\\\"code\\\":\\\"%s\\\"}\"}", phone, signName, templateId, code);
+//
+//            // 生成签名(需按火山云签名算法实现)
+//            String signature = generateVolcSignature(accessKey, secretKey);
+//
+//            // 发送HTTP请求
+//            CloseableHttpClient client = HttpClients.createDefault();
+//            HttpPost httpPost = new HttpPost(url);
+//            httpPost.setHeader("Content-Type", "application/json");
+//            httpPost.setHeader("Authorization", "HMAC-SHA256 Credential=" + accessKey + ",Signature=" + signature);
+//            httpPost.setEntity(new StringEntity(jsonBody));
+//
+//            CloseableHttpResponse response = client.execute(httpPost);
+//            return response.getStatusLine().getStatusCode() == 200;
+//        } catch (Exception e) {
+//            log.error("短信发送失败: {}", e.getMessage());
+//            return false;
+//        }
+    }
+
+    @Override
+    public boolean verifyCode(String phone, String code) {
+        String storedCode = redisUtil.getCode(phone);
+        return code != null && code.equals(storedCode);
+    }
+
+    // 火山云签名生成方法(需根据官方文档实现)
+    private String generateVolcSignature(String accessKey, String secretKey) {
+        // 实际需按火山云签名算法生成(示例简化)
+        return "generated_signature";
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/sys/SysDictService.java b/src/main/java/com/jsh/erp/service/sys/SysDictService.java
new file mode 100644
index 0000000..798cfb2
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/sys/SysDictService.java
@@ -0,0 +1,33 @@
+package com.jsh.erp.service.sys;
+
+import com.jsh.erp.datasource.entities.SysDict;
+import com.jsh.erp.datasource.entities.SysDictItem;
+
+import java.util.List;
+
+public interface SysDictService {
+    List<SysDict> getList(SysDict sysDict);
+
+    SysDict getById(Long id);
+
+    int add(SysDict sysDict);
+
+    int update(SysDict sysDict);
+
+    int deleteById(Long id);
+
+    SysDict getByCode(String dictCode);
+
+    // 字典项相关
+    List<SysDictItem> getItemsByDictId(Long dictId);
+
+    SysDictItem getItemById(Long id);
+
+    int addItem(SysDictItem sysDictItem);
+
+    int updateItem(SysDictItem sysDictItem);
+
+    int deleteItemById(Long id);
+
+    SysDictItem getByDictCodeAndItemText(String dictCode, String itemText);
+} 
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/service/sys/impl/SysDictServiceImpl.java b/src/main/java/com/jsh/erp/service/sys/impl/SysDictServiceImpl.java
new file mode 100644
index 0000000..0ab1310
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/sys/impl/SysDictServiceImpl.java
@@ -0,0 +1,83 @@
+package com.jsh.erp.service.sys.impl;
+
+import com.jsh.erp.datasource.entities.SysDict;
+import com.jsh.erp.datasource.entities.SysDictItem;
+import com.jsh.erp.datasource.mappers.SysDictItemMapper;
+import com.jsh.erp.datasource.mappers.SysDictMapper;
+import com.jsh.erp.service.sys.SysDictService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Service
+public class SysDictServiceImpl implements SysDictService {
+    @Resource
+    private SysDictMapper sysDictMapper;
+
+    @Resource
+    private SysDictItemMapper sysDictItemMapper;
+
+    @Override
+    public List<SysDict> getList(SysDict sysDict) {
+        return sysDictMapper.selectList(sysDict);
+    }
+
+    @Override
+    public SysDict getById(Long id) {
+        return sysDictMapper.selectById(id);
+    }
+
+    @Override
+    public int add(SysDict sysDict) {
+        return sysDictMapper.insert(sysDict);
+    }
+
+    @Override
+    public int update(SysDict sysDict) {
+        return sysDictMapper.update(sysDict);
+    }
+
+    @Override
+    @Transactional
+    public int deleteById(Long id) {
+        sysDictItemMapper.deleteByDictId(id);
+        return sysDictMapper.deleteById(id);
+    }
+
+    @Override
+    public SysDict getByCode(String dictCode) {
+        return sysDictMapper.selectByCode(dictCode);
+    }
+
+    @Override
+    public List<SysDictItem> getItemsByDictId(Long dictId) {
+        return sysDictItemMapper.selectByDictId(dictId);
+    }
+
+    @Override
+    public SysDictItem getItemById(Long id) {
+        return sysDictItemMapper.selectById(id);
+    }
+
+    @Override
+    public int addItem(SysDictItem sysDictItem) {
+        return sysDictItemMapper.insert(sysDictItem);
+    }
+
+    @Override
+    public int updateItem(SysDictItem sysDictItem) {
+        return sysDictItemMapper.update(sysDictItem);
+    }
+
+    @Override
+    public int deleteItemById(Long id) {
+        return sysDictItemMapper.deleteById(id);
+    }
+
+    @Override
+    public SysDictItem getByDictCodeAndItemText(String dictCode, String itemText) {
+        return sysDictItemMapper.getByDictCodeAndItemText(dictCode, itemText);
+    }
+} 
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/service/user/UserService.java b/src/main/java/com/jsh/erp/service/user/UserService.java
index e8b0190..7a26da9 100644
--- a/src/main/java/com/jsh/erp/service/user/UserService.java
+++ b/src/main/java/com/jsh/erp/service/user/UserService.java
@@ -8,6 +8,7 @@
 import com.jsh.erp.service.redis.RedisService;
 import com.jsh.erp.service.role.RoleService;
 import com.jsh.erp.utils.HttpClient;
+import org.springframework.util.ObjectUtils;
 import org.springframework.util.StringUtils;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -963,4 +964,12 @@
         }
         return 0;
     }
+    public User getByPhone(String phonenum){
+        User user = userMapper.getByPhone(phonenum);
+        if (!ObjectUtils.isEmpty(user)) {
+            return user;
+        } else {
+            return null;
+        }
+    }
 }
diff --git a/src/main/java/com/jsh/erp/utils/BaseResponseInfo.java b/src/main/java/com/jsh/erp/utils/BaseResponseInfo.java
index 807d0ea..93e5b6b 100644
--- a/src/main/java/com/jsh/erp/utils/BaseResponseInfo.java
+++ b/src/main/java/com/jsh/erp/utils/BaseResponseInfo.java
@@ -2,10 +2,12 @@
 
 public class BaseResponseInfo {
 	public int code;
+	public String msg;
 	public Object data;
 	
 	public BaseResponseInfo() {
 		code = 400;
 		data = null;
+		msg = "";
 	}
 }
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 3a46c2c..eb77fa7 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -11,9 +11,10 @@
 #mybatis-plus配置
 mybatis-plus.mapper-locations=classpath:./mapper_xml/*.xml
 # Redis
-spring.redis.host=192.168.1.235
+#spring.redis.host=192.168.1.235
+spring.redis.host=localhost
 spring.redis.port=6379
-spring.redis.password=123456
+#spring.redis.password=123456
 #租户对应的角色id
 manage.roleId=10
 #租户允许创建的用户数
@@ -32,4 +33,11 @@
 server.tomcat.basedir=/opt/tmp/tomcat
 #文件上传限制(byte)
 spring.servlet.multipart.max-file-size=10485760
-spring.servlet.multipart.max-request-size=10485760
\ No newline at end of file
+spring.servlet.multipart.max-request-size=10485760
+
+# ???????
+volc.sms.access-key= your-volc-access-key        # ???AccessKey
+volc.sms.secret-key= your-volc-secret-key        # ???SecretKey
+volc.sms.region= cn-north-1                      # ??????????
+volc.sms.sign-name= ?????                    # ????
+volc.sms.template-id= SMS_1234567890             # ????ID
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/CloudContentMapper.xml b/src/main/resources/mapper_xml/CloudContentMapper.xml
new file mode 100644
index 0000000..ad14d5d
--- /dev/null
+++ b/src/main/resources/mapper_xml/CloudContentMapper.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.CloudContentMapper">
+    <select id="selectList" resultType="com.jsh.erp.datasource.entities.CloudContent">
+        select * from cloud_content
+        <where>
+            <if test="type != null and type != ''">
+                and type = #{type}
+            </if>
+            <if test="title != null and title != ''">
+                and title like concat('%', #{title}, '%')
+            </if>
+            <if test="status != null">
+                and status = #{status}
+            </if>
+        </where>
+        order by create_time desc
+    </select>
+
+    <select id="selectById" resultType="com.jsh.erp.datasource.entities.CloudContent">
+        select * from cloud_content where id = #{id}
+    </select>
+
+    <insert id="insert" parameterType="com.jsh.erp.datasource.entities.CloudContent">
+        insert into cloud_content
+        (type, title, content, version, status, create_time, creator, update_time, updater)
+        values
+        (#{type}, #{title}, #{content}, #{version}, #{status}, now(), #{creator}, now(), #{updater})
+    </insert>
+
+    <update id="update" parameterType="com.jsh.erp.datasource.entities.CloudContent">
+        update cloud_content
+        <set>
+            <if test="type != null">type = #{type},</if>
+            <if test="title != null">title = #{title},</if>
+            <if test="content != null">content = #{content},</if>
+            <if test="version != null">version = #{version},</if>
+            <if test="status != null">status = #{status},</if>
+            update_time = now(),
+            <if test="updater != null">updater = #{updater},</if>
+        </set>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteById">
+        delete from cloud_content where id = #{id}
+    </delete>
+</mapper> 
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/SysDictItemMapper.xml b/src/main/resources/mapper_xml/SysDictItemMapper.xml
new file mode 100644
index 0000000..52caa3b
--- /dev/null
+++ b/src/main/resources/mapper_xml/SysDictItemMapper.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.SysDictItemMapper">
+    <select id="selectByDictId" resultType="com.jsh.erp.datasource.entities.SysDictItem">
+        select * from sys_dict_item 
+        where dict_id = #{dictId}
+        order by sort_order asc
+    </select>
+
+    <select id="selectById" resultType="com.jsh.erp.datasource.entities.SysDictItem">
+        select * from sys_dict_item where id = #{id}
+    </select>
+
+    <insert id="insert" parameterType="com.jsh.erp.datasource.entities.SysDictItem">
+        insert into sys_dict_item
+        (dict_id, item_text, item_value, description, sort_order, status, create_time, creator, update_time, updater)
+        values
+        (#{dictId}, #{itemText}, #{itemValue}, #{description}, #{sortOrder}, #{status}, now(), #{creator}, now(), #{updater})
+    </insert>
+
+    <update id="update" parameterType="com.jsh.erp.datasource.entities.SysDictItem">
+        update sys_dict_item
+        <set>
+            <if test="itemText != null">item_text = #{itemText},</if>
+            <if test="itemValue != null">item_value = #{itemValue},</if>
+            <if test="description != null">description = #{description},</if>
+            <if test="sortOrder != null">sort_order = #{sortOrder},</if>
+            <if test="status != null">status = #{status},</if>
+            update_time = now(),
+            <if test="updater != null">updater = #{updater},</if>
+        </set>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteById">
+        delete from sys_dict_item where id = #{id}
+    </delete>
+
+    <delete id="deleteByDictId">
+        delete from sys_dict_item where dict_id = #{dictId}
+    </delete>
+</mapper> 
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/SysDictMapper.xml b/src/main/resources/mapper_xml/SysDictMapper.xml
new file mode 100644
index 0000000..50b42e1
--- /dev/null
+++ b/src/main/resources/mapper_xml/SysDictMapper.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.SysDictMapper">
+    <select id="selectList" resultType="com.jsh.erp.datasource.entities.SysDict">
+        select * from sys_dict
+        <where>
+            <if test="dictCode != null and dictCode != ''">
+                and dict_code like concat('%', #{dictCode}, '%')
+            </if>
+            <if test="dictName != null and dictName != ''">
+                and dict_name like concat('%', #{dictName}, '%')
+            </if>
+            <if test="status != null">
+                and status = #{status}
+            </if>
+        </where>
+        order by create_time desc
+    </select>
+
+    <select id="selectById" resultType="com.jsh.erp.datasource.entities.SysDict">
+        select * from sys_dict where id = #{id}
+    </select>
+
+    <select id="selectByCode" resultType="com.jsh.erp.datasource.entities.SysDict">
+        select * from sys_dict where dict_code = #{dictCode}
+    </select>
+
+    <insert id="insert" parameterType="com.jsh.erp.datasource.entities.SysDict">
+        insert into sys_dict
+        (dict_code, dict_name, description, status, create_time, creator, update_time, updater)
+        values
+        (#{dictCode}, #{dictName}, #{description}, #{status}, now(), #{creator}, now(), #{updater})
+    </insert>
+
+    <update id="update" parameterType="com.jsh.erp.datasource.entities.SysDict">
+        update sys_dict
+        <set>
+            <if test="dictCode != null">dict_code = #{dictCode},</if>
+            <if test="dictName != null">dict_name = #{dictName},</if>
+            <if test="description != null">description = #{description},</if>
+            <if test="status != null">status = #{status},</if>
+            update_time = now(),
+            <if test="updater != null">updater = #{updater},</if>
+        </set>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteById">
+        delete from sys_dict where id = #{id}
+    </delete>
+</mapper> 
\ No newline at end of file

--
Gitblit v1.9.3