mirror of https://github.com/certd/certd
				
				
				
			chore: 1
							parent
							
								
									41b9837582
								
							
						
					
					
						commit
						c28f3cdcf7
					
				| 
						 | 
				
			
			@ -3,8 +3,8 @@ import { logger } from "../utils/index.js";
 | 
			
		|||
import dayjs from "dayjs";
 | 
			
		||||
 | 
			
		||||
const SecreteKey =
 | 
			
		||||
  "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUJDZ0tDQVFFQXY3TGtMaUp1dGM0NzhTU3RaTExjajVGZXh1YjJwR2NLMGxwa0hwVnlZWjhMY29rRFhuUlAKUGQ5UlJSTVRTaGJsbFl2Mzd4QUhOV1ZIQ0ZsWHkrQklVU001bUlBU1NDQTV0azlJNmpZZ2F4bEFDQm1BY0lGMwozKzBjeGZIYVkrVW9YdVluMkZ6YUt2Ym5GdFZIZ0lkMDg4a3d4clZTZzlCT3BDRVZIR1pxR2I5TWN5MXVHVXhUClFTVENCbmpoTWZlZ0p6cXVPYWVOY0ZPSE5tbmtWRWpLTythbTBPeEhNS1lyS3ZnQnVEbzdoVnFENlBFMUd6V3AKZHdwZUV4QXZDSVJxL2pWTkdRK3FtMkRWOVNJZ3U5bmF4MktmSUtFeU50dUFFS1VpekdqL0VmRFhDM1cxMExhegpKaGNYNGw1SUFZU1o3L3JWVmpGbExWSVl0WDU1T054L1Z3SURBUUFCCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K";
 | 
			
		||||
export const appKey = "z4nXOeTeSnnpUpnmsV";
 | 
			
		||||
  "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUJDZ0tDQVFFQW9VWE1EWUhjdi82WFROWEZFSUI2RlpuR2FER0cwZnR5bTV1dVhPck9NaVl0UkxSb1lvSGMKNVZxenE0N00rdEFqRFBhaTBlOFhWS1c3aytUQUw3MUs0N2JCQVEyWTBxNU5Ya3lYcE5PTVdueVFMYXBwb0tWNgpPMkFJMnpFVURWMVJVa0ZtMFZTVjU0VXNzMDcrdjI2aW5aQU1CWitDMU42eWFDc2tZL3grNnVlNkVRNVcyZXdFCjZOWEhJcUU1bHdEUmU2SXJtdEpnU2doSnlHTS91azIyejN6NGEraFVPVUlWMy9DbEhYV0VhRHBBRFFsakt3NSsKeHR0dURiTHZyUmdzdWp6czB0dEI2OE1SbXE0R0FJL0JtNWVPWkhlNGxFQjBFVVhFUXdVWE1jV1N1VFZSMUE2cApUM21LRGo5MGcwVDFZUlNOdE5TMm9aRzgvRWIwOVlxK3Z3SURBUUFCCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K";
 | 
			
		||||
export const appKey = "kQth6FHM71IPV3qdWc";
 | 
			
		||||
export type LicenseVerifyReq = {
 | 
			
		||||
  subjectId: string;
 | 
			
		||||
  license: string;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,15 +1,18 @@
 | 
			
		|||
import PiContainer from "./container.vue";
 | 
			
		||||
import PiAccessSelector from "../views/certd/access/access-selector/index.vue";
 | 
			
		||||
import PiDnsProviderSelector from "./dns-provider-selector/index.vue";
 | 
			
		||||
import PiOutputSelector from "../views/certd/pipeline/pipeline/component/output-selector/index.vue";import PiEditable from "./editable.vue";
 | 
			
		||||
import PiOutputSelector from "../views/certd/pipeline/pipeline/component/output-selector/index.vue";
 | 
			
		||||
import PiEditable from "./editable.vue";
 | 
			
		||||
import VipButton from "./vip-button/index.vue";
 | 
			
		||||
import { CheckCircleOutlined, InfoCircleOutlined, UndoOutlined } from "@ant-design/icons-vue";
 | 
			
		||||
export default {
 | 
			
		||||
  install(app:any) {
 | 
			
		||||
  install(app: any) {
 | 
			
		||||
    app.component("PiContainer", PiContainer);
 | 
			
		||||
    app.component("PiAccessSelector", PiAccessSelector);
 | 
			
		||||
    app.component("PiEditable", PiEditable);
 | 
			
		||||
    app.component("PiOutputSelector", PiOutputSelector);
 | 
			
		||||
    app.component("PiDnsProviderSelector", PiDnsProviderSelector);
 | 
			
		||||
    app.component("VipButton", VipButton);
 | 
			
		||||
 | 
			
		||||
    app.component("CheckCircleOutlined", CheckCircleOutlined);
 | 
			
		||||
    app.component("InfoCircleOutlined", InfoCircleOutlined);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
import { request } from "/@/api/service";
 | 
			
		||||
import { request } from "/src/api/service";
 | 
			
		||||
 | 
			
		||||
export async function doActive(form: any) {
 | 
			
		||||
  return await request({
 | 
			
		||||
| 
						 | 
				
			
			@ -15,7 +15,7 @@
 | 
			
		|||
</template>
 | 
			
		||||
<script lang="tsx" setup>
 | 
			
		||||
import { ref, reactive } from "vue";
 | 
			
		||||
import { useUserStore } from "/@/store/modules/user";
 | 
			
		||||
import { useUserStore } from "/src/store/modules/user";
 | 
			
		||||
import dayjs from "dayjs";
 | 
			
		||||
import { message, Modal } from "ant-design-vue";
 | 
			
		||||
import * as api from "./api";
 | 
			
		||||
| 
						 | 
				
			
			@ -18,7 +18,7 @@
 | 
			
		|||
            <MenuFoldOutlined v-else />
 | 
			
		||||
          </div>
 | 
			
		||||
          <fs-menu class="header-menu" mode="horizontal" :expand-selected="false" :selectable="false" :menus="frameworkMenus" />
 | 
			
		||||
          <vip-info class="flex-center header-btn"></vip-info>
 | 
			
		||||
          <vip-button class="flex-center header-btn"></vip-button>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="header-right header-buttons">
 | 
			
		||||
          <!--          <button-->
 | 
			
		||||
| 
						 | 
				
			
			@ -83,11 +83,11 @@ import { MenuFoldOutlined, MenuUnfoldOutlined } from "@ant-design/icons-vue";
 | 
			
		|||
import FsThemeSet from "/@/layout/components/theme/index.vue";
 | 
			
		||||
import { env } from "../utils/util.env";
 | 
			
		||||
import FsThemeModeSet from "./components/theme/mode-set.vue";
 | 
			
		||||
import VipInfo from "./components/vip-info/index.vue";
 | 
			
		||||
import VipButton from "/@/components/vip-button/index.vue";
 | 
			
		||||
export default {
 | 
			
		||||
  name: "LayoutFramework",
 | 
			
		||||
  // eslint-disable-next-line vue/no-unused-components
 | 
			
		||||
  components: { FsThemeSet, MenuFoldOutlined, MenuUnfoldOutlined, FsMenu, FsLocale, FsSourceLink, FsUserInfo, FsTabs, FsThemeModeSet, VipInfo },
 | 
			
		||||
  components: { FsThemeSet, MenuFoldOutlined, MenuUnfoldOutlined, FsMenu, FsLocale, FsSourceLink, FsUserInfo, FsTabs, FsThemeModeSet, VipButton },
 | 
			
		||||
  setup() {
 | 
			
		||||
    const resourceStore = useResourceStore();
 | 
			
		||||
    const frameworkMenus = computed(() => {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,6 +16,9 @@
 | 
			
		|||
        <a-form-item label="使用邮件代理" name="usePlus">
 | 
			
		||||
          <a-switch v-model:checked="formState.usePlus" :disabled="!userStore.isPlus" />
 | 
			
		||||
          <div class="helper">专业版功能,免除繁琐的邮件配置,直接发邮件</div>
 | 
			
		||||
          <div>
 | 
			
		||||
            <vip-button></vip-button>
 | 
			
		||||
          </div>
 | 
			
		||||
        </a-form-item>
 | 
			
		||||
        <template v-if="!formState.usePlus">
 | 
			
		||||
          <a-form-item label="SMTP域名" name="host" :rules="[{ required: true, message: '请输入smtp域名或ip' }]">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,6 @@
 | 
			
		|||
koa:
 | 
			
		||||
  port: 7001
 | 
			
		||||
 | 
			
		||||
plus:
 | 
			
		||||
  server:
 | 
			
		||||
    baseUrl: 'http://127.0.0.1:11007'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,3 +11,6 @@ typeorm:
 | 
			
		|||
      password: root
 | 
			
		||||
      database: postgres
 | 
			
		||||
 | 
			
		||||
plus:
 | 
			
		||||
  server:
 | 
			
		||||
     baseUrl: 'https://api.ai.handsfree.work'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,4 +8,5 @@ typeorm:
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
plus:
 | 
			
		||||
  serverBaseUrl: 'https://api.ai.handsfree.work/'
 | 
			
		||||
  server:
 | 
			
		||||
    baseUrl: 'https://api.ai.handsfree.work'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,10 +42,13 @@ export class EmailService implements IEmailService {
 | 
			
		|||
     *   receivers: string[];
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
    await this.plusService.request('/activation/emailSend', {
 | 
			
		||||
      subject: email.subject,
 | 
			
		||||
      text: email.content,
 | 
			
		||||
      to: email.receivers,
 | 
			
		||||
    await this.plusService.request({
 | 
			
		||||
      url: '/activation/emailSend',
 | 
			
		||||
      data: {
 | 
			
		||||
        subject: email.subject,
 | 
			
		||||
        text: email.content,
 | 
			
		||||
        to: email.receivers,
 | 
			
		||||
      },
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';
 | 
			
		||||
import { Config, Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';
 | 
			
		||||
import { SysSettingsService } from '../../system/service/sys-settings-service.js';
 | 
			
		||||
import { SysInstallInfo } from '../../system/service/models.js';
 | 
			
		||||
import { appKey, getPlusInfo } from '@certd/pipeline';
 | 
			
		||||
| 
						 | 
				
			
			@ -11,8 +11,16 @@ import { logger } from '../../../utils/logger.js';
 | 
			
		|||
export class PlusService {
 | 
			
		||||
  @Inject()
 | 
			
		||||
  sysSettingsService: SysSettingsService;
 | 
			
		||||
  @Config('plus.server.baseUrl')
 | 
			
		||||
  plusServerBaseUrl;
 | 
			
		||||
 | 
			
		||||
  async request(url: string, data: any) {
 | 
			
		||||
  async requestWithoutSign(config: any) {
 | 
			
		||||
    config.baseURL = this.plusServerBaseUrl;
 | 
			
		||||
    return await request(config);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async request(config: any) {
 | 
			
		||||
    const { url, data } = config;
 | 
			
		||||
    const timestamps = Date.now();
 | 
			
		||||
    const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);
 | 
			
		||||
    const sign = await this.sign(data, timestamps);
 | 
			
		||||
| 
						 | 
				
			
			@ -29,10 +37,9 @@ export class PlusService {
 | 
			
		|||
      'Content-Type': 'application/json',
 | 
			
		||||
      'X-Plus-Subject': requestHeaderStr,
 | 
			
		||||
    };
 | 
			
		||||
    const baseUrl = 'http://127.0.0.1:11007';
 | 
			
		||||
    return await request({
 | 
			
		||||
      url: url,
 | 
			
		||||
      baseURL: baseUrl,
 | 
			
		||||
      baseURL: this.plusServerBaseUrl,
 | 
			
		||||
      method: 'POST',
 | 
			
		||||
      data: data,
 | 
			
		||||
      headers: headers,
 | 
			
		||||
| 
						 | 
				
			
			@ -51,4 +58,12 @@ export class PlusService {
 | 
			
		|||
    logger.info('content:', content, 'sign:', sign);
 | 
			
		||||
    return sign;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async active(formData: { code: any; appKey: string; subjectId: string }) {
 | 
			
		||||
    return await this.requestWithoutSign({
 | 
			
		||||
      url: '/activation/active',
 | 
			
		||||
      method: 'post',
 | 
			
		||||
      data: formData,
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,7 @@ import { BaseController } from '../../../basic/base-controller.js';
 | 
			
		|||
import { appKey, verify } from '@certd/pipeline';
 | 
			
		||||
import { SysInstallInfo, SysLicenseInfo } from '../service/models.js';
 | 
			
		||||
import { logger } from '../../../utils/logger.js';
 | 
			
		||||
import { request } from '../../../utils/http.js';
 | 
			
		||||
import { PlusService } from '../../basic/service/plus-service.js';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -14,6 +14,9 @@ export class SysPlusController extends BaseController {
 | 
			
		|||
  @Inject()
 | 
			
		||||
  sysSettingsService: SysSettingsService;
 | 
			
		||||
 | 
			
		||||
  @Inject()
 | 
			
		||||
  plusService: PlusService;
 | 
			
		||||
 | 
			
		||||
  @Post('/active', { summary: 'sys:settings:edit' })
 | 
			
		||||
  async active(@Body(ALL) body) {
 | 
			
		||||
    const { code } = body;
 | 
			
		||||
| 
						 | 
				
			
			@ -24,11 +27,7 @@ export class SysPlusController extends BaseController {
 | 
			
		|||
      subjectId: installInfo.siteId,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const res: any = await request({
 | 
			
		||||
      url: 'http://localhost:11007/activation/active',
 | 
			
		||||
      method: 'post',
 | 
			
		||||
      data: formData,
 | 
			
		||||
    });
 | 
			
		||||
    const res: any = await this.plusService.active(formData);
 | 
			
		||||
 | 
			
		||||
    if (res.code > 0) {
 | 
			
		||||
      logger.error('激活失败', res.message);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue