diff --git a/blade-service-api/blade-user-api/src/main/java/org/springblade/system/pojo/vo/MpUserVO.java b/blade-service-api/blade-user-api/src/main/java/org/springblade/system/pojo/vo/MpUserVO.java
new file mode 100644
index 00000000..c2ced763
--- /dev/null
+++ b/blade-service-api/blade-user-api/src/main/java/org/springblade/system/pojo/vo/MpUserVO.java
@@ -0,0 +1,73 @@
+/**
+ * BladeX Commercial License Agreement
+ * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
+ *
+ * Use of this software is governed by the Commercial License Agreement
+ * obtained after purchasing a license from BladeX.
+ *
+ * 1. This software is for development use only under a valid license
+ * from BladeX.
+ *
+ * 2. Redistribution of this software's source code to any third party
+ * without a commercial license is strictly prohibited.
+ *
+ * 3. Licensees may copyright their own code but cannot use segments
+ * from this software for such purposes. Copyright of this software
+ * remains with BladeX.
+ *
+ * Using this software signifies agreement to this License, and the software
+ * must not be used for illegal purposes.
+ *
+ * Author: Chill Zhuang (bladejava@qq.com)
+ */
+package org.springblade.system.pojo.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.system.pojo.entity.MpUser;
+
+import java.io.Serial;
+
+/**
+ * 小程序用户视图实体类
+ *
+ * @author Chill
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Schema(description = "小程序用户")
+public class MpUserVO extends MpUser {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 身份名称(逗号分隔中文)
+ */
+ @TableField(exist = false)
+ @Schema(description = "身份名称")
+ private String identitiesName;
+
+ /**
+ * 性别名称
+ */
+ @TableField(exist = false)
+ @Schema(description = "性别名称")
+ private String sexName;
+
+ /**
+ * 创建人姓名
+ */
+ @TableField(exist = false)
+ @Schema(description = "创建人姓名")
+ private String createUserName;
+
+ /**
+ * 更新人姓名
+ */
+ @TableField(exist = false)
+ @Schema(description = "更新人姓名")
+ private String updateUserName;
+
+}
diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/controller/MpUserController.java b/blade-service/blade-system/src/main/java/org/springblade/system/controller/MpUserController.java
new file mode 100644
index 00000000..b4c84f8e
--- /dev/null
+++ b/blade-service/blade-system/src/main/java/org/springblade/system/controller/MpUserController.java
@@ -0,0 +1,134 @@
+/**
+ * BladeX Commercial License Agreement
+ * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
+ *
+ * Use of this software is governed by the Commercial License Agreement
+ * obtained after purchasing a license from BladeX.
+ *
+ * 1. This software is for development use only under a valid license
+ * from BladeX.
+ *
+ * 2. Redistribution of this software's source code to any third party
+ * without a commercial license is strictly prohibited.
+ *
+ * 3. Licensees may copyright their own code but cannot use segments
+ * from this software for such purposes. Copyright of this software
+ * remains with BladeX.
+ *
+ * Using this software signifies agreement to this License, and the software
+ * must not be used for illegal purposes.
+ *
+ * Author: Chill Zhuang (bladejava@qq.com)
+ */
+package org.springblade.system.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.annotation.PreAuth;
+import org.springblade.core.tenant.annotation.NonDS;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.system.pojo.entity.MpUser;
+import org.springblade.system.pojo.vo.MpUserVO;
+import org.springblade.system.service.IMpUserService;
+import org.springblade.system.wrapper.MpUserWrapper;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/**
+ * 小程序用户管理 控制器
+ *
+ * @author Chill
+ */
+@NonDS
+@RestController
+@AllArgsConstructor
+@PreAuth(menu = "mp_user")
+@RequestMapping("mp-user")
+@Tag(name = "小程序用户", description = "小程序用户管理")
+public class MpUserController extends BladeController {
+
+ private final IMpUserService mpUserService;
+
+ /**
+ * 详情
+ */
+ @GetMapping("/detail")
+ @ApiOperationSupport(order = 1)
+ @Operation(summary = "详情", description = "传入id")
+ public R detail(MpUser mpUser) {
+ MpUser detail = mpUserService.getOne(Condition.getQueryWrapper(mpUser));
+ if (detail == null) {
+ return R.fail("小程序用户不存在");
+ }
+ return R.data(MpUserWrapper.build().entityVO(detail));
+ }
+
+ /**
+ * 分页
+ */
+ @GetMapping("/list")
+ @ApiOperationSupport(order = 2)
+ @Operation(summary = "分页", description = "传入查询条件")
+ public R> list(MpUser mpUser, Query query) {
+ IPage pages = mpUserService.selectMpUserPage(Condition.getPage(query), mpUser);
+ return R.data(MpUserWrapper.build().pageVO(pages));
+ }
+
+ /**
+ * 新增或修改
+ */
+ @PostMapping("/submit")
+ @ApiOperationSupport(order = 3)
+ @Operation(summary = "新增或修改", description = "传入MpUser")
+ public R submit(@Valid @RequestBody MpUser mpUser) {
+ return R.status(mpUserService.submitOrUpdate(mpUser));
+ }
+
+ /**
+ * 逻辑删除
+ */
+ @PostMapping("/remove")
+ @ApiOperationSupport(order = 4)
+ @Operation(summary = "逻辑删除", description = "传入ids")
+ public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) {
+ return R.status(mpUserService.removeMpUser(Func.toLongList(ids)));
+ }
+
+ /**
+ * 启用 / 停用
+ */
+ @PostMapping("/change-status")
+ @ApiOperationSupport(order = 5)
+ @Operation(summary = "修改状态", description = "status:1启用,0停用")
+ public R changeStatus(@Parameter(description = "用户主键", required = true) @RequestParam Long id,
+ @Parameter(description = "状态:1启用,0停用", required = true) @RequestParam Integer status) {
+ return R.status(mpUserService.changeStatus(id, status));
+ }
+
+ /**
+ * 重置密码
+ */
+ @PostMapping("/reset-password")
+ @ApiOperationSupport(order = 6)
+ @Operation(summary = "重置密码", description = "传入userId集合,返回账号与明文密码")
+ public R