【新增】申请证书算法配置

【新增】调整证书信息
This commit is contained in:
chudong
2025-05-19 17:45:17 +08:00
parent 4e91f10a4f
commit 59dc0a4108
99 changed files with 262 additions and 219 deletions

BIN
frontend/.DS_Store vendored

Binary file not shown.

View File

@@ -9330,5 +9330,22 @@
"arDZ": "API Token"
},
"timestamp": "2025-05-19T01:11:53.092Z"
},
"证书算法": {
"text": "证书算法",
"key": "t_0_1747647014927",
"translations": {
"zhCN": "证书算法",
"zhTW": "證書算法",
"enUS": "Certificate algorithm",
"jaJP": "証明書アルゴリズム",
"koKR": "인증서 알고리즘",
"ruRU": "Алгоритм сертификата",
"ptBR": "Algoritmo de certificado",
"frFR": "Algorithme de certificat",
"esAR": "Algoritmo de certificado",
"arDZ": "خوارزمية الشهادة"
},
"timestamp": "2025-05-19T09:30:14.927Z"
}
}

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 47 KiB

View File

@@ -23,16 +23,17 @@ export default defineComponent({
end_day: 30,
name_server: '',
skip_check: 1,
algorithm: 'RSA2048',
},
}),
},
},
setup(props) {
const { updateNodeConfig, isRefreshNode } = useStore()
const { updateNodeConfig, advancedOptions, isRefreshNode } = useStore()
// 弹窗辅助
const { confirm } = useModalHooks()
// 获取表单助手函数
const { useFormInput, useFormHelp, useFormSwitch } = useFormHooks()
const { useFormInput, useFormSelect, useFormMore, useFormHelp, useFormSwitch } = useFormHooks()
// 表单参数
const param = ref(deepClone(props.node.config))
@@ -88,23 +89,42 @@ 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 }),
useFormMore(advancedOptions),
...(advancedOptions.value
? [
useFormSelect(
$t('t_0_1747647014927'),
'algorithm',
[
{ label: 'RSA2048', value: 'RSA2048' },
{ label: 'RSA3072', value: 'RSA3072' },
{ label: 'RSA4096', value: 'RSA4096' },
{ label: 'RSA8192', value: 'RSA8192' },
{ label: 'EC256', value: 'EC256' },
{ label: 'EC384', value: 'EC384' },
],
{},
{ showRequireMark: false },
),
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'),
@@ -121,6 +141,10 @@ export default defineComponent({
// 创建表单实例
const { component: Form, data, example } = useForm<ApplyNodeConfig>({ defaultValue: param, config, rules })
onMounted(() => {
advancedOptions.value = false
})
// 确认事件触发
confirm(async (close) => {
try {

View File

@@ -109,6 +109,7 @@ nodeOptions[APPLY] = () =>
end_day: 30,
provider: '',
provider_id: '',
algorithm: 'RSA2048',
},
childNode: null,
},

View File

@@ -20,6 +20,7 @@ export default {
provider_id: '',
provider: '',
end_day: 30,
algorithm: 'RSA2048',
},
childNode: {
id: 'deploy-1',

View File

@@ -203,8 +203,10 @@ export interface ApplyNodeConfig {
provider_id: string // DNS提供商授权ID
provider: string // DNS提供商
end_day: number // 续签间隔
// 高级功能
name_server: string // DNS递归服务器
skip_check: number // 跳过检查
algorithm: string // 数字证书算法
// 高级功能
// algorithm: 'RSA2048' | 'RSA3072' | 'RSA4096' | 'RSA8192' | 'EC256' | 'EC384' // 数字证书算法
// dnsServer?: string // 指定DNS解析服务器

View File

@@ -33,6 +33,7 @@ export const useFlowStore = defineStore('flow-store', () => {
},
}) // 流程图数据
const flowZoom = ref(100) // 流程图缩放比例
const advancedOptions = ref(false) // 高级选项
const addNodeSelectList = ref<NodeSelect[]>([]) // 添加节点选项列表
const excludeNodeSelectList = ref<NodeNum[]>([]) // 排除的节点选项列表
const addNodeBtnRef = ref<HTMLElement | null>(null) // 添加节点按钮
@@ -536,6 +537,7 @@ export const useFlowStore = defineStore('flow-store', () => {
flowZoom, // 流程图缩放比例
selectedNodeId, // 当前选中的节点ID
isRefreshNode, // 是否刷新节点
advancedOptions, // 高级选项
// 方法
initFlowData, // 初始化流程图数据

View File

@@ -1,4 +1,5 @@
{
"t_0_1747647014927": "خوارزمية الشهادة",
"t_0_1744098811152": "تحذير: لقد دخلتم منطقة غير معروفة، الصفحة التي تحاول زيارتها غير موجودة، يرجى الضغط على الزر للعودة إلى الصفحة الرئيسية.",
"t_1_1744098801860": "رجوع إلى الصفحة الرئيسية",
"t_2_1744098804908": "نصيحة أمنية: إذا كنت تعتقد أن هذا خطأ، يرجى الاتصال بالمدير على الفور",

View File

@@ -1,4 +1,5 @@
{
"t_0_1747647014927": "Certificate algorithm",
"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",

View File

@@ -1,4 +1,5 @@
{
"t_0_1747647014927": "Algoritmo de certificado",
"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",

View File

@@ -1,4 +1,5 @@
{
"t_0_1747647014927": "Algorithme de certificat",
"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",

View File

@@ -1,4 +1,5 @@
{
"t_0_1747647014927": "証明書アルゴリズム",
"t_0_1744098811152": "警告:未知のエリアに進入しました。アクセスしようとしたページは存在しません。ボタンをクリックしてホームページに戻ってください。",
"t_1_1744098801860": "ホームに戻る",
"t_2_1744098804908": "安全注意:これが誤りだと思われる場合は、すぐに管理者に連絡してください",

View File

@@ -1,4 +1,5 @@
{
"t_0_1747647014927": "인증서 알고리즘",
"t_0_1744098811152": "경고: 알 수 없는 영역에 진입했습니다. 방문하려는 페이지가 존재하지 않습니다. 버튼을 클릭하여 홈페이지로 돌아가세요。",
"t_1_1744098801860": "홈으로 돌아가기",
"t_2_1744098804908": "안전 유의사항: 이가 오류라면 즉시 관리자에게 연락하십시오",

View File

@@ -1,4 +1,5 @@
{
"t_0_1747647014927": "Algoritmo de certificado",
"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",

View File

@@ -1,4 +1,5 @@
{
"t_0_1747647014927": "Алгоритм сертификата",
"t_0_1744098811152": "Предупреждение: Вы вошли в неизвестную зону, посещаемая страница не существует, пожалуйста, нажмите кнопку, чтобы вернуться на главную страницу.",
"t_1_1744098801860": "Вернуться на главную",
"t_2_1744098804908": "Совет по безопасности: Если вы считаете, что это ошибка, немедленно свяжитесь с администратором",

View File

@@ -1,4 +1,5 @@
{
"t_0_1747647014927": "证书算法",
"t_0_1744098811152": "警告:您已进入未知区域,所访问的页面不存在,请点击按钮返回首页。",
"t_1_1744098801860": "返回首页",
"t_2_1744098804908": "安全提示:如果您认为这是个错误,请立即联系管理员",

View File

@@ -1,4 +1,5 @@
{
"t_0_1747647014927": "證書算法",
"t_0_1744098811152": "警告:您已進入未知區域,所訪問的頁面不存在,請點擊按鈕返回首頁。",
"t_1_1744098801860": "返回首頁",
"t_2_1744098804908": "安全提示:如果您認為這是個錯誤,請立即聯繫管理員",

View File

@@ -7,7 +7,7 @@ import { $t } from '@locales/index' // 引入 $t
// import ThemeTips from '@baota/naive-ui/components/themeTips'
// 错误图标
const errorIcon = (size: number = 16, color: string = 'var(--n-warning-color)') => {
const errorIcon = (size: number = 16, color: string = '#18181c') => {
return (
<svg width={size} height={size} viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill={color}>
<path
@@ -25,17 +25,10 @@ export default defineComponent({
const router: Router = useRouter()
// 获取主题变量
const cssVar = useThemeCssVar([
'cardColor',
'warningColor',
'textColorSecondary',
'textColorDisabled',
'textColorInverse',
'warningColorHover',
])
const cssVar = useThemeCssVar(['cardColor', 'textColorSecondary', 'textColorDisabled', 'textColorInverse'])
return () => (
<div class="flex flex-col items-center justify-center min-h-screen" style={cssVar.value}>
<div class="flex flex-col items-center justify-center min-h-screen " style={cssVar.value}>
{/* <div class="absolute z-[99] top-0 right-0 p-8 flex w-[120px] justify-between">
<LocalesTips />
<ThemeTips />
@@ -44,17 +37,20 @@ export default defineComponent({
<div
class="text-[8rem] font-bold leading-none mb-4"
style={{
color: 'var(--n-warning-color)',
textShadow: '2px 2px 4px rgba(0, 0, 0, 0.1)',
color: '#18181c',
textShadow: '2px 2px 8px rgba(0,0,0,0.25)',
}}
>
404
</div>
<div class="flex items-center justify-center mb-8">{errorIcon(60)}</div>
<div class="flex items-center justify-center mb-8">{errorIcon(60, '#18181c')}</div>
<div class="text-[1.8rem] mb-8" style={{ color: 'var(--n-text-color-secondary)' }}>
{$t('t_0_1744098811152')}
</div>
<NButton type="warning" onClick={() => router.push('/')}>
<NButton
style={{ backgroundColor: '#18181c', color: '#fff', border: 'none' }}
onClick={() => router.push('/')}
>
{$t('t_1_1744098801860')}
</NButton>
<div class="mt-8 text-[1.3rem]" style={{ color: 'var(--n-text-color-disabled)' }}>

View File

@@ -11,6 +11,7 @@ interface ProductCardProps {
num: number
price: number
discount: number
ipssl?: number
state: number
install_price: number
src_price: number
@@ -72,21 +73,17 @@ export default defineComponent({
props.onBuy(props.product.pid)
}
// 获取品牌图标
// 获取品牌图标
const getBrandIcon = (brand: string) => {
const brandLower = brand.toLowerCase()
if (brandLower.includes('sectigo')) return '/static/icons/sectigo-ico.png'
if (brandLower.includes('positive')) return '/static/icons/positive-ico.png'
if (brandLower.includes('锐安信')) return '/static/icons/ssltrus-ico.png'
if (brandLower.includes("let's encrypt")) return '/static/icons/letsencrypt-icon.svg'
// return '/static/icons/default.png'
if (brandLower.includes('宝塔证书')) return '/static/icons/btssl.svg'
}
// // 显示的功能特点
// const features = computed(() => {
// return ['快速颁发', '支持全部浏览器', isWildcard.value ? '支持所有子域名' : '高安全性', '7*24小时技术支持']
// })
return () => (
<div class="relative border border-gray-200 rounded-[0.8rem] p-[2rem] transition-all duration-300 h-full flex flex-col bg-white shadow-sm hover:shadow-md hover:border-blue-100 hover:-translate-y-[0.2rem]">
{props.product.discount < 1 && (
@@ -107,7 +104,10 @@ export default defineComponent({
<div class="flex-1 w-full">
<h3 class="font-semibold mb-[0.8rem] text-gray-800 leading-tight">{props.product.title}</h3>
<p class="text-[1.3rem] text-gray-500 m-0 leading-relaxed px-[0.8rem]">
{props.product.brand}SSL证书解决方案
{props.product.brand === '宝塔证书'
? '宝塔证书是新国产证书品牌,支持 ECC、RSA 及我国商用密码 SM2 等标准算法,兼容国密浏览器'
: `${props.product.brand}是知名的证书颁发机构提供高质量的SSL证书解决方案`}
</p>
</div>
</div>
@@ -133,13 +133,15 @@ export default defineComponent({
<div class="flex mb-[1rem] leading-relaxed whitespace-nowrap overflow-hidden text-ellipsis text-gray-500">
<span class="font-medium text-gray-500 flex-none w-[9rem]"></span>
<span class="flex-1 text-gray-600 whitespace-nowrap overflow-hidden text-ellipsis">
{isWildcard.value
? isMultiDomain.value
? '*.bt.cn、*.btnode.cn'
: '*.bt.cn'
: isMultiDomain.value
? 'bt.cn、btnode.cn'
: 'www.bt.cn、bt.cn'}
{props.product?.ipssl
? '支持IP SSL证书'
: isWildcard.value
? isMultiDomain.value
? '*.bt.cn、*.btnode.cn'
: '*.bt.cn'
: isMultiDomain.value
? 'bt.cn、btnode.cn'
: 'www.bt.cn、bt.cn'}
</span>
</div>
</div>

View File

@@ -88,6 +88,7 @@ export const useCertApplyStore = defineStore('cert-apply-store', () => {
num: number
price: number
discount: number
ipssl?: number
state: number
install_price: number
src_price: number
@@ -103,64 +104,50 @@ export const useCertApplyStore = defineStore('cert-apply-store', () => {
const products = ref<ProductsType>({
dv: [
{
pid: 8001,
brand: 'Positive',
pid: 0,
brand: '宝塔证书',
type: '域名型(DV)',
add_price: 0,
other_price: 398,
title: 'PositiveSSL 单域名SSL证书',
other_price: 128.66,
title: '宝塔证书 单域名SSL证书',
code: 'comodo-positivessl',
num: 1,
price: 159,
discount: 1,
state: 1,
install_price: 150,
src_price: 159,
},
{
pid: 8002,
brand: 'Positive',
type: '域名型(DV)',
add_price: 98,
other_price: 1194,
title: 'PositiveSSL 多域名SSL证书',
code: 'comodo-positive-multi-domain',
num: 3,
price: 589,
price: 128.66,
discount: 1,
state: 1,
install_price: 200,
src_price: 589,
src_price: 128.66,
},
{
pid: 8008,
brand: 'Positive',
pid: 0,
brand: '宝塔证书',
type: '域名型(DV)',
add_price: 0,
other_price: 2100,
title: 'PositiveSSL 通配符SSL证书',
other_price: 1688,
title: '宝塔证书 通配符SSL证书',
code: 'comodo-positivessl-wildcard',
num: 1,
price: 1289,
price: 1688,
discount: 1,
state: 1,
install_price: 200,
src_price: 1289,
src_price: 1688,
},
{
pid: 8009,
brand: 'Positive',
pid: 0,
brand: '宝塔证书',
type: '域名型(DV)',
add_price: 880,
other_price: 4500,
title: 'PositiveSSL 多域名通配符SSL证书',
code: 'comodo-positive-multi-domain-wildcard',
num: 2,
price: 3789,
add_price: 98,
other_price: 180,
title: '宝塔证书 IP-SSL证书',
code: 'comodo-positive-multi-domain',
num: 1,
price: 180,
discount: 1,
ipssl: 1,
state: 1,
install_price: 200,
src_price: 3789,
src_price: 180,
},
],
ov: [

View File

@@ -107,7 +107,7 @@ export default defineConfig({
},
{
repo: 'https://github.com/allinssl/allinssl.git',
branch: '1.0.2',
branch: '1.0.3',
targetDir: 'allinssl-github',
discardChanges: true,
},

View File

@@ -1,4 +1,4 @@
import { ref, Ref, toRef, effectScope, onScopeDispose, shallowRef, toRefs, watch, isRef } from 'vue'
import { ref, Ref, toRef, effectScope, onScopeDispose, shallowRef, toRefs, isRef } from 'vue'
import {
NForm,
NFormItem,
@@ -46,7 +46,7 @@ import {
type CheckboxGroupProps,
SwitchSlots,
} from 'naive-ui'
import { LeftOutlined, DownOutlined } from '@vicons/antd'
import { DownOutlined, UpOutlined } from '@vicons/antd'
import { translation, TranslationModule, type TranslationLocale } from '../locals/translation'
import type {
FormInstanceWithComponent,
@@ -739,18 +739,13 @@ const useFormMore = (isMore: Ref<boolean>, content?: string) => {
return {
type: 'custom',
render: () => (
<NDivider
class="cursor-pointer w-full"
onClick={() => {
isMore.value = !isMore.value
}}
>
<NDivider class="cursor-pointer w-full !m-[1rem]" onClick={() => (isMore.value = !isMore.value)}>
<div class="flex items-center w-full" style={{ color }}>
<span class="mr-[4px]">
{!isMore.value ? hookT('expand') : hookT('collapse')}
{content || hookT('moreConfig')}
</span>
<NIcon>{isMore.value ? <DownOutlined /> : <LeftOutlined />}</NIcon>
<NIcon>{isMore.value ? <DownOutlined /> : <UpOutlined />}</NIcon>
</div>
</NDivider>
),

View File

@@ -15,11 +15,11 @@ const defaultLight: ThemeTemplate = {
title: '默认亮色主题', // 主题名称
themeOverrides: {
common: {
borderRadius: '0.6rem', // 圆角
primaryColor: '#4caf50', // 主色
primaryColorHover: '#20a53a', // 主色悬停
primaryColorPressed: '#157f3a', // 主色按下
primaryColorSuppl: '#4caf50', // 主色补充
// borderRadius: '0.6rem', // 圆角
// primaryColor: '#4caf50', // 主色
// primaryColorHover: '#20a53a', // 主色悬停
// primaryColorPressed: '#157f3a', // 主色按下
// primaryColorSuppl: '#4caf50', // 主色补充
},
}, // 主题变量
presetsOverrides: presets, // 预设变量
@@ -33,22 +33,22 @@ const defaultDark: ThemeTemplate = {
themeOverrides: {
common: {
// baseColor: '#F1F1F1', // 基础色
primaryColor: '#4caf50', // 主色
primaryColorHover: '#20a53a', // 主色悬停
primaryColorPressed: '#157f3a', // 主色按下
primaryColorSuppl: '#4caf50', // 主色补充
borderRadius: '0.6rem', // 圆角
// primaryColor: '#4caf50', // 主色
// primaryColorHover: '#20a53a', // 主色悬停
// primaryColorPressed: '#157f3a', // 主色按下
// primaryColorSuppl: '#4caf50', // 主色补充
// borderRadius: '0.6rem', // 圆角
},
Popover: {
// color: '#ffffff', // 弹出层背景色
},
Button: {
textColorPrimary: '#ffffff', // 主按钮文本色
textColorHoverPrimary: '#ffffff', // 主按钮文本色悬停
textColorPressedPrimary: '#ffffff', // 主按钮文本色按下
textColorFocusPrimary: '#ffffff', // 主按钮文本色聚焦
},
// Button: {
// textColorPrimary: '#ffffff', // 主按钮文本色
// textColorHoverPrimary: '#ffffff', // 主按钮文本色悬停
// textColorPressedPrimary: '#ffffff', // 主按钮文本色按下
// textColorFocusPrimary: '#ffffff', // 主按钮文本色聚焦
// },
Radio: {
buttonTextColorActive: '#ffffff', // 单选框文本色
},