diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..81cc587 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,35 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "java", + "name": "Current File", + "request": "launch", + "mainClass": "${file}" + }, + { + "type": "java", + "name": "DromaraApplication", + "request": "launch", + "mainClass": "org.dromara.DromaraApplication", + "projectName": "ruoyi-admin" + }, + { + "type": "java", + "name": "MonitorAdminApplication", + "request": "launch", + "mainClass": "org.dromara.monitor.admin.MonitorAdminApplication", + "projectName": "ruoyi-monitor-admin" + }, + { + "type": "java", + "name": "SnailJobServerApplication", + "request": "launch", + "mainClass": "org.dromara.snailjob.SnailJobServerApplication", + "projectName": "ruoyi-snailjob-server" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7b016a8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.compile.nullAnalysis.mode": "automatic" +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index d649201..1e978b4 100644 --- a/pom.xml +++ b/pom.xml @@ -344,15 +344,16 @@ ${revision} + org.dromara - ruoyi-demo + ruoyi-client ${revision} org.dromara - ruoyi-art + ruoyi-demo ${revision} diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index bd6388c..627f41c 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -93,10 +93,10 @@ ruoyi-demo - + org.dromara - ruoyi-art + ruoyi-client diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index df26f24..44142fa 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -65,9 +65,9 @@ spring: postgres: type: ${spring.datasource.type} driverClassName: org.postgresql.Driver - url: jdbc:postgresql://10.13.13.1:5432/art_sports_volunteer?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true - username: art_sports_volunteer - password: t56kX86WMQ8eNjRz + url: jdbc:postgresql://10.13.13.1:5432/wz-db?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true + username: wz-db + password: sYpphaZWYpEEtrS7 # sqlserver: # type: ${spring.datasource.type} # driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index efdef5a..896cc54 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -208,8 +208,8 @@ springdoc: packages-to-scan: org.dromara.generator - group: 5.工作流模块 packages-to-scan: org.dromara.workflow - - group: 6.艺术数据模块 - packages-to-scan: org.dromara.art + - group: 6.客户模块 + packages-to-scan: org.dromara.client # 防止XSS攻击 xss: diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml index 746df0b..7ecab23 100644 --- a/ruoyi-modules/pom.xml +++ b/ruoyi-modules/pom.xml @@ -10,12 +10,12 @@ 4.0.0 - ruoyi-art ruoyi-demo ruoyi-generator ruoyi-job ruoyi-system ruoyi-workflow + ruoyi-client ruoyi-modules diff --git a/ruoyi-modules/ruoyi-client/pom.xml b/ruoyi-modules/ruoyi-client/pom.xml new file mode 100644 index 0000000..5df6f54 --- /dev/null +++ b/ruoyi-modules/ruoyi-client/pom.xml @@ -0,0 +1,113 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-client + + + 客户模块 + + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-sms + + + + org.dromara + ruoyi-common-mail + + + + org.dromara + ruoyi-common-redis + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-excel + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-ratelimiter + + + + org.dromara + ruoyi-common-translation + + + + org.dromara + ruoyi-common-sensitive + + + + org.dromara + ruoyi-common-encrypt + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-websocket + + + + org.postgresql + postgresql + + + + + diff --git a/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/controller/TPlatformUserController.java b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/controller/TPlatformUserController.java new file mode 100644 index 0000000..ee97426 --- /dev/null +++ b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/controller/TPlatformUserController.java @@ -0,0 +1,105 @@ +package org.dromara.client.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.client.domain.vo.TPlatformUserVo; +import org.dromara.client.domain.bo.TPlatformUserBo; +import org.dromara.client.service.ITPlatformUserService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 平台用户关联(微信/抖音小程序用户信息) + * + * @author ZhouWenTao + * @date 2026-03-22 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/client/platformUser") +public class TPlatformUserController extends BaseController { + + private final ITPlatformUserService tPlatformUserService; + + /** + * 查询平台用户关联(微信/抖音小程序用户信息)列表 + */ + @SaCheckPermission("client:platformUser:list") + @GetMapping("/list") + public TableDataInfo list(TPlatformUserBo bo, PageQuery pageQuery) { + return tPlatformUserService.queryPageList(bo, pageQuery); + } + + /** + * 导出平台用户关联(微信/抖音小程序用户信息)列表 + */ + @SaCheckPermission("client:platformUser:export") + @Log(title = "平台用户关联(微信/抖音小程序用户信息)", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TPlatformUserBo bo, HttpServletResponse response) { + List list = tPlatformUserService.queryList(bo); + ExcelUtil.exportExcel(list, "平台用户关联(微信/抖音小程序用户信息)", TPlatformUserVo.class, response); + } + + /** + * 获取平台用户关联(微信/抖音小程序用户信息)详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("client:platformUser:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tPlatformUserService.queryById(id)); + } + + /** + * 新增平台用户关联(微信/抖音小程序用户信息) + */ + @SaCheckPermission("client:platformUser:add") + @Log(title = "平台用户关联(微信/抖音小程序用户信息)", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TPlatformUserBo bo) { + return toAjax(tPlatformUserService.insertByBo(bo)); + } + + /** + * 修改平台用户关联(微信/抖音小程序用户信息) + */ + @SaCheckPermission("client:platformUser:edit") + @Log(title = "平台用户关联(微信/抖音小程序用户信息)", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TPlatformUserBo bo) { + return toAjax(tPlatformUserService.updateByBo(bo)); + } + + /** + * 删除平台用户关联(微信/抖音小程序用户信息) + * + * @param ids 主键串 + */ + @SaCheckPermission("client:platformUser:remove") + @Log(title = "平台用户关联(微信/抖音小程序用户信息)", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tPlatformUserService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/controller/TUserController.java b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/controller/TUserController.java new file mode 100644 index 0000000..4215dd2 --- /dev/null +++ b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/controller/TUserController.java @@ -0,0 +1,105 @@ +package org.dromara.client.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.client.domain.vo.TUserVo; +import org.dromara.client.domain.bo.TUserBo; +import org.dromara.client.service.ITUserService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 客户用户基础信息 + * + * @author ZhouWenTao + * @date 2026-03-22 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/client/user") +public class TUserController extends BaseController { + + private final ITUserService tUserService; + + /** + * 查询客户用户基础信息列表 + */ + @SaCheckPermission("client:user:list") + @GetMapping("/list") + public TableDataInfo list(TUserBo bo, PageQuery pageQuery) { + return tUserService.queryPageList(bo, pageQuery); + } + + /** + * 导出客户用户基础信息列表 + */ + @SaCheckPermission("client:user:export") + @Log(title = "客户用户基础信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TUserBo bo, HttpServletResponse response) { + List list = tUserService.queryList(bo); + ExcelUtil.exportExcel(list, "客户用户基础信息", TUserVo.class, response); + } + + /** + * 获取客户用户基础信息详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("client:user:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tUserService.queryById(id)); + } + + /** + * 新增客户用户基础信息 + */ + @SaCheckPermission("client:user:add") + @Log(title = "客户用户基础信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TUserBo bo) { + return toAjax(tUserService.insertByBo(bo)); + } + + /** + * 修改客户用户基础信息 + */ + @SaCheckPermission("client:user:edit") + @Log(title = "客户用户基础信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TUserBo bo) { + return toAjax(tUserService.updateByBo(bo)); + } + + /** + * 删除客户用户基础信息 + * + * @param ids 主键串 + */ + @SaCheckPermission("client:user:remove") + @Log(title = "客户用户基础信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tUserService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/domain/TPlatformUser.java b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/domain/TPlatformUser.java new file mode 100644 index 0000000..e3f01b0 --- /dev/null +++ b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/domain/TPlatformUser.java @@ -0,0 +1,74 @@ +package org.dromara.client.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 平台用户关联(微信/抖音小程序用户信息)对象 t_platform_user + * + * @author ZhouWenTao + * @date 2026-03-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_platform_user") +public class TPlatformUser extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 平台用户ID(自增) + */ + @TableId(value = "id") + private Long id; + + /** + * 关联t_user.id + */ + private Long userId; + + /** + * 平台类型:1-微信小程序,2-抖音小程序,3-支付宝小程序 + */ + private Long platformType; + + /** + * 平台唯一标识(微信openid/抖音open_id) + */ + private String platformOpenid; + + /** + * 平台统一标识(微信unionid,多小程序互通用) + */ + private String platformUnionid; + + /** + * 平台会话密钥(微信session_key,加密存储) + */ + private String platformSessionKey; + + /** + * 平台扩展字段(如抖音的user_name、微信的city等) + */ + private String platformExtra; + + /** + * 最后登录时间 + */ + private Date lastLoginTime; + + /** + * 软删除:0-未删,1-已删 + */ + @TableLogic + private Long delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/domain/TUser.java b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/domain/TUser.java new file mode 100644 index 0000000..89f72fa --- /dev/null +++ b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/domain/TUser.java @@ -0,0 +1,77 @@ +package org.dromara.client.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 客户用户基础信息对象 t_user + * + * @author ZhouWenTao + * @date 2026-03-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_user") +public class TUser extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 全局唯一用户ID(自增) + */ + @TableId(value = "id") + private Long id; + + /** + * 用户名(可选,后台管理用) + */ + private String username; + + /** + * 用户昵称(各平台统一) + */ + private String nickname; + + /** + * 用户头像URL + */ + private String avatarUrl; + + /** + * 手机号(脱敏存储,如138****1234) + */ + private String phone; + + /** + * 性别:0-未知,1-男,2-女 + */ + private Long gender; + + /** + * 状态:0-禁用,1-正常 + */ + private Long status; + + /** + * 软删除:0-未删,1-已删 + */ + @TableLogic + private Long delFlag; + + /** + * 密码 + */ + private String password; + + /** + * $column.columnComment + */ + private String salt; + + +} diff --git a/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/domain/bo/TPlatformUserBo.java b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/domain/bo/TPlatformUserBo.java new file mode 100644 index 0000000..14b34d9 --- /dev/null +++ b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/domain/bo/TPlatformUserBo.java @@ -0,0 +1,70 @@ +package org.dromara.client.domain.bo; + +import org.dromara.client.domain.TPlatformUser; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 平台用户关联(微信/抖音小程序用户信息)业务对象 t_platform_user + * + * @author ZhouWenTao + * @date 2026-03-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TPlatformUser.class, reverseConvertGenerate = false) +public class TPlatformUserBo extends BaseEntity { + + /** + * 平台用户ID(自增) + */ + @NotNull(message = "平台用户ID(自增)不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 关联t_user.id + */ + @NotNull(message = "关联t_user.id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long userId; + + /** + * 平台类型:1-微信小程序,2-抖音小程序,3-支付宝小程序 + */ + @NotNull(message = "平台类型:1-微信小程序,2-抖音小程序,3-支付宝小程序不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long platformType; + + /** + * 平台唯一标识(微信openid/抖音open_id) + */ + @NotBlank(message = "平台唯一标识(微信openid/抖音open_id)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String platformOpenid; + + /** + * 平台统一标识(微信unionid,多小程序互通用) + */ + private String platformUnionid; + + /** + * 平台会话密钥(微信session_key,加密存储) + */ + private String platformSessionKey; + + /** + * 平台扩展字段(如抖音的user_name、微信的city等) + */ + private String platformExtra; + + /** + * 最后登录时间 + */ + private Date lastLoginTime; + + +} diff --git a/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/domain/bo/TUserBo.java b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/domain/bo/TUserBo.java new file mode 100644 index 0000000..73c4444 --- /dev/null +++ b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/domain/bo/TUserBo.java @@ -0,0 +1,70 @@ +package org.dromara.client.domain.bo; + +import org.dromara.client.domain.TUser; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 客户用户基础信息业务对象 t_user + * + * @author ZhouWenTao + * @date 2026-03-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TUser.class, reverseConvertGenerate = false) +public class TUserBo extends BaseEntity { + + /** + * 全局唯一用户ID(自增) + */ + @NotNull(message = "全局唯一用户ID(自增)不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 用户名(可选,后台管理用) + */ + private String username; + + /** + * 用户昵称(各平台统一) + */ + private String nickname; + + /** + * 用户头像URL + */ + private String avatarUrl; + + /** + * 手机号(脱敏存储,如138****1234) + */ + private String phone; + + /** + * 性别:0-未知,1-男,2-女 + */ + private Long gender; + + /** + * 状态:0-禁用,1-正常 + */ + private Long status; + + /** + * 密码 + */ + private String password; + + /** + * $column.columnComment + */ + private String salt; + + +} diff --git a/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/domain/vo/TPlatformUserVo.java b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/domain/vo/TPlatformUserVo.java new file mode 100644 index 0000000..2d3ad33 --- /dev/null +++ b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/domain/vo/TPlatformUserVo.java @@ -0,0 +1,87 @@ +package org.dromara.client.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.client.domain.TPlatformUser; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 平台用户关联(微信/抖音小程序用户信息)视图对象 t_platform_user + * + * @author ZhouWenTao + * @date 2026-03-22 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TPlatformUser.class) +public class TPlatformUserVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 平台用户ID(自增) + */ + @ExcelProperty(value = "平台用户ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "自=增") + private Long id; + + /** + * 关联t_user.id + */ + @ExcelProperty(value = "关联t_user.id") + private Long userId; + + /** + * 平台类型:1-微信小程序,2-抖音小程序,3-支付宝小程序 + */ + @ExcelProperty(value = "平台类型:1-微信小程序,2-抖音小程序,3-支付宝小程序") + private Long platformType; + + /** + * 平台唯一标识(微信openid/抖音open_id) + */ + @ExcelProperty(value = "平台唯一标识", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "微=信openid/抖音open_id") + private String platformOpenid; + + /** + * 平台统一标识(微信unionid,多小程序互通用) + */ + @ExcelProperty(value = "平台统一标识", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "微=信unionid,多小程序互通用") + private String platformUnionid; + + /** + * 平台会话密钥(微信session_key,加密存储) + */ + @ExcelProperty(value = "平台会话密钥", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "微=信session_key,加密存储") + private String platformSessionKey; + + /** + * 平台扩展字段(如抖音的user_name、微信的city等) + */ + @ExcelProperty(value = "平台扩展字段", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "如=抖音的user_name、微信的city等") + private String platformExtra; + + /** + * 最后登录时间 + */ + @ExcelProperty(value = "最后登录时间") + private Date lastLoginTime; + + +} diff --git a/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/domain/vo/TUserVo.java b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/domain/vo/TUserVo.java new file mode 100644 index 0000000..461c384 --- /dev/null +++ b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/domain/vo/TUserVo.java @@ -0,0 +1,91 @@ +package org.dromara.client.domain.vo; + +import org.dromara.client.domain.TUser; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 客户用户基础信息视图对象 t_user + * + * @author ZhouWenTao + * @date 2026-03-22 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TUser.class) +public class TUserVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 全局唯一用户ID(自增) + */ + @ExcelProperty(value = "全局唯一用户ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "自=增") + private Long id; + + /** + * 用户名(可选,后台管理用) + */ + @ExcelProperty(value = "用户名", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "可=选,后台管理用") + private String username; + + /** + * 用户昵称(各平台统一) + */ + @ExcelProperty(value = "用户昵称", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "各=平台统一") + private String nickname; + + /** + * 用户头像URL + */ + @ExcelProperty(value = "用户头像URL") + private String avatarUrl; + + /** + * 手机号(脱敏存储,如138****1234) + */ + @ExcelProperty(value = "手机号", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "脱=敏存储,如138****1234") + private String phone; + + /** + * 性别:0-未知,1-男,2-女 + */ + @ExcelProperty(value = "性别:0-未知,1-男,2-女") + private Long gender; + + /** + * 状态:0-禁用,1-正常 + */ + @ExcelProperty(value = "状态:0-禁用,1-正常") + private Long status; + + /** + * 密码 + */ + @ExcelProperty(value = "密码") + private String password; + + /** + * $column.columnComment + */ + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "$column.readConverterExp()") + private String salt; + + +} diff --git a/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/mapper/TPlatformUserMapper.java b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/mapper/TPlatformUserMapper.java new file mode 100644 index 0000000..1e13688 --- /dev/null +++ b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/mapper/TPlatformUserMapper.java @@ -0,0 +1,15 @@ +package org.dromara.client.mapper; + +import org.dromara.client.domain.TPlatformUser; +import org.dromara.client.domain.vo.TPlatformUserVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 平台用户关联(微信/抖音小程序用户信息)Mapper接口 + * + * @author ZhouWenTao + * @date 2026-03-22 + */ +public interface TPlatformUserMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/mapper/TUserMapper.java b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/mapper/TUserMapper.java new file mode 100644 index 0000000..de4dda4 --- /dev/null +++ b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/mapper/TUserMapper.java @@ -0,0 +1,15 @@ +package org.dromara.client.mapper; + +import org.dromara.client.domain.TUser; +import org.dromara.client.domain.vo.TUserVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 客户用户基础信息Mapper接口 + * + * @author ZhouWenTao + * @date 2026-03-22 + */ +public interface TUserMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/service/ITPlatformUserService.java b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/service/ITPlatformUserService.java new file mode 100644 index 0000000..27c4b27 --- /dev/null +++ b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/service/ITPlatformUserService.java @@ -0,0 +1,68 @@ +package org.dromara.client.service; + +import org.dromara.client.domain.vo.TPlatformUserVo; +import org.dromara.client.domain.bo.TPlatformUserBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 平台用户关联(微信/抖音小程序用户信息)Service接口 + * + * @author ZhouWenTao + * @date 2026-03-22 + */ +public interface ITPlatformUserService { + + /** + * 查询平台用户关联(微信/抖音小程序用户信息) + * + * @param id 主键 + * @return 平台用户关联(微信/抖音小程序用户信息) + */ + TPlatformUserVo queryById(Long id); + + /** + * 分页查询平台用户关联(微信/抖音小程序用户信息)列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 平台用户关联(微信/抖音小程序用户信息)分页列表 + */ + TableDataInfo queryPageList(TPlatformUserBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的平台用户关联(微信/抖音小程序用户信息)列表 + * + * @param bo 查询条件 + * @return 平台用户关联(微信/抖音小程序用户信息)列表 + */ + List queryList(TPlatformUserBo bo); + + /** + * 新增平台用户关联(微信/抖音小程序用户信息) + * + * @param bo 平台用户关联(微信/抖音小程序用户信息) + * @return 是否新增成功 + */ + Boolean insertByBo(TPlatformUserBo bo); + + /** + * 修改平台用户关联(微信/抖音小程序用户信息) + * + * @param bo 平台用户关联(微信/抖音小程序用户信息) + * @return 是否修改成功 + */ + Boolean updateByBo(TPlatformUserBo bo); + + /** + * 校验并批量删除平台用户关联(微信/抖音小程序用户信息)信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/service/ITUserService.java b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/service/ITUserService.java new file mode 100644 index 0000000..e74e93d --- /dev/null +++ b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/service/ITUserService.java @@ -0,0 +1,68 @@ +package org.dromara.client.service; + +import org.dromara.client.domain.vo.TUserVo; +import org.dromara.client.domain.bo.TUserBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 客户用户基础信息Service接口 + * + * @author ZhouWenTao + * @date 2026-03-22 + */ +public interface ITUserService { + + /** + * 查询客户用户基础信息 + * + * @param id 主键 + * @return 客户用户基础信息 + */ + TUserVo queryById(Long id); + + /** + * 分页查询客户用户基础信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 客户用户基础信息分页列表 + */ + TableDataInfo queryPageList(TUserBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的客户用户基础信息列表 + * + * @param bo 查询条件 + * @return 客户用户基础信息列表 + */ + List queryList(TUserBo bo); + + /** + * 新增客户用户基础信息 + * + * @param bo 客户用户基础信息 + * @return 是否新增成功 + */ + Boolean insertByBo(TUserBo bo); + + /** + * 修改客户用户基础信息 + * + * @param bo 客户用户基础信息 + * @return 是否修改成功 + */ + Boolean updateByBo(TUserBo bo); + + /** + * 校验并批量删除客户用户基础信息信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/service/impl/TPlatformUserServiceImpl.java b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/service/impl/TPlatformUserServiceImpl.java new file mode 100644 index 0000000..626658a --- /dev/null +++ b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/service/impl/TPlatformUserServiceImpl.java @@ -0,0 +1,138 @@ +package org.dromara.client.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.dromara.client.domain.bo.TPlatformUserBo; +import org.dromara.client.domain.vo.TPlatformUserVo; +import org.dromara.client.domain.TPlatformUser; +import org.dromara.client.mapper.TPlatformUserMapper; +import org.dromara.client.service.ITPlatformUserService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 平台用户关联(微信/抖音小程序用户信息)Service业务层处理 + * + * @author ZhouWenTao + * @date 2026-03-22 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class TPlatformUserServiceImpl implements ITPlatformUserService { + + private final TPlatformUserMapper baseMapper; + + /** + * 查询平台用户关联(微信/抖音小程序用户信息) + * + * @param id 主键 + * @return 平台用户关联(微信/抖音小程序用户信息) + */ + @Override + public TPlatformUserVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询平台用户关联(微信/抖音小程序用户信息)列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 平台用户关联(微信/抖音小程序用户信息)分页列表 + */ + @Override + public TableDataInfo queryPageList(TPlatformUserBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的平台用户关联(微信/抖音小程序用户信息)列表 + * + * @param bo 查询条件 + * @return 平台用户关联(微信/抖音小程序用户信息)列表 + */ + @Override + public List queryList(TPlatformUserBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TPlatformUserBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(TPlatformUser::getId); + lqw.eq(bo.getUserId() != null, TPlatformUser::getUserId, bo.getUserId()); + lqw.eq(bo.getPlatformType() != null, TPlatformUser::getPlatformType, bo.getPlatformType()); + lqw.eq(StringUtils.isNotBlank(bo.getPlatformOpenid()), TPlatformUser::getPlatformOpenid, bo.getPlatformOpenid()); + lqw.eq(StringUtils.isNotBlank(bo.getPlatformUnionid()), TPlatformUser::getPlatformUnionid, bo.getPlatformUnionid()); + lqw.eq(StringUtils.isNotBlank(bo.getPlatformSessionKey()), TPlatformUser::getPlatformSessionKey, bo.getPlatformSessionKey()); + lqw.eq(StringUtils.isNotBlank(bo.getPlatformExtra()), TPlatformUser::getPlatformExtra, bo.getPlatformExtra()); + lqw.eq(bo.getLastLoginTime() != null, TPlatformUser::getLastLoginTime, bo.getLastLoginTime()); + return lqw; + } + + /** + * 新增平台用户关联(微信/抖音小程序用户信息) + * + * @param bo 平台用户关联(微信/抖音小程序用户信息) + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TPlatformUserBo bo) { + TPlatformUser add = MapstructUtils.convert(bo, TPlatformUser.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改平台用户关联(微信/抖音小程序用户信息) + * + * @param bo 平台用户关联(微信/抖音小程序用户信息) + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TPlatformUserBo bo) { + TPlatformUser update = MapstructUtils.convert(bo, TPlatformUser.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TPlatformUser entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除平台用户关联(微信/抖音小程序用户信息)信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/service/impl/TUserServiceImpl.java b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/service/impl/TUserServiceImpl.java new file mode 100644 index 0000000..fff368c --- /dev/null +++ b/ruoyi-modules/ruoyi-client/src/main/java/org/dromara/client/service/impl/TUserServiceImpl.java @@ -0,0 +1,139 @@ +package org.dromara.client.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.dromara.client.domain.bo.TUserBo; +import org.dromara.client.domain.vo.TUserVo; +import org.dromara.client.domain.TUser; +import org.dromara.client.mapper.TUserMapper; +import org.dromara.client.service.ITUserService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 客户用户基础信息Service业务层处理 + * + * @author ZhouWenTao + * @date 2026-03-22 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class TUserServiceImpl implements ITUserService { + + private final TUserMapper baseMapper; + + /** + * 查询客户用户基础信息 + * + * @param id 主键 + * @return 客户用户基础信息 + */ + @Override + public TUserVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询客户用户基础信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 客户用户基础信息分页列表 + */ + @Override + public TableDataInfo queryPageList(TUserBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的客户用户基础信息列表 + * + * @param bo 查询条件 + * @return 客户用户基础信息列表 + */ + @Override + public List queryList(TUserBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TUserBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(TUser::getId); + lqw.like(StringUtils.isNotBlank(bo.getUsername()), TUser::getUsername, bo.getUsername()); + lqw.like(StringUtils.isNotBlank(bo.getNickname()), TUser::getNickname, bo.getNickname()); + lqw.eq(StringUtils.isNotBlank(bo.getAvatarUrl()), TUser::getAvatarUrl, bo.getAvatarUrl()); + lqw.eq(StringUtils.isNotBlank(bo.getPhone()), TUser::getPhone, bo.getPhone()); + lqw.eq(bo.getGender() != null, TUser::getGender, bo.getGender()); + lqw.eq(bo.getStatus() != null, TUser::getStatus, bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getPassword()), TUser::getPassword, bo.getPassword()); + lqw.eq(StringUtils.isNotBlank(bo.getSalt()), TUser::getSalt, bo.getSalt()); + return lqw; + } + + /** + * 新增客户用户基础信息 + * + * @param bo 客户用户基础信息 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TUserBo bo) { + TUser add = MapstructUtils.convert(bo, TUser.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改客户用户基础信息 + * + * @param bo 客户用户基础信息 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TUserBo bo) { + TUser update = MapstructUtils.convert(bo, TUser.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TUser entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除客户用户基础信息信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-client/src/main/resources/mapper/client/TPlatformUserMapper.xml b/ruoyi-modules/ruoyi-client/src/main/resources/mapper/client/TPlatformUserMapper.xml new file mode 100644 index 0000000..7e50a35 --- /dev/null +++ b/ruoyi-modules/ruoyi-client/src/main/resources/mapper/client/TPlatformUserMapper.xml @@ -0,0 +1,6 @@ + + + + diff --git a/ruoyi-modules/ruoyi-client/src/main/resources/mapper/client/TUserMapper.xml b/ruoyi-modules/ruoyi-client/src/main/resources/mapper/client/TUserMapper.xml new file mode 100644 index 0000000..293df96 --- /dev/null +++ b/ruoyi-modules/ruoyi-client/src/main/resources/mapper/client/TUserMapper.xml @@ -0,0 +1,6 @@ + + + + diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/generator.yml b/ruoyi-modules/ruoyi-generator/src/main/resources/generator.yml index d779d97..0a69e1c 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/generator.yml +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/generator.yml @@ -1,7 +1,7 @@ # 代码生成 gen: # 作者 - author: Lion Li + author: ZhouWenTao # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool packageName: org.dromara.system # 自动去除表前缀,默认是false