【新增】插件git同步模块,用于同步项目内容,加速项目开发

【调整】前端暗色问题
This commit is contained in:
chudong
2025-05-14 16:50:56 +08:00
parent dc43da936b
commit e6947ec5c4
215 changed files with 19918 additions and 9710 deletions

Binary file not shown.

View File

@@ -1,5 +1,131 @@
# Vue 3 + TypeScript + Vite
# AllinSSL
This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
AllinSSL 是一个基于 Vue 3 TypeScript 开发的 SSL 证书管理平台,旨在简化 SSL 证书的申请、部署、监控和管理流程。
Learn more about the recommended Project Setup and IDE Support in the [Vue Docs TypeScript Guide](https://vuejs.org/guide/typescript/overview.html#project-setup).
## 功能特性
- **证书管理**:集中管理所有 SSL 证书,包括证书信息查看、状态监控和到期提醒
- **证书申请**:简化 SSL 证书申请流程,支持多种类型证书的快速申请
- **自动部署**:支持证书的自动化部署到不同的服务器和环境
- **监控系统**:实时监控证书状态,提供证书健康度和到期预警
- **API 管理**:提供 API 接口管理功能,支持与其他系统集成
- **多语言支持**:内置国际化支持,可扩展多种语言
## 技术栈
- **前端框架**Vue 3 + TypeScript + TSX
- **状态管理**Pinia
- **路由管理**Vue Router
- **UI 组件库**Naive UI
- **工具库**VueUse
- **CSS 框架**Tailwind CSS
- **构建工具**Vite
- **包管理**Turborepo (Monorepo 结构)
## 开发环境设置
### 前提条件
- Node.js (v16+)
- npm 或 yarn 或 pnpm
### 安装依赖
```bash
npm install
# 或
yarn install
# 或
pnpm install
```
### 开发服务器启动
```bash
npm run dev
# 或
yarn dev
# 或
pnpm dev
```
应用将在本地 `http://localhost:5173` 启动。
## 构建部署
### 构建生产版本
```bash
npm run build
# 或
yarn build
# 或
pnpm build
```
构建后的文件将生成在 `dist` 目录中。
### 预览构建结果
```bash
npm run preview
# 或
yarn preview
# 或
pnpm preview
```
## 项目结构
```
src/
├── api/ # API 接口定义
├── assets/ # 静态资源
├── components/ # 公共组件
├── config/ # 全局配置
├── lib/ # 工具库和功能函数
├── locales/ # 国际化语言文件
├── router/ # 路由配置
├── styles/ # 全局样式文件
├── types/ # TypeScript 类型定义
├── views/ # 页面视图组件
│ ├── certApply/ # 证书申请
│ ├── certManage/ # 证书管理
│ ├── autoDeploy/ # 自动部署
│ ├── monitor/ # 监控系统
│ ├── settings/ # 系统设置
│ ├── layout/ # 布局组件
│ ├── login/ # 登录页面
│ └── home/ # 首页
├── App.tsx # 根组件
└── main.ts # 应用入口
```
## 代码规范
项目采用 ESLint 和 Prettier 进行代码规范控制,确保代码风格统一。
```bash
# 运行代码检查
npm run lint
# 或
yarn lint
# 或
pnpm lint
```
## 项目特点
- 采用 Vue 3 Composition API 和 TSX 语法
- MVC 分离模式:将状态 (useStore.tsx)、控制器 (useController.tsx) 和视图 (index.tsx) 区分开来
- 使用 Tailwind CSS 实现响应式设计
- 基于 Vite 的高性能构建系统
- Monorepo 结构,便于多包协同开发
## 贡献指南
欢迎贡献代码,请确保遵循以下准则:
1. 遵循项目已有的代码风格和命名规范
2. 提交前进行代码检查和测试
3. 提交消息遵循规范化提交格式

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,7 @@
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>ALLinSSL</title>
<title>AllinSSL</title>
</head>
<body>
<div id="app"></div>

View File

@@ -50,11 +50,12 @@
},
"devDependencies": {
"@baota/eslint": "workspace:*",
"@baota/plugin-i18n": "workspace:*",
"@baota/vite-plugin-i18n": "workspace:*",
"@baota/vite-plugin-ftp-sync": "workspace:*",
"@baota/vite-plugin-turborepo-deploy": "workspace:*",
"@baota/prettier": "workspace:*",
"@baota/stylelint": "workspace:*",
"@baota/typescript": "workspace:*",
"@baota/project-ftp-sync": "workspace:*",
"@types/crypto-js": "^4.1.1",
"@types/humps": "^2.0.6",
"@types/md5": "^2.3.5",

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1747041966838" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7167" width="40" height="40" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M654.7456 646.5536c5.4784-17.408 3.6864-34.7648-5.4784-45.2096s-22.016-17.408-38.5024-19.1488l-318.976-3.4816c-1.8432 0-3.6864-1.7408-5.4784-1.7408-1.8432-1.7408-1.8432-3.4816 0-5.2224 1.8432-3.4816 3.6864-5.2224 7.3216-5.2224l320.8192-3.4816c38.5024-1.7408 78.848-31.2832 93.4912-66.048l18.3296-45.2096c0-1.7408 1.8432-3.4816 0-5.2224C706.048 357.888 621.7216 291.84 522.752 291.84c-91.648 0-170.496 55.6544-197.9904 133.888-18.3296-12.1856-40.3456-19.1488-65.9968-17.408-43.9808 3.4816-78.848 38.2464-84.3264 79.9744-1.8432 10.4448 0 20.8896 1.8432 31.2832C104.7552 521.3696 46.08 576.9728 46.08 646.5536c0 6.9632 0 12.1856 1.8432 19.1488 0 3.4816 3.6864 5.2224 5.4784 5.2224h588.4928c3.6864 0 7.3216-1.7408 7.3216-5.2224l5.5296-19.1488z" fill="#F48120" p-id="7168"></path><path d="M764.7232 460.8h-10.7008c-2.1504 0-4.2496 1.6896-6.4 3.4304l-14.9504 41.1136c-6.4 17.1008-4.2496 34.2528 6.4 44.4928s25.6512 17.1008 44.8512 18.8416l79.0528 3.4304c2.1504 0 4.2496 1.6896 6.4 1.6896 2.1504 1.6896 2.1504 3.4304 0 5.12-2.1504 3.4304-4.2496 5.12-8.5504 5.12l-81.2032 3.4304c-44.8512 1.6896-91.8528 30.8224-108.9536 65.0752l-4.2496 15.4112c-2.1504 1.6896 0 5.12 4.2496 5.12h282.0096c4.2496 0 6.4-1.6896 6.4-5.12 4.2496-13.7216 8.5504-29.1328 8.5504-44.4928C967.68 534.4256 875.8272 460.8 764.7232 460.8" fill="#FAAD3F" p-id="7169"></path></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1747043132978" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8260" width="40" height="40" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M433.728 0C382.72 0 336.32 23.424 303.872 60.8c-51.008 70.4-13.888 168.704 13.952 224.832 27.904 56.128 153.152 257.472 157.76 262.208 4.544 4.672 9.28 4.672 9.28 0 0-4.736 13.888-299.712 4.544-369.92A998.016 998.016 0 0 0 433.728 0zM160 135.68c-9.28 0-74.24 70.272-83.52 131.2-9.28 60.8 23.168 107.712 97.408 159.168 78.912 56.128 259.84 154.496 264.448 149.888 4.544-9.344-69.568-140.544-134.592-238.848C238.912 238.72 169.344 135.744 160 135.744z m23.168 599.424c55.68 23.424 143.872-32.832 167.04-46.72l64.96-46.912-315.52 9.344c18.624 32.832 46.4 60.992 83.52 84.288z m9.28-257.472c-55.68-28.16-171.52-93.696-176.256-93.696-4.608 0-23.168 84.288 13.952 145.28 37.12 60.8 106.752 79.552 139.136 84.224 37.12 4.736 250.496 4.736 250.496 0-4.608-4.8-171.584-107.776-227.328-135.808zM712.128 60.8C679.68 23.424 633.28 0 582.272 0c-23.168 56.128-41.728 112.384-51.008 173.248-9.28 70.208 4.608 369.92 4.608 369.92 0 4.672 4.544 4.672 9.28 0 4.544-4.736 134.528-210.752 157.696-262.208 23.168-51.456 60.288-149.888 9.28-220.16zM1004.416 384c-4.608 0-120.704 65.472-176.256 93.632-55.68 28.096-222.72 131.2-227.328 135.808 0 4.736 213.44 4.736 250.56 0 32.448-4.672 102.016-23.424 139.136-84.288 32.448-60.928 13.888-145.216 13.888-145.216z m-338.688 304.32c23.168 14.08 111.36 70.208 167.04 46.784 37.12-18.752 64.96-51.456 83.392-88.96l-315.52-9.344 65.088 51.52z m273.664-421.44c-4.544-60.928-74.24-131.2-83.52-131.2-9.28 0-88.128 103.04-148.48 201.408-60.224 98.304-134.528 229.504-129.792 238.848 4.544 9.408 185.6-93.632 264.384-149.888 74.24-51.456 102.144-93.632 97.408-159.168z" fill="#EA020A" p-id="8261"></path><path d="M71.232 1002.24V931.2h81.28v70.976h26.24v-160.256h-26.24v66.88h-81.28v-66.88h-26.24v160.256h26.24z m222.656 3.136c21.12 0 37.44-5.44 49.088-16.192 11.712-11.008 17.536-26.88 17.536-47.808v-99.392h-26.24v99.84c0 13.952-3.392 24-9.664 30.72-6.528 6.592-16.832 9.92-30.72 9.92-14.208 0-24.512-3.392-30.784-9.856-6.464-6.784-9.6-16.832-9.6-30.72v-99.84H227.2v99.328c0 20.928 5.824 36.8 17.728 48 11.2 10.56 27.584 16 48.96 16z m127.424-3.2l14.592-40.128H503.04l14.528 40.192h28.032l-61.248-160.256h-29.824l-61.248 160.256h28.032z m73.856-61.696h-51.392l25.344-70.208h0.896l25.152 70.208z m142.72 61.76l31.36-120.512h0.896l31.232 120.512h27.84l46.208-160.256h-29.632l-30.08 121.856h-0.832l-31.68-121.856h-27.136l-31.616 121.856h-0.896l-30.08-121.856H563.84l46.016 160.256h28.032z m290.816 0v-22.464h-93.12v-48.512h62.08v-22.4h-62.08v-44.48h89.344v-22.4h-115.584v160.256h119.36z m67.968 0v-160.256h-26.24v160.256h26.24z" fill="#010101" p-id="8262"></path></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -129,6 +129,8 @@ export default defineComponent({
// 错误信息
const errorMessage = ref('')
console.log(props.type)
/**
* @description 跳转到DNS提供商授权页面
*/
@@ -145,12 +147,11 @@ export default defineComponent({
return (
<div class="flex items-center">
{option.label ? (
<NFlex>
<SvgIcon icon={`resources-${option.type}`} size="2rem" />
<NText>{option.label}</NText>
</NFlex>
renderLabel(option)
) : (
<NText>{props.type === 'dns' ? $t('t_3_1745490735059') : $t('t_19_1745735766810')}</NText>
<NText class="text-[#aaa]">
{props.type === 'dns' ? $t('t_0_1747019621052', []) : $t('t_0_1746858920894')}
</NText>
)}
</div>
)
@@ -247,18 +248,22 @@ export default defineComponent({
watch(
() => props.value,
() => {
loadDnsProviders(props.type)
// loadDnsProviders(props.type)
handleUpdateValue(props.value)
},
{ immediate: true },
)
onMounted(() => {
loadDnsProviders(props.type)
})
return () => (
<NSpin show={isLoading.value}>
<NGrid cols={24} class={props.customClass}>
<NFormItemGi
span={props.isAddMode ? 13 : 24}
label={props.type === 'dns' ? $t('t_3_1745735765112') : $t('t_0_1745744902975')}
label={props.type === 'dns' ? $t('t_3_1745735765112') : $t('t_0_1746754500246')}
path={props.path}
>
<NSelect
@@ -268,7 +273,7 @@ export default defineComponent({
renderTag={renderSingleSelectTag}
filterable
filter={handleFilter}
placeholder={props.type === 'dns' ? $t('t_3_1745490735059') : $t('t_1_1745744905566')}
placeholder={props.type === 'dns' ? $t('t_3_1745490735059') : $t('t_0_1746858920894')}
v-model:value={param.value.value}
onUpdateValue={handleUpdateValue}
disabled={props.disabled}
@@ -276,7 +281,7 @@ export default defineComponent({
empty: () => {
return (
<span class="text-[1.4rem]">
{errorMessage.value || (props.type === 'dns' ? $t('t_3_1745490735059') : $t('t_1_1745744905566'))}
{errorMessage.value || (props.type === 'dns' ? $t('t_1_1746858922914') : $t('t_2_1746858923964'))}
</span>
)
},
@@ -286,7 +291,7 @@ export default defineComponent({
{props.isAddMode && (
<NFormItemGi span={11}>
<NButton class="mx-[8px]" onClick={goToAddDnsProvider} disabled={props.disabled}>
{props.type === 'dns' ? $t('t_1_1746004861166') : $t('t_0_1745748292337')}
{props.type === 'dns' ? $t('t_1_1746004861166') : $t('t_3_1746858920060')}
</NButton>
<NButton onClick={() => loadDnsProviders(props.type)} loading={isLoading.value} disabled={props.disabled}>
{$t('t_0_1746497662220')}

View File

@@ -0,0 +1,47 @@
import { NEmpty, NButton } from 'naive-ui'
import { defineComponent } from 'vue'
/**
* 空状态提示组件,带有添加按钮和社区链接
* @param addButtonText 添加按钮文本
* @param onAddClick 添加按钮点击事件
*/
interface EmptyActionPromptProps {
addButtonText: string
onAddClick: () => void
}
export default defineComponent({
name: 'EmptyActionPrompt',
props: {
addButtonText: {
type: String,
required: true,
},
onAddClick: {
type: Function,
required: true,
},
},
setup(props: EmptyActionPromptProps) {
return () => (
<div class="flex justify-center items-center h-full">
<NEmpty class="px-[4rem]">
<NButton text type="primary" size="small" onClick={props.onAddClick}>
{props.addButtonText}
</NButton>
<NButton text tag="a" target="_blank" type="primary" href="https://github.com/allinssl/allinssl/issues">
Issues
</NButton>
Github给我们
<NButton text tag="a" target="_blank" type="primary" href="https://github.com/allinssl/allinssl">
Star
</NButton>
AllinSSL极其重要
</NEmpty>
</div>
)
},
})

View File

@@ -4,8 +4,8 @@ import { useStore } from '@components/flowChart/useStore'
import { $t } from '@locales/index'
import rules from './verify'
import DnsProviderSelect from '@components/dnsProviderSelect'
import type { ApplyNodeConfig } from '@components/flowChart/types'
import { deepClone } from '@baota/utils/data'
export default defineComponent({
name: 'ApplyNodeDrawer',
@@ -15,7 +15,15 @@ export default defineComponent({
type: Object as PropType<{ id: string; config: ApplyNodeConfig }>,
default: () => ({
id: '',
config: {},
config: {
domains: '',
email: '',
provider_id: '',
provider: '',
end_day: 30,
name_server: '',
skip_check: 1,
},
}),
},
},
@@ -24,14 +32,9 @@ export default defineComponent({
// 弹窗辅助
const { confirm } = useModalHooks()
// 获取表单助手函数
const { useFormInput } = useFormHooks()
const { useFormInput, useFormHelp, useFormSwitch } = useFormHooks()
// 表单参数
const param = ref<ApplyNodeConfig>(
Object.keys(props.node.config).length > 0
? props.node.config
: { domains: '', email: '', provider_id: '', provider: '', end_day: 30 },
)
const param = ref(deepClone(props.node.config))
// 表单渲染配置
const config = computed(() => {
@@ -39,9 +42,18 @@ export default defineComponent({
return [
useFormInput($t('t_17_1745227838561'), 'domains', {
placeholder: $t('t_0_1745735774005'),
onInput: (val: string) => {
param.value.domains = val.trim() // 去除空格
param.value.domains = param.value.domains.replace(//g, ',') // 中文逗号分隔
param.value.domains = param.value.domains.replace(/;/g, ',') // 去除分号
},
onFocus: () => {
param.value.domains = param.value.domains.replace(/,^/g, '') // 中文逗号分隔
},
}),
useFormInput($t('t_1_1745735764953'), 'email', {
placeholder: $t('t_2_1745735773668'),
onInput: (val: string) => (param.value.email = val.trim()),
}),
{
type: 'custom' as const,
@@ -76,6 +88,33 @@ export default defineComponent({
)
},
},
useFormInput(
$t('t_0_1747106957037'),
'name_server',
{
placeholder: $t('t_1_1747106961747'),
onInput: (val: string) => {
param.value.name_server = val.trim() // 去除空格
param.value.name_server = param.value.name_server.replace(//g, ',') // 中文逗号分隔
param.value.name_server = param.value.name_server.replace(/;/g, ',') // 去除分号
},
onFocus: () => {
param.value.name_server = param.value.name_server.replace(/,^/g, '') // 中文逗号分隔
},
},
{ showRequireMark: false },
),
useFormSwitch($t('t_2_1747106957037'), 'skip_check', {}, { showRequireMark: false }),
useFormHelp([
{
content: $t('t_0_1747040228657'),
isHtml: false,
},
{
content: $t('t_1_1747040226143'),
isHtml: false,
},
]),
]
})

View File

@@ -9,9 +9,9 @@ export default {
validator: (rule: FormItemRule, value: string) => {
return new Promise<void>((resolve, reject) => {
if (!isDomainGroup(value)) {
reject(new Error($t('t_0_1745553910661')))
reject(new Error($t('t_3_1747047218669')))
} else if (!value) {
reject(new Error($t('t_0_1746697487119')))
reject(new Error($t('t_0_1744958839535')))
} else {
resolve()
}

View File

@@ -10,7 +10,7 @@ import DnsProviderSelect from '@/components/dnsProviderSelect'
import styles from './index.module.css'
import verifyRules from './verify'
import { isArray } from '@baota/utils/type'
import { deepClone } from '@baota/utils/data'
type StepStatus = 'process' | 'wait' | 'finish' | 'error'
@@ -26,6 +26,10 @@ export default defineComponent({
config: {
provider: '',
provider_id: '',
inputs: {
fromNodeId: '',
name: '',
},
},
}),
},
@@ -61,20 +65,13 @@ export default defineComponent({
const current = ref(1) // 当前步骤
const next = ref(true) // 是否是下一步
const currentStatus = ref<StepStatus>('process') // 当前步骤状态
// 表单参数
const param = ref(
Object.keys(props.node.config).length > 0
? props.node.config
: {
provider: '',
provider_id: '',
inputs: {
fromNodeId: '',
name: '',
},
},
) as Ref<DeployNodeConfig & { inputs: DeployNodeInputsConfig }>
const param = ref(deepClone(props.node.config)) // 表单参数
const provider = computed(() => {
return param.value.provider
? $t('t_4_1746858917773') + '' + deployTypeOptions.find((item) => item.value === param.value.provider)?.label
: $t('t_19_1745735766810')
})
// 表单配置
const formConfig = computed(() => {
const config = []
@@ -107,8 +104,14 @@ export default defineComponent({
case 'ssh':
config.push(
...[
useFormInput('证书文件路径仅支持PEM格式', 'certPath', { placeholder: $t('t_30_1746667591892') }),
useFormInput('私钥文件路径', 'keyPath', { placeholder: $t('t_31_1746667593074') }),
useFormInput('证书文件路径仅支持PEM格式', 'certPath', {
placeholder: $t('t_30_1746667591892'),
onInput: (val: string) => (param.value.certPath = val.trim()),
}),
useFormInput('私钥文件路径', 'keyPath', {
placeholder: $t('t_31_1746667593074'),
onInput: (val: string) => (param.value.keyPath = val.trim()),
}),
useFormTextarea(
'前置命令',
'beforeCmd',
@@ -125,20 +128,62 @@ export default defineComponent({
)
break
case 'btpanel-site':
config.push(...[useFormInput('站点名称', 'siteName', { placeholder: $t('t_23_1745735766455') })])
config.push(
...[
useFormInput('站点名称', 'siteName', {
placeholder: $t('t_23_1745735766455'),
onInput: (val: string) => (param.value.siteName = val.trim()),
}),
],
)
break
case '1panel-site':
config.push(...[useFormInput('站点ID', 'site_id', { placeholder: $t('t_24_1745735766826') })])
config.push(
...[
useFormInput('站点ID', 'site_id', {
placeholder: $t('t_24_1745735766826'),
onInput: (val: string) => (param.value.site_id = val.trim()),
}),
],
)
break
case 'tencentcloud-cdn':
case 'aliyun-cdn':
config.push(...[useFormInput('域名', 'domain', { placeholder: $t('t_0_1744958839535') })])
config.push(
...[
useFormInput('域名', 'domain', {
placeholder: $t('t_0_1744958839535'),
onInput: (val: string) => (param.value.domain = val.trim()),
}),
],
)
break
case 'tencentcloud-cos':
case 'aliyun-oss':
config.push(...[useFormInput('域名', 'domain', { placeholder: $t('t_0_1744958839535') })])
config.push(...[useFormInput('区域', 'region', { placeholder: $t('t_25_1745735766651') })])
config.push(...[useFormInput('存储桶', 'bucket', { placeholder: $t('t_26_1745735767144') })])
config.push(
...[
useFormInput('域名', 'domain', {
placeholder: $t('t_0_1744958839535'),
onInput: (val: string) => (param.value.domain = val.trim()),
}),
],
)
config.push(
...[
useFormInput('区域', 'region', {
placeholder: $t('t_25_1745735766651'),
onInput: (val: string) => (param.value.region = val.trim()),
}),
],
)
config.push(
...[
useFormInput('存储桶', 'bucket', {
placeholder: $t('t_26_1745735767144'),
onInput: (val: string) => (param.value.bucket = val.trim()),
}),
],
)
break
}
return config
@@ -149,7 +194,7 @@ export default defineComponent({
* @returns
*/
const nextStep = async () => {
if (!props.node.config.provider) return message.error($t('t_19_1745735766810'))
if (!param.value.provider) return message.error($t('t_0_1746858920894'))
// 加载证书来源选项
certOptions.value = findApplyUploadNodesUp(props.node.id).map((item) => {
@@ -158,7 +203,7 @@ export default defineComponent({
if (!certOptions.value.length) {
message.warning($t('t_3_1745748298161'))
} else if (!props.node.config.inputs?.fromNodeId) {
} else if (!param.value.inputs?.fromNodeId) {
param.value.inputs = {
name: certOptions.value[0]?.label || '',
fromNodeId: certOptions.value[0]?.value || '',
@@ -221,7 +266,7 @@ export default defineComponent({
return () => (
<div class={styles.container} style={cssVar.value}>
<NSteps size="small" current={current.value} status={currentStatus.value}>
<NStep title={$t('t_28_1745735766626')} description={$t('t_19_1745735766810')}></NStep>
<NStep title={$t('t_28_1745735766626')} description={provider.value}></NStep>
<NStep title={$t('t_29_1745735768933')} description={$t('t_2_1745738969878')}></NStep>
</NSteps>
{current.value === 1 && (

View File

@@ -5,7 +5,7 @@ import { isDomain } from '@baota/utils/business'
export default {
provider: {
required: true,
message: $t('t_19_1745735766810'),
message: $t('t_0_1746858920894'),
type: 'string',
trigger: 'change',
},
@@ -15,7 +15,7 @@ export default {
type: 'string',
validator: (rule: FormItemRule, value: number) => {
if (!value) {
return new Error($t('t_1_1745744905566'))
return new Error($t('t_0_1746858920894'))
}
},
},

View File

@@ -9,6 +9,7 @@ import NotifyProviderSelect from '@components/notifyProviderSelect'
import verify from './verify'
import { NotifyNodeConfig } from '@components/flowChart/types'
import { deepClone } from '@baota/utils/data'
export default defineComponent({
name: 'NotifyNodeDrawer',
@@ -32,25 +33,18 @@ export default defineComponent({
const { useFormInput, useFormTextarea, useFormCustom } = useFormHooks()
const { confirm } = useModalHooks()
const { handleError } = useError()
const param = ref(
Object.keys(props.node.config).length > 0
? props.node.config
: {
provider: '',
provider_id: '',
subject: '',
body: '',
},
)
const param = ref(deepClone(props.node.config))
// 表单渲染配置
const formConfig: FormConfig = [
useFormInput($t('t_0_1745920566646'), 'subject', {
placeholder: $t('t_3_1745887835089'),
onInput: (val: string) => (param.value.subject = val.trim()),
}),
useFormTextarea($t('t_1_1745920567200'), 'body', {
placeholder: $t('t_4_1745887835265'),
rows: 4,
onInput: (val: string) => (param.value.body = val.trim()),
}),
useFormCustom(() => (
<NotifyProviderSelect

View File

@@ -10,6 +10,7 @@ import type { FormConfig } from '@baota/naive-ui/types/form'
// 类型
import type { VNode } from 'vue'
import { useError } from '@baota/hooks/error'
import { deepClone } from '@baota/utils/data'
export default defineComponent({
name: 'StartNodeDrawer',
@@ -17,7 +18,12 @@ export default defineComponent({
// 节点配置数据
node: {
type: Object as PropType<{ id: string; config: StartNodeConfig }>,
default: () => ({}),
default: () => ({
id: '',
config: {
exec_type: 'auto',
},
}),
},
},
setup(props) {
@@ -29,9 +35,7 @@ export default defineComponent({
// 获取表单助手函数
const { useFormRadio, useFormCustom } = useFormHooks()
// 表单参数
const param = ref<StartNodeConfig>(
Object.values(props.node.config).length > 0 ? props.node.config : { exec_type: 'manual' },
)
const param = ref(deepClone(props.node.config))
// 周期类型选项
const cycleTypeOptions = [
@@ -58,9 +62,6 @@ export default defineComponent({
month: { exec_type: 'auto', type: 'month', hour: 1, minute: 0, month: 1 },
}
// 节点配置
const { config } = toRefs(props.node)
// 创建时间输入input
const createTimeInput = (value: number, updateFn: (val: number) => void, max: number, label: string): VNode => (
<NInputGroup>
@@ -115,7 +116,7 @@ export default defineComponent({
</NFormItemGi>
)}
<NFormItemGi span={config.value.type === 'day' ? 7 : 5} path="hour">
<NFormItemGi span={param.value.type === 'day' ? 7 : 5} path="hour">
{createTimeInput(
param.value.hour || 0,
(val: number) => (param.value.hour = val),
@@ -124,7 +125,7 @@ export default defineComponent({
)}
</NFormItemGi>
<NFormItemGi span={config.value.type === 'day' ? 7 : 5} path="minute">
<NFormItemGi span={param.value.type === 'day' ? 7 : 5} path="minute">
{createTimeInput(
param.value.minute || 0,
(val: number) => (param.value.minute = val),

View File

@@ -1,10 +1,15 @@
import { useForm, useFormHooks, useModalHooks } from '@baota/naive-ui/hooks'
import { FormConfig } from '@baota/naive-ui/types/form'
import { $t } from '@locales/index'
import { useStore } from '@components/flowChart/useStore'
import { useError } from '@baota/hooks/error'
import { deepClone } from '@baota/utils/data'
import { $t } from '@locales/index'
import { getCertList, uploadCert } from '@api/cert'
import { useStore } from '@components/flowChart/useStore'
import verifyRules from './verify'
import { UploadNodeConfig } from '@components/flowChart/types'
import type { FormConfig } from '@baota/naive-ui/types/form'
import type { UploadNodeConfig } from '@components/flowChart/types'
import type { CertItem } from '@/types/cert'
export default defineComponent({
name: 'UploadNodeDrawer',
@@ -15,6 +20,7 @@ export default defineComponent({
default: () => ({
id: '',
config: {
cert_id: '',
cert: '',
key: '',
},
@@ -25,25 +31,69 @@ export default defineComponent({
// 获取store
const { updateNodeConfig, isRefreshNode } = useStore()
// 获取表单助手函数
const { useFormTextarea } = useFormHooks()
const { useFormTextarea, useFormSelect, useFormHelp } = useFormHooks()
// 节点配置数据
const { config } = toRefs(props.node)
const param = ref(deepClone(props.node.config))
// 弹窗辅助
const { confirm } = useModalHooks()
const { confirm, options } = useModalHooks()
// 错误处理
const { handleError } = useError()
// 弹窗配置
const modalOptions = options()
// 证书列表
const certList = ref<{ cert: string; key: string; label: string; value: string }[]>([
{
cert: '',
key: '',
label: '自定义证书',
value: '',
},
])
// 表单渲染配置
const formConfig: FormConfig = [
useFormTextarea($t('t_34_1745735771147'), 'cert', {
placeholder: $t('t_35_1745735781545'),
rows: 6,
}),
useFormTextarea($t('t_36_1745735769443'), 'key', {
placeholder: $t('t_37_1745735779980'),
rows: 6,
}),
]
const formConfig = computed(
() =>
[
useFormSelect(
$t('t_0_1747110184700'),
'cert_id',
certList.value,
{
filterable: true,
onUpdateValue: (val: string) => {
param.value.cert_id = val
const item = findCertItem(val)
if (item) {
param.value.cert = item.cert
param.value.key = item.key
}
},
},
{ showRequireMark: false },
),
useFormTextarea($t('t_34_1745735771147'), 'cert', {
placeholder: $t('t_35_1745735781545'),
rows: 6,
readonly: param.value.cert_id === '' ? false : true,
onInput: (val: string) => (param.value.cert = val.trim()),
}),
useFormTextarea($t('t_36_1745735769443'), 'key', {
placeholder: $t('t_37_1745735779980'),
rows: 6,
readonly: param.value.cert_id === '' ? false : true,
onInput: (val: string) => (param.value.key = val.trim()),
}),
useFormHelp([
{
content: $t('t_1_1747110191587'),
},
{
content: $t('t_2_1747110193465'),
},
]),
] as FormConfig,
)
// 创建表单实例
const {
@@ -51,23 +101,68 @@ export default defineComponent({
data,
example,
} = useForm<UploadNodeConfig>({
defaultValue: config,
defaultValue: param,
config: formConfig,
rules: verifyRules,
})
/**
* 查找证书项
* @param {string} val 证书值
* @returns {object} 证书项
*/
const findCertItem = (val: string) => {
return certList.value.find((item) => item.value === val)
}
/**
* @description 渲染证书列表
*/
const renderCertList = async () => {
try {
const { data } = await getCertList({ p: 1, limit: 100 }).fetch()
certList.value =
data?.map((item: CertItem) => ({
cert: item.cert,
key: item.key,
label: item.domains + ' 【 ' + item.issuer + ' 】',
value: item.sha256,
})) || []
certList.value.unshift({
cert: '',
key: '',
label: '自定义证书',
value: '',
})
} catch (error) {
certList.value = []
handleError(error)
}
}
onMounted(async () => {
await renderCertList()
})
modalOptions.value.confirmText = computed(() => {
return param.value.cert_id === '' ? $t('t_3_1747110185110') : $t('t_2_1744861190040')
})
// 确认事件触发
confirm(async (close) => {
try {
await example.value?.validate()
if (param.value.cert_id === '') {
const { data } = await uploadCert(param.value).fetch()
param.value.cert_id = data
}
updateNodeConfig(props.node.id, data.value) // 更新节点配置
console.log(data.value, props.node.id)
isRefreshNode.value = props.node.id // 刷新节点
close()
} catch (error) {
handleError(error)
}
})
return () => (
<div class="upload-node-drawer">
<Form labelPlacement="top" />

View File

@@ -3,7 +3,7 @@ import type { FormItemRule, FormRules } from 'naive-ui'
export default {
key: {
required: true,
trigger: 'input',
trigger: ['input', 'blur', 'focus'],
validator: (rule: FormItemRule, value: string) => {
return new Promise<void>((resolve, reject) => {
if (!value) {
@@ -16,7 +16,7 @@ export default {
},
cert: {
required: true,
trigger: 'input',
trigger: ['input', 'blur', 'focus'],
validator: (rule: FormItemRule, value: string) => {
return new Promise<void>((resolve, reject) => {
if (!value) {

View File

@@ -4,7 +4,7 @@
}
.flowContainer {
@apply flex relative box-border w-full h-[calc(100vh-19rem)] overflow-x-auto overflow-y-auto bg-slate-50 dark:bg-gray-900 ;
@apply flex relative box-border w-full h-[calc(100vh-19rem)] overflow-x-auto overflow-y-auto bg-slate-50 ;
}
.flowProcess {
@@ -33,11 +33,11 @@
/* 右侧配置区样式 */
.configPanel {
@apply flex flex-col w-[360px] min-w-[360px] bg-white dark:bg-gray-800 dark:border-gray-700 z-10 rounded-lg;
@apply flex flex-col w-[360px] min-w-[360px] bg-white z-10 rounded-lg;
}
.configHeader {
@apply flex items-center justify-between px-4 py-3 border-b border-gray-200 dark:border-gray-700;
@apply flex items-center justify-between px-4 py-3 border-b border-gray-200 ;
}
.configContent {
@@ -45,5 +45,5 @@
}
.emptyTip {
@apply flex items-center justify-center h-full text-gray-400 dark:text-gray-500;
@apply flex items-center justify-center h-full text-gray-400 ;
}

View File

@@ -106,9 +106,9 @@ nodeOptions[APPLY] = () =>
config: {
domains: '',
email: '',
end_day: 30,
provider: '',
provider_id: '',
end_day: 30,
},
childNode: null,
},
@@ -125,6 +125,7 @@ nodeOptions[UPLOAD] = () =>
name: '上传',
type: UPLOAD,
config: {
cert_id: '',
cert: '',
key: '',
},
@@ -146,6 +147,10 @@ nodeOptions[DEPLOY] = () =>
config: {
provider: '',
provider_id: '',
inputs: {
fromNodeId: '',
name: '',
},
},
childNode: null,
},

View File

@@ -25,7 +25,7 @@ export default {
id: 'deploy-1',
name: '部署',
type: 'deploy',
inputs: {},
inputs: [],
config: {
provider: '',
provider_id: '',

View File

@@ -203,6 +203,8 @@ export interface ApplyNodeConfig {
provider_id: string // DNS提供商授权ID
provider: string // DNS提供商
end_day: number // 续签间隔
name_server: string // DNS递归服务器
skip_check: number // 跳过检查
// 高级功能
// algorithm: 'RSA2048' | 'RSA3072' | 'RSA4096' | 'RSA8192' | 'EC256' | 'EC384' // 数字证书算法
// dnsServer?: string // 指定DNS解析服务器
@@ -229,11 +231,10 @@ export interface DeployConfig<
> {
provider: T
provider_id: string
[key: string]: Z
[key: string]: Z
}
export interface DeployPanelConfig {
}
export interface DeployPanelConfig {}
// 部署节点配置ssh
export interface DeploySSHConfig {
@@ -265,21 +266,17 @@ export interface DeployStorageConfig {
bucket: string
}
// 部署节点配置
export type DeployNodeConfig = DeployConfig<
DeploySSHConfig | DeployBTPanelConfig | Deploy1PanelConfig | DeployCDNConfig | DeployStorageConfig
>
// 部署节点输入配置
export interface DeployNodeInputsConfig {
name: string
fromNodeId: string
}
// 定义通知节点配置类型
interface NotifyNodeConfig {
provider: string
@@ -288,10 +285,9 @@ interface NotifyNodeConfig {
body: string
}
// 定义上传节点配置类型
interface UploadNodeConfig {
cert_id: string
cert: string
key: string
}

View File

@@ -9,6 +9,8 @@ const types = {
tencentcloud: '腾讯云',
btpanel: '宝塔面板',
'1panel': '1Panel',
huaweicloud: '华为云',
cloudflare: 'Cloudflare',
mail: '邮件',
dingtalk: '钉钉',
wecom: '企业微信',
@@ -59,6 +61,8 @@ export const AuthApiTypeIcon = defineComponent({
tencentcloud: 'tencentcloud',
btpanel: 'btpanel',
'1panel': '1panel',
huaweicloud: 'huaweicloud',
cloudflare: 'cloudflare',
mail: 'mail',
dingtalk: 'dingtalk',
wecom: 'wecom',
@@ -92,15 +96,9 @@ export const AuthApiTypeIcon = defineComponent({
)
return () => (
<NTag
bordered={false}
class="cursor-pointer"
type={props.type}
v-slots={{
avatar: () => <SvgIcon icon={iconPath.value} size="1.4rem" />,
}}
>
<NText class="text-[12px]">{props.text && <span>{typeName.value}</span>}</NText>
<NTag type={props.type} size="small">
<SvgIcon icon={iconPath.value} size="1.2rem" class="mr-[0.4rem]" />
<span class="text-[12px]">{props.text && <span>{typeName.value}</span>}</span>
</NTag>
)
},

View File

@@ -0,0 +1,33 @@
import { App, Directive, DirectiveBinding } from 'vue'
/**
* 移除输入框中的空格
* 用法v-nospace
*/
export const vNospace: Directive = {
mounted(el: HTMLElement, binding: DirectiveBinding) {
el.addEventListener('input', (event: Event) => {
const inputElement = event.target as HTMLInputElement
const newValue = inputElement.value.replace(/\s+/g, '')
// 直接设置输入元素的值
if (inputElement.value !== newValue) {
inputElement.value = newValue
// 触发自定义事件,通知父组件值已更改
el.dispatchEvent(new Event('input', { bubbles: true }))
}
})
},
}
// 导出所有指令的集合,方便批量注册
export const directives = {
nospace: vNospace,
}
// 注册所有指令
export const useDirectives = (app: App, directives: Record<string, Directive>) => {
Object.entries(directives).forEach(([key, value]) => {
app.directive(key, value)
})
}

View File

@@ -1,11 +1,9 @@
{
"t_0_1746782379424": "المهام الآلية",
"t_0_1744098811152": "تحذير: لقد دخلتم منطقة غير معروفة، الصفحة التي تحاول زيارتها غير موجودة، يرجى الضغط على الزر للعودة إلى الصفحة الرئيسية.",
"t_1_1744098801860": "رجوع إلى الصفحة الرئيسية",
"t_2_1744098804908": "نصيحة أمنية: إذا كنت تعتقد أن هذا خطأ، يرجى الاتصال بالمدير على الفور",
"t_3_1744098802647": "افتح القائمة الرئيسية",
"t_4_1744098802046": "القائمة الرئيسية القابلة للطي",
"t_0_1744164843238": "مرحبًا بكم في AllinSSL، إدارة فعالة لشهادات SSL",
"t_1_1744164835667": "AllinSSL",
"t_2_1744164839713": "دخول الحساب",
"t_3_1744164839524": "من فضلك أدخل اسم المستخدم",
@@ -14,7 +12,6 @@
"t_6_1744164838900": "هل نسيت كلمة المرور؟",
"t_7_1744164838625": "في إجراء الدخول",
"t_8_1744164839833": "تسجيل الدخول",
"t_0_1744168657526": "تسجيل الخروج",
"t_0_1744258111441": "الصفحة الرئيسية",
"t_1_1744258113857": "توزيع آلي",
"t_2_1744258111238": "إدارة الشهادات",
@@ -85,11 +82,6 @@
"t_21_1744958839305": "خادم 1",
"t_22_1744958841926": "خادم 2",
"t_23_1744958838717": "اللوحة 1",
"t_24_1744958845324": "لوحة 2",
"t_25_1744958839236": "الموقع 1",
"t_26_1744958839682": "الموقع 2",
"t_27_1744958840234": "تencent Cloud 1",
"t_28_1744958839760": "ألييوان 1",
"t_29_1744958838904": "يوم",
"t_30_1744958843864": "تنسيق الشهادة غير صحيح، يرجى التحقق مما إذا كان يحتوي على العناصر التوضيحية للعناوين والرؤوس الكاملة",
"t_31_1744958844490": "شكل المفتاح الخاص غير صحيح، يرجى التحقق من أن يحتوي على معرف الرأس والساقطة الكاملة للمفتاح الخاص",
@@ -111,7 +103,6 @@
"t_16_1745215915209": "حذف مسار العمل",
"t_17_1745215915985": "نجاح عملية حذف العملية",
"t_18_1745215915630": "فشل حذف مسار العمل",
"t_0_1745227838699": "تثبيت آلي جديد",
"t_1_1745227838776": "الرجاء إدخال اسم الت automatization",
"t_2_1745227839794": "هل أنت متأكد من أنك تريد تنفيذ عملية {name}؟",
"t_3_1745227841567": "هل تؤكد على حذف {name} مسار العمل؟ هذه العملية لا يمكن إلغاؤها.",
@@ -278,7 +269,6 @@
"t_6_1745490738548": "الرجاء إدخال البريد الإلكتروني، لا يمكن أن يكون البريد الإلكتروني فارغًا",
"t_7_1745490739917": "الرجاء اختيار موفر DNS، لا يمكن أن يكون موفر DNS فارغًا",
"t_8_1745490739319": "الرجاء إدخال فترة التجديد، فترة التجديد لا يمكن أن تكون فارغة",
"t_0_1745553910661": "خطأ في تنسيق النطاق، يُرجى إدخال النطاق الصحيح",
"t_1_1745553909483": "تنسيق البريد الإلكتروني غير صحيح، يرجى إدخال بريد صحيح",
"t_2_1745553907423": "لا يمكن أن يكون فاصل التجديد فارغًا",
"t_0_1745735774005": "الرجاء إدخال اسم نطاق الشهادة، أسماء نطاقات متعددة مفصولة بفواصل",
@@ -453,7 +443,6 @@
"t_12_1746773355641": "انقر لإنشاء سير عمل آلي لتحسين الكفاءة",
"t_13_1746773349526": "التقدم بطلب للحصول على شهادة",
"t_14_1746773355081": "انقر للتقدم بطلب وإدارة شهادات SSL لضمان الأمان",
"t_15_1746773358151": "انقر لإعداد مراقبة الموقع وتتبع حالة التشغيل في الوقت الفعلي",
"t_16_1746773356568": "يمكن تكوين قناة إشعار واحدة فقط عبر البريد الإلكتروني كحد أقصى",
"t_17_1746773351220": "تأكيد قناة الإشعارات {0}",
"t_18_1746773355467": "ستبدأ قنوات الإشعار {0} في إرسال تنبيهات.",
@@ -490,5 +479,34 @@
"t_0_1746776194126": "تفاصيل السجل",
"t_1_1746776198156": "فشل تحميل السجل:",
"t_2_1746776194263": "تنزيل السجل",
"t_3_1746776195004": "لا توجد معلومات السجل"
"t_3_1746776195004": "لا توجد معلومات السجل",
"t_0_1746782379424": "المهام الآلية",
"t_0_1746858920894": "يرجى اختيار موفر الاستضافة",
"t_1_1746858922914": "قائمة موفري DNS فارغة، يرجى الإضافة",
"t_2_1746858923964": "قائمة مزودي الاستضافة فارغة، يرجى الإضافة",
"t_3_1746858920060": "إضافة مزود استضافة",
"t_4_1746858917773": "محدد",
"t_0_1747019621052": "الرجاء اختيار مزود استضافة{0}",
"t_1_1747019624067": "انقر لضبط مراقبة الموقع وفهم الحالة في الوقت الحقيقي",
"t_2_1747019616224": "علي بابا كلاود",
"t_3_1747019616129": "تينسنت كلاود",
"t_0_1747040228657": "للمجالات المتعددة، يرجى استخدام فواصل إنجليزية لفصلها، على سبيل المثال: test.com,test.cn",
"t_1_1747040226143": "للمجالات العامة، استخدم علامة النجمة *، على سبيل المثال: *.test.com",
"t_0_1747042966820": "الرجاء إدخال مفتاح Cloudflare API الصحيح",
"t_1_1747042969705": "يرجى إدخال مفتاح API الصحيح لـ BT-Panel",
"t_2_1747042967277": "الرجاء إدخال SecretKey الصحيح لـ Tencent Cloud",
"t_3_1747042967608": "الرجاء إدخال Huawei Cloud SecretKey الصحيح",
"t_4_1747042966254": "الرجاء إدخال مفتاح الوصول Huawei Cloud",
"t_5_1747042965911": "الرجاء إدخال حساب البريد الإلكتروني الصحيح",
"t_0_1747047213730": "إضافة النشر الآلي",
"t_1_1747047213009": "إضافة شهادة",
"t_2_1747047214975": "منصة إدارة شهادات SSL",
"t_3_1747047218669": "خطأ في تنسيق النطاق، يرجى التحقق من تنسيق النطاق",
"t_0_1747106957037": "خادم DNS العودي (اختياري)",
"t_1_1747106961747": "أدخل خوادم DNS العودية (استخدم الفواصل لفصل القيم المتعددة)",
"t_2_1747106957037": "تخطي الفحص المسبق المحلي",
"t_0_1747110184700": "اختيار الشهادة",
"t_1_1747110191587": "إذا كنت بحاجة إلى تعديل محتوى الشهادة والمفتاح، فاختر شهادة مخصصة",
"t_2_1747110193465": "عند اختيار شهادة غير مخصصة، لا يمكن تعديل محتوى الشهادة أو المفتاح",
"t_3_1747110185110": "تحميل وتقديم"
}

View File

@@ -1,11 +1,9 @@
{
"t_0_1746782379424": "Automated tasks",
"t_0_1744098811152": "Warning: You have entered an unknown area, the page you are visiting does not exist, please click the button to return to the homepage.",
"t_1_1744098801860": "Return Home",
"t_2_1744098804908": "Safety Tip: If you think this is an error, please contact the administrator immediately",
"t_3_1744098802647": "Expand Main Menu",
"t_4_1744098802046": "Foldout Main Menu",
"t_0_1744164843238": "Welcome to AllinSSL, Efficient SSL Certificate Management",
"t_1_1744164835667": "AllinSSL",
"t_2_1744164839713": "Account Login",
"t_3_1744164839524": "Please enter the username",
@@ -14,7 +12,6 @@
"t_6_1744164838900": "Forget password",
"t_7_1744164838625": "Logging in",
"t_8_1744164839833": "Login",
"t_0_1744168657526": "Log out",
"t_0_1744258111441": "Home",
"t_1_1744258113857": "Automation Deployment",
"t_2_1744258111238": "Certificate Management",
@@ -85,11 +82,6 @@
"t_21_1744958839305": "Server 1",
"t_22_1744958841926": "Server 2",
"t_23_1744958838717": "Panel 1",
"t_24_1744958845324": "Panel 2",
"t_25_1744958839236": "Website 1",
"t_26_1744958839682": "Website 2",
"t_27_1744958840234": "Tencent Cloud 1",
"t_28_1744958839760": "Aliyun 1",
"t_29_1744958838904": "Day",
"t_30_1744958843864": "Certificate format is incorrect, please check if it includes the complete certificate header and footer identifiers",
"t_31_1744958844490": "Private key format is incorrect, please check if it includes the complete private key header and footer identifier",
@@ -111,7 +103,6 @@
"t_16_1745215915209": "Delete Workflow",
"t_17_1745215915985": "Workflow deletion successful",
"t_18_1745215915630": "Workflow deletion failed",
"t_0_1745227838699": "New Automated Deployment",
"t_1_1745227838776": "Please enter the automation name",
"t_2_1745227839794": "Are you sure you want to execute the {name} workflow?",
"t_3_1745227841567": "Confirm deletion of {name} workflow? This action cannot be undone.",
@@ -278,7 +269,6 @@
"t_6_1745490738548": "Please enter your email, email cannot be empty",
"t_7_1745490739917": "Please select a DNS provider, the DNS provider cannot be empty",
"t_8_1745490739319": "Please enter the renewal interval, the renewal interval cannot be empty",
"t_0_1745553910661": "Domain format error, please enter the correct domain",
"t_1_1745553909483": "Invalid email format, please enter a correct email",
"t_2_1745553907423": "Renewal interval cannot be empty",
"t_0_1745735774005": "Please enter the certificate domain name, multiple domain names separated by commas",
@@ -453,7 +443,6 @@
"t_12_1746773355641": "Click to create an automated workflow to improve efficiency",
"t_13_1746773349526": "Apply for certificate",
"t_14_1746773355081": "Click to apply for and manage SSL certificates to ensure security",
"t_15_1746773358151": "Click to set up website monitoring and keep track of the runtime status in real time",
"t_16_1746773356568": "Only one email notification channel can be configured at most",
"t_17_1746773351220": "Confirm {0} notification channel",
"t_18_1746773355467": "{0} notification channels will start sending alert notifications.",
@@ -490,5 +479,34 @@
"t_0_1746776194126": "Log Details",
"t_1_1746776198156": "Failed to load log:",
"t_2_1746776194263": "Download log",
"t_3_1746776195004": "No log information"
"t_3_1746776195004": "No log information",
"t_0_1746782379424": "Automated tasks",
"t_0_1746858920894": "Please select a hosting provider",
"t_1_1746858922914": "The DNS provider list is empty, please add",
"t_2_1746858923964": "The list of hosting providers is empty, please add",
"t_3_1746858920060": "Add host provider",
"t_4_1746858917773": "Selected",
"t_0_1747019621052": "Please select a host provider{0}",
"t_1_1747019624067": "Click to set up website monitoring and grasp real-time status",
"t_2_1747019616224": "Alibaba Cloud",
"t_3_1747019616129": "Tencent Cloud",
"t_0_1747040228657": "For multiple domains, please use English commas to separate them, for example: test.com,test.cn",
"t_1_1747040226143": "For wildcard domains, use an asterisk *, for example: *.test.com",
"t_0_1747042966820": "Please enter the correct Cloudflare API key",
"t_1_1747042969705": "Please enter the correct BT-Panel API key",
"t_2_1747042967277": "Please enter the correct Tencent Cloud SecretKey",
"t_3_1747042967608": "Please enter the correct Huawei Cloud SecretKey",
"t_4_1747042966254": "Please enter Huawei Cloud AccessKey",
"t_5_1747042965911": "Please enter the correct email account",
"t_0_1747047213730": "Add automated deployment",
"t_1_1747047213009": "Add certificate",
"t_2_1747047214975": "SSL Certificate Management Platform",
"t_3_1747047218669": "Domain format error, please check the domain format",
"t_0_1747106957037": "DNS recursive server (optional)",
"t_1_1747106961747": "Please enter DNS recursive servers (use commas to separate multiple values)",
"t_2_1747106957037": "Skip local pre-check",
"t_0_1747110184700": "Select certificate",
"t_1_1747110191587": "If you need to modify the certificate content and key, please choose a custom certificate",
"t_2_1747110193465": "When a non-custom certificate is selected, neither the certificate content nor the key can be modified",
"t_3_1747110185110": "Upload and submit"
}

View File

@@ -1,11 +1,9 @@
{
"t_0_1746782379424": "Tareas automatizadas",
"t_0_1744098811152": "Advertencia: Ha ingresado a una zona desconocida, la página que intenta visitar no existe, por favor, haga clic en el botón para regresar a la página de inicio.",
"t_1_1744098801860": "Volver al inicio",
"t_2_1744098804908": "Consejo de seguridad: Si piensa que es un error, póngase en contacto con el administrador inmediatamente",
"t_3_1744098802647": "Expandir el menú principal",
"t_4_1744098802046": "Menú principal plegable",
"t_0_1744164843238": "Bienvenido a AllinSSL, gestión eficiente de certificados SSL",
"t_1_1744164835667": "AllinSSL",
"t_2_1744164839713": "Iniciar sesión en la cuenta",
"t_3_1744164839524": "Por favor, ingrese el nombre de usuario",
@@ -14,7 +12,6 @@
"t_6_1744164838900": "¿Olvidaste tu contraseña?",
"t_7_1744164838625": "Logueándose",
"t_8_1744164839833": "Iniciar sesión",
"t_0_1744168657526": "Salir",
"t_0_1744258111441": "Inicio",
"t_1_1744258113857": "Despliegue Automatizado",
"t_2_1744258111238": "Gestión de certificados",
@@ -85,11 +82,6 @@
"t_21_1744958839305": "Servidor 1",
"t_22_1744958841926": "Servidor 2",
"t_23_1744958838717": "Panel 1",
"t_24_1744958845324": "Panel 2",
"t_25_1744958839236": "Sitio 1",
"t_26_1744958839682": "Sitio 2",
"t_27_1744958840234": "Tencent Cloud 1",
"t_28_1744958839760": "Aliyun 1",
"t_29_1744958838904": "día",
"t_30_1744958843864": "El formato del certificado no es correcto, por favor revise si contiene las identificaciones de cabecera y pie completo",
"t_31_1744958844490": "El formato de la clave privada no es correcto, por favor verifique si contiene el identificador completo de la cabecera y el pie de página de la clave privada",
@@ -111,7 +103,6 @@
"t_16_1745215915209": "Eliminar flujo de trabajo",
"t_17_1745215915985": "Eliminación del flujo de trabajo exitosa",
"t_18_1745215915630": "Fallo al eliminar el flujo de trabajo",
"t_0_1745227838699": "Despliegue automatizado nuevo",
"t_1_1745227838776": "Por favor, ingrese el nombre de automatización",
"t_2_1745227839794": "¿Está seguro de que desea ejecutar el flujo de trabajo {name}?",
"t_3_1745227841567": "¿Confirma la eliminación del flujo de trabajo {name}? Esta acción no se puede deshacer.",
@@ -278,7 +269,6 @@
"t_6_1745490738548": "Por favor ingrese el correo electrónico, el correo electrónico no puede estar vacío",
"t_7_1745490739917": "Por favor, seleccione un proveedor DNS, el proveedor DNS no puede estar vacío",
"t_8_1745490739319": "Ingrese el intervalo de renovación, el intervalo de renovación no puede estar vacío",
"t_0_1745553910661": "Formato de dominio incorrecto, ingrese el dominio correcto",
"t_1_1745553909483": "Formato de correo electrónico incorrecto, ingrese un correo correcto",
"t_2_1745553907423": "El intervalo de renovación no puede estar vacío",
"t_0_1745735774005": "Ingrese el nombre de dominio del certificado, varios nombres de dominio separados por comas",
@@ -453,7 +443,6 @@
"t_12_1746773355641": "Haz clic para crear un flujo de trabajo automatizado y mejorar la eficiencia",
"t_13_1746773349526": "Solicitar certificado",
"t_14_1746773355081": "Haz clic para solicitar y administrar certificados SSL para garantizar la seguridad",
"t_15_1746773358151": "Haz clic para configurar el monitoreo del sitio web y realiza un seguimiento del estado de ejecución en tiempo real",
"t_16_1746773356568": "Solo se puede configurar un canal de notificación por correo electrónico como máximo",
"t_17_1746773351220": "Confirmar canal de notificación {0}",
"t_18_1746773355467": "Los canales de notificación {0} comenzarán a enviar alertas.",
@@ -490,5 +479,34 @@
"t_0_1746776194126": "Detalles del registro",
"t_1_1746776198156": "Error al cargar el registro:",
"t_2_1746776194263": "Descargar registro",
"t_3_1746776195004": "Sin información de registro"
"t_3_1746776195004": "Sin información de registro",
"t_0_1746782379424": "Tareas automatizadas",
"t_0_1746858920894": "Por favor, seleccione un proveedor de alojamiento",
"t_1_1746858922914": "La lista de proveedores DNS está vacía, por favor agregue",
"t_2_1746858923964": "La lista de proveedores de alojamiento está vacía, agregue",
"t_3_1746858920060": "Agregar proveedor de alojamiento",
"t_4_1746858917773": "Seleccionado",
"t_0_1747019621052": "Seleccione un proveedor de alojamiento{0}",
"t_1_1747019624067": "Haz clic para configurar el monitoreo del sitio web y conocer el estado en tiempo real",
"t_2_1747019616224": "Alibaba Cloud",
"t_3_1747019616129": "Tencent Cloud",
"t_0_1747040228657": "Para múltiples dominios, utilice comas en inglés para separarlos, por ejemplo: test.com,test.cn",
"t_1_1747040226143": "Para dominios comodín, use un asterisco *, por ejemplo: *.test.com",
"t_0_1747042966820": "Por favor, ingrese la clave API correcta de Cloudflare",
"t_1_1747042969705": "Por favor, ingrese la clave API correcta de BT-Panel",
"t_2_1747042967277": "Por favor, ingrese el SecretKey correcto de Tencent Cloud",
"t_3_1747042967608": "Por favor, ingrese el SecretKey correcto de Huawei Cloud",
"t_4_1747042966254": "Por favor ingrese el AccessKey de Huawei Cloud",
"t_5_1747042965911": "Por favor, ingrese la cuenta de correo electrónico correcta",
"t_0_1747047213730": "Agregar despliegue automatizado",
"t_1_1747047213009": "Agregar certificado",
"t_2_1747047214975": "Plataforma de Gestión de Certificados SSL",
"t_3_1747047218669": "Error de formato de dominio, verifique el formato del dominio",
"t_0_1747106957037": "Servidor DNS recursivo (opcional)",
"t_1_1747106961747": "Ingrese los servidores DNS recursivos (separe varios valores con comas)",
"t_2_1747106957037": "Omitir la comprobación previa local",
"t_0_1747110184700": "Seleccionar certificado",
"t_1_1747110191587": "Si necesita modificar el contenido del certificado y la clave, elija un certificado personalizado",
"t_2_1747110193465": "Cuando se selecciona un certificado no personalizado, ni el contenido del certificado ni la clave se pueden modificar",
"t_3_1747110185110": "Subir y enviar"
}

View File

@@ -1,11 +1,9 @@
{
"t_0_1746782379424": "Tâches automatisées",
"t_0_1744098811152": "Avertissement : Vous avez entré dans une zone inconnue, la page que vous visitez n'existe pas, veuillez cliquer sur le bouton pour revenir à la page d'accueil.",
"t_1_1744098801860": "Retour à l'accueil",
"t_2_1744098804908": "Avis de sécurité : Si vous pensez que c'est une erreur, veuillez contacter l'administrateur immédiatement",
"t_3_1744098802647": "Développer le menu principal",
"t_4_1744098802046": "Menu principal pliable",
"t_0_1744164843238": "Bienvenue dans AllinSSL, gestion efficace des certificats SSL",
"t_1_1744164835667": "AllinSSL",
"t_2_1744164839713": "Connexion du compte",
"t_3_1744164839524": "Veuillez saisir le nom d'utilisateur",
@@ -14,7 +12,6 @@
"t_6_1744164838900": "Oublié votre mot de passe?",
"t_7_1744164838625": "En cours de connexion",
"t_8_1744164839833": "Se connecter",
"t_0_1744168657526": "Déconnecter",
"t_0_1744258111441": "Accueil",
"t_1_1744258113857": "Déploiement Automatisé",
"t_2_1744258111238": "Gestion des certificats",
@@ -85,11 +82,6 @@
"t_21_1744958839305": "Serveur 1",
"t_22_1744958841926": "Serveur 2",
"t_23_1744958838717": "Panneau 1",
"t_24_1744958845324": "Panneau 2",
"t_25_1744958839236": "Site 1",
"t_26_1744958839682": "Site 2",
"t_27_1744958840234": "Tencent Cloud 1",
"t_28_1744958839760": "Aliyun 1",
"t_29_1744958838904": "jour",
"t_30_1744958843864": "Le format du certificat est incorrect, veuillez vérifier s'il contient les identifiants d'en-tête et de pied de page complets",
"t_31_1744958844490": "Le format de la clé privée est incorrect, veuillez vérifier si elle contient l'identifiant complet de l'en-tête et du pied de page de la clé privée",
@@ -111,7 +103,6 @@
"t_16_1745215915209": "Supprimer le flux de travail",
"t_17_1745215915985": "Suppression du flux de travail réussie",
"t_18_1745215915630": "Échec de la suppression du flux de travail",
"t_0_1745227838699": "Déploiement automatisé ajouté",
"t_1_1745227838776": "Veuillez saisir le nom de l'automatisation",
"t_2_1745227839794": "Êtes-vous sûr de vouloir exécuter le workflow {name}?",
"t_3_1745227841567": "Confirmez-vous la suppression du flux de travail {name} ? Cette action ne peut pas être annulée.",
@@ -278,7 +269,6 @@
"t_6_1745490738548": "Veuillez entrer votre email, l'email ne peut pas être vide",
"t_7_1745490739917": "Veuillez sélectionner un fournisseur DNS, le fournisseur DNS ne peut pas être vide",
"t_8_1745490739319": "Veuillez saisir l'intervalle de renouvellement, l'intervalle de renouvellement ne peut pas être vide",
"t_0_1745553910661": "Format de domaine incorrect, veuillez entrer le bon domaine",
"t_1_1745553909483": "Format d'email incorrect, veuillez saisir un email valide",
"t_2_1745553907423": "L'intervalle de renouvellement ne peut pas être vide",
"t_0_1745735774005": "Veuillez saisir le nom de domaine du certificat, plusieurs noms de domaine séparés par des virgules",
@@ -453,7 +443,6 @@
"t_12_1746773355641": "Cliquez pour créer un flux de travail automatisé afin d'améliorer l'efficacité",
"t_13_1746773349526": "Demander un certificat",
"t_14_1746773355081": "Cliquez pour demander et gérer les certificats SSL afin d'assurer la sécurité",
"t_15_1746773358151": "Cliquez pour configurer la surveillance du site et suivre l'état d'exécution en temps réel",
"t_16_1746773356568": "Un seul canal de notification par e-mail peut être configuré au maximum",
"t_17_1746773351220": "Confirmer le canal de notification {0}",
"t_18_1746773355467": "Les canaux de notification {0} commenceront à envoyer des alertes.",
@@ -490,5 +479,34 @@
"t_0_1746776194126": "Détails du journal",
"t_1_1746776198156": "Échec du chargement du journal :",
"t_2_1746776194263": "Télécharger le journal",
"t_3_1746776195004": "Aucune information de journal"
"t_3_1746776195004": "Aucune information de journal",
"t_0_1746782379424": "Tâches automatisées",
"t_0_1746858920894": "Veuillez sélectionner un hébergeur",
"t_1_1746858922914": "La liste des fournisseurs DNS est vide, veuillez ajouter",
"t_2_1746858923964": "La liste des fournisseurs d'hébergement est vide, veuillez ajouter",
"t_3_1746858920060": "Ajouter un fournisseur d'hébergement",
"t_4_1746858917773": "Sélectionné",
"t_0_1747019621052": "Veuillez choisir un fournisseur d'hébergement{0}",
"t_1_1747019624067": "Cliquez pour configurer la surveillance du site et suivre l'état en temps réel",
"t_2_1747019616224": "Alibaba Cloud",
"t_3_1747019616129": "Tencent Cloud",
"t_0_1747040228657": "Pour plusieurs domaines, veuillez utiliser des virgules anglaises pour les séparer, par exemple : test.com,test.cn",
"t_1_1747040226143": "Pour les domaines génériques, utilisez un astérisque *, par exemple : *.test.com",
"t_0_1747042966820": "Veuillez entrer la clé API Cloudflare correcte",
"t_1_1747042969705": "Veuillez entrer la clé API correcte de BT-Panel",
"t_2_1747042967277": "Veuillez entrer le bon SecretKey de Tencent Cloud",
"t_3_1747042967608": "Veuillez entrer la bonne clé secrète Huawei Cloud",
"t_4_1747042966254": "Veuillez saisir la clé d'accès Huawei Cloud",
"t_5_1747042965911": "Veuillez entrer le bon compte email",
"t_0_1747047213730": "Ajouter un déploiement automatisé",
"t_1_1747047213009": "Ajouter un certificat",
"t_2_1747047214975": "Plateforme de Gestion de Certificats SSL",
"t_3_1747047218669": "Erreur de format de domaine, vérifiez le format du domaine",
"t_0_1747106957037": "Serveur DNS récursif (facultatif)",
"t_1_1747106961747": "Saisissez les serveurs DNS récursifs (séparez plusieurs valeurs par des virgules)",
"t_2_1747106957037": "Ignorer la vérification préalable locale",
"t_0_1747110184700": "Sélectionner le certificat",
"t_1_1747110191587": "Si vous devez modifier le contenu du certificat et la clé, choisissez un certificat personnalisé",
"t_2_1747110193465": "Lorsqu'un certificat non personnalisé est sélectionné, ni le contenu du certificat ni la clé ne peuvent être modifiés",
"t_3_1747110185110": "Télécharger et soumettre"
}

View File

@@ -1,11 +1,9 @@
{
"t_0_1746782379424": "自動化タスク",
"t_0_1744098811152": "警告:未知のエリアに進入しました。アクセスしようとしたページは存在しません。ボタンをクリックしてホームページに戻ってください。",
"t_1_1744098801860": "ホームに戻る",
"t_2_1744098804908": "安全注意:これが誤りだと思われる場合は、すぐに管理者に連絡してください",
"t_3_1744098802647": "メインメニューを展開する",
"t_4_1744098802046": "折りたたみメインメニュー",
"t_0_1744164843238": "AllinSSLへようこそ、SSL証明書の効率的な管理",
"t_1_1744164835667": "AllinSSL",
"t_2_1744164839713": "アカウントログイン",
"t_3_1744164839524": "ユーザー名を入力してください",
@@ -14,7 +12,6 @@
"t_6_1744164838900": "パスワードを忘れたら",
"t_7_1744164838625": "ログイン中",
"t_8_1744164839833": "ログイン",
"t_0_1744168657526": "ログアウト",
"t_0_1744258111441": "ホーム",
"t_1_1744258113857": "自動デプロイメント",
"t_2_1744258111238": "証明書管理",
@@ -85,11 +82,6 @@
"t_21_1744958839305": "サーバー1",
"t_22_1744958841926": "サーバー2",
"t_23_1744958838717": "パネル1",
"t_24_1744958845324": "パネル2",
"t_25_1744958839236": "ウェブサイト1",
"t_26_1744958839682": "ウェブサイト2",
"t_27_1744958840234": "テンセントクラウド1",
"t_28_1744958839760": "アリyun 1",
"t_29_1744958838904": "日",
"t_30_1744958843864": "証明書のフォーマットが不正です。完全な証明書のヘッダおよびフッタ識別子が含まれているか確認してください。",
"t_31_1744958844490": "プライベートキーフォーマットが不正です。完全なプライベートキーヘッダおよびフッタ識別子が含まれているか確認してください。",
@@ -111,7 +103,6 @@
"t_16_1745215915209": "ワークフローを削除する",
"t_17_1745215915985": "ワークフローの削除が成功しました",
"t_18_1745215915630": "ワークフローの削除に失敗しました",
"t_0_1745227838699": "新しい自動デプロイメント",
"t_1_1745227838776": "自動化名前を入力してください",
"t_2_1745227839794": "{name}ワークフローの実行を確認しますか?",
"t_3_1745227841567": "{name}のワークフローの削除を確認しますか?この操作は元に戻せません。",
@@ -278,7 +269,6 @@
"t_6_1745490738548": "メールアドレスを入力してください、メールアドレスは空にできません",
"t_7_1745490739917": "DNSプロバイダーを選択してください。DNSプロバイダーは空にできません",
"t_8_1745490739319": "更新間隔を入力してください。更新間隔は空にできません",
"t_0_1745553910661": "ドメイン形式が間違っています。正しいドメインを入力してください",
"t_1_1745553909483": "メールの形式が正しくありません。正しいメールアドレスを入力してください",
"t_2_1745553907423": "更新間隔は空にできません",
"t_0_1745735774005": "証明書のドメイン名を入力してください。複数のドメイン名はカンマで区切ります",
@@ -453,7 +443,6 @@
"t_12_1746773355641": "効率を向上させるために自動化されたワークフローを作成するにはクリックしてください",
"t_13_1746773349526": "証明書を申請する",
"t_14_1746773355081": "SSL証明書の申請と管理をクリックして、セキュリティを確保します",
"t_15_1746773358151": "クリックしてウェブサイトの監視を設定し、実行状態をリアルタイムで把握します",
"t_16_1746773356568": "最大で1つのメール通知チャネルしか設定できません",
"t_17_1746773351220": "{0}通知チャネルの確認",
"t_18_1746773355467": "{0}通知チャネルは、アラート通知の送信を開始します。",
@@ -490,5 +479,34 @@
"t_0_1746776194126": "ログの詳細",
"t_1_1746776198156": "ロードログ失敗:",
"t_2_1746776194263": "ログをダウンロード",
"t_3_1746776195004": "ログ情報がありません"
"t_3_1746776195004": "ログ情報がありません",
"t_0_1746782379424": "自動化タスク",
"t_0_1746858920894": "ホスティングプロバイダーを選択してください",
"t_1_1746858922914": "DNSプロバイダーリストが空です、追加してください",
"t_2_1746858923964": "ホスティングプロバイダーのリストが空です、追加してください",
"t_3_1746858920060": "ホストプロバイダーを追加",
"t_4_1746858917773": "選択済み",
"t_0_1747019621052": "ホストプロバイダーを選択してください{0}",
"t_1_1747019624067": "クリックしてウェブサイト監視を設定し、リアルタイム状態を把握する",
"t_2_1747019616224": "アリババクラウド",
"t_3_1747019616129": "テンセントクラウド",
"t_0_1747040228657": "複数のドメインは英語のカンマで区切ってください。例test.com,test.cn",
"t_1_1747040226143": "ワイルドカードドメインにはアスタリスク*を使用してください。例:*.test.com",
"t_0_1747042966820": "正しいCloudflare APIキーを入力してください",
"t_1_1747042969705": "正しい宝塔APIキーを入力してください",
"t_2_1747042967277": "正しいTencent Cloud SecretKeyを入力してください",
"t_3_1747042967608": "正しいHuawei Cloud SecretKeyを入力してください",
"t_4_1747042966254": "Huawei Cloud AccessKeyを入力してください",
"t_5_1747042965911": "正しいメールアカウントを入力してください",
"t_0_1747047213730": "自動デプロイの追加",
"t_1_1747047213009": "証明書を追加",
"t_2_1747047214975": "SSL証明書管理プラットフォーム",
"t_3_1747047218669": "ドメイン形式が間違っています、ドメイン形式を確認してください",
"t_0_1747106957037": "DNS再帰サーバーオプション",
"t_1_1747106961747": "DNS 再帰サーバーを入力してください(複数の値は,で区切ってください)",
"t_2_1747106957037": "ローカル事前チェックをスキップ",
"t_0_1747110184700": "証明書を選択",
"t_1_1747110191587": "証明書の内容とキーを変更する必要がある場合は、カスタム証明書を選択してください",
"t_2_1747110193465": "非カスタム証明書を選択した場合、証明書の内容とキーはどちらも変更できません",
"t_3_1747110185110": "アップロードして提出"
}

View File

@@ -1,11 +1,9 @@
{
"t_0_1746782379424": "자동화 작업",
"t_0_1744098811152": "경고: 알 수 없는 영역에 진입했습니다. 방문하려는 페이지가 존재하지 않습니다. 버튼을 클릭하여 홈페이지로 돌아가세요。",
"t_1_1744098801860": "홈으로 돌아가기",
"t_2_1744098804908": "안전 유의사항: 이가 오류라면 즉시 관리자에게 연락하십시오",
"t_3_1744098802647": "메인 메뉴 펼치기",
"t_4_1744098802046": "접기 메인 메뉴",
"t_0_1744164843238": "AllinSSL을 환영합니다, SSL 셀프리피켓 효율적 관리",
"t_1_1744164835667": "AllinSSL",
"t_2_1744164839713": "계정 로그인",
"t_3_1744164839524": "사용자 이름을 입력하세요",
@@ -14,7 +12,6 @@
"t_6_1744164838900": "비밀번호를 잊었나요?",
"t_7_1744164838625": "로그인 중",
"t_8_1744164839833": "로그인",
"t_0_1744168657526": "로그아웃",
"t_0_1744258111441": "홈",
"t_1_1744258113857": "자동 배포",
"t_2_1744258111238": "서비스 관리",
@@ -85,11 +82,6 @@
"t_21_1744958839305": "서버1",
"t_22_1744958841926": "서버2",
"t_23_1744958838717": "판널 1",
"t_24_1744958845324": "판널 2",
"t_25_1744958839236": "웹사이트 1",
"t_26_1744958839682": "웹사이트 2",
"t_27_1744958840234": "테encent 클라우드 1",
"t_28_1744958839760": "阿里yun 1",
"t_29_1744958838904": "일",
"t_30_1744958843864": "서류 형식이 잘못되었습니다. 전체 서류 헤더 및 푸터 식별자가 포함되어 있는지 확인해 주세요.",
"t_31_1744958844490": "비밀키 형식이 잘못되었습니다. 완전한 비밀키 헤더 및 푸터 식별자가 포함되어 있는지 확인해 주세요.",
@@ -111,7 +103,6 @@
"t_16_1745215915209": "워크플로우 제거",
"t_17_1745215915985": "워크플로우가 성공적으로 삭제되었습니다",
"t_18_1745215915630": "워크플로우 삭제 실패",
"t_0_1745227838699": "신규 자동 배포",
"t_1_1745227838776": "자동화 이름을 입력하세요",
"t_2_1745227839794": "{name} 작업 흐름을 실행하시겠습니까?",
"t_3_1745227841567": "{name} 작업流程을 정말로 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
@@ -278,7 +269,6 @@
"t_6_1745490738548": "이메일을 입력하세요, 이메일은 비워둘 수 없습니다",
"t_7_1745490739917": "DNS 공급자를 선택하십시오. DNS 공급자는 비워 둘 수 없습니다",
"t_8_1745490739319": "갱신 간격을 입력하세요. 갱신 간격은 비워둘 수 없습니다",
"t_0_1745553910661": "도메인 형식이 잘못되었습니다. 올바른 도메인을 입력하세요",
"t_1_1745553909483": "이메일 형식이 잘못되었습니다. 올바른 이메일을 입력하세요",
"t_2_1745553907423": "갱신 간격은 비워둘 수 없습니다",
"t_0_1745735774005": "인증서 도메인 이름을 입력하세요. 여러 도메인 이름은 쉼표로 구분합니다",
@@ -453,7 +443,6 @@
"t_12_1746773355641": "효율성을 높이기 위해 자동화된 워크플로우를 생성하려면 클릭하세요",
"t_13_1746773349526": "증명서 신청",
"t_14_1746773355081": "SSL 인증서를 신청하고 관리하여 보안을 보장합니다",
"t_15_1746773358151": "웹사이트 모니터링을 설정하려면 클릭하세요. 실시간으로 실행 상태를 확인할 수 있습니다",
"t_16_1746773356568": "최대 하나의 이메일 알림 채널만 구성할 수 있습니다",
"t_17_1746773351220": "{0} 알림 채널 확인",
"t_18_1746773355467": "{0} 알림 채널에서 경고 알림을 보내기 시작할 예정입니다.",
@@ -490,5 +479,34 @@
"t_0_1746776194126": "로그 상세",
"t_1_1746776198156": "로그 로드 실패:",
"t_2_1746776194263": "로그 다운로드",
"t_3_1746776195004": "로그 정보 없음"
"t_3_1746776195004": "로그 정보 없음",
"t_0_1746782379424": "자동화 작업",
"t_0_1746858920894": "호스팅 제공자를 선택하십시오",
"t_1_1746858922914": "DNS 공급자 목록이 비어 있습니다. 추가해 주세요",
"t_2_1746858923964": "호스팅 제공자 목록이 비어 있습니다. 추가해 주세요",
"t_3_1746858920060": "호스트 공급자 추가",
"t_4_1746858917773": "선택됨",
"t_0_1747019621052": "호스트 공급자를 선택하세요{0}",
"t_1_1747019624067": "클릭하여 웹사이트 모니터링을 설정하고 실시간 상태를 파악하세요",
"t_2_1747019616224": "알리바바 클라우드",
"t_3_1747019616129": "텐센트 클라우드",
"t_0_1747040228657": "여러 도메인은 영어 쉼표로 구분하십시오. 예: test.com,test.cn",
"t_1_1747040226143": "와일드카드 도메인에는 별표 *를 사용하세요. 예: *.test.com",
"t_0_1747042966820": "올바른 Cloudflare API 키를 입력하세요",
"t_1_1747042969705": "올바른 보타(BT) API 키를 입력하세요",
"t_2_1747042967277": "올바른 Tencent Cloud SecretKey를 입력하세요",
"t_3_1747042967608": "정확한 Huawei Cloud SecretKey를 입력하세요",
"t_4_1747042966254": "Huawei Cloud AccessKey를 입력하십시오",
"t_5_1747042965911": "올바른 이메일 계정을 입력하세요",
"t_0_1747047213730": "자동 배포 추가",
"t_1_1747047213009": "인증서 추가",
"t_2_1747047214975": "SSL 인증서 관리 플랫폼",
"t_3_1747047218669": "도메인 형식 오류, 도메인 형식을 확인하세요",
"t_0_1747106957037": "DNS 재귀 서버 (선택 사항)",
"t_1_1747106961747": "DNS 재귀 서버를 입력하십시오 (여러 값은 쉼표로 구분하십시오)",
"t_2_1747106957037": "로컬 사전 확인 건너뛰기",
"t_0_1747110184700": "인증서 선택",
"t_1_1747110191587": "인증서 내용과 키를 수정해야 하는 경우 사용자 정의 인증서를 선택하십시오",
"t_2_1747110193465": "사용자 정의 인증서가 아닌 것을 선택하면 인증서 내용과 키 모두 수정할 수 없습니다",
"t_3_1747110185110": "업로드 및 제출"
}

View File

@@ -1,11 +1,9 @@
{
"t_0_1746782379424": "Tarefas automatizadas",
"t_0_1744098811152": "Aviso: Você entrou em uma área desconhecida, a página que você está visitando não existe, por favor, clique no botão para voltar para a página inicial.",
"t_1_1744098801860": "Voltar para a homepage",
"t_2_1744098804908": "Dica de Segurança: Se você acha que isso é um erro, entre em contato com o administrador imediatamente",
"t_3_1744098802647": "Expandir o menu principal",
"t_4_1744098802046": "Menu principal dobrável",
"t_0_1744164843238": "Bem-vindo ao AllinSSL, gerenciamento eficiente de certificados SSL",
"t_1_1744164835667": "AllinSSL",
"t_2_1744164839713": "Login de Conta",
"t_3_1744164839524": "Por favor, insira o nome de usuário",
@@ -14,7 +12,6 @@
"t_6_1744164838900": "Esqueceu sua senha?",
"t_7_1744164838625": "Entrando",
"t_8_1744164839833": "Entrar",
"t_0_1744168657526": "Sair",
"t_0_1744258111441": "Início",
"t_1_1744258113857": "Implantação Automatizada",
"t_2_1744258111238": "Gestão de Certificados",
@@ -85,11 +82,6 @@
"t_21_1744958839305": "Servidor 1",
"t_22_1744958841926": "Servidor 2",
"t_23_1744958838717": "Painel 1",
"t_24_1744958845324": "Painel 2",
"t_25_1744958839236": "Site 1",
"t_26_1744958839682": "Site 2",
"t_27_1744958840234": "Tencent Cloud 1",
"t_28_1744958839760": "Aliyun 1",
"t_29_1744958838904": "dia",
"t_30_1744958843864": "O formato do certificado está incorreto, por favor verifique se ele contém os identificadores de cabeçalho e rodapé completos",
"t_31_1744958844490": "O formato da chave privada está incorreto, por favor, verifique se ele contém o identificador completo do cabeçalho e pé de página da chave privada",
@@ -111,7 +103,6 @@
"t_16_1745215915209": "Excluir workflow",
"t_17_1745215915985": "Deleção do fluxo de trabalho bem-sucedida",
"t_18_1745215915630": "Falha ao excluir fluxo de trabalho",
"t_0_1745227838699": "Novo deployment automatizado",
"t_1_1745227838776": "Por favor, insira o nome da automação",
"t_2_1745227839794": "Tem certeza de que deseja executar o workflow {name}?",
"t_3_1745227841567": "Confirma a exclusão do fluxo de trabalho {name}? Esta ação não pode ser revertida.",
@@ -278,7 +269,6 @@
"t_6_1745490738548": "Por favor, insira o e-mail, o e-mail não pode estar vazio",
"t_7_1745490739917": "Por favor, selecione um provedor DNS, o provedor DNS não pode estar vazio",
"t_8_1745490739319": "Insira o intervalo de renovação, o intervalo de renovação não pode estar vazio",
"t_0_1745553910661": "Formato de domínio incorreto, insira o domínio correto",
"t_1_1745553909483": "Formato de e-mail inválido, por favor insira um e-mail correto",
"t_2_1745553907423": "O intervalo de renovação não pode estar vazio",
"t_0_1745735774005": "Digite o nome de domínio do certificado, vários nomes de domínio separados por vírgulas",
@@ -453,7 +443,6 @@
"t_12_1746773355641": "Clique para criar um fluxo de trabalho automatizado para melhorar a eficiência",
"t_13_1746773349526": "Solicitar certificado",
"t_14_1746773355081": "Clique para solicitar e gerenciar certificados SSL para garantir segurança",
"t_15_1746773358151": "Clique para configurar o monitoramento do site e acompanhar o status de execução em tempo real",
"t_16_1746773356568": "No máximo, apenas um canal de notificação por e-mail pode ser configurado",
"t_17_1746773351220": "Confirmar canal de notificação {0}",
"t_18_1746773355467": "Os canais de notificação {0} começarão a enviar alertas.",
@@ -490,5 +479,34 @@
"t_0_1746776194126": "Detalhes do Log",
"t_1_1746776198156": "Falha ao carregar o log:",
"t_2_1746776194263": "Baixar registro",
"t_3_1746776195004": "Sem informações de log"
"t_3_1746776195004": "Sem informações de log",
"t_0_1746782379424": "Tarefas automatizadas",
"t_0_1746858920894": "Por favor, selecione um provedor de hospedagem",
"t_1_1746858922914": "A lista de provedores DNS está vazia, por favor adicione",
"t_2_1746858923964": "A lista de provedores de hospedagem está vazia, adicione",
"t_3_1746858920060": "Adicionar provedor de hospedagem",
"t_4_1746858917773": "Selecionado",
"t_0_1747019621052": "Selecione um provedor de hospedagem{0}",
"t_1_1747019624067": "Clique para configurar o monitoramento do site e acompanhar o status em tempo real",
"t_2_1747019616224": "Alibaba Cloud",
"t_3_1747019616129": "Tencent Cloud",
"t_0_1747040228657": "Para vários domínios, use vírgulas em inglês para separá-los, por exemplo: test.com,test.cn",
"t_1_1747040226143": "Para domínios curinga, use um asterisco *, por exemplo: *.test.com",
"t_0_1747042966820": "Por favor, insira a chave de API correta do Cloudflare",
"t_1_1747042969705": "Por favor, insira a chave de API correta do BT-Panel",
"t_2_1747042967277": "Por favor, insira o SecretKey correto do Tencent Cloud",
"t_3_1747042967608": "Por favor, insira o SecretKey correto da Huawei Cloud",
"t_4_1747042966254": "Por favor, insira o AccessKey da Huawei Cloud",
"t_5_1747042965911": "Por favor, insira a conta de email correta",
"t_0_1747047213730": "Adicionar implantação automatizada",
"t_1_1747047213009": "Adicionar certificado",
"t_2_1747047214975": "Plataforma de Gerenciamento de Certificados SSL",
"t_3_1747047218669": "Erro de formato de domínio, verifique o formato do domínio",
"t_0_1747106957037": "Servidor recursivo DNS (opcional)",
"t_1_1747106961747": "Digite os servidores DNS recursivos (use vírgulas para separar vários valores)",
"t_2_1747106957037": "Ignorar verificação prévia local",
"t_0_1747110184700": "Selecionar certificado",
"t_1_1747110191587": "Se precisar modificar o conteúdo do certificado e a chave, escolha um certificado personalizado",
"t_2_1747110193465": "Quando um certificado não personalizado é selecionado, nem o conteúdo do certificado nem a chave podem ser modificados",
"t_3_1747110185110": "Enviar e submeter"
}

View File

@@ -1,11 +1,9 @@
{
"t_0_1746782379424": "Автоматизированные задачи",
"t_0_1744098811152": "Предупреждение: Вы вошли в неизвестную зону, посещаемая страница не существует, пожалуйста, нажмите кнопку, чтобы вернуться на главную страницу.",
"t_1_1744098801860": "Вернуться на главную",
"t_2_1744098804908": "Совет по безопасности: Если вы считаете, что это ошибка, немедленно свяжитесь с администратором",
"t_3_1744098802647": "Развернуть главное меню",
"t_4_1744098802046": "Сворачиваемое главное меню",
"t_0_1744164843238": "Добро пожаловать в AllinSSL, эффективное управление SSL-сертификатами",
"t_1_1744164835667": "AllinSSL",
"t_2_1744164839713": "Вход в аккаунт",
"t_3_1744164839524": "Введите имя пользователя",
@@ -14,7 +12,6 @@
"t_6_1744164838900": "Забыли пароль?",
"t_7_1744164838625": "Вход в систему",
"t_8_1744164839833": "Вход",
"t_0_1744168657526": "Выйти из системы",
"t_0_1744258111441": "Главная",
"t_1_1744258113857": "Автоматическая部署",
"t_2_1744258111238": "Управление сертификатами",
@@ -85,11 +82,6 @@
"t_21_1744958839305": "Сервер 1",
"t_22_1744958841926": "Сервер 2",
"t_23_1744958838717": "Панель 1",
"t_24_1744958845324": "PANEL 2",
"t_25_1744958839236": "Сайт 1",
"t_26_1744958839682": "Сайт 2",
"t_27_1744958840234": "Тencent Cloud 1",
"t_28_1744958839760": "Алиyun 1",
"t_29_1744958838904": "день",
"t_30_1744958843864": "Формат сертификата не правильный, пожалуйста, проверьте, содержит ли он полную информацию о заголовке и подзаголовке сертификата",
"t_31_1744958844490": "Формат私ного ключа incorrect, пожалуйста, проверьте, содержит ли он полный идентификатор заголовка и нижнего колонтитула частного ключа",
@@ -111,7 +103,6 @@
"t_16_1745215915209": "Удалить workflow",
"t_17_1745215915985": "Удаление рабочей схемы успешено",
"t_18_1745215915630": "Не удалось удалить рабочий процесс",
"t_0_1745227838699": "Новый автоматический部署",
"t_1_1745227838776": "Введите имя автоматизации",
"t_2_1745227839794": "Уверены, что хотите выполнить workflow {name}?",
"t_3_1745227841567": "Подтвердите удаление {name} потока работы? Это действие нельзя отменить.",
@@ -278,7 +269,6 @@
"t_6_1745490738548": "Пожалуйста, введите адрес электронной почты, поле не может быть пустым",
"t_7_1745490739917": "Пожалуйста, выберите DNS-провайдера, DNS-провайдер не может быть пустым",
"t_8_1745490739319": "Введите интервал продления, интервал продления не может быть пустым",
"t_0_1745553910661": "Ошибка формата домена, введите правильный домен",
"t_1_1745553909483": "Неверный формат электронной почты, введите правильный адрес",
"t_2_1745553907423": "Интервал продления не может быть пустым",
"t_0_1745735774005": "Введите доменное имя сертификата, несколько доменных имен разделяются запятыми",
@@ -453,7 +443,6 @@
"t_12_1746773355641": "Нажмите, чтобы создать автоматизированный рабочий процесс для повышения эффективности",
"t_13_1746773349526": "Подать заявку на сертификат",
"t_14_1746773355081": "Нажмите, чтобы подать заявку на SSL-сертификаты и управлять ими для обеспечения безопасности",
"t_15_1746773358151": "Нажмите, чтобы настроить мониторинг веб-сайта и отслеживать состояние работы в режиме реального времени",
"t_16_1746773356568": "Можно настроить только один канал уведомлений по электронной почте",
"t_17_1746773351220": "Подтвердить канал уведомлений {0}",
"t_18_1746773355467": "{0} каналы уведомлений начнут отправлять оповещения.",
@@ -490,5 +479,34 @@
"t_0_1746776194126": "Детали журнала",
"t_1_1746776198156": "Не удалось загрузить журнал:",
"t_2_1746776194263": "Скачать журнал",
"t_3_1746776195004": "Нет информации в журнале"
"t_3_1746776195004": "Нет информации в журнале",
"t_0_1746782379424": "Автоматизированные задачи",
"t_0_1746858920894": "Пожалуйста, выберите хостинг-провайдера",
"t_1_1746858922914": "Список DNS-провайдеров пуст, пожалуйста, добавьте",
"t_2_1746858923964": "Список хостинг-провайдеров пуст, добавьте",
"t_3_1746858920060": "Добавить поставщика хоста",
"t_4_1746858917773": "Выбрано",
"t_0_1747019621052": "Выберите поставщика хоста{0}",
"t_1_1747019624067": "Нажмите, чтобы настроить мониторинг веб-сайта и следить за состоянием в реальном времени",
"t_2_1747019616224": "Alibaba Cloud",
"t_3_1747019616129": "Tencent Cloud",
"t_0_1747040228657": "Для нескольких доменов используйте английские запятые для разделения, например: test.com,test.cn",
"t_1_1747040226143": "Для подстановочных доменов используйте звездочку *, например: *.test.com",
"t_0_1747042966820": "Пожалуйста, введите правильный API-ключ Cloudflare",
"t_1_1747042969705": "Пожалуйста, введите правильный API-ключ BT-Panel",
"t_2_1747042967277": "Пожалуйста, введите правильный SecretKey от Tencent Cloud",
"t_3_1747042967608": "Пожалуйста, введите правильный Huawei Cloud SecretKey",
"t_4_1747042966254": "Пожалуйста, введите Huawei Cloud AccessKey",
"t_5_1747042965911": "Пожалуйста, введите правильный адрес электронной почты",
"t_0_1747047213730": "Добавить автоматическое развертывание",
"t_1_1747047213009": "Добавить сертификат",
"t_2_1747047214975": "Платформа управления SSL-сертификатами",
"t_3_1747047218669": "Ошибка формата домена, проверьте формат домена",
"t_0_1747106957037": "Рекурсивный DNS-сервер (опционально)",
"t_1_1747106961747": "Введите рекурсивные DNS-серверы (разделяйте несколько значений запятыми)",
"t_2_1747106957037": "Пропустить локальную предварительную проверку",
"t_0_1747110184700": "Выбор сертификата",
"t_1_1747110191587": "Если вам нужно изменить содержимое сертификата и ключ, выберите пользовательский сертификат",
"t_2_1747110193465": "При выборе нестандартного сертификата ни содержание сертификата, ни ключ нельзя изменить",
"t_3_1747110185110": "Загрузить и отправить"
}

View File

@@ -1,11 +1,9 @@
{
"t_0_1746782379424": "自动化任务",
"t_0_1744098811152": "警告:您已进入未知区域,所访问的页面不存在,请点击按钮返回首页。",
"t_1_1744098801860": "返回首页",
"t_2_1744098804908": "安全提示:如果您认为这是个错误,请立即联系管理员",
"t_3_1744098802647": "展开主菜单",
"t_4_1744098802046": "折叠主菜单",
"t_0_1744164843238": "欢迎使用AllinSSL高效管理SSL证书",
"t_1_1744164835667": "AllinSSL",
"t_2_1744164839713": "账号登录",
"t_3_1744164839524": "请输入用户名",
@@ -14,7 +12,6 @@
"t_6_1744164838900": "忘记密码",
"t_7_1744164838625": "登录中",
"t_8_1744164839833": "登录",
"t_0_1744168657526": "退出登录",
"t_0_1744258111441": "首页",
"t_1_1744258113857": "自动化部署",
"t_2_1744258111238": "证书管理",
@@ -85,11 +82,6 @@
"t_21_1744958839305": "服务器1",
"t_22_1744958841926": "服务器2",
"t_23_1744958838717": "面板1",
"t_24_1744958845324": "面板2",
"t_25_1744958839236": "网站1",
"t_26_1744958839682": "网站2",
"t_27_1744958840234": "腾讯云1",
"t_28_1744958839760": "阿里云1",
"t_29_1744958838904": "日",
"t_30_1744958843864": "证书格式不正确,请检查是否包含完整的证书头尾标识",
"t_31_1744958844490": "私钥格式不正确,请检查是否包含完整的私钥头尾标识",
@@ -111,7 +103,6 @@
"t_16_1745215915209": "删除工作流",
"t_17_1745215915985": "工作流删除成功",
"t_18_1745215915630": "工作流删除失败",
"t_0_1745227838699": "新增自动化部署",
"t_1_1745227838776": "请输入自动化名称",
"t_2_1745227839794": "确定要执行{name}工作流吗?",
"t_3_1745227841567": "确认要删除{name}工作流吗?此操作不可恢复。",
@@ -278,7 +269,6 @@
"t_6_1745490738548": "请输入邮箱,邮箱不能为空",
"t_7_1745490739917": "请选择DNS提供商DNS提供商不能为空",
"t_8_1745490739319": "请输入续签间隔,续签间隔不能为空",
"t_0_1745553910661": "域名格式错误,请输入正确的域名",
"t_1_1745553909483": "邮箱格式错误,请输入正确的邮箱",
"t_2_1745553907423": "续签间隔不能为空",
"t_0_1745735774005": "请输入证书域名,多个域名用逗号分隔",
@@ -453,7 +443,6 @@
"t_12_1746773355641": "点击创建自动化工作流程,提高效率",
"t_13_1746773349526": "申请证书",
"t_14_1746773355081": "点击申请和管理SSL证书保障安全",
"t_15_1746773358151": "点击设置网站监控,实时掌握运行状态",
"t_16_1746773356568": "最多只能配置一个邮箱通知渠道",
"t_17_1746773351220": "确认{0}通知渠道",
"t_18_1746773355467": "{0}通知渠道,将开始发送告警通知。",
@@ -490,5 +479,34 @@
"t_0_1746776194126": "日志详情",
"t_1_1746776198156": "加载日志失败:",
"t_2_1746776194263": "下载日志",
"t_3_1746776195004": "暂无日志信息"
"t_3_1746776195004": "暂无日志信息",
"t_0_1746782379424": "自动化任务",
"t_0_1746858920894": "请选择主机提供商",
"t_1_1746858922914": "DNS提供商列表为空请添加",
"t_2_1746858923964": "主机提供商列表为空,请添加",
"t_3_1746858920060": "添加主机提供商",
"t_4_1746858917773": "已选择",
"t_0_1747019621052": "请选择主机提供商{0}",
"t_1_1747019624067": "点击设置网站监控,掌握实时状态",
"t_2_1747019616224": "阿里云",
"t_3_1747019616129": "腾讯云",
"t_0_1747040228657": "多域名请使用英文逗号分隔例如test.com,test.cn",
"t_1_1747040226143": "泛域名请使用*号,例如:*.test.com",
"t_0_1747042966820": "请输入正确的Cloudflare API密钥",
"t_1_1747042969705": "请输入正确的宝塔API密钥",
"t_2_1747042967277": "请输入正确的腾讯云SecretKey",
"t_3_1747042967608": "请输入正确的华为云SecretKey",
"t_4_1747042966254": "请输入华为云AccessKey",
"t_5_1747042965911": "请输入正确的邮箱账号",
"t_0_1747047213730": "添加自动化部署",
"t_1_1747047213009": "添加证书",
"t_2_1747047214975": "SSL证书管理平台",
"t_3_1747047218669": "域名格式错误,请检查域名格式",
"t_0_1747106957037": "DNS 递归服务器(可选)",
"t_1_1747106961747": "请输入 DNS 递归服务器多个值请用,隔开)",
"t_2_1747106957037": "跳过本地预检查",
"t_0_1747110184700": "选择证书",
"t_1_1747110191587": "如果需要修改证书内容与密钥,请选择自定义证书",
"t_2_1747110193465": "当选择非自定义证书时,证书内容与密钥均不可修改",
"t_3_1747110185110": "上传并提交"
}

View File

@@ -1,11 +1,9 @@
{
"t_0_1746782379424": "自動化任務",
"t_0_1744098811152": "警告:您已進入未知區域,所訪問的頁面不存在,請點擊按鈕返回首頁。",
"t_1_1744098801860": "返回首頁",
"t_2_1744098804908": "安全提示:如果您認為這是個錯誤,請立即聯繫管理員",
"t_3_1744098802647": "展開主菜單",
"t_4_1744098802046": "折疊主菜單",
"t_0_1744164843238": "歡迎使用AllinSSL高效管理SSL憑證",
"t_1_1744164835667": "AllinSSL",
"t_2_1744164839713": "帳號登錄",
"t_3_1744164839524": "請輸入用戶名",
@@ -14,7 +12,6 @@
"t_6_1744164838900": "忘記密碼",
"t_7_1744164838625": "登錄中",
"t_8_1744164839833": "登錄",
"t_0_1744168657526": "登出",
"t_0_1744258111441": "首頁",
"t_1_1744258113857": "自動部署",
"t_2_1744258111238": "證書管理",
@@ -85,11 +82,6 @@
"t_21_1744958839305": "伺服器1",
"t_22_1744958841926": "伺服器2",
"t_23_1744958838717": "面板1",
"t_24_1744958845324": "面板2",
"t_25_1744958839236": "網站1",
"t_26_1744958839682": "網站2",
"t_27_1744958840234": "腾讯雲1",
"t_28_1744958839760": "阿里雲1",
"t_29_1744958838904": "日",
"t_30_1744958843864": "證書格式不正確,請檢查是否包含完整的證書頭尾識別",
"t_31_1744958844490": "私钥格式不正確,請檢查是否包含完整的私钥頭尾識別",
@@ -111,7 +103,6 @@
"t_16_1745215915209": "刪除工作流程",
"t_17_1745215915985": "工作流程刪除成功",
"t_18_1745215915630": "工作流程刪除失敗",
"t_0_1745227838699": "新增自動部署",
"t_1_1745227838776": "請輸入自動化名稱",
"t_2_1745227839794": "確定要執行{name}工作流程嗎?",
"t_3_1745227841567": "確認要刪除{name}工作流程嗎?此操作無法恢復。",
@@ -278,7 +269,6 @@
"t_6_1745490738548": "請輸入郵箱,郵箱不能為空",
"t_7_1745490739917": "請選擇DNS提供商DNS提供商不能為空",
"t_8_1745490739319": "請輸入續簽間隔,續簽間隔不能為空",
"t_0_1745553910661": "域名格式錯誤,請輸入正確的域名",
"t_1_1745553909483": "郵箱格式錯誤,請輸入正確的郵箱",
"t_2_1745553907423": "續簽間隔不能為空",
"t_0_1745735774005": "請輸入證書域名,多個域名用逗號分隔",
@@ -452,7 +442,6 @@
"t_12_1746773355641": "點擊創建自動化工作流程,提高效率",
"t_13_1746773349526": "申請證書",
"t_14_1746773355081": "點擊申請和管理SSL證書保障安全",
"t_15_1746773358151": "點擊設置網站監控,即時掌握運行狀態",
"t_16_1746773356568": "最多只能配置一個郵箱通知渠道",
"t_17_1746773351220": "確認{0}通知渠道",
"t_18_1746773355467": "{0}通知渠道,將開始發送告警通知。",
@@ -489,5 +478,34 @@
"t_0_1746776194126": "日誌詳情",
"t_1_1746776198156": "載入日誌失敗:",
"t_2_1746776194263": "下載日誌",
"t_3_1746776195004": "暫無日誌資訊"
"t_3_1746776195004": "暫無日誌資訊",
"t_0_1746782379424": "自動化任務",
"t_0_1746858920894": "請選擇主機提供商",
"t_1_1746858922914": "DNS提供商列表為空請添加",
"t_2_1746858923964": "主機供應商列表為空,請添加",
"t_3_1746858920060": "新增主機提供商",
"t_4_1746858917773": "已選擇",
"t_0_1747019621052": "請選擇主機提供商{0}",
"t_1_1747019624067": "點擊設置網站監控,掌握實時狀態",
"t_2_1747019616224": "阿里雲",
"t_3_1747019616129": "騰訊雲",
"t_0_1747040228657": "多域名請使用英文逗號分隔例如test.com,test.cn",
"t_1_1747040226143": "泛網域請使用*號,例如:*.test.com",
"t_0_1747042966820": "請輸入正確的Cloudflare API密鑰",
"t_1_1747042969705": "請輸入正確的寶塔API密鑰",
"t_2_1747042967277": "請輸入正確的騰訊雲SecretKey",
"t_3_1747042967608": "請輸入正確的華為雲SecretKey",
"t_4_1747042966254": "請輸入華為雲AccessKey",
"t_5_1747042965911": "請輸入正確的郵箱賬號",
"t_0_1747047213730": "添加自動化部署",
"t_1_1747047213009": "添加證書",
"t_2_1747047214975": "SSL證書管理平臺",
"t_3_1747047218669": "域名格式錯誤,請檢查域名格式",
"t_0_1747106957037": "DNS 遞迴伺服器(可選)",
"t_1_1747106961747": "請輸入 DNS 遞歸服務器多個值請用,隔開)",
"t_2_1747106957037": "跳過本地預檢查",
"t_0_1747110184700": "選擇證書",
"t_1_1747110191587": "如果需要修改證書內容與密鑰,請選擇自定義證書",
"t_2_1747110193465": "當選擇非自訂憑證時,憑證內容與金鑰均不可修改",
"t_3_1747110185110": "上傳並提交"
}

View File

@@ -10,6 +10,7 @@ import '@styles/reset.css' // 重置样式
import '@styles/variable.css' // 全局变量
import '@styles/transition.css' // 过渡动画
import '@styles/icon.css' // css 图标
import { directives, useDirectives } from '@lib/directive'
// 引入mock
// import '../mock/access'
@@ -20,5 +21,8 @@ app.use(pinia) // 使用状态管理
app.use(i18n) // 国际化
app.mount('#app') // 挂载到DOM
// 注册自定义指令
useDirectives(app, directives)
// 设置资源
useModalUseDiscrete({ i18n, router, pinia })

View File

@@ -7,4 +7,9 @@
--n-content-margin: 1.2rem; /* 内容区内边距 */
--n-content-padding: 1.2rem; /* 内容区内边距 */
--n-dialog-title-padding: 0; /* 对话框标题内边距 */
--n-layout-content-background-color: #f8fafc; /* 内容区背景颜色 */
}
:root.dark {
--n-layout-content-background-color: transparent; /* 内容区背景颜色 */
}

View File

@@ -36,7 +36,13 @@ export interface AccessTypesResponse extends AxiosResponseData {
/** 新增授权请求参数 */
export interface AddAccessParams<
T = SshAccessConfig | AliyunAccessConfig | TencentCloudAccessConfig | PanelAccessConfig,
T =
| SshAccessConfig
| AliyunAccessConfig
| TencentCloudAccessConfig
| PanelAccessConfig
| HuaWeiCloudAccessConfig
| CloudflareAccessConfig,
> {
name: string
type: string
@@ -45,12 +51,15 @@ export interface AddAccessParams<
/** 修改授权请求参数 */
export interface UpdateAccessParams<
T = SshAccessConfig | AliyunAccessConfig | TencentCloudAccessConfig | PanelAccessConfig,
> {
T =
| SshAccessConfig
| AliyunAccessConfig
| TencentCloudAccessConfig
| PanelAccessConfig
| HuaWeiCloudAccessConfig
| CloudflareAccessConfig,
> extends AddAccessParams<T> {
id: string
type: string
name: string
config: T
}
/**
@@ -87,6 +96,25 @@ export interface PanelAccessConfig {
ignore_ssl: '0' | '1'
}
/**
* 华为云授权配置
*/
export interface HuaWeiCloudAccessConfig {
secret_key: string
access_key: string
}
/**
* cloudflare 授权配置
*/
export interface CloudflareAccessConfig {
api_key: string
email: string
}
/** 删除授权请求参数 */
export interface DeleteAccessParams {
id: string

View File

@@ -15,6 +15,9 @@ export interface CertItem {
issuer: string
create_time: string
expire_time: string
sha256: string
cert: string
key: string
status: number
source: 'upload' | 'apply'
end_day: string
@@ -41,16 +44,14 @@ export interface ApplyCertResponse extends AxiosResponseData {
/** 上传证书请求参数 */
export interface UploadCertParams {
// name: string
cert_id: string
cert: string
key: string
}
/** 上传证书响应 */
export interface UploadCertResponse extends AxiosResponseData {
data: {
id: string
}
data: string
}
/** 删除证书请求参数 */

View File

@@ -5,6 +5,7 @@ import { $t } from '@locales/index'
import { useThemeCssVar } from '@baota/naive-ui/theme'
import { useController } from './useController'
import EmptyState from '@components/emptyState/index'
import BaseComponent from '@components/baseComponent'
/**
@@ -48,8 +49,13 @@ export default defineComponent({
></NInput>
),
content: () => (
<div class="rounded-lg bg-white">
<ApiTable size="medium" />
<div class="rounded-lg">
<ApiTable
size="medium"
v-slots={{
empty: () => <EmptyState addButtonText={$t('t_0_1745289355714')} onAddClick={openAddForm} />,
}}
/>
</div>
),
footerRight: () => (

View File

@@ -25,7 +25,7 @@ import {
useLoadingMask,
} from '@baota/naive-ui/hooks'
import { useError } from '@baota/hooks/error'
import { isIp, isPort, isUrl } from '@baota/utils/business'
import { isEmail, isIp, isPort, isUrl } from '@baota/utils/business'
import { $t } from '@locales/index'
import { useStore } from './useStore'
@@ -35,10 +35,20 @@ import type { FormConfig } from '@baota/naive-ui/types/form'
import ApiManageForm from './components/apiManageForm'
import SvgIcon from '@components/svgIcon'
import TypeIcon from '@components/typeIcon'
import { useStore as useLayoutStore } from '@layout/useStore'
const { sourceTypes } = useLayoutStore()
// 状态和方法
const { accessTypes, apiFormProps, fetchAccessList, deleteExistingAccess, addNewAccess, updateExistingAccess } =
useStore()
const {
accessTypeMap,
apiFormProps,
fetchAccessList,
deleteExistingAccess,
addNewAccess,
updateExistingAccess,
resetApiForm,
} = useStore()
// 消息和对话框
const { handleError } = useError()
@@ -47,12 +57,6 @@ const { handleError } = useError()
* @returns {Object} 返回授权API相关的状态数据和处理方法
*/
export const useController = () => {
// 表格列配置
const accessTypeMap = {
dns: $t('t_3_1745735765112'),
host: $t('t_0_1746754500246'),
}
/**
* @description 创建表格列配置
* @returns {DataTableColumns<AccessItem>} 返回表格列配置数组
@@ -69,7 +73,7 @@ export const useController = () => {
{
title: $t('t_1_1746754499371'),
key: 'type',
width: 180,
width: 120,
render: (row) => <TypeIcon icon={row.type} type="success" />,
},
{
@@ -78,10 +82,10 @@ export const useController = () => {
width: 180,
render: (row) => (
<NSpace>
{row.access_type.map((type) => {
{row.access_type?.map((type) => {
return (
<NTag type="default" size="small">
{accessTypeMap[type]}
<NTag key={type} type={type === 'dns' ? 'success' : 'info'} size="small">
{accessTypeMap[type as keyof typeof accessTypeMap]}
</NTag>
)
})}
@@ -159,6 +163,7 @@ export const useController = () => {
footer: true,
onUpdateShow: (show) => {
if (!show) fetch()
resetApiForm()
},
})
}
@@ -176,6 +181,7 @@ export const useController = () => {
footer: true,
onUpdateShow: (show) => {
if (!show) fetch()
resetApiForm()
},
})
}
@@ -207,7 +213,6 @@ export const useController = () => {
ApiTablePage,
param,
data,
accessTypes,
openAddForm,
}
}
@@ -282,9 +287,17 @@ export const useApiFormController = (props: { data: AccessItem }) => {
},
},
api_key: {
required: true,
message: $t('t_3_1745317313561'),
trigger: 'input',
validator: (rule: FormItemRule, value: string, callback: (error?: Error) => void) => {
if (!value.length) {
if (param.value.type === 'cloudflare') {
return callback(new Error($t('t_0_1747042966820')))
} else if (param.value.type === 'btpanel') {
return callback(new Error($t('t_1_1747042969705')))
}
}
callback()
},
},
access_key_id: {
required: true,
@@ -302,15 +315,41 @@ export const useApiFormController = (props: { data: AccessItem }) => {
trigger: 'input',
},
secret_key: {
required: true,
message: $t('t_7_1745317313831'),
trigger: 'input',
validator: (rule: FormItemRule, value: string, callback: (error?: Error) => void) => {
if (!value.length) {
if (param.value.type === 'tencentcloud') {
return callback(new Error($t('t_2_1747042967277')))
} else if (param.value.type === 'huaweicloud') {
return callback(new Error($t('t_3_1747042967608')))
}
}
callback()
},
},
access_key: {
required: true,
message: $t('t_4_1747042966254'),
trigger: 'input',
},
email: {
trigger: 'input',
validator: (rule: FormItemRule, value: string, callback: (error?: Error) => void) => {
if (!isEmail(value)) {
return callback(new Error($t('t_5_1747042965911')))
}
callback()
},
},
},
}
// 类型列表
const typeList = Object.entries(accessTypes.value).map(([key, value]) => ({ label: value, value: key }))
const typeList = Object.entries(sourceTypes.value).map(([key, value]) => ({
label: value.name,
value: key,
access: value.access,
}))
// 表单配置
const config = computed(() => {
@@ -394,6 +433,12 @@ export const useApiFormController = (props: { data: AccessItem }) => {
case 'tencentcloud':
items.push(useFormInput('SecretId', 'config.secret_id'), useFormInput('SecretKey', 'config.secret_key'))
break
case 'huaweicloud':
items.push(useFormInput('AccessKey', 'config.access_key'), useFormInput('SecretKey', 'config.secret_key'))
break
case 'cloudflare':
items.push(useFormInput('邮箱', 'config.email'), useFormInput('APIKey', 'config.api_key'))
break
default:
break
}
@@ -445,16 +490,13 @@ export const useApiFormController = (props: { data: AccessItem }) => {
*/
const renderSingleSelectTag = ({ option }: Record<string, any>): VNode => {
return (
<div class="flex items-center">
<NFlex class="w-full">
{option.label ? (
<NFlex>
<SvgIcon icon={`resources-${option.value}`} size="2rem" />
<NText>{option.label}</NText>
</NFlex>
renderLabel(option)
) : (
<span class="text-[1.4rem] text-gray-400">{$t('t_0_1745833934390')}</span>
)}
</div>
</NFlex>
)
}
@@ -463,11 +505,22 @@ export const useApiFormController = (props: { data: AccessItem }) => {
* @param {Record<string, any>} option - 选项
* @returns {VNode} 渲染后的VNode
*/
const renderLabel = (option: { value: string; label: string }): VNode => {
const renderLabel = (option: { value: string; label: string; access: string[] }): VNode => {
return (
<NFlex>
<SvgIcon icon={`resources-${option.value}`} size="2rem" />
<NText>{option.label}</NText>
<NFlex justify="space-between" class="w-[38rem]">
<NFlex align="center" size="small">
<SvgIcon icon={`resources-${option.value}`} size="1.6rem" />
<NText>{option.label}</NText>
</NFlex>
<NFlex class="pr-[1rem]">
{option.access.map((item: string) => {
return (
<NTag type={item === 'dns' ? 'success' : 'info'} size="small" key={item}>
{accessTypeMap[item as keyof typeof accessTypeMap]}
</NTag>
)
})}
</NFlex>
</NFlex>
)
}
@@ -504,6 +557,7 @@ export const useApiFormController = (props: { data: AccessItem }) => {
try {
openLoad()
await fetch()
resetApiForm()
close()
} catch (error) {
return handleError(error)

View File

@@ -15,13 +15,6 @@ const message = useMessage() // 导入消息钩子
*/
export const useAuthApiManageStore = defineStore('auth-api-manage-store', () => {
// -------------------- 状态定义 --------------------
const accessTypes = ref({
ssh: 'SSH',
aliyun: '阿里云',
tencentcloud: '腾讯云',
btpanel: '宝塔',
'1panel': '1Panel',
})
/** 添加/编辑API表单 */
const apiFormProps = ref({
@@ -34,6 +27,12 @@ export const useAuthApiManageStore = defineStore('auth-api-manage-store', () =>
},
})
// 表格列配置
const accessTypeMap = {
dns: $t('t_3_1745735765112'),
host: $t('t_0_1746754500246'),
}
// -------------------- 请求方法 --------------------
/**
* 获取授权API列表
@@ -123,8 +122,8 @@ export const useAuthApiManageStore = defineStore('auth-api-manage-store', () =>
return {
// 状态
accessTypes,
apiFormProps,
accessTypeMap,
// 方法
fetchAccessList,

View File

@@ -5,9 +5,11 @@ import { RouterView } from '@baota/router'
import { PlusOutlined } from '@vicons/antd'
import { Search } from '@vicons/carbon'
import { useController } from './useController'
import BaseComponent from '@components/baseComponent'
import { useRouter } from 'vue-router'
import BaseComponent from '@components/baseComponent'
import EmptyState from '@components/emptyState/index'
/**
* 工作流页面组件
*/
@@ -52,7 +54,7 @@ export default defineComponent({
headerLeft: () => (
<NButton type="primary" size="large" class="px-5" onClick={handleAddWorkflow}>
<PlusOutlined class="text-[var(--text-color-3)] w-[1.6rem]" />
<span class="px-2">{$t('t_0_1745227838699')}</span>
<span class="px-2">{$t('t_0_1747047213730')}</span>
</NButton>
),
headerRight: () => (
@@ -76,8 +78,14 @@ export default defineComponent({
></NInput>
),
content: () => (
<div class="rounded-lg bg-white">
<WorkflowTable size="medium" />
<div class="rounded-lg ">
<WorkflowTable size="medium">
{{
empty: () => (
<EmptyState addButtonText={$t('t_0_1747047213730')} onAddClick={handleAddWorkflow} />
),
}}
</WorkflowTable>
</div>
),
footerRight: () => (

View File

@@ -55,7 +55,7 @@ const statusCol = <T,>(key: string, title: string): TableColumn<T> => ({
text: $t('t_1_1746773348701'),
}
return (
<NTag type={status.type as any} size="small" bordered={false}>
<NTag type={status.type as any} size="small">
{status.text}
</NTag>
)

View File

@@ -6,6 +6,7 @@ import { $t } from '@locales/index'
import { useController } from './useController'
import BaseComponent from '@components/baseComponent'
import EmptyState from '@components/emptyState'
/**
* 证书管理组件
@@ -50,8 +51,12 @@ export default defineComponent({
></NInput>
),
content: () => (
<div class="rounded-lg bg-white">
<CertTable size="medium" />
<div class="rounded-lg">
<CertTable size="medium">
{{
empty: () => <EmptyState addButtonText={$t('t_1_1747047213009')} onAddClick={openUploadModal} />,
}}
</CertTable>
</div>
),
footerRight: () => (

View File

@@ -69,7 +69,7 @@ export const useController = () => {
const [_, type, text] = config.find((item) => item[0]) ?? ['default', 'error', '获取失败']
console.log(config)
return (
<NTag type={type} size="small" bordered={false}>
<NTag type={type} size="small">
{text}
</NTag>
)

View File

@@ -1,72 +1,10 @@
/* 主题颜色变量 */
:root {
--text-primary: #1a1a1a;
--text-secondary: #666666;
--text-success: #22c55e;
--text-warning: #eab308;
--text-error: #ef4444;
--text-info: #3b82f6;
--text-default: #6b7280;
--bg-primary: #ffffff;
--bg-secondary: #f3f4f6;
--bg-success-light: #dcfce7;
--bg-warning-light: #fef9c3;
--bg-error-light: #fee2e2;
--bg-info-light: #dbeafe;
/* 快捷入口卡片颜色 */
--workflow-bg: rgba(16, 185, 129, 0.08);
--workflow-icon-bg: rgba(16, 185, 129, 0.15);
--workflow-color: #10B981;
--cert-bg: rgba(245, 158, 11, 0.08);
--cert-icon-bg: rgba(245, 158, 11, 0.15);
--cert-color: #F59E0B;
--monitor-bg: rgba(139, 92, 246, 0.08);
--monitor-icon-bg: rgba(139, 92, 246, 0.15);
--monitor-color: #8B5CF6;
}
/* 暗色模式 */
:root[data-theme='dark'] {
--text-primary: #ffffff;
--text-secondary: #9ca3af;
--text-success: #4ade80;
--text-warning: #facc15;
--text-error: #f87171;
--text-info: #60a5fa;
--text-default: #9ca3af;
--bg-primary: #1a1a1a;
--bg-secondary: #262626;
--bg-success-light: rgba(34, 197, 94, 0.2);
--bg-warning-light: rgba(234, 179, 8, 0.2);
--bg-error-light: rgba(239, 68, 68, 0.2);
--bg-info-light: rgba(59, 130, 246, 0.2);
/* 暗色模式下的快捷入口卡片颜色 */
--workflow-bg: rgba(16, 185, 129, 0.12);
--workflow-icon-bg: rgba(16, 185, 129, 0.2);
--workflow-color: #34D399;
--cert-bg: rgba(245, 158, 11, 0.12);
--cert-icon-bg: rgba(245, 158, 11, 0.2);
--cert-color: #FCD34D;
--monitor-bg: rgba(139, 92, 246, 0.12);
--monitor-icon-bg: rgba(139, 92, 246, 0.2);
--monitor-color: #A78BFA;
}
/* 状态文本颜色 */
.stateText {
&.success { color: var(--text-success); }
&.warning { color: var(--text-warning); }
&.error { color: var(--text-error); }
&.info { color: var(--text-info); }
&.default { color: var(--text-default); }
&.success { color: #22c55e; }
&.warning { color: #eab308; }
&.error { color: #ef4444; }
&.info { color: #3b82f6; }
&.default { color: #6b7280; }
}
/* 卡片样式 */
@@ -145,15 +83,3 @@
font-weight: 500;
margin-bottom: 0.75rem;
}
/* 表格样式 */
.tableText {
color: var(--text-secondary);
}
.viewAllButton {
color: var(--text-info);
&:hover {
color: var(--text-primary);
}
}

View File

@@ -23,7 +23,7 @@ export default defineComponent({
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
{/* 自动化工作流概览卡片 */}
<div onClick={() => pushToWorkflow()} class="cursor-pointer relative">
<div class="absolute right-0 top-0 w-24 h-24 rounded-full bg-blue-50 dark:bg-blue-900/30 opacity-70 -z-10"></div>
<div class="absolute right-0 top-0 w-24 h-24 rounded-full bg-blue-50 opacity-70 -z-10"></div>
<NCard class="transition-all duration-300 rounded-[0.6rem]" hoverable={true} bordered={false}>
<div class="flex items-center justify-center">
<div class="flex-1">
@@ -33,7 +33,7 @@ export default defineComponent({
<span class="text-[2.4rem] font-bold">{overviewData.value.workflow.count}</span>
<p class={styles.tableText}>{$t('t_3_1746773348798')}</p>
</div>
<div class="border-l-2 dark:border-gray-600 pl-[2rem] ml-[3rem]">
<div class="border-l-2 pl-[2rem] ml-[3rem] h-[5rem] lining-[5rem]">
<div class="flex items-center space-x-1">
<span class="w-4 h-4 rounded-full mr-[.6rem] bg-green-500"></span>
<span class={styles.tableText}>
@@ -60,7 +60,7 @@ export default defineComponent({
{/* 证书管理概览卡片 */}
<div onClick={() => pushToCertManage()} class="cursor-pointer relative">
<div class="absolute right-0 top-0 w-24 h-24 rounded-full bg-blue-50 dark:bg-blue-900/30 opacity-70 -z-10"></div>
<div class="absolute right-0 top-0 w-24 h-24 rounded-full bg-blue-50 opacity-70 -z-10"></div>
<NCard class="transition-all duration-300 rounded-[0.6rem]" hoverable={true} bordered={false}>
<div class="flex items-center justify-center">
<div class="flex-1">
@@ -70,7 +70,7 @@ export default defineComponent({
<span class="text-[2.4rem] font-bold">{overviewData.value.cert.count}</span>
<p class={styles.tableText}>{$t('t_3_1746773348798')}</p>
</div>
<div class="border-l-2 dark:border-gray-600 pl-[2rem] ml-[3rem]">
<div class="border-l-2 pl-[2rem] ml-[3rem] h-[5rem] lining-[5rem]">
<div class="flex items-center space-x-1">
<span class="w-4 h-4 rounded-full mr-[.6rem] bg-yellow-500"></span>
<span class={styles.tableText}>
@@ -97,7 +97,7 @@ export default defineComponent({
{/* 实时监控概览卡片 */}
<div onClick={() => pushToMonitor()} class="cursor-pointer relative">
<div class="absolute right-0 top-0 w-24 h-24 rounded-full bg-blue-50 dark:bg-blue-900/30 opacity-70 -z-10"></div>
<div class="absolute right-0 top-0 w-24 h-24 rounded-full bg-blue-50 opacity-70 -z-10"></div>
<NCard class="transition-all duration-300 rounded-[0.6rem]" hoverable={true} bordered={false}>
<div class="flex items-center justify-center">
<div class="flex-1">
@@ -107,7 +107,7 @@ export default defineComponent({
<span class="text-[2.4rem] font-bold">{overviewData.value.site_monitor.count}</span>
<p class={styles.tableText}>{$t('t_3_1746773348798')}</p>
</div>
<div class="border-l-2 dark:border-gray-600 pl-[2rem] ml-[3rem]">
<div class="border-l-2 pl-[2rem] ml-[3rem] h-[5rem] lining-[5rem]">
<div class="flex items-center space-x-1">
<span class="w-4 h-4 rounded-full mr-[.6rem] bg-red-500"></span>
<span class={styles.tableText}>
@@ -131,7 +131,7 @@ export default defineComponent({
<NCard class="rounded-[0.6rem] transition-all duration-300" hoverable={true} bordered={false}>
<div class="flex justify-between items-center mb-4">
<div class={styles.tableText}>{$t('t_8_1746773351524')}</div>
<NButton text onClick={() => pushToWorkflow()} class={styles.viewAllButton}>
<NButton text type="primary" onClick={() => pushToWorkflow()} class={styles.viewAllButton}>
{$t('t_9_1746773348221')}
<NIcon class="ml-1">
<ArrowRight />
@@ -216,7 +216,7 @@ export default defineComponent({
</div>
<div class="flex-1">
<div class={`${styles.title} text-[1.8rem] font-medium mb-3`}>{$t('t_11_1745289354516')}</div>
<div class={styles.tableText}>{$t('t_15_1746773358151')}</div>
<div class={styles.tableText}>{$t('t_1_1747019624067')}</div>
</div>
</div>
</NCard>

View File

@@ -5,12 +5,12 @@
/* 侧边栏样式 */
.sider {
@apply h-screen dark:bg-gray-800 shadow-lg z-10 transition-all duration-300 ease-in-out;
@apply h-screen shadow-lg z-10 transition-all duration-300 ease-in-out;
}
/* Logo容器样式 */
.logoContainer {
@apply flex items-center px-[2rem] h-[var(--n-sider-login-height)] border-b dark:border-gray-700 relative;
@apply flex items-center px-[2rem] h-[var(--n-sider-login-height)] border-b relative;
border-color: var(--n-border-color);
}
@@ -36,42 +36,42 @@
/* 折叠按钮样式 */
.collapsedIcon {
@apply w-[4.2rem] h-[3.6rem] hover:bg-gray-200 hover:text-gray-500 hover:dark:bg-gray-500 absolute right-[1rem] rounded-[.4rem] flex items-center justify-center cursor-pointer transition-all duration-300;
@apply w-[4.2rem] h-[3.6rem] hover:bg-gray-200 hover:text-gray-500 absolute right-[1rem] rounded-[.4rem] flex items-center justify-center cursor-pointer transition-all duration-300;
}
/* 头部样式 */
.header {
@apply h-[var(--n-header-height)] bg-[var(--n-header-color)] border-b dark:border-gray-700 shadow-sm z-10 transition-all duration-300 ease-in-out flex items-center justify-end px-6;
@apply h-[var(--n-header-height)] bg-[var(--n-header-color)] border-b shadow-sm z-10 transition-all duration-300 ease-in-out flex items-center justify-end px-6;
border-color: var(--n-border-color);
}
/* 系统信息样式 */
.systemInfo {
@apply flex items-center space-x-4 text-[1.2rem] text-gray-600 dark:text-gray-300;
@apply flex items-center space-x-4 text-[1.2rem] text-gray-600 ;
}
/* 内容区域样式 */
.content {
@apply flex-1 transition-all duration-300 ease-in-out bg-slate-50 dark:bg-gray-900 p-[var(--n-content-padding)] h-[calc(100vh-var(--n-main-diff-height))] overflow-y-auto;
@apply flex-1 transition-all duration-300 ease-in-out p-[var(--n-content-padding)] h-[calc(100vh-var(--n-main-diff-height))] bg-[var(--n-layout-content-background-color)] overflow-y-auto;
transition: padding 0s;
}
/* 折叠按钮样式 */
.collapseButton {
@apply absolute right-0 top-1/2 -translate-y-1/2 translate-x-1/2 dark:bg-gray-800 rounded-full p-2 shadow-lg cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-700 transition-all duration-300;
@apply absolute right-0 top-1/2 -translate-y-1/2 translate-x-1/2 rounded-full p-2 shadow-lg cursor-pointer hover:bg-gray-100 transition-all duration-300;
}
/* 子路由导航样式 */
.subRouteNav {
@apply mb-4 p-4 bg-white dark:bg-gray-800 rounded-lg shadow-sm;
@apply mb-4 p-4 bg-white rounded-lg shadow-sm;
}
/* 子路由标题样式 */
.subRouteTitle {
@apply text-lg font-medium mb-2 text-gray-700 dark:text-gray-300;
@apply text-lg font-medium mb-2 text-gray-700 ;
}
/* 子路由面包屑样式 */
.breadcrumb {
@apply bg-white dark:bg-gray-800 p-3 rounded-lg shadow-sm mb-4;
@apply bg-white p-3 rounded-lg shadow-sm mb-4;
}

View File

@@ -16,7 +16,7 @@ export default defineComponent({
useController()
// 获取主题变量
const cssVars = useThemeCssVar(['cardColor', 'headerColor'])
const cssVars = useThemeCssVar(['cardColor', 'headerColor', 'contentColor'])
return () => (
<NLayout class={styles.layoutContainer} hasSider style={cssVars.value}>
@@ -66,7 +66,7 @@ export default defineComponent({
<NLayoutHeader class={styles.header}>
<div class={styles.systemInfo}>
<NBadge value={1} show={false} dot>
<span class="px-[.5rem] cursor-pointer">v1.0</span>
<span class="px-[.5rem] cursor-pointer">v1.0.1</span>
</NBadge>
</div>
</NLayoutHeader>

View File

@@ -83,7 +83,7 @@ export const useController = () => {
...routeMenuItems,
{
key: 'logout',
label: () => <a onClick={handleLogout}>{$t('t_0_1744168657526')}</a>,
label: () => <a onClick={handleLogout}>{$t('t_15_1745457484292')}</a>,
icon: renderIcon('logout'),
},
]

View File

@@ -4,6 +4,7 @@ import type { RouteName } from './types'
import { DnsProviderOption, NotifyProviderOption } from '@/types/setting'
import { getReportList } from '@api/setting'
import { getAccessAllList } from '@api/index'
import { $t } from '@locales/index'
/**
* @description 布局相关的状态管理
@@ -34,7 +35,7 @@ export const useLayoutStore = defineStore('layout-store', () => {
/**
* @description 导航状态
*/
const menuActive = useLocalStorage<RouteName>('menu-active', 'home')
const menuActive = useSessionStorage<RouteName>('menu-active', 'home')
/**
* @description 布局内边距
@@ -48,6 +49,47 @@ export const useLayoutStore = defineStore('layout-store', () => {
*/
const locales = useLocalStorage<string>('locales-active', 'zhCN')
/**
* @description 主机提供商
*/
const sourceTypes = ref({
// 主机提供商
ssh: { name: 'SSH', access: ['host'] },
btpanel: { name: $t('t_10_1745735765165'), access: ['host'] },
'1panel': { name: '1Panel', access: ['host'] },
aliyun: { name: $t('t_2_1747019616224'), access: ['dns', 'host'] },
tencentcloud: { name: $t('t_3_1747019616129'), access: ['dns', 'host'] },
huaweicloud: { name: '华为云', access: ['dns'] },
cloudflare: { name: 'Cloudflare', access: ['dns'] },
})
/**
* @description 主机提供商衍生类型
*/
const sourceDerivationTypes = ref({
// 网站
'btpanel-site': { name: $t('t_11_1745735766456') },
'1panel-site': { name: $t('t_13_1745735766084') },
// 云服务
'aliyun-cdn': { name: $t('t_16_1745735766712') },
'aliyun-oss': { name: $t('t_2_1746697487164') },
'tencentcloud-cdn': { name: $t('t_14_1745735766121') },
'tencentcloud-cos': { name: $t('t_15_1745735768976') },
})
/**
* @description 消息通知提供商
*/
const pushSourceType = ref({
mail: { name: $t('t_68_1745289354676') },
dingtalk: { name: $t('t_32_1746773348993') },
wecom: { name: $t('t_33_1746773350932') },
feishu: { name: $t('t_34_1746773350153') },
webhook: { name: 'WebHook' },
})
// ==============================
// UI 交互方法
// ==============================
// UI 交互方法
// ==============================
@@ -88,7 +130,7 @@ export const useLayoutStore = defineStore('layout-store', () => {
*/
const resetDataInfo = (): void => {
menuActive.value = 'home'
localStorage.removeItem('menu-active')
sessionStorage.removeItem('menu-active')
}
// ==============================
@@ -126,14 +168,12 @@ export const useLayoutStore = defineStore('layout-store', () => {
try {
dnsProvider.value = []
const { data } = await getAccessAllList({ type }).fetch()
console.timeEnd('loadDnsProviders')
dnsProvider.value =
data?.map((item) => ({
label: item.name,
value: item.id.toString(),
type: item.type,
})) || []
console.timeEnd('loadDnsProviders')
} catch (error) {
handleError(error)
}
@@ -151,6 +191,9 @@ export const useLayoutStore = defineStore('layout-store', () => {
isCollapsed,
layoutPadding,
menuActive,
sourceTypes,
sourceDerivationTypes,
pushSourceType,
// 方法
resetDataInfo,

View File

@@ -3,11 +3,10 @@ import { UserOutlined, LockOutlined, CodeOutlined } from '@vicons/antd'
import { useTheme, useThemeCssVar } from '@baota/naive-ui/theme'
import { $t } from '@locales/index'
import { useController } from './useController'
import styles from './index.module.css'
// import LocalesTips from '@baota/naive-ui/components/localesTips'
// import ThemeTips from '@baota/naive-ui/components/themeTips'
import LocalesTips from '@baota/naive-ui/components/localesTips'
import ThemeTips from '@baota/naive-ui/components/themeTips'
export default defineComponent({
setup() {
@@ -27,15 +26,15 @@ export default defineComponent({
class={styles.container}
style={`background-image:${isDark.value ? 'url(/static/images/login-bg-dark.svg)' : 'url(/static/images/login-bg.svg)'};`}
>
{/* <div class="absolute z-[99] top-0 right-0 p-[2rem] flex w-[120px] justify-between">
<div class="absolute z-[99] top-0 right-0 p-[2rem] flex w-[120px] justify-between">
<LocalesTips />
<ThemeTips />
</div> */}
</div>
<div class={styles.loginBox}>
<div class={styles.leftSection}>
<h2 class={styles.leftTitle}>
<img src="/static/images/logo.png" alt="logo" class={styles.logo} />
<span>{$t('t_0_1744164843238')}</span>
<span>{$t('t_2_1747047214975')}</span>
</h2>
<div class={styles.leftImageWrapper}>
<img src="/static/images/login-display.svg" alt={$t('t_1_1744164835667')} class={styles.leftImage} />

View File

@@ -7,6 +7,7 @@ import { useThemeCssVar } from '@baota/naive-ui/theme'
import { useController } from './useController'
import BaseComponent from '@components/baseComponent'
import EmptyState from '@components/emptyState'
/**
* 监控管理组件
@@ -52,8 +53,12 @@ export default defineComponent({
></NInput>
),
content: () => (
<div class="rounded-lg bg-white">
<MonitorTable size="medium" />
<div class="rounded-lg">
<MonitorTable size="medium">
{{
empty: () => <EmptyState addButtonText={$t('t_11_1745289354516')} onAddClick={openAddForm} />,
}}
</MonitorTable>
</div>
),
footerRight: () => (

View File

@@ -14,7 +14,7 @@ export default defineComponent({
<NDescriptions bordered>
<NDescriptionsItem label={$t('t_5_1745833933241')}>
<div class="flex items-center">
<span class="text-[2rem] font-medium">v1.0.0</span>
<span class="text-[2rem] font-medium">v1.0.1</span>
</div>
</NDescriptionsItem>
<NDescriptionsItem label={$t('t_29_1746667589773')}>
@@ -34,7 +34,7 @@ export default defineComponent({
<NCard title={$t('t_13_1745833933630')} class="mb-4">
<div class="about-content">
<p class="text-gray-700 leading-relaxed">
<p class="text-[3rem] font-medium">ALLinSSL</p>
<p class="text-[3rem] font-medium">AllinSSL</p>
<br />
<p class="text-[1.6rem] text-primary mb-[2rem]">{$t('t_35_1746773362992')}</p>
<span class="text-[1.4rem] mb-[1rem] text-gray-500">

View File

@@ -88,7 +88,7 @@ export const useSettingsStore = defineStore('settings-store', () => {
wechat: 'https://example.com/wechat_qr.png',
},
description: $t(
'ALLinSSL \n\r开源免费的 SSL 证书自动化管理平台 \n\r一键自动化申请、续期、部署、监控所有 SSL/TLS 证书,支持跨云环境和多 CA (coding~),告别繁琐配置和高昂费用。',
'AllinSSL \n\r开源免费的 SSL 证书自动化管理平台 \n\r一键自动化申请、续期、部署、监控所有 SSL/TLS 证书,支持跨云环境和多 CA (coding~),告别繁琐配置和高昂费用。',
),
})

View File

@@ -23,6 +23,8 @@ declare module 'vue' {
DeployNodeConfig: typeof import('../../vueFlow/components/configs/DeployNodeConfig.jsx')['default']
DnsProviderSelect: typeof import('./../src/components/dnsProviderSelect/index.tsx')['default']
Drawer: typeof import('./../src/components/flowChart/components/other/drawer.tsx')['default']
EmptyActionPrompt: typeof import('../src/components/emptyState/index.jsx')['default']
EmptyState: typeof import('./../src/components/emptyState/index.tsx')['default']
EndNode: typeof import('./../src/components/flowChart/components/base/endNode.tsx')['default']
EndNodeConfig: typeof import('../../vueFlow/components/configs/EndNodeConfig.jsx')['default']
ErrorNode: typeof import('./../src/components/flowChart/components/base/errorNode/index.tsx')['default']

View File

@@ -1,6 +1,6 @@
/// <reference types="vite/client" />
declare module '@baota/plugin-i18n' {
const pluginI18n: any
export default pluginI18n
}
declare module '@baota/vite-plugin-i18n' {
const plugin: any
export default plugin
}

View File

@@ -6,13 +6,15 @@ import VueJsx from '@vitejs/plugin-vue-jsx' // jsx处理
import legacy from '@vitejs/plugin-legacy' // 浏览器兼容
import VueDevTools from 'vite-plugin-vue-devtools' // vue3调试工具
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
// import { VueMcp } from 'vite-plugin-vue-mcp' // vite mcp 引入,解决数据构建文件
import { VueMcp } from 'vite-plugin-vue-mcp' // vite mcp 引入,解决数据构建文件
import AutoImport from 'unplugin-auto-import/vite' // 方法自动引入
import { NaiveUiResolver } from 'unplugin-vue-components/resolvers' // 引入naive-ui组件
import Components from 'unplugin-vue-components/vite' // 组件自动引入
// import { compression } from 'vite-plugin-compression2'
import pluginI18n from '@baota/plugin-i18n' // i18n生成器
import { ftpSync } from '@baota/project-ftp-sync'
import { ftpSync } from '@baota/vite-plugin-ftp-sync' // ftp同步
import pluginI18n from '@baota/vite-plugin-i18n' // i18n生成器
import pluginProjectSyncGit from '@baota/vite-plugin-turborepo-deploy' // 项目同步git
// import
const packPath = 'static/' // 打包后的vite目录
const isDev = process.env.NODE_ENV === 'development' // 开发环境
@@ -29,8 +31,7 @@ export default defineConfig({
defineModel: true,
},
}),
// i18n生成器
pluginI18n(),
// jsx处理
VueJsx(),
// 压缩gzip
@@ -72,9 +73,11 @@ export default defineConfig({
iconDirs: [path.resolve(process.cwd(), 'src/assets/icons/svg/')],
symbolId: 'icon-[dir]-[name]',
}),
// vite mcp 引入,解决数据构建文件
// VueMcp(),
VueMcp(),
// i18n生成器
pluginI18n(),
// ftp同步
ftpSync([
{
host: '192.168.168.121',
@@ -93,6 +96,54 @@ export default defineConfig({
clearRemote: true,
},
]),
// 项目同步git
pluginProjectSyncGit({
gitProjects: [
{
repo: 'ssh://git@git.bt.cn:30001/wzz/allinssl.git',
branch: '1.0.1',
targetDir: 'allinssl-gitlab',
discardChanges: true,
},
{
repo: 'https://github.com/allinssl/allinssl.git',
branch: '1.0.1',
targetDir: 'allinssl-github',
discardChanges: true,
},
],
localSync: [
{
source: 'apps/allin-ssl/dist',
target: ['.sync-git/allinssl-gitlab/build', '.sync-git/allinssl-github/build'],
mode: 'copy',
clearTarget: true,
exclude: ['node_modules'],
},
{
source: '/',
target: ['.sync-git/allinssl-gitlab/frontend', '.sync-git/allinssl-github/frontend'],
mode: 'copy',
clearTarget: true,
excludeDirs: [
'node_modules',
'dist',
'.sync-git',
'.sync-log',
'.cursor',
'.devcontainer',
'.github',
'.test',
'.vascode',
'.turbo',
'apps/cloud-control',
'apps/monorepo-docs',
'apps/naive-template',
'apps/vueFlow',
],
},
],
}),
],
resolve: {
// 别名配置
@@ -117,6 +168,7 @@ export default defineConfig({
'@config': path.resolve(__dirname, 'src/config'),
'@styles': path.resolve(__dirname, 'src/styles'),
'@types': path.resolve(__dirname, 'src/types'),
'@lib': path.resolve(__dirname, 'src/lib'),
'@': path.resolve(__dirname, 'src'),
},
},