调整用户接口

This commit is contained in:
2025-10-29 15:07:49 +08:00
parent 4ebe4f9ac6
commit 483abcfd83
109 changed files with 935 additions and 1539 deletions

View File

@@ -1,51 +0,0 @@
-- 会员用户表 (tz_member_user)
CREATE TABLE `tz_member_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`mobile` varchar(11) NOT NULL COMMENT '手机',
`password` varchar(128) NOT NULL COMMENT '加密后的密码',
`status` tinyint(4) NOT NULL COMMENT '帐号状态 (枚举 CommonStatusEnum)',
`register_ip` varchar(32) DEFAULT NULL COMMENT '注册 IP',
`register_terminal` tinyint(4) DEFAULT NULL COMMENT '注册终端 (枚举 TerminalEnum)',
`login_ip` varchar(32) DEFAULT NULL COMMENT '最后登录IP',
`login_date` datetime DEFAULT NULL COMMENT '最后登录时间',
`nickname` varchar(64) DEFAULT NULL COMMENT '用户昵称',
`avatar` varchar(512) DEFAULT NULL COMMENT '用户头像',
`name` varchar(64) DEFAULT NULL COMMENT '真实名字',
`sex` tinyint(4) DEFAULT NULL COMMENT '性别 (枚举 SexEnum)',
`birthday` datetime DEFAULT NULL COMMENT '出生日期',
`area_id` int(11) DEFAULT NULL COMMENT '所在地 (关联 Area.id 字段)',
`mark` varchar(512) DEFAULT NULL COMMENT '用户备注',
`point` int(11) DEFAULT NULL COMMENT '积分',
`tag_ids` varchar(512) DEFAULT NULL COMMENT '会员标签列表,以逗号分隔',
`level_id` bigint(20) DEFAULT NULL COMMENT '会员级别编号 (关联 MemberLevelDO.id 字段)',
`experience` int(11) DEFAULT NULL COMMENT '会员经验',
`group_id` bigint(20) DEFAULT NULL COMMENT '用户分组编号 (关联 MemberGroupDO.id 字段)',
`tenant_id` bigint(20) NOT NULL COMMENT '租户ID',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '最后更新时间',
`creator` varchar(64) NOT NULL COMMENT '创建者',
`updater` varchar(64) NOT NULL COMMENT '更新者',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_mobile` (`mobile`),
KEY `idx_level_id` (`level_id`),
KEY `idx_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员用户表';
-- 用户收件地址表 (tz_member_address)
CREATE TABLE `tz_member_address` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`user_id` bigint(20) NOT NULL COMMENT '用户编号',
`name` varchar(64) NOT NULL COMMENT '收件人名称',
`mobile` varchar(11) NOT NULL COMMENT '手机号',
`area_id` bigint(20) NOT NULL COMMENT '地区编号',
`detail_address` varchar(512) NOT NULL COMMENT '收件详细地址',
`default_status` tinyint(1) DEFAULT NULL COMMENT '是否默认 (true - 默认收件地址)',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '最后更新时间',
`creator` varchar(64) NOT NULL COMMENT '创建者',
`updater` varchar(64) NOT NULL COMMENT '更新者',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户收件地址表';

90
sql/mysql/user.sql Normal file
View File

@@ -0,0 +1,90 @@
-- 登录用户表 (tz_login_user) 后续拓展用户信息表
CREATE TABLE `tz_user_login`
(
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`mobile` varchar(11) NOT NULL COMMENT '手机',
`password` varchar(128) NOT NULL COMMENT '加密后的密码',
`status` tinyint(4) NOT NULL COMMENT '帐号状态 (枚举 CommonStatusEnum)',
`register_ip` varchar(32) DEFAULT NULL COMMENT '注册 IP',
`register_terminal` tinyint(4) DEFAULT NULL COMMENT '注册渠道 (枚举 TerminalEnum)',
`register_date` datetime DEFAULT NULL COMMENT '注册时间',
`login_ip` varchar(32) DEFAULT NULL COMMENT '最后登录IP',
`login_date` datetime DEFAULT NULL COMMENT '最后登录时间',
`login_terminal` varchar(32) DEFAULT NULL COMMENT '最后登录设备',
`nickname` varchar(64) DEFAULT NULL COMMENT '用户昵称',
`avatar` varchar(512) DEFAULT NULL COMMENT '用户头像',
`remark` varchar(512) DEFAULT NULL COMMENT '用户备注',
`tenant_id` bigint(20) NOT NULL COMMENT '租户ID',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '最后更新时间',
`creator` varchar(64) NOT NULL COMMENT '创建者',
`updater` varchar(64) NOT NULL COMMENT '更新者',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_mobile` (`mobile`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='登录用户表';
-- 会员信息表 (tz_user_member)
CREATE TABLE `tz_user_member`
(
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`name` varchar(64) DEFAULT NULL COMMENT '真实名字',
`sex` tinyint DEFAULT NULL COMMENT '性别 (枚举 SexEnum)',
`birthday` datetime DEFAULT NULL COMMENT '出生日期',
`area_id` int DEFAULT NULL COMMENT '所在地 (关联 Area.id 字段)',
`point` int DEFAULT NULL COMMENT '积分',
`tag_ids` varchar(512) DEFAULT NULL COMMENT '会员标签列表,以逗号分隔',
`level_id` bigint DEFAULT NULL COMMENT '会员级别编号 (关联 MemberLevelDO.id 字段)',
`experience` int DEFAULT NULL COMMENT '会员经验',
`group_id` bigint DEFAULT NULL COMMENT '用户分组编号 (关联 MemberGroupDO.id 字段)',
`tenant_id` bigint(20) NOT NULL COMMENT '租户ID',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '最后更新时间',
`creator` varchar(64) NOT NULL COMMENT '创建者',
`updater` varchar(64) NOT NULL COMMENT '更新者',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='会员信息表';
-- 会员地址表 (tz_user_member_address)
CREATE TABLE `tz_user_member_address`
(
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
`name` varchar(128) DEFAULT NULL COMMENT '收件人名称',
`mobile` varchar(11) DEFAULT NULL COMMENT '手机号',
`areaId` bigint(20) DEFAULT NULL COMMENT '地区编号',
`detailAddress` varchar(255) DEFAULT NULL COMMENT '收件详细地址',
`defaultStatus` int DEFAULT NULL COMMENT '是否默认',
`tenant_id` bigint(20) NOT NULL COMMENT '租户ID',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '最后更新时间',
`creator` varchar(64) NOT NULL COMMENT '创建者',
`updater` varchar(64) NOT NULL COMMENT '更新者',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='会员地址表';
-- 会员等级表 (tz_user_member_level)
CREATE TABLE `tz_user_member_level`
(
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`level_name` varchar(64) DEFAULT NULL COMMENT '等级名称',
`level` int DEFAULT NULL COMMENT '性别 (枚举 SexEnum)',
`experience` int DEFAULT NULL COMMENT '会员经验',
`discount_percent` int DEFAULT NULL COMMENT '享受折扣',
`icon` varchar(128) DEFAULT NULL COMMENT '等级图标',
`background_url` varchar(128) DEFAULT NULL COMMENT '等级背景图',
`status` int DEFAULT NULL COMMENT '状态',
`tenant_id` bigint(20) NOT NULL COMMENT '租户ID',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '最后更新时间',
`creator` varchar(64) NOT NULL COMMENT '创建者',
`updater` varchar(64) NOT NULL COMMENT '更新者',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='会员等级表';

View File

@@ -1,9 +1,7 @@
package com.tashow.cloud.productapi.api.product;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.productapi.api.product.dto.CategoryDO;
import com.tashow.cloud.productapi.api.product.dto.ProdDO;
import com.tashow.cloud.productapi.api.product.dto.ShopDetailDO;
import com.tashow.cloud.productapi.api.product.vo.prod.ProdListVO;
import com.tashow.cloud.productapi.api.product.vo.prod.ProdPageReqVO;
import com.tashow.cloud.productapi.api.product.vo.prod.ProdServiceVO;
@@ -12,8 +10,6 @@ import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@FeignClient(name = ApiConstants.NAME) // TODO 芋艿fallbackFactory =
/** RPC 服务 - 参数配置 */
public interface ProdApi {
@@ -26,7 +22,7 @@ public interface ProdApi {
* @return 编号
*/
@GetMapping(PREFIX + "/getProdInfo")
@GetMapping(PREFIX + "/getProdInfo1")
ProdDO getProdInfo(@RequestParam(value = "id", required = false) Long id);
/**

View File

@@ -18,7 +18,7 @@
<module>tashow-module-ai</module>
<module>tashow-module-pay</module>
<module>tashow-module-trade</module>
<module>tashow-module-member</module>
<module>tashow-module-user</module>
</modules>
</project>

View File

@@ -59,7 +59,6 @@ public class AiDialogServiceImpl extends ServiceImpl<AiDialogMapper, AiDialogDO>
"刚刚的音符太独特了,我没听清呢~可以再对我说一次吗?",
"哇,这是哪来的小可爱?声音太有魅力了,让我一时走了神。请靠近一点,慢慢再说一遍好?",
"背景音有点热闹我有点分心啦能在一个更安静的地方让我专心听听TA的声音吗",
"景音有点热闹我有点分心啦能在一个更安静的地方让我专心听听TA的声音吗",
"报告主人!声波受到不明干扰(可能是零食袋的声音?),翻译任务失败,请求二次输入!",
"我的‘物种雷达’刚才打了个盹儿~快让我再听一次这美妙的声音!",
"这声音太迷人了让我CPU过载了请简化一下环境音我们再来一次"

View File

@@ -1,4 +1,4 @@
-- 将该建表 SQL 语句,添加到 yudao-module-${table.moduleName}-biz 模块的 test/resources/sql/create_tables.sql 文件里
-- 将该建表 SQL 语句,添加到 yudao-module-${table.moduleName}-biz 模块的 test/resources/sql/create_tableslogin.sql 文件里
CREATE TABLE IF NOT EXISTS "${table.tableName.toLowerCase()}" (
#foreach ($column in $columns)
#if (${column.javaType} == 'Long')
@@ -33,5 +33,5 @@ CREATE TABLE IF NOT EXISTS "${table.tableName.toLowerCase()}" (
PRIMARY KEY ("${primaryColumn.columnName.toLowerCase()}")
) COMMENT '${table.tableComment}';
-- 将该删表 SQL 语句,添加到 yudao-module-${table.moduleName}-biz 模块的 test/resources/sql/clean.sql 文件里
-- 将该删表 SQL 语句,添加到 yudao-module-${table.moduleName}-biz 模块的 test/resources/sql/cleanlogin.sql 文件里
DELETE FROM "${table.tableName}";

View File

@@ -1,35 +0,0 @@
package com.tashow.cloud.member.address;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.memberapi.api.address.MemberAddressApi;
import com.tashow.cloud.memberapi.api.address.dto.MemberAddressRespDTO;
import com.tashow.cloud.member.convert.address.AddressConvert;
import com.tashow.cloud.member.service.address.AddressService;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;
import static com.tashow.cloud.common.pojo.CommonResult.success;
/**
* 用户收件地址 API 实现类
*/
@RestController // 提供 RESTful API 接口,给 Feign 调用
@Validated
public class MemberAddressApiImpl implements MemberAddressApi {
@Resource
private AddressService addressService;
@Override
public CommonResult<MemberAddressRespDTO> getAddress(Long id, Long userId) {
return success(AddressConvert.INSTANCE.convert02(addressService.getAddress(userId, id)));
}
@Override
public CommonResult<MemberAddressRespDTO> getDefaultAddress(Long userId) {
return success(AddressConvert.INSTANCE.convert02(addressService.getDefaultUserAddress(userId)));
}
}

View File

@@ -1,39 +0,0 @@
package com.tashow.cloud.member.controller.admin.address;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.member.controller.admin.address.vo.AddressRespVO;
import com.tashow.cloud.member.convert.address.AddressConvert;
import com.tashow.cloud.member.dal.dataobject.address.MemberAddressDO;
import com.tashow.cloud.member.service.address.AddressService;
import jakarta.annotation.Resource;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import static com.tashow.cloud.common.pojo.CommonResult.success;
// 管理后台 - 用户收件地址
@RestController
@RequestMapping("/member/address")
@Validated
public class AddressController {
@Resource
private AddressService addressService;
@GetMapping("/list")
// 获得用户收件地址列表
// userId: 用户编号,必填
@PreAuthorize("@ss.hasPermission('member:user:query')")
public CommonResult<List<AddressRespVO>> getAddressList(@RequestParam("userId") Long userId) {
List<MemberAddressDO> list = addressService.getAddressList(userId);
return success(AddressConvert.INSTANCE.convertList2(list));
}
}

View File

@@ -1 +0,0 @@
package com.tashow.cloud.member.controller.admin.address;

View File

@@ -1,36 +0,0 @@
package com.tashow.cloud.member.controller.admin.address.vo;
import lombok.*;
import java.time.LocalDateTime;
import java.util.*;
import jakarta.validation.constraints.*;
/**
* 用户收件地址 Base VO提供给添加、修改、详细的子 VO 使用
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
*/
@Data
public class AddressBaseVO {
// 收件人名称,必填,示例:张三
@NotNull(message = "收件人名称不能为空")
private String name;
// 手机号,必填
@NotNull(message = "手机号不能为空")
private String mobile;
// 地区编码必填示例15716
@NotNull(message = "地区编码不能为空")
private Long areaId;
// 收件详细地址,必填
@NotNull(message = "收件详细地址不能为空")
private String detailAddress;
// 是否默认必填示例2
@NotNull(message = "是否默认不能为空")
private Boolean defaultStatus;
}

View File

@@ -1,18 +0,0 @@
package com.tashow.cloud.member.controller.admin.address.vo;
import lombok.*;
import java.time.LocalDateTime;
// 管理后台 - 用户收件地址 Response VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class AddressRespVO extends AddressBaseVO {
// 收件地址编号必填示例7380
private Long id;
// 创建时间,必填
private LocalDateTime createTime;
}

View File

@@ -1,65 +0,0 @@
package com.tashow.cloud.member.controller.admin.user.vo;
import lombok.Data;
import org.hibernate.validator.constraints.URL;
import org.springframework.format.annotation.DateTimeFormat;
import jakarta.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.util.List;
import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
/**
* 会员用户 Base VO提供给添加、修改、详细的子 VO 使用
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
*/
@Data
public class MemberUserBaseVO {
// 手机号必填示例15601691300
@NotNull(message = "手机号不能为空")
private String mobile;
// 状态必填示例2
@NotNull(message = "状态不能为空")
private Byte status;
// 用户昵称,必填,示例:李四
@NotNull(message = "用户昵称不能为空")
private String nickname;
// 头像必填示例https://www.iocoder.cn/x.png
@URL(message = "头像必须是 URL 格式")
private String avatar;
// 用户昵称,示例:李四
private String name;
// 用户性别示例1
private Integer sex;
// 所在地编号示例4371
private Long areaId;
// 所在地全程,示例:上海上海市普陀区
private String areaName;
// 出生日期示例2023-03-12
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDateTime birthday;
// 会员备注,示例:我是小备注
private String mark;
// 会员标签,示例:[1, 2]
private List<Long> tagIds;
// 会员等级编号示例1
private Long levelId;
// 用户分组编号示例1
private Long groupId;
}

View File

@@ -1,48 +0,0 @@
package com.tashow.cloud.member.controller.admin.user.vo;
import com.tashow.cloud.common.pojo.PageParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.List;
import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
// 管理后台 - 会员用户分页 Request VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MemberUserPageReqVO extends PageParam {
// 手机号示例15601691300
private String mobile;
// 用户昵称,示例:李四
private String nickname;
// 最后登录时间
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] loginDate;
// 创建时间
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
// 会员标签编号列表,示例:[1, 2]
private List<Long> tagIds;
// 会员等级编号示例1
private Long levelId;
// 用户分组编号示例1
private Long groupId;
// TODO 芋艿:注册用户类型;
// TODO 芋艿:登录用户类型;
}

View File

@@ -1,51 +0,0 @@
package com.tashow.cloud.member.controller.admin.user.vo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.time.LocalDateTime;
import java.util.List;
// 管理后台 - 会员用户 Response VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MemberUserRespVO extends MemberUserBaseVO {
// 编号必填示例23788
private Long id;
// 注册 IP必填示例127.0.0.1
private String registerIp;
// 最后登录IP必填示例127.0.0.1
private String loginIp;
// 最后登录时间,必填
private LocalDateTime loginDate;
// 创建时间,必填
private LocalDateTime createTime;
// ========== 其它信息 ==========
// 积分必填示例100
private Integer point;
// 总积分必填示例2000
private Integer totalPoint;
// 会员标签,示例:[红色, 快乐]
private List<String> tagNames;
// 会员等级,示例:黄金会员
private String levelName;
// 用户分组,示例:购物达人
private String groupName;
// 用户经验值必填示例200
private Integer experience;
}

View File

@@ -1,54 +0,0 @@
### 请求 /create 接口 => 成功
POST {{appApi}}//member/address/create
Content-Type: application/json
tenant-id: {{appTenantId}}
Authorization: Bearer {{appToken}}
{
"name": "yunai",
"mobile": "15601691300",
"areaId": "610632",
"postCode": "200000",
"detailAddress": "芋道源码 233 号 666 室",
"defaulted": true
}
### 请求 /update 接口 => 成功
PUT {{appApi}}//member/address/update
Content-Type: application/json
tenant-id: {{appTenantId}}
Authorization: Bearer {{appToken}}
{
"id": "1",
"name": "yunai888",
"mobile": "15601691300",
"areaId": "610632",
"postCode": "200000",
"detailAddress": "芋道源码 233 号 666 室",
"defaulted": false
}
### 请求 /delete 接口 => 成功
DELETE {{appApi}}//member/address/delete?id=2
Content-Type: application/json
tenant-id: {{appTenantId}}
Authorization: Bearer {{appToken}}
### 请求 /get 接口 => 成功
GET {{appApi}}//member/address/get?id=1
Content-Type: application/json
tenant-id: {{appTenantId}}
Authorization: Bearer {{appToken}}
### 请求 /get-default 接口 => 成功
GET {{appApi}}//member/address/get-default
Content-Type: application/json
tenant-id: {{appTenantId}}
Authorization: Bearer {{appToken}}
### 请求 /list 接口 => 成功
GET {{appApi}}//member/address/list
Content-Type: application/json
tenant-id: {{appTenantId}}
Authorization: Bearer {{appToken}}

View File

@@ -1,95 +0,0 @@
package com.tashow.cloud.member.controller.app.address;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.member.controller.app.address.vo.AppAddressCreateReqVO;
import com.tashow.cloud.member.controller.app.address.vo.AppAddressRespVO;
import com.tashow.cloud.member.controller.app.address.vo.AppAddressUpdateReqVO;
import com.tashow.cloud.member.convert.address.AddressConvert;
import com.tashow.cloud.member.dal.dataobject.address.MemberAddressDO;
import com.tashow.cloud.member.service.address.AddressService;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import static com.tashow.cloud.common.pojo.CommonResult.success;
import static com.tashow.cloud.security.security.core.util.SecurityFrameworkUtils.getLoginUserId;
/**
* 用户 APP - 用户收件地址
*/
@RestController
@RequestMapping("/member/address")
@Validated
public class AppAddressController {
@Resource
private AddressService addressService;
/**
* 创建用户收件地址
* @param createReqVO
* @return
*/
@PostMapping("/create")
public CommonResult<Long> createAddress(@Valid @RequestBody AppAddressCreateReqVO createReqVO) {
return success(addressService.createAddress(getLoginUserId(), createReqVO));
}
/**
* 更新用户收件地址
* @param updateReqVO
* @return
*/
@PutMapping("/update")
public CommonResult<Boolean> updateAddress(@Valid @RequestBody AppAddressUpdateReqVO updateReqVO) {
addressService.updateAddress(getLoginUserId(), updateReqVO);
return success(true);
}
/**
* 删除用户收件地址
* @param id 编号
* @return
*/
@DeleteMapping("/delete")
public CommonResult<Boolean> deleteAddress(@RequestParam("id") Long id) {
addressService.deleteAddress(getLoginUserId(), id);
return success(true);
}
/**
* 获得用户收件地址
* @param id 编号
* @return
*/
@GetMapping("/get")
public CommonResult<AppAddressRespVO> getAddress(@RequestParam("id") Long id) {
MemberAddressDO address = addressService.getAddress(getLoginUserId(), id);
return success(AddressConvert.INSTANCE.convert(address));
}
/**
* 获得默认的用户收件地址
* @return
*/
@GetMapping("/get-default")
public CommonResult<AppAddressRespVO> getDefaultUserAddress() {
MemberAddressDO address = addressService.getDefaultUserAddress(getLoginUserId());
return success(AddressConvert.INSTANCE.convert(address));
}
/**
* 获得用户收件地址列表
* @return
*/
@GetMapping("/list")
public CommonResult<List<AppAddressRespVO>> getAddressList() {
List<MemberAddressDO> list = addressService.getAddressList(getLoginUserId());
return success(AddressConvert.INSTANCE.convertList(list));
}
}

View File

@@ -1,32 +0,0 @@
package com.tashow.cloud.member.controller.app.address.vo;
import lombok.Data;
import jakarta.validation.constraints.NotNull;
/**
* 用户收件地址 Base VO提供给添加、修改、详细的子 VO 使用
*/
@Data
public class AppAddressBaseVO {
//收件人名称
@NotNull(message = "收件人名称不能为空")
private String name;
//手机号
@NotNull(message = "手机号不能为空")
private String mobile;
//地区编号
@NotNull(message = "地区编号不能为空")
private Long areaId;
//收件详细地址
@NotNull(message = "收件详细地址不能为空")
private String detailAddress;
//是否默认地址
@NotNull(message = "是否默认地址不能为空")
private Boolean defaultStatus;
}

View File

@@ -1,15 +0,0 @@
package com.tashow.cloud.member.controller.app.address.vo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
/**
* 用户 APP - 用户收件地址创建 Request VO
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class AppAddressCreateReqVO extends AppAddressBaseVO {
}

View File

@@ -1,21 +0,0 @@
package com.tashow.cloud.member.controller.app.address.vo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
/**
* 用户 APP - 用户收件地址 Response VO
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class AppAddressRespVO extends AppAddressBaseVO {
//编号
private Long id;
//地区名字
private String areaName;
}

View File

@@ -1,20 +0,0 @@
package com.tashow.cloud.member.controller.app.address.vo;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
/**
* 用户 APP - 用户收件地址更新 Request VO
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class AppAddressUpdateReqVO extends AppAddressBaseVO {
//编号
@NotNull(message = "编号不能为空")
private Long id;
}

View File

@@ -1,45 +0,0 @@
package com.tashow.cloud.member.convert.address;
import com.tashow.cloud.common.util.ip.AreaUtils;
import com.tashow.cloud.memberapi.api.address.dto.MemberAddressRespDTO;
import com.tashow.cloud.member.controller.admin.address.vo.AddressRespVO;
import com.tashow.cloud.member.controller.app.address.vo.AppAddressCreateReqVO;
import com.tashow.cloud.member.controller.app.address.vo.AppAddressRespVO;
import com.tashow.cloud.member.controller.app.address.vo.AppAddressUpdateReqVO;
import com.tashow.cloud.member.dal.dataobject.address.MemberAddressDO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* 用户收件地址 Convert
*
* @author 芋道源码
*/
@Mapper
public interface AddressConvert {
AddressConvert INSTANCE = Mappers.getMapper(AddressConvert.class);
MemberAddressDO convert(AppAddressCreateReqVO bean);
MemberAddressDO convert(AppAddressUpdateReqVO bean);
@Mapping(source = "areaId", target = "areaName", qualifiedByName = "convertAreaIdToAreaName")
AppAddressRespVO convert(MemberAddressDO bean);
List<AppAddressRespVO> convertList(List<MemberAddressDO> list);
MemberAddressRespDTO convert02(MemberAddressDO bean);
@Named("convertAreaIdToAreaName")
default String convertAreaIdToAreaName(Integer areaId) {
return AreaUtils.format(areaId);
}
List<AddressRespVO> convertList2(List<MemberAddressDO> list);
}

View File

@@ -1,41 +0,0 @@
package com.tashow.cloud.member.convert.user;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.memberapi.api.user.dto.MemberUserRespDTO;
import com.tashow.cloud.member.controller.admin.user.vo.MemberUserRespVO;
import com.tashow.cloud.member.controller.admin.user.vo.MemberUserUpdateReqVO;
import com.tashow.cloud.member.controller.app.user.vo.AppMemberUserInfoRespVO;
import com.tashow.cloud.member.convert.address.AddressConvert;
import com.tashow.cloud.member.dal.dataobject.user.MemberUserDO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper(uses = {AddressConvert.class})
public interface MemberUserConvert {
MemberUserConvert INSTANCE = Mappers.getMapper(MemberUserConvert.class);
AppMemberUserInfoRespVO convert(MemberUserDO bean);
@Mappings({
@Mapping(source = "bean.id", target = "id"),
})
MemberUserRespDTO convert2(MemberUserDO bean);
List<MemberUserRespDTO> convertList2(List<MemberUserDO> list);
MemberUserDO convert(MemberUserUpdateReqVO bean);
PageResult<MemberUserRespVO> convertPage(PageResult<MemberUserDO> page);
@Mapping(source = "areaId", target = "areaName", qualifiedByName = "convertAreaIdToAreaName")
MemberUserRespVO convert03(MemberUserDO bean);
}

View File

@@ -1,139 +0,0 @@
package com.tashow.cloud.member.dal.dataobject.user;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.tashow.cloud.common.enums.CommonStatusEnum;
import com.tashow.cloud.common.enums.TerminalEnum;
import com.tashow.cloud.mybatis.mybatis.core.type.LongListTypeHandler;
import com.tashow.cloud.systemapi.enums.common.SexEnum;
import com.tashow.cloud.tenant.core.db.TenantBaseDO;
import lombok.*;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import java.time.LocalDateTime;
import java.util.List;
/**
* 会员用户 DO
*
* uk_mobile 索引:基于 {@link #mobile} 字段
*
*/
@TableName(value = "member_user", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MemberUserDO extends TenantBaseDO {
// ========== 账号信息 ==========
/**
* 用户ID
*/
@TableId
private Long id;
/**
* 手机
*/
private String mobile;
/**
* 加密后的密码
*
* 因为目前使用 {@link BCryptPasswordEncoder} 加密器,所以无需自己处理 salt 盐
*/
private String password;
/**
* 帐号状态
*
* 枚举 {@link CommonStatusEnum}
*/
private Integer status;
/**
* 注册 IP
*/
private String registerIp;
/**
* 注册终端
* 枚举 {@link TerminalEnum}
*/
private Integer registerTerminal;
/**
* 最后登录IP
*/
private String loginIp;
/**
* 最后登录时间
*/
private LocalDateTime loginDate;
// ========== 基础信息 ==========
/**
* 用户昵称
*/
private String nickname;
/**
* 用户头像
*/
private String avatar;
/**
* 真实名字
*/
private String name;
/**
* 性别
*
* 枚举 {@link SexEnum}
*/
private Integer sex;
/**
* 出生日期
*/
private LocalDateTime birthday;
/**
* 所在地
*
* 关联 {@link Area#getId()} 字段
*/
private Integer areaId;
/**
* 用户备注
*/
private String mark;
// ========== 其它信息 ==========
/**
* 积分
*/
private Integer point;
// TODO 疯狂:增加一个 totalPoint个人信息接口要返回
/**
* 会员标签列表,以逗号分隔
*/
@TableField(typeHandler = LongListTypeHandler.class)
private List<Long> tagIds;
/**
* 会员级别编号
*
* 关联 {@link MemberLevelDO#getId()} 字段
*/
private Long levelId;
/**
* 会员经验
*/
private Integer experience;
/**
* 用户分组编号
*
* 关联 {@link MemberGroupDO#getId()} 字段
*/
private Long groupId;
}

View File

@@ -1,22 +0,0 @@
package com.tashow.cloud.member.dal.mysql.address;
import com.tashow.cloud.member.dal.dataobject.address.MemberAddressDO;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import com.tashow.cloud.mybatis.mybatis.core.query.LambdaQueryWrapperX;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface MemberAddressMapper extends BaseMapperX<MemberAddressDO> {
default MemberAddressDO selectByIdAndUserId(Long id, Long userId) {
return selectOne(MemberAddressDO::getId, id, MemberAddressDO::getUserId, userId);
}
default List<MemberAddressDO> selectListByUserIdAndDefaulted(Long userId, Boolean defaulted) {
return selectList(new LambdaQueryWrapperX<MemberAddressDO>().eq(MemberAddressDO::getUserId, userId)
.eqIfPresent(MemberAddressDO::getDefaultStatus, defaulted));
}
}

View File

@@ -1,96 +0,0 @@
package com.tashow.cloud.member.dal.mysql.user;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.member.controller.admin.user.vo.MemberUserPageReqVO;
import com.tashow.cloud.member.dal.dataobject.user.MemberUserDO;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import com.tashow.cloud.mybatis.mybatis.core.query.LambdaQueryWrapperX;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.stream.Collectors;
/**
* 会员 User Mapper
*
* @author 芋道源码
*/
@Mapper
public interface MemberUserMapper extends BaseMapperX<MemberUserDO> {
default MemberUserDO selectByMobile(String mobile) {
return selectOne(MemberUserDO::getMobile, mobile);
}
default List<MemberUserDO> selectListByNicknameLike(String nickname) {
return selectList(new LambdaQueryWrapperX<MemberUserDO>()
.likeIfPresent(MemberUserDO::getNickname, nickname));
}
default PageResult<MemberUserDO> selectPage(MemberUserPageReqVO reqVO) {
// 处理 tagIds 过滤条件
String tagIdSql = "";
if (CollUtil.isNotEmpty(reqVO.getTagIds())) {
tagIdSql = reqVO.getTagIds().stream()
.map(tagId -> "FIND_IN_SET(" + tagId + ", tag_ids)")
.collect(Collectors.joining(" OR "));
}
// 分页查询
return selectPage(reqVO, new LambdaQueryWrapperX<MemberUserDO>()
.likeIfPresent(MemberUserDO::getMobile, reqVO.getMobile())
.betweenIfPresent(MemberUserDO::getLoginDate, reqVO.getLoginDate())
.likeIfPresent(MemberUserDO::getNickname, reqVO.getNickname())
.betweenIfPresent(MemberUserDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(MemberUserDO::getLevelId, reqVO.getLevelId())
.eqIfPresent(MemberUserDO::getGroupId, reqVO.getGroupId())
.apply(StrUtil.isNotEmpty(tagIdSql), tagIdSql)
.orderByDesc(MemberUserDO::getId));
}
default Long selectCountByGroupId(Long groupId) {
return selectCount(MemberUserDO::getGroupId, groupId);
}
default Long selectCountByLevelId(Long levelId) {
return selectCount(MemberUserDO::getLevelId, levelId);
}
default Long selectCountByTagId(Long tagId) {
return selectCount(new LambdaQueryWrapperX<MemberUserDO>()
.apply("FIND_IN_SET({0}, tag_ids)", tagId));
}
/**
* 更新用户积分(增加)
*
* @param id 用户编号
* @param incrCount 增加积分(正数)
*/
default void updatePointIncr(Long id, Integer incrCount) {
Assert.isTrue(incrCount > 0);
LambdaUpdateWrapper<MemberUserDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<MemberUserDO>()
.setSql(" point = point + " + incrCount)
.eq(MemberUserDO::getId, id);
update(null, lambdaUpdateWrapper);
}
/**
* 更新用户积分(减少)
*
* @param id 用户编号
* @param incrCount 增加积分(负数)
* @return 更新行数
*/
default int updatePointDecr(Long id, Integer incrCount) {
Assert.isTrue(incrCount < 0);
LambdaUpdateWrapper<MemberUserDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<MemberUserDO>()
.setSql(" point = point + " + incrCount) // 负数,所以使用 + 号
.eq(MemberUserDO::getId, id);
return update(null, lambdaUpdateWrapper);
}
}

View File

@@ -1,4 +0,0 @@
/**
* 占位
*/
package com.tashow.cloud.member.framework.rpc;

View File

@@ -1,4 +0,0 @@
/**
* 占位
*/
package com.tashow.cloud.member.framework.security.core;

View File

@@ -1,4 +0,0 @@
/**
* 消息队列的消费者
*/
package com.tashow.cloud.member.mq.consumer;

View File

@@ -1,4 +0,0 @@
/**
* 消息队列的消息
*/
package com.tashow.cloud.member.mq.message;

View File

@@ -1,4 +0,0 @@
/**
* 消息队列的生产者
*/
package com.tashow.cloud.member.mq.producer;

View File

@@ -1,31 +0,0 @@
package com.tashow.cloud.member.mq.producer.user;
import com.tashow.cloud.memberapi.message.user.MemberUserCreateMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import jakarta.annotation.Resource;
/**
* 会员用户 Producer
*
* @author owen
*/
@Slf4j
@Component
public class MemberUserProducer {
@Resource
private ApplicationContext applicationContext;
/**
* 发送 {@link MemberUserCreateMessage} 消息
*
* @param userId 用户编号
*/
public void sendUserCreateMessage(Long userId) {
applicationContext.publishEvent(new MemberUserCreateMessage().setUserId(userId));
}
}

View File

@@ -1,8 +0,0 @@
/**
* member 模块,我们放会员业务。
* 例如说:会员中心等等
*
* 1. Controller URL以 /member/ 开头,避免和其它 Module 冲突
* 2. DataObject 表名:以 member_ 开头,方便在数据库中区分
*/
package com.tashow.cloud.member;

View File

@@ -1,67 +0,0 @@
package com.tashow.cloud.member.service.address;
import com.tashow.cloud.member.controller.app.address.vo.AppAddressCreateReqVO;
import com.tashow.cloud.member.controller.app.address.vo.AppAddressUpdateReqVO;
import com.tashow.cloud.member.dal.dataobject.address.MemberAddressDO;
import jakarta.validation.Valid;
import java.util.List;
/**
* 用户收件地址 Service 接口
*
* @author 芋道源码
*/
public interface AddressService {
/**
* 创建用户收件地址
*
*
* @param userId 用户编号
* @param createReqVO 创建信息
* @return 编号
*/
Long createAddress(Long userId, @Valid AppAddressCreateReqVO createReqVO);
/**
* 更新用户收件地址
*
* @param userId 用户编号
* @param updateReqVO 更新信息
*/
void updateAddress(Long userId, @Valid AppAddressUpdateReqVO updateReqVO);
/**
* 删除用户收件地址
*
* @param userId 用户编号
* @param id 编号
*/
void deleteAddress(Long userId, Long id);
/**
* 获得用户收件地址
*
* @param id 编号
* @return 用户收件地址
*/
MemberAddressDO getAddress(Long userId, Long id);
/**
* 获得用户收件地址列表
*
* @param userId 用户编号
* @return 用户收件地址列表
*/
List<MemberAddressDO> getAddressList(Long userId);
/**
* 获得用户默认的收件地址
*
* @param userId 用户编号
* @return 用户收件地址
*/
MemberAddressDO getDefaultUserAddress(Long userId);
}

View File

@@ -1,97 +0,0 @@
package com.tashow.cloud.member.service.address;
import cn.hutool.core.collection.CollUtil;
import com.tashow.cloud.member.controller.app.address.vo.AppAddressCreateReqVO;
import com.tashow.cloud.member.controller.app.address.vo.AppAddressUpdateReqVO;
import com.tashow.cloud.member.convert.address.AddressConvert;
import com.tashow.cloud.member.dal.dataobject.address.MemberAddressDO;
import com.tashow.cloud.member.dal.mysql.address.MemberAddressMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import jakarta.annotation.Resource;
import java.util.List;
import static com.tashow.cloud.common.exception.util.ServiceExceptionUtil.exception;
import static com.tashow.cloud.memberapi.enums.ErrorCodeConstants.ADDRESS_NOT_EXISTS;
/**
* 用户收件地址 Service 实现类
*
* @author 芋道源码
*/
@Service
@Validated
public class AddressServiceImpl implements AddressService {
@Resource
private MemberAddressMapper memberAddressMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createAddress(Long userId, AppAddressCreateReqVO createReqVO) {
// 如果添加的是默认收件地址,则将原默认地址修改为非默认
if (Boolean.TRUE.equals(createReqVO.getDefaultStatus())) {
List<MemberAddressDO> addresses = memberAddressMapper.selectListByUserIdAndDefaulted(userId, true);
addresses.forEach(address -> memberAddressMapper.updateById(new MemberAddressDO().setId(address.getId()).setDefaultStatus(false)));
}
// 插入
MemberAddressDO address = AddressConvert.INSTANCE.convert(createReqVO);
address.setUserId(userId);
memberAddressMapper.insert(address);
// 返回
return address.getId();
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateAddress(Long userId, AppAddressUpdateReqVO updateReqVO) {
// 校验存在,校验是否能够操作
validAddressExists(userId, updateReqVO.getId());
// 如果修改的是默认收件地址,则将原默认地址修改为非默认
if (Boolean.TRUE.equals(updateReqVO.getDefaultStatus())) {
List<MemberAddressDO> addresses = memberAddressMapper.selectListByUserIdAndDefaulted(userId, true);
addresses.stream().filter(u -> !u.getId().equals(updateReqVO.getId())) // 排除自己
.forEach(address -> memberAddressMapper.updateById(new MemberAddressDO().setId(address.getId()).setDefaultStatus(false)));
}
// 更新
MemberAddressDO updateObj = AddressConvert.INSTANCE.convert(updateReqVO);
memberAddressMapper.updateById(updateObj);
}
@Override
public void deleteAddress(Long userId, Long id) {
// 校验存在,校验是否能够操作
validAddressExists(userId, id);
// 删除
memberAddressMapper.deleteById(id);
}
private void validAddressExists(Long userId, Long id) {
MemberAddressDO addressDO = getAddress(userId, id);
if (addressDO == null) {
throw exception(ADDRESS_NOT_EXISTS);
}
}
@Override
public MemberAddressDO getAddress(Long userId, Long id) {
return memberAddressMapper.selectByIdAndUserId(id, userId);
}
@Override
public List<MemberAddressDO> getAddressList(Long userId) {
return memberAddressMapper.selectListByUserIdAndDefaulted(userId, null);
}
@Override
public MemberAddressDO getDefaultUserAddress(Long userId) {
List<MemberAddressDO> addresses = memberAddressMapper.selectListByUserIdAndDefaulted(userId, true);
return CollUtil.getFirst(addresses);
}
}

View File

@@ -1,48 +0,0 @@
spring:
main:
lazy-initialization: true # 开启懒加载,加快速度
banner-mode: off # 单元测试,禁用 Banner
--- #################### 数据库相关配置 ####################
spring:
# 数据源配置项
datasource:
name: ruoyi-vue-pro
url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value; # MODE 使用 MySQL 模式DATABASE_TO_UPPER 配置表和字段使用小写
driver-class-name: org.h2.Driver
username: sa
password:
druid:
async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度
initial-size: 1 # 单元测试,配置为 1提升启动速度
sql:
init:
schema-locations: classpath:/sql/create_tables.sql
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
data:
redis:
host: 127.0.0.1 # 地址
port: 16379 # 端口(单元测试,使用 16379 端口)
database: 0 # 数据库索引
mybatis:
lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试
--- #################### 定时任务相关配置 ####################
--- #################### 配置中心相关配置 ####################
--- #################### 服务保障相关配置 ####################
# Lock4j 配置项(单元测试,禁用 Lock4j
--- #################### 监控相关配置 ####################
--- #################### 芋道相关配置 ####################
# 芋道配置项,设置当前项目所有自定义的配置
yudao:
info:
base-package: cn.iocoder.yudao.module

View File

@@ -1,4 +0,0 @@
<configuration>
<!-- 引用 Spring Boot 的 logback 基础配置 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
</configuration>

View File

@@ -1,5 +0,0 @@
DELETE FROM "member_user";
DELETE FROM "member_address";
DELETE FROM "member_tag";
DELETE FROM "member_level";
DELETE FROM "member_group";

View File

@@ -1,113 +0,0 @@
CREATE TABLE IF NOT EXISTS "member_user"
(
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '编号',
"nickname" varchar(30) NOT NULL DEFAULT '' COMMENT '用户昵称',
"name" varchar(30) NULL COMMENT '真实名字',
sex tinyint null comment '性别',
birthday datetime null comment '出生日期',
area_id int null comment '所在地',
mark varchar(255) null comment '用户备注',
point int default 0 null comment '积分',
"avatar" varchar(255) NOT NULL DEFAULT '' COMMENT '头像',
"status" tinyint NOT NULL COMMENT '状态',
"mobile" varchar(11) NOT NULL COMMENT '手机号',
"password" varchar(100) NOT NULL DEFAULT '' COMMENT '密码',
"register_ip" varchar(32) NOT NULL COMMENT '注册 IP',
"login_ip" varchar(50) NULL DEFAULT '' COMMENT '最后登录IP',
"login_date" datetime NULL DEFAULT NULL COMMENT '最后登录时间',
"tag_ids" varchar(255) NULL DEFAULT NULL COMMENT '用户标签编号列表,以逗号分隔',
"level_id" bigint NULL DEFAULT NULL COMMENT '等级编号',
"experience" bigint NULL DEFAULT NULL COMMENT '经验',
"group_id" bigint NULL DEFAULT NULL COMMENT '用户分组编号',
"creator" varchar(64) NULL DEFAULT '' COMMENT '创建者',
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
"updater" varchar(64) NULL DEFAULT '' COMMENT '更新者',
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
"deleted" bit(1) NOT NULL DEFAULT '0' COMMENT '是否删除',
"tenant_id" bigint not null default '0',
PRIMARY KEY ("id")
) COMMENT '会员表';
CREATE TABLE IF NOT EXISTS "member_address" (
"id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"user_id" bigint(20) NOT NULL,
"name" varchar(10) NOT NULL,
"mobile" varchar(20) NOT NULL,
"area_id" bigint(20) NOT NULL,
"detail_address" varchar(250) NOT NULL,
"default_status" bit NOT NULL,
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
"creator" varchar(64) DEFAULT '',
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
"deleted" bit NOT NULL DEFAULT FALSE,
"updater" varchar(64) DEFAULT '',
PRIMARY KEY ("id")
) COMMENT '用户收件地址';
CREATE TABLE IF NOT EXISTS "member_tag"
(
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"name" varchar NOT NULL,
"creator" varchar DEFAULT '',
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updater" varchar DEFAULT '',
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
"deleted" bit NOT NULL DEFAULT FALSE,
"tenant_id" bigint NOT NULL default '0',
PRIMARY KEY ("id")
) COMMENT '会员标签';
CREATE TABLE IF NOT EXISTS "member_level"
(
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"name" varchar NOT NULL,
"experience" int NOT NULL,
"level" int NOT NULL,
"discount_percent" int NOT NULL,
"icon" varchar NOT NULL,
"background_url" varchar NOT NULL,
"creator" varchar DEFAULT '',
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updater" varchar DEFAULT '',
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
"deleted" bit NOT NULL DEFAULT FALSE,
"tenant_id" bigint not null default '0',
"status" tinyint NOT NULL DEFAULT '0',
PRIMARY KEY ("id")
) COMMENT '会员等级';
CREATE TABLE IF NOT EXISTS "member_group"
(
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"name" varchar NOT NULL,
"remark" varchar NOT NULL,
"status" tinyint NOT NULL DEFAULT '0',
"creator" varchar DEFAULT '',
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updater" varchar DEFAULT '',
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
"deleted" bit NOT NULL DEFAULT FALSE,
"tenant_id" bigint not null default '0',
PRIMARY KEY ("id")
) COMMENT '用户分组';
CREATE TABLE IF NOT EXISTS "member_brokerage_record"
(
"id" int NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"user_id" bigint NOT NULL,
"biz_id" varchar NOT NULL,
"biz_type" varchar NOT NULL,
"title" varchar NOT NULL,
"price" int NOT NULL,
"total_price" int NOT NULL,
"description" varchar NOT NULL,
"status" varchar NOT NULL,
"frozen_days" int NOT NULL,
"unfreeze_time" varchar,
"creator" varchar DEFAULT '',
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updater" varchar DEFAULT '',
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
"deleted" bit NOT NULL DEFAULT FALSE,
"tenant_id" bigint not null default '0',
PRIMARY KEY ("id")
) COMMENT '佣金记录';

View File

@@ -3,12 +3,9 @@ package com.tashow.cloud.product.controller.admin;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.product.mapper.ProdMapper;
import com.tashow.cloud.productapi.api.product.dto.ProdDO;
import com.tashow.cloud.product.service.ProdService;
import com.tashow.cloud.productapi.api.product.dto.SkuDO;
import com.tashow.cloud.productapi.api.product.dto.ProdDO;
import com.tashow.cloud.productapi.api.product.vo.prod.*;
import com.tashow.cloud.productapi.api.product.vo.sku.SkuPageReqVO;
import com.tashow.cloud.productapi.api.product.vo.sku.SkuRecycleBinVO;
import com.tashow.cloud.productapi.enums.BaseEnum;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -124,6 +121,7 @@ public class ProdController {
@GetMapping("/getProdInfo")
@Operation(summary = "获得商品详情a")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PermitAll
public CommonResult<ProdDO> getProdInfo(@RequestParam("id") Long id) {
ProdDO prod = prodService.getProd(id);
return success(prod);

View File

@@ -159,7 +159,7 @@ public class TradeOrderController {
@GetMapping("/fastPhoto")
@PermitAll
// @PreAuthorize("@ss.hasPermission('trade:order:query')")
public CommonResult<TradeOrderFastPhotoRespVo> fastPhoto(TradeOrderFastPhotoReqVo reqVo) {
public CommonResult<TradeOrderFastPhotoRespVo> fastPhoto(@Valid TradeOrderFastPhotoReqVo reqVo) {
//获取交易订单详情
TradeOrderItemDO orderItem = tradeOrderQueryService.getOrderItem(reqVo.getItemId());
//获取产品详情
@@ -175,10 +175,10 @@ public class TradeOrderController {
@GetMapping("/subTimeLog/{id}")
@PermitAll
// @PreAuthorize("@ss.hasPermission('trade:order:query')")
public CommonResult<TradeOrderSubTimeListRespVo> subTimeLog(@PathVariable("id") Long id) {
public CommonResult<List<TradeOrderSubLogDO>> subTimeLog(@PathVariable("id") Long id) {
//获取订单预约时间修改列表
List<TradeOrderSubLogDO> subLogDO = tradeOrderQueryService.getSubTimeLogList(id);
return success(TradeOrderConvert.INSTANCE.convertToSubTimeList(subLogDO));
return success(subLogDO);
}
}

View File

@@ -1,12 +1,15 @@
package com.tashow.cloud.trade.controller.admin.order.vo;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Data
public class TradeOrderFastPhotoReqVo {
//订单项id
@NotNull(message = "订单详情编号不能为空")
private Long itemId;
//产品id
@NotNull(message = "产品编号不能为空")
private Long spuId;
}

View File

@@ -1,9 +1,11 @@
package com.tashow.cloud.trade.controller.admin.order.vo;
import com.tashow.cloud.trade.dal.dataobject.order.TradeOrderSubLogDO;
import lombok.Data;
import java.util.List;
@Data
public class TradeOrderSubTimeListRespVo {
private List<TradeOrderSubLogDO> subTimeList;

View File

@@ -14,6 +14,7 @@ import com.tashow.cloud.memberapi.api.user.dto.MemberUserRespDTO;
import com.tashow.cloud.payapi.api.order.dto.PayOrderCreateReqDTO;
import com.tashow.cloud.payapi.enums.DictTypeConstants;
import com.tashow.cloud.productapi.api.product.dto.ProdDO;
import com.tashow.cloud.productapi.api.product.vo.prod.ProdRespVO;
import com.tashow.cloud.trade.controller.admin.base.member.user.MemberUserRespVO;
import com.tashow.cloud.trade.controller.admin.order.vo.*;
import com.tashow.cloud.trade.controller.app.order.vo.*;
@@ -26,7 +27,6 @@ import com.tashow.cloud.trade.dal.dataobject.delivery.DeliveryExpressDO;
import com.tashow.cloud.trade.dal.dataobject.order.TradeOrderDO;
import com.tashow.cloud.trade.dal.dataobject.order.TradeOrderItemDO;
import com.tashow.cloud.trade.dal.dataobject.order.TradeOrderLogDO;
import com.tashow.cloud.trade.dal.dataobject.order.TradeOrderSubLogDO;
import com.tashow.cloud.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;
import com.tashow.cloud.trade.framework.order.config.TradeOrderProperties;
import com.tashow.cloud.trade.service.brokerage.bo.BrokerageAddReqBO;
@@ -120,10 +120,6 @@ public interface TradeOrderConvert {
TradeOrderFastPhotoRespVo convert(TradeOrderItemDO itemDO, ProdDO prodDO);
//endregion
//region 订单预约时间修改列表
TradeOrderSubTimeListRespVo convertToSubTimeList(List<TradeOrderSubLogDO> subTimeList);
//endregion
@Mappings({
@Mapping(target = "id", ignore = true),

View File

@@ -8,7 +8,7 @@
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>tashow-module-member</artifactId>
<artifactId>tashow-module-user</artifactId>
<packaging>jar</packaging>
<name>${project.artifactId}</name>

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member;
package com.tashow.cloud.user;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -7,10 +7,10 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
* 项目的启动类
*/
@SpringBootApplication
public class MemberServerApplication {
public class UserServerApplication {
public static void main(String[] args) {
SpringApplication.run(MemberServerApplication.class, args);
SpringApplication.run(UserServerApplication.class, args);
}
}

View File

@@ -0,0 +1 @@
package com.tashow.cloud.user.controller.admin;

View File

@@ -1,25 +1,20 @@
package com.tashow.cloud.member.controller.admin.user;
package com.tashow.cloud.user.controller.admin.user;
import cn.hutool.core.collection.CollUtil;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.member.controller.admin.user.vo.MemberUserPageReqVO;
import com.tashow.cloud.member.controller.admin.user.vo.MemberUserRespVO;
import com.tashow.cloud.member.controller.admin.user.vo.MemberUserUpdateReqVO;
import com.tashow.cloud.member.convert.user.MemberUserConvert;
import com.tashow.cloud.member.dal.dataobject.user.MemberUserDO;
import com.tashow.cloud.member.service.user.MemberUserService;
import com.tashow.cloud.user.controller.admin.user.vo.UserLoginPageReqVO;
import com.tashow.cloud.user.controller.admin.user.vo.UserLoginRespVO;
import com.tashow.cloud.user.controller.admin.user.vo.MemberUserUpdateReqVO;
import com.tashow.cloud.user.convert.user.MemberUserConvert;
import com.tashow.cloud.user.dal.dataobject.user.UserLoginDO;
import com.tashow.cloud.user.service.user.UserLoginService;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Collection;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import static com.tashow.cloud.common.pojo.CommonResult.success;
@@ -27,45 +22,38 @@ import static com.tashow.cloud.common.pojo.CommonResult.success;
@RestController
@RequestMapping("/member/user")
@Validated
public class MemberUserController {
public class UserLoginController {
@Resource
private MemberUserService memberUserService;
@Resource
private UserLoginService loginUserService;
@PutMapping("/update")
// 更新会员用户
@PutMapping("/update")
@PreAuthorize("@ss.hasPermission('member:user:update')")
public CommonResult<Boolean> updateUser(@Valid @RequestBody MemberUserUpdateReqVO updateReqVO) {
memberUserService.updateUser(updateReqVO);
loginUserService.updateUser(updateReqVO);
return success(true);
}
@GetMapping("/get")
// 获得会员用户
// id: 编号必填示例1024
@GetMapping("/get")
@PreAuthorize("@ss.hasPermission('member:user:query')")
public CommonResult<MemberUserRespVO> getUser(@RequestParam("id") Long id) {
MemberUserDO user = memberUserService.getUser(id);
public CommonResult<UserLoginRespVO> getUser(@RequestParam("id") Long id) {
UserLoginDO user = loginUserService.getUser(id);
return success(MemberUserConvert.INSTANCE.convert03(user));
}
@GetMapping("/page")
// 获得会员用户分页
@GetMapping("/page")
@PreAuthorize("@ss.hasPermission('member:user:query')")
public CommonResult<PageResult<MemberUserRespVO>> getUserPage(@Valid MemberUserPageReqVO pageVO) {
PageResult<MemberUserDO> pageResult = memberUserService.getUserPage(pageVO);
public CommonResult<PageResult<UserLoginRespVO>> getUserPage(@Valid UserLoginPageReqVO pageVO) {
PageResult<UserLoginDO> pageResult = loginUserService.getUserPage(pageVO);
if (CollUtil.isEmpty(pageResult.getList())) {
return success(PageResult.empty());
}
// 处理用户标签返显
Set<Long> tagIds = pageResult.getList().stream()
.map(MemberUserDO::getTagIds)
.filter(Objects::nonNull)
.flatMap(Collection::stream)
.collect(Collectors.toSet());
return success(MemberUserConvert.INSTANCE.convertPage(pageResult));
}

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.controller.admin.user.vo;
package com.tashow.cloud.user.controller.admin.user.vo;
import lombok.Data;
import lombok.ToString;

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.controller.admin.user.vo;
package com.tashow.cloud.user.controller.admin.user.vo;
import lombok.Data;
import lombok.ToString;

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.controller.admin.user.vo;
package com.tashow.cloud.user.controller.admin.user.vo;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -10,7 +10,7 @@ import jakarta.validation.constraints.NotNull;
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MemberUserUpdateReqVO extends MemberUserBaseVO {
public class MemberUserUpdateReqVO extends UserBaseVO {
// 编号必填示例23788
@NotNull(message = "编号不能为空")

View File

@@ -0,0 +1,34 @@
package com.tashow.cloud.user.controller.admin.user.vo;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.hibernate.validator.constraints.URL;
/**
* 会员用户 Base VO提供给添加、修改、详细的子 VO 使用
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
*/
@Data
public class UserBaseVO {
// 手机号必填示例15601691300
@NotNull(message = "手机号不能为空")
private String mobile;
// 状态必填示例2
@NotNull(message = "状态不能为空")
private Byte status;
// 用户昵称,必填,示例:李四
@NotNull(message = "用户昵称不能为空")
private String nickname;
// 头像必填示例https://www.iocoder.cn/x.png
@URL(message = "头像必须是 URL 格式")
private String avatar;
// 备注,示例:我是小备注
private String remark;
}

View File

@@ -0,0 +1,33 @@
package com.tashow.cloud.user.controller.admin.user.vo;
import com.tashow.cloud.common.pojo.PageParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
// 管理后台 - 会员用户分页 Request VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class UserLoginPageReqVO extends PageParam {
// 搜索条件 手机号,昵称,姓名
private String searchField;
// 会员等级编号示例1
private Long levelId;
// 注册渠道
private Integer registerTerminal;
// 注册时间
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] registDate;
}

View File

@@ -0,0 +1,29 @@
package com.tashow.cloud.user.controller.admin.user.vo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.time.LocalDateTime;
// 管理后台 - 会员用户 Response VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class UserLoginRespVO extends UserBaseVO {
// 编号必填示例23788
private Long id;
// 会员类型
private Integer memberType;
// 注册渠道
private Integer registerTerminal;
// 注册渠道
private LocalDateTime registerTime;
// 最后登录时间,必填
private LocalDateTime loginDate;
}

View File

@@ -1,15 +1,15 @@
package com.tashow.cloud.member.controller.app.auth;
package com.tashow.cloud.user.controller.app.auth;
import cn.hutool.core.util.StrUtil;
import com.tashow.cloud.common.enums.UserTypeEnum;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.member.controller.app.auth.vo.*;
import com.tashow.cloud.member.convert.auth.AuthConvert;
import com.tashow.cloud.member.service.auth.MemberAuthService;
import com.tashow.cloud.security.security.config.SecurityProperties;
import com.tashow.cloud.security.security.core.util.SecurityFrameworkUtils;
import com.tashow.cloud.systemapi.api.social.SocialClientApi;
import com.tashow.cloud.systemapi.api.social.dto.SocialWxJsapiSignatureRespDTO;
import com.tashow.cloud.user.controller.app.auth.vo.*;
import com.tashow.cloud.user.convert.auth.AuthConvert;
import com.tashow.cloud.user.service.auth.MemberAuthService;
import jakarta.annotation.Resource;
import jakarta.annotation.security.PermitAll;
import jakarta.servlet.http.HttpServletRequest;

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.controller.app.auth.vo;
package com.tashow.cloud.user.controller.app.auth.vo;
import com.tashow.cloud.common.validation.InEnum;
import com.tashow.cloud.common.validation.Mobile;

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.controller.app.auth.vo;
package com.tashow.cloud.user.controller.app.auth.vo;
import cn.hutool.core.util.StrUtil;
import com.tashow.cloud.common.validation.InEnum;

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.controller.app.auth.vo;
package com.tashow.cloud.user.controller.app.auth.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.controller.app.auth.vo;
package com.tashow.cloud.user.controller.app.auth.vo;
import cn.hutool.core.util.StrUtil;
import com.tashow.cloud.common.validation.InEnum;

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.controller.app.auth.vo;
package com.tashow.cloud.user.controller.app.auth.vo;
import com.tashow.cloud.common.validation.InEnum;
import com.tashow.cloud.common.validation.Mobile;

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.controller.app.auth.vo;
package com.tashow.cloud.user.controller.app.auth.vo;
import com.tashow.cloud.common.validation.InEnum;
import com.tashow.cloud.common.validation.Mobile;

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.controller.app.auth.vo;
package com.tashow.cloud.user.controller.app.auth.vo;
import com.tashow.cloud.common.validation.InEnum;
import com.tashow.cloud.systemapi.enums.social.SocialTypeEnum;

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.controller.app.auth.vo;
package com.tashow.cloud.user.controller.app.auth.vo;
import jakarta.validation.constraints.NotEmpty;
import lombok.AllArgsConstructor;

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.controller.app.auth.vo;
package com.tashow.cloud.user.controller.app.auth.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;

View File

@@ -1,10 +1,10 @@
package com.tashow.cloud.member.controller.app.user;
package com.tashow.cloud.user.controller.app.user;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.member.controller.app.user.vo.*;
import com.tashow.cloud.member.convert.user.MemberUserConvert;
import com.tashow.cloud.member.dal.dataobject.user.MemberUserDO;
import com.tashow.cloud.member.service.user.MemberUserService;
import com.tashow.cloud.user.controller.app.user.vo.*;
import com.tashow.cloud.user.convert.user.MemberUserConvert;
import com.tashow.cloud.user.dal.dataobject.user.UserLoginDO;
import com.tashow.cloud.user.service.user.UserLoginService;
import jakarta.annotation.Resource;
import jakarta.annotation.security.PermitAll;
import jakarta.validation.Valid;
@@ -24,12 +24,12 @@ import static com.tashow.cloud.security.security.core.util.SecurityFrameworkUtil
public class AppMemberUserController {
@Resource
private MemberUserService userService;
private UserLoginService userService;
@GetMapping("/get")
// 获得基本信息
public CommonResult<AppMemberUserInfoRespVO> getUserInfo() {
MemberUserDO user = userService.getUser(getLoginUserId());
UserLoginDO user = userService.getUser(getLoginUserId());
return success(MemberUserConvert.INSTANCE.convert(user));
}

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.controller.app.user.vo;
package com.tashow.cloud.user.controller.app.user.vo;
import lombok.AllArgsConstructor;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.controller.app.user.vo;
package com.tashow.cloud.user.controller.app.user.vo;
import com.tashow.cloud.common.validation.Mobile;

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.controller.app.user.vo;
package com.tashow.cloud.user.controller.app.user.vo;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.controller.app.user.vo;
package com.tashow.cloud.user.controller.app.user.vo;
import com.tashow.cloud.common.validation.Mobile;
import jakarta.validation.constraints.NotBlank;

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.controller.app.user.vo;
package com.tashow.cloud.user.controller.app.user.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.controller.app.user.vo;
package com.tashow.cloud.user.controller.app.user.vo;
import lombok.Data;
import org.hibernate.validator.constraints.URL;

View File

@@ -3,4 +3,4 @@
* 1. admin 提供给管理后台 yudao-ui-admin 前端项目
* 2. app 提供给用户 APP yudao-ui-app 前端项目它的 Controller VO 都要添加 App 前缀用于和管理后台进行区分
*/
package com.tashow.cloud.member.controller;
package com.tashow.cloud.user.controller;

View File

@@ -1,7 +1,5 @@
package com.tashow.cloud.member.convert.auth;
package com.tashow.cloud.user.convert.auth;
import com.tashow.cloud.member.controller.app.auth.vo.*;
import com.tashow.cloud.member.controller.app.user.vo.AppMemberUserResetPasswordReqVO;
import com.tashow.cloud.systemapi.api.oauth2.dto.OAuth2AccessTokenRespDTO;
import com.tashow.cloud.systemapi.api.sms.dto.code.SmsCodeSendReqDTO;
import com.tashow.cloud.systemapi.api.sms.dto.code.SmsCodeUseReqDTO;
@@ -10,6 +8,8 @@ import com.tashow.cloud.systemapi.api.social.dto.SocialUserBindReqDTO;
import com.tashow.cloud.systemapi.api.social.dto.SocialUserUnbindReqDTO;
import com.tashow.cloud.systemapi.api.social.dto.SocialWxJsapiSignatureRespDTO;
import com.tashow.cloud.systemapi.enums.sms.SmsSceneEnum;
import com.tashow.cloud.user.controller.app.auth.vo.*;
import com.tashow.cloud.user.controller.app.user.vo.AppMemberUserResetPasswordReqVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

View File

@@ -3,4 +3,4 @@
*
* 目前使用 MapStruct 框架
*/
package com.tashow.cloud.member.convert;
package com.tashow.cloud.user.convert;

View File

@@ -0,0 +1,39 @@
package com.tashow.cloud.user.convert.user;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.memberapi.api.user.dto.MemberUserRespDTO;
import com.tashow.cloud.user.controller.admin.user.vo.UserLoginRespVO;
import com.tashow.cloud.user.controller.admin.user.vo.MemberUserUpdateReqVO;
import com.tashow.cloud.user.controller.app.user.vo.AppMemberUserInfoRespVO;
import com.tashow.cloud.user.dal.dataobject.user.UserLoginDO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface MemberUserConvert {
MemberUserConvert INSTANCE = Mappers.getMapper(MemberUserConvert.class);
AppMemberUserInfoRespVO convert(UserLoginDO bean);
@Mappings({
@Mapping(source = "bean.id", target = "id"),
})
MemberUserRespDTO convert2(UserLoginDO bean);
List<MemberUserRespDTO> convertList2(List<UserLoginDO> list);
UserLoginDO convert(MemberUserUpdateReqVO bean);
PageResult<UserLoginRespVO> convertPage(PageResult<UserLoginDO> page);
UserLoginRespVO convert03(UserLoginDO bean);
}

View File

@@ -0,0 +1 @@
package com.tashow.cloud.user.dal.dataobject;

View File

@@ -0,0 +1,80 @@
package com.tashow.cloud.user.dal.dataobject.user;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
import lombok.*;
import java.time.LocalDateTime;
/**
* 登录用户 DO
*
* @author 芋道源码
*/
@TableName("tz_user_login")
@KeySequence("tz_user_login_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserLoginDO extends BaseDO {
/**
* 用户ID
*/
@TableId
private Long id;
/**
* 手机
*/
private String mobile;
/**
* 加密后的密码
*/
private String password;
/**
* 帐号状态 (枚举 CommonStatusEnum)
*/
private Integer status;
/**
* 注册 IP
*/
private String registerIp;
/**
* 注册渠道 (枚举 TerminalEnum)
*/
private Integer registerTerminal;
/**
* 注册时间
*/
private LocalDateTime registerDate;
/**
* 最后登录IP
*/
private String loginIp;
/**
* 最后登录时间
*/
private LocalDateTime loginDate;
/**
* 最后登录设备
*/
private String loginTerminal;
/**
* 用户昵称
*/
private String nickname;
/**
* 用户头像
*/
private String avatar;
/**
* 用户备注
*/
private String remark;
}

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.dal.dataobject.address;
package com.tashow.cloud.user.dal.dataobject.user;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
@@ -7,28 +7,25 @@ import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
import lombok.*;
/**
* 用户收件地址 DO
* 会员地址 DO
*
* @author 芋道源码
*/
@TableName("member_address")
@KeySequence("member_address_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@TableName("tz_user_member_address")
@KeySequence("tz_user_member_address_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MemberAddressDO extends BaseDO {
public class UserMemberAddressDO extends BaseDO {
/**
* 编号
*/
@TableId
private Long id;
/**
* 用户编号
*/
private Long userId;
@TableId
private Long id;
/**
* 收件人名称
*/
@@ -47,9 +44,7 @@ public class MemberAddressDO extends BaseDO {
private String detailAddress;
/**
* 是否默认
*
* true - 默认收件地址
*/
private Boolean defaultStatus;
private Integer defaultStatus;
}
}

View File

@@ -0,0 +1,68 @@
package com.tashow.cloud.user.dal.dataobject.user;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
import lombok.*;
import java.time.LocalDateTime;
/**
* 会员信息 DO
*
* @author 芋道源码
*/
@TableName("tz_user_member")
@KeySequence("tz_user_member_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserMemberDO extends BaseDO {
/**
* 用户ID
*/
@TableId
private Long id;
/**
* 真实名字
*/
private String name;
/**
* 性别 (枚举 SexEnum)
*/
private Integer sex;
/**
* 出生日期
*/
private LocalDateTime birthday;
/**
* 所在地 (关联 Area.id 字段)
*/
private Integer areaId;
/**
* 积分
*/
private Integer point;
/**
* 会员标签列表,以逗号分隔
*/
private String tagIds;
/**
* 会员级别编号 (关联 MemberLevelDO.id 字段)
*/
private Long levelId;
/**
* 会员经验
*/
private Integer experience;
/**
* 用户分组编号 (关联 MemberGroupDO.id 字段)
*/
private Long groupId;
}

View File

@@ -0,0 +1,58 @@
package com.tashow.cloud.user.dal.dataobject.user;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
import lombok.*;
/**
* 会员等级 DO
*
* @author 芋道源码
*/
@TableName("tz_user_member_level")
@KeySequence("tz_user_member_level_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserMemberLevelDO extends BaseDO {
/**
* ID
*/
@TableId
private Long id;
/**
* 等级名称
*/
private String levelName;
/**
* 性别 (枚举 SexEnum)
*/
private Integer level;
/**
* 会员经验
*/
private Integer experience;
/**
* 享受折扣
*/
private Integer discountPercent;
/**
* 等级图标
*/
private String icon;
/**
* 等级背景图
*/
private String backgroundUrl;
/**
* 状态
*/
private Integer status;
}

View File

@@ -0,0 +1 @@
package com.tashow.cloud.user.dal.mysql;

View File

@@ -0,0 +1,71 @@
package com.tashow.cloud.user.dal.mysql.user;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import com.tashow.cloud.mybatis.mybatis.core.query.LambdaQueryWrapperX;
import com.tashow.cloud.user.controller.admin.user.vo.UserLoginPageReqVO;
import com.tashow.cloud.user.dal.dataobject.user.UserLoginDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 会员 User Mapper
*
* @author 芋道源码
*/
@Mapper
public interface UserLoginMapper extends BaseMapperX<UserLoginDO> {
default UserLoginDO selectByMobile(String mobile) {
return selectOne(UserLoginDO::getMobile, mobile);
}
default List<UserLoginDO> selectListByNicknameLike(String nickname) {
return selectList(new LambdaQueryWrapperX<UserLoginDO>()
.likeIfPresent(UserLoginDO::getNickname, nickname));
}
default PageResult<UserLoginDO> selectPage(UserLoginPageReqVO reqVO) {
// 分页查询
return selectPage(reqVO, new LambdaQueryWrapperX<UserLoginDO>()
.orderByDesc(UserLoginDO::getId));
}
default Long selectCountByTagId(Long tagId) {
return selectCount(new LambdaQueryWrapperX<UserLoginDO>()
.apply("FIND_IN_SET({0}, tag_ids)", tagId));
}
/**
* 更新用户积分(增加)
*
* @param id 用户编号
* @param incrCount 增加积分(正数)
*/
default void updatePointIncr(Long id, Integer incrCount) {
Assert.isTrue(incrCount > 0);
LambdaUpdateWrapper<UserLoginDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<UserLoginDO>()
.setSql(" point = point + " + incrCount)
.eq(UserLoginDO::getId, id);
update(null, lambdaUpdateWrapper);
}
/**
* 更新用户积分(减少)
*
* @param id 用户编号
* @param incrCount 增加积分(负数)
* @return 更新行数
*/
default int updatePointDecr(Long id, Integer incrCount) {
Assert.isTrue(incrCount < 0);
LambdaUpdateWrapper<UserLoginDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<UserLoginDO>()
.setSql(" point = point + " + incrCount) // 负数,所以使用 + 号
.eq(UserLoginDO::getId, id);
return update(null, lambdaUpdateWrapper);
}
}

View File

@@ -0,0 +1,15 @@
package com.tashow.cloud.user.dal.mysql.user;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import com.tashow.cloud.user.dal.dataobject.user.UserMemberAddressDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 会员地址 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface UserMemberAddressMapper extends BaseMapperX<UserMemberAddressDO> {
}

View File

@@ -0,0 +1,16 @@
package com.tashow.cloud.user.dal.mysql.user;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import com.tashow.cloud.user.dal.dataobject.user.UserMemberLevelDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 会员等级 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface UserMemberLevelMapper extends BaseMapperX<UserMemberLevelDO> {
}

View File

@@ -0,0 +1,16 @@
package com.tashow.cloud.user.dal.mysql.user;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import com.tashow.cloud.user.dal.dataobject.user.UserMemberDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 会员信息 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface UserMemberMapper extends BaseMapperX<UserMemberDO> {
}

View File

@@ -6,4 +6,4 @@
*
* 其中MySQL 的表以 member_ 作为前缀
*/
package com.tashow.cloud.member.dal;
package com.tashow.cloud.user.dal;

View File

@@ -1,4 +1,4 @@
/**
* 占位后续有类后可以删除避免 package 无法提交到 Git
*/
package com.tashow.cloud.member.dal.redis;
package com.tashow.cloud.user.dal.redis;

View File

@@ -3,4 +3,4 @@
*
* @author 芋道源码
*/
package com.tashow.cloud.member.framework;
package com.tashow.cloud.user.framework;

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.framework.rpc.config;
package com.tashow.cloud.user.framework.rpc.config;
import com.tashow.cloud.systemapi.api.logger.LoginLogApi;
import com.tashow.cloud.systemapi.api.sms.SmsCodeApi;

View File

@@ -0,0 +1,4 @@
/**
* 占位
*/
package com.tashow.cloud.user.framework.rpc;

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.framework.security.config;
package com.tashow.cloud.user.framework.security.config;
import com.tashow.cloud.memberapi.enums.ApiConstants;
import com.tashow.cloud.security.security.config.AuthorizeRequestsCustomizer;

View File

@@ -0,0 +1,4 @@
/**
* 占位
*/
package com.tashow.cloud.user.framework.security.core;

View File

@@ -1,7 +1,7 @@
package com.tashow.cloud.member.service.auth;
package com.tashow.cloud.user.service.auth;
import com.tashow.cloud.member.controller.app.auth.vo.*;
import com.tashow.cloud.user.controller.app.auth.vo.*;
import jakarta.validation.Valid;
/**

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.service.auth;
package com.tashow.cloud.user.service.auth;
import cn.hutool.core.lang.Assert;
import com.tashow.cloud.common.enums.CommonStatusEnum;
@@ -6,10 +6,6 @@ import com.tashow.cloud.common.enums.TerminalEnum;
import com.tashow.cloud.common.enums.UserTypeEnum;
import com.tashow.cloud.common.util.monitor.TracerUtils;
import com.tashow.cloud.common.util.servlet.ServletUtils;
import com.tashow.cloud.member.controller.app.auth.vo.*;
import com.tashow.cloud.member.convert.auth.AuthConvert;
import com.tashow.cloud.member.dal.dataobject.user.MemberUserDO;
import com.tashow.cloud.member.service.user.MemberUserService;
import com.tashow.cloud.systemapi.api.logger.LoginLogApi;
import com.tashow.cloud.systemapi.api.logger.dto.LoginLogCreateReqDTO;
import com.tashow.cloud.systemapi.api.oauth2.OAuth2TokenApi;
@@ -26,6 +22,10 @@ import com.tashow.cloud.systemapi.enums.logger.LoginResultEnum;
import com.tashow.cloud.systemapi.enums.oauth2.OAuth2ClientConstants;
import com.tashow.cloud.systemapi.enums.sms.SmsSceneEnum;
import com.tashow.cloud.systemapi.enums.social.SocialTypeEnum;
import com.tashow.cloud.user.controller.app.auth.vo.*;
import com.tashow.cloud.user.convert.auth.AuthConvert;
import com.tashow.cloud.user.dal.dataobject.user.UserLoginDO;
import com.tashow.cloud.user.service.user.UserLoginService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -50,7 +50,7 @@ import static com.tashow.cloud.web.web.core.util.WebFrameworkUtils.getTerminal;
public class MemberAuthServiceImpl implements MemberAuthService {
@Resource
private MemberUserService userService;
private UserLoginService userService;
@Resource
private SmsCodeApi smsCodeApi;
@Resource
@@ -65,7 +65,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
@Override
public AppAuthLoginRespVO login(AppAuthLoginReqVO reqVO) {
// 使用手机 + 密码进行登录
MemberUserDO user = login0(reqVO.getMobile(), reqVO.getPassword());
UserLoginDO user = login0(reqVO.getMobile(), reqVO.getPassword());
// 如果 socialType 非空说明需要绑定社交用户
String openid = null;
@@ -86,7 +86,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.MEMBER_LOGIN.getScene(), userIp)).checkError();
// 获得获得注册用户
MemberUserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp, getTerminal());
UserLoginDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp, getTerminal());
Assert.notNull(user, "获取用户失败,结果为空");
// 校验是否禁用
@@ -117,7 +117,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
}
// 情况一已绑定直接读取用户信息
MemberUserDO user;
UserLoginDO user;
if (socialUser.getUserId() != null) {
user = userService.getUser(socialUser.getUserId());
// 情况二未绑定注册用户 + 绑定用户
@@ -142,7 +142,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
Assert.notNull(phoneNumberInfo, "获得手机信息失败,结果为空");
// 获得获得注册用户
MemberUserDO user = userService.createUserIfAbsent(phoneNumberInfo.getPurePhoneNumber(),
UserLoginDO user = userService.createUserIfAbsent(phoneNumberInfo.getPurePhoneNumber(),
getClientIP(), TerminalEnum.WECHAT_MINI_PROGRAM.getTerminal());
Assert.notNull(user, "获取用户失败,结果为空");
@@ -154,7 +154,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
return createTokenAfterLoginSuccess(user, user.getMobile(), LoginLogTypeEnum.LOGIN_SOCIAL, openid);
}
private AppAuthLoginRespVO createTokenAfterLoginSuccess(MemberUserDO user, String mobile,
private AppAuthLoginRespVO createTokenAfterLoginSuccess(UserLoginDO user, String mobile,
LoginLogTypeEnum logType, String openid) {
// 插入登陆日志
createLoginLog(user.getId(), mobile, logType, LoginResultEnum.SUCCESS);
@@ -171,10 +171,10 @@ public class MemberAuthServiceImpl implements MemberAuthService {
return socialClientApi.getAuthorizeUrl(type, UserTypeEnum.MEMBER.getValue(), redirectUri).getCheckedData();
}
private MemberUserDO login0(String mobile, String password) {
private UserLoginDO login0(String mobile, String password) {
final LoginLogTypeEnum logTypeEnum = LoginLogTypeEnum.LOGIN_MOBILE;
// 校验账号是否存在
MemberUserDO user = userService.getUserByMobile(mobile);
UserLoginDO user = userService.getUserByMobile(mobile);
if (user == null) {
createLoginLog(null, mobile, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
throw exception(AUTH_LOGIN_BAD_CREDENTIALS);
@@ -224,21 +224,21 @@ public class MemberAuthServiceImpl implements MemberAuthService {
public void sendSmsCode(Long userId, AppAuthSmsSendReqVO reqVO) {
// 情况 1如果是修改手机场景需要校验新手机号是否已经注册说明不能使用该手机了
if (Objects.equals(reqVO.getScene(), SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene())) {
MemberUserDO user = userService.getUserByMobile(reqVO.getMobile());
UserLoginDO user = userService.getUserByMobile(reqVO.getMobile());
if (user != null && !Objects.equals(user.getId(), userId)) {
throw exception(AUTH_MOBILE_USED);
}
}
// 情况 2如果是重置密码场景需要校验手机号是存在的
if (Objects.equals(reqVO.getScene(), SmsSceneEnum.MEMBER_RESET_PASSWORD.getScene())) {
MemberUserDO user = userService.getUserByMobile(reqVO.getMobile());
UserLoginDO user = userService.getUserByMobile(reqVO.getMobile());
if (user == null) {
throw exception(USER_MOBILE_NOT_EXISTS);
}
}
// 情况 3如果是修改密码场景需要查询手机号无需前端传递
if (Objects.equals(reqVO.getScene(), SmsSceneEnum.MEMBER_UPDATE_PASSWORD.getScene())) {
MemberUserDO user = userService.getUser(userId);
UserLoginDO user = userService.getUser(userId);
// TODO 芋艿后续 member user 手机非强绑定这块需要做下调整
reqVO.setMobile(user.getMobile());
}
@@ -276,7 +276,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
if (userId == null) {
return null;
}
MemberUserDO user = userService.getUser(userId);
UserLoginDO user = userService.getUser(userId);
return user != null ? user.getMobile() : null;
}

View File

@@ -1,12 +1,12 @@
package com.tashow.cloud.member.service.user;
package com.tashow.cloud.user.service.user;
import com.tashow.cloud.common.enums.TerminalEnum;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.common.validation.Mobile;
import com.tashow.cloud.member.controller.admin.user.vo.MemberUserPageReqVO;
import com.tashow.cloud.member.controller.admin.user.vo.MemberUserUpdateReqVO;
import com.tashow.cloud.member.controller.app.user.vo.*;
import com.tashow.cloud.member.dal.dataobject.user.MemberUserDO;
import com.tashow.cloud.user.controller.admin.user.vo.UserLoginPageReqVO;
import com.tashow.cloud.user.controller.admin.user.vo.MemberUserUpdateReqVO;
import com.tashow.cloud.user.controller.app.user.vo.*;
import com.tashow.cloud.user.dal.dataobject.user.UserLoginDO;
import jakarta.validation.Valid;
import java.util.Collection;
@@ -17,7 +17,7 @@ import java.util.List;
*
* @author 芋道源码
*/
public interface MemberUserService {
public interface UserLoginService {
/**
* 通过手机查询用户
@@ -25,7 +25,7 @@ public interface MemberUserService {
* @param mobile 手机
* @return 用户对象
*/
MemberUserDO getUserByMobile(String mobile);
UserLoginDO getUserByMobile(String mobile);
/**
* 基于用户昵称模糊匹配用户列表
@@ -33,7 +33,7 @@ public interface MemberUserService {
* @param nickname 用户昵称模糊匹配
* @return 用户信息的列表
*/
List<MemberUserDO> getUserListByNickname(String nickname);
List<UserLoginDO> getUserListByNickname(String nickname);
/**
* 基于手机号创建用户
@@ -44,7 +44,7 @@ public interface MemberUserService {
* @param terminal 终端 {@link TerminalEnum}
* @return 用户对象
*/
MemberUserDO createUserIfAbsent(@Mobile String mobile, String registerIp, Integer terminal);
UserLoginDO createUserIfAbsent(@Mobile String mobile, String registerIp, Integer terminal);
/**
* 创建用户
@@ -56,7 +56,7 @@ public interface MemberUserService {
* @param terminal 终端 {@link TerminalEnum}
* @return 用户对象
*/
MemberUserDO createUser(String nickname, String avtar, String registerIp, Integer terminal);
UserLoginDO createUser(String nickname, String avtar, String registerIp, Integer terminal);
/**
* 更新用户的最后登陆信息
@@ -72,7 +72,7 @@ public interface MemberUserService {
* @param id 用户ID
* @return 用户对象信息
*/
MemberUserDO getUser(Long id);
UserLoginDO getUser(Long id);
/**
* 通过用户 ID 查询用户们
@@ -80,7 +80,7 @@ public interface MemberUserService {
* @param ids 用户 ID
* @return 用户对象信息数组
*/
List<MemberUserDO> getUserList(Collection<Long> ids);
List<UserLoginDO> getUserList(Collection<Long> ids);
/**
* 会员修改基本信息
@@ -143,7 +143,7 @@ public interface MemberUserService {
* @param pageReqVO 分页查询
* @return 会员用户分页
*/
PageResult<MemberUserDO> getUserPage(MemberUserPageReqVO pageReqVO);
PageResult<UserLoginDO> getUserPage(UserLoginPageReqVO pageReqVO);
/**
* 更新用户的等级和经验
@@ -154,22 +154,6 @@ public interface MemberUserService {
*/
void updateUserLevel(Long id, Long levelId, Integer experience);
/**
* 获得指定用户分组下的用户数量
*
* @param groupId 用户分组编号
* @return 用户数量
*/
Long getUserCountByGroupId(Long groupId);
/**
* 获得指定用户等级下的用户数量
*
* @param levelId 用户等级编号
* @return 用户数量
*/
Long getUserCountByLevelId(Long levelId);
/**
* 获得指定会员标签下的用户数量
*

View File

@@ -1,4 +1,4 @@
package com.tashow.cloud.member.service.user;
package com.tashow.cloud.user.service.user;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
@@ -12,19 +12,18 @@ import com.tashow.cloud.common.enums.CommonStatusEnum;
import com.tashow.cloud.common.enums.UserTypeEnum;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.common.util.object.BeanUtils;
import com.tashow.cloud.member.controller.admin.user.vo.MemberUserPageReqVO;
import com.tashow.cloud.member.controller.admin.user.vo.MemberUserUpdateReqVO;
import com.tashow.cloud.member.controller.app.user.vo.*;
import com.tashow.cloud.member.convert.auth.AuthConvert;
import com.tashow.cloud.member.convert.user.MemberUserConvert;
import com.tashow.cloud.member.dal.dataobject.user.MemberUserDO;
import com.tashow.cloud.member.dal.mysql.user.MemberUserMapper;
import com.tashow.cloud.member.mq.producer.user.MemberUserProducer;
import com.tashow.cloud.systemapi.api.sms.SmsCodeApi;
import com.tashow.cloud.systemapi.api.sms.dto.code.SmsCodeUseReqDTO;
import com.tashow.cloud.systemapi.api.social.SocialClientApi;
import com.tashow.cloud.systemapi.api.social.dto.SocialWxPhoneNumberInfoRespDTO;
import com.tashow.cloud.systemapi.enums.sms.SmsSceneEnum;
import com.tashow.cloud.user.controller.admin.user.vo.UserLoginPageReqVO;
import com.tashow.cloud.user.controller.admin.user.vo.MemberUserUpdateReqVO;
import com.tashow.cloud.user.controller.app.user.vo.*;
import com.tashow.cloud.user.convert.auth.AuthConvert;
import com.tashow.cloud.user.convert.user.MemberUserConvert;
import com.tashow.cloud.user.dal.dataobject.user.UserLoginDO;
import com.tashow.cloud.user.dal.mysql.user.UserLoginMapper;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
@@ -53,10 +52,10 @@ import static com.tashow.cloud.systemapi.enums.ErrorCodeConstants.USER_NOT_EXIST
@Service
@Valid
@Slf4j
public class MemberUserServiceImpl implements MemberUserService {
public class UserLoginServiceImpl implements UserLoginService {
@Resource
private MemberUserMapper memberUserMapper;
private UserLoginMapper memberUserMapper;
@Resource
private SmsCodeApi smsCodeApi;
@@ -67,24 +66,22 @@ public class MemberUserServiceImpl implements MemberUserService {
@Resource
private PasswordEncoder passwordEncoder;
@Resource
private MemberUserProducer memberUserProducer;
@Override
public MemberUserDO getUserByMobile(String mobile) {
public UserLoginDO getUserByMobile(String mobile) {
return memberUserMapper.selectByMobile(mobile);
}
@Override
public List<MemberUserDO> getUserListByNickname(String nickname) {
public List<UserLoginDO> getUserListByNickname(String nickname) {
return memberUserMapper.selectListByNicknameLike(nickname);
}
@Override
@Transactional(rollbackFor = Exception.class)
public MemberUserDO createUserIfAbsent(String mobile, String registerIp, Integer terminal) {
public UserLoginDO createUserIfAbsent(String mobile, String registerIp, Integer terminal) {
// 用户已经存在
MemberUserDO user = memberUserMapper.selectByMobile(mobile);
UserLoginDO user = memberUserMapper.selectByMobile(mobile);
if (user != null) {
return user;
}
@@ -94,16 +91,16 @@ public class MemberUserServiceImpl implements MemberUserService {
@Override
@Transactional(rollbackFor = Exception.class)
public MemberUserDO createUser(String nickname, String avtar, String registerIp, Integer terminal) {
public UserLoginDO createUser(String nickname, String avtar, String registerIp, Integer terminal) {
return createUser(null, nickname, avtar, registerIp, terminal);
}
private MemberUserDO createUser(String mobile, String nickname, String avtar,
String registerIp, Integer terminal) {
private UserLoginDO createUser(String mobile, String nickname, String avtar,
String registerIp, Integer terminal) {
// 生成密码
String password = IdUtil.fastSimpleUUID();
// 插入用户
MemberUserDO user = new MemberUserDO();
UserLoginDO user = new UserLoginDO();
user.setMobile(mobile);
user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启
user.setPassword(encodePassword(password)); // 加密密码
@@ -120,7 +117,6 @@ public class MemberUserServiceImpl implements MemberUserService {
@Override
public void afterCommit() {
memberUserProducer.sendUserCreateMessage(user.getId());
}
});
@@ -129,17 +125,17 @@ public class MemberUserServiceImpl implements MemberUserService {
@Override
public void updateUserLogin(Long id, String loginIp) {
memberUserMapper.updateById(new MemberUserDO().setId(id)
memberUserMapper.updateById(new UserLoginDO().setId(id)
.setLoginIp(loginIp).setLoginDate(LocalDateTime.now()));
}
@Override
public MemberUserDO getUser(Long id) {
public UserLoginDO getUser(Long id) {
return memberUserMapper.selectById(id);
}
@Override
public List<MemberUserDO> getUserList(Collection<Long> ids) {
public List<UserLoginDO> getUserList(Collection<Long> ids) {
if (CollUtil.isEmpty(ids)) {
return ListUtil.empty();
}
@@ -148,7 +144,7 @@ public class MemberUserServiceImpl implements MemberUserService {
@Override
public void updateUser(Long userId, AppMemberUserUpdateReqVO reqVO) {
MemberUserDO updateObj = BeanUtils.toBean(reqVO, MemberUserDO.class).setId(userId);
UserLoginDO updateObj = BeanUtils.toBean(reqVO, UserLoginDO.class).setId(userId);
memberUserMapper.updateById(updateObj);
}
@@ -156,7 +152,7 @@ public class MemberUserServiceImpl implements MemberUserService {
@Transactional(rollbackFor = Exception.class)
public void updateUserMobile(Long userId, AppMemberUserUpdateMobileReqVO reqVO) {
// 1.1 检测用户是否存在
MemberUserDO user = validateUserExists(userId);
UserLoginDO user = validateUserExists(userId);
// 1.2 校验新手机是否已经被绑定
validateMobileUnique(null, reqVO.getMobile());
@@ -171,7 +167,7 @@ public class MemberUserServiceImpl implements MemberUserService {
.setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()).setUsedIp(getClientIP())).checkError();
// 3. 更新用户手机
memberUserMapper.updateById(MemberUserDO.builder().id(userId).mobile(reqVO.getMobile()).build());
memberUserMapper.updateById(UserLoginDO.builder().id(userId).mobile(reqVO.getMobile()).build());
}
@Override
@@ -184,38 +180,38 @@ public class MemberUserServiceImpl implements MemberUserService {
validateMobileUnique(userId, phoneNumberInfo.getPhoneNumber());
// 2. 更新用户手机
memberUserMapper.updateById(MemberUserDO.builder().id(userId).mobile(phoneNumberInfo.getPhoneNumber()).build());
memberUserMapper.updateById(UserLoginDO.builder().id(userId).mobile(phoneNumberInfo.getPhoneNumber()).build());
}
@Override
public void updateUserPassword(Long userId, AppMemberUserUpdatePasswordReqVO reqVO) {
// 检测用户是否存在
MemberUserDO user = validateUserExists(userId);
UserLoginDO user = validateUserExists(userId);
// 校验验证码
smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(user.getMobile()).setCode(reqVO.getCode())
.setScene(SmsSceneEnum.MEMBER_UPDATE_PASSWORD.getScene()).setUsedIp(getClientIP())).checkError();
// 更新用户密码
memberUserMapper.updateById(MemberUserDO.builder().id(userId)
memberUserMapper.updateById(UserLoginDO.builder().id(userId)
.password(passwordEncoder.encode(reqVO.getPassword())).build());
}
@Override
public void resetUserPassword(AppMemberUserResetPasswordReqVO reqVO) {
// 检验用户是否存在
MemberUserDO user = validateUserExists(reqVO.getMobile());
UserLoginDO user = validateUserExists(reqVO.getMobile());
// 使用验证码
smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.MEMBER_RESET_PASSWORD,
getClientIP())).checkError();
// 更新密码
memberUserMapper.updateById(MemberUserDO.builder().id(user.getId())
memberUserMapper.updateById(UserLoginDO.builder().id(user.getId())
.password(passwordEncoder.encode(reqVO.getPassword())).build());
}
private MemberUserDO validateUserExists(String mobile) {
MemberUserDO user = memberUserMapper.selectByMobile(mobile);
private UserLoginDO validateUserExists(String mobile) {
UserLoginDO user = memberUserMapper.selectByMobile(mobile);
if (user == null) {
throw exception(USER_MOBILE_NOT_EXISTS);
}
@@ -246,16 +242,16 @@ public class MemberUserServiceImpl implements MemberUserService {
validateMobileUnique(updateReqVO.getId(), updateReqVO.getMobile());
// 更新
MemberUserDO updateObj = MemberUserConvert.INSTANCE.convert(updateReqVO);
UserLoginDO updateObj = MemberUserConvert.INSTANCE.convert(updateReqVO);
memberUserMapper.updateById(updateObj);
}
@VisibleForTesting
MemberUserDO validateUserExists(Long id) {
UserLoginDO validateUserExists(Long id) {
if (id == null) {
return null;
}
MemberUserDO user = memberUserMapper.selectById(id);
UserLoginDO user = memberUserMapper.selectById(id);
if (user == null) {
throw exception(USER_NOT_EXISTS);
}
@@ -267,7 +263,7 @@ public class MemberUserServiceImpl implements MemberUserService {
if (StrUtil.isBlank(mobile)) {
return;
}
MemberUserDO user = memberUserMapper.selectByMobile(mobile);
UserLoginDO user = memberUserMapper.selectByMobile(mobile);
if (user == null) {
return;
}
@@ -281,7 +277,7 @@ public class MemberUserServiceImpl implements MemberUserService {
}
@Override
public PageResult<MemberUserDO> getUserPage(MemberUserPageReqVO pageReqVO) {
public PageResult<UserLoginDO> getUserPage(UserLoginPageReqVO pageReqVO) {
return memberUserMapper.selectPage(pageReqVO);
}
@@ -289,22 +285,11 @@ public class MemberUserServiceImpl implements MemberUserService {
public void updateUserLevel(Long id, Long levelId, Integer experience) {
// 0 代表无等级防止UpdateById时会被过滤掉的问题
levelId = ObjectUtil.defaultIfNull(levelId, 0L);
memberUserMapper.updateById(new MemberUserDO()
memberUserMapper.updateById(new UserLoginDO()
.setId(id)
.setLevelId(levelId).setExperience(experience)
);
}
@Override
public Long getUserCountByGroupId(Long groupId) {
return memberUserMapper.selectCountByGroupId(groupId);
}
@Override
public Long getUserCountByLevelId(Long levelId) {
return memberUserMapper.selectCountByLevelId(levelId);
}
@Override
public Long getUserCountByTagId(Long tagId) {
return memberUserMapper.selectCountByTagId(tagId);

View File

@@ -0,0 +1,28 @@
package com.tashow.cloud.user.service.user;
import com.tashow.cloud.user.dal.dataobject.user.UserMemberAddressDO;
/**
* 会员地址 Service 接口
*
* @author 芋道源码
*/
public interface UserMemberAddressService {
/**
* 删除会员地址
*
* @param id 编号
*/
void deleteMemberAddress(Long id);
/**
* 获得会员地址
*
* @param id 编号
* @return 会员地址
*/
UserMemberAddressDO getMemberAddress(Long id);
}

Some files were not shown because too many files have changed in this diff Show More