140 lines
5.0 KiB
Java
140 lines
5.0 KiB
Java
/**
|
||
* 自然写互动课堂教学管理云平台软件 V1.0
|
||
*
|
||
* 数据模型 - 用户实体
|
||
* 对应数据表:user (MySQL)
|
||
* 支持教师/学生/管理员/家长四种角色
|
||
*/
|
||
package com.writech.cloud.model;
|
||
|
||
import javax.persistence.*;
|
||
import java.time.LocalDateTime;
|
||
|
||
/**
|
||
* 用户主表实体类
|
||
*
|
||
* RBAC角色定义:
|
||
* - admin:系统管理员(学校/用户/设备管理全权限)
|
||
* - teacher:教师(班级管理/作业发布/学情查看)
|
||
* - student:学生(作业查看/学习数据查询)
|
||
* - parent:家长(子女学情查看/消息接收)
|
||
*
|
||
* 安全设计:
|
||
* - 手机号使用AES-256加密存储(encryptedPhone字段)
|
||
* - 密码使用BCrypt哈希存储
|
||
* - 身份证号等敏感信息加密后存储
|
||
*/
|
||
@Entity
|
||
@Table(name = "user", indexes = {
|
||
@Index(name = "idx_phone", columnList = "encryptedPhone"),
|
||
@Index(name = "idx_school_role", columnList = "schoolId, role"),
|
||
@Index(name = "idx_wechat", columnList = "wechatOpenId")
|
||
})
|
||
public class User {
|
||
|
||
/** 用户唯一ID(UUID格式) */
|
||
@Id
|
||
@Column(length = 32)
|
||
private String id;
|
||
|
||
/** 用户姓名 */
|
||
@Column(nullable = false, length = 64)
|
||
private String name;
|
||
|
||
/** 手机号(明文,仅用于内部处理,不直接存储) */
|
||
@Transient
|
||
private String phone;
|
||
|
||
/** 加密后的手机号(AES-256-CBC加密存储) */
|
||
@Column(length = 128)
|
||
private String encryptedPhone;
|
||
|
||
/** 密码哈希(BCrypt,强度因子10) */
|
||
@Column(length = 128)
|
||
private String passwordHash;
|
||
|
||
/** 用户角色:admin/teacher/student/parent */
|
||
@Column(nullable = false, length = 16)
|
||
private String role;
|
||
|
||
/** 所属学校ID */
|
||
@Column(length = 32)
|
||
private String schoolId;
|
||
|
||
/** 所属学校名称(冗余存储,减少关联查询) */
|
||
@Column(length = 128)
|
||
private String schoolName;
|
||
|
||
/** 头像URL */
|
||
@Column(length = 256)
|
||
private String avatar;
|
||
|
||
/** 微信OpenID(第三方登录绑定) */
|
||
@Column(length = 64)
|
||
private String wechatOpenId;
|
||
|
||
/** 钉钉用户ID(第三方登录绑定) */
|
||
@Column(length = 64)
|
||
private String dingtalkUserId;
|
||
|
||
/** 账户状态:1=正常, 0=禁用, -1=注销 */
|
||
@Column(nullable = false)
|
||
private int status = 1;
|
||
|
||
/** Token版本号(用于使所有旧Token失效) */
|
||
@Column(nullable = false)
|
||
private int tokenVersion = 0;
|
||
|
||
/** 账户创建时间 */
|
||
@Column(nullable = false)
|
||
private LocalDateTime createTime;
|
||
|
||
/** 最后登录时间 */
|
||
private LocalDateTime lastLoginTime;
|
||
|
||
/** 最后登录IP */
|
||
@Column(length = 45)
|
||
private String lastLoginIp;
|
||
|
||
// ==================== Getter / Setter ====================
|
||
|
||
public String getId() { return id; }
|
||
public void setId(String id) { this.id = id; }
|
||
public String getName() { return name; }
|
||
public void setName(String name) { this.name = name; }
|
||
public String getPhone() { return phone; }
|
||
public void setPhone(String phone) { this.phone = phone; }
|
||
public String getEncryptedPhone() { return encryptedPhone; }
|
||
public void setEncryptedPhone(String encryptedPhone) { this.encryptedPhone = encryptedPhone; }
|
||
public String getPasswordHash() { return passwordHash; }
|
||
public void setPasswordHash(String passwordHash) { this.passwordHash = passwordHash; }
|
||
public String getRole() { return role; }
|
||
public void setRole(String role) { this.role = role; }
|
||
public String getSchoolId() { return schoolId; }
|
||
public void setSchoolId(String schoolId) { this.schoolId = schoolId; }
|
||
public String getSchoolName() { return schoolName; }
|
||
public void setSchoolName(String schoolName) { this.schoolName = schoolName; }
|
||
public String getAvatar() { return avatar; }
|
||
public void setAvatar(String avatar) { this.avatar = avatar; }
|
||
public String getWechatOpenId() { return wechatOpenId; }
|
||
public void setWechatOpenId(String wechatOpenId) { this.wechatOpenId = wechatOpenId; }
|
||
public String getDingtalkUserId() { return dingtalkUserId; }
|
||
public void setDingtalkUserId(String dingtalkUserId) { this.dingtalkUserId = dingtalkUserId; }
|
||
public int getStatus() { return status; }
|
||
public void setStatus(int status) { this.status = status; }
|
||
public int getTokenVersion() { return tokenVersion; }
|
||
public void setTokenVersion(int tokenVersion) { this.tokenVersion = tokenVersion; }
|
||
public LocalDateTime getCreateTime() { return createTime; }
|
||
public void setCreateTime(LocalDateTime createTime) { this.createTime = createTime; }
|
||
public LocalDateTime getLastLoginTime() { return lastLoginTime; }
|
||
public void setLastLoginTime(LocalDateTime lastLoginTime) { this.lastLoginTime = lastLoginTime; }
|
||
public String getLastLoginIp() { return lastLoginIp; }
|
||
public void setLastLoginIp(String lastLoginIp) { this.lastLoginIp = lastLoginIp; }
|
||
|
||
@Override
|
||
public String toString() {
|
||
return "User{id='" + id + "', name='" + name + "', role='" + role
|
||
+ "', schoolId='" + schoolId + "', status=" + status + "}";
|
||
}
|
||
}
|