123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- import { Component, Input, OnInit, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
- import { FormsModule } from '@angular/forms';
- import { IonButton, IonCard, IonCardContent, IonCardHeader, IonCardSubtitle, IonCardTitle, IonContent, IonHeader, IonInput, IonItem, IonLabel, IonSegment, IonSegmentButton, IonTitle, IonToolbar, ModalController, ToastController, IonIcon } from '@ionic/angular/standalone';
- import { addIcons } from 'ionicons';
- import { personOutline, lockClosedOutline } from 'ionicons/icons';
- import { CloudUser } from '../../ncloud';
- @Component({
- selector: 'model-user-login',
- templateUrl: './model-user-login.component.html',
- styleUrls: ['./model-user-login.component.scss'],
- standalone: true,
- schemas: [CUSTOM_ELEMENTS_SCHEMA],
- imports: [
- FormsModule,
- IonHeader,
- IonToolbar,
- IonTitle,
- IonContent,
- IonCard,
- IonCardContent,
- IonButton,
- IonCardHeader,
- IonCardTitle,
- IonCardSubtitle,
- IonInput,
- IonItem,
- IonSegment,
- IonSegmentButton,
- IonLabel,
- IonIcon
- ],
- })
- export class ModelUserLoginComponent implements OnInit {
- @Input()
- type: "login" | "signup" = "login"
- // 添加回 typeChange 方法
- typeChange(ev: any) {
- this.type = ev?.detail?.value || ev?.value || 'login';
- // 切换类型时清空错误信息和密码
- this.errorMessage = '';
- this.password = '';
- this.password2 = '';
- }
- // 添加 isSignup 计算属性
- get isSignup(): boolean {
- return this.type === 'signup';
- }
- username: string = ""
- password: string = ""
- password2: string = ""
- errorMessage: string = ""
- constructor(
- private modalCtrl: ModalController,
- private toastCtrl: ToastController
- ) {
- addIcons({
- 'person-outline': personOutline,
- 'lock-closed-outline': lockClosedOutline
- });
- }
- ngOnInit() { }
- // 验证用户名
- validateUsername(): boolean {
- if (!this.username) {
- this.showError('用户名不能为空');
- return false;
- }
- if (this.username.length < 3) {
- this.showError('用户名长度不能少于3个字符');
- return false;
- }
- if (this.username.length > 20) {
- this.showError('用户名长度不能超过20个字符');
- return false;
- }
- if (!/^[a-zA-Z0-9_\u4e00-\u9fa5]+$/.test(this.username)) {
- this.showError('用户名只能包含字母、数字、下划线和中文');
- return false;
- }
- return true;
- }
- // 验证密码
- validatePassword(): boolean {
- if (!this.password) {
- this.showError('密码不能为空');
- return false;
- }
- if (this.password.length < 6) {
- this.showError('密码长度不能少于6个字符');
- return false;
- }
- if (this.password.length > 20) {
- this.showError('密码长度不能超过20个字符');
- return false;
- }
- if (!/^[a-zA-Z0-9_]+$/.test(this.password)) {
- this.showError('密码只能包含字母、数字和下划线');
- return false;
- }
- return true;
- }
- // 验证确认密码
- validateConfirmPassword(): boolean {
- if (this.password !== this.password2) {
- this.showError('两次输入的密码不一致');
- return false;
- }
- return true;
- }
- async showError(message: string) {
- this.errorMessage = message;
- const toast = await this.toastCtrl.create({
- message: message,
- duration: 2000,
- position: 'top',
- color: 'danger',
- cssClass: 'error-toast'
- });
- await toast.present();
- }
- async showSuccess(message: string) {
- const toast = await this.toastCtrl.create({
- message: message,
- duration: 2000,
- position: 'top',
- color: 'success',
- cssClass: 'success-toast'
- });
- await toast.present();
- }
- async login() {
- this.errorMessage = '';
- if (!this.validateUsername() || !this.validatePassword()) {
- return;
- }
- try {
- let user: any = new CloudUser();
- user = await user.login(this.username, this.password);
- if (user?.id) {
- await this.showSuccess('登录成功');
- this.modalCtrl.dismiss(user, "confirm");
- } else {
- this.showError('用户名或密码错误');
- }
- } catch (error) {
- this.showError('登录失败,请稍后重试');
- }
- }
- async signup() {
- this.errorMessage = '';
- if (!this.validateUsername() || !this.validatePassword() || !this.validateConfirmPassword()) {
- return;
- }
- try {
- let user: any = new CloudUser();
- user = await user.signUp(this.username, this.password);
- if (user) {
- await this.showSuccess('注册成功,请登录');
- this.type = "login";
- this.password = '';
- this.password2 = '';
- } else {
- this.showError('注册失败,该用户名可能已被使用');
- }
- } catch (error) {
- this.showError('注册失败,请稍后重试');
- }
- }
- }
- export async function openUserLoginModal(modalCtrl: ModalController, type: "login" | "signup" = "login"): Promise<CloudUser | null> {
- const modal = await modalCtrl.create({
- component: ModelUserLoginComponent,
- componentProps: {
- type: type
- },
- breakpoints: [0, 0.6, 0.8],
- initialBreakpoint: 0.6,
- backdropBreakpoint: 0.6,
- cssClass: 'login-modal'
- });
- modal.present();
- const { data, role } = await modal.onWillDismiss();
- if (role === 'confirm') {
- return data;
- }
- return null
- }
|