mirror of https://github.com/certd/certd
chore: domain manager
parent
c451823c2b
commit
f3002e4fb6
|
@ -33,6 +33,7 @@
|
||||||
import { Ref, ref, watch, nextTick } from "vue";
|
import { Ref, ref, watch, nextTick } from "vue";
|
||||||
import { HttpRecord } from "/@/components/plugins/cert/domains-verify-plan-editor/type";
|
import { HttpRecord } from "/@/components/plugins/cert/domains-verify-plan-editor/type";
|
||||||
import { dict } from "@fast-crud/fast-crud";
|
import { dict } from "@fast-crud/fast-crud";
|
||||||
|
import { Dicts } from "/@/components/plugins/lib/dicts";
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: "HttpVerifyPlan",
|
name: "HttpVerifyPlan",
|
||||||
|
@ -68,17 +69,7 @@ async function onRecordChange() {
|
||||||
emit("change", records.value);
|
emit("change", records.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
const uploaderTypeDict = dict({
|
const uploaderTypeDict = Dicts.uploaderTypeDict;
|
||||||
data: [
|
|
||||||
{ label: "SFTP", value: "sftp" },
|
|
||||||
{ label: "FTP", value: "ftp" },
|
|
||||||
{ label: "阿里云OSS", value: "alioss" },
|
|
||||||
{ label: "腾讯云COS", value: "tencentcos" },
|
|
||||||
{ label: "七牛OSS", value: "qiniuoss" },
|
|
||||||
{ label: "S3/Minio", value: "s3" },
|
|
||||||
{ label: "SSH(已废弃,请选择SFTP方式)", value: "ssh", disabled: true },
|
|
||||||
],
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less">
|
<style lang="less">
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
import { dict } from "@fast-crud/fast-crud";
|
||||||
|
|
||||||
|
export const Dicts = {
|
||||||
|
sslProviderDict: dict({
|
||||||
|
data: [
|
||||||
|
{ value: "letsencrypt", label: "Let‘s Encrypt" },
|
||||||
|
{ value: "zerossl", label: "ZeroSSL" },
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
challengeTypeDict: dict({ data: [{ value: "dns", label: "DNS校验" }] }),
|
||||||
|
dnsProviderTypeDict: dict({
|
||||||
|
url: "pi/dnsProvider/dnsProviderTypeDict",
|
||||||
|
}),
|
||||||
|
uploaderTypeDict: dict({
|
||||||
|
data: [
|
||||||
|
{ label: "SFTP", value: "sftp" },
|
||||||
|
{ label: "FTP", value: "ftp" },
|
||||||
|
{ label: "阿里云OSS", value: "alioss" },
|
||||||
|
{ label: "腾讯云COS", value: "tencentcos" },
|
||||||
|
{ label: "七牛OSS", value: "qiniuoss" },
|
||||||
|
{ label: "S3/Minio", value: "s3" },
|
||||||
|
{ label: "SSH(已废弃,请选择SFTP方式)", value: "ssh", disabled: true },
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
};
|
|
@ -708,4 +708,14 @@ export default {
|
||||||
showRunStrategyHelper: "Allow modify the run strategy of the task",
|
showRunStrategyHelper: "Allow modify the run strategy of the task",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
domain: {
|
||||||
|
domainManager: "Domain Manager",
|
||||||
|
domain: "Domain",
|
||||||
|
challengeType: "Challenge Type",
|
||||||
|
dnsProviderType: "DNS Provider Type",
|
||||||
|
dnsProviderAccess: "DNS Provider Access",
|
||||||
|
httpUploaderType: "HTTP Uploader Type",
|
||||||
|
httpUploaderAccess: "HTTP Uploader Access",
|
||||||
|
httpUploadRootDir: "HTTP Upload Root Dir",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -711,4 +711,14 @@ export default {
|
||||||
showRunStrategyHelper: "任务设置中是否允许选择运行策略",
|
showRunStrategyHelper: "任务设置中是否允许选择运行策略",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
domain: {
|
||||||
|
domainManager: "域名管理",
|
||||||
|
domain: "域名",
|
||||||
|
challengeType: "校验类型",
|
||||||
|
dnsProviderType: "DNS提供商类型",
|
||||||
|
dnsProviderAccess: "DNS提供商授权",
|
||||||
|
httpUploaderType: "上传方式",
|
||||||
|
httpUploaderAccess: "上传授权信息",
|
||||||
|
httpUploadRootDir: "网站根路径",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -116,6 +116,17 @@ export const certdResources = [
|
||||||
keepAlive: true,
|
keepAlive: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "certd.domain.domainManager",
|
||||||
|
name: "DomainManager",
|
||||||
|
path: "/certd/cert/domain",
|
||||||
|
component: "/certd/cert/domain/index.vue",
|
||||||
|
meta: {
|
||||||
|
icon: "material-symbols:approval-delegation-outline",
|
||||||
|
auth: true,
|
||||||
|
keepAlive: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: "certd.cnameRecord",
|
title: "certd.cnameRecord",
|
||||||
name: "CnameRecord",
|
name: "CnameRecord",
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
import { request } from "/src/api/service";
|
||||||
|
|
||||||
|
const apiPrefix = "/cert/domain";
|
||||||
|
|
||||||
|
export async function GetList(query: any) {
|
||||||
|
return await request({
|
||||||
|
url: apiPrefix + "/page",
|
||||||
|
method: "post",
|
||||||
|
data: query,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function AddObj(obj: any) {
|
||||||
|
return await request({
|
||||||
|
url: apiPrefix + "/add",
|
||||||
|
method: "post",
|
||||||
|
data: obj,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function UpdateObj(obj: any) {
|
||||||
|
return await request({
|
||||||
|
url: apiPrefix + "/update",
|
||||||
|
method: "post",
|
||||||
|
data: obj,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function DelObj(id: any) {
|
||||||
|
return await request({
|
||||||
|
url: apiPrefix + "/delete",
|
||||||
|
method: "post",
|
||||||
|
params: { id },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function GetObj(id: any) {
|
||||||
|
return await request({
|
||||||
|
url: apiPrefix + "/info",
|
||||||
|
method: "post",
|
||||||
|
params: { id },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function GetDetail(id: any) {
|
||||||
|
return await request({
|
||||||
|
url: apiPrefix + "/detail",
|
||||||
|
method: "post",
|
||||||
|
params: { id },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function DeleteBatch(ids: any[]) {
|
||||||
|
return await request({
|
||||||
|
url: apiPrefix + "/deleteByIds",
|
||||||
|
method: "post",
|
||||||
|
data: { ids },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,166 @@
|
||||||
|
import * as api from "./api";
|
||||||
|
import { useI18n } from "/src/locales";
|
||||||
|
import { Ref, ref } from "vue";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
import { AddReq, compute, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes } from "@fast-crud/fast-crud";
|
||||||
|
import { useUserStore } from "/@/store/user";
|
||||||
|
import { useSettingStore } from "/@/store/settings";
|
||||||
|
import { message } from "ant-design-vue";
|
||||||
|
import { Dicts } from "/@/components/plugins/lib/dicts";
|
||||||
|
export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {
|
||||||
|
const router = useRouter();
|
||||||
|
const { t } = useI18n();
|
||||||
|
const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {
|
||||||
|
return await api.GetList(query);
|
||||||
|
};
|
||||||
|
const editRequest = async ({ form, row }: EditReq) => {
|
||||||
|
form.id = row.id;
|
||||||
|
const res = await api.UpdateObj(form);
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
const delRequest = async ({ row }: DelReq) => {
|
||||||
|
return await api.DelObj(row.id);
|
||||||
|
};
|
||||||
|
|
||||||
|
const addRequest = async ({ form }: AddReq) => {
|
||||||
|
const res = await api.AddObj(form);
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
|
||||||
|
const userStore = useUserStore();
|
||||||
|
const settingStore = useSettingStore();
|
||||||
|
const selectedRowKeys: Ref<any[]> = ref([]);
|
||||||
|
context.selectedRowKeys = selectedRowKeys;
|
||||||
|
|
||||||
|
return {
|
||||||
|
crudOptions: {
|
||||||
|
settings: {
|
||||||
|
plugins: {
|
||||||
|
//这里使用行选择插件,生成行选择crudOptions配置,最终会与crudOptions合并
|
||||||
|
rowSelection: {
|
||||||
|
enabled: true,
|
||||||
|
order: -2,
|
||||||
|
before: true,
|
||||||
|
// handle: (pluginProps,useCrudProps)=>CrudOptions,
|
||||||
|
props: {
|
||||||
|
multiple: true,
|
||||||
|
crossPage: true,
|
||||||
|
selectedRowKeys,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
request: {
|
||||||
|
pageRequest,
|
||||||
|
addRequest,
|
||||||
|
editRequest,
|
||||||
|
delRequest,
|
||||||
|
},
|
||||||
|
tabs: {
|
||||||
|
name: "status",
|
||||||
|
show: true,
|
||||||
|
},
|
||||||
|
rowHandle: {
|
||||||
|
minWidth: 200,
|
||||||
|
fixed: "right",
|
||||||
|
},
|
||||||
|
columns: {
|
||||||
|
id: {
|
||||||
|
title: "ID",
|
||||||
|
key: "id",
|
||||||
|
type: "number",
|
||||||
|
column: {
|
||||||
|
width: 80,
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
domain: {
|
||||||
|
title: t("certd.domain.domain"),
|
||||||
|
type: "text",
|
||||||
|
search: {
|
||||||
|
show: true,
|
||||||
|
},
|
||||||
|
editForm: {
|
||||||
|
component: {
|
||||||
|
disabled: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
challengeType: {
|
||||||
|
title: t("certd.domain.challengeType"),
|
||||||
|
type: "dict-select",
|
||||||
|
form: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* challengeType varchar(50),
|
||||||
|
* dnsProviderType varchar(50),
|
||||||
|
* dnsProviderAccess bigint,
|
||||||
|
* httpUploaderType varchar(50),
|
||||||
|
* httpUploaderAccess bigint,
|
||||||
|
* httpUploadRootDir varchar(512),
|
||||||
|
*/
|
||||||
|
dnsProviderType: {
|
||||||
|
title: t("certd.domain.dnsProviderType"),
|
||||||
|
type: "text",
|
||||||
|
form: {
|
||||||
|
component: {
|
||||||
|
name: "DnsProviderSelector",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
dnsProviderAccess: {
|
||||||
|
title: t("certd.domain.dnsProviderAccess"),
|
||||||
|
type: "text",
|
||||||
|
form: {
|
||||||
|
component: {
|
||||||
|
name: "AccessSelector",
|
||||||
|
type: compute(({ form }) => {
|
||||||
|
return form.dnsProviderType;
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
httpUploaderType: {
|
||||||
|
title: t("certd.domain.httpUploaderType"),
|
||||||
|
type: "dict-text",
|
||||||
|
dict: Dicts.uploaderTypeDict,
|
||||||
|
},
|
||||||
|
httpUploaderAccess: {
|
||||||
|
title: t("certd.domain.httpUploaderAccess"),
|
||||||
|
type: "text",
|
||||||
|
form: {
|
||||||
|
component: {
|
||||||
|
name: "AccessSelector",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
createTime: {
|
||||||
|
title: t("certd.create_time"),
|
||||||
|
type: "datetime",
|
||||||
|
form: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
column: {
|
||||||
|
sorter: true,
|
||||||
|
width: 160,
|
||||||
|
align: "center",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
updateTime: {
|
||||||
|
title: t("certd.update_time"),
|
||||||
|
type: "datetime",
|
||||||
|
form: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
column: {
|
||||||
|
show: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
<template>
|
||||||
|
<fs-page class="page-cert">
|
||||||
|
<template #header>
|
||||||
|
<div class="title">
|
||||||
|
{{ t("certd.domain.domainManager") }}
|
||||||
|
<span class="sub"> </span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<fs-crud ref="crudRef" v-bind="crudBinding">
|
||||||
|
<template #pagination-left>
|
||||||
|
<a-tooltip :title="t('certd.batch_delete')">
|
||||||
|
<fs-button icon="DeleteOutlined" @click="handleBatchDelete"></fs-button>
|
||||||
|
</a-tooltip>
|
||||||
|
</template>
|
||||||
|
</fs-crud>
|
||||||
|
</fs-page>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { onActivated, onMounted } from "vue";
|
||||||
|
import { useFs } from "@fast-crud/fast-crud";
|
||||||
|
import createCrudOptions from "./crud";
|
||||||
|
import { message, Modal } from "ant-design-vue";
|
||||||
|
import { DeleteBatch } from "./api";
|
||||||
|
import { useI18n } from "vue-i18n";
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "DomainManager",
|
||||||
|
});
|
||||||
|
const { crudBinding, crudRef, crudExpose, context } = useFs({ createCrudOptions });
|
||||||
|
|
||||||
|
const selectedRowKeys = context.selectedRowKeys;
|
||||||
|
const handleBatchDelete = () => {
|
||||||
|
if (selectedRowKeys.value?.length > 0) {
|
||||||
|
Modal.confirm({
|
||||||
|
title: t("certd.confirm"),
|
||||||
|
content: t("certd.confirm_delete_count", { count: selectedRowKeys.value.length }),
|
||||||
|
async onOk() {
|
||||||
|
await DeleteBatch(selectedRowKeys.value);
|
||||||
|
message.info(t("certd.delete_successful"));
|
||||||
|
crudExpose.doRefresh();
|
||||||
|
selectedRowKeys.value = [];
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
message.error(t("certd.please_select_records"));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 页面打开后获取列表数据
|
||||||
|
onMounted(() => {
|
||||||
|
crudExpose.doRefresh();
|
||||||
|
});
|
||||||
|
onActivated(async () => {
|
||||||
|
await crudExpose.doRefresh();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<style lang="less"></style>
|
|
@ -1,14 +0,0 @@
|
||||||
import { dict } from "@fast-crud/fast-crud";
|
|
||||||
|
|
||||||
export const Dicts = {
|
|
||||||
sslProviderDict: dict({
|
|
||||||
data: [
|
|
||||||
{ value: "letsencrypt", label: "Let‘s Encrypt" },
|
|
||||||
{ value: "zerossl", label: "ZeroSSL" },
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
challengeTypeDict: dict({ data: [{ value: "dns", label: "DNS校验" }] }),
|
|
||||||
dnsProviderTypeDict: dict({
|
|
||||||
url: "pi/dnsProvider/dnsProviderTypeDict",
|
|
||||||
}),
|
|
||||||
};
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
CREATE TABLE "cd_domain"
|
||||||
|
(
|
||||||
|
"id" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
|
"user_id" integer,
|
||||||
|
"domain" varchar(1024),
|
||||||
|
challenge_type varchar(50),
|
||||||
|
dns_provider_type varchar(50),
|
||||||
|
dns_provider_access bigint,
|
||||||
|
http_uploader_type varchar(50),
|
||||||
|
http_uploader_access bigint,
|
||||||
|
http_upload_root_dir varchar(512),
|
||||||
|
"disabled" boolean NOT NULL DEFAULT (false),
|
||||||
|
"create_time" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP),
|
||||||
|
"update_time" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX "index_domain_user_id" ON "cd_domain" ("user_id");
|
||||||
|
CREATE INDEX "index_domain_domain" ON "cd_domain" ("domain");
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';
|
||||||
|
import { Constants, CrudController } from '@certd/lib-server';
|
||||||
|
import {DomainService} from "../../../modules/cert/service/domain-service.js";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 授权
|
||||||
|
*/
|
||||||
|
@Provide()
|
||||||
|
@Controller('/api/cert/domain')
|
||||||
|
export class DomainController extends CrudController<DomainService> {
|
||||||
|
@Inject()
|
||||||
|
service: DomainService;
|
||||||
|
|
||||||
|
getService(): DomainService {
|
||||||
|
return this.service;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Post('/page', { summary: Constants.per.authOnly })
|
||||||
|
async page(@Body(ALL) body: any) {
|
||||||
|
body.query = body.query ?? {};
|
||||||
|
body.query.userId = this.getUserId();
|
||||||
|
const domain = body.query.domain;
|
||||||
|
delete body.query.domain;
|
||||||
|
|
||||||
|
const bq = qb => {
|
||||||
|
if (domain) {
|
||||||
|
qb.andWhere('domain like :domain', { domain: `%${domain}%` });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const pageRet = await this.getService().page({
|
||||||
|
query: body.query,
|
||||||
|
page: body.page,
|
||||||
|
sort: body.sort,
|
||||||
|
buildQuery: bq,
|
||||||
|
});
|
||||||
|
return this.ok(pageRet);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Post('/list', { summary: Constants.per.authOnly })
|
||||||
|
async list(@Body(ALL) body: any) {
|
||||||
|
body.query = body.query ?? {};
|
||||||
|
body.query.userId = this.getUserId();
|
||||||
|
const list = await this.getService().list(body);
|
||||||
|
return this.ok(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Post('/add', { summary: Constants.per.authOnly })
|
||||||
|
async add(@Body(ALL) bean: any) {
|
||||||
|
bean.userId = this.getUserId();
|
||||||
|
return super.add(bean);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Post('/update', { summary: Constants.per.authOnly })
|
||||||
|
async update(@Body(ALL) bean: any) {
|
||||||
|
await this.service.checkUserId(bean.id, this.getUserId());
|
||||||
|
delete bean.userId;
|
||||||
|
return super.update(bean);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Post('/info', { summary: Constants.per.authOnly })
|
||||||
|
async info(@Query('id') id: number) {
|
||||||
|
await this.service.checkUserId(id, this.getUserId());
|
||||||
|
return super.info(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Post('/delete', { summary: Constants.per.authOnly })
|
||||||
|
async delete(@Query('id') id: number) {
|
||||||
|
await this.service.checkUserId(id, this.getUserId());
|
||||||
|
return super.delete(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Post('/deleteByIds', { summary: Constants.per.authOnly })
|
||||||
|
async deleteByIds(@Body(ALL) body: any) {
|
||||||
|
await this.service.delete(body.ids, {
|
||||||
|
userId: this.getUserId(),
|
||||||
|
});
|
||||||
|
return this.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -13,26 +13,26 @@ export class DomainEntity {
|
||||||
@Column({ comment: '主域名', length: 100 })
|
@Column({ comment: '主域名', length: 100 })
|
||||||
domain: string;
|
domain: string;
|
||||||
|
|
||||||
@Column({ comment: '校验类型', name: 'challenge_type', length: 100 })
|
@Column({ comment: '校验类型', name: 'challenge_type', length: 50 })
|
||||||
challengeType : string;
|
challengeType : string;
|
||||||
|
|
||||||
@Column({ comment: 'DNS提供商', name: 'dns_provider_type', length: 100 })
|
@Column({ comment: 'DNS提供商', name: 'dns_provider_type', length: 50 })
|
||||||
dnsProviderType: string;
|
dnsProviderType: string;
|
||||||
|
|
||||||
@Column({ comment: 'DNS提供商授权', name: 'dns_provider_access', length: 200 })
|
@Column({ comment: 'DNS提供商授权', name: 'dns_provider_access' })
|
||||||
dnsProviderAccess: number;
|
dnsProviderAccess: number;
|
||||||
|
|
||||||
@Column({ comment: '是否禁用', name: 'disabled' })
|
@Column({ comment: '是否禁用', name: 'disabled' })
|
||||||
disabled: boolean;
|
disabled: boolean;
|
||||||
|
|
||||||
|
|
||||||
@Column({ comment: 'http上传类型', name: 'http_uploader_type', length: 200 })
|
@Column({ comment: 'http上传类型', name: 'http_uploader_type', length: 50 })
|
||||||
httpUploaderType: string;
|
httpUploaderType: string;
|
||||||
|
|
||||||
@Column({ comment: 'http上传授权', name: 'http_uploader_access', length: 200 })
|
@Column({ comment: 'http上传授权', name: 'http_uploader_access' })
|
||||||
httpUploaderAccess: number;
|
httpUploaderAccess: number;
|
||||||
|
|
||||||
@Column({ comment: 'http上传根目录', name: 'http_upload_root_dir', length: 200 })
|
@Column({ comment: 'http上传根目录', name: 'http_upload_root_dir', length: 512 })
|
||||||
httpUploadRootDir: string;
|
httpUploadRootDir: string;
|
||||||
|
|
||||||
@Column({
|
@Column({
|
||||||
|
|
Loading…
Reference in New Issue