@@ -0,0 +1,6 @@ | |||
/node_modules | |||
/oh_modules | |||
/.preview | |||
/build | |||
/.cxx | |||
/.test |
@@ -0,0 +1,5 @@ | |||
export default class BuildProfile { | |||
static readonly HAR_VERSION = '1.0.4'; | |||
static readonly BUILD_MODE_NAME = 'debug'; | |||
static readonly DEBUG = true; | |||
} |
@@ -0,0 +1,11 @@ | |||
//sdk入口 | |||
export { BJCASDK } from './src/main/ets/public/BJCASDK' | |||
// 环境枚举 | |||
export { EnvEnum } from './src/main/ets/enum/EnvEnum' | |||
export { CertEnvType } from './src/main/ets/enum/CertEnvType' | |||
// dialog | |||
export { PinDialog } from './src/main/ets/public/sign/PinDialog' | |||
@@ -0,0 +1,148 @@ | |||
# 鸿蒙医网信SDK | |||
## 1. 初始化配置相关 | |||
> 相关方法Manager为`BJCASDK.settingManager()` | |||
### 1.1 获取sdk版本号 | |||
```typescript | |||
BJCASDK.settingManager().getVersion() | |||
``` | |||
### 1.2 运行环境相关 | |||
> [环境码表](./src/main/ets/enum/EnvEnum.ets) | |||
```typescript | |||
// 设置环境 | |||
BJCASDK.settingManager().setServerEnvType(this.envType) | |||
``` | |||
```typescript | |||
// 获取当前运行环境 | |||
BJCASDK.settingManager().getServerEnvType() | |||
``` | |||
### 1.3 厂商id | |||
```typescript | |||
// 设置厂商id | |||
BJCASDK.settingManager().setClientId('51313546135') | |||
``` | |||
```typescript | |||
// 获取当前厂商id | |||
BJCASDK.settingManager().getClientId() | |||
``` | |||
## 2. 证书相关 | |||
> 相关方法Manager为`BJCASDK.certManager()` | |||
### 2.1 证书是否存在 | |||
```typescript | |||
BJCASDK.certManager().existsCert(this.phone) | |||
``` | |||
### 2.2 显示证书页面 | |||
```typescript | |||
BJCASDK.certManager().showCertPage(this.phone, (result) => { | |||
ToolsHelper.showMessage(result.msg) | |||
}) | |||
``` | |||
### 2.3 下证 | |||
```typescript | |||
BJCASDK.certManager().certDown(this.phone, null, (result) => { | |||
ToolsHelper.showMessage(result.msg) | |||
}) | |||
``` | |||
### 2.4 更新证书 | |||
```typescript | |||
BJCASDK.certManager().certUpdate(this.phone, undefined, res => { | |||
if (res !== BJCACallMsg.SUCCESS) { | |||
ToolsHelper.showMessage(JSON.stringify(res)) | |||
} | |||
}) | |||
``` | |||
### 2.5 密码重置 | |||
```typescript | |||
BJCASDK.certManager().certResetPin(this.phone, res => { | |||
if (res !== BJCACallMsg.SUCCESS) { | |||
ToolsHelper.showMessage(JSON.stringify(res)) | |||
} | |||
}) | |||
``` | |||
### 2.6 清除本地证书 | |||
```typescript | |||
BJCASDK.certManager().certClear() | |||
``` | |||
### 2.7 获取签章图片 | |||
```typescript | |||
BJCASDK.certManager().drawStamp(this.phone, res => { | |||
if (res.code === BJCACallMsg.SUCCESS.code && res.data) { | |||
this.draw = res.data | |||
} else { | |||
ToolsHelper.showMessage("未设置签名图片") | |||
} | |||
}) | |||
``` | |||
```typescript | |||
Image(`data:image/png;base64,${this.draw}`) | |||
.width(300) | |||
.height(200) | |||
.margin({ top: 15 }) | |||
.objectFit(ImageFit.Contain) | |||
.visibility(this.draw ? Visibility.Visible : Visibility.None) | |||
``` | |||
### 2.8 获取用户信息 | |||
```typescript | |||
BJCASDK.certManager().getUserInfo(this.phone, res => { | |||
ToolsHelper.showMessage(JSON.stringify(res)) | |||
}) | |||
``` | |||
## [常见错误码](src/main/ets/public/callBack/BJCACallMsg.ets) | |||
@@ -0,0 +1,28 @@ | |||
{ | |||
"apiType": "stageMode", | |||
"buildOption": { | |||
}, | |||
"buildOptionSet": [ | |||
{ | |||
"name": "release", | |||
"arkOptions": { | |||
"obfuscation": { | |||
"ruleOptions": { | |||
"enable": true, | |||
"files": [ | |||
"obfuscation-rules.txt" | |||
] | |||
}, | |||
"consumerFiles": [ | |||
"./consumer-rules.txt" | |||
] | |||
} | |||
}, | |||
}, | |||
], | |||
"targets": [ | |||
{ | |||
"name": "default" | |||
} | |||
] | |||
} |
@@ -0,0 +1,19 @@ | |||
# 开启属性混淆 | |||
-enable-property-obfuscation | |||
# 开启顶层作用域名称混淆 | |||
-enable-toplevel-obfuscation | |||
# 开启直接导入或导出的类或对象的名称和属性名混淆 | |||
-enable-export-obfuscation | |||
# 混淆字符串字面量属性名 | |||
-enable-string-property-obfuscation | |||
# 开启文件/文件夹名称混淆 | |||
-enable-filename-obfuscation | |||
# -compact | |||
-remove-log | |||
-keep-file-name | |||
./Index.ets | |||
@@ -0,0 +1,6 @@ | |||
import { harTasks } from '@ohos/hvigor-ohos-plugin'; | |||
export default { | |||
system: harTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ | |||
plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ | |||
} |
@@ -0,0 +1,224 @@ | |||
# 开启属性混淆 | |||
-enable-property-obfuscation | |||
# 开启顶层作用域名称混淆 | |||
-enable-toplevel-obfuscation | |||
# 开启直接导入或导出的类或对象的名称和属性名混淆 | |||
-enable-export-obfuscation | |||
# 混淆字符串字面量属性名 | |||
# -enable-string-property-obfuscation | |||
# 开启文件/文件夹名称混淆 | |||
-enable-filename-obfuscation | |||
# -compact | |||
-remove-log | |||
-keep-file-name | |||
./Index | |||
./src/main/ets/public | |||
./src/main/ets/public/BJCASDK | |||
./src/main/ets/public/CaManager | |||
./src/main/ets/public/SignManager | |||
./src/main/ets/public/SettingManager | |||
./src/main/ets/public/sign/PinDialog | |||
./src/main/ets/public/callBack/BJCACallMsg | |||
./src/main/ets/public/bean/SignModel | |||
./src/main/ets/public/bean/UserInfoModel | |||
./src/main/ets/enum | |||
./src/main/ets/enum/EnvEnum | |||
./src/main/ets/enum/CertEnvType | |||
# ./src/main/ets/bean/data/AutoData | |||
# ./src/main/ets/bean/data/AutoStopData | |||
# ./src/main/ets/bean/data/CertInfoData | |||
# ./src/main/ets/bean/data/CheckStateData | |||
# ./src/main/ets/bean/data/GetUserInfoData | |||
# ./src/main/ets/bean/data/PinData | |||
# ./src/main/ets/bean/data/SignData | |||
# ./src/main/ets/bean/model/AgreementModel | |||
# ./src/main/ets/bean/model/CertDownModel | |||
# ./src/main/ets/bean/model/CertInfoModel | |||
# ./src/main/ets/bean/model/CheckStateModel | |||
# ./src/main/ets/bean/model/UserInfoModel | |||
# ./src/main/ets/bean/model/VerifyCodeModel | |||
-keep-global-name | |||
BJCASDK | |||
CaManager | |||
SignManager | |||
SettingManager | |||
PinDialog | |||
CallBackForData | |||
CallBackMsg | |||
BJCACallMsg | |||
EnvEnum | |||
CertEnvType | |||
# AutoData | |||
# AutoStopData | |||
# CertInfoData | |||
# CheckStateData | |||
# GetUserInfoData | |||
# PinData | |||
# SignData | |||
# AgreementItem | |||
# AgreementModel | |||
# CertDownModel | |||
# CertInfoModel | |||
# CheckStateModel | |||
# CertList | |||
SignModel | |||
UserInfoModel | |||
# VerifyCodeModel | |||
# 指定你想保留的属性名 | |||
-keep-property-name | |||
controller | |||
# BJCASDK | |||
settingManager | |||
signManager | |||
CaManager | |||
certManager | |||
# SettingManager | |||
setServerEnvType | |||
envType | |||
clientId | |||
url | |||
init | |||
getVersion | |||
getServerEnvType | |||
getServerEnvUrl | |||
setClientId | |||
getClientId | |||
getEnvTypeByUrl | |||
getUrlByEnvType | |||
# PinDialog | |||
controller | |||
# BJCACallMsg | |||
SUCCESS | |||
CANCEL | |||
FAILED | |||
UNKOWN | |||
ROUTER | |||
ILLEGALITY | |||
NOT_CLIENT | |||
NOT_PHONE | |||
CERT_NOT_EXISTS | |||
CERT_EXISTS | |||
SUCCESS_CERT_INFO | |||
ERROR_CERT_INFO | |||
CERT_NOT_UPDATE | |||
SIGN_CANCEL | |||
SIGN_SUCCESS | |||
SIGN_SUCCESS_REST | |||
# CaManager | |||
existsCert | |||
phone | |||
mFirmId | |||
certDown | |||
certUpdate | |||
certResetPin | |||
certClear | |||
drawStamp | |||
showCertPage | |||
getUserInfo | |||
# SignManager | |||
dialogController | |||
signWithFirmId | |||
uniqueIdList | |||
listener | |||
keepDay | |||
sysTag | |||
keepPin | |||
isPinExempt | |||
clearPin | |||
signForSignAuto | |||
stopSignAuto | |||
getSignAutoInfo | |||
# CertEnvType | |||
DOCTOR | |||
MASS | |||
# EnvEnum | |||
PUBLIC | |||
INTEGRATE | |||
TEST | |||
DEV | |||
TEST_DOMAIN | |||
DEV_DOMAIN | |||
# AutoData | |||
sysTag | |||
pin | |||
firmId | |||
# AutoStopData | |||
clientId | |||
userId | |||
sysTag | |||
# CertInfoData | |||
userId | |||
clientId | |||
# CheckStateData | |||
firmId | |||
# GetUserInfoData | |||
userId | |||
openId | |||
clientId | |||
# PinData | |||
pin | |||
# SignData | |||
clientId | |||
signDataIdList | |||
userId | |||
pin | |||
orderFirmId | |||
# AgreementModel | |||
agreementName | |||
agreementUrl | |||
list | |||
# CertDownModel | |||
userId | |||
endDate | |||
# CertInfoModel | |||
caChannel | |||
caOrgName | |||
caSealBase64 | |||
credenceAppend | |||
credenceStatus | |||
deviceId | |||
deviceType | |||
deviceVersion | |||
endDate | |||
idCardNum | |||
idType | |||
idTypeDes | |||
sex | |||
startDate | |||
userName | |||
unit | |||
# CheckStateModel | |||
certList | |||
deviceId | |||
enableCertUpdate | |||
phone | |||
userName | |||
firmId | |||
endTime | |||
startTime | |||
# SignModel | |||
fileUniqueId | |||
# UserInfoModel | |||
certUpdateTipDay | |||
deviceId | |||
enableCert | |||
endDate | |||
idCardNum | |||
idCardType | |||
nowDate | |||
openId | |||
phoneNum | |||
picUrl | |||
startDate | |||
userName | |||
# VerifyCodeModel | |||
userId | |||
@@ -0,0 +1,17 @@ | |||
{ | |||
"meta": { | |||
"stableOrder": false | |||
}, | |||
"lockfileVersion": 3, | |||
"ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", | |||
"specifiers": { | |||
"@szyx/sdk_base@../basic": "@szyx/sdk_base@../basic" | |||
}, | |||
"packages": { | |||
"@szyx/sdk_base@../basic": { | |||
"name": "@szyx/sdk_base", | |||
"resolved": "../basic", | |||
"registryType": "local" | |||
} | |||
} | |||
} |
@@ -0,0 +1,12 @@ | |||
{ | |||
"name": "@szyx/sdk_ywx", | |||
"version": "1.0.4", | |||
"description": "医网信,签名sdk。", | |||
"main": "Index.ets", | |||
"author": "xuqm", | |||
"license": "Apache-2.0", | |||
"dependencies": { | |||
"@szyx/sdk_base": "file:../basic" | |||
// "@szyx/sdk_base": "^1.0.2" | |||
} | |||
} |
@@ -0,0 +1,3 @@ | |||
export class ConstantValue { | |||
public static VERSION = '1.0.0' | |||
} |
@@ -0,0 +1,12 @@ | |||
export class AutoData { | |||
sysTag: string | |||
pin: string | |||
firmId: string | |||
constructor(sysTag: string, firmId: string, pin: string) { | |||
this.sysTag = sysTag | |||
this.pin = pin | |||
this.firmId = firmId | |||
} | |||
} |
@@ -0,0 +1,13 @@ | |||
export class AutoStopData { | |||
clientId: string | |||
userId: string | |||
sysTag?: string | |||
constructor(clientId: string, userId: string, sysTag?: string) { | |||
this.clientId = clientId | |||
this.userId = userId | |||
this.sysTag = sysTag | |||
} | |||
} |
@@ -0,0 +1,9 @@ | |||
export class CertInfoData { | |||
userId: string | |||
clientId: string | |||
constructor(userId: string, clientId: string) { | |||
this.userId = userId | |||
this.clientId = clientId | |||
} | |||
} |
@@ -0,0 +1,8 @@ | |||
export class CheckStateData { | |||
firmId?: string | |||
constructor(firmId?: string) { | |||
this.firmId = firmId | |||
} | |||
} |
@@ -0,0 +1,11 @@ | |||
export class GetUserInfoData{ | |||
userId:string | |||
openId:string | |||
clientId:string | |||
constructor(userId: string, openId: string, clientId: string) { | |||
this.userId = userId | |||
this.openId = openId | |||
this.clientId = clientId | |||
} | |||
} |
@@ -0,0 +1,8 @@ | |||
export class PinData { | |||
pin: string | |||
constructor(pin: string) { | |||
this.pin = pin | |||
} | |||
} |
@@ -0,0 +1,17 @@ | |||
import { List } from '@kit.ArkTS'; | |||
export class SignData { | |||
clientId: string | |||
signDataIdList: List<string> | Array<string> | |||
userId: string | |||
pin: string | |||
orderFirmId?: string | |||
constructor(clientId: string, signDataIdList: List<string> | Array<string>, userId: string, pin: string, orderFirmId?: string) { | |||
this.clientId = clientId; | |||
this.signDataIdList = signDataIdList; | |||
this.userId = userId; | |||
this.pin = pin; | |||
this.orderFirmId = orderFirmId; | |||
} | |||
} |
@@ -0,0 +1,8 @@ | |||
export interface AgreementItem { | |||
agreementName: string | |||
agreementUrl: string | |||
} | |||
export interface AgreementModel { | |||
list: Array<AgreementItem> | |||
} |
@@ -0,0 +1,6 @@ | |||
export interface CertDownModel{ | |||
userId:string | |||
endDate:string | |||
stamp?:string | |||
startDate:string | |||
} |
@@ -0,0 +1,18 @@ | |||
export interface CertInfoModel { | |||
caChannel: number | |||
caOrgName: string | |||
caSealBase64: string | |||
credenceAppend: string | |||
credenceStatus: number | |||
deviceId: string | |||
deviceType: string | |||
deviceVersion: string | |||
endDate: string | |||
idCardNum: string | |||
idType: string | |||
idTypeDes: string | |||
sex: string | |||
startDate: string | |||
userName: string | |||
unit?: string | |||
} |
@@ -0,0 +1,13 @@ | |||
export interface CertList { | |||
endTime: string; | |||
firmId: string; | |||
startTime: string; | |||
} | |||
export interface CheckStateModel { | |||
certList: CertList[]; | |||
deviceId: string; | |||
enableCertUpdate: boolean; | |||
phone: string; | |||
userName: string; | |||
} |
@@ -0,0 +1,3 @@ | |||
export interface VerifyCodeModel{ | |||
userId:string | |||
} |
@@ -0,0 +1,8 @@ | |||
export class EnvUrl { | |||
public static DEV = "http://dev.51trust.com/"; | |||
public static DEV_DOMAIN = "http://dev.51trust.com/"; | |||
public static TEST = "http://beta.51trust.com/"; | |||
public static TEST_DOMAIN = "http://beta.51trust.com/"; | |||
public static INTEGRATE = "http://test.51trust.com/"; | |||
public static PUBLIC = "https://www.51trust.com/"; | |||
} |
@@ -0,0 +1,181 @@ | |||
import { AppStorageHelper, PreferencesHelper } from '@szyx/sdk_base/Index' | |||
import { EnvEnum } from '../enum/EnvEnum' | |||
import { EnvCheck } from '../manager/EnvCheck' | |||
import { EnvUrl } from './EnvUrl' | |||
import { StorageKeys } from './StorageKeys' | |||
import util from '@ohos.util' | |||
import { CertEnvType } from '../enum/CertEnvType' | |||
export class GlobalValue { | |||
// 是否实例的标志 | |||
private static instance: GlobalValue | null = null | |||
// 单例模式 | |||
static getInstance() { | |||
// 判断系统是否已经有单例了 | |||
if (GlobalValue.instance === null) { | |||
GlobalValue.instance = new GlobalValue() | |||
} | |||
return GlobalValue.instance | |||
} | |||
private constructor() { | |||
} | |||
private _envType: EnvEnum = EnvEnum.PUBLIC | |||
private _certEnvType: CertEnvType = CertEnvType.DOCTOR | |||
private _envUrl: string = EnvUrl.PUBLIC | |||
private _clientId: string | null = null | |||
private _userId: string | null = null | |||
private _deviceId: string | null = null | |||
private _stampPic: string | null = null | |||
private _certClientId: string | null = null | |||
private _certPhone: string | null = null | |||
private _certEnvUrl: string | null = null | |||
private _signAutoPin: string | null = null | |||
private _signAutoDay: string | null = null | |||
public set signAutoPin(value: string | null) { | |||
this._signAutoPin = value | |||
AppStorageHelper.save(StorageKeys.SIGN_AUTO_PIN, value ?? undefined) | |||
PreferencesHelper.put(StorageKeys.SIGN_AUTO_PIN, value ?? undefined) | |||
} | |||
public get signAutoPin(): string | null { | |||
return this._signAutoPin ?? AppStorageHelper.get(StorageKeys.SIGN_AUTO_PIN) ?? null | |||
} | |||
public set signAutoDay(value: string | null) { | |||
this._signAutoDay = value | |||
AppStorageHelper.save(StorageKeys.SIGN_AUTO_DAY, value ?? undefined) | |||
PreferencesHelper.put(StorageKeys.SIGN_AUTO_DAY, value ?? undefined) | |||
} | |||
public get signAutoDay(): string | null { | |||
return this._signAutoDay ?? AppStorageHelper.get(StorageKeys.SIGN_AUTO_DAY) ?? null | |||
} | |||
public set certEnvUrl(value: string | null) { | |||
this._certEnvUrl = value | |||
if (value) { | |||
AppStorageHelper.save(StorageKeys.CERT_ENV_URL, value) | |||
PreferencesHelper.put(StorageKeys.CERT_ENV_URL, value) | |||
} | |||
} | |||
public get certEnvUrl(): string | null { | |||
return this._certEnvUrl ?? AppStorageHelper.get(StorageKeys.CERT_ENV_URL) ?? null | |||
} | |||
public set stampPic(value: string | null) { | |||
this._stampPic = value | |||
AppStorageHelper.save(StorageKeys.STAMP_PIC, value ?? undefined) | |||
PreferencesHelper.put(StorageKeys.STAMP_PIC, value ?? undefined) | |||
} | |||
public get stampPic(): string | null { | |||
return this._stampPic ?? AppStorageHelper.get(StorageKeys.STAMP_PIC) ?? null | |||
} | |||
public set certClientId(value: string | null) { | |||
this._certClientId = value | |||
AppStorageHelper.save(StorageKeys.NOT_CLIENT_ID, value ?? undefined) | |||
PreferencesHelper.put(StorageKeys.NOT_CLIENT_ID, value ?? undefined) | |||
} | |||
public get certClientId(): string | null { | |||
return this._certClientId ?? AppStorageHelper.get(StorageKeys.NOT_CLIENT_ID) ?? null | |||
} | |||
public set certPhone(value: string | null) { | |||
this._certPhone = value | |||
AppStorageHelper.save(StorageKeys.NOT_PHONE, value ?? undefined) | |||
PreferencesHelper.put(StorageKeys.NOT_PHONE, value ?? undefined) | |||
} | |||
public get certPhone(): string | null { | |||
return this._certPhone ?? AppStorageHelper.get(StorageKeys.NOT_PHONE) ?? null | |||
} | |||
public set deviceId(value: string) { | |||
this._deviceId = value | |||
PreferencesHelper.put(StorageKeys.DEVICE_ID, value) | |||
} | |||
public get deviceId(): string { | |||
if (!this._deviceId) { | |||
this.deviceId = util.generateRandomUUID() | |||
} | |||
return this._deviceId! | |||
} | |||
public set userId(value: string | null) { | |||
this._userId = value | |||
if (value) { | |||
AppStorageHelper.save(StorageKeys.USER_ID, value) | |||
PreferencesHelper.put(StorageKeys.USER_ID, value) | |||
} | |||
} | |||
public get userId(): string | null { | |||
return this._userId ?? AppStorageHelper.get(StorageKeys.USER_ID) ?? null | |||
} | |||
public set envType(value: EnvEnum) { | |||
this._envType = value | |||
this._envUrl = EnvCheck.getUrlByEnvType(value) | |||
AppStorageHelper.save(StorageKeys.ENV_URL, this._envUrl) | |||
PreferencesHelper.put(StorageKeys.ENV_URL, this._envUrl) | |||
} | |||
public get envType(): EnvEnum { | |||
return this._envType | |||
} | |||
public set certEnvType(value: CertEnvType) { | |||
this._certEnvType = value | |||
AppStorageHelper.save(StorageKeys.CERT_ENV_TYPE, value === CertEnvType.DOCTOR ? "101" : "102") | |||
PreferencesHelper.put(StorageKeys.CERT_ENV_TYPE, value === CertEnvType.DOCTOR ? "101" : "102") | |||
} | |||
public get certEnvType(): CertEnvType { | |||
return this._certEnvType | |||
} | |||
public get envUrl(): string { | |||
return this._envUrl | |||
} | |||
public setClientId(value: string) { | |||
this._clientId = value | |||
AppStorageHelper.save(StorageKeys.CLIENT_ID, value) | |||
PreferencesHelper.put(StorageKeys.CLIENT_ID, value) | |||
} | |||
public getClientId(): string | undefined { | |||
return this._clientId ?? AppStorageHelper.get(StorageKeys.CLIENT_ID) | |||
} | |||
public getOpenId(): string | undefined { | |||
if (this.userId) { | |||
/** | |||
* salt一旦定下来不能变更,userId运算成openId需要的参数 | |||
*/ | |||
let OPENID_SALT = ['y', 'w', 'q'] | |||
let array = this.userId.split('') | |||
array.splice(8, 0, OPENID_SALT[0]) | |||
array.splice(13, 0, OPENID_SALT[1]) | |||
array.splice(18, 0, OPENID_SALT[2]) | |||
array.reverse() | |||
return array.join('') | |||
} | |||
return undefined | |||
} | |||
} |
@@ -0,0 +1,24 @@ | |||
export class StorageKeys{ | |||
// 厂商id | |||
public static CLIENT_ID = 'szyxSdkClientId' | |||
// userId用户唯一标识 | |||
public static USER_ID = 'szyxSdkUserId' | |||
// 环境地址 | |||
public static ENV_URL = 'szyxSdkEnvUrl' | |||
// 证书用户的环境类型 | |||
public static CERT_ENV_TYPE = 'szyxSdkCertEnvType' | |||
// 设备唯一码 | |||
public static DEVICE_ID = 'szyxSdkDeviceId' | |||
// 签名图片 | |||
public static STAMP_PIC = 'szyxSdkStampPic' | |||
// 证书id,存储的是下证的clientId | |||
public static NOT_CLIENT_ID = 'szyxSdkCertClientId' | |||
// 下证的手机号 | |||
public static NOT_PHONE = 'szyxSdkCertPhone' | |||
// 下证时的环境地址 | |||
public static CERT_ENV_URL = 'szyxSdkCertEnvUrl' | |||
// 免密签名用到的pin码 | |||
public static SIGN_AUTO_PIN = 'signAutoPin' | |||
// 免密签名到期时间 | |||
public static SIGN_AUTO_DAY = 'signAutoDay' | |||
} |
@@ -0,0 +1,16 @@ | |||
@Component | |||
export struct MainPage { | |||
@State message: string = 'Hello World'; | |||
build() { | |||
Row() { | |||
Column() { | |||
Text(this.message) | |||
.fontSize(50) | |||
.fontWeight(FontWeight.Bold) | |||
} | |||
.width('100%') | |||
} | |||
.height('100%') | |||
} | |||
} |
@@ -0,0 +1,10 @@ | |||
export enum CertEnvType { | |||
/** | |||
* 医师用户 | |||
*/ | |||
DOCTOR = '医师用户', | |||
/** | |||
* 公众用户 | |||
*/ | |||
MASS = '公众用户', | |||
} |
@@ -0,0 +1,27 @@ | |||
export enum EnvEnum { | |||
/** | |||
* 运营环境 | |||
*/ | |||
PUBLIC = '运营环境', | |||
/** | |||
* 集成环境 | |||
*/ | |||
INTEGRATE = '集成环境', | |||
/** | |||
* 测试环境 | |||
*/ | |||
TEST = '测试环境', | |||
/** | |||
* 开发环境 | |||
*/ | |||
DEV = '开发环境', | |||
/** | |||
* 测试环境-域名 | |||
*/ | |||
TEST_DOMAIN = '测试环境-域名', | |||
/** | |||
* 开发环境-域名 | |||
*/ | |||
DEV_DOMAIN = '开发环境-域名' | |||
} |
@@ -0,0 +1,141 @@ | |||
import { CertEnvType } from '../../../../Index' | |||
import { GlobalValue } from '../common/GlobalValue' | |||
export interface ApiElem { | |||
url: string | |||
apiNo?: string | |||
} | |||
/** | |||
* 获取验证码 | |||
*/ | |||
export const verifyCodeUrl: ApiElem = { | |||
apiNo: 'VerifyCode', | |||
url: 'am/v3/userCenter/account/getSMSVerifyCode' | |||
} | |||
/** | |||
* 下载证书 | |||
*/ | |||
export const certDown: ApiElem = { | |||
apiNo: 'updateAuthorizeCert', | |||
url: 'am/v3/doctor/cert/updateAuthorizeCert' | |||
} | |||
/** | |||
* 获取协议列表信息 | |||
*/ | |||
export const getAgreement: ApiElem = { | |||
apiNo: 'agreementList', | |||
url: 'am/v3/common/agreementList' | |||
} | |||
const getUserInfoForDoctor: ApiElem = { | |||
apiNo: 'getUserInfoForDoctor', | |||
url: 'am/v3/doctor/getDoctorBaseInfo' | |||
} | |||
const getUserInfoForMass: ApiElem = { | |||
apiNo: 'getUserInfoForMass', | |||
url: 'am/v3/userCenter/user/getUserInfo' | |||
} | |||
/** | |||
* 获取用户信息 | |||
*/ | |||
export const getUserInfo = (): ApiElem => { | |||
return GlobalValue.getInstance().certEnvType === CertEnvType.MASS ? getUserInfoForMass : getUserInfoForDoctor | |||
} | |||
const getCertInfoForDoctor: ApiElem = { | |||
apiNo: 'getCertInfoForDoctor', | |||
url: 'am/v3/doctor/cert/viewMyCert' | |||
} | |||
const getCertInfoForMass: ApiElem = { | |||
apiNo: 'getCertInfoForMass', | |||
url: 'am/v3/userCenter/user/getCert' | |||
} | |||
/** | |||
* 获取证书信息 | |||
*/ | |||
export const getCertInfo = (): ApiElem => { | |||
return GlobalValue.getInstance().certEnvType === CertEnvType.MASS ? getCertInfoForMass : getCertInfoForDoctor | |||
} | |||
/** | |||
* 获取证书状态 | |||
*/ | |||
export const checkState: ApiElem = { | |||
apiNo: 'checkState', | |||
url: 'am/v3/doctor/checkState' | |||
} | |||
/** | |||
* 签名 | |||
*/ | |||
export const signWithServer: ApiElem = { | |||
apiNo: 'signWithServer', | |||
url: 'am/v3/recipe/authorizeSign' | |||
} | |||
/** | |||
* 校验托管证书pin码 | |||
*/ | |||
export const verifyPin: ApiElem = { | |||
apiNo: 'signWithServer', | |||
url: 'am/v3/doctor/cert/verifyPin' | |||
} | |||
/** | |||
* 授权签名操作-确认授权 | |||
*/ | |||
export const sureStartForGrant: ApiElem = { | |||
apiNo: 'sureStartForGrant', | |||
url: 'am/v3/grant/sure' | |||
} | |||
/** | |||
* 开启自动签名(托管证书方式) | |||
*/ | |||
export const sureSignForSignAuto: ApiElem = { | |||
apiNo: 'sureSignForSignAuto', | |||
url: 'am/v3/selfSign/authorize/sure' | |||
} | |||
/** | |||
* 停止自动签名(托管证书方式) | |||
*/ | |||
export const getSignAutoQuit: ApiElem = { | |||
apiNo: 'getSignAutoQuit', | |||
url: 'am/v3/selfSign/quit' | |||
} | |||
/** | |||
* 获取自动签信息 | |||
*/ | |||
export const getSignAutoInfo: ApiElem = { | |||
apiNo: 'getSignAutoInfo', | |||
url: 'am/v3/selfSign/getSelfSignInfo' | |||
} | |||
@@ -0,0 +1,85 @@ | |||
import { HttpHelper } from '@szyx/sdk_base/src/main/ets/http/HttpHelper'; | |||
import { GlobalValue } from '../common/GlobalValue'; | |||
import { ConstantValue } from '../ConstantValue'; | |||
import { ApiElem } from '../http/ApiConfig'; | |||
import { md5_hex } from '../util/md5'; | |||
interface HttpResult<T> { | |||
status: string | |||
data?: T | |||
message?: string | |||
} | |||
export class ApiUtils { | |||
public static post<T>(url: ApiElem, data?: Object): Promise<T> { | |||
return new Promise((resolve, reject) => { | |||
let MD5_KEY = 'YWQ!@#' | |||
let timeStamp = Date.now() | |||
let signOrigin = `timeStamp=${timeStamp}#${MD5_KEY}` | |||
let sign = md5_hex(signOrigin) | |||
HttpHelper.get() | |||
.post<HttpResult<T>>(url.url.startsWith('http') ? url.url : GlobalValue.getInstance().envUrl + url.url, | |||
data ? JSON.stringify(data) : undefined, { | |||
userId: GlobalValue.getInstance().userId, | |||
clientId: GlobalValue.getInstance().getClientId(), | |||
version: ConstantValue.VERSION, | |||
deviceType: '01', | |||
deviceId: GlobalValue.getInstance().deviceId, | |||
timeStamp: timeStamp + '', | |||
sign: sign, | |||
phoneModel: 'sign', | |||
phoneVersion: 'sign', | |||
phoneBrand: 'HarmonyOS' | |||
}, url.apiNo) | |||
.then((res: HttpResult<T>) => { | |||
if (res.status === '0') { | |||
resolve(res.data as T) | |||
} else { | |||
reject(new Error(res.message)) | |||
} | |||
}) | |||
.catch((error: Error) => { | |||
reject(error) | |||
}) | |||
}) | |||
} | |||
public static get<T>(url: ApiElem, data?: Object): Promise<T> { | |||
return new Promise((resolve, reject) => { | |||
let MD5_KEY = 'YWQ!@#' | |||
let timeStamp = Date.now() | |||
let signOrigin = `timeStamp=${timeStamp}#${MD5_KEY}` | |||
let sign = md5_hex(signOrigin) | |||
HttpHelper.get() | |||
.get<HttpResult<T>>(url.url.startsWith('http') ? url.url : GlobalValue.getInstance().envUrl + url.url, | |||
data ? JSON.stringify(data) : undefined, { | |||
userId: GlobalValue.getInstance().userId, | |||
clientId: GlobalValue.getInstance().getClientId(), | |||
version: ConstantValue.VERSION, | |||
deviceType: '01', | |||
timeStamp: timeStamp + '', | |||
sign: sign, | |||
phoneModel: 'sign', | |||
phoneVersion: 'sign', | |||
phoneBrand: 'HarmonyOS' | |||
}, url.apiNo) | |||
.then((res: HttpResult<T>) => { | |||
if (res.status === '0') { | |||
resolve(res.data as T) | |||
} else { | |||
reject(new Error(res.message)) | |||
} | |||
}) | |||
.catch((error: Error) => { | |||
reject(error) | |||
}) | |||
}) | |||
} | |||
} |
@@ -0,0 +1,45 @@ | |||
import { ValidatorHelper } from '@szyx/sdk_base/Index' | |||
import { BJCACallMsg, CallBackForData, CallBackMsg } from '../public/callBack/BJCACallMsg' | |||
import { GlobalValue } from '../common/GlobalValue' | |||
export class BackManager { | |||
// 是否实例的标志 | |||
private static instance: BackManager | null = null | |||
static get() { | |||
// 判断系统是否已经有单例了 | |||
if (BackManager.instance === null) { | |||
BackManager.instance = new BackManager() | |||
} | |||
return BackManager.instance | |||
} | |||
private constructor() { | |||
} | |||
private _listener: ((result: CallBackMsg) => void) | null = null | |||
private setListener(listener: (result: CallBackMsg) => void) { | |||
this._listener = listener | |||
} | |||
public call(result: CallBackMsg) { | |||
if (this._listener) { | |||
this._listener(result) | |||
this._listener = null | |||
} | |||
} | |||
public checkParams(phone: string, listener: (result: CallBackMsg) => void): boolean { | |||
this.setListener(listener) | |||
if (!GlobalValue.getInstance().getClientId()) { | |||
BackManager.get().call(BJCACallMsg.NOT_CLIENT) | |||
return false | |||
} | |||
if (!ValidatorHelper.isPhone(phone)) { | |||
BackManager.get().call(BJCACallMsg.NOT_PHONE) | |||
return false | |||
} | |||
return true | |||
} | |||
} |
@@ -0,0 +1,245 @@ | |||
import { ValidatorHelper } from '@szyx/sdk_base/Index'; | |||
import { BJCACallMsg, CallBackForData, CallBackMsg } from '../public/callBack/BJCACallMsg'; | |||
import { GlobalValue } from '../common/GlobalValue'; | |||
import router from '@ohos.router'; | |||
import { BusinessError } from '@kit.BasicServicesKit'; | |||
import { BackManager } from '../manager/BackManager'; | |||
import { ApiUtils } from '../http/ApiUtils'; | |||
import { checkState, getUserInfo } from '../http/ApiConfig'; | |||
import { GetUserInfoData } from '../bean/data/GetUserInfoData'; | |||
import { UserInfoModel } from '../public/bean/UserInfoModel'; | |||
import { CheckStateData } from '../bean/data/CheckStateData'; | |||
import { CheckStateModel } from '../bean/model/CheckStateModel'; | |||
const CertDown = import('../pages/CertDown'); | |||
const CertDetails = import('../pages/CertDetails'); | |||
export class CaManagerReal { | |||
/** | |||
* 证书是否存在 | |||
* @param phone | |||
* @returns | |||
*/ | |||
public static existsCert(phone?: string): boolean { | |||
if (!GlobalValue.getInstance().getClientId()) { | |||
return false | |||
} | |||
if (phone && !ValidatorHelper.isPhone(phone)) { | |||
return false | |||
} | |||
if (GlobalValue.getInstance().certEnvUrl === GlobalValue.getInstance().envUrl && | |||
GlobalValue.getInstance().certClientId === GlobalValue.getInstance().getClientId() && | |||
GlobalValue.getInstance().certPhone && | |||
(!phone || GlobalValue.getInstance().certPhone === phone)) { | |||
return true | |||
} else { | |||
return false | |||
} | |||
} | |||
/** | |||
* 下证 | |||
* @param phone | |||
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|ROUTER|SUCCESS|CANCEL) | |||
*/ | |||
public static certDown(phone: string, mFirmId: string | undefined, listener: (result: CallBackMsg) => void) { | |||
if (!BackManager.get().checkParams(phone, listener)) { | |||
return | |||
} | |||
router.pushNamedRoute({ | |||
name: 'CertDown', | |||
params: { | |||
phone: phone, | |||
mFirmId: mFirmId, | |||
certDownType: 0, | |||
} | |||
}, router.RouterMode.Single).then(() => { | |||
console.info('Succeeded in jumping to the CertDown page.') | |||
}).catch((err: BusinessError) => { | |||
BackManager.get().call(BJCACallMsg.ROUTER) | |||
console.error(`Failed to jump to the second page.Code is ${err.code}, message is ${err.message}`) | |||
}) | |||
} | |||
/** | |||
* 更新证书 | |||
* @param phone | |||
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|ROUTER|SUCCESS|CANCEL|CERT_NOT_UPDATE|CERT_NOT_EXISTS) | |||
*/ | |||
public static certUpdate(phone: string, mFirmId: string | undefined, listener: (result: CallBackMsg) => void) { | |||
if (!BackManager.get().checkParams(phone, listener)) { | |||
return | |||
} | |||
// 获取证书状态 | |||
ApiUtils.post<CheckStateModel>(checkState, new CheckStateData(mFirmId)) | |||
.then((res: CheckStateModel) => { | |||
if (res.enableCertUpdate) { | |||
router.pushNamedRoute({ | |||
name: 'CertDown', | |||
params: { | |||
phone: phone, | |||
mFirmId: mFirmId, | |||
certDownType: 1, | |||
} | |||
}, router.RouterMode.Single).then(() => { | |||
console.info('Succeeded in jumping to the CertDown page.') | |||
}).catch((err: BusinessError) => { | |||
BackManager.get().call(BJCACallMsg.ROUTER) | |||
console.error(`Failed to jump to the second page.Code is ${err.code}, message is ${err.message}`) | |||
}) | |||
} else { | |||
BackManager.get().call(BJCACallMsg.CERT_NOT_UPDATE) | |||
} | |||
}).catch((error: Error) => { | |||
console.log('>>>>>', JSON.stringify(error)) | |||
BackManager.get().call(BJCACallMsg.CERT_NOT_EXISTS) | |||
}) | |||
} | |||
/** | |||
* 重置pin码 | |||
* @param mFirmId | |||
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|ROUTER|SUCCESS|CANCEL|CERT_NOT_EXISTS) | |||
*/ | |||
public static certResetPin(mFirmId: string | undefined, listener: (result: CallBackMsg) => void) { | |||
const phone = GlobalValue.getInstance().certPhone | |||
if (!phone) { | |||
listener(BJCACallMsg.CERT_NOT_EXISTS) | |||
return | |||
} | |||
if (!BackManager.get().checkParams(phone, listener)) { | |||
return | |||
} | |||
// 获取证书状态 | |||
ApiUtils.post<CheckStateModel>(checkState, new CheckStateData(mFirmId)) | |||
.then((res: CheckStateModel) => { | |||
router.pushNamedRoute({ | |||
name: 'CertDown', | |||
params: { | |||
phone: phone, | |||
mFirmId: mFirmId, | |||
certDownType: 2, | |||
} | |||
}, router.RouterMode.Single).then(() => { | |||
console.info('Succeeded in jumping to the CertDown page.') | |||
}).catch((err: BusinessError) => { | |||
BackManager.get().call(BJCACallMsg.ROUTER) | |||
console.error(`Failed to jump to the second page.Code is ${err.code}, message is ${err.message}`) | |||
}) | |||
}).catch((error: Error) => { | |||
console.log('>>>>>', JSON.stringify(error)) | |||
BackManager.get().call(BJCACallMsg.CERT_NOT_EXISTS) | |||
}) | |||
} | |||
/** | |||
* 清除本地证书 | |||
* @param phone | |||
* @param listener 操作完成 | |||
*/ | |||
public static certClear(listener?: () => void) { | |||
GlobalValue.getInstance().stampPic = null | |||
GlobalValue.getInstance().certClientId = null | |||
GlobalValue.getInstance().certPhone = null | |||
listener && listener() | |||
} | |||
/** | |||
* 获取签章图片 | |||
* @param listener BJCACallMsg.SUCCESS.code & base64 || BJCACallMsg.FAILED.code | |||
*/ | |||
public static drawStamp(phone: string, listener: (result: CallBackForData<string>) => void) { | |||
if (CaManagerReal.existsCert(phone) && GlobalValue.getInstance().stampPic) { | |||
listener({ | |||
code: BJCACallMsg.SUCCESS.code, | |||
msg: "获取签名信息成功", | |||
data: GlobalValue.getInstance().stampPic!! | |||
}) | |||
} else { | |||
listener({ | |||
code: BJCACallMsg.FAILED.code, | |||
msg: "获取签名信息失败", | |||
}) | |||
} | |||
} | |||
/** | |||
* 显示证书页面 | |||
* @param phone | |||
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|ROUTER|SUCCESS|CANCEL|CERT_NOT_EXISTS|ERROR_CERT_INFO) | |||
*/ | |||
public static showCertPage(phone: string, listener: (result: CallBackMsg) => void) { | |||
if (!BackManager.get().checkParams(phone, listener)) { | |||
return | |||
} | |||
if (CaManagerReal.existsCert(phone)) { | |||
router.pushNamedRoute({ | |||
name: 'ShowCertPage' | |||
}, router.RouterMode.Single).then(() => { | |||
console.info('Succeeded in jumping to the CertDown page.') | |||
}).catch((err: BusinessError) => { | |||
BackManager.get().call(BJCACallMsg.ROUTER) | |||
console.error(`Failed to jump to the second page.Code is ${err.code}, message is ${err.message}`) | |||
}) | |||
} else { | |||
BackManager.get().call(BJCACallMsg.CERT_NOT_EXISTS) | |||
} | |||
} | |||
/** | |||
* 获取用户信息 | |||
* @param phone | |||
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|CERT_NOT_EXISTS)||BJCACallMsg.SUCCESS.code & base64 || BJCACallMsg.FAILED.code | |||
*/ | |||
public static getUserInfo(phone: string, listener: (result: CallBackForData<UserInfoModel>) => void) { | |||
if (!BackManager.get().checkParams(phone, listener)) { | |||
return | |||
} | |||
if (CaManagerReal.existsCert(phone)) { | |||
ApiUtils.get<UserInfoModel>(getUserInfo(), new GetUserInfoData(GlobalValue.getInstance() | |||
.userId!!, GlobalValue.getInstance().getOpenId()!!, GlobalValue.getInstance().getClientId()!!)) | |||
.then((res: UserInfoModel) => { | |||
console.log('------------->', JSON.stringify(res)) | |||
listener({ | |||
code: BJCACallMsg.SUCCESS.code, | |||
msg: "获取证书信息成功", | |||
data: res | |||
}) | |||
}).catch((error: Error) => { | |||
console.log('>>>>>', JSON.stringify(error)) | |||
listener({ | |||
code: BJCACallMsg.FAILED.code, | |||
msg: "获取证书信息失败", | |||
}) | |||
}) | |||
} else { | |||
BackManager.get().call(BJCACallMsg.CERT_NOT_EXISTS) | |||
} | |||
} | |||
} |
@@ -0,0 +1,69 @@ | |||
import { EnvUrl } from '../common/EnvUrl'; | |||
import { EnvEnum } from '../enum/EnvEnum'; | |||
export class EnvCheck { | |||
/** | |||
* 根据url,获取对应环境信息 | |||
* @param rul | |||
*/ | |||
public static getEnvTypeByUrl(url: string) { | |||
let envType = EnvEnum.PUBLIC | |||
switch (url) { | |||
case EnvUrl.DEV: | |||
envType = EnvEnum.DEV; | |||
break; | |||
case EnvUrl.TEST: | |||
envType = EnvEnum.TEST; | |||
break; | |||
case EnvUrl.INTEGRATE: | |||
envType = EnvEnum.INTEGRATE; | |||
break; | |||
case EnvUrl.PUBLIC: | |||
envType = EnvEnum.PUBLIC; | |||
break; | |||
case EnvUrl.TEST_DOMAIN: | |||
envType = EnvEnum.TEST_DOMAIN; | |||
break; | |||
case EnvUrl.DEV_DOMAIN: | |||
envType = EnvEnum.DEV_DOMAIN; | |||
break; | |||
} | |||
return envType; | |||
} | |||
/** | |||
* 根据环境信息,获取url | |||
* @param envType | |||
*/ | |||
public static getUrlByEnvType(envType: EnvEnum) { | |||
let url = EnvUrl.PUBLIC; | |||
switch (envType) { | |||
case EnvEnum.PUBLIC: | |||
url = EnvUrl.PUBLIC; | |||
break; | |||
case EnvEnum.INTEGRATE: | |||
url = EnvUrl.INTEGRATE; | |||
break; | |||
case EnvEnum.TEST: | |||
url = EnvUrl.TEST; | |||
break; | |||
case EnvEnum.DEV: | |||
url = EnvUrl.DEV; | |||
break; | |||
case EnvEnum.TEST_DOMAIN: | |||
url = EnvUrl.TEST_DOMAIN; | |||
break; | |||
case EnvEnum.DEV_DOMAIN: | |||
url = EnvUrl.DEV_DOMAIN; | |||
break; | |||
default: | |||
break; | |||
} | |||
return url; | |||
} | |||
} |
@@ -0,0 +1,138 @@ | |||
import { PreferencesHelper } from '@szyx/sdk_base/Index' | |||
import { GlobalValue } from '../common/GlobalValue' | |||
import { StorageKeys } from '../common/StorageKeys' | |||
import { ConstantValue } from '../ConstantValue' | |||
import { CertEnvType } from '../enum/CertEnvType' | |||
import { EnvEnum } from '../enum/EnvEnum' | |||
import { EnvCheck } from './EnvCheck' | |||
export class SettingManagerReal { | |||
/** | |||
* 初始化方法,不调用的话,无法获取本地clientId | |||
* | |||
*/ | |||
public static init() { | |||
PreferencesHelper.get(StorageKeys.CLIENT_ID).then((res) => { | |||
if (res) { | |||
GlobalValue.getInstance().setClientId(res.toString()) | |||
} | |||
}) | |||
PreferencesHelper.get(StorageKeys.USER_ID).then((res) => { | |||
if (res) { | |||
GlobalValue.getInstance().userId = res.toString() | |||
} | |||
}) | |||
PreferencesHelper.get(StorageKeys.ENV_URL).then((res) => { | |||
if (res) { | |||
GlobalValue.getInstance().envType = EnvCheck.getEnvTypeByUrl(res.toString()) | |||
} | |||
}) | |||
PreferencesHelper.get(StorageKeys.DEVICE_ID).then((res) => { | |||
if (res) { | |||
GlobalValue.getInstance().deviceId = res.toString() | |||
} | |||
}) | |||
PreferencesHelper.get(StorageKeys.STAMP_PIC).then((res) => { | |||
if (res) { | |||
GlobalValue.getInstance().stampPic = res.toString() | |||
} | |||
}) | |||
PreferencesHelper.get(StorageKeys.NOT_CLIENT_ID).then((res) => { | |||
if (res) { | |||
GlobalValue.getInstance().certClientId = res.toString() | |||
} | |||
}) | |||
PreferencesHelper.get(StorageKeys.NOT_PHONE).then((res) => { | |||
if (res) { | |||
GlobalValue.getInstance().certPhone = res.toString() | |||
} | |||
}) | |||
PreferencesHelper.get(StorageKeys.CERT_ENV_URL).then((res) => { | |||
if (res) { | |||
GlobalValue.getInstance().certEnvUrl = res.toString() | |||
} | |||
}) | |||
PreferencesHelper.get(StorageKeys.SIGN_AUTO_PIN).then((res) => { | |||
if (res) { | |||
GlobalValue.getInstance().signAutoPin = res.toString() | |||
} | |||
}) | |||
PreferencesHelper.get(StorageKeys.SIGN_AUTO_DAY).then((res) => { | |||
if (res) { | |||
GlobalValue.getInstance().signAutoDay = res.toString() | |||
} | |||
}) | |||
PreferencesHelper.get(StorageKeys.CERT_ENV_TYPE).then((res) => { | |||
if (res) { | |||
GlobalValue.getInstance().certEnvType = res.toString() === "101" ? CertEnvType.DOCTOR : CertEnvType.MASS | |||
} | |||
}) | |||
} | |||
/** | |||
* 获取当前sdk版本号,独立维护 | |||
* @returns | |||
*/ | |||
public static getVersion() { | |||
return ConstantValue.VERSION | |||
} | |||
/** | |||
* 设置运行环境 | |||
* @param envType | |||
*/ | |||
public static setServerEnvType(envType: EnvEnum) { | |||
GlobalValue.getInstance().envType = envType | |||
} | |||
/** | |||
* 获取当前运行环境 | |||
* @returns | |||
*/ | |||
public static getServerEnvType(): EnvEnum { | |||
return GlobalValue.getInstance().envType | |||
} | |||
/** | |||
* 获取当前运行环境的url | |||
* @returns | |||
*/ | |||
public static getServerEnvUrl(): string { | |||
return GlobalValue.getInstance().envUrl | |||
} | |||
/** | |||
* 设置厂商id | |||
* @param clientId | |||
*/ | |||
public static setClientId(clientId: string) { | |||
GlobalValue.getInstance().setClientId(clientId) | |||
} | |||
/** | |||
* 获取当前厂商id | |||
* @returns | |||
*/ | |||
public static getClientId() { | |||
return GlobalValue.getInstance().getClientId() | |||
} | |||
/** | |||
* 根据url,获取对应环境信息 | |||
* @param rul | |||
*/ | |||
public static getEnvTypeByUrl(url: string): EnvEnum { | |||
return EnvCheck.getEnvTypeByUrl(url) | |||
} | |||
/** | |||
* 根据环境信息,获取url | |||
* @param envType | |||
*/ | |||
public static getUrlByEnvType(envType: EnvEnum): string { | |||
return EnvCheck.getUrlByEnvType(envType) | |||
} | |||
} |
@@ -0,0 +1,242 @@ | |||
import { List } from '@kit.ArkTS'; | |||
import { CaManagerReal } from './CaManagerReal'; | |||
import { BJCASDK } from '../public/BJCASDK'; | |||
import { BJCACallMsg, CallBackForData } from '../public/callBack/BJCACallMsg'; | |||
import { ApiUtils } from '../http/ApiUtils'; | |||
import { getSignAutoInfo, getSignAutoQuit, signWithServer, sureSignForSignAuto, verifyPin } from '../http/ApiConfig'; | |||
import { SignData } from '../bean/data/SignData'; | |||
import { GlobalValue } from '../common/GlobalValue'; | |||
import { encodeByRsa } from '../util/encodeUtil'; | |||
import { SignModel } from '../public/bean/SignModel'; | |||
import { PinData } from '../bean/data/PinData'; | |||
import { AutoData } from '../bean/data/AutoData'; | |||
import { AutoStopData } from '../bean/data/AutoStopData'; | |||
export class SignManagerReal { | |||
private static SIGN_BATCH_MAX_NUM = 100 | |||
public static listener: ((result: CallBackForData<string>) => void) | null = null | |||
public static signWithFirmId(uniqueIdList: List<string> | Array<string>, listener: (result: CallBackForData<Array<SignModel>>) => void) { | |||
if (uniqueIdList.length === 0) { | |||
listener(BJCACallMsg.ILLEGALITY) | |||
return | |||
} | |||
if (uniqueIdList.length > SignManagerReal.SIGN_BATCH_MAX_NUM) { | |||
listener(BJCACallMsg.ILLEGALITY) | |||
return | |||
} | |||
if (!CaManagerReal.existsCert()) { | |||
listener && listener(BJCACallMsg.CERT_NOT_EXISTS) | |||
return | |||
} | |||
if (SignManagerReal.isPinExempt()) { | |||
if (!GlobalValue.getInstance().certClientId) { | |||
listener && listener(BJCACallMsg.CERT_NOT_EXISTS) | |||
return | |||
} | |||
console.log('-------->', JSON.stringify(uniqueIdList)) | |||
// 开始签名 | |||
ApiUtils.post<Array<SignModel>>(signWithServer, new SignData( | |||
GlobalValue.getInstance().certClientId!, | |||
uniqueIdList, | |||
GlobalValue.getInstance().userId!, | |||
GlobalValue.getInstance().signAutoPin!, | |||
undefined | |||
)) | |||
.then((res: Array<SignModel>) => { | |||
listener && listener({ | |||
code: 1001, | |||
msg: '操作完成', | |||
data: res | |||
}) | |||
}).catch((error: Error) => { | |||
console.log('>>>>>', JSON.stringify(error)) | |||
listener && listener({ | |||
code: 1003, | |||
msg: `用户操作失败:${error.message}` | |||
}) | |||
}) | |||
} else { | |||
SignManagerReal.listener = (result: CallBackForData<string>) => { | |||
if (result.code === BJCACallMsg.SUCCESS.code) { | |||
console.log('-------->', JSON.stringify(uniqueIdList)) | |||
// 开始签名 | |||
ApiUtils.post<Array<SignModel>>(signWithServer, new SignData( | |||
GlobalValue.getInstance().certClientId!, | |||
uniqueIdList, | |||
GlobalValue.getInstance().userId!, | |||
encodeByRsa(result.data), | |||
undefined | |||
)) | |||
.then((res: Array<SignModel>) => { | |||
listener && listener({ | |||
code: 1001, | |||
msg: '操作完成', | |||
data: res | |||
}) | |||
}).catch((error: Error) => { | |||
console.log('>>>>>', JSON.stringify(error)) | |||
listener && listener({ | |||
code: 1003, | |||
msg: `用户操作失败:${error.message}` | |||
}) | |||
}) | |||
} else { | |||
listener && listener({ | |||
code: 1003, | |||
msg: `用户操作失败:${result.data}` | |||
}) | |||
} | |||
} | |||
BJCASDK.signManager().dialogController.open() | |||
} | |||
} | |||
public static keepPin(keepDay: number, listener: (result: CallBackForData<string>) => void) { | |||
if (keepDay < 1 || keepDay > 60 || !Number.isInteger(keepDay)) { | |||
listener(BJCACallMsg.ILLEGALITY) | |||
return | |||
} | |||
if (!CaManagerReal.existsCert()) { | |||
listener && listener(BJCACallMsg.CERT_NOT_EXISTS) | |||
return | |||
} | |||
SignManagerReal.listener = (result: CallBackForData<string>) => { | |||
if (result.code === BJCACallMsg.SUCCESS.code) { | |||
// 请求免密 | |||
ApiUtils.post<string>(verifyPin, new PinData( | |||
encodeByRsa(result.data), | |||
)) | |||
.then(() => { | |||
GlobalValue.getInstance().signAutoPin = encodeByRsa(result.data) | |||
const curDate = new Date().getTime() | |||
const keep = keepDay * 24 * 60 * 60 * 1000 | |||
GlobalValue.getInstance().signAutoDay = (curDate + keep).toString() | |||
listener && listener(BJCACallMsg.SIGN_SUCCESS) | |||
}).catch((error: Error) => { | |||
console.log('>>>>>', JSON.stringify(error)) | |||
listener && listener({ | |||
code: 1003, | |||
msg: `用户操作失败:${error.message}` | |||
}) | |||
}) | |||
} else { | |||
listener && listener(result) | |||
} | |||
} | |||
BJCASDK.signManager().dialogController.open() | |||
} | |||
public static isPinExempt(): boolean { | |||
if (!CaManagerReal.existsCert()) { | |||
return false | |||
} | |||
const day = GlobalValue.getInstance().signAutoDay | |||
if (!day) { | |||
return false | |||
} | |||
if (!GlobalValue.getInstance().signAutoPin) { | |||
return false | |||
} | |||
const curTime = new Date().getTime() | |||
if (Number.parseInt(day) - curTime < 0) { | |||
SignManagerReal.clearPin(() => { | |||
}) | |||
return false | |||
} | |||
return true | |||
} | |||
public static clearPin(listener: () => void) { | |||
GlobalValue.getInstance().signAutoPin = null | |||
GlobalValue.getInstance().signAutoDay = null | |||
listener() | |||
} | |||
public static signForSignAuto(sysTag: string, listener: (result: CallBackForData<string>) => void) { | |||
if (!CaManagerReal.existsCert()) { | |||
listener && listener(BJCACallMsg.CERT_NOT_EXISTS) | |||
return | |||
} | |||
SignManagerReal.listener = (result: CallBackForData<string>) => { | |||
if (result.code === BJCACallMsg.SUCCESS.code) { | |||
// 请求自动签 | |||
ApiUtils.post<string>(sureSignForSignAuto, new AutoData( | |||
sysTag, | |||
GlobalValue.getInstance().certClientId!, | |||
encodeByRsa(result.data), | |||
)) | |||
.then(() => { | |||
listener && listener(BJCACallMsg.SIGN_SUCCESS) | |||
}).catch((error: Error) => { | |||
console.log('>>>>>', JSON.stringify(error)) | |||
listener && listener({ | |||
code: 1003, | |||
msg: `用户操作失败:${error.message}` | |||
}) | |||
}) | |||
} else { | |||
listener && listener(result) | |||
} | |||
} | |||
BJCASDK.signManager().dialogController.open() | |||
} | |||
public static stopSignAuto(sysTag: string|undefined, listener: (result: CallBackForData<string>) => void) { | |||
if (!CaManagerReal.existsCert()) { | |||
listener && listener(BJCACallMsg.CERT_NOT_EXISTS) | |||
return | |||
} | |||
// 停止自动签 | |||
ApiUtils.post<string>(getSignAutoQuit, new AutoStopData( | |||
GlobalValue.getInstance().certClientId!, | |||
GlobalValue.getInstance().userId!, | |||
sysTag, | |||
)) | |||
.then(() => { | |||
listener && listener(BJCACallMsg.SIGN_SUCCESS) | |||
}).catch((error: Error) => { | |||
console.log('>>>>>', JSON.stringify(error)) | |||
listener && listener({ | |||
code: 1003, | |||
msg: `用户操作失败:${error.message}` | |||
}) | |||
}) | |||
} | |||
public static getSignAutoInfo(listener: (result: CallBackForData<string>) => void) { | |||
if (!CaManagerReal.existsCert()) { | |||
listener && listener(BJCACallMsg.CERT_NOT_EXISTS) | |||
return | |||
} | |||
// 停止自动签 | |||
ApiUtils.post<string>(getSignAutoInfo, new AutoStopData( | |||
GlobalValue.getInstance().certClientId!, | |||
GlobalValue.getInstance().userId!, | |||
undefined, | |||
)) | |||
.then(() => { | |||
listener && listener(BJCACallMsg.SIGN_SUCCESS) | |||
}).catch((error: Error) => { | |||
console.log('>>>>>', JSON.stringify(error)) | |||
listener && listener({ | |||
code: 1003, | |||
msg: `用户操作失败:${error.message}` | |||
}) | |||
}) | |||
} | |||
} |
@@ -0,0 +1,162 @@ | |||
import { GlobalValue } from '../common/GlobalValue' | |||
import { getCertInfo } from '../http/ApiConfig' | |||
import { ApiUtils } from '../http/ApiUtils' | |||
import { CertInfoModel } from '../bean/model/CertInfoModel' | |||
import { AlertDialog } from '@ohos.arkui.advanced.Dialog' | |||
import { BackManager } from '../manager/BackManager' | |||
import { BJCACallMsg } from '../public/callBack/BJCACallMsg' | |||
import { ComposeTitleBar, router, SwipeRefresher } from '@kit.ArkUI' | |||
import { CertInfoData } from '../bean/data/CertInfoData' | |||
@Entry({ routeName: 'ShowCertPage' }) | |||
@Preview | |||
@Component | |||
export struct CertDetails { | |||
// 证书信息 | |||
@State certInfo: CertInfoModel | null = null | |||
@State isLoading: boolean = false | |||
dialogControllerConfirm: CustomDialogController = new CustomDialogController({ | |||
builder: AlertDialog({ | |||
content: '获取证书信息失败', | |||
secondaryButton: { | |||
value: '确认', | |||
fontColor: $r('sys.color.ohos_id_color_warning'), | |||
action: () => { | |||
// BackManager.get().call(BJCACallMsg.ERROR_CERT_INFO) | |||
router.back() | |||
} | |||
}, | |||
}), | |||
autoCancel: false, | |||
customStyle: true, | |||
alignment: DialogAlignment.Center | |||
}) | |||
aboutToDisappear(): void { | |||
BackManager.get() | |||
.call(this.isLoading ? BJCACallMsg.CANCEL : this.certInfo ? BJCACallMsg.SUCCESS : BJCACallMsg.ERROR_CERT_INFO) | |||
} | |||
aboutToAppear(): void { | |||
// 获取证书信息 | |||
ApiUtils.post<CertInfoModel>(getCertInfo(), new CertInfoData(GlobalValue.getInstance() | |||
.userId!!, GlobalValue.getInstance().getClientId()!!)) | |||
.then((res: CertInfoModel) => { | |||
console.log('------------->', JSON.stringify(res)) | |||
this.certInfo = res | |||
}).catch((error: Error) => { | |||
this.dialogControllerConfirm.open() | |||
console.log('>>>>>', JSON.stringify(error)) | |||
// ToolsHelper.showMessage(error.message) | |||
}) | |||
} | |||
build() { | |||
Column() { | |||
Column() { | |||
ComposeTitleBar({ | |||
title: "证书详情", | |||
}).width('100%') | |||
Column() { | |||
Image($r("app.media.mo_ywx_icon_title")) | |||
.width(50) | |||
.height(50) | |||
.margin({ top: 10 }) | |||
Text($r("app.string.mo_ywx_module_cert_title")) | |||
.fontSize(17) | |||
.fontColor("#073152") | |||
Text(`姓名:${this.certInfo?.userName ?? ""}`) | |||
.fontSize(14) | |||
.fontColor("#073152") | |||
.width("100%") | |||
.margin({ top: 15 }) | |||
.padding({ left: 30, right: 30 }) | |||
Text(`性别:${this.certInfo?.sex ?? ""}`) | |||
.fontSize(14) | |||
.fontColor("#073152") | |||
.width("100%") | |||
.margin({ top: 5 }) | |||
.padding({ left: 30, right: 30 }) | |||
Text(`单位:${this.certInfo?.unit ?? ""}`) | |||
.fontSize(14) | |||
.fontColor("#073152") | |||
.width("100%") | |||
.margin({ top: 5 }) | |||
.padding({ left: 30, right: 30 }) | |||
Text(`资格证书类型:${this.certInfo?.idTypeDes ?? ""}`) | |||
.fontSize(14) | |||
.fontColor("#073152") | |||
.width("100%") | |||
.margin({ top: 5 }) | |||
.padding({ left: 30, right: 30 }) | |||
Text(`该人员已通过${this.certInfo?.caOrgName ?? ""}线下资格审定及真实身份真实性验证,该人员身份及信息真实可靠,特此认证。`) | |||
.fontSize(14) | |||
.fontColor("#073152") | |||
.width("100%") | |||
.margin({ top: 80 }) | |||
.lineHeight(20) | |||
.padding({ left: 30, right: 30 }) | |||
Stack() { | |||
Image($r("app.media.mo_ywx_module_icon_stamp")) | |||
.width(50) | |||
.height(50) | |||
.margin({ top: 10 }) | |||
Column() { | |||
Text(`颁发机构:${this.certInfo?.caOrgName ?? ""}`) | |||
.fontSize(12) | |||
.fontColor("#073152") | |||
.padding({ left: 30, right: 70 }) | |||
Text(`颁发时间:${this.certInfo?.startDate ?? ""}`) | |||
.fontSize(12) | |||
.fontColor("#073152") | |||
.margin({ top: 5 }) | |||
.padding({ left: 30, right: 70 }) | |||
Text(`有效时间:${this.certInfo?.endDate ?? ""}`) | |||
.fontSize(12) | |||
.fontColor("#073152") | |||
.margin({ top: 5 }) | |||
.padding({ left: 30, right: 70 }) | |||
} | |||
}.margin({ top: 90 }) | |||
Column() { | |||
Text("一一证书说明一一") | |||
.fontSize(12) | |||
.fontColor("#666666") | |||
.margin({ top: 5 }) | |||
.fontWeight(FontWeight.Bold) | |||
Text(`本授权证书为有效文本、不得影印、涂改、转让。\n ${this.certInfo?.caOrgName ?? ""}拥有此授权书的最终解释权。`) | |||
.fontSize(12) | |||
.lineHeight(16) | |||
.fontColor("#666666") | |||
.margin({ top: 5 }) | |||
.fontWeight(FontWeight.Bold) | |||
} | |||
.justifyContent(FlexAlign.End) | |||
.margin({ top: 90 }) | |||
} | |||
.backgroundImage($r("app.media.mo_ywx_module_bg_cert")) | |||
.backgroundImageSize(ImageSize.Contain) | |||
.padding(20) | |||
.width('100%') | |||
.height('100%') | |||
} | |||
.width('100%') | |||
.height('100%') | |||
.visibility(this.isLoading ? Visibility.None : Visibility.Visible) | |||
Column() { | |||
SwipeRefresher({ | |||
content: '', | |||
isLoading: true | |||
}) | |||
} | |||
.width('100%') | |||
.height('100%') | |||
.justifyContent(FlexAlign.Center) | |||
.visibility(this.isLoading ? Visibility.Visible : Visibility.None) | |||
}.width('100%').height('100%') | |||
} | |||
} |
@@ -0,0 +1,283 @@ | |||
import { ComposeTitleBar, router } from '@kit.ArkUI'; | |||
import { GlobalValue } from '../common/GlobalValue'; | |||
import { certDown, getAgreement, verifyCodeUrl } from '../http/ApiConfig'; | |||
import { ApiUtils } from '../http/ApiUtils'; | |||
import { VerifyCodeModel } from '../bean/model/VerifyCodeModel'; | |||
import { ToolsHelper, XWebHelper } from '@szyx/sdk_base/Index'; | |||
import { BJCACallMsg } from '../public/callBack/BJCACallMsg'; | |||
import { BackManager } from '../manager/BackManager'; | |||
import { AgreementItem, AgreementModel } from '../bean/model/AgreementModel'; | |||
import { encodeByRsa } from '../util/encodeUtil'; | |||
import { CertDownModel } from '../bean/model/CertDownModel'; | |||
class routerParams { | |||
phone: string | |||
mFirmId?: string | |||
// 0-下证;1-更新;2-重置 | |||
certDownType: number | |||
constructor(phone: string, certDownType: number, mFirmId?: string) { | |||
this.phone = phone | |||
this.mFirmId = mFirmId | |||
this.certDownType = certDownType | |||
} | |||
} | |||
class data { | |||
phoneNum: string | |||
type: number | |||
constructor(phone: string, type: number) { | |||
this.phoneNum = phone; | |||
this.type = type; | |||
} | |||
} | |||
class AgreementData { | |||
phone: string | |||
type: string | |||
firmId?: string | |||
constructor(phone: string, type: string, firmId?: string) { | |||
this.phone = phone; | |||
this.type = type; | |||
this.firmId = firmId; | |||
} | |||
} | |||
class DownBean { | |||
verifyCode: string | |||
userId: string | |||
pin: string | |||
clientId?: string | |||
constructor(verifyCode: string, userId: string, pin: string, clientId?: string) { | |||
this.verifyCode = verifyCode; | |||
this.userId = userId; | |||
this.pin = pin; | |||
this.clientId = clientId; | |||
} | |||
} | |||
@Entry({ routeName: 'CertDown' }) | |||
@Preview | |||
@Component | |||
export struct CertDown { | |||
// 手机号 | |||
@State phone: string = (router.getParams() as routerParams).phone | |||
@State mFirmId?: string = (router.getParams() as routerParams).mFirmId | |||
// @State phone: string = '13691543886' | |||
//验证码 | |||
@State verifyCode: string | null = null | |||
@State userId: string | null = null | |||
// 签名密码设置 | |||
@State pwd: string | null = null | |||
// 签名密码确认 | |||
@State pwd2: string | null = null | |||
// 验证码倒计时 | |||
@State verifyCodeCountDown: number = 60 | |||
// 是否正在倒计时 | |||
@State isCountDown: boolean = false | |||
// 退出页面时,是否用户主动取消 | |||
@State isCancel: boolean = true | |||
// 是否需要显示协议 | |||
@State showAgreement: boolean = false | |||
// 导航栏title | |||
@State title: string = '证书下载' | |||
// 下证类型 | |||
@State certDownType: number = (router.getParams() as routerParams).certDownType | |||
// 协议列表 | |||
@State agreementModel: AgreementModel | null = null | |||
// 是否勾选协议 | |||
@State checkAgreement: boolean = false | |||
aboutToAppear(): void { | |||
switch (this.certDownType) { | |||
case 0: | |||
this.showAgreement = true | |||
this.title = '证书下载' | |||
// 只有下证需要获取协议列表 | |||
ApiUtils.get<AgreementModel>(getAgreement, new AgreementData(this.phone, 'certDown', this.mFirmId)) | |||
.then((res: AgreementModel) => { | |||
this.agreementModel = res | |||
console.log('------------->', JSON.stringify(res.list)) | |||
}).catch((error: Error) => { | |||
console.log('>>>>>', JSON.stringify(error)) | |||
ToolsHelper.showMessage(error.message) | |||
}) | |||
break | |||
case 1: | |||
this.showAgreement = false | |||
this.title = '证书更新' | |||
break | |||
case 2: | |||
this.showAgreement = false | |||
this.title = '签名密码重置' | |||
break | |||
} | |||
ApiUtils.post<VerifyCodeModel>(verifyCodeUrl, new data(this.phone, 0)) | |||
.then((res: VerifyCodeModel) => { | |||
GlobalValue.getInstance().userId = res.userId | |||
this.userId = res.userId | |||
this.verifyCodeCountDown = 60 | |||
this.isCountDown = true | |||
}).catch((error: Error) => { | |||
console.log('>>>>>', JSON.stringify(error)) | |||
ToolsHelper.showMessage(error.message) | |||
}) | |||
setInterval(() => { | |||
if (this.isCountDown) { | |||
this.verifyCodeCountDown -= 1 | |||
} | |||
if (this.verifyCodeCountDown <= 0) { | |||
this.isCountDown = false | |||
} | |||
}, 1000) | |||
} | |||
aboutToDisappear(): void { | |||
// 退出页面时候,判断操作状态 | |||
BackManager.get().call(this.isCancel ? BJCACallMsg.CANCEL : BJCACallMsg.SUCCESS) | |||
} | |||
build() { | |||
Column() { | |||
ComposeTitleBar({ | |||
title: this.title, | |||
}).width('100%') | |||
Column() { | |||
Text(`下证手机号${this.phone}`).margin({ top: 30 }) | |||
Flex({ wrap: FlexWrap.NoWrap, alignItems: ItemAlign.Center }) { | |||
Text('验证码').width('17%') | |||
TextInput({ | |||
placeholder: '请输入验证码', | |||
text: $$this.verifyCode, | |||
}).width('50%') | |||
.maxLength(6) | |||
.type(InputType.PhoneNumber) | |||
Button(this.isCountDown ? `${this.verifyCodeCountDown}s` : '获取验证码', { | |||
stateEffect: true, | |||
type: ButtonType.Capsule, | |||
buttonStyle: ButtonStyleMode.EMPHASIZED | |||
}) | |||
.fontColor('#ffffff') | |||
.height(40) | |||
.flexGrow(1) | |||
.enabled(!this.isCountDown) | |||
.onClick(() => { | |||
ApiUtils.post<VerifyCodeModel>(verifyCodeUrl, new data(this.phone, 0)) | |||
.then((res: VerifyCodeModel) => { | |||
GlobalValue.getInstance().userId = res.userId | |||
this.userId = res.userId | |||
this.verifyCodeCountDown = 60 | |||
this.isCountDown = true | |||
}).catch((error: Error) => { | |||
console.log('>>>>>', JSON.stringify(error)) | |||
ToolsHelper.showMessage(error.message) | |||
}) | |||
}) | |||
.width('30%') | |||
}.margin({ top: 30 }) | |||
Flex({ wrap: FlexWrap.NoWrap, alignItems: ItemAlign.Center }) { | |||
Text('签名密码').width('22%') | |||
TextInput({ | |||
placeholder: '请创建签名密码', | |||
text: $$this.pwd, | |||
}).width('70%') | |||
.maxLength(6) | |||
.type(InputType.NUMBER_PASSWORD) | |||
}.margin({ top: 20 }) | |||
Flex({ wrap: FlexWrap.NoWrap, alignItems: ItemAlign.Center }) { | |||
Text('确认密码').width('22%') | |||
TextInput({ | |||
placeholder: '请再次输入签名密码', | |||
text: $$this.pwd2, | |||
}).width('70%') | |||
.maxLength(6) | |||
.type(InputType.NUMBER_PASSWORD) | |||
}.margin({ top: 20 }) | |||
Flex({ alignItems: ItemAlign.Center }) { | |||
Checkbox({ name: 'checkbox1', group: 'checkboxGroup' }) | |||
.shape(CheckBoxShape.ROUNDED_SQUARE) | |||
.selectedColor(0x39a2db) | |||
.onChange((value: boolean) => { | |||
console.info('Checkbox1 change is' + value) | |||
this.checkAgreement = value | |||
}) | |||
.mark({ | |||
strokeColor: Color.Black, | |||
size: 50, | |||
strokeWidth: 5 | |||
}) | |||
.width(30) | |||
.height(30) | |||
ForEach(this.agreementModel?.list, (item: AgreementItem, index) => { | |||
Text(`${index === 0 ? '' : '、'}《${item.agreementName}》`) | |||
.fontSize(13) | |||
.fontColor('#0089FF') | |||
.onClick(() => { | |||
XWebHelper.openWeb({ | |||
url: item.agreementUrl, | |||
title: item.agreementName, | |||
}) | |||
}) | |||
}) | |||
}.margin({ top: 20 }) | |||
.visibility(this.showAgreement ? Visibility.Visible : Visibility.None) | |||
Button('确定', { stateEffect: true, type: ButtonType.Capsule, buttonStyle: ButtonStyleMode.EMPHASIZED }) | |||
.width('40%') | |||
.fontColor('#ffffff') | |||
.height(40) | |||
.onClick(() => { | |||
if (!this.userId) { | |||
ToolsHelper.showMessage('验证码获取可能存在异常,请重新获取后再试。') | |||
return | |||
} | |||
if (!this.verifyCode) { | |||
ToolsHelper.showMessage('请输入验证码') | |||
return | |||
} | |||
if (!GlobalValue.getInstance().userId) { | |||
ToolsHelper.showMessage('请先获取验证码') | |||
return | |||
} | |||
if (!this.pwd || !this.pwd2 || this.pwd !== this.pwd2) { | |||
ToolsHelper.showMessage('请输入签名密码') | |||
return | |||
} | |||
if (!this.checkAgreement && this.showAgreement) { | |||
ToolsHelper.showMessage('请阅读并同意相关协议') | |||
return | |||
} | |||
ApiUtils.post<CertDownModel>(certDown, new DownBean(this.verifyCode, GlobalValue.getInstance() | |||
.userId!, encodeByRsa(this.pwd))) | |||
.then((res: CertDownModel) => { | |||
console.log('>>>>>', JSON.stringify(res)) | |||
this.isCancel = false | |||
if (res.stamp) { | |||
GlobalValue.getInstance().stampPic = res.stamp | |||
} else { | |||
GlobalValue.getInstance().stampPic = null | |||
} | |||
GlobalValue.getInstance().userId = res.userId | |||
GlobalValue.getInstance().certClientId = GlobalValue.getInstance().getClientId()!! | |||
GlobalValue.getInstance().certPhone = this.phone | |||
GlobalValue.getInstance().certEnvUrl = GlobalValue.getInstance().envUrl | |||
router.back() | |||
}).catch((error: Error) => { | |||
console.log('>>>>>', JSON.stringify(error.message)) | |||
ToolsHelper.showMessage(error.message) | |||
}) | |||
}) | |||
.margin({ top: 30 }) | |||
}.padding({ left: 15, right: 15 }).width('100%').height('100%') | |||
}.width('100%').height('100%') | |||
} | |||
} |
@@ -0,0 +1,14 @@ | |||
import { WindowHelper } from '@szyx/sdk_base/Index' | |||
@Entry | |||
@Component | |||
export struct PinView { | |||
build() { | |||
Button('pushPathByName', { stateEffect: true, type: ButtonType.Capsule }) | |||
.width('80%') | |||
.height(40) | |||
.margin(20) | |||
.onClick(() => { | |||
}) | |||
} | |||
} |
@@ -0,0 +1,48 @@ | |||
import { CaManager } from './CaManager' | |||
import { SettingManager } from './SettingManager' | |||
import { SignManager } from './SignManager' | |||
/** | |||
* 数字医信签名sdk,入口 | |||
*/ | |||
export class BJCASDK { | |||
// 是否实例的标志 | |||
private static instance1: SettingManager | null = null | |||
private static instance2: CaManager | null = null | |||
private static instance3: SignManager | null = null | |||
/** | |||
* 设置管理 | |||
* @returns | |||
*/ | |||
static settingManager() { | |||
// 判断系统是否已经有单例了 | |||
if (BJCASDK.instance1 === null) { | |||
BJCASDK.instance1 = new SettingManager() | |||
} | |||
return BJCASDK.instance1 | |||
} | |||
/** | |||
* 证书管理 | |||
* @returns | |||
*/ | |||
static certManager() { | |||
// 判断系统是否已经有单例了 | |||
if (BJCASDK.instance2 === null) { | |||
BJCASDK.instance2 = new CaManager() | |||
} | |||
return BJCASDK.instance2 | |||
} | |||
/** | |||
* 签名管理 | |||
* @returns | |||
*/ | |||
static signManager() { | |||
// 判断系统是否已经有单例了 | |||
if (BJCASDK.instance3 === null) { | |||
BJCASDK.instance3 = new SignManager() | |||
} | |||
return BJCASDK.instance3 | |||
} | |||
} |
@@ -0,0 +1,83 @@ | |||
import { CallBackForData, CallBackMsg } from './callBack/BJCACallMsg'; | |||
import { BackManager } from '../manager/BackManager'; | |||
import { UserInfoModel } from './bean/UserInfoModel'; | |||
import { CaManagerReal } from '../manager/CaManagerReal'; | |||
export class CaManager { | |||
/** | |||
* 证书是否存在 | |||
* @param phone | |||
* @returns | |||
*/ | |||
public existsCert(phone?: string): boolean { | |||
return CaManagerReal.existsCert(phone) | |||
} | |||
/** | |||
* 下证 | |||
* @param phone | |||
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|ROUTER|SUCCESS|CANCEL) | |||
*/ | |||
public certDown(phone: string, mFirmId: string | undefined, listener: (result: CallBackMsg) => void) { | |||
CaManagerReal.certDown(phone, mFirmId, listener) | |||
} | |||
/** | |||
* 更新证书 | |||
* @param phone | |||
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|ROUTER|SUCCESS|CANCEL|CERT_NOT_UPDATE|CERT_NOT_EXISTS) | |||
*/ | |||
public certUpdate(phone: string, mFirmId: string | undefined, listener: (result: CallBackMsg) => void) { | |||
CaManagerReal.certUpdate(phone, mFirmId, listener) | |||
} | |||
/** | |||
* 重置pin码 | |||
* @param mFirmId | |||
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|ROUTER|SUCCESS|CANCEL|CERT_NOT_EXISTS) | |||
*/ | |||
public certResetPin(mFirmId: string | undefined, listener: (result: CallBackMsg) => void) { | |||
CaManagerReal.certResetPin(mFirmId, listener) | |||
} | |||
/** | |||
* 清除本地证书 | |||
* @param phone | |||
* @param listener 操作完成 | |||
*/ | |||
public certClear(listener?: () => void) { | |||
CaManagerReal.certClear(listener) | |||
} | |||
/** | |||
* 获取签章图片 | |||
* @param listener BJCACallMsg.SUCCESS.code & base64 || BJCACallMsg.FAILED.code | |||
*/ | |||
public drawStamp(phone: string, listener: (result: CallBackForData<string>) => void) { | |||
CaManagerReal.drawStamp(phone, listener) | |||
} | |||
/** | |||
* 显示证书页面 | |||
* @param phone | |||
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|ROUTER|SUCCESS|CANCEL|CERT_NOT_EXISTS|ERROR_CERT_INFO) | |||
*/ | |||
public showCertPage(phone: string, listener: (result: CallBackMsg) => void) { | |||
CaManagerReal.showCertPage(phone, listener) | |||
} | |||
/** | |||
* 获取用户信息 | |||
* @param phone | |||
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|CERT_NOT_EXISTS)||BJCACallMsg.SUCCESS.code & base64 || BJCACallMsg.FAILED.code | |||
*/ | |||
public getUserInfo(phone: string, listener: (result: CallBackForData<UserInfoModel>) => void) { | |||
CaManagerReal.getUserInfo(phone, listener) | |||
if (!BackManager.get().checkParams(phone, listener)) { | |||
return | |||
} | |||
} | |||
} |
@@ -0,0 +1,77 @@ | |||
import { EnvEnum } from '../enum/EnvEnum' | |||
import { SettingManagerReal } from '../manager/SettingManagerReal' | |||
export class SettingManager { | |||
/** | |||
* 初始化方法,不调用的话,无法获取本地clientId | |||
* | |||
*/ | |||
public init() { | |||
SettingManagerReal.init() | |||
} | |||
/** | |||
* 获取当前sdk版本号,独立维护 | |||
* @returns | |||
*/ | |||
public getVersion(): string { | |||
return SettingManagerReal.getVersion() | |||
} | |||
/** | |||
* 设置运行环境 | |||
* @param envType | |||
*/ | |||
public setServerEnvType(envType: EnvEnum) { | |||
SettingManagerReal.setServerEnvType(envType) | |||
} | |||
/** | |||
* 获取当前运行环境 | |||
* @returns | |||
*/ | |||
public getServerEnvType(): EnvEnum { | |||
return SettingManagerReal.getServerEnvType() | |||
} | |||
/** | |||
* 获取当前运行环境的url | |||
* @returns | |||
*/ | |||
public getServerEnvUrl(): string { | |||
return SettingManagerReal.getServerEnvUrl() | |||
} | |||
/** | |||
* 设置厂商id | |||
* @param clientId | |||
*/ | |||
public setClientId(clientId: string) { | |||
SettingManagerReal.setClientId(clientId) | |||
} | |||
/** | |||
* 获取当前厂商id | |||
* @returns | |||
*/ | |||
public getClientId(): string | undefined { | |||
return SettingManagerReal.getClientId() | |||
} | |||
/** | |||
* 根据url,获取对应环境信息 | |||
* @param rul | |||
*/ | |||
public getEnvTypeByUrl(url: string): EnvEnum { | |||
return SettingManagerReal.getEnvTypeByUrl(url) | |||
} | |||
/** | |||
* 根据环境信息,获取url | |||
* @param envType | |||
*/ | |||
public getUrlByEnvType(envType: EnvEnum): string { | |||
return SettingManagerReal.getUrlByEnvType(envType) | |||
} | |||
} |
@@ -0,0 +1,73 @@ | |||
import { SignManagerReal } from '../manager/SignManagerReal'; | |||
import { List } from '@kit.ArkTS'; | |||
import { XDialogController } from '@szyx/sdk_base/Index'; | |||
import { CallBackForData } from './callBack/BJCACallMsg'; | |||
import { SignModel } from './bean/SignModel'; | |||
export class SignManager { | |||
dialogController: XDialogController = {} as XDialogController | |||
/** | |||
* 开始签名 | |||
* @param uniqueIdList 待签数据 | |||
* @param listener | |||
*/ | |||
public signWithFirmId(uniqueIdList: List<string> | Array<string>, listener: (result: CallBackForData<Array<SignModel>>) => void) { | |||
SignManagerReal.signWithFirmId(uniqueIdList, listener) | |||
} | |||
/** | |||
* 开启免密签名 | |||
* @param keepDay 开启天数,1-60 | |||
* @param listener | |||
*/ | |||
public keepPin(keepDay: number, listener: (result: CallBackForData<string>) => void) { | |||
SignManagerReal.keepPin(keepDay, listener) | |||
} | |||
/** | |||
* 查询免密签名开启状态 | |||
* @returns 是否已开启 | |||
*/ | |||
public isPinExempt(): boolean { | |||
return SignManagerReal.isPinExempt() | |||
} | |||
/** | |||
* 关闭免密签名 | |||
* | |||
*/ | |||
public clearPin(listener: () => void) { | |||
SignManagerReal.clearPin(listener) | |||
} | |||
/** | |||
* 开启自动签 | |||
* @param sysTag 开启系统标识 | |||
* @param listener | |||
*/ | |||
public signForSignAuto(sysTag: string, listener: (result: CallBackForData<string>) => void) { | |||
SignManagerReal.signForSignAuto(sysTag, listener) | |||
} | |||
/** | |||
* 关闭自动签 | |||
* @param sysTag 开启系统标识 | |||
* @param listener | |||
*/ | |||
public stopSignAuto(sysTag: string | undefined, listener: (result: CallBackForData<string>) => void) { | |||
SignManagerReal.stopSignAuto(sysTag, listener) | |||
} | |||
/** | |||
* 获取自动签信息 | |||
* @param listener | |||
*/ | |||
public getSignAutoInfo(listener: (result: CallBackForData<string>) => void) { | |||
SignManagerReal.getSignAutoInfo(listener) | |||
} | |||
} |
@@ -0,0 +1,3 @@ | |||
export interface SignModel { | |||
fileUniqueId: string | |||
} |
@@ -0,0 +1,14 @@ | |||
export interface UserInfoModel { | |||
certUpdateTipDay: number | |||
deviceId: string | |||
enableCert: boolean | |||
endDate: string | |||
idCardNum: string | |||
idCardType: string | |||
nowDate: string | |||
openId: string | |||
phoneNum: string | |||
picUrl: string | |||
startDate: string | |||
userName: string | |||
} |
@@ -0,0 +1,82 @@ | |||
import { UserInfoModel } from '../bean/UserInfoModel' | |||
export interface CallBackMsg { | |||
code: number | |||
msg: string | |||
} | |||
export interface CallBackForData<T> { | |||
code: number | |||
msg: string | |||
data?: T | |||
} | |||
export class BJCACallMsg { | |||
//通用 | |||
public static SUCCESS: CallBackMsg = { | |||
code: 1001, | |||
msg: '操作完成' | |||
} | |||
public static CANCEL: CallBackMsg = { | |||
code: 1002, | |||
msg: '用户取消操作' | |||
} | |||
public static FAILED: CallBackMsg = { | |||
code: 1003, | |||
msg: '用户操作失败' | |||
} | |||
public static UNKOWN: CallBackMsg = { | |||
code: 1004, | |||
msg: '未知错误' | |||
} | |||
public static ROUTER: CallBackMsg = { | |||
code: 1005, | |||
msg: '路由错误' | |||
} | |||
public static ILLEGALITY: CallBackMsg = { | |||
code: 1006, | |||
msg: '参数不合法' | |||
} | |||
public static NOT_CLIENT: CallBackMsg = { | |||
code: 10001, | |||
msg: '厂商id不存在' | |||
} | |||
public static NOT_PHONE: CallBackMsg = { | |||
code: 10002, | |||
msg: '手机号格式错误' | |||
} | |||
// 证书相关 | |||
public static CERT_NOT_EXISTS: CallBackMsg = { | |||
code: 10003, | |||
msg: '证书不存在' | |||
} | |||
public static CERT_EXISTS: CallBackMsg = { | |||
code: 1001, | |||
msg: '证书存在' | |||
} | |||
public static SUCCESS_CERT_INFO: CallBackForData<UserInfoModel> = { | |||
code: 1001, | |||
msg: '获取证书信息成功' | |||
} | |||
public static ERROR_CERT_INFO: CallBackForData<UserInfoModel> = { | |||
code: 10004, | |||
msg: '获取证书信息失败' | |||
} | |||
public static CERT_NOT_UPDATE: CallBackForData<UserInfoModel> = { | |||
code: 10005, | |||
msg: '证书未到可更新时间' | |||
} | |||
// 签名相关 | |||
public static SIGN_CANCEL: CallBackForData<string> = { | |||
code: 1002, | |||
msg: '用户取消操作' | |||
} | |||
public static SIGN_SUCCESS: CallBackForData<string> = { | |||
code: 1001, | |||
msg: '操作完成' | |||
} | |||
public static SIGN_SUCCESS_REST: CallBackForData<string> = { | |||
code: 10011, | |||
msg: '重置密码' | |||
} | |||
} |
@@ -0,0 +1,263 @@ | |||
import { XDialogCommon, XDialogController } from '@szyx/sdk_base/Index' | |||
import { SignManagerReal } from '../../manager/SignManagerReal' | |||
import { BJCASDK } from '../BJCASDK' | |||
import { BJCACallMsg, CallBackMsg } from '../callBack/BJCACallMsg' | |||
@Preview | |||
@Component | |||
export struct PinDialog { | |||
controller: XDialogController | null = null | |||
private dialogController: CustomDialogController | null = null | |||
@State list: Array<string> = new Array() | |||
build() { | |||
// this.buildContent() | |||
} | |||
aboutToAppear(): void { | |||
this.list = [] | |||
this.dialogController = new CustomDialogController({ | |||
builder: XDialogCommon({ | |||
dialogContent: () => { | |||
this.buildContent() | |||
}, | |||
}), | |||
alignment: DialogAlignment.Bottom, | |||
autoCancel: true, | |||
customStyle: true, | |||
cancel: () => { | |||
SignManagerReal.listener && SignManagerReal.listener(BJCACallMsg.SIGN_CANCEL) | |||
} | |||
}) | |||
if (this.controller) { | |||
this.controller.open = () => { | |||
this.list = [] | |||
this.dialogController?.open() | |||
} | |||
this.controller.close = () => { | |||
this.list = [] | |||
this.dialogController?.close() | |||
} | |||
} | |||
} | |||
private addNum(num: string) { | |||
this.list.push(num) | |||
if (this.list.length === 6) { | |||
SignManagerReal.listener && SignManagerReal.listener({ | |||
code: 1001, | |||
msg: '操作完成', | |||
data: this.list.join('') | |||
}) | |||
this.dialogController?.close() | |||
} | |||
} | |||
@Builder | |||
buildContent() { | |||
Column() { | |||
Text('请输入6位数字密码') | |||
.fontSize(16) | |||
.textAlign(TextAlign.Center) | |||
.width('100%') | |||
.height(60) | |||
Row() { | |||
Column() { | |||
Circle().width(13).height(13).visibility(this.list.length >= 1 ? Visibility.Visible : Visibility.Hidden) | |||
}.width('16.65%').height('100%').justifyContent(FlexAlign.Center) | |||
Divider().strokeWidth(1).color('#DDDDDD').vertical(true) | |||
Column() { | |||
Circle().width(13).height(13).visibility(this.list.length >= 2 ? Visibility.Visible : Visibility.Hidden) | |||
}.width('16.65%').height('100%').justifyContent(FlexAlign.Center) | |||
Divider().strokeWidth(1).color('#DDDDDD').vertical(true) | |||
Column() { | |||
Circle().width(13).height(13).visibility(this.list.length >= 3 ? Visibility.Visible : Visibility.Hidden) | |||
}.width('16.65%').height('100%').justifyContent(FlexAlign.Center) | |||
Divider().strokeWidth(1).color('#DDDDDD').vertical(true) | |||
Column() { | |||
Circle().width(13).height(13).visibility(this.list.length >= 4 ? Visibility.Visible : Visibility.Hidden) | |||
}.width('16.65%').height('100%').justifyContent(FlexAlign.Center) | |||
Divider().strokeWidth(1).color('#DDDDDD').vertical(true) | |||
Column() { | |||
Circle().width(13).height(13).visibility(this.list.length >= 5 ? Visibility.Visible : Visibility.Hidden) | |||
}.width('16.65%').height('100%').justifyContent(FlexAlign.Center) | |||
Divider().strokeWidth(1).color('#DDDDDD').vertical(true) | |||
Column() { | |||
Circle().width(13).height(13).visibility(this.list.length >= 6 ? Visibility.Visible : Visibility.Hidden) | |||
}.width('16.65%').height('100%').justifyContent(FlexAlign.Center) | |||
}.height(48).border({ | |||
width: 1, | |||
color: '#DDDDDD' | |||
}).margin({ | |||
left: 10, | |||
right: 10, | |||
top: 30 | |||
}) | |||
Text('忘记密码?') | |||
.width('100%') | |||
.margin({ top: 12, right: 10 }) | |||
.textAlign(TextAlign.End) | |||
.fontSize(10) | |||
.fontColor('#18ABFB') | |||
.onClick(() => { | |||
BJCASDK.certManager().certResetPin(undefined, (result: CallBackMsg) => { | |||
if (result.code === BJCACallMsg.SUCCESS.code) { | |||
SignManagerReal.listener && SignManagerReal.listener(BJCACallMsg.SIGN_SUCCESS_REST) | |||
} else { | |||
SignManagerReal.listener && SignManagerReal.listener(result) | |||
} | |||
}) | |||
}) | |||
Divider().strokeWidth(0.5).color('#DDDDDD').margin({ | |||
top: 30 | |||
}) | |||
Row() { | |||
Text('1') | |||
.width('33.33%') | |||
.height('100%') | |||
.textAlign(TextAlign.Center) | |||
.fontSize(30) | |||
.fontColor('#333333') | |||
.onClick(() => { | |||
this.addNum('1') | |||
}) | |||
Divider().strokeWidth(0.5).color('#DDDDDD').vertical(true) | |||
Text('2') | |||
.width('33.33%') | |||
.height('100%') | |||
.textAlign(TextAlign.Center) | |||
.fontSize(30) | |||
.fontColor('#333333') | |||
.onClick(() => { | |||
this.addNum('2') | |||
}) | |||
Divider().strokeWidth(0.5).color('#DDDDDD').vertical(true) | |||
Text('3') | |||
.width('33.33%') | |||
.height('100%') | |||
.textAlign(TextAlign.Center) | |||
.fontSize(30) | |||
.fontColor('#333333') | |||
.onClick(() => { | |||
this.addNum('3') | |||
}) | |||
}.height(55) | |||
Divider().strokeWidth(0.5).color('#DDDDDD') | |||
Row() { | |||
Text('4') | |||
.width('33.33%') | |||
.height('100%') | |||
.textAlign(TextAlign.Center) | |||
.fontSize(30) | |||
.fontColor('#333333') | |||
.onClick(() => { | |||
this.addNum('4') | |||
}) | |||
Divider().strokeWidth(0.5).color('#DDDDDD').vertical(true) | |||
Text('5') | |||
.width('33.33%') | |||
.height('100%') | |||
.textAlign(TextAlign.Center) | |||
.fontSize(30) | |||
.fontColor('#333333') | |||
.onClick(() => { | |||
this.addNum('5') | |||
}) | |||
Divider().strokeWidth(0.5).color('#DDDDDD').vertical(true) | |||
Text('6') | |||
.width('33.33%') | |||
.height('100%') | |||
.textAlign(TextAlign.Center) | |||
.fontSize(30) | |||
.fontColor('#333333') | |||
.onClick(() => { | |||
this.addNum('6') | |||
}) | |||
}.height(55) | |||
Divider().strokeWidth(0.5).color('#DDDDDD') | |||
Row() { | |||
Text('7') | |||
.width('33.33%') | |||
.height('100%') | |||
.textAlign(TextAlign.Center) | |||
.fontSize(30) | |||
.fontColor('#333333') | |||
.onClick(() => { | |||
this.addNum('7') | |||
}) | |||
Divider().strokeWidth(0.5).color('#DDDDDD').vertical(true) | |||
Text('8') | |||
.width('33.33%') | |||
.height('100%') | |||
.textAlign(TextAlign.Center) | |||
.fontSize(30) | |||
.fontColor('#333333') | |||
.onClick(() => { | |||
this.addNum('8') | |||
}) | |||
Divider().strokeWidth(0.5).color('#DDDDDD').vertical(true) | |||
Text('9') | |||
.width('33.33%') | |||
.height('100%') | |||
.textAlign(TextAlign.Center) | |||
.fontSize(30) | |||
.fontColor('#333333') | |||
.onClick(() => { | |||
this.addNum('9') | |||
}) | |||
}.height(55) | |||
Divider().strokeWidth(0.5).color('#DDDDDD') | |||
Row() { | |||
Text() | |||
.width('33.33%') | |||
.height('100%') | |||
.textAlign(TextAlign.Center) | |||
.fontSize(30) | |||
.fontColor('#333333') | |||
.backgroundColor('#E3E7EE') | |||
Divider().strokeWidth(0.5).color('#DDDDDD').vertical(true) | |||
Text('0') | |||
.width('33.33%') | |||
.height('100%') | |||
.textAlign(TextAlign.Center) | |||
.fontSize(30) | |||
.fontColor('#333333') | |||
.onClick(() => { | |||
this.addNum('0') | |||
}) | |||
Divider().strokeWidth(0.5).color('#DDDDDD').vertical(true) | |||
Column() { | |||
Text('X') | |||
.width(24) | |||
.height(24) | |||
.textAlign(TextAlign.Center) | |||
.fontSize(18) | |||
.fontColor('#999999') | |||
.backgroundColor('#FFFFFF') | |||
} | |||
.width('33.33%') | |||
.height('100%') | |||
.justifyContent(FlexAlign.Center) | |||
.backgroundColor('#E3E7EE') | |||
.onClick(() => { | |||
this.list.pop() | |||
}) | |||
}.height(55) | |||
} | |||
.width('100%') | |||
.backgroundColor('#ffffff') | |||
} | |||
} |
@@ -0,0 +1,170 @@ | |||
/* eslint-disable no-useless-escape */ | |||
/************************************************************************************************* | |||
* <pre> | |||
* @包路径: | |||
* @版权所有: 北京数字医信科技有限公司 (C) 2019 | |||
* | |||
* @类描述: | |||
* @版本: V3.2.0 | |||
* @作者 daizhenhong | |||
* @创建时间 2019/6/4 3:30 PM | |||
* | |||
* @修改记录: | |||
----------------------------------------------------------------------------------------------- | |||
----------- 时间 | 修改人 | 修改的方法 | 修改描述 --------------- | |||
----------------------------------------------------------------------------------------------- | |||
</pre> | |||
************************************************************************************************/ | |||
/* | |||
* base64编码(编码,配合encodeURIComponent使用) | |||
* @parm : str 传入的字符串 | |||
* 使用: | |||
1、引入util.js(路径更改) :const util = require('../../utils/util.js'); | |||
2、util.base64_encode(util.utf16to8('base64 编码')); | |||
*/ | |||
function base64Encode (str) { | |||
// 下面是64个基本的编码 | |||
let base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' | |||
let out, i, len | |||
let c1, c2, c3 | |||
len = str.length | |||
i = 0 | |||
out = '' | |||
while (i < len) { | |||
c1 = str.charCodeAt(i++) & 0xff | |||
if (i === len) { | |||
out += base64EncodeChars.charAt(c1 >> 2) | |||
out += base64EncodeChars.charAt((c1 & 0x3) << 4) | |||
out += '==' | |||
break | |||
} | |||
c2 = str.charCodeAt(i++) | |||
if (i === len) { | |||
out += base64EncodeChars.charAt(c1 >> 2) | |||
out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4)) | |||
out += base64EncodeChars.charAt((c2 & 0xF) << 2) | |||
out += '=' | |||
break | |||
} | |||
c3 = str.charCodeAt(i++) | |||
out += base64EncodeChars.charAt(c1 >> 2) | |||
out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4)) | |||
out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6)) | |||
out += base64EncodeChars.charAt(c3 & 0x3F) | |||
} | |||
return out | |||
} | |||
/* | |||
* base64编码(编码,配合encodeURIComponent使用) | |||
* @parm : str 传入的字符串 | |||
*/ | |||
function utf16to8 (str) { | |||
let out, i, len, c | |||
out = '' | |||
len = str.length | |||
for (i = 0; i < len; i++) { | |||
c = str.charCodeAt(i) | |||
if ((c >= 0x0001) && (c <= 0x007F)) { | |||
out += str.charAt(i) | |||
} else if (c > 0x07FF) { | |||
out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F)) | |||
out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F)) | |||
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)) | |||
} else { | |||
out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F)) | |||
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)) | |||
} | |||
} | |||
return out | |||
} | |||
/* | |||
* base64解码(配合decodeURIComponent使用) | |||
* @parm : input 传入的字符串 | |||
* 使用: | |||
1、引入util.js(路径更改) :const util = require('../../utils/util.js'); | |||
2、util.base64_decode('YmFzZTY0IOe8lueggQ=='); | |||
*/ | |||
function base64Decode (input) { | |||
let base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' | |||
let output = '' | |||
let chr1, chr2, chr3 | |||
let enc1, enc2, enc3, enc4 | |||
let i = 0 | |||
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '') | |||
while (i < input.length) { | |||
enc1 = base64EncodeChars.indexOf(input.charAt(i++)) | |||
enc2 = base64EncodeChars.indexOf(input.charAt(i++)) | |||
enc3 = base64EncodeChars.indexOf(input.charAt(i++)) | |||
enc4 = base64EncodeChars.indexOf(input.charAt(i++)) | |||
chr1 = (enc1 << 2) | (enc2 >> 4) | |||
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2) | |||
chr3 = ((enc3 & 3) << 6) | enc4 | |||
output = output + String.fromCharCode(chr1) | |||
if (enc3 !== 64) { | |||
output = output + String.fromCharCode(chr2) | |||
} | |||
if (enc4 !== 64) { | |||
output = output + String.fromCharCode(chr3) | |||
} | |||
} | |||
return utf8Decode(output) | |||
} | |||
/* | |||
* utf-8解码 | |||
* @parm : utftext 传入的字符串 | |||
*/ | |||
function utf8Decode (utftext) { | |||
let string = '' | |||
let i = 0 | |||
let c = 0 | |||
let c1 = 0 | |||
let c2 = 0 | |||
while (i < utftext.length) { | |||
c = utftext.charCodeAt(i) | |||
if (c < 128) { | |||
string += String.fromCharCode(c) | |||
i++ | |||
} else if ((c > 191) && (c < 224)) { | |||
c1 = utftext.charCodeAt(i + 1) | |||
string += String.fromCharCode(((c & 31) << 6) | (c1 & 63)) | |||
i += 2 | |||
} else { | |||
c1 = utftext.charCodeAt(i + 1) | |||
c2 = utftext.charCodeAt(i + 2) | |||
string += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63)) | |||
i += 3 | |||
} | |||
} | |||
return string | |||
} | |||
/* | |||
* base64编码函数封装 | |||
* @parm: str(传入要编成base64的内容) | |||
* 使用: | |||
1、引入util.js(路径更改) :const util = require('../../utils/util.js'); | |||
2、util.baseEncode('base64 编码'); | |||
*/ | |||
function baseEncode (str) { | |||
return base64Encode(utf16to8(str)) | |||
} | |||
/* | |||
* base64解码函数封装 | |||
* @parm: str(传入要解为正常字体) | |||
* 使用: | |||
1、引入util.js(路径更改) :const util = require('../../utils/util.js'); | |||
2、util.baseDecode(util.baseEncode('base64 编码')) | |||
*/ | |||
function baseDecode (str) { | |||
return base64Decode(str) | |||
}// 抛出函数使用 | |||
export { | |||
baseEncode, | |||
baseDecode | |||
} |
@@ -0,0 +1,9 @@ | |||
import {JSEncrypt} from './jsencryp.js' | |||
// 医网信公钥,用于数据加密 | |||
const rsa_public_key = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDsLnkJaVr5hdNlqPNhU+YW4LctrwuDCeUb+GHS\nPNd/g83nNGibYWqNmYgyVw2jZPTDNrZDw/piWhPsV9iWY0Ie6zuUbrKRQEWBEuQxXhEoRv92nw1B\nWzd7vvOk63Xss7iWqLn8PvE6a4OJC90mWPDQFfiLl49SYbK5QvfD5lY5TQIDAQAB' | |||
export function encodeByRsa(origin) { | |||
let jsEncrypt = new JSEncrypt(); | |||
jsEncrypt.setPublicKey(rsa_public_key) | |||
return jsEncrypt.encrypt(origin) | |||
} |
@@ -0,0 +1,257 @@ | |||
/* | |||
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message | |||
* Digest Algorithm, as defined in RFC 1321. | |||
* Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. | |||
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet | |||
* Distributed under the BSD License | |||
* See http://pajhome.org.uk/crypt/md5 for more info. | |||
*/ | |||
/* | |||
* Configurable variables. You may need to tweak these to be compatible with | |||
* the server-side, but the defaults work in most cases. | |||
*/ | |||
var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ | |||
var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */ | |||
var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */ | |||
/* | |||
* These are the functions you'll usually want to call | |||
* They take string arguments and return either hex or base-64 encoded strings | |||
*/ | |||
//32位小写 | |||
export function md5_hex(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));} | |||
export function md5_b64(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));} | |||
export function md5_str(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));} | |||
export function md5_hex_hmac(key, data) { return binl2hex(core_hmac_md5(key, data)); } | |||
export function md5_b64_hmac(key, data) { return binl2b64(core_hmac_md5(key, data)); } | |||
export function md5_str_hmac(key, data) { return binl2str(core_hmac_md5(key, data)); } | |||
/* | |||
* Perform a simple self-test to see if the VM is working | |||
*/ | |||
function md5_vm_test() | |||
{ | |||
return md5_hex("abc") == "900150983cd24fb0d6963f7d28e17f72"; | |||
} | |||
/* | |||
* Calculate the MD5 of an array of little-endian words, and a bit length | |||
*/ | |||
function core_md5(x, len) | |||
{ | |||
/* append padding */ | |||
x[len >> 5] |= 0x80 << ((len) % 32); | |||
x[(((len + 64) >>> 9) << 4) + 14] = len; | |||
var a = 1732584193; | |||
var b = -271733879; | |||
var c = -1732584194; | |||
var d = 271733878; | |||
for(var i = 0; i < x.length; i += 16) | |||
{ | |||
var olda = a; | |||
var oldb = b; | |||
var oldc = c; | |||
var oldd = d; | |||
a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); | |||
d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); | |||
c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); | |||
b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); | |||
a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); | |||
d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); | |||
c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); | |||
b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); | |||
a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); | |||
d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); | |||
c = md5_ff(c, d, a, b, x[i+10], 17, -42063); | |||
b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); | |||
a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); | |||
d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); | |||
c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); | |||
b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); | |||
a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); | |||
d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); | |||
c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); | |||
b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); | |||
a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); | |||
d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); | |||
c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); | |||
b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); | |||
a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); | |||
d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); | |||
c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); | |||
b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); | |||
a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); | |||
d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); | |||
c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); | |||
b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); | |||
a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); | |||
d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); | |||
c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); | |||
b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); | |||
a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); | |||
d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); | |||
c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); | |||
b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); | |||
a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); | |||
d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); | |||
c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); | |||
b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); | |||
a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); | |||
d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); | |||
c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); | |||
b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); | |||
a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); | |||
d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); | |||
c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); | |||
b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); | |||
a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); | |||
d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); | |||
c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); | |||
b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); | |||
a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); | |||
d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); | |||
c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); | |||
b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); | |||
a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); | |||
d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); | |||
c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); | |||
b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); | |||
a = safe_add(a, olda); | |||
b = safe_add(b, oldb); | |||
c = safe_add(c, oldc); | |||
d = safe_add(d, oldd); | |||
} | |||
return Array(a, b, c, d); | |||
} | |||
/* | |||
* These functions implement the four basic operations the algorithm uses. | |||
*/ | |||
function md5_cmn(q, a, b, x, s, t) | |||
{ | |||
return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); | |||
} | |||
function md5_ff(a, b, c, d, x, s, t) | |||
{ | |||
return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); | |||
} | |||
function md5_gg(a, b, c, d, x, s, t) | |||
{ | |||
return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); | |||
} | |||
function md5_hh(a, b, c, d, x, s, t) | |||
{ | |||
return md5_cmn(b ^ c ^ d, a, b, x, s, t); | |||
} | |||
function md5_ii(a, b, c, d, x, s, t) | |||
{ | |||
return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); | |||
} | |||
/* | |||
* Calculate the HMAC-MD5, of a key and some data | |||
*/ | |||
function core_hmac_md5(key, data) | |||
{ | |||
var bkey = str2binl(key); | |||
if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz); | |||
var ipad = Array(16), opad = Array(16); | |||
for(var i = 0; i < 16; i++) | |||
{ | |||
ipad[i] = bkey[i] ^ 0x36363636; | |||
opad[i] = bkey[i] ^ 0x5C5C5C5C; | |||
} | |||
var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz); | |||
return core_md5(opad.concat(hash), 512 + 128); | |||
} | |||
/* | |||
* Add integers, wrapping at 2^32. This uses 16-bit operations internally | |||
* to work around bugs in some JS interpreters. | |||
*/ | |||
function safe_add(x, y) | |||
{ | |||
var lsw = (x & 0xFFFF) + (y & 0xFFFF); | |||
var msw = (x >> 16) + (y >> 16) + (lsw >> 16); | |||
return (msw << 16) | (lsw & 0xFFFF); | |||
} | |||
/* | |||
* Bitwise rotate a 32-bit number to the left. | |||
*/ | |||
function bit_rol(num, cnt) | |||
{ | |||
return (num << cnt) | (num >>> (32 - cnt)); | |||
} | |||
/* | |||
* Convert a string to an array of little-endian words | |||
* If chrsz is ASCII, characters >255 have their hi-byte silently ignored. | |||
*/ | |||
function str2binl(str) | |||
{ | |||
var bin = Array(); | |||
var mask = (1 << chrsz) - 1; | |||
for(var i = 0; i < str.length * chrsz; i += chrsz) | |||
bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32); | |||
return bin; | |||
} | |||
/* | |||
* Convert an array of little-endian words to a string | |||
*/ | |||
function binl2str(bin) | |||
{ | |||
var str = ""; | |||
var mask = (1 << chrsz) - 1; | |||
for(var i = 0; i < bin.length * 32; i += chrsz) | |||
str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask); | |||
return str; | |||
} | |||
/* | |||
* Convert an array of little-endian words to a hex string. | |||
*/ | |||
function binl2hex(binarray) | |||
{ | |||
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; | |||
var str = ""; | |||
for(var i = 0; i < binarray.length * 4; i++) | |||
{ | |||
str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) + | |||
hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF); | |||
} | |||
return str; | |||
} | |||
/* | |||
* Convert an array of little-endian words to a base-64 string | |||
*/ | |||
function binl2b64(binarray) | |||
{ | |||
var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | |||
var str = ""; | |||
for(var i = 0; i < binarray.length * 4; i += 3) | |||
{ | |||
var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16) | |||
| (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 ) | |||
| ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF); | |||
for(var j = 0; j < 4; j++) | |||
{ | |||
if(i * 8 + j * 6 > binarray.length * 32) str += b64pad; | |||
else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F); | |||
} | |||
} | |||
return str; | |||
} |
@@ -0,0 +1,12 @@ | |||
{ | |||
"module": { | |||
"name": "sdk_ywx", | |||
"type": "har", | |||
"deviceTypes": [ | |||
"phone" | |||
], | |||
"description": "签名sdk", | |||
"requestPermissions": [ | |||
] | |||
} | |||
} |
@@ -0,0 +1,12 @@ | |||
{ | |||
"string": [ | |||
{ | |||
"name": "page_show", | |||
"value": "page from package" | |||
}, | |||
{ | |||
"name": "mo_ywx_module_cert_title", | |||
"value": "医网信数字证书" | |||
} | |||
] | |||
} |
@@ -0,0 +1,6 @@ | |||
{ | |||
"src": [ | |||
"pages/PinView", | |||
"pages/CertDetails" | |||
] | |||
} |
@@ -0,0 +1,12 @@ | |||
{ | |||
"string": [ | |||
{ | |||
"name": "page_show", | |||
"value": "page from package" | |||
}, | |||
{ | |||
"name": "mo_ywx_module_cert_title", | |||
"value": "Digital certificate" | |||
} | |||
] | |||
} |
@@ -0,0 +1,12 @@ | |||
{ | |||
"string": [ | |||
{ | |||
"name": "page_show", | |||
"value": "page from package" | |||
}, | |||
{ | |||
"name": "mo_ywx_module_cert_title", | |||
"value": "医网信数字证书" | |||
} | |||
] | |||
} |
@@ -0,0 +1,5 @@ | |||
import localUnitTest from './LocalUnit.test'; | |||
export default function testsuite() { | |||
localUnitTest(); | |||
} |
@@ -0,0 +1,33 @@ | |||
import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; | |||
export default function localUnitTest() { | |||
describe('localUnitTest',() => { | |||
// Defines a test suite. Two parameters are supported: test suite name and test suite function. | |||
beforeAll(() => { | |||
// Presets an action, which is performed only once before all test cases of the test suite start. | |||
// This API supports only one parameter: preset action function. | |||
}); | |||
beforeEach(() => { | |||
// Presets an action, which is performed before each unit test case starts. | |||
// The number of execution times is the same as the number of test cases defined by **it**. | |||
// This API supports only one parameter: preset action function. | |||
}); | |||
afterEach(() => { | |||
// Presets a clear action, which is performed after each unit test case ends. | |||
// The number of execution times is the same as the number of test cases defined by **it**. | |||
// This API supports only one parameter: clear action function. | |||
}); | |||
afterAll(() => { | |||
// Presets a clear action, which is performed after all test cases of the test suite end. | |||
// This API supports only one parameter: clear action function. | |||
}); | |||
it('assertContain', 0, () => { | |||
// Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. | |||
let a = 'abc'; | |||
let b = 'b'; | |||
// Defines a variety of assertion methods, which are used to declare expected boolean conditions. | |||
expect(a).assertContain(b); | |||
expect(a).assertEqual(a); | |||
}); | |||
}); | |||
} |