tsurumure пре 1 месец
родитељ
комит
5b18d1b904

+ 13 - 12
db/ai_material_category.sql

@@ -8,23 +8,24 @@ DROP TABLE IF EXISTS `ai_material_category`;
 CREATE TABLE `ai_material_category` (
     PRIMARY KEY (`id`),
     `id` BIGINT AUTO_INCREMENT COMMENT 'ID',
-    `lora_id` BIGINT NOT NULL COMMENT '素材风格ID',
+    `lora_id` BIGINT COMMENT '素材风格ID',
     `category_name` VARCHAR(255) NOT NULL COMMENT '素材分类名称',
+    `is_share` TINYINT DEFAULT '-1' COMMENT '是否共享(-1:不共享, 1:共享)',
     `sort` INT DEFAULT '1' COMMENT '排序',
     INDEX `idx_category_name` (`category_name`)
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='素材分类表';
 
-INSERT INTO ai_material_category(lora_id, category_name, sort) VALUES
-    (1, '人物素材', 7),
-    (1, '场景素材', 6),
-    (1, '异兽素材', 5),
-    (1, '道具素材', 3),
-    (1, '特效素材', 2),
+INSERT INTO ai_material_category(lora_id, is_share, category_name, sort) VALUES
+    (null, 1, '特效素材', 1),
 
-    (2, '人物素材', 7),
-    (2, '场景素材', 6),
-    (2, '异兽素材', 5),
-    (2, '道具素材', 4),
-    (2, '特效素材', 3)
+    (1, -1, '人物素材', 7),
+    (1, -1, '场景素材', 6),
+    (1, -1, '异兽素材', 5),
+    (1, -1, '道具素材', 3),
+
+    (2, -1,  '人物素材', 7),
+    (2, -1,  '场景素材', 6),
+    (2, -1,  '异兽素材', 5),
+    (2, -1,  '道具素材', 4)
 ;
 

+ 1 - 1
db/sys_user_info.sql

@@ -17,7 +17,7 @@ CREATE TABLE `sys_user_info` (
     `last_login_ip` VARCHAR(20) COMMENT '最后登录IP',
     `last_login_time` DATETIME COMMENT '最后登录时间',
     `is_super` TINYINT(1) DEFAULT '-1' COMMENT '是否超级管理员 (-1否, 1是)',
-    `audit_status` TINYINT(1) DEFAULT '2' COMMENT '账号审核状态 (-1审核拒绝, 1待审核, 2审核通过)',
+    `audit_status` TINYINT(1) DEFAULT '1' COMMENT '账号审核状态 (-1审核拒绝, 1待审核, 2审核通过)',
     `audit_note` VARCHAR(255) COMMENT '账号审核备注',
     `point_balance` FLOAT DEFAULT 0 COMMENT '积分余额',
     `invite_code` VARCHAR(255) COMMENT '邀请码',

+ 3 - 3
db/sys_user_role.sql

@@ -25,7 +25,7 @@ INSERT INTO sys_user_role(role_sign, role_name, role_description, login_default_
     ('SUPERADMIN', '开发者', '全部权限', '/', 1),
     ('ADMIN', '管理员', '全部功能权限', '/', 2),
     ('DEFAULT', '普通用户', '基础权限', '/', 3),
-    ('MATERIAL_ADMIN', '运营-素材-管理员', '素材管理全权限 (允许查看/下载/上传/删除)', '/material/materialList?lora_id=1', 4),
-    ('MATERIAL_USER', '运营-素材-普通用户', '允许查看/下载', '/material/materialList?lora_id=1', 5),
-    ('MATERIAL_GUEST', '运营-素材-游客', '允许查看', '/material/materialList?lora_id=1', 6)
+    ('MATERIAL_ADMIN', '素材-管理员', '素材管理全权限 (允许查看/下载/上传/删除)', '/material/materialList', 4),
+    ('MATERIAL_USER', '素材-普通用户', '允许查看/下载', '/material/materialList', 5),
+    ('MATERIAL_GUEST', '素材-游客', '允许查看', '/material/materialList', 6)
 ;

+ 1 - 1
db/sys_user_role_menu.sql

@@ -46,7 +46,7 @@ INSERT INTO sys_user_role_menu(id, parent_id, menu_name, menu_name_en, type, pat
 
     (20, -1, '素材管理', 'Material', 1, '/material', '', '{}', 'MessageBox', '20', 13),
     (21, 20, '素材中心', 'Material Center', 1, '/material/materialList', '/src/views/material/materialList.vue', '{}', null, '20.1', 13),
-    (22, 20, '素材用户', 'Material User', 1, '/material/materialUserList', '/src/views/material/materialUserList.vue', '{}', null, '20.1', 12),
+    (22, 20, '素材用户', 'Material User', 1, '/material/materialUserList', '/src/views/material/materialUserList.vue', '{}', null, '20.4', 12),
 #     (21, 20, '素材列表', 'Material List', 1, '/material/materialList', '/src/views/material/materialList.vue', '{}', null, '20.1', 13),
 #     (21, 20, '沙雕素材', 'Material Sa Diao', 1, '/material/materialList?lora_id=1', '/src/views/material/materialList.vue', '{}', null, '20.1', 13),
 #     (22, 20, '简笔画素材', 'Material Simple', 1, '/material/materialList?lora_id=2', '/src/views/material/materialList.vue', '{}', null, '20.1', 13),

+ 3 - 2
db/sys_user_role_permission.sql

@@ -187,8 +187,9 @@ INSERT INTO sys_user_role_permission(id, parent_id, permission_name, sort) VALUE
             ('20.1.3', '20.1', '编辑素材', null),
             ('20.1.4', '20.1', '删除素材', null),
         ('20.2', '20', '素材分类列表', null),
-        ('20.3', '20', '素材标签列表', null)
-
+        ('20.3', '20', '素材标签列表', null),
+        ('20.4', '20', '素材用户列表', null),
+            ('20.4.1', '20.4', '审核素材用户', null)
 
 
 #

+ 9 - 6
db/sys_user_role_permission_relation.sql

@@ -81,6 +81,8 @@ INSERT INTO sys_user_role_permission_relation(role_id, permission_id) VALUES
             (1, '20.1.1'), (1, '20.1.2'), (1, '20.1.3'), (1, '20.1.4'),
         (1, '20.2'),
         (1, '20.3'),
+        (1, '20.4'),
+            (1, '20.4.1'),
 
 #     (1, '21'),
 #         (1, '21.1'),
@@ -162,12 +164,7 @@ INSERT INTO sys_user_role_permission_relation(role_id, permission_id) VALUES
 #     (2, '34'),
 #     (2, '35'),
 
-    (3, '1'),
-        (3, '1.1'),
-            (3, '1.1.2'), (3, '1.1.3'), (3, '1.1.4'), (3, '1.1.6'),
-
     (3, '2'),
-    (3, '31'),
 
     # 运营-素材管理者
     (4, '1.1.2'), (4, '1.1.3'), (4, '1.1.6'),
@@ -178,6 +175,8 @@ INSERT INTO sys_user_role_permission_relation(role_id, permission_id) VALUES
             (4, '20.1.1'), (4, '20.1.2'), (4, '20.1.3'), (4, '20.1.4'),
         (4, '20.2'),
         (4, '20.3'),
+        (4, '20.4'),
+            (4, '20.4.1'),
 
     # 运营-素材使用者
     (5, '1.1.2'), (5, '1.1.6'),
@@ -188,6 +187,8 @@ INSERT INTO sys_user_role_permission_relation(role_id, permission_id) VALUES
             (5, '20.1.1'),
         (5, '20.2'),
         (5, '20.3'),
+        (5, '20.4'),
+            (5, '20.4.1'),
 
     # 运营-素材游号
 #     (6, '3.2.1'),
@@ -195,5 +196,7 @@ INSERT INTO sys_user_role_permission_relation(role_id, permission_id) VALUES
     (6, '20'),
         (6, '20.1'),
     (6, '20.2'),
-    (6, '20.3')
+    (6, '20.3'),
+    (6, '20.4'),
+        (6, '20.4.1')
 ;

+ 45 - 0
src/main/java/com/backendsys/modules/material/controller/MaterialUserController.java

@@ -0,0 +1,45 @@
+package com.backendsys.modules.material.controller;
+
+import com.backendsys.modules.common.aspect.SysLog;
+import com.backendsys.modules.common.utils.Result;
+import com.backendsys.modules.material.entity.MaterialAudit;
+import com.backendsys.modules.material.service.MaterialUserService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@Validated
+@RestController
+@Tag(name = "素材用户管理")
+public class MaterialUserController {
+
+    @Autowired
+    private MaterialUserService materialUserService;
+
+    @Operation(summary = "获取素材用户列表")
+    @PreAuthorize("@sr.hasPermission('20.4')")
+    @GetMapping("/api/material/getMaterialUserList")
+    public Result getMaterialUserList(String phone, Long role_id) {
+        return Result.success().put("data", materialUserService.selectMaterialUserList(phone, role_id));
+    }
+
+    @Operation(summary = "获取素材用户角色列表")
+    @PreAuthorize("@sr.hasPermission('20.4')")
+    @GetMapping("/api/material/getMaterialUserRoleList")
+    public Result getMaterialUserRoleList() {
+        return Result.success().put("data", materialUserService.selectMaterialUserRoleList());
+    }
+
+    @SysLog("审核素材用户")
+    @Operation(summary = "审核素材用户")
+    @PreAuthorize("@sr.hasPermission('20.4.1')")
+    @PutMapping("/api/material/auditMaterialUser")
+    public Result auditMaterialUser(@Validated(MaterialAudit.Audit.class) @RequestBody MaterialAudit materialAudit) {
+        return Result.success().put("data", materialUserService.auditMaterialUser(materialAudit));
+    }
+
+
+}

+ 23 - 0
src/main/java/com/backendsys/modules/material/entity/MaterialAudit.java

@@ -0,0 +1,23 @@
+package com.backendsys.modules.material.entity;
+
+import com.backendsys.entity.validator.RangeArray;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class MaterialAudit {
+
+    public static interface Audit{}
+
+    @NotNull(message="用户ID不能为空", groups = { Audit.class })
+    private Long user_id;
+    @NotNull(message="审核状态不能为空", groups = { Audit.class })
+    @RangeArray(message="审核状态取值有误,范围应是(-1审核拒绝, 1待审核, 2审核通过)", value = {"-1", "1", "2"}, groups = { Audit.class })
+    private Integer audit_status;
+
+    @RangeArray(message="用户状态取值有误,范围应是(-1禁用, 1启用)", value = {"-1", "1"}, groups = { Audit.class})
+    private Integer status;
+
+    private Long role_id;
+
+}

+ 6 - 1
src/main/java/com/backendsys/modules/material/entity/MaterialCategory.java

@@ -1,5 +1,7 @@
 package com.backendsys.modules.material.entity;
 
+import com.backendsys.entity.validator.RangeArray;
+import com.backendsys.entity.validator.RangeStringArray;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -27,9 +29,12 @@ public class MaterialCategory {
     @NotNull(message="分类ID不能为空", groups = { Detail.class, Update.class, Delete.class })
     private Long category_id;
 
-    @NotNull(message="风格ID不能为空", groups = { CategoryList.class, Detail.class, Create.class, Update.class })
+    @NotNull(message="风格ID不能为空", groups = { CategoryList.class, Detail.class })
     private Long lora_id;
 
+    @RangeArray(message="是否共享取值有误,范围应是(-1否, 1是)", value = { "-1", "1" }, groups = { Create.class, Update.class })
+    private Integer is_share;
+
     @TableField(exist = false)
     private String lora_name;
 

+ 21 - 0
src/main/java/com/backendsys/modules/material/service/MaterialUserService.java

@@ -0,0 +1,21 @@
+package com.backendsys.modules.material.service;
+
+import com.backendsys.modules.material.entity.MaterialAudit;
+import com.backendsys.modules.system.entity.SysUserRole;
+import com.backendsys.utils.response.PageEntity;
+
+import java.util.List;
+import java.util.Map;
+
+public interface MaterialUserService {
+
+    // 获取素材用户列表
+    PageEntity selectMaterialUserList(String phone, Long role_id);
+
+    // 获取素材用户角色列表
+    List<SysUserRole> selectMaterialUserRoleList();
+
+    // 审核素材用户
+    Map<String, Object> auditMaterialUser(MaterialAudit materialAudit);
+
+}

+ 20 - 3
src/main/java/com/backendsys/modules/material/service/impl/MaterialCategoryImpl.java

@@ -6,6 +6,7 @@ import com.backendsys.modules.material.service.MaterialCategoryService;
 import com.backendsys.utils.response.PageEntity;
 import com.backendsys.utils.response.PageInfoResult;
 import com.backendsys.utils.v2.PageUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -18,7 +19,7 @@ public class MaterialCategoryImpl implements MaterialCategoryService {
     private MaterialCategoryDao materialCategoryDao;
 
     /**
-     * 获取素材分类列表
+     * 获取素材分类列表 (全部/分页)
      */
     @Override
     public PageEntity selectMaterialCategoryList(MaterialCategory materialCategory) {
@@ -28,11 +29,27 @@ public class MaterialCategoryImpl implements MaterialCategoryService {
     }
 
     /**
-     * 获取素材分类列表 (下拉)
+     * 获取素材分类列表 (下拉)(将 { is_share } 的记录独立出来)
      */
     @Override
     public List<MaterialCategory> selectMaterialCategoryPopover(MaterialCategory materialCategory) {
-        return materialCategoryDao.selectMaterialCategoryList(materialCategory);
+
+        // [DB] 查询非共享的素材分类 { is_share = -1 }
+        materialCategory.setIs_share(-1);
+        List<MaterialCategory> list = materialCategoryDao.selectMaterialCategoryList(materialCategory);
+        System.out.println("list = " + list);
+        System.out.println("-----------------");
+
+        // [DB] 查询共享的素材分类 { is_share = 1, lora_id = null }
+        materialCategory.setLora_id(null);
+        materialCategory.setIs_share(1);
+        List<MaterialCategory> list_of_share = materialCategoryDao.selectMaterialCategoryList(materialCategory);
+        System.out.println("list_of_share = " + list_of_share);
+
+        // 将共享分类追加到非共享分类后面
+        list.addAll(list_of_share);
+
+        return list;
     }
 
 }

+ 113 - 0
src/main/java/com/backendsys/modules/material/service/impl/MaterialUserServiceImpl.java

@@ -0,0 +1,113 @@
+package com.backendsys.modules.material.service.impl;
+
+import com.backendsys.exception.CustException;
+import com.backendsys.modules.common.config.security.utils.SecurityUtil;
+import com.backendsys.modules.material.entity.MaterialAudit;
+import com.backendsys.modules.material.service.MaterialUserService;
+import com.backendsys.modules.system.dao.SysUserDao;
+import com.backendsys.modules.system.dao.SysUserInfoDao;
+import com.backendsys.modules.system.dao.SysUserRoleDao;
+import com.backendsys.modules.system.dao.SysUserRoleRelationDao;
+import com.backendsys.modules.system.entity.SysUserDTO;
+import com.backendsys.modules.system.entity.SysUserInfo;
+import com.backendsys.modules.system.entity.SysUserRole;
+import com.backendsys.modules.system.entity.SysUserRoleRelation;
+import com.backendsys.modules.system.service.SysUserService;
+import com.backendsys.utils.response.PageEntity;
+import com.backendsys.utils.response.PageInfoResult;
+import com.backendsys.utils.v2.PageUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class MaterialUserServiceImpl implements MaterialUserService {
+
+    @Autowired
+    private SysUserDao sysUserDao;
+    @Autowired
+    private SysUserInfoDao sysUserInfoDao;
+    @Autowired
+    private SysUserRoleDao sysUserRoleDao;
+    @Autowired
+    private SysUserRoleRelationDao sysUserRoleRelationDao;
+
+    @Autowired
+    private SysUserService sysUserService;
+
+    /**
+     * 获取素材用户列表 ({ invite_code = Material })
+     */
+    @Override
+    public PageEntity selectMaterialUserList(String phone, Long role_id) {
+        PageUtils.startPage();  // 分页
+        SysUserDTO sysUserDTO = new SysUserDTO();
+        sysUserDTO.setPhone(phone);
+        sysUserDTO.setInvite_code("Material");
+        if (role_id != null) {
+            sysUserDTO.setRole_id(Arrays.asList(role_id));
+        }
+        List<SysUserInfo> user_info_list = sysUserInfoDao.selectUserList(sysUserDTO);
+        return new PageInfoResult(user_info_list).toEntity();
+    }
+
+    /**
+     * 获取素材用户角色列表
+     */
+    @Override
+    public List<SysUserRole> selectMaterialUserRoleList() {
+        LambdaQueryWrapper<SysUserRole> wrapper = new LambdaQueryWrapper<>();
+        wrapper.likeRight(SysUserRole::getRole_sign, "MATERIAL");
+        wrapper.orderByAsc(SysUserRole::getSort);
+        List<SysUserRole> list = sysUserRoleDao.selectList(wrapper);
+        return list;
+    }
+
+    /**
+     * 审核素材用户
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> auditMaterialUser(MaterialAudit materialAudit) {
+
+        // 判断是否为素材用户 / 用户是否存在
+        LambdaQueryWrapper<SysUserInfo> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SysUserInfo::getUser_id, materialAudit.getUser_id());
+        wrapper.eq(SysUserInfo::getInvite_code, "Material");
+        SysUserInfo user_info_detail = sysUserInfoDao.selectOne(wrapper);
+        if (user_info_detail == null) throw new CustException("用户不存在");
+
+        // 判断用户是否待审核状态 (-1审核拒绝, 1待审核, 2审核通过)
+        if (materialAudit.getUser_id() == SecurityUtil.getUserId()) throw new CustException("不能审核自己");
+
+        // [DB] 获取素材用户角色ID集合
+        List<SysUserRole> role_list = selectMaterialUserRoleList();
+        List<Long> role_ids = role_list.stream().map(SysUserRole::getRole_id).toList();
+        if (!role_ids.contains(materialAudit.getRole_id())) throw new CustException("必须指定素材用户角色");
+
+        // [DB] 更新用户信息-审核状态/用户状态
+        SysUserInfo entity = new SysUserInfo();
+        entity.setAudit_status(materialAudit.getAudit_status());
+        entity.setStatus(materialAudit.getStatus());
+        sysUserInfoDao.update(entity, wrapper);
+
+        // 如果是禁用状态,则清除该用户的登录信息
+        if (materialAudit.getStatus() == -1) {
+            sysUserService.kickUser(materialAudit.getUser_id());
+        }
+
+        // [DB] 更新用户与角色关系 (先删,后增)
+        LambdaQueryWrapper<SysUserRoleRelation> wrapperRoleRelation = new LambdaQueryWrapper<>();
+        wrapperRoleRelation.eq(SysUserRoleRelation::getUser_id, materialAudit.getUser_id());
+        sysUserRoleRelationDao.delete(wrapperRoleRelation);
+        sysUserRoleRelationDao.insertBatch(materialAudit.getUser_id(), Arrays.asList(materialAudit.getRole_id()));
+
+        return Map.of("user_id", materialAudit.getUser_id());
+    }
+
+}

+ 46 - 19
src/main/java/com/backendsys/modules/system/service/impl/SysAuthServiceImpl.java

@@ -3,6 +3,7 @@ package com.backendsys.modules.system.service.impl;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.backendsys.exception.CustException;
@@ -12,6 +13,7 @@ import com.backendsys.modules.common.config.security.utils.*;
 import com.backendsys.modules.system.dao.SysMobileAreaDao;
 import com.backendsys.modules.system.dao.SysUserDao;
 import com.backendsys.modules.system.dao.SysUserInfoDao;
+import com.backendsys.modules.system.dao.SysUserRoleDao;
 import com.backendsys.modules.system.entity.*;
 import com.backendsys.modules.system.service.SysAuthService;
 import com.backendsys.modules.system.service.SysCommonService;
@@ -24,6 +26,7 @@ import jakarta.servlet.ServletOutputStream;
 import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.env.Environment;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -38,6 +41,8 @@ import java.util.concurrent.TimeUnit;
 @Service
 public class SysAuthServiceImpl implements SysAuthService {
 
+    @Autowired
+    private Environment env;
     @Autowired
     private JwtUtil jwtUtil;
     @Autowired
@@ -56,6 +61,8 @@ public class SysAuthServiceImpl implements SysAuthService {
     @Autowired
     private SysUserDao sysUserDao;
     @Autowired
+    private SysUserRoleDao sysUserRoleDao;
+    @Autowired
     private SysUserInfoDao sysUserInfoDao;
     @Autowired
     private SysUserService sysUserService;
@@ -151,7 +158,7 @@ public class SysAuthServiceImpl implements SysAuthService {
 
         // 判断用户是否审核
         Integer audit_status = sysUserInfo.getAudit_status();
-        if (audit_status != null && audit_status.equals(1)) throw new CustException("用户审核中");
+        if (audit_status != null && audit_status.equals(1)) throw new CustException("用户正在审核中");
         if (audit_status != null && audit_status.equals(-1)) throw new CustException("用户审核未通过,请与客服联系");
 
         // 判断用户是否启用
@@ -314,13 +321,16 @@ public class SysAuthServiceImpl implements SysAuthService {
         Integer phoneAreaCode = sysUserDTO.getPhone_area_code();
         Integer phoneValidCode = sysUserDTO.getPhone_valid_code();
 
-        // 判断是否处于登录错误的冻结状态 (2分钟内错误5次,则出现冻结提示)
-        lockStatusUtil.checkLockStatus(APPLICATION_NAME + "-register-error", username);
-        lockStatusUtil.checkLockStatus(APPLICATION_NAME + "-register-error", phone);
-        // 判断图形验证码是否正确
-        if (!captchaUtil.isCaptchaValid(captcha, httpRequestUtil.getKaptchaKey())) {
-            loginFail("验证码错误", username, false);
-            return null;
+        String activeProfile = env.getActiveProfiles()[0];
+        if (!"local".equals(activeProfile)) {
+            // 判断是否处于登录错误的冻结状态 (2分钟内错误5次,则出现冻结提示)
+            lockStatusUtil.checkLockStatus(APPLICATION_NAME + "-register-error", username);
+            lockStatusUtil.checkLockStatus(APPLICATION_NAME + "-register-error", phone);
+            // 判断图形验证码是否正确
+            if (!captchaUtil.isCaptchaValid(captcha, httpRequestUtil.getKaptchaKey())) {
+                loginFail("验证码错误", username, false);
+                return null;
+            }
         }
 
         // [查询] 判断用户名是否存在
@@ -328,12 +338,14 @@ public class SysAuthServiceImpl implements SysAuthService {
         if (sysUser1 != null) throw new CustException("用户名 (" + username + ") 已被注册");
         
         // 判断短信验证码是否正确
-        String redisKey = APPLICATION_NAME + "-sms-register" + "-" + phone;
-        Integer smsCode = redisUtil.getCacheObject(redisKey);
-        // 判断是否发送验证码
-        if ("false".equals(SMS_DEBUG) && smsCode == null) throw new CustException("请先发送短信验证码");
-        // 判断短信验证码是否错误
-        if ("false".equals(SMS_DEBUG) && !smsCode.equals(phoneValidCode)) loginFail("短信验证码错误", phone, true);
+        if (!"local".equals(activeProfile)) {
+            String redisKey = APPLICATION_NAME + "-sms-register" + "-" + phone;
+            Integer smsCode = redisUtil.getCacheObject(redisKey);
+            // 判断是否发送验证码
+            if ("false".equals(SMS_DEBUG) && smsCode == null) throw new CustException("请先发送短信验证码");
+            // 判断短信验证码是否错误
+            if ("false".equals(SMS_DEBUG) && !smsCode.equals(phoneValidCode)) loginFail("短信验证码错误", phone, true);
+        }
 
 
         // [查询] 判断手机号是否存在
@@ -359,14 +371,29 @@ public class SysAuthServiceImpl implements SysAuthService {
 
         // 做成后台可控制?
 
-        // 注册时,默认使用 权限
-        registerEntity.setRole_id(Arrays.asList(3L));
 
+        // 邀请码
+        registerEntity.setInvite_code(sysUserDTO.getInvite_code());
 
+        // 注册时,默认使用 权限 (DEFAULT)
+        String role_sign = "DEFAULT";
 
-        registerEntity.setInvite_code(sysUserDTO.getInvite_code());
-        // 注册时,状态为禁用
-        registerEntity.setStatus(-1);
+        // 如果邀请码是 (Material),则注册成为 [素材游客]
+        if ("Material".equals(sysUserDTO.getInvite_code())) role_sign = "MATERIAL_GUEST";
+
+        LambdaQueryWrapper<SysUserRole> wrapperRole = new LambdaQueryWrapper<>();
+        wrapperRole.eq(SysUserRole::getRole_sign, role_sign);
+        SysUserRole roleDetail = sysUserRoleDao.selectOne(wrapperRole);
+        registerEntity.setRole_id(Arrays.asList(roleDetail.getRole_id()));
+
+        // 注册时,审核状态为 待审核 (-1拒绝, 1待审核, 2审核通过)
+        registerEntity.setAudit_status(1);
+
+        // 注册时,状态为 禁用
+        // registerEntity.setStatus(-1);
+
+        // 随机昵称 (6位)
+        registerEntity.setNickname("用户" + RandomUtil.randomStringUpper(6));
 
         // 创建用户
         sysUserDao.insertUser(registerEntity);

+ 5 - 0
src/main/resources/mapper/ai/material/MaterialCategoryDao.xml

@@ -8,6 +8,7 @@
         mc.lora_id,
         mcl.lora_name,
         mc.category_name,
+        mc.is_share,
         mc.sort
     </sql>
     <!-- COALESCE(content_type, '') content_type, -->
@@ -17,6 +18,7 @@
         <result property="lora_id" column="lora_id" javaType="java.lang.Long" />
         <result property="lora_name" column="lora_name" />
         <result property="category_name" column="category_name" />
+        <result property="is_share" column="is_share" javaType="java.lang.Integer"/>
         <result property="sort" column="sort" javaType="java.lang.Integer" />
     </resultMap>
 
@@ -32,6 +34,9 @@
             <if test="category_name != null and category_name != ''">
                 AND mc.category_name like concat('%', #{category_name}, '%')
             </if>
+            <if test="is_share != null and is_share != ''">
+                AND mc.is_share = #{is_share}
+            </if>
         </where>
         ORDER BY mc.sort DESC
     </select>

+ 1 - 0
src/main/resources/mapper/system/SysUserInfoDao.xml

@@ -71,6 +71,7 @@
             <if test="email != null and email != ''">AND uf.email LIKE CONCAT('%', #{email}, '%')</if>
             <if test="status != null and status != ''">AND uf.status = #{status}</if>
             <if test="audit_status != null and audit_status != ''">AND uf.audit_status = #{audit_status}</if>
+            <if test="invite_code != null and invite_code != ''">AND uf.invite_code = #{invite_code}</if>
             <if test="role_id != null and role_id != ''">
                 AND urr.role_id IN
                 <foreach collection="role_id" item="role" open="(" separator="," close=")">#{role}</foreach>