diff --git a/agileboot-admin/src/main/java/com/agileboot/admin/controller/ab98/Ab98UserController.java b/agileboot-admin/src/main/java/com/agileboot/admin/controller/ab98/Ab98UserController.java new file mode 100644 index 0000000..8fc5a8d --- /dev/null +++ b/agileboot-admin/src/main/java/com/agileboot/admin/controller/ab98/Ab98UserController.java @@ -0,0 +1,68 @@ +package com.agileboot.admin.controller.ab98; + +import com.agileboot.admin.customize.aop.accessLog.AccessLog; +import com.agileboot.common.core.base.BaseController; +import com.agileboot.common.core.dto.ResponseDTO; +import com.agileboot.common.core.page.PageDTO; +import com.agileboot.common.enums.common.BusinessTypeEnum; +import com.agileboot.domain.common.command.BulkOperationCommand; +import com.agileboot.domain.ab98.user.Ab98UserApplicationService; +import com.agileboot.domain.ab98.user.command.AddAb98UserCommand; +import com.agileboot.domain.ab98.user.command.UpdateAb98UserCommand; +import com.agileboot.domain.ab98.user.db.Ab98UserEntity; +import com.agileboot.domain.ab98.user.dto.Ab98UserDTO; +import com.agileboot.domain.ab98.user.query.SearchAb98UserQuery; +import io.swagger.v3.oas.annotations.Operation; +import java.util.List; +import javax.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/ab98/users") +@RequiredArgsConstructor +@Validated +public class Ab98UserController extends BaseController { + + private final Ab98UserApplicationService userApplicationService; + + @Operation(summary = "用户列表") + @GetMapping + public ResponseDTO> list(SearchAb98UserQuery query) { + PageDTO page = userApplicationService.getUserList(query); + return ResponseDTO.ok(page); + } + + @Operation(summary = "新增用户") + @AccessLog(title = "用户管理", businessType = BusinessTypeEnum.ADD) + @PostMapping + public ResponseDTO add(@Validated @RequestBody AddAb98UserCommand command) { + userApplicationService.addUser(command); + return ResponseDTO.ok(); + } + + @Operation(summary = "修改用户") + @AccessLog(title = "用户管理", businessType = BusinessTypeEnum.MODIFY) + @PutMapping("/{id}") + public ResponseDTO edit(@PathVariable Long id, @Validated @RequestBody UpdateAb98UserCommand command) { + command.setAb98UserId(id); + userApplicationService.updateUser(command); + return ResponseDTO.ok(); + } + + @Operation(summary = "删除用户") + @AccessLog(title = "用户管理", businessType = BusinessTypeEnum.DELETE) + @DeleteMapping("/{ids}") + public ResponseDTO remove(@PathVariable @NotNull List ids) { + userApplicationService.deleteUser(new BulkOperationCommand<>(ids)); + return ResponseDTO.ok(); + } +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/Ab98UserApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/Ab98UserApplicationService.java new file mode 100644 index 0000000..26f3959 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/Ab98UserApplicationService.java @@ -0,0 +1,61 @@ +package com.agileboot.domain.ab98.user; + +import com.agileboot.common.core.page.PageDTO; +import com.agileboot.domain.common.command.BulkOperationCommand; +import com.agileboot.domain.ab98.user.command.AddAb98UserCommand; +import com.agileboot.domain.ab98.user.command.UpdateAb98UserCommand; +import com.agileboot.domain.ab98.user.db.Ab98UserEntity; +import com.agileboot.domain.ab98.user.db.Ab98UserService; +import com.agileboot.domain.ab98.user.dto.Ab98UserDTO; +import com.agileboot.domain.ab98.user.model.Ab98UserModel; +import com.agileboot.domain.ab98.user.model.Ab98UserModelFactory; +import com.agileboot.domain.ab98.user.query.SearchAb98UserQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +@RequiredArgsConstructor +public class Ab98UserApplicationService { + private final Ab98UserService userService; + private final Ab98UserModelFactory userModelFactory; + + public PageDTO getUserList(SearchAb98UserQuery query) { + Page page = userService.getUserList(query); + List dtoList = page.getRecords().stream() + .map(Ab98UserDTO::new) + .collect(Collectors.toList()); + return new PageDTO<>(dtoList, page.getTotal()); + } + + public void addUser(AddAb98UserCommand command) { + Ab98UserModel model = userModelFactory.create(); + model.loadAddCommand(command); + model.insert(); + } + + public void updateUser(UpdateAb98UserCommand command) { + Ab98UserModel model = userModelFactory.loadById(command.getAb98UserId()); + model.loadUpdateCommand(command); + model.updateById(); + } + + public void deleteUser(BulkOperationCommand command) { + for (Long id : command.getIds()) { + Ab98UserModel model = userModelFactory.loadById(id); + model.deleteById(); + } + } + + public Ab98UserEntity getByUserId(Long userId) { + return userService.getById(userId); + } + + public Ab98UserEntity getByOpenid(String openid) { + return userService.getByOpenid(openid); + } +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/command/AddAb98UserCommand.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/command/AddAb98UserCommand.java new file mode 100644 index 0000000..f355c51 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/command/AddAb98UserCommand.java @@ -0,0 +1,11 @@ +package com.agileboot.domain.ab98.user.command; + +import com.agileboot.domain.ab98.user.db.Ab98UserEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class AddAb98UserCommand extends Ab98UserEntity { + +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/command/UpdateAb98UserCommand.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/command/UpdateAb98UserCommand.java new file mode 100644 index 0000000..95159f6 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/command/UpdateAb98UserCommand.java @@ -0,0 +1,15 @@ +package com.agileboot.domain.ab98.user.command; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.PositiveOrZero; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class UpdateAb98UserCommand extends AddAb98UserCommand { + + @NotNull + @PositiveOrZero + private Long ab98UserId; +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserEntity.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserEntity.java new file mode 100644 index 0000000..c14286c --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserEntity.java @@ -0,0 +1,84 @@ +package com.agileboot.domain.ab98.user.db; + +import com.agileboot.common.core.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 汇邦云用户信息表 + *

+ * + * @author valarchie + * @since 2025-05-10 + */ +@Getter +@Setter +@TableName("ab98_user") +@ApiModel(value = "Ab98UserEntity对象", description = "汇邦云用户信息表") +public class Ab98UserEntity extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键ID") + @TableId(value = "ab98_user_id", type = IdType.AUTO) + private Long ab98UserId; + + @ApiModelProperty("openid") + @TableField("openid") + private String openid; + + @ApiModelProperty("汇邦云用户唯一ID") + @TableField("userid") + private String userid; + + @ApiModelProperty("真实姓名") + @TableField("`name`") + private String name; + + @ApiModelProperty("手机号码") + @TableField("tel") + private String tel; + + @ApiModelProperty("身份证号码") + @TableField("idnum") + private String idnum; + + @ApiModelProperty("性别(男 女)") + @TableField("sex") + private String sex; + + @ApiModelProperty("人脸照片地址") + @TableField("face_img") + private String faceImg; + + @ApiModelProperty("身份证正面地址") + @TableField("idcard_front") + private String idcardFront; + + @ApiModelProperty("身份证背面地址") + @TableField("idcard_back") + private String idcardBack; + + @ApiModelProperty("身份证登记地址") + @TableField("address") + private String address; + + @ApiModelProperty("是否已注册(0未注册 1已注册)") + @TableField("registered") + private Boolean registered; + + + @Override + public Serializable pkVal() { + return this.ab98UserId; + } + +} diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserMapper.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserMapper.java new file mode 100644 index 0000000..6c38f08 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserMapper.java @@ -0,0 +1,46 @@ +package com.agileboot.domain.ab98.user.db; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + *

+ * 汇邦云用户信息表 Mapper 接口 + *

+ * + * @author valarchie + * @since 2025-05-10 + */ +public interface Ab98UserMapper extends BaseMapper { + @Select("SELECT ab98_user_id, openid, userid, name, tel, idnum, sex, face_img, idcard_front, idcard_back, address, registered " + + "FROM ab98_user " + + "${ew.customSqlSegment}") + Page getUserList( + Page page, + @Param(Constants.WRAPPER) Wrapper queryWrapper + ); + + @Select("SELECT * " + + "FROM ab98_user " + + "WHERE registered = '1' " + + "ORDER BY create_time DESC " + + "LIMIT 1") + Ab98UserEntity selectFirstRegisteredUser(); + + @Select("SELECT * " + + "FROM ab98_user " + + "WHERE registered = '1' " + + "ORDER BY create_time DESC") + List selectAllRegistered(); + + @Select("SELECT * FROM ab98_user WHERE userid = #{userid} LIMIT 1") + Ab98UserEntity selectByUserid(String userid); + + @Select("SELECT * FROM ab98_user WHERE openid = #{openid} LIMIT 1") + Ab98UserEntity selectByOpenid(String openid); +} diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserService.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserService.java new file mode 100644 index 0000000..a77ddc6 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserService.java @@ -0,0 +1,25 @@ +package com.agileboot.domain.ab98.user.db; + +import com.agileboot.common.core.page.AbstractPageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 汇邦云用户信息表 服务类 + *

+ * + * @author valarchie + * @since 2025-05-10 + */ +public interface Ab98UserService extends IService { + Page getUserList(AbstractPageQuery query); + + List selectAll(); + + Ab98UserEntity getByOpenid(String openid); + + Ab98UserEntity getByUserid(String userid); +} diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserServiceImpl.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserServiceImpl.java new file mode 100644 index 0000000..5a89966 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserServiceImpl.java @@ -0,0 +1,42 @@ +package com.agileboot.domain.ab98.user.db; + +import com.agileboot.common.core.page.AbstractPageQuery; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 汇邦云用户信息表 服务实现类 + *

+ * + * @author valarchie + * @since 2025-05-10 + */ +@Service +public class Ab98UserServiceImpl extends ServiceImpl implements Ab98UserService { + + @Override + public Page getUserList(AbstractPageQuery query) { + return this.page(query.toPage(), query.toQueryWrapper()); + } + + @Override + public List selectAll() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + return this.list(wrapper); + } + + @Override + public Ab98UserEntity getByOpenid(String openid) { + return baseMapper.selectByOpenid(openid); + } + + @Override + public Ab98UserEntity getByUserid(String userid) { + return baseMapper.selectByUserid(userid); + } +} diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/dto/Ab98UserDTO.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/dto/Ab98UserDTO.java new file mode 100644 index 0000000..b7c7882 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/dto/Ab98UserDTO.java @@ -0,0 +1,59 @@ +package com.agileboot.domain.ab98.user.dto; + +import cn.hutool.core.bean.BeanUtil; +import com.agileboot.common.annotation.ExcelColumn; +import com.agileboot.common.annotation.ExcelSheet; +import com.agileboot.domain.common.cache.CacheCenter; +import com.agileboot.domain.ab98.user.db.Ab98UserEntity; +import com.agileboot.domain.system.user.db.SysUserEntity; +import lombok.Data; + +@ExcelSheet(name = "汇邦云用户列表") +@Data +public class Ab98UserDTO { + + public Ab98UserDTO(Ab98UserEntity entity) { + if (entity != null) { + BeanUtil.copyProperties(entity, this); + + this.registeredStatus = entity.getRegistered() ? "已注册" : "未注册"; + } + } + + @ExcelColumn(name = "主键ID") + private Long ab98UserId; + + @ExcelColumn(name = "openid") + private String openid; + + @ExcelColumn(name = "用户唯一ID") + private String userid; + + @ExcelColumn(name = "真实姓名") + private String name; + + @ExcelColumn(name = "手机号码") + private String tel; + + @ExcelColumn(name = "身份证号码") + private String idnum; + + @ExcelColumn(name = "性别") + private String sex; + + @ExcelColumn(name = "人脸照片地址") + private String faceImg; + + @ExcelColumn(name = "身份证正面地址") + private String idcardFront; + + @ExcelColumn(name = "身份证背面地址") + private String idcardBack; + + @ExcelColumn(name = "身份证登记地址") + private String address; + + @ExcelColumn(name = "注册状态") + private String registeredStatus; + +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/model/Ab98UserModel.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/model/Ab98UserModel.java new file mode 100644 index 0000000..31004f7 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/model/Ab98UserModel.java @@ -0,0 +1,37 @@ +package com.agileboot.domain.ab98.user.model; + +import cn.hutool.core.bean.BeanUtil; +import com.agileboot.domain.ab98.user.db.Ab98UserEntity; +import com.agileboot.domain.ab98.user.db.Ab98UserService; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class Ab98UserModel extends Ab98UserEntity { + + private Ab98UserService userService; + + public Ab98UserModel(Ab98UserEntity entity, Ab98UserService userService) { + this(userService); + if (entity != null) { + BeanUtil.copyProperties(entity, this); + } + } + + public Ab98UserModel(Ab98UserService userService) { + this.userService = userService; + } + + public void loadAddCommand(Object command) { + if (command != null) { + BeanUtil.copyProperties(command, this, "id"); + } + } + + public void loadUpdateCommand(Object command) { + if (command != null) { + loadAddCommand(command); + } + } +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/model/Ab98UserModelFactory.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/model/Ab98UserModelFactory.java new file mode 100644 index 0000000..d022555 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/model/Ab98UserModelFactory.java @@ -0,0 +1,27 @@ +package com.agileboot.domain.ab98.user.model; + +import com.agileboot.common.exception.ApiException; +import com.agileboot.common.exception.error.ErrorCode; +import com.agileboot.domain.ab98.user.db.Ab98UserEntity; +import com.agileboot.domain.ab98.user.db.Ab98UserService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class Ab98UserModelFactory { + + private final Ab98UserService userService; + + public Ab98UserModel loadById(Long userId) { + Ab98UserEntity entity = userService.getById(userId); + if (entity == null) { + throw new ApiException(ErrorCode.Business.COMMON_OBJECT_NOT_FOUND, userId, "用户"); + } + return new Ab98UserModel(entity, userService); + } + + public Ab98UserModel create() { + return new Ab98UserModel(userService); + } +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/query/SearchAb98UserQuery.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/query/SearchAb98UserQuery.java new file mode 100644 index 0000000..a6fed8c --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/query/SearchAb98UserQuery.java @@ -0,0 +1,44 @@ +package com.agileboot.domain.ab98.user.query; + +import cn.hutool.core.util.StrUtil; +import com.agileboot.common.core.page.AbstractPageQuery; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import java.util.Date; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class SearchAb98UserQuery extends AbstractPageQuery { + + private Long ab98UserId; + private String openid; + private String userid; + private String name; + private String tel; + private String idnum; + private String sex; + private Boolean registered; + private Date startTime; + private Date endTime; + + @Override + public QueryWrapper addQueryCondition() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + queryWrapper + .eq(ab98UserId != null, "ab98_user_id", ab98UserId) + .eq(StrUtil.isNotEmpty(openid), "openid", openid) + .eq(StrUtil.isNotEmpty(userid), "userid", userid) + .like(StrUtil.isNotEmpty(name), "name", name) + .like(StrUtil.isNotEmpty(tel), "tel", tel) + .like(StrUtil.isNotEmpty(idnum), "idnum", idnum) + .eq(StrUtil.isNotEmpty(sex), "sex", sex) + .eq(registered != null, "registered", registered) + .between(startTime != null && endTime != null, "create_time", startTime, endTime); + + this.timeRangeColumn = "create_time"; + + return queryWrapper; + } +} \ No newline at end of file diff --git a/agileboot-domain/src/main/resources/mapper/ab98/Ab98UserMapper.xml b/agileboot-domain/src/main/resources/mapper/ab98/Ab98UserMapper.xml new file mode 100644 index 0000000..8422fcb --- /dev/null +++ b/agileboot-domain/src/main/resources/mapper/ab98/Ab98UserMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/mybatisplus/CodeGenerator.java b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/mybatisplus/CodeGenerator.java index 0868ecd..21fe63f 100644 --- a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/mybatisplus/CodeGenerator.java +++ b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/mybatisplus/CodeGenerator.java @@ -61,7 +61,7 @@ public class CodeGenerator { //生成的类 放在orm子模块下的/target/generated-code目录底下 .module("/agileboot-orm/target/generated-code") .parentPackage("com.agileboot") - .tableName("shop") + .tableName("ab98_user") // 决定是否继承基类 .isExtendsFromBaseEntity(true) .build(); diff --git a/sql/20250508_ab98_user.sql b/sql/20250508_ab98_user.sql new file mode 100644 index 0000000..6667a41 --- /dev/null +++ b/sql/20250508_ab98_user.sql @@ -0,0 +1,25 @@ +DROP TABLE IF EXISTS `ab98_user`; + +CREATE TABLE `ab98_user` ( + `ab98_user_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `openid` VARCHAR(32) NOT NULL COMMENT 'openid', + `userid` VARCHAR(100) NOT NULL COMMENT '汇邦云用户唯一ID', + `name` VARCHAR(50) NOT NULL COMMENT '真实姓名', + `tel` VARCHAR(20) NOT NULL COMMENT '手机号码', + `idnum` VARCHAR(20) NOT NULL COMMENT '身份证号码', + `sex` CHAR(8) NOT NULL COMMENT '性别(男 女)', + `face_img` VARCHAR(500) NOT NULL COMMENT '人脸照片地址', + `idcard_front` VARCHAR(500) COMMENT '身份证正面地址', + `idcard_back` VARCHAR(500) COMMENT '身份证背面地址', + `address` VARCHAR(200) COMMENT '身份证登记地址', + `registered` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否已注册(0未注册 1已注册)', + `creator_id` BIGINT DEFAULT 0 COMMENT '创建者ID', + `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater_id` BIGINT DEFAULT 0 COMMENT '更新者ID', + `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '删除标志(0存在 1删除)', + PRIMARY KEY (`ab98_user_id`), + KEY `idx_openid` (`openid`), + KEY `idx_tel` (`tel`), + KEY `idx_name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='汇邦云用户信息表'; \ No newline at end of file