|
@@ -274,51 +274,55 @@ export class CloudUser extends CloudObject {
|
|
|
/** 登录 */
|
|
|
// CloudUser.ts
|
|
|
async login(identifier: string, password: string): Promise<CloudUser | null> {
|
|
|
- try {
|
|
|
- // 创建查询条件数组
|
|
|
- const conditions = [
|
|
|
- { username: identifier },
|
|
|
- { email: identifier },
|
|
|
- { phone: identifier }
|
|
|
- ];
|
|
|
-
|
|
|
- const queries = conditions.map(cond => {
|
|
|
- const query = new CloudQuery(this.className);
|
|
|
- query.equalTo(Object.keys(cond)[0], Object.values(cond)[0]);
|
|
|
- return query.find();
|
|
|
- });
|
|
|
-
|
|
|
- const results = await Promise.all(queries);
|
|
|
-
|
|
|
- // 合并结果并去重
|
|
|
- const users = results.flat().filter((user, index, self) =>
|
|
|
- index === self.findIndex(u => u.id === user.id)
|
|
|
- );
|
|
|
-
|
|
|
- // 查找匹配密码的用户
|
|
|
- const user = users.find(u => u.get('password') === password);
|
|
|
-
|
|
|
- if (user) {
|
|
|
- // 设置当前用户信息
|
|
|
- this.id = user.id;
|
|
|
- this.set(user.data);
|
|
|
- this.sessionToken = `session_${Date.now()}`;
|
|
|
-
|
|
|
- // 保存到本地存储
|
|
|
- localStorage.setItem("NCloud/dev/User", JSON.stringify({
|
|
|
- ...this.data,
|
|
|
- objectId: this.id,
|
|
|
- sessionToken: this.sessionToken
|
|
|
- }));
|
|
|
-
|
|
|
- return this;
|
|
|
- }
|
|
|
- return null;
|
|
|
- } catch (error) {
|
|
|
- console.error('登录失败:', error);
|
|
|
- throw new Error('登录失败,请检查网络连接');
|
|
|
+ try {
|
|
|
+ // 使用$or查询优化登录
|
|
|
+ const query = new CloudQuery(this.className);
|
|
|
+ query.queryParams["where"] = {
|
|
|
+ $or: [
|
|
|
+ { username: identifier },
|
|
|
+ { email: identifier },
|
|
|
+ { phone: identifier }
|
|
|
+ ]
|
|
|
+ };
|
|
|
+
|
|
|
+ const users = await query.find();
|
|
|
+
|
|
|
+ // 精确匹配用户
|
|
|
+ const user = users.find(u => {
|
|
|
+ // 安全密码验证(实际应使用哈希比较)
|
|
|
+ return u.get('password') === password;
|
|
|
+ });
|
|
|
+
|
|
|
+ if (user) {
|
|
|
+ // 设置当前用户信息
|
|
|
+ this.id = user.id;
|
|
|
+ this.set(user.data);
|
|
|
+
|
|
|
+ // 生成安全的sessionToken
|
|
|
+ this.sessionToken = this.generateSessionToken();
|
|
|
+
|
|
|
+ // 保存到本地存储
|
|
|
+ localStorage.setItem("NCloud/dev/User", JSON.stringify({
|
|
|
+ ...this.data,
|
|
|
+ objectId: this.id,
|
|
|
+ sessionToken: this.sessionToken
|
|
|
+ }));
|
|
|
+
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ } catch (error) {
|
|
|
+ console.error('登录失败:', error);
|
|
|
+ throw new Error('登录失败,请检查凭证');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /** 生成安全的sessionToken */
|
|
|
+ private generateSessionToken(): string {
|
|
|
+ const array = new Uint32Array(10);
|
|
|
+ crypto.getRandomValues(array);
|
|
|
+ return Array.from(array, dec => dec.toString(16).padStart(8, '0')).join('');
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
/** 登出 */
|
|
|
async logout(): Promise<boolean> {
|
|
@@ -345,66 +349,70 @@ clearUserCache() {
|
|
|
// CloudUser.ts
|
|
|
async signUp(username: string, password: string, additionalData: Record<string, any> = {}): Promise<CloudUser | null> {
|
|
|
try {
|
|
|
- // 检查用户名是否已存在
|
|
|
- const usernameQuery = new CloudQuery(this.className);
|
|
|
- usernameQuery.equalTo("username", username);
|
|
|
- const existingUsers = await usernameQuery.find();
|
|
|
-
|
|
|
- if (existingUsers.length > 0) {
|
|
|
- throw new Error('用户名已被使用');
|
|
|
- }
|
|
|
-
|
|
|
- // 检查邮箱是否已存在
|
|
|
- if (additionalData["email"]) {
|
|
|
- const emailQuery = new CloudQuery(this.className);
|
|
|
- emailQuery.equalTo("email", additionalData["email"]);
|
|
|
- const existingEmails = await emailQuery.find();
|
|
|
+ // 检查用户名是否已存在
|
|
|
+ const usernameQuery = new CloudQuery(this.className);
|
|
|
+ usernameQuery.equalTo("username", username);
|
|
|
+ const existingUsers = await usernameQuery.find();
|
|
|
|
|
|
- if (existingEmails.length > 0) {
|
|
|
- throw new Error('邮箱已被注册');
|
|
|
+ if (existingUsers.length > 0) {
|
|
|
+ throw new Error('用户名已被使用');
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- // 检查手机号是否已存在
|
|
|
- if (additionalData["phone"]) {
|
|
|
- const phoneQuery = new CloudQuery(this.className);
|
|
|
- phoneQuery.equalTo("phone", additionalData["phone"]);
|
|
|
- const existingPhones = await phoneQuery.find();
|
|
|
|
|
|
- if (existingPhones.length > 0) {
|
|
|
- throw new Error('手机号已被注册');
|
|
|
+ // 检查邮箱是否已存在
|
|
|
+ if (additionalData["email"]) {
|
|
|
+ const emailQuery = new CloudQuery(this.className);
|
|
|
+ emailQuery.equalTo("email", additionalData["email"]);
|
|
|
+ const existingEmails = await emailQuery.find();
|
|
|
+
|
|
|
+ if (existingEmails.length > 0) {
|
|
|
+ throw new Error('邮箱已被注册');
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- // 创建新用户
|
|
|
- const userObj = new CloudObject(this.className);
|
|
|
- userObj.set({
|
|
|
- username,
|
|
|
- password,
|
|
|
- ...additionalData,
|
|
|
- createdAt: new Date(),
|
|
|
- updatedAt: new Date()
|
|
|
- });
|
|
|
-
|
|
|
- const savedUser = await userObj.save();
|
|
|
-
|
|
|
- // 设置当前用户信息
|
|
|
- this.id = savedUser.id;
|
|
|
- this.set(savedUser.data);
|
|
|
- this.sessionToken = `session_${Date.now()}`;
|
|
|
-
|
|
|
- // 保存到本地存储
|
|
|
- localStorage.setItem("NCloud/dev/User", JSON.stringify({
|
|
|
- ...this.data,
|
|
|
- objectId: this.id,
|
|
|
- sessionToken: this.sessionToken
|
|
|
- }));
|
|
|
-
|
|
|
- return this;
|
|
|
- } catch (error) {
|
|
|
- console.error('注册失败:', error);
|
|
|
- throw error;
|
|
|
- }
|
|
|
+
|
|
|
+ // 检查手机号是否已存在
|
|
|
+ if (additionalData["phone"]) {
|
|
|
+ const phoneQuery = new CloudQuery(this.className);
|
|
|
+ phoneQuery.equalTo("phone", additionalData["phone"]);
|
|
|
+ const existingPhones = await phoneQuery.find();
|
|
|
+
|
|
|
+ if (existingPhones.length > 0) {
|
|
|
+ throw new Error('手机号已被注册');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建新用户
|
|
|
+ const userObj = new CloudObject(this.className);
|
|
|
+ userObj.set({
|
|
|
+ username,
|
|
|
+ password,
|
|
|
+ ...additionalData,
|
|
|
+ createdAt: new Date(),
|
|
|
+ updatedAt: new Date()
|
|
|
+ });
|
|
|
+
|
|
|
+ const savedUser = await userObj.save();
|
|
|
+
|
|
|
+ // 设置当前用户信息
|
|
|
+ this.id = savedUser.id;
|
|
|
+ this.set(savedUser.data);
|
|
|
+ this.sessionToken = `session_${Date.now()}`;
|
|
|
+
|
|
|
+ // 保存到本地存储
|
|
|
+ localStorage.setItem("NCloud/dev/User", JSON.stringify({
|
|
|
+ ...this.data,
|
|
|
+ objectId: this.id,
|
|
|
+ sessionToken: this.sessionToken
|
|
|
+ }));
|
|
|
+
|
|
|
+ // 注册后自动登录
|
|
|
+ return await this.login(username, password);
|
|
|
+
|
|
|
+ } catch (error) {
|
|
|
+ console.error('注册失败:', error);
|
|
|
+ throw error;
|
|
|
+ } finally {
|
|
|
+ // 可选:清理操作
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
override async save() {
|