diff --git a/packages/core/basic/src/utils/util.request.ts b/packages/core/basic/src/utils/util.request.ts index ea7d8302..d19964cd 100644 --- a/packages/core/basic/src/utils/util.request.ts +++ b/packages/core/basic/src/utils/util.request.ts @@ -207,9 +207,13 @@ export function createAxiosService({ logger }: { logger: ILogger }) { case 505: error.message = "HTTP版本不受支持"; break; + case 302: + //重定向 + return Promise.resolve(error.response); default: break; } + logger.error(`请求出错:status:${error.response?.status},statusText:${error.response?.statusText},url:${error.config?.url},method:${error.config?.method}。`); logger.error("返回数据:", JSON.stringify(error.response?.data)); if (error.response?.data) { diff --git a/packages/ui/certd-client/src/components/captcha/captchas/image_captcha.vue b/packages/ui/certd-client/src/components/captcha/captchas/image_captcha.vue index 09cd9cf7..850678bb 100644 --- a/packages/ui/certd-client/src/components/captcha/captchas/image_captcha.vue +++ b/packages/ui/certd-client/src/components/captcha/captchas/image_captcha.vue @@ -60,7 +60,7 @@ watch( }, value => { if (value == null) { - reset(); + resetImageCode(); } } ); diff --git a/packages/ui/certd-client/src/views/framework/forgot-password/index.vue b/packages/ui/certd-client/src/views/framework/forgot-password/index.vue index 2bf612a3..9411659e 100644 --- a/packages/ui/certd-client/src/views/framework/forgot-password/index.vue +++ b/packages/ui/certd-client/src/views/framework/forgot-password/index.vue @@ -155,20 +155,15 @@ watch(forgotPasswordType, () => { }); const handleFinish = async (values: any) => { - try { - await userStore.forgotPassword( - toRaw({ - type: forgotPasswordType.value, - input: formState.input, - validateCode: formState.validateCode, - password: formState.password, - confirmPassword: formState.confirmPassword, - }) as any - ); - } finally { - formState.captchaForSms = null; - formState.captchaForEmail = null; - } + await userStore.forgotPassword( + toRaw({ + type: forgotPasswordType.value, + input: formState.input, + validateCode: formState.validateCode, + password: formState.password, + confirmPassword: formState.confirmPassword, + }) as any + ); }; const handleFinishFailed = (errors: any) => { diff --git a/packages/ui/certd-client/src/views/framework/login/index.vue b/packages/ui/certd-client/src/views/framework/login/index.vue index c5ca7ec4..2f2cd007 100644 --- a/packages/ui/certd-client/src/views/framework/login/index.vue +++ b/packages/ui/certd-client/src/views/framework/login/index.vue @@ -189,7 +189,6 @@ export default defineComponent({ } finally { loading.value = false; formState.captcha = null; - formState.smsCaptcha = null; } }; diff --git a/packages/ui/certd-server/src/plugins/plugin-xinnet/access.ts b/packages/ui/certd-server/src/plugins/plugin-xinnet/access.ts index b2c547a2..0c7f95eb 100644 --- a/packages/ui/certd-server/src/plugins/plugin-xinnet/access.ts +++ b/packages/ui/certd-server/src/plugins/plugin-xinnet/access.ts @@ -8,7 +8,7 @@ import { XinnetClient } from "@certd/plugin-plus"; @IsAccess({ name: "xinnet", title: "新网授权", - icon: "arcticons:dns-changer-3", + icon: "lsicon:badge-new-filled", desc: "" }) export class XinnetAccess extends BaseAccess { @@ -19,7 +19,7 @@ export class XinnetAccess extends BaseAccess { @AccessInput({ title: "用户名", component: { - placeholder: "手机号" + placeholder: "手机号/用户名" }, required: true, encrypt: true @@ -27,13 +27,12 @@ export class XinnetAccess extends BaseAccess { username = ""; @AccessInput({ - title: "域名登录密码", + title: "登录密码", component: { name: "a-input-password", vModel: "value", - placeholder: "域名密码" + placeholder: "登录密码" }, - helper: "您可以在此处[重置域名管理密码](https://domain.xinnet.com/#domain/manage/domain_manage_pwd)", required: true, encrypt: true }) @@ -62,6 +61,19 @@ export class XinnetAccess extends BaseAccess { return "ok"; } + + getCacheKey () { + let hashStr = "" + for (const key in this) { + if (Object.prototype.hasOwnProperty.call(this, key)) { + const element = this[key]; + hashStr += element; + } + } + const hashCode = this.ctx.utils.hash.sha256(hashStr); + return `xinnet-${hashCode}`; + } + } new XinnetAccess(); diff --git a/packages/ui/certd-server/src/plugins/plugin-xinnet/dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-xinnet/dns-provider.ts index b5cf5549..073c79c0 100644 --- a/packages/ui/certd-server/src/plugins/plugin-xinnet/dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-xinnet/dns-provider.ts @@ -3,24 +3,27 @@ import { XinnetAccess } from "./access.js"; import { XinnetClient } from "@certd/plugin-plus"; export type XinnetRecord = { - id: number; - domainId: number, + recordId: number; + recordFullName: string; + recordValue: string; + type: string; + serviceCode: string; + dcpCookie: string; }; // 这里通过IsDnsProvider注册一个dnsProvider @IsDnsProvider({ - name: 'xinnet', - title: '新网', - desc: '新网域名解析', - icon: 'arcticons:dns-changer-3', + name: "xinnet", + title: "新网", + desc: "新网域名解析", + icon: "lsicon:badge-new-filled", // 这里是对应的 cloudflare的access类型名称 - accessType: 'xinnet', - order:7, + accessType: "xinnet", + order: 7 }) export class XinnetProvider extends AbstractDnsProvider { access!: XinnetAccess; - client!:XinnetClient; async onInstance() { //一些初始化的操作 // 也可以通过ctx成员变量传递context @@ -37,37 +40,41 @@ export class XinnetProvider extends AbstractDnsProvider { * type: 'TXT', * domain: 'example.com' */ - // const { fullRecord,hostRecord, value, type, domain } = options; - // this.logger.info('添加域名解析:', fullRecord, value, type, domain); + const { fullRecord, hostRecord, value, type, domain } = options; + this.logger.info("添加域名解析:", fullRecord, value, type, domain); - // const client = new XinnetClient({ - // logger: this.logger, - // access: { - // domain: "", - // password: this.access.password - // }, - // http: this.http - // }); + const client = new XinnetClient({ + logger: this.logger, + access: this.access, + http: this.http + }); + const res = await client.getDomainList({ + searchKey: domain + }); + if (!res.list || res.list.length == 0) { + throw new Error("域名不存在"); + } + const serviceCode = res.list[0].serviceCode; - // const domainId = await this.client.getDomainId(domain); - // this.logger.info('获取domainId成功:', domainId); - // - // const res = await this.client.createRecord({ - // domain: domain, - // domainId: domainId, - // type: 'TXT', - // host: hostRecord, - // data: value, - // ttl: 300, - // }) - // return { - // id: res.id, - // domainId: domainId, - // }; + const dcpCookie = await client.getDcpCookie({ + serviceCode + }); - return 1 as any + const recordRes = await client.addDomainDnsRecord({ + recordName: hostRecord, + type: type, + recordValue: value + }, { + dcpCookie, + serviceCode + }); + return { + ...recordRes, + serviceCode, + dcpCookie + }; } @@ -76,27 +83,26 @@ export class XinnetProvider extends AbstractDnsProvider { * @param options */ async removeRecord(options: RemoveRecordOptions): Promise { - // const { fullRecord, value } = options.recordReq; - // const record = options.recordRes; - // this.logger.info('删除域名解析:', fullRecord, value); - // if (!record) { - // this.logger.info('record为空,不执行删除'); - // return; - // } - // //这里调用删除txt dns解析记录接口 - // /** - // * 请求示例 - // * DELETE /api/record?id=85371689655342080 HTTP/1.1 - // * Authorization: Basic {token} - // * 请求参数 - // */ - // const {id,domainId} = record - // await this.client.deleteRecord({ - // id, - // domainId - // }) - // this.logger.info(`删除域名解析成功:fullRecord=${fullRecord},id=${id}`); - // } + const client = new XinnetClient({ + logger: this.logger, + access: this.access, + http: this.http + }); + + const recordRes = options.recordRes; + let dcpCookie = recordRes.dcpCookie; + if (!dcpCookie) { + dcpCookie = await client.getDcpCookie({ + serviceCode: recordRes.serviceCode + }); + } + + await client.deleteDomainDnsRecord(recordRes, { + dcpCookie, + serviceCode: recordRes.serviceCode + }); + + } }