LoginViewModel.ets 6.77 KB
import { Logger } from 'wdKit/src/main/ets/utils/Logger'
import { LoginModel } from './LoginModel'
import { LoginBean } from './LoginBean'
import { SPHelper } from 'wdKit'
import { CheckVerifyBean } from './CheckVerifyBean'
import cryptoFramework from '@ohos.security.cryptoFramework'
import buffer from '@ohos.buffer'
import {
  SpConstants
} from '../../../../../../../commons/wdNetwork/oh_modules/wdConstant/src/main/ets/constants/SpConstants'
import { HttpUrlUtils } from 'wdNetwork/src/main/ets/http/HttpUrlUtils'

const TAG = "LoginViewModel"

export class LoginViewModel {
  loginModel: LoginModel

  constructor() {
    this.loginModel = new LoginModel()
  }

  //发送验证码
  sendVerifyCode(number: string) {
    return new Promise<string>((success, fail) => {
      this.loginModel.sendVerifyCode(number).then((data) => {
        success(data)
      }).catch((message: string) => {
        fail(message)
      })
    })

  }

  sendVerifyCodeByToken() {
    return new Promise<string>((success, fail) => {
      this.loginModel.sendVerifyCodeByToken().then((data) => {
        success(data)
      }).catch((message: string) => {
        fail(message)
      })
    })

  }

  appLogin(phone: string, loginType: number, verificationCode: string) {

    return new Promise<LoginBean>((success, fail) => {
      this.loginModel.appLogin(phone, loginType, verificationCode).then((data: LoginBean) => {
        SPHelper.default.save(SpConstants.USER_FIRST_MARK, data.firstMark)
        SPHelper.default.save(SpConstants.USER_ID, data.id)
        SPHelper.default.save(SpConstants.USER_JWT_TOKEN, data.jwtToken)
        SPHelper.default.save(SpConstants.USER_LONG_TIME_NO_LOGIN_MARK, data.longTimeNoLoginMark)
        SPHelper.default.save(SpConstants.USER_REFRESH_TOKEN, data.refreshToken)
        SPHelper.default.save(SpConstants.USER_STATUS, data.status)
        SPHelper.default.save(SpConstants.USER_Type, data.userType)
        SPHelper.default.save(SpConstants.USER_NAME, data.userName)
        HttpUrlUtils.setUserId(data.id+"")
        HttpUrlUtils.setUserType(data.userType+"")
        HttpUrlUtils.setUserToken(data.jwtToken)
        success(data)
      }).catch(() => {
        fail()
      })
    })
  }

  async appLoginByPassword(phone: string, loginType: number, password: string, oldPassword: string) {

    return new Promise<LoginBean>(async (success, fail) => {
      let passwordNew = await this.doMd(password)
      Logger.debug(TAG, "PASSWORD:" + passwordNew)
      this.loginModel.appLoginByPassword(phone, loginType, passwordNew, oldPassword).then((data: LoginBean) => {
        SPHelper.default.save(SpConstants.USER_FIRST_MARK, data.firstMark)
        SPHelper.default.save(SpConstants.USER_ID, data.id)
        SPHelper.default.save(SpConstants.USER_JWT_TOKEN, data.jwtToken)
        SPHelper.default.save(SpConstants.USER_LONG_TIME_NO_LOGIN_MARK, data.longTimeNoLoginMark)
        SPHelper.default.save(SpConstants.USER_REFRESH_TOKEN, data.refreshToken)
        SPHelper.default.save(SpConstants.USER_STATUS, data.status)
        SPHelper.default.save(SpConstants.USER_Type, data.userType)
        SPHelper.default.save(SpConstants.USER_NAME, data.userName)
        HttpUrlUtils.setUserId(data.id+"")
        HttpUrlUtils.setUserType(data.userType+"")
        HttpUrlUtils.setUserToken(data.jwtToken)
        success(data)
      }).catch((value: string) => {
        fail(value)
      })
    })
  }

  //{"code":"0","data":{"tempToken":"eyJhbGciOiJIUzI1NiIsImtpZCI6ImQ4WkI2QkhxSEZrdjJ2U25BNlRwZEdKRjBHcjItVzBvS2FaYzdLOUUycmcifQ.eyJpc3MiOiJwZW9wbGVzLWRhaWx5LWZvdXJhIiwic3ViIjoicGVvcGxlcy1kYWlseS1mb3VyYSIsImV4cCI6MTcxMDQ2ODE5NCwidXNlcklkIjpudWxsLCJ1c2VyVmVyc2lvbiI6Im51bGxfbnVsbCIsInVzZXJOYW1lIjpudWxsLCJ1c2VyVHlwZSI6bnVsbCwiY3JlYXRvcklkIjpudWxsLCJ1c2VySWRaaCI6bnVsbH0.R5gv44Gyni3QTxtWvSxYn0eMuUD5_bI1hh9TaThq25g","jwtToken":"eyJhbGciOiJIUzI1NiIsImtpZCI6ImQ4WkI2QkhxSEZrdjJ2U25BNlRwZEdKRjBHcjItVzBvS2FaYzdLOUUycmcifQ.eyJpc3MiOiJwZW9wbGVzLWRhaWx5LWZvdXJhIiwic3ViIjoicGVvcGxlcy1kYWlseS1mb3VyYSIsImV4cCI6MTcxMDY0NzU5NCwidXNlcklkIjo1NjkzNTAwNzk4ODk2NjksInVzZXJWZXJzaW9uIjoiNTY5MzUwMDc5ODg5NjY5XzAiLCJ1c2VyTmFtZSI6IiVFNCVCQSVCQSVFNiVCMCU5MSVFNiU5NyVBNSVFNiU4QSVBNSVFNyVCRCU5MSVFNSU4RiU4QjJrRDJ4VyIsInVzZXJUeXBlIjoxLCJjcmVhdG9ySWQiOm51bGwsInVzZXJJZFpoIjpudWxsfQ.Ai19vg8-rhJNXt2nwFTfir7s01eLfTtOCKcptIpeyG0"},"message":"Success","success":true,"timestamp":1710467595186}
  checkVerifyCode(phone: string, verifyCode: string) {
    return new Promise<CheckVerifyBean>((success, reject) => {
      this.loginModel.checkVerifyCode(phone, verifyCode).then((data: CheckVerifyBean) => {
        //todo 保存数据
        SPHelper.default.save(SpConstants.USER_TEMP_TOKEN, data.temToken)
        SPHelper.default.save(SpConstants.USER_JWT_TOKEN, data.jwtToken)
        success(data)

      }, (value: string) => {
        reject(value)
      })
    })
  }
  checkVerifyCodeByToken(verifyCode: string) {
    return new Promise<CheckVerifyBean>((success, reject) => {
      this.loginModel.checkVerifyCodeByToken(verifyCode).then((data: CheckVerifyBean) => {
        //todo 保存数据
        SPHelper.default.save(SpConstants.USER_TEMP_TOKEN, data.temToken)
        SPHelper.default.save(SpConstants.USER_JWT_TOKEN, data.jwtToken)
        success(data)

      }, (value: string) => {
        reject(value)
      })
    })
  }

  //重置密码 需要老密码
  resetPassword(password: string, tempToken: string)  {
    return new Promise<string>(async (success, fail) => {
      let passwordNew = await this.doMd(password)
      this.loginModel.resetPassword(passwordNew, tempToken).then((data) => {
        success(data)
      }).catch((message: string) => {
        fail(message)
      })
    })

  }

  //忘记密码
  forgotPassword(password: string, tempToken: string)  {
    return new Promise<string>(async (success, fail) => {
      let passwordNew = await this.doMd(password)
      this.loginModel.forgotPassword(passwordNew, tempToken).then((data) => {
        success(data)
      }).catch((message: string) => {
        fail(message)
      })
    })

  }


  async doMd(content: string): Promise<string> {
    let mdAlgName = 'SHA256'; // 摘要算法名
    let message = content; // 待摘要的数据
    let md = cryptoFramework.createMd(mdAlgName);
    // 数据量较少时,可以只做一次update,将数据全部传入,接口未对入参长度做限制
    await md.update({ data: new Uint8Array(buffer.from(message, 'utf-8').buffer) });
    let mdResult = await md.digest();
    console.info('Md result:' + mdResult.data);
    return this.byte2Hex(mdResult.data)
  }

  byte2Hex(data: Uint8Array): string {
    let bufferStr = ''
    for (let i = 0; i < data.length; i++) {
      let temp = data[i].toString(16)
      if (temp.length == 1) {
        temp = "0"+temp
      }
      bufferStr += temp

    }
    console.info('Md result2:' + bufferStr);
    return bufferStr;

  }
}