Ver Fonte

1.后台用户列表
2.当前登录系统用户昵称与头像
3.提供oidc后台用户api

hr~ há 1 mês atrás
pai
commit
483712bfc4

+ 38 - 4
.gitignore

@@ -1,4 +1,38 @@
-*.class
-/.idea
-/py-base/target
-/py-starter/target
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store

+ 7 - 1
pom.xml

@@ -61,6 +61,11 @@
                 <artifactId>py-order</artifactId>
                 <version>${module.version}</version>
             </dependency>
+            <dependency>
+                <groupId>com.poyee</groupId>
+                <artifactId>py-account</artifactId>
+                <version>${module.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
@@ -69,6 +74,7 @@
         <module>py-base</module>
         <module>py-goods</module>
         <module>py-order</module>
+        <module>py-account</module>
     </modules>
 
     <build>
@@ -86,4 +92,4 @@
         </plugins>
     </build>
 
-</project>
+</project>

+ 32 - 0
py-account/pom.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.poyee</groupId>
+        <artifactId>tzy-admin</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>py-account</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.poyee</groupId>
+            <artifactId>py-base</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>

+ 27 - 0
py-account/src/main/java/com/poyee/controller/AppUserController.java

@@ -0,0 +1,27 @@
+package com.poyee.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.poyee.base.controller.BaseController;
+import com.poyee.base.dto.Result;
+import com.poyee.dto.AppUserListDTO;
+import com.poyee.req.AppUserQuery;
+import com.poyee.service.AppUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Api(tags = "用户管理")
+@RestController
+@RequestMapping("/account/user")
+public class AppUserController extends BaseController<AppUserService, AppUserQuery, AppUserListDTO> {
+
+    @PostMapping("/list")
+    @ApiOperation("用户列表")
+    public Result<AppUserListDTO> list(@RequestBody AppUserQuery query) {
+        Page<AppUserListDTO> page = baseService.selectList(query);
+        return Result.iPage(page);
+    }
+}

+ 29 - 0
py-account/src/main/java/com/poyee/controller/MerchantAccountController.java

@@ -0,0 +1,29 @@
+package com.poyee.controller;
+
+import com.poyee.dto.MerchantAccountResponseBody;
+import com.poyee.dto.MerchantUserExtraInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.util.MimeTypeUtils;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/api/local")
+@Api(tags = "商家账号兼容接口")
+public class MerchantAccountController {
+
+    @GetMapping(value = "/v1/user/role/permission", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+    @ApiOperation("根据角色编码查询权限列表")
+    public MerchantAccountResponseBody<String[]> getPermissionsByRoleCodes(
+            @ApiParam(value = "角色编码数组") @RequestParam(value = "roleCodes", required = false) String[] roleCodes) {
+        return MerchantAccountResponseBody.ok(new String[0]);
+    }
+
+    @GetMapping(value = "/v1/user/extra/{id}", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+    @ApiOperation("查询用户扩展信息")
+    public MerchantAccountResponseBody<MerchantUserExtraInfo> gerUserExtraInfo(
+            @ApiParam(value = "用户ID", required = true) @PathVariable("id") int userId) {
+        return MerchantAccountResponseBody.ok(new MerchantUserExtraInfo());
+    }
+}

+ 40 - 0
py-account/src/main/java/com/poyee/controller/SysUserController.java

@@ -0,0 +1,40 @@
+package com.poyee.controller;
+
+import com.poyee.annotation.I18nToken;
+import com.poyee.base.dto.Result;
+import com.poyee.dto.EndUserDTO;
+import com.poyee.dto.SysUserProfileDTO;
+import com.poyee.service.AppUserService;
+import com.poyee.service.SysUserService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Optional;
+
+@RestController
+@RequestMapping("/api/merchant")
+public class SysUserController {
+
+    @Resource
+    private SysUserService sysUserService;
+
+    @Resource
+    private AppUserService appUserService;
+
+    @GetMapping("/loginId/{loginId}")
+    public Optional<EndUserDTO> getUser(@PathVariable("loginId") String loginId) {
+        EndUserDTO user = sysUserService.loadUserByLoginId(loginId);
+        return user == null ? Optional.empty() : Optional.of(user);
+    }
+
+    @GetMapping("/profile")
+    @ApiOperation("当前登录系统用户昵称与头像")
+    @I18nToken
+    public Result<SysUserProfileDTO> profile() {
+        return Result.success(appUserService.getCurrentSysUserProfile());
+    }
+}

+ 38 - 0
py-account/src/main/java/com/poyee/dto/AppUserListDTO.java

@@ -0,0 +1,38 @@
+package com.poyee.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.poyee.base.dto.BaseDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("用户列表项")
+public class AppUserListDTO extends BaseDto {
+
+    @ApiModelProperty("用户id")
+    private Integer userId;
+
+    @ApiModelProperty("昵称")
+    private String nickname;
+
+    @ApiModelProperty("手机号")
+    private String phone;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty("注册时间")
+    private Date registerTime;
+
+    @ApiModelProperty("注册渠道")
+    private String registerChannel;
+
+    @ApiModelProperty("实名状态")
+    private Integer faceVerify;
+
+    @ApiModelProperty("头像")
+    private String avatar;
+}

+ 36 - 0
py-account/src/main/java/com/poyee/dto/EndUserDTO.java

@@ -0,0 +1,36 @@
+package com.poyee.dto;
+
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+public class EndUserDTO {
+
+    private int id;
+    private String username;
+    private String email;
+    private String phone;
+    private String displayName;
+    private String avatarUrl;
+    private String passwordHash;
+    private String salt;
+    private String code;
+    private String status;
+    private String identityType;
+    private LocalDateTime registrationTime;
+    private LocalDateTime lastLoginTime;
+    private EndUserProfile profile;
+    private List<String> roleCode;
+
+    @Data
+    public static class EndUserProfile {
+        private String realName;
+        private String gender;
+        private LocalDate birthday;
+        private String idCardNumber;
+        private String address;
+    }
+}

+ 26 - 0
py-account/src/main/java/com/poyee/dto/MerchantAccountResponseBody.java

@@ -0,0 +1,26 @@
+package com.poyee.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("商家账号兼容响应")
+public class MerchantAccountResponseBody<T> {
+    @ApiModelProperty(value = "响应码", example = "200")
+    private int code;
+
+    @ApiModelProperty(value = "响应消息", example = "success")
+    private String msg;
+
+    @ApiModelProperty(value = "响应数据")
+    private T data;
+
+    public static <T> MerchantAccountResponseBody<T> ok(T data) {
+        MerchantAccountResponseBody<T> response = new MerchantAccountResponseBody<>();
+        response.setCode(200);
+        response.setMsg("success");
+        response.setData(data);
+        return response;
+    }
+}

+ 31 - 0
py-account/src/main/java/com/poyee/dto/MerchantUserExtraInfo.java

@@ -0,0 +1,31 @@
+package com.poyee.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("商家用户扩展信息")
+public class MerchantUserExtraInfo {
+    @ApiModelProperty(value = "商家信息")
+    private Merchant merchant;
+
+    @ApiModelProperty(value = "角色编码列表")
+    private String[] roleCodeList = new String[0];
+
+    @ApiModelProperty(value = "权限编码列表")
+    private String[] permissionList = new String[0];
+
+    @Data
+    @ApiModel("商家信息")
+    public static class Merchant {
+        @ApiModelProperty(value = "商家ID", example = "1")
+        private int id;
+
+        @ApiModelProperty(value = "商家名称", example = "示例商家")
+        private String name;
+
+        @ApiModelProperty(value = "商家头像", example = "https://img.example/merchant.png")
+        private String avatar;
+    }
+}

+ 19 - 0
py-account/src/main/java/com/poyee/dto/SysUserProfileDTO.java

@@ -0,0 +1,19 @@
+package com.poyee.dto;
+
+import com.poyee.base.dto.BaseDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("系统用户简要信息")
+public class SysUserProfileDTO extends BaseDto {
+
+    @ApiModelProperty("昵称")
+    private String nickname;
+
+    @ApiModelProperty("头像")
+    private String avatar;
+}

+ 43 - 0
py-account/src/main/java/com/poyee/entity/SysUser.java

@@ -0,0 +1,43 @@
+package com.poyee.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.sql.Time;
+import java.util.Date;
+
+@Data
+public class SysUser implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Integer userId;
+    private Long deptId;
+    private String loginName;
+    private String userName;
+    private String userType;
+    private String email;
+    private String phonenumber;
+    private String sex;
+    private String avatar;
+    private String password;
+    private String salt;
+    private String status;
+    private String delFlag;
+    private String loginIp;
+    private Date loginDate;
+    private String createBy;
+    private Date createTime;
+    private String updateBy;
+    private Date updateTime;
+    private String remark;
+    private String custNo;
+    private String isSuper;
+    private String branchNo;
+    private Time pwdUpdateDate;
+    private String address;
+    private Date birthday;
+    private Date workStartDate;
+    private Integer fasAuth;
+    private String fasData;
+}

+ 18 - 0
py-account/src/main/java/com/poyee/mapper/AppUserMapper.java

@@ -0,0 +1,18 @@
+package com.poyee.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.poyee.base.mapper.IBaseMapper;
+import com.poyee.dto.AppUserListDTO;
+import com.poyee.dto.SysUserProfileDTO;
+import com.poyee.req.AppUserQuery;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface AppUserMapper extends IBaseMapper<AppUserListDTO> {
+
+    Page<AppUserListDTO> selectList(IPage<AppUserListDTO> page, @Param("query") AppUserQuery query);
+
+    SysUserProfileDTO selectSysUserProfile(@Param("userId") Long userId);
+}

+ 15 - 0
py-account/src/main/java/com/poyee/mapper/PoyeeSysUserMapper.java

@@ -0,0 +1,15 @@
+package com.poyee.mapper;
+
+import com.poyee.entity.SysUser;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface PoyeeSysUserMapper {
+
+    SysUser selectByLoginId(@Param("loginId") String loginId);
+
+    List<String> selectRoleKeysByUserId(@Param("userId") Integer userId);
+}

+ 36 - 0
py-account/src/main/java/com/poyee/req/AppUserQuery.java

@@ -0,0 +1,36 @@
+package com.poyee.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.poyee.base.dto.BaseReq;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("用户列表查询参数")
+public class AppUserQuery extends BaseReq {
+
+    @ApiModelProperty("昵称")
+    private String nickname;
+
+    @ApiModelProperty("手机号")
+    private String phone;
+
+    @ApiModelProperty("实名状态: 1已实名, 0未实名")
+    private Integer faceVerify;
+
+    @ApiModelProperty("注册渠道")
+    private String registerChannel;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty("注册时间开始")
+    private Date registerTimeStart;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty("注册时间结束")
+    private Date registerTimeEnd;
+}

+ 14 - 0
py-account/src/main/java/com/poyee/service/AppUserService.java

@@ -0,0 +1,14 @@
+package com.poyee.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.poyee.base.service.BaseService;
+import com.poyee.dto.AppUserListDTO;
+import com.poyee.dto.SysUserProfileDTO;
+import com.poyee.req.AppUserQuery;
+
+public interface AppUserService extends BaseService<AppUserQuery, AppUserListDTO> {
+
+    Page<AppUserListDTO> selectList(AppUserQuery query);
+
+    SysUserProfileDTO getCurrentSysUserProfile();
+}

+ 8 - 0
py-account/src/main/java/com/poyee/service/SysUserService.java

@@ -0,0 +1,8 @@
+package com.poyee.service;
+
+import com.poyee.dto.EndUserDTO;
+
+public interface SysUserService {
+
+    EndUserDTO loadUserByLoginId(String loginId);
+}

+ 33 - 0
py-account/src/main/java/com/poyee/service/impl/AppUserServiceImpl.java

@@ -0,0 +1,33 @@
+package com.poyee.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.poyee.base.service.impl.BaseServiceImpl;
+import com.poyee.dto.AppUserListDTO;
+import com.poyee.dto.SysUserProfileDTO;
+import com.poyee.mapper.AppUserMapper;
+import com.poyee.req.AppUserQuery;
+import com.poyee.service.AppUserService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AppUserServiceImpl extends BaseServiceImpl<AppUserMapper, AppUserQuery, AppUserListDTO> implements AppUserService {
+
+    public AppUserServiceImpl() {
+    }
+
+    public AppUserServiceImpl(AppUserMapper appUserMapper) {
+        this.baseMapper = appUserMapper;
+    }
+
+    @Override
+    public Page<AppUserListDTO> selectList(AppUserQuery query) {
+        AppUserQuery safeQuery = query == null ? new AppUserQuery() : query;
+        Page<AppUserListDTO> page = new Page<>(safeQuery.getPageNo(), safeQuery.getPageSize());
+        return baseMapper.selectList(page, safeQuery);
+    }
+
+    @Override
+    public SysUserProfileDTO getCurrentSysUserProfile() {
+        return baseMapper.selectSysUserProfile(getUserId());
+    }
+}

+ 77 - 0
py-account/src/main/java/com/poyee/service/impl/SysUserServiceImpl.java

@@ -0,0 +1,77 @@
+package com.poyee.service.impl;
+
+import com.poyee.dto.EndUserDTO;
+import com.poyee.entity.SysUser;
+import com.poyee.mapper.PoyeeSysUserMapper;
+import com.poyee.service.SysUserService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class SysUserServiceImpl implements SysUserService {
+
+    @Resource
+    private PoyeeSysUserMapper poyeeSysUserMapper;
+
+    public SysUserServiceImpl() {
+    }
+
+    public SysUserServiceImpl(PoyeeSysUserMapper poyeeSysUserMapper) {
+        this.poyeeSysUserMapper = poyeeSysUserMapper;
+    }
+
+    @Override
+    public EndUserDTO loadUserByLoginId(String loginId) {
+        SysUser sysUser = poyeeSysUserMapper.selectByLoginId(loginId);
+        if (sysUser == null) {
+            return null;
+        }
+
+        EndUserDTO dto = new EndUserDTO();
+        dto.setId(sysUser.getUserId() == null ? 0 : sysUser.getUserId());
+        dto.setUsername(sysUser.getLoginName());
+        dto.setEmail(sysUser.getEmail());
+        dto.setPhone(sysUser.getPhonenumber());
+        dto.setDisplayName(sysUser.getUserName());
+        dto.setAvatarUrl(sysUser.getAvatar());
+        dto.setPasswordHash(sysUser.getPassword());
+        dto.setSalt(sysUser.getSalt());
+        dto.setStatus(resolveStatus(sysUser));
+        dto.setIdentityType(sysUser.getUserType());
+        dto.setRegistrationTime(toLocalDateTime(sysUser.getCreateTime()));
+        dto.setLastLoginTime(toLocalDateTime(sysUser.getLoginDate()));
+        dto.setRoleCode(resolveRoleCodes(sysUser.getUserId()));
+
+        EndUserDTO.EndUserProfile profile = new EndUserDTO.EndUserProfile();
+        profile.setRealName(sysUser.getUserName());
+        profile.setGender(sysUser.getSex());
+        profile.setAddress(sysUser.getAddress());
+        dto.setProfile(profile);
+        return dto;
+    }
+
+    private List<String> resolveRoleCodes(Integer userId) {
+        if (userId == null) {
+            return Collections.emptyList();
+        }
+        List<String> roles = poyeeSysUserMapper.selectRoleKeysByUserId(userId);
+        return roles == null ? Collections.emptyList() : roles;
+    }
+
+    private String resolveStatus(SysUser sysUser) {
+        if (!"0".equals(sysUser.getDelFlag())) {
+            return "INACTIVE";
+        }
+        return "1".equals(sysUser.getStatus()) ? "ACTIVE" : "BANNED";
+    }
+
+    private LocalDateTime toLocalDateTime(Date date) {
+        return date == null ? null : LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
+    }
+}

+ 63 - 0
py-account/src/main/resources/mapper/AppUserMapper.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.poyee.mapper.AppUserMapper">
+
+    <resultMap id="appUserListMap" type="com.poyee.dto.AppUserListDTO">
+        <id column="user_id" property="userId"/>
+        <result column="nickname" property="nickname"/>
+        <result column="phone" property="phone"/>
+        <result column="register_time" property="registerTime"/>
+        <result column="register_channel" property="registerChannel"/>
+        <result column="face_verify" property="faceVerify"/>
+    </resultMap>
+
+    <select id="selectList" resultMap="appUserListMap">
+        select
+        abu.id as user_id,
+        abu.nickname,
+        aa.phone,
+        abu.create_time as register_time,
+        abu.register_channel,
+        abu.avatar,
+        coalesce(abu.face_verify, 0) as face_verify
+        from app_base_user abu
+        left join app_account aa on aa.account = abu.username and aa.del_flg = 0
+        <where>
+            and coalesce(abu.del_flg, 0) = 0
+            <if test="query.nickname != null and query.nickname != ''">
+                and abu.nickname like concat('%', #{query.nickname}, '%')
+            </if>
+            <if test="query.phone != null and query.phone != ''">
+                and aa.phone = #{query.phone}
+            </if>
+            <if test="query.faceVerify != null">
+                and coalesce(abu.face_verify, 0) = #{query.faceVerify}
+            </if>
+            <if test="query.registerChannel != null and query.registerChannel != ''">
+                and abu.register_channel = #{query.registerChannel}
+            </if>
+            <if test="query.registerTimeStart != null">
+                and abu.create_time &gt;= #{query.registerTimeStart}
+            </if>
+            <if test="query.registerTimeEnd != null">
+                and abu.create_time &lt;= #{query.registerTimeEnd}
+            </if>
+        </where>
+        order by abu.create_time desc, abu.id desc
+    </select>
+
+    <resultMap id="sysUserProfileMap" type="com.poyee.dto.SysUserProfileDTO">
+        <result column="user_name" property="nickname"/>
+        <result column="avatar" property="avatar"/>
+    </resultMap>
+
+    <select id="selectSysUserProfile" resultMap="sysUserProfileMap">
+        select su.user_name, su.avatar
+        from sys_user su
+        where su.user_id = #{userId}
+        and coalesce(su.del_flag, '0') = '0'
+        limit 1;
+    </select>
+</mapper>

+ 47 - 0
py-account/src/main/resources/mapper/PoyeeSysUserMapper.xml

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.poyee.mapper.PoyeeSysUserMapper">
+
+    <resultMap id="SysUserResult" type="com.poyee.entity.SysUser">
+        <id property="userId" column="user_id"/>
+        <result property="loginName" column="login_name"/>
+        <result property="userName" column="user_name"/>
+        <result property="userType" column="user_type"/>
+        <result property="email" column="email"/>
+        <result property="phonenumber" column="phonenumber"/>
+        <result property="sex" column="sex"/>
+        <result property="avatar" column="avatar"/>
+        <result property="password" column="password"/>
+        <result property="salt" column="salt"/>
+        <result property="status" column="status"/>
+        <result property="delFlag" column="del_flag"/>
+        <result property="loginDate" column="login_date"/>
+        <result property="createTime" column="create_time"/>
+        <result property="address" column="address"/>
+    </resultMap>
+
+    <select id="selectByLoginId" resultMap="SysUserResult">
+        select user_id, login_name, user_name, user_type, email, phonenumber,
+               sex, avatar, password, salt, status, del_flag, login_date,
+               create_time, address
+        from sys_user
+        where del_flag = '0'
+          and (
+              login_name = #{loginId}
+              or phonenumber = #{loginId}
+              or email = #{loginId}
+          )
+        limit 1
+    </select>
+
+    <select id="selectRoleKeysByUserId" resultType="string">
+        select r.role_key
+        from sys_user_role ur
+        inner join sys_role r on r.role_id = ur.role_id
+        where ur.user_id = #{userId}
+          and r.status = '0'
+        order by r.role_sort
+    </select>
+</mapper>

+ 4 - 0
py-starter/pom.xml

@@ -50,6 +50,10 @@
             <groupId>com.poyee</groupId>
             <artifactId>py-order</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.poyee</groupId>
+            <artifactId>py-account</artifactId>
+        </dependency>
 
     </dependencies>