mirror of
https://github.com/vbenjs/vue-vben-admin.git
synced 2025-08-27 06:40:51 +08:00
feat: support vscode i18n-ally plugin
This commit is contained in:
2
.vscode/extensions.json
vendored
2
.vscode/extensions.json
vendored
@@ -5,8 +5,8 @@
|
|||||||
"stylelint.vscode-stylelint",
|
"stylelint.vscode-stylelint",
|
||||||
"DavidAnson.vscode-markdownlint",
|
"DavidAnson.vscode-markdownlint",
|
||||||
"esbenp.prettier-vscode",
|
"esbenp.prettier-vscode",
|
||||||
"mrmlnc.vscode-scss",
|
|
||||||
"mrmlnc.vscode-less",
|
"mrmlnc.vscode-less",
|
||||||
|
"antfu.i18n-ally",
|
||||||
"cpylua.language-postcss",
|
"cpylua.language-postcss",
|
||||||
"Orta.vscode-jest",
|
"Orta.vscode-jest",
|
||||||
"antfu.iconify",
|
"antfu.iconify",
|
||||||
|
80
.vscode/settings.json
vendored
80
.vscode/settings.json
vendored
@@ -10,14 +10,13 @@
|
|||||||
"editor.smoothScrolling": true,
|
"editor.smoothScrolling": true,
|
||||||
"editor.cursorBlinking": "phase",
|
"editor.cursorBlinking": "phase",
|
||||||
"editor.cursorSmoothCaretAnimation": true,
|
"editor.cursorSmoothCaretAnimation": true,
|
||||||
"editor.detectIndentation": false, // vscode默认启用了根据文件类型自动设置tabsize的选项
|
"editor.detectIndentation": false,
|
||||||
"diffEditor.ignoreTrimWhitespace": false,
|
"diffEditor.ignoreTrimWhitespace": false,
|
||||||
"editor.formatOnPaste": true, //自动格式化粘贴的内容
|
"editor.formatOnPaste": true,
|
||||||
"editor.formatOnSave": true, //保存自动格式化
|
"editor.formatOnSave": true,
|
||||||
"editor.suggestSelection": "first",
|
"editor.suggestSelection": "first",
|
||||||
"editor.trimAutoWhitespace": true,
|
"editor.trimAutoWhitespace": true,
|
||||||
"editor.quickSuggestions": {
|
"editor.quickSuggestions": {
|
||||||
// 快速提示
|
|
||||||
"other": true,
|
"other": true,
|
||||||
"comments": true,
|
"comments": true,
|
||||||
"strings": true
|
"strings": true
|
||||||
@@ -25,41 +24,33 @@
|
|||||||
//===========================================
|
//===========================================
|
||||||
//============= Other =======================
|
//============= Other =======================
|
||||||
//===========================================
|
//===========================================
|
||||||
"breadcrumbs.enabled": true, // 启用/禁用导航路径
|
"breadcrumbs.enabled": true,
|
||||||
"open-in-browser.default": "chrome", // 默认浏览器
|
"open-in-browser.default": "chrome",
|
||||||
//===========================================
|
//===========================================
|
||||||
//============= emmet =======================
|
//============= emmet =======================
|
||||||
//===========================================
|
//===========================================
|
||||||
"emmet.triggerExpansionOnTab": true, // 配置emmet是否启用tab展开缩写
|
"emmet.triggerExpansionOnTab": true,
|
||||||
"emmet.showAbbreviationSuggestions": true,
|
"emmet.showAbbreviationSuggestions": true,
|
||||||
"emmet.showExpandedAbbreviation": "always",
|
"emmet.showExpandedAbbreviation": "always",
|
||||||
"emmet.syntaxProfiles": {
|
"emmet.syntaxProfiles": {
|
||||||
// 配置emmet对文件类型的支持,比如vue后缀文件按照html文件来进行emmet扩写
|
|
||||||
"vue-html": "html",
|
"vue-html": "html",
|
||||||
"vue": "html",
|
"vue": "html",
|
||||||
"javascript": "javascriptreact",
|
"javascript": "javascriptreact",
|
||||||
// xml类型文件默认都是单引号,开启对非单引号的emmet识别
|
|
||||||
"xml": {
|
"xml": {
|
||||||
"attr_quotes": "single"
|
"attr_quotes": "single"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"emmet.includeLanguages": {
|
"emmet.includeLanguages": {
|
||||||
// 在react的jsx中添加对emmet的支持
|
|
||||||
"jsx-sublime-babel-tags": "javascriptreact"
|
"jsx-sublime-babel-tags": "javascriptreact"
|
||||||
},
|
},
|
||||||
//===========================================
|
//===========================================
|
||||||
//============= files =======================
|
//============= files =======================
|
||||||
//===========================================
|
//===========================================
|
||||||
// "files.autoSave": "onWindowChange", // 窗口失去焦点自动保存
|
"files.trimTrailingWhitespace": true,
|
||||||
// "files.autoSaveDelay": 1000, // 自动保存时间
|
|
||||||
"files.trimTrailingWhitespace": true, // 启用后,将在保存文件时剪裁尾随空格。
|
|
||||||
// 文件末尾插入新行
|
|
||||||
"files.insertFinalNewline": true,
|
"files.insertFinalNewline": true,
|
||||||
// 删除文件末尾多余的新行
|
|
||||||
"files.trimFinalNewlines": true,
|
"files.trimFinalNewlines": true,
|
||||||
"files.eol": "\n",
|
"files.eol": "\n",
|
||||||
"search.exclude": {
|
"search.exclude": {
|
||||||
// 搜索排除这些区域
|
|
||||||
"**/node_modules": true,
|
"**/node_modules": true,
|
||||||
"**/*.log": true,
|
"**/*.log": true,
|
||||||
"**/*.log*": true,
|
"**/*.log*": true,
|
||||||
@@ -76,8 +67,6 @@
|
|||||||
"**/tmp": true
|
"**/tmp": true
|
||||||
},
|
},
|
||||||
"files.exclude": {
|
"files.exclude": {
|
||||||
// 排除文件搜索区域,比如node_modules(默认设置已经屏蔽了)
|
|
||||||
// "**/node_modules": true,
|
|
||||||
"**/bower_components": true,
|
"**/bower_components": true,
|
||||||
"**/.idea": true,
|
"**/.idea": true,
|
||||||
"**/yarn.lock": true,
|
"**/yarn.lock": true,
|
||||||
@@ -100,7 +89,6 @@
|
|||||||
"**/yarn.lock": true
|
"**/yarn.lock": true
|
||||||
},
|
},
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
// 配置文件关联,以便启用对应的智能提示,比如wxss使用css
|
|
||||||
"*.vue": "vue",
|
"*.vue": "vue",
|
||||||
"*.wxss": "css"
|
"*.wxss": "css"
|
||||||
},
|
},
|
||||||
@@ -109,13 +97,11 @@
|
|||||||
"css.validate": true,
|
"css.validate": true,
|
||||||
"less.validate": true,
|
"less.validate": true,
|
||||||
"scss.validate": true,
|
"scss.validate": true,
|
||||||
// ↓↓↓↓↓↓↓↓↓↓↓↓↓ 以下为插件设置 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
|
|
||||||
// ↓↓↓↓↓↓↓↓↓↓↓↓↓ 需要安装对应的插件 ↓↓↓↓↓↓↓↓↓↓↓↓
|
|
||||||
// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
|
// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
|
||||||
// ===========================================
|
// ===========================================
|
||||||
// ================ Eslint ===================
|
// ================ Eslint ===================
|
||||||
// ===========================================
|
// ===========================================
|
||||||
"eslint.enable": true, // 是否开启eslint
|
"eslint.enable": true,
|
||||||
"eslint.options": {
|
"eslint.options": {
|
||||||
// 配置
|
// 配置
|
||||||
"plugins": [
|
"plugins": [
|
||||||
@@ -126,53 +112,41 @@
|
|||||||
"typescript"
|
"typescript"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"eslint.autoFixOnSave": true, // 保存自动格式化
|
"eslint.autoFixOnSave": true,
|
||||||
// ===========================================
|
// ===========================================
|
||||||
// ================ Vetur ====================
|
// ================ Vetur ====================
|
||||||
// ===========================================
|
// ===========================================
|
||||||
"vetur.experimental.templateInterpolationService": true,
|
"vetur.experimental.templateInterpolationService": true,
|
||||||
"vetur.format.options.tabSize": 2,
|
"vetur.format.options.tabSize": 2,
|
||||||
"vetur.format.defaultFormatter.html": "js-beautify-html", // 使用js-beautify-html格式化
|
"vetur.format.defaultFormatter.html": "js-beautify-html",
|
||||||
"vetur.format.defaultFormatter.scss": "prettier", // 使用js-beautify-html格式化
|
"vetur.format.defaultFormatter.scss": "prettier",
|
||||||
"vetur.format.defaultFormatter.css": "prettier", // 使用js-beautify-html格式化
|
"vetur.format.defaultFormatter.css": "prettier",
|
||||||
// "vetur.format.defaultFormatter.html": "prettyhtml",
|
|
||||||
"vetur.format.defaultFormatter.ts": "prettier-tslint",
|
"vetur.format.defaultFormatter.ts": "prettier-tslint",
|
||||||
"vetur.format.defaultFormatter.js": "prettier",
|
"vetur.format.defaultFormatter.js": "prettier",
|
||||||
"vetur.languageFeatures.codeActions": false,
|
"vetur.languageFeatures.codeActions": false,
|
||||||
// "vetur.useWorkspaceDependencies": true,
|
|
||||||
"vetur.format.defaultFormatterOptions": {
|
"vetur.format.defaultFormatterOptions": {
|
||||||
"js-beautify-html": {
|
"js-beautify-html": {
|
||||||
// "wrap_attributes": "force-aligned", // 单行
|
"wrap_attributes": "force-expand-multiline"
|
||||||
"wrap_attributes": "force-expand-multiline" // 属性强制折行对齐 多行
|
|
||||||
},
|
},
|
||||||
"prettier": {
|
"prettier": {
|
||||||
"eslintIntegration": true, // 让perttier使用eslint的格式进行检查
|
"eslintIntegration": true,
|
||||||
"arrowParens": "always", // 箭头函数参数括号 默认avoid 可选 avoid | always
|
"arrowParens": "always",
|
||||||
"semi": false, // 使用分号, 默认true
|
"semi": false,
|
||||||
"singleQuote": true // 使用单引号, 默认false(在jsx中配置无效, 默认都是双引号)
|
"singleQuote": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 函数注释
|
|
||||||
//===========================================
|
|
||||||
//============= Code Runner =================
|
|
||||||
//===========================================
|
|
||||||
"javascript.updateImportsOnFileMove.enabled": "never",
|
"javascript.updateImportsOnFileMove.enabled": "never",
|
||||||
"liveServer.settings.donotShowInfoMsg": true,
|
"liveServer.settings.donotShowInfoMsg": true,
|
||||||
"[javascript]": {
|
"terminal.integrated.rendererType": "dom",
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
|
||||||
},
|
|
||||||
"terminal.integrated.rendererType": "dom", //关闭liveserver提示
|
|
||||||
"telemetry.enableCrashReporter": false,
|
"telemetry.enableCrashReporter": false,
|
||||||
"telemetry.enableTelemetry": false,
|
"telemetry.enableTelemetry": false,
|
||||||
"workbench.settings.enableNaturalLanguageSearch": false,
|
"workbench.settings.enableNaturalLanguageSearch": false,
|
||||||
// 引用路径设置
|
|
||||||
"path-intellisense.mappings": {
|
"path-intellisense.mappings": {
|
||||||
"/@/": "${workspaceRoot}/src"
|
"/@/": "${workspaceRoot}/src"
|
||||||
},
|
},
|
||||||
"prettier.requireConfig": true,
|
"prettier.requireConfig": true,
|
||||||
"typescript.updateImportsOnFileMove.enabled": "always",
|
"typescript.updateImportsOnFileMove.enabled": "always",
|
||||||
"workbench.sideBar.location": "left",
|
"workbench.sideBar.location": "left",
|
||||||
|
|
||||||
"[javascriptreact]": {
|
"[javascriptreact]": {
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
},
|
},
|
||||||
@@ -203,8 +177,18 @@
|
|||||||
"[markdown]": {
|
"[markdown]": {
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
},
|
},
|
||||||
|
|
||||||
"editor.codeActionsOnSave": {
|
"editor.codeActionsOnSave": {
|
||||||
"source.fixAll.eslint": true
|
"source.fixAll.eslint": true
|
||||||
}
|
},
|
||||||
}
|
"i18n-ally.localesPaths": [
|
||||||
|
"src/locales/lang",
|
||||||
|
],
|
||||||
|
"i18n-ally.keystyle": "nested",
|
||||||
|
"i18n-ally.sortKeys": true,
|
||||||
|
"i18n-ally.namespace": true,
|
||||||
|
"i18n-ally.pathMatcher":"{locale}/{namespaces}.{ext}",
|
||||||
|
"i18n-ally.enabledParsers": [
|
||||||
|
"ts"
|
||||||
|
],
|
||||||
|
"i18n-ally.sourceLanguage": "zh"
|
||||||
|
}
|
@@ -3,6 +3,7 @@
|
|||||||
### ✨ Features
|
### ✨ Features
|
||||||
|
|
||||||
- 还原 antdv 默认 loading,重构 `Loading` 组件,增加`useLoading`和`v-loading`指令。并增加示例
|
- 还原 antdv 默认 loading,重构 `Loading` 组件,增加`useLoading`和`v-loading`指令。并增加示例
|
||||||
|
- i18n 支持 vscode `i18n-ally`插件
|
||||||
|
|
||||||
### 🎫 Chores
|
### 🎫 Chores
|
||||||
|
|
||||||
|
@@ -29,7 +29,7 @@ export default defineComponent({
|
|||||||
const visibleRef = ref(false);
|
const visibleRef = ref(false);
|
||||||
const propsRef = ref<Partial<Nullable<DrawerProps>>>(null);
|
const propsRef = ref<Partial<Nullable<DrawerProps>>>(null);
|
||||||
|
|
||||||
const { t } = useI18n('component.drawer');
|
const { t } = useI18n();
|
||||||
|
|
||||||
const getMergeProps = computed(
|
const getMergeProps = computed(
|
||||||
(): DrawerProps => {
|
(): DrawerProps => {
|
||||||
@@ -228,7 +228,11 @@ export default defineComponent({
|
|||||||
default: () => (
|
default: () => (
|
||||||
<>
|
<>
|
||||||
<div ref={scrollRef} style={unref(getScrollContentStyle)}>
|
<div ref={scrollRef} style={unref(getScrollContentStyle)}>
|
||||||
<Loading absolute tip={t('loadingText')} loading={unref(getLoading)} />
|
<Loading
|
||||||
|
absolute
|
||||||
|
tip={t('component.drawer.loadingText')}
|
||||||
|
loading={unref(getLoading)}
|
||||||
|
/>
|
||||||
{getSlot(slots)}
|
{getSlot(slots)}
|
||||||
</div>
|
</div>
|
||||||
{renderFooter()}
|
{renderFooter()}
|
||||||
|
@@ -2,7 +2,7 @@ import type { PropType } from 'vue';
|
|||||||
|
|
||||||
import { useI18n } from '/@/hooks/web/useI18n';
|
import { useI18n } from '/@/hooks/web/useI18n';
|
||||||
import { propTypes } from '/@/utils/propTypes';
|
import { propTypes } from '/@/utils/propTypes';
|
||||||
const { t } = useI18n('component.drawer');
|
const { t } = useI18n();
|
||||||
|
|
||||||
export const footerProps = {
|
export const footerProps = {
|
||||||
confirmLoading: propTypes.bool,
|
confirmLoading: propTypes.bool,
|
||||||
@@ -11,13 +11,13 @@ export const footerProps = {
|
|||||||
*/
|
*/
|
||||||
showCancelBtn: propTypes.bool.def(true),
|
showCancelBtn: propTypes.bool.def(true),
|
||||||
cancelButtonProps: Object as PropType<any>,
|
cancelButtonProps: Object as PropType<any>,
|
||||||
cancelText: propTypes.string.def(t('cancelText')),
|
cancelText: propTypes.string.def(t('component.drawer.cancelText')),
|
||||||
/**
|
/**
|
||||||
* @description: Show confirmation button
|
* @description: Show confirmation button
|
||||||
*/
|
*/
|
||||||
showOkBtn: propTypes.bool.def(true),
|
showOkBtn: propTypes.bool.def(true),
|
||||||
okButtonProps: propTypes.any,
|
okButtonProps: propTypes.any,
|
||||||
okText: propTypes.string.def(t('okText')),
|
okText: propTypes.string.def(t('component.drawer.okText')),
|
||||||
okType: propTypes.string.def('primary'),
|
okType: propTypes.string.def('primary'),
|
||||||
showFooter: propTypes.bool,
|
showFooter: propTypes.bool,
|
||||||
footerHeight: {
|
footerHeight: {
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<BasicModal
|
<BasicModal
|
||||||
v-bind="$attrs"
|
v-bind="$attrs"
|
||||||
:title="t('exportModalTitle')"
|
:title="t('component.excel.exportModalTitle')"
|
||||||
@ok="handleOk"
|
@ok="handleOk"
|
||||||
@register="registerModal"
|
@register="registerModal"
|
||||||
>
|
>
|
||||||
@@ -21,19 +21,19 @@
|
|||||||
|
|
||||||
import { useI18n } from '/@/hooks/web/useI18n';
|
import { useI18n } from '/@/hooks/web/useI18n';
|
||||||
|
|
||||||
const { t } = useI18n('component.excel');
|
const { t } = useI18n();
|
||||||
|
|
||||||
const schemas: FormSchema[] = [
|
const schemas: FormSchema[] = [
|
||||||
{
|
{
|
||||||
field: 'filename',
|
field: 'filename',
|
||||||
component: 'Input',
|
component: 'Input',
|
||||||
label: t('fileName'),
|
label: t('component.excel.fileName'),
|
||||||
rules: [{ required: true }],
|
rules: [{ required: true }],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'bookType',
|
field: 'bookType',
|
||||||
component: 'Select',
|
component: 'Select',
|
||||||
label: t('fileType'),
|
label: t('component.excel.fileType'),
|
||||||
defaultValue: 'xlsx',
|
defaultValue: 'xlsx',
|
||||||
rules: [{ required: true }],
|
rules: [{ required: true }],
|
||||||
componentProps: {
|
componentProps: {
|
||||||
|
@@ -9,7 +9,7 @@ import { getSlot } from '/@/utils/helper/tsxHelper';
|
|||||||
import { useI18n } from '/@/hooks/web/useI18n';
|
import { useI18n } from '/@/hooks/web/useI18n';
|
||||||
import { propTypes } from '/@/utils/propTypes';
|
import { propTypes } from '/@/utils/propTypes';
|
||||||
|
|
||||||
const { t } = useI18n('component.form');
|
const { t } = useI18n();
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'BasicFormAction',
|
name: 'BasicFormAction',
|
||||||
@@ -38,14 +38,14 @@ export default defineComponent({
|
|||||||
setup(props, { slots, emit }) {
|
setup(props, { slots, emit }) {
|
||||||
const getResetBtnOptionsRef = computed(() => {
|
const getResetBtnOptionsRef = computed(() => {
|
||||||
return {
|
return {
|
||||||
text: t('resetButton'),
|
text: t('component.form.resetButton'),
|
||||||
...props.resetButtonOptions,
|
...props.resetButtonOptions,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
const getSubmitBtnOptionsRef = computed(() => {
|
const getSubmitBtnOptionsRef = computed(() => {
|
||||||
return {
|
return {
|
||||||
text: t('submitButton'),
|
text: t('component.form.submitButton'),
|
||||||
// htmlType: 'submit',
|
// htmlType: 'submit',
|
||||||
...props.submitButtonOptions,
|
...props.submitButtonOptions,
|
||||||
};
|
};
|
||||||
@@ -77,7 +77,7 @@ export default defineComponent({
|
|||||||
<Button type="default" class="mr-2" onClick={toggleAdvanced}>
|
<Button type="default" class="mr-2" onClick={toggleAdvanced}>
|
||||||
{() => (
|
{() => (
|
||||||
<>
|
<>
|
||||||
{isAdvanced ? t('putAway') : t('unfold')}
|
{isAdvanced ? t('component.form.putAway') : t('component.form.unfold')}
|
||||||
<BasicArrow expand={!isAdvanced} top />
|
<BasicArrow expand={!isAdvanced} top />
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
@@ -47,7 +47,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
setup(props, { slots }) {
|
setup(props, { slots }) {
|
||||||
const { t } = useI18n('component.form');
|
const { t } = useI18n();
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
const itemLabelWidthRef = useItemLabelWidth(toRef(props, 'schema'), toRef(props, 'formProps'));
|
const itemLabelWidthRef = useItemLabelWidth(toRef(props, 'schema'), toRef(props, 'formProps'));
|
||||||
|
|
||||||
@@ -175,7 +175,7 @@ export default defineComponent({
|
|||||||
const characterInx = rules.findIndex((val) => val.max);
|
const characterInx = rules.findIndex((val) => val.max);
|
||||||
if (characterInx !== -1 && !rules[characterInx].validator) {
|
if (characterInx !== -1 && !rules[characterInx].validator) {
|
||||||
rules[characterInx].message =
|
rules[characterInx].message =
|
||||||
rules[characterInx].message || t('maxTip', [rules[characterInx].max]);
|
rules[characterInx].message || t('component.form.maxTip', [rules[characterInx].max]);
|
||||||
}
|
}
|
||||||
return rules;
|
return rules;
|
||||||
}
|
}
|
||||||
|
@@ -1,17 +1,17 @@
|
|||||||
import type { ComponentType } from './types/index';
|
import type { ComponentType } from './types/index';
|
||||||
import { useI18n } from '/@/hooks/web/useI18n';
|
import { useI18n } from '/@/hooks/web/useI18n';
|
||||||
|
|
||||||
const { t } = useI18n('component.form');
|
const { t } = useI18n();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description: 生成placeholder
|
* @description: 生成placeholder
|
||||||
*/
|
*/
|
||||||
export function createPlaceholderMessage(component: ComponentType) {
|
export function createPlaceholderMessage(component: ComponentType) {
|
||||||
if (component.includes('Input') || component.includes('Complete')) {
|
if (component.includes('Input') || component.includes('Complete')) {
|
||||||
return t('input');
|
return t('component.form.input');
|
||||||
}
|
}
|
||||||
if (component.includes('Picker')) {
|
if (component.includes('Picker')) {
|
||||||
return t('choose');
|
return t('component.form.choose');
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
component.includes('Select') ||
|
component.includes('Select') ||
|
||||||
@@ -21,7 +21,7 @@ export function createPlaceholderMessage(component: ComponentType) {
|
|||||||
component.includes('Switch')
|
component.includes('Switch')
|
||||||
) {
|
) {
|
||||||
// return `请选择${label}`;
|
// return `请选择${label}`;
|
||||||
return t('choose');
|
return t('component.form.choose');
|
||||||
}
|
}
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<section class="menu-search-input" @Click="handleClick" :class="searchClass">
|
<section class="menu-search-input" @Click="handleClick" :class="searchClass">
|
||||||
<a-input-search
|
<a-input-search
|
||||||
:placeholder="t('search')"
|
:placeholder="t('component.menu.search')"
|
||||||
class="menu-search-input__search"
|
class="menu-search-input__search"
|
||||||
allowClear
|
allowClear
|
||||||
@change="handleChange"
|
@change="handleChange"
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
setup(props, { emit }) {
|
setup(props, { emit }) {
|
||||||
const { t } = useI18n('component.menu');
|
const { t } = useI18n();
|
||||||
|
|
||||||
const [debounceEmitChange] = useDebounce(emitChange, 200);
|
const [debounceEmitChange] = useDebounce(emitChange, 200);
|
||||||
|
|
||||||
|
@@ -3,15 +3,15 @@ import { ButtonProps } from 'ant-design-vue/es/button/buttonTypes';
|
|||||||
|
|
||||||
import { useI18n } from '/@/hooks/web/useI18n';
|
import { useI18n } from '/@/hooks/web/useI18n';
|
||||||
import { propTypes } from '/@/utils/propTypes';
|
import { propTypes } from '/@/utils/propTypes';
|
||||||
const { t } = useI18n('component.modal');
|
const { t } = useI18n();
|
||||||
|
|
||||||
export const modalProps = {
|
export const modalProps = {
|
||||||
visible: propTypes.bool,
|
visible: propTypes.bool,
|
||||||
// open drag
|
// open drag
|
||||||
draggable: propTypes.bool.def(true),
|
draggable: propTypes.bool.def(true),
|
||||||
centered: propTypes.bool,
|
centered: propTypes.bool,
|
||||||
cancelText: propTypes.string.def(t('cancelText')),
|
cancelText: propTypes.string.def(t('component.modal.cancelText')),
|
||||||
okText: propTypes.string.def(t('okText')),
|
okText: propTypes.string.def(t('component.modal.okText')),
|
||||||
|
|
||||||
closeFunc: Function as PropType<() => Promise<boolean>>,
|
closeFunc: Function as PropType<() => Promise<boolean>>,
|
||||||
};
|
};
|
||||||
|
@@ -4,27 +4,27 @@
|
|||||||
|
|
||||||
<Tooltip placement="top" v-if="getSetting.redo">
|
<Tooltip placement="top" v-if="getSetting.redo">
|
||||||
<template #title>
|
<template #title>
|
||||||
<span>{{ t('settingRedo') }}</span>
|
<span>{{ t('component.table.settingRedo') }}</span>
|
||||||
</template>
|
</template>
|
||||||
<RedoOutlined @click="redo" />
|
<RedoOutlined @click="redo" />
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
|
|
||||||
<Tooltip placement="top" v-if="getSetting.size">
|
<Tooltip placement="top" v-if="getSetting.size">
|
||||||
<template #title>
|
<template #title>
|
||||||
<span>{{ t('settingDens') }}</span>
|
<span>{{ t('component.table.settingDens') }}</span>
|
||||||
</template>
|
</template>
|
||||||
<Dropdown placement="bottomCenter" :trigger="['click']">
|
<Dropdown placement="bottomCenter" :trigger="['click']">
|
||||||
<ColumnHeightOutlined />
|
<ColumnHeightOutlined />
|
||||||
<template #overlay>
|
<template #overlay>
|
||||||
<Menu @click="handleTitleClick" selectable v-model:selectedKeys="selectedKeysRef">
|
<Menu @click="handleTitleClick" selectable v-model:selectedKeys="selectedKeysRef">
|
||||||
<MenuItem key="default">
|
<MenuItem key="default">
|
||||||
<span>{{ t('settingDensDefault') }}</span>
|
<span>{{ t('component.table.settingDensDefault') }}</span>
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
<MenuItem key="middle">
|
<MenuItem key="middle">
|
||||||
<span>{{ t('settingDensMiddle') }}</span>
|
<span>{{ t('component.table.settingDensMiddle') }}</span>
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
<MenuItem key="small">
|
<MenuItem key="small">
|
||||||
<span>{{ t('settingDensSmall') }}</span>
|
<span>{{ t('component.table.settingDensSmall') }}</span>
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
</Menu>
|
</Menu>
|
||||||
</template>
|
</template>
|
||||||
@@ -140,7 +140,7 @@
|
|||||||
defaultCheckList: [],
|
defaultCheckList: [],
|
||||||
});
|
});
|
||||||
|
|
||||||
const { t } = useI18n('component.table');
|
const { t } = useI18n();
|
||||||
|
|
||||||
watchEffect(() => {
|
watchEffect(() => {
|
||||||
const columns = table.getColumns();
|
const columns = table.getColumns();
|
||||||
|
@@ -6,7 +6,7 @@ import { PAGE_SIZE } from '../const';
|
|||||||
import { useProps } from './useProps';
|
import { useProps } from './useProps';
|
||||||
import { useI18n } from '/@/hooks/web/useI18n';
|
import { useI18n } from '/@/hooks/web/useI18n';
|
||||||
|
|
||||||
const { t } = useI18n('component.table');
|
const { t } = useI18n();
|
||||||
export function useColumns(
|
export function useColumns(
|
||||||
refProps: ComputedRef<BasicTableProps>,
|
refProps: ComputedRef<BasicTableProps>,
|
||||||
getPaginationRef: ComputedRef<false | PaginationProps>
|
getPaginationRef: ComputedRef<false | PaginationProps>
|
||||||
@@ -44,7 +44,7 @@ export function useColumns(
|
|||||||
columns.unshift({
|
columns.unshift({
|
||||||
flag: 'INDEX',
|
flag: 'INDEX',
|
||||||
width: 50,
|
width: 50,
|
||||||
title: t('index'),
|
title: t('component.table.index'),
|
||||||
align: 'center',
|
align: 'center',
|
||||||
customRender: ({ index }) => {
|
customRender: ({ index }) => {
|
||||||
const getPagination = unref(getPaginationRef);
|
const getPagination = unref(getPaginationRef);
|
||||||
|
@@ -10,7 +10,7 @@ import { PAGE_SIZE, PAGE_SIZE_OPTIONS } from '../const';
|
|||||||
import { useProps } from './useProps';
|
import { useProps } from './useProps';
|
||||||
import { useI18n } from '/@/hooks/web/useI18n';
|
import { useI18n } from '/@/hooks/web/useI18n';
|
||||||
|
|
||||||
const { t } = useI18n('component.table');
|
const { t } = useI18n();
|
||||||
export function usePagination(refProps: ComputedRef<BasicTableProps>) {
|
export function usePagination(refProps: ComputedRef<BasicTableProps>) {
|
||||||
const configRef = ref<PaginationProps>({});
|
const configRef = ref<PaginationProps>({});
|
||||||
const { propsRef } = useProps(refProps);
|
const { propsRef } = useProps(refProps);
|
||||||
@@ -25,7 +25,7 @@ export function usePagination(refProps: ComputedRef<BasicTableProps>) {
|
|||||||
pageSize: PAGE_SIZE,
|
pageSize: PAGE_SIZE,
|
||||||
size: 'small',
|
size: 'small',
|
||||||
defaultPageSize: PAGE_SIZE,
|
defaultPageSize: PAGE_SIZE,
|
||||||
showTotal: (total) => t('total', { total }),
|
showTotal: (total) => t('component.table.total', { total }),
|
||||||
showSizeChanger: true,
|
showSizeChanger: true,
|
||||||
pageSizeOptions: PAGE_SIZE_OPTIONS,
|
pageSizeOptions: PAGE_SIZE_OPTIONS,
|
||||||
itemRender: ({ page, type, originalElement }) => {
|
itemRender: ({ page, type, originalElement }) => {
|
||||||
|
@@ -2,11 +2,11 @@
|
|||||||
<div>
|
<div>
|
||||||
<a-button-group>
|
<a-button-group>
|
||||||
<a-button type="primary" @click="openUploadModal" preIcon="ant-design:cloud-upload-outlined">
|
<a-button type="primary" @click="openUploadModal" preIcon="ant-design:cloud-upload-outlined">
|
||||||
{{ t('upload') }}
|
{{ t('component.upload.upload') }}
|
||||||
</a-button>
|
</a-button>
|
||||||
<Tooltip placement="bottom" v-if="showPreview">
|
<Tooltip placement="bottom" v-if="showPreview">
|
||||||
<template #title>
|
<template #title>
|
||||||
{{ t('uploaded') }}
|
{{ t('component.upload.uploaded') }}
|
||||||
<template v-if="fileListRef.length">{{ fileListRef.length }}</template>
|
<template v-if="fileListRef.length">{{ fileListRef.length }}</template>
|
||||||
</template>
|
</template>
|
||||||
<a-button @click="openPreviewModal">
|
<a-button @click="openPreviewModal">
|
||||||
@@ -46,7 +46,7 @@
|
|||||||
components: { UploadModal, UploadPreviewModal, Icon, Tooltip },
|
components: { UploadModal, UploadPreviewModal, Icon, Tooltip },
|
||||||
props: uploadContainerProps,
|
props: uploadContainerProps,
|
||||||
setup(props, { emit, attrs }) {
|
setup(props, { emit, attrs }) {
|
||||||
const { t } = useI18n('component.upload');
|
const { t } = useI18n();
|
||||||
// 上传modal
|
// 上传modal
|
||||||
const [registerUploadModal, { openModal: openUploadModal }] = useModal();
|
const [registerUploadModal, { openModal: openUploadModal }] = useModal();
|
||||||
|
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<BasicModal
|
<BasicModal
|
||||||
width="800px"
|
width="800px"
|
||||||
:title="t('upload')"
|
:title="t('component.upload.upload')"
|
||||||
:okText="t('save')"
|
:okText="t('component.upload.save')"
|
||||||
v-bind="$attrs"
|
v-bind="$attrs"
|
||||||
@register="register"
|
@register="register"
|
||||||
@ok="handleOk"
|
@ok="handleOk"
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
:before-upload="beforeUpload"
|
:before-upload="beforeUpload"
|
||||||
class="upload-modal-toolbar__btn"
|
class="upload-modal-toolbar__btn"
|
||||||
>
|
>
|
||||||
<a-button type="primary"> {{ t('choose') }} </a-button>
|
<a-button type="primary"> {{ t('component.upload.choose') }} </a-button>
|
||||||
</Upload>
|
</Upload>
|
||||||
</div>
|
</div>
|
||||||
<FileList :dataSource="fileListRef" :columns="columns" :actionColumn="actionColumn" />
|
<FileList :dataSource="fileListRef" :columns="columns" :actionColumn="actionColumn" />
|
||||||
@@ -64,7 +64,7 @@
|
|||||||
props: basicProps,
|
props: basicProps,
|
||||||
setup(props, { emit }) {
|
setup(props, { emit }) {
|
||||||
// 是否正在上传
|
// 是否正在上传
|
||||||
const { t } = useI18n('component.upload');
|
const { t } = useI18n();
|
||||||
|
|
||||||
const isUploadingRef = ref(false);
|
const isUploadingRef = ref(false);
|
||||||
const fileListRef = ref<FileItem[]>([]);
|
const fileListRef = ref<FileItem[]>([]);
|
||||||
@@ -105,10 +105,10 @@
|
|||||||
(item) => item.status === UploadResultStatus.ERROR
|
(item) => item.status === UploadResultStatus.ERROR
|
||||||
);
|
);
|
||||||
return isUploadingRef.value
|
return isUploadingRef.value
|
||||||
? t('uploading')
|
? t('component.upload.uploading')
|
||||||
: someError
|
: someError
|
||||||
? t('reUploadFailed')
|
? t('component.upload.reUploadFailed')
|
||||||
: t('startUpload');
|
: t('component.upload.startUpload');
|
||||||
});
|
});
|
||||||
|
|
||||||
// 上传前校验
|
// 上传前校验
|
||||||
@@ -119,13 +119,13 @@
|
|||||||
|
|
||||||
// 设置最大值,则判断
|
// 设置最大值,则判断
|
||||||
if (maxSize && file.size / 1024 / 1024 >= maxSize) {
|
if (maxSize && file.size / 1024 / 1024 >= maxSize) {
|
||||||
createMessage.error(t('maxSizeMultiple', [maxSize]));
|
createMessage.error(t('component.upload.maxSizeMultiple', [maxSize]));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置类型,则判断
|
// 设置类型,则判断
|
||||||
if (accept.length > 0 && !checkFileType(file, accept)) {
|
if (accept.length > 0 && !checkFileType(file, accept)) {
|
||||||
createMessage.error!(t('acceptUpload', [accept.join(',')]));
|
createMessage.error!(t('acomponent.upload.cceptUpload', [accept.join(',')]));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
const commonItem = {
|
const commonItem = {
|
||||||
@@ -206,7 +206,7 @@
|
|||||||
async function handleStartUpload() {
|
async function handleStartUpload() {
|
||||||
const { maxNumber } = props;
|
const { maxNumber } = props;
|
||||||
if (fileListRef.value.length > maxNumber) {
|
if (fileListRef.value.length > maxNumber) {
|
||||||
return createMessage.warning(t('maxNumber', [maxNumber]));
|
return createMessage.warning(t('component.upload.maxNumber', [maxNumber]));
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
isUploadingRef.value = true;
|
isUploadingRef.value = true;
|
||||||
@@ -233,10 +233,10 @@
|
|||||||
const { maxNumber } = props;
|
const { maxNumber } = props;
|
||||||
|
|
||||||
if (fileListRef.value.length > maxNumber) {
|
if (fileListRef.value.length > maxNumber) {
|
||||||
return createMessage.warning(t('maxNumber', [maxNumber]));
|
return createMessage.warning(t('component.upload.maxNumber', [maxNumber]));
|
||||||
}
|
}
|
||||||
if (isUploadingRef.value) {
|
if (isUploadingRef.value) {
|
||||||
return createMessage.warning(t('saveWarn'));
|
return createMessage.warning(t('component.upload.saveWarn'));
|
||||||
}
|
}
|
||||||
const fileList: string[] = [];
|
const fileList: string[] = [];
|
||||||
|
|
||||||
@@ -248,7 +248,7 @@
|
|||||||
}
|
}
|
||||||
// 存在一个上传成功的即可保存
|
// 存在一个上传成功的即可保存
|
||||||
if (fileList.length <= 0) {
|
if (fileList.length <= 0) {
|
||||||
return createMessage.warning(t('saveError'));
|
return createMessage.warning(t('component.upload.saveError'));
|
||||||
}
|
}
|
||||||
fileListRef.value = [];
|
fileListRef.value = [];
|
||||||
closeModal();
|
closeModal();
|
||||||
@@ -261,7 +261,7 @@
|
|||||||
fileListRef.value = [];
|
fileListRef.value = [];
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
createMessage.warning(t('uploadWait'));
|
createMessage.warning(t('component.upload.uploadWait'));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<BasicModal
|
<BasicModal
|
||||||
width="800px"
|
width="800px"
|
||||||
:title="t('preview')"
|
:title="t('component.upload.preview')"
|
||||||
wrapClassName="upload-preview-modal"
|
wrapClassName="upload-preview-modal"
|
||||||
v-bind="$attrs"
|
v-bind="$attrs"
|
||||||
@register="register"
|
@register="register"
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
props: previewProps,
|
props: previewProps,
|
||||||
setup(props, { emit }) {
|
setup(props, { emit }) {
|
||||||
const [register, { closeModal }] = useModalInner();
|
const [register, { closeModal }] = useModalInner();
|
||||||
const { t } = useI18n('component.upload');
|
const { t } = useI18n();
|
||||||
|
|
||||||
const fileListRef = ref<PreviewFileItem[]>([]);
|
const fileListRef = ref<PreviewFileItem[]>([]);
|
||||||
watch(
|
watch(
|
||||||
|
@@ -7,14 +7,14 @@ import { Progress, Tag } from 'ant-design-vue';
|
|||||||
import TableAction from '/@/components/Table/src/components/TableAction';
|
import TableAction from '/@/components/Table/src/components/TableAction';
|
||||||
|
|
||||||
import { useI18n } from '/@/hooks/web/useI18n';
|
import { useI18n } from '/@/hooks/web/useI18n';
|
||||||
const { t } = useI18n('component.upload');
|
const { t } = useI18n();
|
||||||
|
|
||||||
// 文件上传列表
|
// 文件上传列表
|
||||||
export function createTableColumns(): BasicColumn[] {
|
export function createTableColumns(): BasicColumn[] {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
dataIndex: 'thumbUrl',
|
dataIndex: 'thumbUrl',
|
||||||
title: t('legend'),
|
title: t('component.upload.legend'),
|
||||||
width: 100,
|
width: 100,
|
||||||
customRender: ({ record }) => {
|
customRender: ({ record }) => {
|
||||||
const { thumbUrl, type } = (record as FileItem) || {};
|
const { thumbUrl, type } = (record as FileItem) || {};
|
||||||
@@ -23,7 +23,7 @@ export function createTableColumns(): BasicColumn[] {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
dataIndex: 'name',
|
dataIndex: 'name',
|
||||||
title: t('fileName'),
|
title: t('component.upload.fileName'),
|
||||||
align: 'left',
|
align: 'left',
|
||||||
customRender: ({ text, record }) => {
|
customRender: ({ text, record }) => {
|
||||||
const { percent, status: uploadStatus } = (record as FileItem) || {};
|
const { percent, status: uploadStatus } = (record as FileItem) || {};
|
||||||
@@ -47,7 +47,7 @@ export function createTableColumns(): BasicColumn[] {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
dataIndex: 'size',
|
dataIndex: 'size',
|
||||||
title: t('fileSize'),
|
title: t('component.upload.fileSize'),
|
||||||
width: 100,
|
width: 100,
|
||||||
customRender: ({ text = 0 }) => {
|
customRender: ({ text = 0 }) => {
|
||||||
return text && (text / 1024).toFixed(2) + 'KB';
|
return text && (text / 1024).toFixed(2) + 'KB';
|
||||||
@@ -60,15 +60,15 @@ export function createTableColumns(): BasicColumn[] {
|
|||||||
// },
|
// },
|
||||||
{
|
{
|
||||||
dataIndex: 'status',
|
dataIndex: 'status',
|
||||||
title: t('fileStatue'),
|
title: t('component.upload.fileStatue'),
|
||||||
width: 100,
|
width: 100,
|
||||||
customRender: ({ text }) => {
|
customRender: ({ text }) => {
|
||||||
if (text === UploadResultStatus.SUCCESS) {
|
if (text === UploadResultStatus.SUCCESS) {
|
||||||
return <Tag color="green">{() => t('uploadSuccess')}</Tag>;
|
return <Tag color="green">{() => t('component.upload.uploadSuccess')}</Tag>;
|
||||||
} else if (text === UploadResultStatus.ERROR) {
|
} else if (text === UploadResultStatus.ERROR) {
|
||||||
return <Tag color="red">{() => t('uploadError')}</Tag>;
|
return <Tag color="red">{() => t('component.upload.uploadError')}</Tag>;
|
||||||
} else if (text === UploadResultStatus.UPLOADING) {
|
} else if (text === UploadResultStatus.UPLOADING) {
|
||||||
return <Tag color="blue">{() => t('uploading')}</Tag>;
|
return <Tag color="blue">{() => t('component.upload.uploading')}</Tag>;
|
||||||
}
|
}
|
||||||
|
|
||||||
return text;
|
return text;
|
||||||
@@ -79,20 +79,20 @@ export function createTableColumns(): BasicColumn[] {
|
|||||||
export function createActionColumn(handleRemove: Function, handlePreview: Function): BasicColumn {
|
export function createActionColumn(handleRemove: Function, handlePreview: Function): BasicColumn {
|
||||||
return {
|
return {
|
||||||
width: 120,
|
width: 120,
|
||||||
title: t('operating'),
|
title: t('component.upload.operating'),
|
||||||
dataIndex: 'action',
|
dataIndex: 'action',
|
||||||
fixed: false,
|
fixed: false,
|
||||||
customRender: ({ record }) => {
|
customRender: ({ record }) => {
|
||||||
const actions: ActionItem[] = [
|
const actions: ActionItem[] = [
|
||||||
{
|
{
|
||||||
label: t('del'),
|
label: t('component.upload.del'),
|
||||||
color: 'error',
|
color: 'error',
|
||||||
onClick: handleRemove.bind(null, record),
|
onClick: handleRemove.bind(null, record),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
if (checkImgType(record)) {
|
if (checkImgType(record)) {
|
||||||
actions.unshift({
|
actions.unshift({
|
||||||
label: t('preview'),
|
label: t('component.upload.preview'),
|
||||||
onClick: handlePreview.bind(null, record),
|
onClick: handlePreview.bind(null, record),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -105,7 +105,7 @@ export function createPreviewColumns(): BasicColumn[] {
|
|||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
dataIndex: 'url',
|
dataIndex: 'url',
|
||||||
title: t('legend'),
|
title: t('component.upload.legend'),
|
||||||
width: 100,
|
width: 100,
|
||||||
customRender: ({ record }) => {
|
customRender: ({ record }) => {
|
||||||
const { url, type } = (record as PreviewFileItem) || {};
|
const { url, type } = (record as PreviewFileItem) || {};
|
||||||
@@ -116,7 +116,7 @@ export function createPreviewColumns(): BasicColumn[] {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
dataIndex: 'name',
|
dataIndex: 'name',
|
||||||
title: t('fileName'),
|
title: t('component.upload.fileName'),
|
||||||
align: 'left',
|
align: 'left',
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
@@ -133,7 +133,7 @@ export function createPreviewActionColumn({
|
|||||||
}): BasicColumn {
|
}): BasicColumn {
|
||||||
return {
|
return {
|
||||||
width: 160,
|
width: 160,
|
||||||
title: t('operating'),
|
title: t('component.upload.operating'),
|
||||||
dataIndex: 'action',
|
dataIndex: 'action',
|
||||||
fixed: false,
|
fixed: false,
|
||||||
customRender: ({ record }) => {
|
customRender: ({ record }) => {
|
||||||
@@ -141,18 +141,18 @@ export function createPreviewActionColumn({
|
|||||||
|
|
||||||
const actions: ActionItem[] = [
|
const actions: ActionItem[] = [
|
||||||
{
|
{
|
||||||
label: t('del'),
|
label: t('component.upload.del'),
|
||||||
color: 'error',
|
color: 'error',
|
||||||
onClick: handleRemove.bind(null, record),
|
onClick: handleRemove.bind(null, record),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t('download'),
|
label: t('component.upload.download'),
|
||||||
onClick: handleDownload.bind(null, record),
|
onClick: handleDownload.bind(null, record),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
if (isImgTypeByName(url)) {
|
if (isImgTypeByName(url)) {
|
||||||
actions.unshift({
|
actions.unshift({
|
||||||
label: t('preview'),
|
label: t('component.upload.preview'),
|
||||||
onClick: handlePreview.bind(null, record),
|
onClick: handlePreview.bind(null, record),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
import { Ref, unref, computed } from 'vue';
|
import { Ref, unref, computed } from 'vue';
|
||||||
import { useI18n } from '/@/hooks/web/useI18n';
|
import { useI18n } from '/@/hooks/web/useI18n';
|
||||||
const { t } = useI18n('component.upload');
|
const { t } = useI18n();
|
||||||
export function useUploadType({
|
export function useUploadType({
|
||||||
acceptRef,
|
acceptRef,
|
||||||
// uploadTypeRef,
|
// uploadTypeRef,
|
||||||
@@ -38,17 +38,17 @@ export function useUploadType({
|
|||||||
|
|
||||||
const accept = unref(acceptRef);
|
const accept = unref(acceptRef);
|
||||||
if (accept.length > 0) {
|
if (accept.length > 0) {
|
||||||
helpTexts.push(t('accept', [accept.join(',')]));
|
helpTexts.push(t('component.upload.accept', [accept.join(',')]));
|
||||||
}
|
}
|
||||||
|
|
||||||
const maxSize = unref(maxSizeRef);
|
const maxSize = unref(maxSizeRef);
|
||||||
if (maxSize) {
|
if (maxSize) {
|
||||||
helpTexts.push(t('maxSize', [maxSize]));
|
helpTexts.push(t('component.upload.maxSize', [maxSize]));
|
||||||
}
|
}
|
||||||
|
|
||||||
const maxNumber = unref(maxNumberRef);
|
const maxNumber = unref(maxNumberRef);
|
||||||
if (maxNumber && maxNumber !== Infinity) {
|
if (maxNumber && maxNumber !== Infinity) {
|
||||||
helpTexts.push(t('maxNumber', [maxNumber]));
|
helpTexts.push(t('component.upload.maxNumber', [maxNumber]));
|
||||||
}
|
}
|
||||||
return helpTexts.join(',');
|
return helpTexts.join(',');
|
||||||
});
|
});
|
||||||
|
@@ -30,7 +30,7 @@ export default defineComponent({
|
|||||||
endTime: 0,
|
endTime: 0,
|
||||||
draged: false,
|
draged: false,
|
||||||
});
|
});
|
||||||
const { t } = useI18n('component.verify');
|
const { t } = useI18n();
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => state.isPassing,
|
() => state.isPassing,
|
||||||
@@ -146,7 +146,9 @@ export default defineComponent({
|
|||||||
/>
|
/>
|
||||||
{state.showTip && (
|
{state.showTip && (
|
||||||
<span class={[`ir-dv-img__tip`, state.isPassing ? 'success' : 'error']}>
|
<span class={[`ir-dv-img__tip`, state.isPassing ? 'success' : 'error']}>
|
||||||
{state.isPassing ? t('time', { time: time.toFixed(1) }) : t('error')}
|
{state.isPassing
|
||||||
|
? t('component.verify.time', { time: time.toFixed(1) })
|
||||||
|
: t('component.verify.error')}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
{!state.showTip && !state.draged && (
|
{!state.showTip && !state.draged && (
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import type { PropType } from 'vue';
|
import type { PropType } from 'vue';
|
||||||
import { useI18n } from '/@/hooks/web/useI18n';
|
import { useI18n } from '/@/hooks/web/useI18n';
|
||||||
|
|
||||||
const { t } = useI18n('component.verify');
|
const { t } = useI18n();
|
||||||
export const basicProps = {
|
export const basicProps = {
|
||||||
value: {
|
value: {
|
||||||
type: Boolean as PropType<boolean>,
|
type: Boolean as PropType<boolean>,
|
||||||
@@ -15,11 +15,11 @@ export const basicProps = {
|
|||||||
|
|
||||||
text: {
|
text: {
|
||||||
type: [String] as PropType<string>,
|
type: [String] as PropType<string>,
|
||||||
default: t('dragText'),
|
default: t('component.verify.dragText'),
|
||||||
},
|
},
|
||||||
successText: {
|
successText: {
|
||||||
type: [String] as PropType<string>,
|
type: [String] as PropType<string>,
|
||||||
default: t('successText'),
|
default: t('component.verify.successText'),
|
||||||
},
|
},
|
||||||
height: {
|
height: {
|
||||||
type: [Number, String] as PropType<number | string>,
|
type: [Number, String] as PropType<number | string>,
|
||||||
|
@@ -13,16 +13,16 @@ import { useI18n } from '/@/hooks/web/useI18n';
|
|||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'LayoutContent',
|
name: 'LayoutContent',
|
||||||
setup() {
|
setup() {
|
||||||
const { t } = useI18n('layout.footer');
|
const { t } = useI18n();
|
||||||
return () => {
|
return () => {
|
||||||
return (
|
return (
|
||||||
<Layout.Footer class="layout-footer">
|
<Layout.Footer class="layout-footer">
|
||||||
{() => (
|
{() => (
|
||||||
<>
|
<>
|
||||||
<div class="layout-footer__links">
|
<div class="layout-footer__links">
|
||||||
<a onClick={() => openWindow(SITE_URL)}>{t('onlinePreview')}</a>
|
<a onClick={() => openWindow(SITE_URL)}>{t('layout.footer.onlinePreview')}</a>
|
||||||
<GithubFilled onClick={() => openWindow(GITHUB_URL)} class="github" />
|
<GithubFilled onClick={() => openWindow(GITHUB_URL)} class="github" />
|
||||||
<a onClick={() => openWindow(DOC_URL)}>{t('onlineDocument')}</a>
|
<a onClick={() => openWindow(DOC_URL)}>{t('layout.footer.onlineDocument')}</a>
|
||||||
</div>
|
</div>
|
||||||
<div>Copyright ©2020 Vben Admin</div>
|
<div>Copyright ©2020 Vben Admin</div>
|
||||||
</>
|
</>
|
||||||
|
@@ -66,7 +66,7 @@ export default defineComponent({
|
|||||||
const logoWidthRef = ref(200);
|
const logoWidthRef = ref(200);
|
||||||
const logoRef = ref<ComponentRef>(null);
|
const logoRef = ref<ComponentRef>(null);
|
||||||
const { refreshPage } = useTabs();
|
const { refreshPage } = useTabs();
|
||||||
const { t } = useI18n('layout.header');
|
const { t } = useI18n();
|
||||||
|
|
||||||
const { getShowTopMenu, getShowHeaderTrigger, getSplit, getTopMenuAlign } = useMenuSetting();
|
const { getShowTopMenu, getShowHeaderTrigger, getSplit, getTopMenuAlign } = useMenuSetting();
|
||||||
|
|
||||||
|
@@ -44,7 +44,7 @@ const MenuItem: FunctionalComponent<MenuItemProps> = (props) => {
|
|||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'UserDropdown',
|
name: 'UserDropdown',
|
||||||
setup() {
|
setup() {
|
||||||
const { t } = useI18n('layout.header');
|
const { t } = useI18n();
|
||||||
const { getShowDoc } = useHeaderSetting();
|
const { getShowDoc } = useHeaderSetting();
|
||||||
|
|
||||||
const getUserInfo = computed(() => {
|
const getUserInfo = computed(() => {
|
||||||
@@ -91,12 +91,18 @@ export default defineComponent({
|
|||||||
<Menu onClick={handleMenuClick}>
|
<Menu onClick={handleMenuClick}>
|
||||||
{() => (
|
{() => (
|
||||||
<>
|
<>
|
||||||
{showDoc && <MenuItem key="doc" text={t('dropdownItemDoc')} icon="gg:loadbar-doc" />}
|
{showDoc && (
|
||||||
|
<MenuItem
|
||||||
|
key="doc"
|
||||||
|
text={t('layout.header.dropdownItemDoc')}
|
||||||
|
icon="gg:loadbar-doc"
|
||||||
|
/>
|
||||||
|
)}
|
||||||
{/* @ts-ignore */}
|
{/* @ts-ignore */}
|
||||||
{showDoc && <Menu.Divider />}
|
{showDoc && <Menu.Divider />}
|
||||||
<MenuItem
|
<MenuItem
|
||||||
key="loginOut"
|
key="loginOut"
|
||||||
text={t('dropdownItemLoginOut')}
|
text={t('layout.header.dropdownItemLoginOut')}
|
||||||
icon="ant-design:poweroff-outlined"
|
icon="ant-design:poweroff-outlined"
|
||||||
/>
|
/>
|
||||||
</>
|
</>
|
||||||
|
@@ -15,7 +15,7 @@ const prefixCls = 'lock-modal';
|
|||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'LockModal',
|
name: 'LockModal',
|
||||||
setup(_, { attrs }) {
|
setup(_, { attrs }) {
|
||||||
const { t } = useI18n('layout.header');
|
const { t } = useI18n();
|
||||||
const [register, { closeModal }] = useModalInner();
|
const [register, { closeModal }] = useModalInner();
|
||||||
|
|
||||||
const [registerForm, { validateFields, resetFields }] = useForm({
|
const [registerForm, { validateFields, resetFields }] = useForm({
|
||||||
@@ -23,7 +23,7 @@ export default defineComponent({
|
|||||||
schemas: [
|
schemas: [
|
||||||
{
|
{
|
||||||
field: 'password',
|
field: 'password',
|
||||||
label: t('lockScreenPassword'),
|
label: t('layout.header.lockScreenPassword'),
|
||||||
component: 'InputPassword',
|
component: 'InputPassword',
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
@@ -53,7 +53,7 @@ export default defineComponent({
|
|||||||
return () => (
|
return () => (
|
||||||
<BasicModal
|
<BasicModal
|
||||||
footer={null}
|
footer={null}
|
||||||
title={t('lockScreen')}
|
title={t('layout.header.lockScreen')}
|
||||||
{...attrs}
|
{...attrs}
|
||||||
class={prefixCls}
|
class={prefixCls}
|
||||||
onRegister={register}
|
onRegister={register}
|
||||||
@@ -69,10 +69,10 @@ export default defineComponent({
|
|||||||
|
|
||||||
<div class={`${prefixCls}__footer`}>
|
<div class={`${prefixCls}__footer`}>
|
||||||
<Button type="primary" block class="mt-2" onClick={lock}>
|
<Button type="primary" block class="mt-2" onClick={lock}>
|
||||||
{() => t('lockScreenBtn')}
|
{() => t('layout.header.lockScreenBtn')}
|
||||||
</Button>
|
</Button>
|
||||||
<Button block class="mt-2" onClick={lock.bind(null, false)}>
|
<Button block class="mt-2" onClick={lock.bind(null, false)}>
|
||||||
{() => t('notLockScreenPassword')}
|
{() => t('layout.header.notLockScreenPassword')}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -59,7 +59,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
setup(props) {
|
setup(props) {
|
||||||
const { t } = useI18n('layout.multipleTab');
|
const { t } = useI18n();
|
||||||
const { getShowMenu } = useMenuSetting();
|
const { getShowMenu } = useMenuSetting();
|
||||||
const { getShowHeader } = useHeaderSetting();
|
const { getShowHeader } = useHeaderSetting();
|
||||||
const { getShowQuick } = useMultipleTabSetting();
|
const { getShowQuick } = useMultipleTabSetting();
|
||||||
@@ -76,7 +76,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
const scaleAction = getScaleAction(
|
const scaleAction = getScaleAction(
|
||||||
unref(getIsScale) ? t('putAway') : t('unfold'),
|
unref(getIsScale) ? t('layout.multipleTab.putAway') : t('layout.multipleTab.unfold'),
|
||||||
unref(getIsScale)
|
unref(getIsScale)
|
||||||
);
|
);
|
||||||
const dropMenuList = unref(getDropMenuList) || [];
|
const dropMenuList = unref(getDropMenuList) || [];
|
||||||
|
@@ -4,7 +4,7 @@ import type { TabItem } from '/@/store/modules/tab';
|
|||||||
|
|
||||||
import { useI18n } from '/@/hooks/web/useI18n';
|
import { useI18n } from '/@/hooks/web/useI18n';
|
||||||
|
|
||||||
const { t } = useI18n('layout.multipleTab');
|
const { t } = useI18n();
|
||||||
|
|
||||||
export enum TabContentEnum {
|
export enum TabContentEnum {
|
||||||
TAB_TYPE,
|
TAB_TYPE,
|
||||||
@@ -41,40 +41,40 @@ export function getActions() {
|
|||||||
const REFRESH_PAGE: DropMenu = {
|
const REFRESH_PAGE: DropMenu = {
|
||||||
icon: 'ant-design:reload-outlined',
|
icon: 'ant-design:reload-outlined',
|
||||||
event: MenuEventEnum.REFRESH_PAGE,
|
event: MenuEventEnum.REFRESH_PAGE,
|
||||||
text: t('redo'),
|
text: t('layout.multipleTab.redo'),
|
||||||
disabled: false,
|
disabled: false,
|
||||||
};
|
};
|
||||||
const CLOSE_CURRENT: DropMenu = {
|
const CLOSE_CURRENT: DropMenu = {
|
||||||
icon: 'ant-design:close-outlined',
|
icon: 'ant-design:close-outlined',
|
||||||
event: MenuEventEnum.CLOSE_CURRENT,
|
event: MenuEventEnum.CLOSE_CURRENT,
|
||||||
text: t('close'),
|
text: t('layout.multipleTab.close'),
|
||||||
disabled: false,
|
disabled: false,
|
||||||
divider: true,
|
divider: true,
|
||||||
};
|
};
|
||||||
const CLOSE_LEFT: DropMenu = {
|
const CLOSE_LEFT: DropMenu = {
|
||||||
icon: 'ant-design:pic-left-outlined',
|
icon: 'ant-design:pic-left-outlined',
|
||||||
event: MenuEventEnum.CLOSE_LEFT,
|
event: MenuEventEnum.CLOSE_LEFT,
|
||||||
text: t('closeLeft'),
|
text: t('layout.multipleTab.closeLeft'),
|
||||||
disabled: false,
|
disabled: false,
|
||||||
divider: false,
|
divider: false,
|
||||||
};
|
};
|
||||||
const CLOSE_RIGHT: DropMenu = {
|
const CLOSE_RIGHT: DropMenu = {
|
||||||
icon: 'ant-design:pic-right-outlined',
|
icon: 'ant-design:pic-right-outlined',
|
||||||
event: MenuEventEnum.CLOSE_RIGHT,
|
event: MenuEventEnum.CLOSE_RIGHT,
|
||||||
text: t('closeRight'),
|
text: t('layout.multipleTab.closeRight'),
|
||||||
disabled: false,
|
disabled: false,
|
||||||
divider: true,
|
divider: true,
|
||||||
};
|
};
|
||||||
const CLOSE_OTHER: DropMenu = {
|
const CLOSE_OTHER: DropMenu = {
|
||||||
icon: 'ant-design:pic-center-outlined',
|
icon: 'ant-design:pic-center-outlined',
|
||||||
event: MenuEventEnum.CLOSE_OTHER,
|
event: MenuEventEnum.CLOSE_OTHER,
|
||||||
text: t('closeOther'),
|
text: t('layout.multipleTab.closeOther'),
|
||||||
disabled: false,
|
disabled: false,
|
||||||
};
|
};
|
||||||
const CLOSE_ALL: DropMenu = {
|
const CLOSE_ALL: DropMenu = {
|
||||||
icon: 'ant-design:line-outlined',
|
icon: 'ant-design:line-outlined',
|
||||||
event: MenuEventEnum.CLOSE_ALL,
|
event: MenuEventEnum.CLOSE_ALL,
|
||||||
text: t('closeAll'),
|
text: t('layout.multipleTab.closeAll'),
|
||||||
disabled: false,
|
disabled: false,
|
||||||
};
|
};
|
||||||
return [REFRESH_PAGE, CLOSE_CURRENT, CLOSE_LEFT, CLOSE_RIGHT, CLOSE_OTHER, CLOSE_ALL];
|
return [REFRESH_PAGE, CLOSE_CURRENT, CLOSE_LEFT, CLOSE_RIGHT, CLOSE_OTHER, CLOSE_ALL];
|
||||||
|
@@ -56,7 +56,7 @@ interface ThemePickerProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const { createSuccessModal, createMessage } = useMessage();
|
const { createSuccessModal, createMessage } = useMessage();
|
||||||
const { t } = useI18n('layout.setting');
|
const { t } = useI18n();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Menu type Picker comp
|
* Menu type Picker comp
|
||||||
@@ -122,8 +122,8 @@ const FooterButton: FunctionalComponent = () => {
|
|||||||
const { isSuccessRef } = useCopyToClipboard(JSON.stringify(unref(getRootSetting), null, 2));
|
const { isSuccessRef } = useCopyToClipboard(JSON.stringify(unref(getRootSetting), null, 2));
|
||||||
unref(isSuccessRef) &&
|
unref(isSuccessRef) &&
|
||||||
createSuccessModal({
|
createSuccessModal({
|
||||||
title: t('operatingTitle'),
|
title: t('layout.setting.operatingTitle'),
|
||||||
content: t('operatingContent'),
|
content: t('layout.setting.operatingContent'),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function handleResetSetting() {
|
function handleResetSetting() {
|
||||||
@@ -133,7 +133,7 @@ const FooterButton: FunctionalComponent = () => {
|
|||||||
// updateTheme(themeColor);
|
// updateTheme(themeColor);
|
||||||
updateColorWeak(colorWeak);
|
updateColorWeak(colorWeak);
|
||||||
updateGrayMode(grayMode);
|
updateGrayMode(grayMode);
|
||||||
createMessage.success(t('resetSuccess'));
|
createMessage.success(t('layout.setting.resetSuccess'));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
createMessage.error(error);
|
createMessage.error(error);
|
||||||
}
|
}
|
||||||
@@ -151,7 +151,7 @@ const FooterButton: FunctionalComponent = () => {
|
|||||||
{() => (
|
{() => (
|
||||||
<>
|
<>
|
||||||
<CopyOutlined class="mr-2" />
|
<CopyOutlined class="mr-2" />
|
||||||
{t('copyBtn')}
|
{t('layout.setting.copyBtn')}
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</Button>
|
</Button>
|
||||||
@@ -159,7 +159,7 @@ const FooterButton: FunctionalComponent = () => {
|
|||||||
{() => (
|
{() => (
|
||||||
<>
|
<>
|
||||||
<RedoOutlined class="mr-2" />
|
<RedoOutlined class="mr-2" />
|
||||||
{t('resetBtn')}
|
{t('layout.setting.resetBtn')}
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</Button>
|
</Button>
|
||||||
@@ -167,7 +167,7 @@ const FooterButton: FunctionalComponent = () => {
|
|||||||
{() => (
|
{() => (
|
||||||
<>
|
<>
|
||||||
<RedoOutlined class="mr-2" />
|
<RedoOutlined class="mr-2" />
|
||||||
{t('clearBtn')}
|
{t('layout.setting.clearBtn')}
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</Button>
|
</Button>
|
||||||
@@ -226,7 +226,7 @@ export default defineComponent({
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<MenuTypePicker />
|
<MenuTypePicker />
|
||||||
{renderSwitchItem(t('splitMenu'), {
|
{renderSwitchItem(t('layout.setting.splitMenu'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.MENU_SPLIT, e);
|
baseHandler(HandlerEnum.MENU_SPLIT, e);
|
||||||
},
|
},
|
||||||
@@ -240,7 +240,7 @@ export default defineComponent({
|
|||||||
function renderTheme() {
|
function renderTheme() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Divider>{() => t('headerTheme')}</Divider>
|
<Divider>{() => t('layout.setting.headerTheme')}</Divider>
|
||||||
<ThemePicker
|
<ThemePicker
|
||||||
colorList={HEADER_PRESET_BG_COLOR_LIST}
|
colorList={HEADER_PRESET_BG_COLOR_LIST}
|
||||||
def={unref(getHeaderBgColor)}
|
def={unref(getHeaderBgColor)}
|
||||||
@@ -248,7 +248,7 @@ export default defineComponent({
|
|||||||
baseHandler(HandlerEnum.HEADER_THEME, e);
|
baseHandler(HandlerEnum.HEADER_THEME, e);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<Divider>{() => t('sidebarTheme')}</Divider>
|
<Divider>{() => t('layout.setting.sidebarTheme')}</Divider>
|
||||||
<ThemePicker
|
<ThemePicker
|
||||||
colorList={SIDE_BAR_BG_COLOR_LIST}
|
colorList={SIDE_BAR_BG_COLOR_LIST}
|
||||||
def={unref(getMenuBgColor)}
|
def={unref(getMenuBgColor)}
|
||||||
@@ -265,56 +265,56 @@ export default defineComponent({
|
|||||||
*/
|
*/
|
||||||
function renderFeatures() {
|
function renderFeatures() {
|
||||||
return [
|
return [
|
||||||
renderSwitchItem(t('menuDrag'), {
|
renderSwitchItem(t('layout.setting.menuDrag'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.MENU_HAS_DRAG, e);
|
baseHandler(HandlerEnum.MENU_HAS_DRAG, e);
|
||||||
},
|
},
|
||||||
def: unref(getCanDrag),
|
def: unref(getCanDrag),
|
||||||
disabled: !unref(getShowMenuRef),
|
disabled: !unref(getShowMenuRef),
|
||||||
}),
|
}),
|
||||||
renderSwitchItem(t('menuSearch'), {
|
renderSwitchItem(t('layout.setting.menuSearch'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.MENU_SHOW_SEARCH, e);
|
baseHandler(HandlerEnum.MENU_SHOW_SEARCH, e);
|
||||||
},
|
},
|
||||||
def: unref(getShowSearch),
|
def: unref(getShowSearch),
|
||||||
disabled: !unref(getShowMenuRef),
|
disabled: !unref(getShowMenuRef),
|
||||||
}),
|
}),
|
||||||
renderSwitchItem(t('menuAccordion'), {
|
renderSwitchItem(t('layout.setting.menuAccordion'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.MENU_ACCORDION, e);
|
baseHandler(HandlerEnum.MENU_ACCORDION, e);
|
||||||
},
|
},
|
||||||
def: unref(getAccordion),
|
def: unref(getAccordion),
|
||||||
disabled: !unref(getShowMenuRef),
|
disabled: !unref(getShowMenuRef),
|
||||||
}),
|
}),
|
||||||
renderSwitchItem(t('menuCollapse'), {
|
renderSwitchItem(t('layout.setting.menuCollapse'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.MENU_COLLAPSED, e);
|
baseHandler(HandlerEnum.MENU_COLLAPSED, e);
|
||||||
},
|
},
|
||||||
def: unref(getCollapsed),
|
def: unref(getCollapsed),
|
||||||
disabled: !unref(getShowMenuRef),
|
disabled: !unref(getShowMenuRef),
|
||||||
}),
|
}),
|
||||||
renderSwitchItem(t('collapseMenuDisplayName'), {
|
renderSwitchItem(t('layout.setting.collapseMenuDisplayName'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.MENU_COLLAPSED_SHOW_TITLE, e);
|
baseHandler(HandlerEnum.MENU_COLLAPSED_SHOW_TITLE, e);
|
||||||
},
|
},
|
||||||
def: unref(getCollapsedShowTitle),
|
def: unref(getCollapsedShowTitle),
|
||||||
disabled: !unref(getShowMenuRef) || !unref(getCollapsed),
|
disabled: !unref(getShowMenuRef) || !unref(getCollapsed),
|
||||||
}),
|
}),
|
||||||
renderSwitchItem(t('fixedHeader'), {
|
renderSwitchItem(t('layout.setting.fixedHeader'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.HEADER_FIXED, e);
|
baseHandler(HandlerEnum.HEADER_FIXED, e);
|
||||||
},
|
},
|
||||||
def: unref(getHeaderFixed),
|
def: unref(getHeaderFixed),
|
||||||
disabled: !unref(getShowHeader),
|
disabled: !unref(getShowHeader),
|
||||||
}),
|
}),
|
||||||
renderSwitchItem(t('fixedSideBar'), {
|
renderSwitchItem(t('layout.setting.fixedSideBar'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.MENU_FIXED, e);
|
baseHandler(HandlerEnum.MENU_FIXED, e);
|
||||||
},
|
},
|
||||||
def: unref(getMenuFixed),
|
def: unref(getMenuFixed),
|
||||||
disabled: !unref(getShowMenuRef),
|
disabled: !unref(getShowMenuRef),
|
||||||
}),
|
}),
|
||||||
renderSelectItem(t('topMenuLayout'), {
|
renderSelectItem(t('layout.setting.topMenuLayout'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.MENU_TOP_ALIGN, e);
|
baseHandler(HandlerEnum.MENU_TOP_ALIGN, e);
|
||||||
},
|
},
|
||||||
@@ -322,7 +322,7 @@ export default defineComponent({
|
|||||||
options: topMenuAlignOptions,
|
options: topMenuAlignOptions,
|
||||||
disabled: !unref(getShowHeader) || (!unref(getIsTopMenu) && !unref(getSplit)),
|
disabled: !unref(getShowHeader) || (!unref(getIsTopMenu) && !unref(getSplit)),
|
||||||
}),
|
}),
|
||||||
renderSelectItem(t('menuCollapseButton'), {
|
renderSelectItem(t('layout.setting.menuCollapseButton'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.MENU_TRIGGER, e);
|
baseHandler(HandlerEnum.MENU_TRIGGER, e);
|
||||||
},
|
},
|
||||||
@@ -331,7 +331,7 @@ export default defineComponent({
|
|||||||
options: menuTriggerOptions,
|
options: menuTriggerOptions,
|
||||||
}),
|
}),
|
||||||
|
|
||||||
renderSelectItem(t('contentMode'), {
|
renderSelectItem(t('layout.setting.contentMode'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.CONTENT_MODE, e);
|
baseHandler(HandlerEnum.CONTENT_MODE, e);
|
||||||
},
|
},
|
||||||
@@ -339,7 +339,7 @@ export default defineComponent({
|
|||||||
options: contentModeOptions,
|
options: contentModeOptions,
|
||||||
}),
|
}),
|
||||||
<div class={`setting-drawer__cell-item`}>
|
<div class={`setting-drawer__cell-item`}>
|
||||||
<span>{t('autoScreenLock')}</span>
|
<span>{t('layout.setting.autoScreenLock')}</span>
|
||||||
<InputNumber
|
<InputNumber
|
||||||
style="width:126px"
|
style="width:126px"
|
||||||
size="small"
|
size="small"
|
||||||
@@ -350,14 +350,14 @@ export default defineComponent({
|
|||||||
defaultValue={appStore.getProjectConfig.lockTime}
|
defaultValue={appStore.getProjectConfig.lockTime}
|
||||||
formatter={(value: string) => {
|
formatter={(value: string) => {
|
||||||
if (parseInt(value) === 0) {
|
if (parseInt(value) === 0) {
|
||||||
return `0(${t('notAutoScreenLock')})`;
|
return `0(${t('layout.setting.notAutoScreenLock')})`;
|
||||||
}
|
}
|
||||||
return `${value}${t('minute')}`;
|
return `${value}${t('layout.setting.minute')}`;
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</div>,
|
</div>,
|
||||||
<div class={`setting-drawer__cell-item`}>
|
<div class={`setting-drawer__cell-item`}>
|
||||||
<span>{t('expandedMenuWidth')}</span>
|
<span>{t('layout.setting.expandedMenuWidth')}</span>
|
||||||
<InputNumber
|
<InputNumber
|
||||||
style="width:126px"
|
style="width:126px"
|
||||||
size="small"
|
size="small"
|
||||||
@@ -377,27 +377,27 @@ export default defineComponent({
|
|||||||
|
|
||||||
function renderContent() {
|
function renderContent() {
|
||||||
return [
|
return [
|
||||||
renderSwitchItem(t('breadcrumb'), {
|
renderSwitchItem(t('layout.setting.breadcrumb'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.SHOW_BREADCRUMB, e);
|
baseHandler(HandlerEnum.SHOW_BREADCRUMB, e);
|
||||||
},
|
},
|
||||||
def: unref(getShowBreadCrumb),
|
def: unref(getShowBreadCrumb),
|
||||||
disabled: !unref(getShowHeader),
|
disabled: !unref(getShowHeader),
|
||||||
}),
|
}),
|
||||||
renderSwitchItem(t('breadcrumbIcon'), {
|
renderSwitchItem(t('layout.setting.breadcrumbIcon'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.SHOW_BREADCRUMB_ICON, e);
|
baseHandler(HandlerEnum.SHOW_BREADCRUMB_ICON, e);
|
||||||
},
|
},
|
||||||
def: unref(getShowBreadCrumbIcon),
|
def: unref(getShowBreadCrumbIcon),
|
||||||
disabled: !unref(getShowHeader),
|
disabled: !unref(getShowHeader),
|
||||||
}),
|
}),
|
||||||
renderSwitchItem(t('tabs'), {
|
renderSwitchItem(t('layout.setting.tabs'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.TABS_SHOW, e);
|
baseHandler(HandlerEnum.TABS_SHOW, e);
|
||||||
},
|
},
|
||||||
def: unref(getShowMultipleTab),
|
def: unref(getShowMultipleTab),
|
||||||
}),
|
}),
|
||||||
renderSwitchItem(t('tabsQuickBtn'), {
|
renderSwitchItem(t('layout.setting.tabsQuickBtn'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.TABS_SHOW_QUICK, e);
|
baseHandler(HandlerEnum.TABS_SHOW_QUICK, e);
|
||||||
},
|
},
|
||||||
@@ -405,14 +405,14 @@ export default defineComponent({
|
|||||||
disabled: !unref(getShowMultipleTab),
|
disabled: !unref(getShowMultipleTab),
|
||||||
}),
|
}),
|
||||||
|
|
||||||
renderSwitchItem(t('sidebar'), {
|
renderSwitchItem(t('layout.setting.sidebar'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.MENU_SHOW_SIDEBAR, e);
|
baseHandler(HandlerEnum.MENU_SHOW_SIDEBAR, e);
|
||||||
},
|
},
|
||||||
def: unref(getShowMenu),
|
def: unref(getShowMenu),
|
||||||
disabled: unref(getIsHorizontal),
|
disabled: unref(getIsHorizontal),
|
||||||
}),
|
}),
|
||||||
renderSwitchItem(t('header'), {
|
renderSwitchItem(t('layout.setting.header'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.HEADER_SHOW, e);
|
baseHandler(HandlerEnum.HEADER_SHOW, e);
|
||||||
},
|
},
|
||||||
@@ -424,25 +424,25 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
def: unref(getShowLogo),
|
def: unref(getShowLogo),
|
||||||
}),
|
}),
|
||||||
renderSwitchItem(t('footer'), {
|
renderSwitchItem(t('layout.setting.footer'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.SHOW_FOOTER, e);
|
baseHandler(HandlerEnum.SHOW_FOOTER, e);
|
||||||
},
|
},
|
||||||
def: unref(getShowFooter),
|
def: unref(getShowFooter),
|
||||||
}),
|
}),
|
||||||
renderSwitchItem(t('fullContent'), {
|
renderSwitchItem(t('layout.setting.fullContent'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.FULL_CONTENT, e);
|
baseHandler(HandlerEnum.FULL_CONTENT, e);
|
||||||
},
|
},
|
||||||
def: unref(getFullContent),
|
def: unref(getFullContent),
|
||||||
}),
|
}),
|
||||||
renderSwitchItem(t('grayMode'), {
|
renderSwitchItem(t('layout.setting.grayMode'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.GRAY_MODE, e);
|
baseHandler(HandlerEnum.GRAY_MODE, e);
|
||||||
},
|
},
|
||||||
def: unref(getGrayMode),
|
def: unref(getGrayMode),
|
||||||
}),
|
}),
|
||||||
renderSwitchItem(t('colorWeak'), {
|
renderSwitchItem(t('layout.setting.colorWeak'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.COLOR_WEAK, e);
|
baseHandler(HandlerEnum.COLOR_WEAK, e);
|
||||||
},
|
},
|
||||||
@@ -454,13 +454,13 @@ export default defineComponent({
|
|||||||
function renderTransition() {
|
function renderTransition() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{renderSwitchItem(t('progress'), {
|
{renderSwitchItem(t('layout.setting.progress'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.OPEN_PROGRESS, e);
|
baseHandler(HandlerEnum.OPEN_PROGRESS, e);
|
||||||
},
|
},
|
||||||
def: unref(getOpenNProgress),
|
def: unref(getOpenNProgress),
|
||||||
})}
|
})}
|
||||||
{renderSwitchItem(t('switchLoading'), {
|
{renderSwitchItem(t('layout.setting.switchLoading'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.OPEN_PAGE_LOADING, e);
|
baseHandler(HandlerEnum.OPEN_PAGE_LOADING, e);
|
||||||
},
|
},
|
||||||
@@ -468,14 +468,14 @@ export default defineComponent({
|
|||||||
disabled: !unref(getEnableTransition),
|
disabled: !unref(getEnableTransition),
|
||||||
})}
|
})}
|
||||||
|
|
||||||
{renderSwitchItem(t('switchAnimation'), {
|
{renderSwitchItem(t('layout.setting.switchAnimation'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.OPEN_ROUTE_TRANSITION, e);
|
baseHandler(HandlerEnum.OPEN_ROUTE_TRANSITION, e);
|
||||||
},
|
},
|
||||||
def: unref(getEnableTransition),
|
def: unref(getEnableTransition),
|
||||||
})}
|
})}
|
||||||
|
|
||||||
{renderSelectItem(t('animationType'), {
|
{renderSelectItem(t('layout.setting.animationType'), {
|
||||||
handler: (e) => {
|
handler: (e) => {
|
||||||
baseHandler(HandlerEnum.ROUTER_TRANSITION, e);
|
baseHandler(HandlerEnum.ROUTER_TRANSITION, e);
|
||||||
},
|
},
|
||||||
@@ -519,26 +519,31 @@ export default defineComponent({
|
|||||||
onChange={(e: any) => {
|
onChange={(e: any) => {
|
||||||
handler && handler(e);
|
handler && handler(e);
|
||||||
}}
|
}}
|
||||||
checkedChildren={t('on')}
|
checkedChildren={t('layout.setting.on')}
|
||||||
unCheckedChildren={t('off')}
|
unCheckedChildren={t('layout.setting.off')}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return () => (
|
return () => (
|
||||||
<BasicDrawer {...attrs} title={t('drawerTitle')} width={330} wrapClassName="setting-drawer">
|
<BasicDrawer
|
||||||
|
{...attrs}
|
||||||
|
title={t('layout.setting.drawerTitle')}
|
||||||
|
width={330}
|
||||||
|
wrapClassName="setting-drawer"
|
||||||
|
>
|
||||||
{{
|
{{
|
||||||
default: () => (
|
default: () => (
|
||||||
<>
|
<>
|
||||||
<Divider>{() => t('navMode')}</Divider>
|
<Divider>{() => t('layout.setting.navMode')}</Divider>
|
||||||
{renderSidebar()}
|
{renderSidebar()}
|
||||||
{renderTheme()}
|
{renderTheme()}
|
||||||
<Divider>{() => t('interfaceFunction')}</Divider>
|
<Divider>{() => t('layout.setting.interfaceFunction')}</Divider>
|
||||||
{renderFeatures()}
|
{renderFeatures()}
|
||||||
<Divider>{() => t('interfaceDisplay')}</Divider>
|
<Divider>{() => t('layout.setting.interfaceDisplay')}</Divider>
|
||||||
{renderContent()}
|
{renderContent()}
|
||||||
<Divider>{() => t('animation')}</Divider>
|
<Divider>{() => t('layout.setting.animation')}</Divider>
|
||||||
{renderTransition()}
|
{renderTransition()}
|
||||||
<Divider />
|
<Divider />
|
||||||
<FooterButton />
|
<FooterButton />
|
||||||
|
@@ -6,7 +6,7 @@ import sidebarImg from '/@/assets/images/layout/menu-sidebar.svg';
|
|||||||
import menuTopImg from '/@/assets/images/layout/menu-top.svg';
|
import menuTopImg from '/@/assets/images/layout/menu-top.svg';
|
||||||
import { useI18n } from '/@/hooks/web/useI18n';
|
import { useI18n } from '/@/hooks/web/useI18n';
|
||||||
|
|
||||||
const { t } = useI18n('layout.setting');
|
const { t } = useI18n();
|
||||||
|
|
||||||
export enum HandlerEnum {
|
export enum HandlerEnum {
|
||||||
CHANGE_LAYOUT,
|
CHANGE_LAYOUT,
|
||||||
@@ -51,41 +51,41 @@ export enum HandlerEnum {
|
|||||||
export const contentModeOptions = [
|
export const contentModeOptions = [
|
||||||
{
|
{
|
||||||
value: ContentEnum.FULL,
|
value: ContentEnum.FULL,
|
||||||
label: t('contentModeFull'),
|
label: t('layout.setting.contentModeFull'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: ContentEnum.FIXED,
|
value: ContentEnum.FIXED,
|
||||||
label: t('contentModeFixed'),
|
label: t('layout.setting.contentModeFixed'),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
export const topMenuAlignOptions = [
|
export const topMenuAlignOptions = [
|
||||||
{
|
{
|
||||||
value: TopMenuAlignEnum.CENTER,
|
value: TopMenuAlignEnum.CENTER,
|
||||||
label: t('topMenuAlignRight'),
|
label: t('layout.setting.topMenuAlignRight'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: TopMenuAlignEnum.START,
|
value: TopMenuAlignEnum.START,
|
||||||
label: t('topMenuAlignLeft'),
|
label: t('layout.setting.topMenuAlignLeft'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: TopMenuAlignEnum.END,
|
value: TopMenuAlignEnum.END,
|
||||||
label: t('topMenuAlignCenter'),
|
label: t('layout.setting.topMenuAlignCenter'),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
export const menuTriggerOptions = [
|
export const menuTriggerOptions = [
|
||||||
{
|
{
|
||||||
value: TriggerEnum.NONE,
|
value: TriggerEnum.NONE,
|
||||||
label: t('menuTriggerNone'),
|
label: t('layout.setting.menuTriggerNone'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: TriggerEnum.FOOTER,
|
value: TriggerEnum.FOOTER,
|
||||||
label: t('menuTriggerBottom'),
|
label: t('layout.setting.menuTriggerBottom'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: TriggerEnum.HEADER,
|
value: TriggerEnum.HEADER,
|
||||||
label: t('menuTriggerTop'),
|
label: t('layout.setting.menuTriggerTop'),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -104,20 +104,20 @@ export const routerTransitionOptions = [
|
|||||||
|
|
||||||
export const menuTypeList = [
|
export const menuTypeList = [
|
||||||
{
|
{
|
||||||
title: t('menuTypeSidebar'),
|
title: t('layout.setting.menuTypeSidebar'),
|
||||||
mode: MenuModeEnum.INLINE,
|
mode: MenuModeEnum.INLINE,
|
||||||
type: MenuTypeEnum.SIDEBAR,
|
type: MenuTypeEnum.SIDEBAR,
|
||||||
src: sidebarImg,
|
src: sidebarImg,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t('menuTypeMix'),
|
title: t('layout.setting.menuTypeMix'),
|
||||||
mode: MenuModeEnum.INLINE,
|
mode: MenuModeEnum.INLINE,
|
||||||
type: MenuTypeEnum.MIX,
|
type: MenuTypeEnum.MIX,
|
||||||
src: mixImg,
|
src: mixImg,
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
title: t('menuTypeTopMenu'),
|
title: t('layout.setting.menuTypeTopMenu'),
|
||||||
mode: MenuModeEnum.HORIZONTAL,
|
mode: MenuModeEnum.HORIZONTAL,
|
||||||
type: MenuTypeEnum.TOP_MENU,
|
type: MenuTypeEnum.TOP_MENU,
|
||||||
src: menuTopImg,
|
src: menuTopImg,
|
||||||
|
@@ -22,7 +22,7 @@ import { useMessage } from '/@/hooks/web/useMessage';
|
|||||||
// import { warn } from '/@/utils/log';
|
// import { warn } from '/@/utils/log';
|
||||||
import { useI18n } from '/@/hooks/web/useI18n';
|
import { useI18n } from '/@/hooks/web/useI18n';
|
||||||
|
|
||||||
const { t } = useI18n('sys.app');
|
const { t } = useI18n();
|
||||||
|
|
||||||
const { createMessage } = useMessage();
|
const { createMessage } = useMessage();
|
||||||
const NAME = 'permission';
|
const NAME = 'permission';
|
||||||
@@ -104,7 +104,7 @@ class Permission extends VuexModule {
|
|||||||
} else if (permissionMode === PermissionModeEnum.BACK) {
|
} else if (permissionMode === PermissionModeEnum.BACK) {
|
||||||
const messageKey = 'loadMenu';
|
const messageKey = 'loadMenu';
|
||||||
createMessage.loading({
|
createMessage.loading({
|
||||||
content: t('menuLoading'),
|
content: t('sys.app.menuLoading'),
|
||||||
key: messageKey,
|
key: messageKey,
|
||||||
duration: 1,
|
duration: 1,
|
||||||
});
|
});
|
||||||
|
@@ -143,11 +143,11 @@ class User extends VuexModule {
|
|||||||
@Action
|
@Action
|
||||||
async confirmLoginOut() {
|
async confirmLoginOut() {
|
||||||
const { createConfirm } = useMessage();
|
const { createConfirm } = useMessage();
|
||||||
const { t } = useI18n('sys.app');
|
const { t } = useI18n();
|
||||||
createConfirm({
|
createConfirm({
|
||||||
iconType: 'warning',
|
iconType: 'warning',
|
||||||
title: t('loginOutTip'),
|
title: t('sys.app.loginOutTip'),
|
||||||
content: t('loginOutMessage'),
|
content: t('sys.app.loginOutMessage'),
|
||||||
onOk: async () => {
|
onOk: async () => {
|
||||||
await this.loginOut(true);
|
await this.loginOut(true);
|
||||||
},
|
},
|
||||||
|
@@ -5,7 +5,7 @@ const { createMessage } = useMessage();
|
|||||||
|
|
||||||
const error = createMessage.error!;
|
const error = createMessage.error!;
|
||||||
export function checkStatus(status: number, msg: string): void {
|
export function checkStatus(status: number, msg: string): void {
|
||||||
const { t } = useI18n('sys.api');
|
const { t } = useI18n();
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case 400:
|
case 400:
|
||||||
error(`${msg}`);
|
error(`${msg}`);
|
||||||
@@ -14,39 +14,39 @@ export function checkStatus(status: number, msg: string): void {
|
|||||||
// 未登录则跳转登录页面,并携带当前页面的路径
|
// 未登录则跳转登录页面,并携带当前页面的路径
|
||||||
// 在登录成功后返回当前页面,这一步需要在登录页操作。
|
// 在登录成功后返回当前页面,这一步需要在登录页操作。
|
||||||
case 401:
|
case 401:
|
||||||
error(t('errMsg401'));
|
error(t('sys.api.errMsg401'));
|
||||||
userStore.loginOut(true);
|
userStore.loginOut(true);
|
||||||
break;
|
break;
|
||||||
case 403:
|
case 403:
|
||||||
error(t('errMsg403'));
|
error(t('sys.api.errMsg403'));
|
||||||
break;
|
break;
|
||||||
// 404请求不存在
|
// 404请求不存在
|
||||||
case 404:
|
case 404:
|
||||||
error(t('errMsg404'));
|
error(t('sys.api.errMsg404'));
|
||||||
break;
|
break;
|
||||||
case 405:
|
case 405:
|
||||||
error(t('errMsg405'));
|
error(t('sys.api.errMsg405'));
|
||||||
break;
|
break;
|
||||||
case 408:
|
case 408:
|
||||||
error(t('errMsg408'));
|
error(t('sys.api.errMsg408'));
|
||||||
break;
|
break;
|
||||||
case 500:
|
case 500:
|
||||||
error(t('errMsg500'));
|
error(t('sys.api.errMsg500'));
|
||||||
break;
|
break;
|
||||||
case 501:
|
case 501:
|
||||||
error(t('errMsg501'));
|
error(t('sys.api.errMsg501'));
|
||||||
break;
|
break;
|
||||||
case 502:
|
case 502:
|
||||||
error(t('errMsg502'));
|
error(t('sys.api.errMsg502'));
|
||||||
break;
|
break;
|
||||||
case 503:
|
case 503:
|
||||||
error(t('errMsg503'));
|
error(t('sys.api.errMsg503'));
|
||||||
break;
|
break;
|
||||||
case 504:
|
case 504:
|
||||||
error(t('errMsg504'));
|
error(t('sys.api.errMsg504'));
|
||||||
break;
|
break;
|
||||||
case 505:
|
case 505:
|
||||||
error(t('errMsg505'));
|
error(t('sys.api.errMsg505'));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
|
@@ -34,7 +34,7 @@ const transform: AxiosTransform = {
|
|||||||
* @description: 处理请求数据
|
* @description: 处理请求数据
|
||||||
*/
|
*/
|
||||||
transformRequestData: (res: AxiosResponse<Result>, options: RequestOptions) => {
|
transformRequestData: (res: AxiosResponse<Result>, options: RequestOptions) => {
|
||||||
const { t } = useI18n('sys.api');
|
const { t } = useI18n();
|
||||||
const { isTransformRequestResult } = options;
|
const { isTransformRequestResult } = options;
|
||||||
// 不进行任何处理,直接返回
|
// 不进行任何处理,直接返回
|
||||||
// 用于页面代码可能需要直接获取code,data,message这些信息时开启
|
// 用于页面代码可能需要直接获取code,data,message这些信息时开启
|
||||||
@@ -57,7 +57,7 @@ const transform: AxiosTransform = {
|
|||||||
if (message) {
|
if (message) {
|
||||||
// errorMessageMode=‘modal’的时候会显示modal错误弹窗,而不是消息提示,用于一些比较重要的错误
|
// errorMessageMode=‘modal’的时候会显示modal错误弹窗,而不是消息提示,用于一些比较重要的错误
|
||||||
if (options.errorMessageMode === 'modal') {
|
if (options.errorMessageMode === 'modal') {
|
||||||
createErrorModal({ title: t('errorTip'), content: message });
|
createErrorModal({ title: t('sys.api.errorTip'), content: message });
|
||||||
} else {
|
} else {
|
||||||
createMessage.error(message);
|
createMessage.error(message);
|
||||||
}
|
}
|
||||||
@@ -76,7 +76,7 @@ const transform: AxiosTransform = {
|
|||||||
createMessage.error(data.message);
|
createMessage.error(data.message);
|
||||||
Promise.reject(new Error(message));
|
Promise.reject(new Error(message));
|
||||||
} else {
|
} else {
|
||||||
const msg = t('errorMessage');
|
const msg = t('sys.api.errorMessage');
|
||||||
createMessage.error(msg);
|
createMessage.error(msg);
|
||||||
Promise.reject(new Error(msg));
|
Promise.reject(new Error(msg));
|
||||||
}
|
}
|
||||||
@@ -84,9 +84,9 @@ const transform: AxiosTransform = {
|
|||||||
}
|
}
|
||||||
// 登录超时
|
// 登录超时
|
||||||
if (code === ResultEnum.TIMEOUT) {
|
if (code === ResultEnum.TIMEOUT) {
|
||||||
const timeoutMsg = t('timeoutMessage');
|
const timeoutMsg = t('sys.api.timeoutMessage');
|
||||||
createErrorModal({
|
createErrorModal({
|
||||||
title: t('operationFailed'),
|
title: t('sys.api.operationFailed'),
|
||||||
content: timeoutMsg,
|
content: timeoutMsg,
|
||||||
});
|
});
|
||||||
Promise.reject(new Error(timeoutMsg));
|
Promise.reject(new Error(timeoutMsg));
|
||||||
@@ -154,7 +154,7 @@ const transform: AxiosTransform = {
|
|||||||
* @description: 响应错误处理
|
* @description: 响应错误处理
|
||||||
*/
|
*/
|
||||||
responseInterceptorsCatch: (error: any) => {
|
responseInterceptorsCatch: (error: any) => {
|
||||||
const { t } = useI18n('sys.api');
|
const { t } = useI18n();
|
||||||
errorStore.setupErrorHandle(error);
|
errorStore.setupErrorHandle(error);
|
||||||
const { response, code, message } = error || {};
|
const { response, code, message } = error || {};
|
||||||
const msg: string =
|
const msg: string =
|
||||||
@@ -162,12 +162,12 @@ const transform: AxiosTransform = {
|
|||||||
const err: string = error.toString();
|
const err: string = error.toString();
|
||||||
try {
|
try {
|
||||||
if (code === 'ECONNABORTED' && message.indexOf('timeout') !== -1) {
|
if (code === 'ECONNABORTED' && message.indexOf('timeout') !== -1) {
|
||||||
createMessage.error(t('apiTimeoutMessage'));
|
createMessage.error(t('sys.api.apiTimeoutMessage'));
|
||||||
}
|
}
|
||||||
if (err && err.includes('Network Error')) {
|
if (err && err.includes('Network Error')) {
|
||||||
createErrorModal({
|
createErrorModal({
|
||||||
title: t('networkException'),
|
title: t('sys.api.networkException'),
|
||||||
content: t('networkExceptionMsg'),
|
content: t('sys.api.networkExceptionMsg'),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<BasicModal :width="800" :title="t('tableActionDesc')" v-bind="$attrs">
|
<BasicModal :width="800" :title="t('sys.errorLog.tableActionDesc')" v-bind="$attrs">
|
||||||
<Description :data="info" @register="register" />
|
<Description :data="info" @register="register" />
|
||||||
</BasicModal>
|
</BasicModal>
|
||||||
</template>
|
</template>
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
setup() {
|
setup() {
|
||||||
const { t } = useI18n('sys.errorLog');
|
const { t } = useI18n();
|
||||||
const [register] = useDescription({
|
const [register] = useDescription({
|
||||||
column: 2,
|
column: 2,
|
||||||
schema: getDescSchema(),
|
schema: getDescSchema(),
|
||||||
|
@@ -3,13 +3,13 @@ import { BasicColumn } from '/@/components/Table/index';
|
|||||||
import { ErrorTypeEnum } from '/@/enums/exceptionEnum';
|
import { ErrorTypeEnum } from '/@/enums/exceptionEnum';
|
||||||
import { useI18n } from '/@/hooks/web/useI18n';
|
import { useI18n } from '/@/hooks/web/useI18n';
|
||||||
|
|
||||||
const { t } = useI18n('sys.errorLog');
|
const { t } = useI18n();
|
||||||
|
|
||||||
export function getColumns(): BasicColumn[] {
|
export function getColumns(): BasicColumn[] {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
dataIndex: 'type',
|
dataIndex: 'type',
|
||||||
title: t('tableColumnType'),
|
title: t('sys.errorLog.tableColumnType'),
|
||||||
width: 80,
|
width: 80,
|
||||||
customRender: ({ text }) => {
|
customRender: ({ text }) => {
|
||||||
const color =
|
const color =
|
||||||
@@ -32,12 +32,12 @@ export function getColumns(): BasicColumn[] {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
dataIndex: 'time',
|
dataIndex: 'time',
|
||||||
title: t('tableColumnDate'),
|
title: t('sys.errorLog.tableColumnDate'),
|
||||||
width: 160,
|
width: 160,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
dataIndex: 'file',
|
dataIndex: 'file',
|
||||||
title: t('tableColumnFile'),
|
title: t('sys.errorLog.tableColumnFile'),
|
||||||
width: 200,
|
width: 200,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -47,12 +47,12 @@ export function getColumns(): BasicColumn[] {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
dataIndex: 'message',
|
dataIndex: 'message',
|
||||||
title: t('tableColumnMsg'),
|
title: t('sys.errorLog.tableColumnMsg'),
|
||||||
width: 300,
|
width: 300,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
dataIndex: 'stack',
|
dataIndex: 'stack',
|
||||||
title: t('tableColumnStackMsg'),
|
title: t('sys.errorLog.tableColumnStackMsg'),
|
||||||
width: 300,
|
width: 300,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
@@ -53,7 +53,7 @@
|
|||||||
const rowInfoRef = ref<ErrorInfo>();
|
const rowInfoRef = ref<ErrorInfo>();
|
||||||
const imgListRef = ref<string[]>([]);
|
const imgListRef = ref<string[]>([]);
|
||||||
|
|
||||||
const { t } = useI18n('sys.errorLog');
|
const { t } = useI18n();
|
||||||
|
|
||||||
const [register, { setTableData }] = useTable({
|
const [register, { setTableData }] = useTable({
|
||||||
title: t('sys.errorLog.tableTitle'),
|
title: t('sys.errorLog.tableTitle'),
|
||||||
@@ -80,7 +80,7 @@
|
|||||||
);
|
);
|
||||||
const { createMessage } = useMessage();
|
const { createMessage } = useMessage();
|
||||||
if (isDevMode()) {
|
if (isDevMode()) {
|
||||||
createMessage.info(t('enableMessage'));
|
createMessage.info(t('sys.errorLog.enableMessage'));
|
||||||
}
|
}
|
||||||
// 查看详情
|
// 查看详情
|
||||||
function handleDetail(row: ErrorInfo) {
|
function handleDetail(row: ErrorInfo) {
|
||||||
|
@@ -53,7 +53,7 @@ export default defineComponent({
|
|||||||
const { query } = useRoute();
|
const { query } = useRoute();
|
||||||
const go = useGo();
|
const go = useGo();
|
||||||
const redo = useRedo();
|
const redo = useRedo();
|
||||||
const { t } = useI18n('sys.exception');
|
const { t } = useI18n();
|
||||||
|
|
||||||
const getStatus = computed(() => {
|
const getStatus = computed(() => {
|
||||||
const { status: routeStatus } = query;
|
const { status: routeStatus } = query;
|
||||||
@@ -67,13 +67,13 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
const backLoginI18n = t('backLogin');
|
const backLoginI18n = t('sys.exception.backLogin');
|
||||||
const backHomeI18n = t('backHome');
|
const backHomeI18n = t('sys.exception.backHome');
|
||||||
|
|
||||||
unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_ACCESS, {
|
unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_ACCESS, {
|
||||||
title: '403',
|
title: '403',
|
||||||
status: `${ExceptionEnum.PAGE_NOT_ACCESS}`,
|
status: `${ExceptionEnum.PAGE_NOT_ACCESS}`,
|
||||||
subTitle: t('subTitle403'),
|
subTitle: t('sys.exception.subTitle403'),
|
||||||
btnText: props.full ? backLoginI18n : backHomeI18n,
|
btnText: props.full ? backLoginI18n : backHomeI18n,
|
||||||
handler: () => (props.full ? go(PageEnum.BASE_LOGIN) : go()),
|
handler: () => (props.full ? go(PageEnum.BASE_LOGIN) : go()),
|
||||||
});
|
});
|
||||||
@@ -81,7 +81,7 @@ export default defineComponent({
|
|||||||
unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_FOUND, {
|
unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_FOUND, {
|
||||||
title: '404',
|
title: '404',
|
||||||
status: `${ExceptionEnum.PAGE_NOT_FOUND}`,
|
status: `${ExceptionEnum.PAGE_NOT_FOUND}`,
|
||||||
subTitle: t('subTitle404'),
|
subTitle: t('sys.exception.subTitle404'),
|
||||||
btnText: props.full ? backLoginI18n : backHomeI18n,
|
btnText: props.full ? backLoginI18n : backHomeI18n,
|
||||||
handler: () => (props.full ? go(PageEnum.BASE_LOGIN) : go()),
|
handler: () => (props.full ? go(PageEnum.BASE_LOGIN) : go()),
|
||||||
});
|
});
|
||||||
@@ -89,22 +89,22 @@ export default defineComponent({
|
|||||||
unref(statusMapRef).set(ExceptionEnum.ERROR, {
|
unref(statusMapRef).set(ExceptionEnum.ERROR, {
|
||||||
title: '500',
|
title: '500',
|
||||||
status: `${ExceptionEnum.ERROR}`,
|
status: `${ExceptionEnum.ERROR}`,
|
||||||
subTitle: t('subTitle500'),
|
subTitle: t('sys.exception.subTitle500'),
|
||||||
btnText: backHomeI18n,
|
btnText: backHomeI18n,
|
||||||
handler: () => go(),
|
handler: () => go(),
|
||||||
});
|
});
|
||||||
|
|
||||||
unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_DATA, {
|
unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_DATA, {
|
||||||
title: t('noDataTitle'),
|
title: t('sys.exception.noDataTitle'),
|
||||||
subTitle: '',
|
subTitle: '',
|
||||||
btnText: t('redo'),
|
btnText: t('sys.exception.redo'),
|
||||||
handler: () => redo(),
|
handler: () => redo(),
|
||||||
icon: notDataImg,
|
icon: notDataImg,
|
||||||
});
|
});
|
||||||
|
|
||||||
unref(statusMapRef).set(ExceptionEnum.NET_WORK_ERROR, {
|
unref(statusMapRef).set(ExceptionEnum.NET_WORK_ERROR, {
|
||||||
title: t('networkErrorTitle'),
|
title: t('sys.exception.networkErrorTitle'),
|
||||||
subTitle: t('networkErrorSubTitle'),
|
subTitle: t('sys.exception.networkErrorSubTitle'),
|
||||||
btnText: 'Refresh',
|
btnText: 'Refresh',
|
||||||
handler: () => redo(),
|
handler: () => redo(),
|
||||||
icon: netWorkImg,
|
icon: netWorkImg,
|
||||||
|
@@ -36,7 +36,7 @@
|
|||||||
const loadingRef = ref(false);
|
const loadingRef = ref(false);
|
||||||
const errMsgRef = ref(false);
|
const errMsgRef = ref(false);
|
||||||
|
|
||||||
const { t } = useI18n('sys.lock');
|
const { t } = useI18n();
|
||||||
const [register, { validateFields }] = useForm({
|
const [register, { validateFields }] = useForm({
|
||||||
showActionButtonGroup: false,
|
showActionButtonGroup: false,
|
||||||
schemas: [
|
schemas: [
|
||||||
@@ -46,7 +46,7 @@
|
|||||||
component: 'InputPassword',
|
component: 'InputPassword',
|
||||||
componentProps: {
|
componentProps: {
|
||||||
style: { width: '100%' },
|
style: { width: '100%' },
|
||||||
placeholder: t('placeholder'),
|
placeholder: t('sys.lock.placeholder'),
|
||||||
},
|
},
|
||||||
rules: [{ required: true }],
|
rules: [{ required: true }],
|
||||||
},
|
},
|
||||||
|
@@ -90,7 +90,7 @@
|
|||||||
const globSetting = useGlobSetting();
|
const globSetting = useGlobSetting();
|
||||||
const { locale } = useProjectSetting();
|
const { locale } = useProjectSetting();
|
||||||
const { notification } = useMessage();
|
const { notification } = useMessage();
|
||||||
const { t } = useI18n('sys.login');
|
const { t } = useI18n();
|
||||||
|
|
||||||
// const openLoginVerifyRef = computed(() => appStore.getProjectConfig.openLoginVerify);
|
// const openLoginVerifyRef = computed(() => appStore.getProjectConfig.openLoginVerify);
|
||||||
|
|
||||||
@@ -104,8 +104,10 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
const formRules = reactive({
|
const formRules = reactive({
|
||||||
account: [{ required: true, message: t('accountPlaceholder'), trigger: 'blur' }],
|
account: [{ required: true, message: t('sys.login.accountPlaceholder'), trigger: 'blur' }],
|
||||||
password: [{ required: true, message: t('passwordPlaceholder'), trigger: 'blur' }],
|
password: [
|
||||||
|
{ required: true, message: t('sys.login.passwordPlaceholder'), trigger: 'blur' },
|
||||||
|
],
|
||||||
// verify: unref(openLoginVerifyRef) ? [{ required: true, message: '请通过验证码校验' }] : [],
|
// verify: unref(openLoginVerifyRef) ? [{ required: true, message: '请通过验证码校验' }] : [],
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -130,8 +132,8 @@
|
|||||||
);
|
);
|
||||||
if (userInfo) {
|
if (userInfo) {
|
||||||
notification.success({
|
notification.success({
|
||||||
message: t('loginSuccessTitle'),
|
message: t('sys.login.loginSuccessTitle'),
|
||||||
description: `${t('loginSuccessDesc')}: ${userInfo.realName}`,
|
description: `${t('sys.login.loginSuccessDesc')}: ${userInfo.realName}`,
|
||||||
duration: 3,
|
duration: 3,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user