This commit is contained in:
zwt13703 2026-03-23 19:17:49 +08:00
parent b3a2aa3c99
commit d78ddcf727
25 changed files with 1297 additions and 11 deletions

35
.vscode/launch.json vendored Normal file
View File

@ -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"
}
]
}

3
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"java.compile.nullAnalysis.mode": "automatic"
}

View File

@ -344,15 +344,16 @@
<version>${revision}</version> <version>${revision}</version>
</dependency> </dependency>
<!-- 代码生成-->
<dependency> <dependency>
<groupId>org.dromara</groupId> <groupId>org.dromara</groupId>
<artifactId>ruoyi-demo</artifactId> <artifactId>ruoyi-client</artifactId>
<version>${revision}</version> <version>${revision}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.dromara</groupId> <groupId>org.dromara</groupId>
<artifactId>ruoyi-art</artifactId> <artifactId>ruoyi-demo</artifactId>
<version>${revision}</version> <version>${revision}</version>
</dependency> </dependency>

View File

@ -93,10 +93,10 @@
<artifactId>ruoyi-demo</artifactId> <artifactId>ruoyi-demo</artifactId>
</dependency> </dependency>
<!-- 艺术数据模块 --> <!-- demo模块 -->
<dependency> <dependency>
<groupId>org.dromara</groupId> <groupId>org.dromara</groupId>
<artifactId>ruoyi-art</artifactId> <artifactId>ruoyi-client</artifactId>
</dependency> </dependency>
<!-- 工作流模块 --> <!-- 工作流模块 -->

View File

@ -65,9 +65,9 @@ spring:
postgres: postgres:
type: ${spring.datasource.type} type: ${spring.datasource.type}
driverClassName: org.postgresql.Driver 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 url: jdbc:postgresql://10.13.13.1:5432/wz-db?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
username: art_sports_volunteer username: wz-db
password: t56kX86WMQ8eNjRz password: sYpphaZWYpEEtrS7
# sqlserver: # sqlserver:
# type: ${spring.datasource.type} # type: ${spring.datasource.type}
# driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver # driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver

View File

@ -208,8 +208,8 @@ springdoc:
packages-to-scan: org.dromara.generator packages-to-scan: org.dromara.generator
- group: 5.工作流模块 - group: 5.工作流模块
packages-to-scan: org.dromara.workflow packages-to-scan: org.dromara.workflow
- group: 6.艺术数据模块 - group: 6.客户模块
packages-to-scan: org.dromara.art packages-to-scan: org.dromara.client
# 防止XSS攻击 # 防止XSS攻击
xss: xss:

View File

@ -10,12 +10,12 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<modules> <modules>
<module>ruoyi-art</module>
<module>ruoyi-demo</module> <module>ruoyi-demo</module>
<module>ruoyi-generator</module> <module>ruoyi-generator</module>
<module>ruoyi-job</module> <module>ruoyi-job</module>
<module>ruoyi-system</module> <module>ruoyi-system</module>
<module>ruoyi-workflow</module> <module>ruoyi-workflow</module>
<module>ruoyi-client</module>
</modules> </modules>
<artifactId>ruoyi-modules</artifactId> <artifactId>ruoyi-modules</artifactId>

View File

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-modules</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-client</artifactId>
<description>
客户模块
</description>
<dependencies>
<!-- 通用工具-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-core</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-doc</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-sms</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-mail</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-redis</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-idempotent</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-log</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-excel</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-security</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-web</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-ratelimiter</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-translation</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-sensitive</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-encrypt</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-tenant</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -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<TPlatformUserVo> 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<TPlatformUserVo> list = tPlatformUserService.queryList(bo);
ExcelUtil.exportExcel(list, "平台用户关联(微信/抖音小程序用户信息)", TPlatformUserVo.class, response);
}
/**
* 获取平台用户关联微信/抖音小程序用户信息详细信息
*
* @param id 主键
*/
@SaCheckPermission("client:platformUser:query")
@GetMapping("/{id}")
public R<TPlatformUserVo> 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<Void> 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<Void> 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<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(tPlatformUserService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -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<TUserVo> 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<TUserVo> list = tUserService.queryList(bo);
ExcelUtil.exportExcel(list, "客户用户基础信息", TUserVo.class, response);
}
/**
* 获取客户用户基础信息详细信息
*
* @param id 主键
*/
@SaCheckPermission("client:user:query")
@GetMapping("/{id}")
public R<TUserVo> 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<Void> 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<Void> 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<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(tUserService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<TPlatformUser, TPlatformUserVo> {
}

View File

@ -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<TUser, TUserVo> {
}

View File

@ -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<TPlatformUserVo> queryPageList(TPlatformUserBo bo, PageQuery pageQuery);
/**
* 查询符合条件的平台用户关联微信/抖音小程序用户信息列表
*
* @param bo 查询条件
* @return 平台用户关联微信/抖音小程序用户信息列表
*/
List<TPlatformUserVo> 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<Long> ids, Boolean isValid);
}

View File

@ -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<TUserVo> queryPageList(TUserBo bo, PageQuery pageQuery);
/**
* 查询符合条件的客户用户基础信息列表
*
* @param bo 查询条件
* @return 客户用户基础信息列表
*/
List<TUserVo> 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<Long> ids, Boolean isValid);
}

View File

@ -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<TPlatformUserVo> queryPageList(TPlatformUserBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<TPlatformUser> lqw = buildQueryWrapper(bo);
Page<TPlatformUserVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的平台用户关联微信/抖音小程序用户信息列表
*
* @param bo 查询条件
* @return 平台用户关联微信/抖音小程序用户信息列表
*/
@Override
public List<TPlatformUserVo> queryList(TPlatformUserBo bo) {
LambdaQueryWrapper<TPlatformUser> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<TPlatformUser> buildQueryWrapper(TPlatformUserBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<TPlatformUser> 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<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -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<TUserVo> queryPageList(TUserBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<TUser> lqw = buildQueryWrapper(bo);
Page<TUserVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的客户用户基础信息列表
*
* @param bo 查询条件
* @return 客户用户基础信息列表
*/
@Override
public List<TUserVo> queryList(TUserBo bo) {
LambdaQueryWrapper<TUser> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<TUser> buildQueryWrapper(TUserBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<TUser> 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<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -0,0 +1,6 @@
<?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="org.dromara.client.mapper.TPlatformUserMapper">
</mapper>

View File

@ -0,0 +1,6 @@
<?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="org.dromara.client.mapper.TUserMapper">
</mapper>

View File

@ -1,7 +1,7 @@
# 代码生成 # 代码生成
gen: gen:
# 作者 # 作者
author: Lion Li author: ZhouWenTao
# 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
packageName: org.dromara.system packageName: org.dromara.system
# 自动去除表前缀默认是false # 自动去除表前缀默认是false