Jelajahi Sumber

Merge remote-tracking branch 'origin/sit-plantform' into sit-plantform

penghao 6 hari lalu
induk
melakukan
f5897fdad1
18 mengubah file dengan 1334 tambahan dan 4 penghapusan
  1. 16 0
      alien-entity/src/main/java/shop/alien/entity/store/LifeSys.java
  2. 74 0
      alien-entity/src/main/java/shop/alien/entity/store/LifeSysRole.java
  3. 66 0
      alien-entity/src/main/java/shop/alien/entity/store/ProtocolManagement.java
  4. 48 0
      alien-entity/src/main/java/shop/alien/entity/store/dto/SystemUserAddDto.java
  5. 30 0
      alien-entity/src/main/java/shop/alien/entity/store/dto/SystemUserStatusDto.java
  6. 16 0
      alien-entity/src/main/java/shop/alien/mapper/LifeSysRoleMapper.java
  7. 15 0
      alien-entity/src/main/java/shop/alien/mapper/ProtocolManagementMapper.java
  8. 28 0
      alien-entity/src/main/resources/mapper/LifeSysRoleMapper.xml
  9. 135 0
      alien-store/src/main/java/shop/alien/store/controller/LifeSysRoleController.java
  10. 232 0
      alien-store/src/main/java/shop/alien/store/controller/ProtocolManagementController.java
  11. 5 2
      alien-store/src/main/java/shop/alien/store/controller/StoreInfoController.java
  12. 23 1
      alien-store/src/main/java/shop/alien/store/controller/SystemController.java
  13. 77 0
      alien-store/src/main/java/shop/alien/store/service/LifeSysRoleService.java
  14. 76 0
      alien-store/src/main/java/shop/alien/store/service/ProtocolManagementService.java
  15. 18 0
      alien-store/src/main/java/shop/alien/store/service/SystemService.java
  16. 135 0
      alien-store/src/main/java/shop/alien/store/service/impl/LifeSysRoleServiceImpl.java
  17. 235 0
      alien-store/src/main/java/shop/alien/store/service/impl/ProtocolManagementServiceImpl.java
  18. 105 1
      alien-store/src/main/java/shop/alien/store/service/impl/SystemServiceImpl.java

+ 16 - 0
alien-entity/src/main/java/shop/alien/entity/store/LifeSys.java

@@ -29,6 +29,22 @@ public class LifeSys {
     @ApiModelProperty(value = "角色id")
     private String roleId;
 
+    @ApiModelProperty(value = "真实姓名")
+    @TableField("real_name")
+    private String realName;
+
+    @ApiModelProperty(value = "联系电话")
+    @TableField("phone")
+    private String phone;
+
+    @ApiModelProperty(value = "邮箱")
+    @TableField("email")
+    private String email;
+
+    @ApiModelProperty(value = "所属部门ID")
+    @TableField("department_id")
+    private String departmentId;
+
     @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
     @TableField("delete_flag")
     @TableLogic

+ 74 - 0
alien-entity/src/main/java/shop/alien/entity/store/LifeSysRole.java

@@ -0,0 +1,74 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 平台角色信息表
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@JsonInclude
+@TableName("life_sys_role")
+@ApiModel(value = "LifeSysRole对象", description = "平台角色信息表")
+public class LifeSysRole implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "角色ID")
+    @TableId(value = "role_id", type = IdType.AUTO)
+    private Long roleId;
+
+    @ApiModelProperty(value = "角色名称")
+    @TableField("role_name")
+    private String roleName;
+
+    @ApiModelProperty(value = "显示顺序")
+    @TableField("role_sort")
+    private Integer roleSort;
+
+    @ApiModelProperty(value = "角色状态(0正常 1停用)")
+    @TableField("status")
+    private String status;
+
+    @ApiModelProperty(value = "角色描述")
+    @TableField("description")
+    private String description;
+
+    @ApiModelProperty(value = "删除标志(0代表存在 2代表删除)")
+    @TableField("del_flag")
+    @TableLogic
+    private String delFlag;
+
+    @ApiModelProperty(value = "创建者")
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "更新者")
+    @TableField("update_by")
+    private String updateBy;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "备注")
+    @TableField("remark")
+    private String remark;
+}
+

+ 66 - 0
alien-entity/src/main/java/shop/alien/entity/store/ProtocolManagement.java

@@ -0,0 +1,66 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 协议管理表
+ *
+ * @author alien
+ * @since 2025-12-09
+ */
+@Data
+@JsonInclude
+@EqualsAndHashCode(callSuper = false)
+@TableName("protocol_management")
+@ApiModel(value = "ProtocolManagement对象", description = "协议管理表")
+public class ProtocolManagement extends Model<ProtocolManagement> {
+
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "协议名称")
+    @TableField("protocol_file_name")
+    private String protocolFileName;
+
+    @ApiModelProperty(value = "展示位置")
+    @TableField("display_position")
+    private String displayPosition;
+
+    @ApiModelProperty(value = "协议文件存储路径")
+    @TableField("protocol_file_path")
+    private String protocolFilePath;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改人")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+
+    @ApiModelProperty(value = "删除标识, 0:未删除, 1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+}
+

+ 48 - 0
alien-entity/src/main/java/shop/alien/entity/store/dto/SystemUserAddDto.java

@@ -0,0 +1,48 @@
+package shop.alien.entity.store.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * 系统用户新增DTO
+ *
+ * @author system
+ * @since 2025-12-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "SystemUserAddDto对象", description = "系统用户新增信息")
+public class SystemUserAddDto {
+
+    @ApiModelProperty(value = "用户名", required = true)
+    private String userName;
+
+    @ApiModelProperty(value = "真实姓名", required = true)
+    private String realName;
+
+    @ApiModelProperty(value = "联系电话", required = true)
+    private String phone;
+
+    @ApiModelProperty(value = "邮箱", required = true)
+    private String email;
+
+    @ApiModelProperty(value = "密码(初始密码)", required = true)
+    private String password;
+
+    @ApiModelProperty(value = "角色ID列表(支持多角色选择)", required = true)
+    private String roleIds;
+
+    @ApiModelProperty(value = "所属部门ID", required = true)
+    private String departmentId;
+
+    @ApiModelProperty(value = "备注说明")
+    private String remark;
+
+    @ApiModelProperty(value = "启用状态 1:启用 0:禁用,默认为1")
+    private Integer status = 1;
+}
+

+ 30 - 0
alien-entity/src/main/java/shop/alien/entity/store/dto/SystemUserStatusDto.java

@@ -0,0 +1,30 @@
+package shop.alien.entity.store.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * 系统用户状态修改DTO
+ *
+ * @author system
+ * @since 2025-12-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "SystemUserStatusDto对象", description = "系统用户状态修改信息")
+public class SystemUserStatusDto {
+
+    @ApiModelProperty(value = "用户ID", required = true)
+    private Integer userId;
+
+    @ApiModelProperty(value = "状态 1:启用 0:禁用", required = true)
+    private Integer status;
+
+    @ApiModelProperty(value = "操作原因/备注")
+    private String remark;
+}
+

+ 16 - 0
alien-entity/src/main/java/shop/alien/mapper/LifeSysRoleMapper.java

@@ -0,0 +1,16 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import shop.alien.entity.store.LifeSysRole;
+
+/**
+ * 平台角色信息表 Mapper 接口
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Mapper
+public interface LifeSysRoleMapper extends BaseMapper<LifeSysRole> {
+}
+

+ 15 - 0
alien-entity/src/main/java/shop/alien/mapper/ProtocolManagementMapper.java

@@ -0,0 +1,15 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import shop.alien.entity.store.ProtocolManagement;
+
+/**
+ * 协议管理表 Mapper 接口
+ *
+ * @author alien
+ * @since 2025-12-09
+ */
+public interface ProtocolManagementMapper extends BaseMapper<ProtocolManagement> {
+
+}
+

+ 28 - 0
alien-entity/src/main/resources/mapper/LifeSysRoleMapper.xml

@@ -0,0 +1,28 @@
+<?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="shop.alien.mapper.LifeSysRoleMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="shop.alien.entity.store.LifeSysRole">
+        <id column="role_id" property="roleId" />
+        <result column="role_name" property="roleName" />
+        <result column="role_key" property="roleKey" />
+        <result column="role_sort" property="roleSort" />
+        <result column="data_scope" property="dataScope" />
+        <result column="status" property="status" />
+        <result column="del_flag" property="delFlag" />
+        <result column="create_by" property="createBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="remark" property="remark" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        role_id, role_name, role_key, role_sort, data_scope, status, del_flag,
+        create_by, create_time, update_by, update_time, remark
+    </sql>
+
+</mapper>
+

+ 135 - 0
alien-store/src/main/java/shop/alien/store/controller/LifeSysRoleController.java

@@ -0,0 +1,135 @@
+package shop.alien.store.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.LifeSysRole;
+import shop.alien.store.service.LifeSysRoleService;
+
+import java.util.List;
+
+/**
+ * 平台角色信息表 前端控制器
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Slf4j
+@Api(tags = {"平台角色管理"})
+@ApiSort(1)
+@CrossOrigin
+@RestController
+@RequestMapping("/sys/role")
+@RequiredArgsConstructor
+public class LifeSysRoleController {
+
+    private final LifeSysRoleService lifeSysRoleService;
+
+    @ApiOperation("分页查询角色列表")
+    @ApiOperationSupport(order = 1)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "页码", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "size", value = "页容", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "roleName", value = "角色名称(支持模糊查询)", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "description", value = "角色描述(支持模糊查询)", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "status", value = "角色状态(0正常 1停用)", dataType = "String", paramType = "query")
+    })
+    @GetMapping("/getRolePage")
+    public R<IPage<LifeSysRole>> getRolePage(
+            @RequestParam(name = "page", defaultValue = "1") int page,
+            @RequestParam(name = "size", defaultValue = "10") int size,
+            @RequestParam(value = "roleName", required = false) String roleName,
+            @RequestParam(value = "description", required = false) String description,
+            @RequestParam(value = "status", required = false) String status) {
+        log.info("LifeSysRoleController.getRolePage?page={}, size={}, roleName={}, roleKey={}, status={}", 
+                page, size, roleName, description, status);
+        IPage<LifeSysRole> rolePage = lifeSysRoleService.getRolePage(page, size, roleName, description, status);
+        return R.data(rolePage);
+    }
+
+    @ApiOperation("根据ID查询角色详情")
+    @ApiOperationSupport(order = 2)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roleId", value = "角色ID", dataType = "Long", paramType = "path", required = true)
+    })
+    @GetMapping("/getRoleById")
+    public R<LifeSysRole> getRoleById(@RequestParam("roleId") Long roleId) {
+        log.info("LifeSysRoleController.getRoleById?roleId={}", roleId);
+        LifeSysRole role = lifeSysRoleService.getRoleById(roleId);
+        if (role == null) {
+            return R.fail("未找到该角色信息");
+        }
+        return R.data(role);
+    }
+
+    @ApiOperation("新增角色")
+    @ApiOperationSupport(order = 3)
+    @PostMapping("/saveRole")
+    public R<String> saveRole(@RequestBody LifeSysRole role) {
+        log.info("LifeSysRoleController.saveRole?role={}", role);
+        boolean result = lifeSysRoleService.saveRole(role);
+        if (result) {
+            return R.success("新增成功");
+        }
+        return R.fail("新增失败");
+    }
+
+    @ApiOperation("修改角色")
+    @ApiOperationSupport(order = 4)
+    @PostMapping("/updateRole")
+    public R<String> updateRole(@RequestBody LifeSysRole role) {
+        log.info("LifeSysRoleController.updateRole?role={}", role);
+        boolean result = lifeSysRoleService.updateRole(role);
+        if (result) {
+            return R.success("修改成功");
+        }
+        return R.fail("修改失败");
+    }
+
+    @ApiOperation("删除角色")
+    @ApiOperationSupport(order = 5)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roleId", value = "角色ID", dataType = "Long", paramType = "path", required = true)
+    })
+    @DeleteMapping("/deleteRole")
+    public R<String> deleteRole(@RequestParam("roleId") Long roleId) {
+        log.info("LifeSysRoleController.deleteRole?roleId={}", roleId);
+        boolean result = lifeSysRoleService.deleteRole(roleId);
+        if (result) {
+            return R.success("删除成功");
+        }
+        return R.fail("删除失败");
+    }
+
+    @ApiOperation("修改角色状态")
+    @ApiOperationSupport(order = 6)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roleId", value = "角色ID", dataType = "Long", paramType = "path", required = true),
+            @ApiImplicitParam(name = "status", value = "角色状态(0正常 1停用)", dataType = "String", paramType = "query", required = true)
+    })
+    @PutMapping("/updateStatus")
+    public R<String> updateStatus(
+            @RequestParam("roleId") Long roleId,
+            @RequestParam("status") String status) {
+        log.info("LifeSysRoleController.updateStatus?roleId={}, status={}", roleId, status);
+        boolean result = lifeSysRoleService.updateStatus(roleId, status);
+        if (result) {
+            return R.success("操作成功");
+        }
+        return R.fail("操作失败");
+    }
+
+    @ApiOperation("查询所有正常状态的角色列表")
+    @ApiOperationSupport(order = 7)
+    @GetMapping("/getAllNormalRoles")
+    public R<List<LifeSysRole>> getAllNormalRoles() {
+        log.info("LifeSysRoleController.getAllNormalRoles");
+        List<LifeSysRole> roles = lifeSysRoleService.getAllNormalRoles();
+        return R.data(roles);
+    }
+
+}
+

+ 232 - 0
alien-store/src/main/java/shop/alien/store/controller/ProtocolManagementController.java

@@ -0,0 +1,232 @@
+package shop.alien.store.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartRequest;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.ProtocolManagement;
+import shop.alien.store.service.ProtocolManagementService;
+
+/**
+ * 协议管理表 前端控制器
+ *
+ * @author alien
+ * @since 2025-12-09
+ */
+@Slf4j
+@Api(tags = {"协议管理"})
+@ApiSort(100)
+@CrossOrigin
+@RestController
+@RequestMapping("/protocolManagement")
+@RequiredArgsConstructor
+public class ProtocolManagementController {
+
+    private final ProtocolManagementService protocolManagementService;
+
+    @ApiOperation("协议列表-分页查询")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "pageSize", value = "页容", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "protocolFileName", value = "协议名称", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "displayPosition", value = "展示位置", dataType = "String", paramType = "query")
+    })
+    @GetMapping("/getPage")
+    public R<IPage<ProtocolManagement>> getPage(
+            @RequestParam("pageNum") Integer pageNum,
+            @RequestParam("pageSize") Integer pageSize,
+            @RequestParam(value = "protocolFileName", required = false) String protocolFileName,
+            @RequestParam(value = "displayPosition", required = false) String displayPosition) {
+        log.info("ProtocolManagementController.getPage?pageNum={}&pageSize={}&protocolFileName={}&displayPosition={}", 
+                pageNum, pageSize, protocolFileName, displayPosition);
+        
+        try {
+            IPage<ProtocolManagement> page = protocolManagementService.getProtocolPage(pageNum, pageSize, protocolFileName, displayPosition);
+            return R.data(page);
+        } catch (Exception e) {
+            log.error("查询协议列表失败", e);
+            return R.fail("查询失败: " + e.getMessage());
+        }
+    }
+
+    @ApiOperation("协议详情-根据ID查询")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "协议ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/getById")
+    public R<ProtocolManagement> getById(@RequestParam("id") Integer id) {
+        log.info("ProtocolManagementController.getById?id={}", id);
+        
+        try {
+            ProtocolManagement protocol = protocolManagementService.getProtocolById(id);
+            return R.data(protocol);
+        } catch (IllegalArgumentException e) {
+            log.error("查询协议详情失败", e);
+            return R.fail(e.getMessage());
+        } catch (Exception e) {
+            log.error("查询协议详情失败", e);
+            return R.fail("查询失败: " + e.getMessage());
+        }
+    }
+
+    @ApiOperation("新增协议")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "protocolFileName", value = "协议名称", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "displayPosition", value = "展示位置", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "protocolFilePath", value = "协议文件存储路径", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "createdUserId", value = "创建人ID", dataType = "Integer", paramType = "query")
+
+    })
+    @PostMapping("/add")
+    public R<Boolean> add(
+            @RequestParam("protocolFileName") String protocolFileName,
+            @RequestParam(value = "displayPosition") String displayPosition,
+            @RequestParam(value = "createdUserId", required = false) Integer createdUserId,
+            MultipartFile multipartFile) {
+        log.info("ProtocolManagementController.add?protocolFileName={}&displayPosition={}&createdUserId={}",
+                protocolFileName, displayPosition, createdUserId);
+        
+        try {
+            ProtocolManagement protocolManagement = new ProtocolManagement();
+            protocolManagement.setProtocolFileName(protocolFileName);
+            protocolManagement.setDisplayPosition(displayPosition);
+            
+            // 当createdUserId不为空时才设置值
+            if (createdUserId != null) {
+                protocolManagement.setCreatedUserId(createdUserId);
+            }
+            
+            boolean result = protocolManagementService.addProtocol(multipartFile, protocolManagement);
+            
+            if (result) {
+                return R.success("新增成功");
+            } else {
+                return R.fail("新增失败");
+            }
+        } catch (IllegalArgumentException e) {
+            log.error("新增协议失败", e);
+            return R.fail(e.getMessage());
+        } catch (Exception e) {
+            log.error("新增协议失败", e);
+            return R.fail("新增失败: " + e.getMessage());
+        }
+    }
+
+    @ApiOperation("修改协议")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "协议ID", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "protocolFileName", value = "协议名称", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "displayPosition", value = "展示位置", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "protocolFilePath", value = "协议文件存储路径", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "updatedUserId", value = "修改人ID", dataType = "Integer", paramType = "query")
+    })
+    @PostMapping("/update")
+    public R<Boolean> update(
+            @RequestParam("id") Integer id,
+            @RequestParam(value = "protocolFileName", required = false) String protocolFileName,
+            @RequestParam(value = "displayPosition", required = false) String displayPosition,
+            @RequestParam(value = "protocolFilePath", required = false) String protocolFilePath,
+            @RequestParam(value = "updatedUserId", required = false) Integer updatedUserId,
+            MultipartRequest multipartRequest) {
+        log.info("ProtocolManagementController.update?id={}&protocolFileName={}&displayPosition={}&protocolFilePath={}&updatedUserId={}", 
+                id, protocolFileName, displayPosition, protocolFilePath, updatedUserId);
+        
+        try {
+            ProtocolManagement protocolManagement = new ProtocolManagement();
+            protocolManagement.setId(id);
+            protocolManagement.setProtocolFileName(protocolFileName);
+            protocolManagement.setDisplayPosition(displayPosition);
+            protocolManagement.setProtocolFilePath(protocolFilePath);
+            protocolManagement.setUpdatedUserId(updatedUserId);
+            
+            boolean result = protocolManagementService.updateProtocol(multipartRequest, protocolManagement);
+            
+            if (result) {
+                return R.success("修改成功");
+            } else {
+                return R.fail("修改失败");
+            }
+        } catch (IllegalArgumentException e) {
+            log.error("修改协议失败", e);
+            return R.fail(e.getMessage());
+        } catch (Exception e) {
+            log.error("修改协议失败", e);
+            return R.fail("修改失败: " + e.getMessage());
+        }
+    }
+
+    @ApiOperation("删除协议")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "协议ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @PostMapping("/delete")
+    public R<Boolean> delete(@RequestParam("id") Integer id) {
+        log.info("ProtocolManagementController.delete?id={}", id);
+        
+        try {
+            boolean result = protocolManagementService.deleteProtocol(id);
+            
+            if (result) {
+                return R.success("删除成功");
+            } else {
+                return R.fail("删除失败");
+            }
+        } catch (IllegalArgumentException e) {
+            log.error("删除协议失败", e);
+            return R.fail(e.getMessage());
+        } catch (Exception e) {
+            log.error("删除协议失败", e);
+            return R.fail("删除失败: " + e.getMessage());
+        }
+    }
+
+//    @ApiOperation("批量删除协议")
+//    @ApiImplicitParams({
+//            @ApiImplicitParam(name = "ids", value = "协议ID列表(逗号分隔)", dataType = "String", paramType = "query", required = true, example = "1,2,3")
+//    })
+//    @PostMapping("/batchDelete")
+//    public R<Boolean> batchDelete(@RequestParam("ids") String ids) {
+//        log.info("ProtocolManagementController.batchDelete?ids={}", ids);
+//
+//        try {
+//            boolean result = protocolManagementService.batchDeleteProtocol(ids);
+//
+//            if (result) {
+//                return R.success("批量删除成功");
+//            } else {
+//                return R.fail("批量删除失败");
+//            }
+//        } catch (IllegalArgumentException e) {
+//            log.error("批量删除协议失败", e);
+//            return R.fail(e.getMessage());
+//        } catch (Exception e) {
+//            log.error("批量删除协议失败", e);
+//            return R.fail("批量删除失败: " + e.getMessage());
+//        }
+//    }
+
+    @ApiOperation("校验文件名是否重复")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "protocolFileName", value = "协议文件名", dataType = "String", paramType = "query", required = true)
+    })
+    @GetMapping("/checkFileNameDuplicate")
+    public R<Boolean> checkFileNameDuplicate(@RequestParam("protocolFileName") String protocolFileName) {
+        log.info("ProtocolManagementController.checkFileNameDuplicate?protocolFileName={}", protocolFileName);
+
+        try {
+            Boolean result = protocolManagementService.checkFileNameDuplicate(protocolFileName);
+            return R.data(result);
+        } catch (IllegalArgumentException e) {
+            log.error("校验文件名失败", e);
+            return R.fail(e.getMessage());
+        } catch (Exception e) {
+            log.error("校验文件名失败", e);
+            return R.fail("校验失败: " + e.getMessage());
+        }
+    }
+}
+

+ 5 - 2
alien-store/src/main/java/shop/alien/store/controller/StoreInfoController.java

@@ -11,7 +11,6 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartRequest;
 import shop.alien.entity.result.R;
-import shop.alien.entity.second.SecondGoodsCategory;
 import shop.alien.entity.store.*;
 import shop.alien.entity.store.dto.StoreInfoDto;
 import shop.alien.entity.store.vo.*;
@@ -824,7 +823,11 @@ public class StoreInfoController {
     })
     public R<List<StoreCommentSummaryInterest>> getStoreInterestInfo(int storeId) {
         log.info("StoreInfoController.getStoreInterestInfo?storeId={}", storeId);
-        List<StoreCommentSummaryInterest> list = storeCommentSummaryInterestMapper.selectList(new LambdaQueryWrapper<StoreCommentSummaryInterest>().eq(StoreCommentSummaryInterest :: getStoreId, storeId));
+        List<StoreCommentSummaryInterest> list = storeCommentSummaryInterestMapper.selectList(
+                new LambdaQueryWrapper<StoreCommentSummaryInterest>()
+                        .eq(StoreCommentSummaryInterest::getStoreId, storeId)
+                        .last("ORDER BY RAND() LIMIT 1") // 随机排序并只取第一条
+        );
         return R.data(list);
     }
 

+ 23 - 1
alien-store/src/main/java/shop/alien/store/controller/SystemController.java

@@ -8,7 +8,8 @@ import shop.alien.entity.result.R;
 import shop.alien.entity.store.LifeSys;
 import shop.alien.entity.store.UserLoginInfo;
 import shop.alien.entity.store.dto.SystemLoginDto;
-import shop.alien.entity.store.dto.SystemRegisterDto;
+import shop.alien.entity.store.dto.SystemUserAddDto;
+import shop.alien.entity.store.dto.SystemUserStatusDto;
 import shop.alien.entity.store.vo.SystemLoginVo;
 import shop.alien.store.service.SystemService;
 import shop.alien.util.common.TokenInfo;
@@ -53,6 +54,27 @@ public class SystemController {
         return R.success("退出成功");
     }
 
+    @ApiOperation("新增系统用户账号")
+    @ApiOperationSupport(order = 3)
+    @PostMapping(value = "/addUser")
+    public R<LifeSys> addUser(@RequestBody SystemUserAddDto addDto) {
+        log.info("SystemController.addUser => userName={}, realName={}, phone={}, email={}, departmentId={},roleIds={}",
+                addDto.getUserName(), addDto.getRealName(), addDto.getPhone(), 
+                addDto.getEmail(), addDto.getDepartmentId(),addDto.getRoleIds());
+        return systemService.addUser(addDto);
+    }
+
+    @ApiOperation("修改系统用户状态")
+    @ApiOperationSupport(order = 4)
+    @PostMapping(value = "/updateUserStatus")
+    public R<LifeSys> updateUserStatus(@RequestBody SystemUserStatusDto statusDto) {
+        log.info("SystemController.updateUserStatus => userId={}, status={}, remark={}", 
+                statusDto.getUserId(), statusDto.getStatus(), statusDto.getRemark());
+        return systemService.updateUserStatus(statusDto);
+    }
+
+
+
 /**
  * 废弃
   */

+ 77 - 0
alien-store/src/main/java/shop/alien/store/service/LifeSysRoleService.java

@@ -0,0 +1,77 @@
+package shop.alien.store.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.store.LifeSysRole;
+
+import java.util.List;
+
+/**
+ * 平台角色信息表 服务类
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+public interface LifeSysRoleService extends IService<LifeSysRole> {
+
+    /**
+     * 分页查询角色列表
+     *
+     * @param page     页码
+     * @param size     页容
+     * @param roleName 角色名称(支持模糊查询)
+     * @param roleKey  角色权限字符串(支持模糊查询)
+     * @param status   角色状态(0正常 1停用)
+     * @return IPage<LifeSysRole>
+     */
+    IPage<LifeSysRole> getRolePage(int page, int size, String roleName, String roleKey, String status);
+
+    /**
+     * 根据ID查询角色详情
+     *
+     * @param roleId 角色ID
+     * @return LifeSysRole
+     */
+    LifeSysRole getRoleById(Long roleId);
+
+    /**
+     * 新增角色
+     *
+     * @param role 角色信息
+     * @return boolean
+     */
+    boolean saveRole(LifeSysRole role);
+
+    /**
+     * 修改角色
+     *
+     * @param role 角色信息
+     * @return boolean
+     */
+    boolean updateRole(LifeSysRole role);
+
+    /**
+     * 删除角色(逻辑删除)
+     *
+     * @param roleId 角色ID
+     * @return boolean
+     */
+    boolean deleteRole(Long roleId);
+
+    /**
+     * 修改角色状态
+     *
+     * @param roleId 角色ID
+     * @param status 角色状态(0正常 1停用)
+     * @return boolean
+     */
+    boolean updateStatus(Long roleId, String status);
+
+    /**
+     * 查询所有正常状态的角色列表
+     *
+     * @return List<LifeSysRole>
+     */
+    List<LifeSysRole> getAllNormalRoles();
+}
+

+ 76 - 0
alien-store/src/main/java/shop/alien/store/service/ProtocolManagementService.java

@@ -0,0 +1,76 @@
+package shop.alien.store.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartRequest;
+import shop.alien.entity.store.ProtocolManagement;
+
+/**
+ * 协议管理表 服务类
+ *
+ * @author alien
+ * @since 2025-12-09
+ */
+public interface ProtocolManagementService extends IService<ProtocolManagement> {
+
+    /**
+     * 分页查询协议列表
+     *
+     * @param pageNum          页数
+     * @param pageSize         页容
+     * @param protocolFileName 协议名称
+     * @param displayPosition  展示位置
+     * @return IPage<ProtocolManagement>
+     */
+    IPage<ProtocolManagement> getProtocolPage(Integer pageNum, Integer pageSize, String protocolFileName, String displayPosition);
+
+    /**
+     * 根据ID查询协议详情
+     *
+     * @param id 协议ID
+     * @return ProtocolManagement
+     */
+    ProtocolManagement getProtocolById(Integer id);
+
+    /**
+     * 新增协议
+     *
+     * @param protocolManagement 协议对象
+     * @return boolean
+     */
+    boolean addProtocol(MultipartFile multipartFile, ProtocolManagement protocolManagement);
+
+    /**
+     * 更新协议
+     *
+     * @param protocolManagement 协议对象
+     * @return boolean
+     */
+    boolean updateProtocol(MultipartRequest multipartRequest, ProtocolManagement protocolManagement);
+
+    /**
+     * 删除协议(逻辑删除)
+     *
+     * @param id 协议ID
+     * @return boolean
+     */
+    boolean deleteProtocol(Integer id);
+
+    /**
+     * 批量删除协议
+     *
+     * @param ids 协议ID列表
+     * @return boolean
+     */
+    boolean batchDeleteProtocol(String ids);
+
+    /**
+     * 校验文件名是否重复
+     *
+     * @param protocolFileName 协议文件名
+     * @return String "已重复" 或 "不重复"
+     */
+    Boolean checkFileNameDuplicate(String protocolFileName);
+}
+

+ 18 - 0
alien-store/src/main/java/shop/alien/store/service/SystemService.java

@@ -3,6 +3,8 @@ package shop.alien.store.service;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.LifeSys;
 import shop.alien.entity.store.UserLoginInfo;
+import shop.alien.entity.store.dto.SystemUserAddDto;
+import shop.alien.entity.store.dto.SystemUserStatusDto;
 import shop.alien.entity.store.vo.SystemLoginVo;
 
 /**
@@ -27,4 +29,20 @@ public interface SystemService {
      */
     R<LifeSys> register(String userName, String password, String roleId);
 
+    /**
+     * 新增系统用户账号
+     *
+     * @param addDto 新增用户信息
+     * @return R<LifeSys>
+     */
+    R<LifeSys> addUser(SystemUserAddDto addDto);
+
+    /**
+     * 修改系统用户状态
+     *
+     * @param statusDto 用户状态信息
+     * @return R<LifeSys>
+     */
+    R<LifeSys> updateUserStatus(SystemUserStatusDto statusDto);
+
 }

+ 135 - 0
alien-store/src/main/java/shop/alien/store/service/impl/LifeSysRoleServiceImpl.java

@@ -0,0 +1,135 @@
+package shop.alien.store.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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 org.springframework.util.StringUtils;
+import shop.alien.entity.store.LifeSysRole;
+import shop.alien.mapper.LifeSysRoleMapper;
+import shop.alien.store.service.LifeSysRoleService;
+
+import java.util.List;
+
+/**
+ * 平台角色信息表 服务实现类
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+@Transactional
+public class LifeSysRoleServiceImpl extends ServiceImpl<LifeSysRoleMapper, LifeSysRole> implements LifeSysRoleService {
+
+    private final LifeSysRoleMapper lifeSysRoleMapper;
+
+    @Override
+    public IPage<LifeSysRole> getRolePage(int page, int size, String roleName, String description, String status) {
+        LambdaQueryWrapper<LifeSysRole> queryWrapper = new LambdaQueryWrapper<>();
+        
+        // 角色名称模糊查询
+        if (StringUtils.hasText(roleName)) {
+            queryWrapper.like(LifeSysRole::getRoleName, roleName);
+        }
+        // 角色描述模糊查询
+        if (StringUtils.hasText(description)) {
+            queryWrapper.like(LifeSysRole::getDescription, description);
+        }
+        
+        // 角色状态查询
+        if (StringUtils.hasText(status)) {
+            queryWrapper.eq(LifeSysRole::getStatus, status);
+        }
+        
+        // 按显示顺序和创建时间排序
+        queryWrapper.orderByAsc(LifeSysRole::getRoleSort);
+        queryWrapper.orderByDesc(LifeSysRole::getCreatedTime);
+
+        return lifeSysRoleMapper.selectPage(new Page<>(page, size), queryWrapper);
+    }
+
+    @Override
+    public LifeSysRole getRoleById(Long roleId) {
+        return lifeSysRoleMapper.selectById(roleId);
+    }
+
+    @Override
+    public boolean saveRole(LifeSysRole role) {
+        // 校验必填字段
+        if (!StringUtils.hasText(role.getRoleName())) {
+            log.error("角色名称不能为空");
+            return false;
+        }
+        // 设置默认值
+        if (role.getRoleSort() == null) {
+            role.setRoleSort(0);
+        }
+        if (!StringUtils.hasText(role.getStatus())) {
+            role.setStatus("0"); // 默认正常
+        }
+        if (!StringUtils.hasText(role.getDelFlag())) {
+            role.setDelFlag("0"); // 默认未删除
+        }
+        int result = lifeSysRoleMapper.insert(role);
+        return result > 0;
+    }
+
+    @Override
+    public boolean updateRole(LifeSysRole role) {
+        if (role.getRoleId() == null) {
+            log.error("角色ID不能为空");
+            return false;
+        }
+
+        int result = lifeSysRoleMapper.updateById(role);
+        return result > 0;
+    }
+
+    @Override
+    public boolean deleteRole(Long roleId) {
+        // 逻辑删除
+        LambdaUpdateWrapper<LifeSysRole> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(LifeSysRole::getRoleId, roleId);
+        updateWrapper.set(LifeSysRole::getDelFlag, "2"); // 2代表删除
+        
+        int result = lifeSysRoleMapper.update(null, updateWrapper);
+        return result > 0;
+    }
+
+    @Override
+    public boolean updateStatus(Long roleId, String status) {
+        if (roleId == null) {
+            log.error("角色ID不能为空");
+            return false;
+        }
+        if (!StringUtils.hasText(status)) {
+            log.error("角色状态不能为空");
+            return false;
+        }
+        
+        LambdaUpdateWrapper<LifeSysRole> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(LifeSysRole::getRoleId, roleId);
+        updateWrapper.set(LifeSysRole::getStatus, status);
+        
+        int result = lifeSysRoleMapper.update(null, updateWrapper);
+        return result > 0;
+    }
+
+    @Override
+    public List<LifeSysRole> getAllNormalRoles() {
+        LambdaQueryWrapper<LifeSysRole> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(LifeSysRole::getStatus, "0"); // 正常状态
+        queryWrapper.eq(LifeSysRole::getDelFlag, "0"); // 未删除
+        queryWrapper.orderByAsc(LifeSysRole::getRoleSort);
+        
+        return lifeSysRoleMapper.selectList(queryWrapper);
+    }
+}
+

+ 235 - 0
alien-store/src/main/java/shop/alien/store/service/impl/ProtocolManagementServiceImpl.java

@@ -0,0 +1,235 @@
+package shop.alien.store.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartRequest;
+import shop.alien.entity.store.ProtocolManagement;
+import shop.alien.mapper.ProtocolManagementMapper;
+import shop.alien.store.service.ProtocolManagementService;
+import shop.alien.store.util.FileUploadUtil;
+import shop.alien.util.common.RandomCreateUtil;
+import shop.alien.util.ali.AliOSSUtil;
+import shop.alien.util.file.FileUtil;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 协议管理表 服务实现类
+ *
+ * @author alien
+ * @since 2025-12-09
+ */
+@Slf4j
+@Service
+@Transactional
+@RequiredArgsConstructor
+public class ProtocolManagementServiceImpl extends ServiceImpl<ProtocolManagementMapper, ProtocolManagement> implements ProtocolManagementService {
+
+    private final ProtocolManagementMapper protocolManagementMapper;
+
+    private final FileUploadUtil fileUploadUtil;
+
+    private final AliOSSUtil aliOSSUtil;
+
+    @Override
+    public IPage<ProtocolManagement> getProtocolPage(Integer pageNum, Integer pageSize, String protocolFileName, String displayPosition) {
+        log.info("协议管理-分页查询, pageNum: {}, pageSize: {}, protocolFileName: {}, displayPosition: {}", 
+                pageNum, pageSize, protocolFileName, displayPosition);
+        
+        IPage<ProtocolManagement> page = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<ProtocolManagement> queryWrapper = new LambdaQueryWrapper<>();
+        
+        // 协议名称模糊查询
+        if (StringUtils.isNotBlank(protocolFileName)) {
+            queryWrapper.like(ProtocolManagement::getProtocolFileName, protocolFileName);
+        }
+        
+        // 展示位置模糊查询
+        if (StringUtils.isNotBlank(displayPosition)) {
+            queryWrapper.like(ProtocolManagement::getDisplayPosition, displayPosition);
+        }
+        
+        // 按创建时间倒序排列
+        queryWrapper.orderByDesc(ProtocolManagement::getCreatedTime);
+        
+        return protocolManagementMapper.selectPage(page, queryWrapper);
+    }
+
+    @Override
+    public ProtocolManagement getProtocolById(Integer id) {
+        log.info("协议管理-查询详情, id: {}", id);
+        
+        if (id == null) {
+            throw new IllegalArgumentException("协议ID不能为空");
+        }
+        
+        ProtocolManagement protocol = protocolManagementMapper.selectById(id);
+        
+        if (protocol == null) {
+            throw new IllegalArgumentException("协议不存在");
+        }
+        
+        return protocol;
+    }
+
+    @Override
+    public boolean addProtocol(MultipartFile multipartFile, ProtocolManagement protocolManagement) {
+        log.info("协议管理-新增, 请求参数: {}", protocolManagement);
+
+        // 参数校验
+        if (StringUtils.isBlank(protocolManagement.getProtocolFileName())) {
+            throw new IllegalArgumentException("协议名称不能为空");
+        }
+        String prefix;
+        prefix = "privacy/";
+        Map<String, String> fileNameAndType = FileUtil.getFileNameAndType(multipartFile);
+
+        String s = aliOSSUtil.uploadFile(multipartFile, prefix + fileNameAndType.get("name") + RandomCreateUtil.getRandomNum(6) + "." + fileNameAndType.get("type"));
+        // 上传文件
+        protocolManagement.setProtocolFilePath(s);
+
+        // 根据 type(displayPosition) 和名称(protocolFileName) 查询是否存在
+        LambdaQueryWrapper<ProtocolManagement> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ProtocolManagement::getProtocolFileName, protocolManagement.getProtocolFileName());
+        if (StringUtils.isNotBlank(protocolManagement.getDisplayPosition())) {
+            queryWrapper.eq(ProtocolManagement::getDisplayPosition, protocolManagement.getDisplayPosition());
+        } else {
+            queryWrapper.isNull(ProtocolManagement::getDisplayPosition);
+        }
+        
+        ProtocolManagement existProtocol = protocolManagementMapper.selectOne(queryWrapper);
+        
+        int result;
+        if (existProtocol != null) {
+            // 如果存在,则覆盖(更新)
+            log.info("协议管理-发现已存在记录,执行更新操作, id: {}", existProtocol.getId());
+            protocolManagement.setId(existProtocol.getId());
+            result = protocolManagementMapper.updateById(protocolManagement);
+            log.info("协议管理-更新, 结果: {}", result > 0 ? "成功" : "失败");
+        } else {
+            // 如果不存在,则新增
+            result = protocolManagementMapper.insert(protocolManagement);
+            log.info("协议管理-新增, 结果: {}", result > 0 ? "成功" : "失败");
+        }
+
+        return result > 0;
+    }
+
+    @Override
+    public boolean updateProtocol(MultipartRequest multipartRequest, ProtocolManagement protocolManagement) {
+        log.info("协议管理-修改, 请求参数: {}", protocolManagement);
+        
+        // 参数校验
+        if (protocolManagement.getId() == null) {
+            throw new IllegalArgumentException("协议ID不能为空");
+        }
+        
+        // 检查协议是否存在
+        ProtocolManagement existProtocol = protocolManagementMapper.selectById(protocolManagement.getId());
+        if (existProtocol == null) {
+            throw new IllegalArgumentException("协议不存在");
+        }
+        
+        // 如果修改了协议名称,检查新名称是否与其他协议重复
+        if (StringUtils.isNotBlank(protocolManagement.getProtocolFileName()) 
+                && !protocolManagement.getProtocolFileName().equals(existProtocol.getProtocolFileName())) {
+            LambdaQueryWrapper<ProtocolManagement> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(ProtocolManagement::getProtocolFileName, protocolManagement.getProtocolFileName());
+            queryWrapper.ne(ProtocolManagement::getId, protocolManagement.getId());
+            Integer count = protocolManagementMapper.selectCount(queryWrapper);
+            
+            if (count > 0) {
+                throw new IllegalArgumentException("协议名称已存在");
+            }
+        }
+
+        protocolManagement.setProtocolFilePath(fileUploadUtil.uploadMoreFile(multipartRequest).get(0));
+        
+        int result = protocolManagementMapper.updateById(protocolManagement);
+        log.info("协议管理-修改, 结果: {}", result > 0 ? "成功" : "失败");
+        
+        return result > 0;
+    }
+
+    @Override
+    public boolean deleteProtocol(Integer id) {
+        log.info("协议管理-删除, id: {}", id);
+        
+        if (id == null) {
+            throw new IllegalArgumentException("协议ID不能为空");
+        }
+        
+        // 检查协议是否存在
+        ProtocolManagement protocol = protocolManagementMapper.selectById(id);
+        if (protocol == null) {
+            throw new IllegalArgumentException("协议不存在");
+        }
+        protocol.setDeleteFlag(1);
+        
+        // 逻辑删除
+        int result = protocolManagementMapper.updateById(protocol);
+        log.info("协议管理-删除, 结果: {}", result > 0 ? "成功" : "失败");
+        
+        return result > 0;
+    }
+
+    @Override
+    public boolean batchDeleteProtocol(String ids) {
+        log.info("协议管理-批量删除, ids: {}", ids);
+        
+        if (StringUtils.isBlank(ids)) {
+            throw new IllegalArgumentException("协议ID不能为空");
+        }
+        
+        // 将ID字符串转换为列表
+        List<Integer> idList = Arrays.stream(ids.split(","))
+                .map(String::trim)
+                .filter(StringUtils::isNotBlank)
+                .map(Integer::parseInt)
+                .collect(Collectors.toList());
+        
+        if (idList.isEmpty()) {
+            throw new IllegalArgumentException("协议ID不能为空");
+        }
+        
+        // 批量逻辑删除
+        int result = protocolManagementMapper.deleteBatchIds(idList);
+        log.info("协议管理-批量删除, 删除数量: {}", result);
+        
+        return result > 0;
+    }
+
+    @Override
+    public Boolean checkFileNameDuplicate(String protocolFileName) {
+        log.info("协议管理-校验文件名是否重复, protocolFileName: {}", protocolFileName);
+
+        if (StringUtils.isBlank(protocolFileName)) {
+            throw new IllegalArgumentException("协议文件名不能为空");
+        }
+
+        // 查询数据库中是否存在同名文件
+        LambdaQueryWrapper<ProtocolManagement> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ProtocolManagement::getProtocolFileName, protocolFileName);
+        Integer count = protocolManagementMapper.selectCount(queryWrapper);
+
+        if (count > 0) {
+            log.info("协议管理-校验文件名, 结果: 已重复");
+            return true;
+        } else {
+            log.info("协议管理-校验文件名, 结果: 不重复");
+            return false;
+        }
+    }
+}
+

+ 105 - 1
alien-store/src/main/java/shop/alien/store/service/impl/SystemServiceImpl.java

@@ -9,6 +9,8 @@ import org.springframework.util.StringUtils;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.LifeSys;
 import shop.alien.entity.store.UserLoginInfo;
+import shop.alien.entity.store.dto.SystemUserAddDto;
+import shop.alien.entity.store.dto.SystemUserStatusDto;
 import shop.alien.entity.store.vo.SystemLoginVo;
 import shop.alien.store.config.BaseRedisService;
 import shop.alien.mapper.LifeSysMapper;
@@ -70,7 +72,7 @@ public class SystemServiceImpl implements SystemService {
         );
         if (lifeSys != null && lifeSys.getUserPassword().equals(encryptToMD5(password))) {
             Map<String, String> tokenMap = new HashMap<>();
-            tokenMap.put("phone", "123456");
+            tokenMap.put("phone", lifeSys.getPhone());
             tokenMap.put("userName", lifeSys.getUserName());
             tokenMap.put("userId", String.valueOf(lifeSys.getId()));
             tokenMap.put("userType", "web");
@@ -130,6 +132,108 @@ public class SystemServiceImpl implements SystemService {
         return R.fail("注册失败,请稍后重试");
     }
 
+    @Override
+    public R<LifeSys> addUser(SystemUserAddDto addDto) {
+        // 校验用户名是否已存在
+        LambdaQueryWrapper<LifeSys> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(LifeSys::getUserName, addDto.getUserName());
+        LifeSys existingUser = lifeSysMapper.selectOne(queryWrapper);
+        if (existingUser != null) {
+            return R.fail("该用户名已存在,请更换其他用户名");
+        }
+
+        // 校验邮箱是否已存在
+        LambdaQueryWrapper<LifeSys> emailQueryWrapper = new LambdaQueryWrapper<>();
+        emailQueryWrapper.eq(LifeSys::getEmail, addDto.getEmail());
+        LifeSys existingEmail = lifeSysMapper.selectOne(emailQueryWrapper);
+        if (existingEmail != null) {
+            return R.fail("该邮箱已被使用,请更换其他邮箱");
+        }
+
+/*        // 校验手机号是否已存在
+        LambdaQueryWrapper<LifeSys> phoneQueryWrapper = new LambdaQueryWrapper<>();
+        phoneQueryWrapper.eq(LifeSys::getPhone, addDto.getPhone());
+        LifeSys existingPhone = lifeSysMapper.selectOne(phoneQueryWrapper);
+        if (existingPhone != null) {
+            return R.fail("该手机号已被使用,请更换其他手机号");
+        }*/
+
+        // 创建新用户
+        LifeSys lifeSys = new LifeSys();
+        lifeSys.setUserName(addDto.getUserName());
+        lifeSys.setRealName(addDto.getRealName());
+        lifeSys.setPhone(addDto.getPhone());
+        lifeSys.setEmail(addDto.getEmail());
+        // 密码使用MD5加密后存储
+//        lifeSys.setUserPassword(encryptToMD5(addDto.getPassword()));
+        lifeSys.setUserPassword(addDto.getPassword());
+
+        // 处理多角色:将角色ID列表转换为逗号分隔的字符串
+        lifeSys.setRoleId(addDto.getRoleIds());
+        
+        lifeSys.setDepartmentId(addDto.getDepartmentId());
+        lifeSys.setRemark(addDto.getRemark());
+        lifeSys.setStatus(addDto.getStatus() != null ? addDto.getStatus() : 1);
+        lifeSys.setDeleteFlag(0); // 未删除
+
+        // 保存用户
+        int result = lifeSysMapper.insert(lifeSys);
+        if (result > 0) {
+            // 清除密码信息,避免返回到前端
+            lifeSys.setUserPassword(null);
+            return R.data(lifeSys, "新增账号成功");
+        }
+        return R.fail("新增账号失败,请稍后重试");
+    }
+
+    @Override
+    public R<LifeSys> updateUserStatus(SystemUserStatusDto statusDto) {
+        // 校验用户ID
+        if (statusDto.getUserId() == null) {
+            return R.fail("用户ID不能为空");
+        }
+
+        // 校验状态值
+        if (statusDto.getStatus() == null) {
+            return R.fail("状态值不能为空");
+        }
+
+        if (statusDto.getStatus() != 0 && statusDto.getStatus() != 1) {
+            return R.fail("状态值只能是0(禁用)或1(启用)");
+        }
+
+        // 查询用户是否存在
+        LifeSys lifeSys = lifeSysMapper.selectById(statusDto.getUserId());
+        if (lifeSys == null) {
+            return R.fail("用户不存在");
+        }
+
+        // 更新用户状态
+        lifeSys.setStatus(statusDto.getStatus());
+        
+        // 如果提供了备注,也更新备注
+        if (StringUtils.hasText(statusDto.getRemark())) {
+            String currentRemark = lifeSys.getRemark();
+            String newRemark = statusDto.getRemark();
+            // 如果已有备注,追加新备注
+            if (StringUtils.hasText(currentRemark)) {
+                lifeSys.setRemark(currentRemark + " | " + newRemark);
+            } else {
+                lifeSys.setRemark(newRemark);
+            }
+        }
+
+        // 执行更新
+        int result = lifeSysMapper.updateById(lifeSys);
+        if (result > 0) {
+            // 清除密码信息,避免返回到前端
+            lifeSys.setUserPassword(null);
+            String statusText = statusDto.getStatus() == 1 ? "启用" : "禁用";
+            return R.data(lifeSys, "账号" + statusText + "成功");
+        }
+        return R.fail("修改状态失败,请稍后重试");
+    }
+
     public static String encryptToMD5(String input) {
         try {
             // 获取 MD5 算法的 MessageDigest 实例