tab3.page.ts 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. import { Component, OnInit } from '@angular/core';
  2. import { Router } from '@angular/router';
  3. import {
  4. IonHeader,
  5. IonToolbar,
  6. IonTitle,
  7. IonContent,
  8. IonCard,
  9. IonCardHeader,
  10. IonCardContent,
  11. IonItem,
  12. IonAvatar,
  13. IonLabel,
  14. IonButton,
  15. IonIcon,
  16. IonList,
  17. IonListHeader,
  18. IonBadge,
  19. IonInput,
  20. AlertController
  21. } from '@ionic/angular/standalone';
  22. import { NgIf } from '@angular/common';
  23. import { FormsModule } from '@angular/forms';
  24. import { addIcons } from 'ionicons';
  25. import {
  26. personOutline,
  27. createOutline,
  28. trophyOutline,
  29. timeOutline,
  30. cardOutline,
  31. bookOutline,
  32. receiptOutline,
  33. notificationsOutline,
  34. lockClosedOutline,
  35. informationCircleOutline,
  36. chevronForward,
  37. mailOutline,
  38. keyOutline,
  39. settingsOutline,
  40. starOutline
  41. } from 'ionicons/icons';
  42. import Parse from 'parse';
  43. @Component({
  44. selector: 'app-tab3',
  45. templateUrl: 'tab3.page.html',
  46. styleUrls: ['tab3.page.scss'],
  47. standalone: true,
  48. imports: [
  49. IonHeader,
  50. IonToolbar,
  51. IonTitle,
  52. IonContent,
  53. IonCard,
  54. IonCardHeader,
  55. IonCardContent,
  56. IonItem,
  57. IonAvatar,
  58. IonLabel,
  59. IonButton,
  60. IonIcon,
  61. IonList,
  62. IonListHeader,
  63. IonBadge,
  64. IonInput,
  65. NgIf,
  66. FormsModule
  67. ]
  68. })
  69. export class Tab3Page implements OnInit {
  70. isLoggedIn: boolean = false;
  71. userAvatar: string = 'assets/default-avatar.png';
  72. userName: string = '';
  73. userLevel: string = 'LV.1 新手学习者';
  74. achievementCount: number = 0;
  75. // 登录表单数据
  76. loginData = {
  77. username: '',
  78. password: ''
  79. };
  80. // 注册表单数据
  81. registerData = {
  82. username: '',
  83. email: '',
  84. password: '',
  85. confirmPassword: ''
  86. };
  87. // 是否显示注册表单
  88. showRegisterForm: boolean = false;
  89. constructor(
  90. private router: Router,
  91. private alertController: AlertController
  92. ) {
  93. addIcons({
  94. personOutline,
  95. createOutline,
  96. trophyOutline,
  97. timeOutline,
  98. cardOutline,
  99. bookOutline,
  100. receiptOutline,
  101. notificationsOutline,
  102. lockClosedOutline,
  103. informationCircleOutline,
  104. chevronForward,
  105. mailOutline,
  106. keyOutline,
  107. settingsOutline,
  108. starOutline
  109. });
  110. }
  111. ngOnInit() {
  112. // 检查是否已登录
  113. const currentUser = Parse.User.current();
  114. if (currentUser) {
  115. this.isLoggedIn = true;
  116. this.userName = currentUser.get('username');
  117. this.userAvatar = currentUser.get('avatar') || 'assets/default-avatar.png';
  118. }
  119. }
  120. // 切换注册/登录表单
  121. toggleForm() {
  122. this.showRegisterForm = !this.showRegisterForm;
  123. }
  124. // 处理登录
  125. async handleLogin() {
  126. try {
  127. // 基本的输入验证
  128. if (!this.loginData.username || !this.loginData.password) {
  129. const alert = await this.alertController.create({
  130. header: '提示',
  131. message: '请输入用户名和密码',
  132. buttons: ['确定']
  133. });
  134. await alert.present();
  135. return;
  136. }
  137. // 执行登录
  138. const user = await Parse.User.logIn(this.loginData.username, this.loginData.password);
  139. // 更新界面状态
  140. this.isLoggedIn = true;
  141. this.userName = user.get('username');
  142. this.userLevel = user.get('level') || 'LV.1 新手学习者';
  143. this.userAvatar = user.get('avatar') || 'assets/default-avatar.png';
  144. // 显示登录成功提示
  145. const alert = await this.alertController.create({
  146. header: '成功',
  147. message: '登录成功!',
  148. buttons: ['确定']
  149. });
  150. await alert.present();
  151. } catch (error: any) {
  152. console.error('登录错误:', error);
  153. let errorMessage = '登录失败,请稍后重试';
  154. if (error.code === 101) {
  155. errorMessage = '用户名或密码错误';
  156. }
  157. const alert = await this.alertController.create({
  158. header: '错误',
  159. message: errorMessage,
  160. buttons: ['确定']
  161. });
  162. await alert.present();
  163. }
  164. }
  165. // 处理注册
  166. async handleRegister() {
  167. try {
  168. // 基本的输入验证
  169. if (!this.registerData.username || !this.registerData.email || !this.registerData.password) {
  170. const alert = await this.alertController.create({
  171. header: '提示',
  172. message: '请填写所有必填字段',
  173. buttons: ['确定']
  174. });
  175. await alert.present();
  176. return;
  177. }
  178. // 验证邮箱格式
  179. const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  180. if (!emailRegex.test(this.registerData.email)) {
  181. const alert = await this.alertController.create({
  182. header: '错误',
  183. message: '请输入正确的邮箱格式',
  184. buttons: ['确定']
  185. });
  186. await alert.present();
  187. return;
  188. }
  189. // 验证密码是否匹配
  190. if (this.registerData.password !== this.registerData.confirmPassword) {
  191. const alert = await this.alertController.create({
  192. header: '错误',
  193. message: '两次输入的密码不一致',
  194. buttons: ['确定']
  195. });
  196. await alert.present();
  197. return;
  198. }
  199. // 验证密码长度
  200. if (this.registerData.password.length < 6) {
  201. const alert = await this.alertController.create({
  202. header: '错误',
  203. message: '密码长度至少为6位',
  204. buttons: ['确定']
  205. });
  206. await alert.present();
  207. return;
  208. }
  209. // 验证用户名长度
  210. if (this.registerData.username.length < 3) {
  211. const alert = await this.alertController.create({
  212. header: '错误',
  213. message: '用户名长度至少为3位',
  214. buttons: ['确定']
  215. });
  216. await alert.present();
  217. return;
  218. }
  219. // 创建新用户
  220. const user = new Parse.User();
  221. user.set('username', this.registerData.username.trim());
  222. user.set('email', this.registerData.email.trim().toLowerCase());
  223. user.set('password', this.registerData.password);
  224. // 设置初始用户信息
  225. user.set('level', 'LV.1 新手学习者');
  226. user.set('avatar', 'assets/default-avatar.png');
  227. user.set('achievementCount', 0);
  228. user.set('learningDays', 0);
  229. user.set('completionRate', 0);
  230. await user.signUp();
  231. // 注册成功后自动登录
  232. this.isLoggedIn = true;
  233. this.userName = user.get('username');
  234. this.userLevel = user.get('level');
  235. this.userAvatar = user.get('avatar');
  236. // 注册成功提示
  237. const alert = await this.alertController.create({
  238. header: '成功',
  239. message: '注册成功!',
  240. buttons: ['确定']
  241. });
  242. await alert.present();
  243. } catch (error: any) {
  244. console.error('注册错误:', error);
  245. let errorMessage = '注册失败,请稍后重试';
  246. // 处理常见错误
  247. switch(error.code) {
  248. case 202:
  249. errorMessage = '用户名已存在';
  250. break;
  251. case 203:
  252. errorMessage = '邮箱已被使用';
  253. break;
  254. case 125:
  255. errorMessage = '邮箱格式不正确';
  256. break;
  257. case 201:
  258. errorMessage = '密码不能为空';
  259. break;
  260. default:
  261. if (error.message.includes('Email')) {
  262. errorMessage = '请输入正确的邮箱格式';
  263. }
  264. }
  265. const alert = await this.alertController.create({
  266. header: '错误',
  267. message: errorMessage,
  268. buttons: ['确定']
  269. });
  270. await alert.present();
  271. }
  272. }
  273. // 编辑个人资料
  274. editProfile() {
  275. this.navigateTo('profile');
  276. }
  277. // 导航到指定页面
  278. navigateTo(page: string) {
  279. this.router.navigate([`/tabs/tab3/${page}`]);
  280. }
  281. // 退出登录
  282. async logout() {
  283. const alert = await this.alertController.create({
  284. header: '确认退出',
  285. message: '您确定要退出登录吗?',
  286. buttons: [
  287. {
  288. text: '取消',
  289. role: 'cancel'
  290. },
  291. {
  292. text: '确定',
  293. handler: async () => {
  294. try {
  295. await Parse.User.logOut();
  296. this.isLoggedIn = false;
  297. this.userName = '';
  298. this.userAvatar = 'assets/default-avatar.png';
  299. } catch (error) {
  300. console.error('退出登录失败:', error);
  301. }
  302. }
  303. }
  304. ]
  305. });
  306. await alert.present();
  307. }
  308. }