Files
2026-03-22 15:24:40 +08:00

140 lines
5.0 KiB
Java
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 自然写互动课堂教学管理云平台软件 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 {
/** 用户唯一IDUUID格式) */
@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 + "}";
}
}