feat: 补充多语种文件 (#146)

Co-authored-by: tk <fiyne1a@dingtalk.com>
This commit is contained in:
nsnail 2024-06-18 17:31:22 +08:00 committed by GitHub
parent 6100e9e9c8
commit 1442e0a37c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
72 changed files with 1305 additions and 599 deletions

View File

@ -68,7 +68,7 @@
}
.app-loading__title {
font-family: 'Lucida Console', 'Microsoft YaHei', 'monospace';
font-family: 'Arial', 'Microsoft YaHei', 'monospace';
font-size: 24px;
color: #333;
margin-top: 30px;

View File

@ -1,5 +1,11 @@
<template>
<el-button :disabled="vue.selection.length === 0" :loading="loading" @click="batchDel" icon="el-icon-delete" plain type="danger"></el-button>
<el-button
:disabled="vue.selection.length === 0 || loading"
:loading="loading"
@click="bulkDel"
icon="el-icon-delete"
plain
type="danger"></el-button>
</template>
<style scoped></style>
<script>
@ -17,17 +23,17 @@ export default {
computed: {},
methods: {
//
async batchDel() {
async bulkDel() {
this.loading = true
try {
await this.$confirm(`确定删除选中的 ${this.vue.selection.length} 项吗?`, '提示', {
await this.$confirm(this.$t('确定删除选中的 {count} 项吗?', { count: this.vue.selection.length }), this.$t('提示'), {
type: 'warning',
})
const res = await this.api.post({
items: this.vue.selection,
})
this.vue.$refs.table.refresh()
this.$message.success(`删除 ${res.data}`)
this.$message.success(this.$t('删除 {count} 项', { count: res.data }))
} catch {
//
}

View File

@ -3,7 +3,11 @@
<template #default="scope">
<el-button-group>
<template v-for="(item, i) in buttons?.filter((x) => !x.condition || x.condition(scope))" :key="i">
<el-popconfirm v-if="item.confirm" :title="`确定${item.title}`" @confirm="item.click(scope.row, vue)" width="200">
<el-popconfirm
v-if="item.confirm"
:title="this.$t(`确定 {title}`, { title: item.title })"
@confirm="item.click(scope.row, vue)"
width="20rem">
<template #reference>
<el-button :icon="item.icon" :title="item.title" :type="item.type" @click.native.stop size="small"></el-button>
</template>

View File

@ -19,11 +19,17 @@
oninput="value=value.replace(/\D/g,'')"
prefix-icon="el-icon-message"></el-input>
<el-button :disabled="sendDisabled" @click="getYzm"
>获取验证码<span v-if="sendDisabled"> ({{ waitSecs }})</span></el-button
>{{ $t('获取验证码') }}<span v-if="sendDisabled"> ({{ waitSecs }})</span></el-button
>
</div>
</el-form-item>
<na-verify :imgSize="{ width: '310px', height: '155px' }" @success="captchaSuccess" captchaType="blockPuzzle" mode="pop" ref="verify"></na-verify>
<na-verify
:explain="$t('向右滑动完成验证')"
:imgSize="{ width: '310px', height: '155px' }"
@success="captchaSuccess"
captchaType="blockPuzzle"
mode="pop"
ref="verify"></na-verify>
</template>
<script>
@ -35,7 +41,7 @@ export default {
modelValue: { type: Object },
vue: { type: Object },
formName: { type: String },
emailPlaceHolder: { type: String, default: '邮箱地址' },
emailPlaceHolder: { type: String },
emailField: { type: Object },
codeField: { type: Object },
emailLabel: { type: String },
@ -80,7 +86,7 @@ export default {
deviceType: 'email',
verifyCaptchaReq: obj,
})
this.$message.success('发送成功')
this.$message.success(this.$t('发送成功'))
this.waitSecs = 60
const t = setInterval(() => {
this.waitSecs -= 1

View File

@ -19,12 +19,19 @@
maxlength="4"
oninput="value=value.replace(/\D/g,'')"
prefix-icon="el-icon-message"></el-input>
<el-button :disabled="sendDisabled" @click="getYzm"
>获取验证码<span v-if="sendDisabled"> ({{ waitSecs }})</span></el-button
<el-button :disabled="sendDisabled" @click="getYzm">
{{ $t('获取验证码') }}
<span v-if="sendDisabled"> ({{ waitSecs }})</span></el-button
>
</div>
</el-form-item>
<na-verify :imgSize="{ width: '310px', height: '155px' }" @success="captchaSuccess" captchaType="blockPuzzle" mode="pop" ref="verify"></na-verify>
<na-verify
:explain="$t('向右滑动完成验证')"
:imgSize="{ width: '310px', height: '155px' }"
@success="captchaSuccess"
captchaType="blockPuzzle"
mode="pop"
ref="verify"></na-verify>
</template>
<script>
@ -36,7 +43,7 @@ export default {
modelValue: { type: Object },
vue: { type: Object },
formName: { type: String },
phonePlaceHolder: { type: String, default: '手机号码' },
phonePlaceHolder: { type: String },
phoneField: { type: Object },
codeField: { type: Object },
phoneLabel: { type: String },
@ -81,7 +88,7 @@ export default {
deviceType: 'mobile',
verifyCaptchaReq: obj,
})
this.$message.success('发送成功')
this.$message.success(this.$t('发送成功'))
this.waitSecs = 60
const t = setInterval(() => {
this.waitSecs -= 1

View File

@ -60,10 +60,10 @@
<el-badge :hidden="vue.query.dynamicFilter.filters.length === 0" :value="vue.query.dynamicFilter.filters.length">
<el-button-group>
<el-button @click="search" icon="el-icon-search" type="primary">查询</el-button>
<el-button @click="search" icon="el-icon-search" type="primary">{{ $t('查询') }}</el-button>
<el-popover :title="$t('已应用的查询条件')" placement="bottom-end" trigger="hover" width="40rem">
<template #reference>
<el-button @click="reset" icon="el-icon-refresh-left">重置</el-button>
<el-button @click="reset" icon="el-icon-refresh-left">{{ $t('重置') }}</el-button>
</template>
<v-ace-editor
:theme="this.$TOOL.data.get('APP_DARK') ? 'github_dark' : 'github'"
@ -94,7 +94,7 @@ export default {
return {
dateShortCuts: [
{
text: '今天',
text: this.$t('今天'),
value: () => {
const start = new Date()
start.setHours(0, 0, 0, 0)
@ -102,7 +102,7 @@ export default {
},
},
{
text: '昨天',
text: this.$t('昨天'),
value: () => {
const start = new Date()
start.setHours(0, 0, 0, 0)
@ -111,7 +111,7 @@ export default {
},
},
{
text: '最近三天',
text: this.$t('最近三天'),
value: () => {
const start = new Date()
start.setHours(0, 0, 0, 0)
@ -122,7 +122,7 @@ export default {
},
},
{
text: '最近一周',
text: this.$t('最近一周'),
value: () => {
const start = new Date()
start.setHours(0, 0, 0, 0)
@ -133,7 +133,7 @@ export default {
},
},
{
text: '最近一月',
text: this.$t('最近一月'),
value: () => {
const start = new Date()
start.setHours(0, 0, 0, 0)
@ -144,7 +144,7 @@ export default {
},
},
{
text: '最近三月',
text: this.$t('最近三月'),
value: () => {
const start = new Date()
start.setHours(0, 0, 0, 0)
@ -155,7 +155,7 @@ export default {
},
},
{
text: '最近六月',
text: this.$t('最近六月'),
value: () => {
const start = new Date()
start.setHours(0, 0, 0, 0)
@ -166,7 +166,7 @@ export default {
},
},
{
text: '最近一年',
text: this.$t('最近一年'),
value: () => {
const start = new Date()
start.setHours(0, 0, 0, 0)
@ -183,7 +183,7 @@ export default {
value: 'id',
type: 'text',
selected: true,
placeholder: '请输入订单号',
placeholder: this.$t('请输入订单号'),
},
{
label: '类型',
@ -191,7 +191,7 @@ export default {
type: 'select',
operator: '=',
selected: true,
placeholder: '请选择类型',
placeholder: this.$t('请选择类型'),
extend: {
data: [
{
@ -210,7 +210,7 @@ export default {
value: 'type2',
type: 'select',
operator: '=',
placeholder: '请选择类型',
placeholder: this.$t('请选择类型'),
extend: {
multiple: true,
data: [
@ -230,7 +230,7 @@ export default {
value: 'noticeType',
type: 'select',
operator: '=',
placeholder: '请选择通知类型',
placeholder: this.$t('请选择通知类型'),
extend: {
request: async () => {
const list = await this.$API.system.dic.get.get()
@ -248,7 +248,7 @@ export default {
value: 'noticeType2',
type: 'select',
operator: '=',
placeholder: '请输入关键词后检索',
placeholder: this.$t('请输入关键词后检索'),
extend: {
remote: true,
request: async (query) => {
@ -313,7 +313,7 @@ export default {
label: '自定义日期',
value: 'date3',
type: 'customDate',
placeholder: '请选择月份',
placeholder: this.$t('请选择月份'),
extend: {
dateType: 'month',
valueFormat: 'YYYY-MM',
@ -335,7 +335,7 @@ export default {
if (this.dateType === 'datetimerange') {
this.dateShortCuts.unshift(
{
text: '最近一时',
text: this.$t('最近一时'),
value: () => {
const start = new Date()
const end = new Date()
@ -344,7 +344,7 @@ export default {
},
},
{
text: '昨日此时',
text: this.$t('昨日此时'),
value: () => {
return [
new Date(new Date(new Date().getTime() - 86400 * 1000).setHours(0, 0, 0, 0)),

View File

@ -2,7 +2,7 @@
<div v-show="showBox" :class="mode === 'pop' ? 'mask' : ''">
<div :class="mode === 'pop' ? 'verifybox' : ''" :style="{ 'max-width': parseInt(imgSize.width) + 30 + 'px' }">
<div v-if="mode === 'pop'" class="verifybox-top">
请完成安全验证
{{ $t('请完成安全验证') }}
<span @click="closeBox" class="verifybox-close">
<i class="iconfont icon-close"></i>
</span>
@ -43,7 +43,7 @@ export default {
}
},
created() {
this.tpl = this.$GLOBAL.chars.TPL_DATE_YYYYMMDD
this.tpl = 'yyyyMMdd'
},
components: {
slide,

View File

@ -89,7 +89,6 @@ export default {
},
explain: {
type: String,
default: '向右滑动完成验证',
},
imgSize: {
type: Object,
@ -320,7 +319,7 @@ export default {
}, 1500)
}
passFlag.value = true
tipWords.value = `${((endMoveTime.value - startMoveTime.value) / 1000).toFixed(2)}秒 验证成功`
tipWords.value = proxy.$t('{secs} 秒 验证成功', { secs: ((endMoveTime.value - startMoveTime.value) / 1000).toFixed(2) })
setTimeout(() => {
tipWords.value = ''
proxy.$parent.closeBox()
@ -336,7 +335,7 @@ export default {
refresh()
}, 1000)
proxy.$parent.$emit('error', proxy)
tipWords.value = '验证失败'
tipWords.value = proxy.$t('验证失败')
setTimeout(() => {
tipWords.value = ''
}, 1000)

View File

@ -11,8 +11,8 @@ export default {
setInterval(async () => {
//
const res = await this.$API.sys_tools.getVersion.post({})
if (res.data !== this.$TOOL.data.get('VERSION')) {
this.$TOOL.data.set('VERSION', res.data)
if (res.data !== this.$TOOL.data.get('APP_VERSION')) {
this.$TOOL.data.set('APP_VERSION', res.data)
this.showTip(res.data.slice(0, res.data.indexOf('+')))
}
}, 10000)
@ -24,8 +24,8 @@ export default {
showTip(version) {
const contents = []
const msg = h('p', { style: 'width:230px;display:flex;justify-content:space-between' }, [
h('span', {}, '即将开始更新……'),
h('a', { style: 'color:#409eff', href: 'javascript:window.location.reload()' }, '立即更新'),
h('span', {}, this.$t('即将开始更新……')),
h('a', { style: 'color:#409eff', href: 'javascript:window.location.reload()' }, this.$t('立即更新')),
])
const task = h('p', { style: 'font-weight:bold' }, version)
const progress = h(
@ -68,7 +68,7 @@ export default {
//
const notifyInstance = this.$notify({
title: '发现新版本',
title: this.$t('发现新版本'),
type: 'success',
customClass: className,
message: h('div', {}, contents),

View File

@ -14,39 +14,39 @@
<el-button icon="el-icon-arrow-down"></el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="0 * * * * ?">每分钟</el-dropdown-item>
<el-dropdown-item command="0 0 * * * ?">每小时</el-dropdown-item>
<el-dropdown-item command="0 0 0 * * ?">每天零点</el-dropdown-item>
<el-dropdown-item command="0 0 0 1 * ?">每月一号零点</el-dropdown-item>
<el-dropdown-item command="0 0 0 L * ?">每月最后一天零点</el-dropdown-item>
<el-dropdown-item command="0 0 0 ? * 1">每周星期日零点</el-dropdown-item>
<el-dropdown-item command="0 * * * * ?">{{ $t('每分钟') }}</el-dropdown-item>
<el-dropdown-item command="0 0 * * * ?">{{ $t('每小时') }}</el-dropdown-item>
<el-dropdown-item command="0 0 0 * * ?">{{ $t('每天零点') }}</el-dropdown-item>
<el-dropdown-item command="0 0 0 1 * ?">{{ $t('每月一号零点') }}</el-dropdown-item>
<el-dropdown-item command="0 0 0 L * ?">{{ $t('每月最后一天零点') }}</el-dropdown-item>
<el-dropdown-item command="0 0 0 ? * 1">{{ $t('每周星期日零点') }}</el-dropdown-item>
<el-dropdown-item v-for="(item, index) in shortcuts" :command="item.value" :divided="index === 0" :key="item.value"
>{{ item.text }}
</el-dropdown-item>
<el-dropdown-item command="custom" divided icon="el-icon-plus">自定义</el-dropdown-item>
<el-dropdown-item command="custom" divided icon="el-icon-plus">{{ $t('自定义') }}</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
</el-input>
<el-dialog v-model="dialogVisible" :width="800" append-to-body destroy-on-close title="Cron 规则生成器">
<el-dialog v-model="dialogVisible" :title="$t('Cron 规则生成器')" :width="800" append-to-body destroy-on-close>
<div class="sc-cron">
<el-tabs>
<el-tab-pane>
<template #label>
<div class="sc-cron-num">
<h2></h2>
<h2>{{ $t('') }}</h2>
<h4>{{ value_second }}</h4>
</div>
</template>
<el-form>
<el-form-item :label="$t('类型')">
<el-radio-group v-model="value.second.type">
<el-radio-button :label="0">任意值</el-radio-button>
<el-radio-button :label="1">范围</el-radio-button>
<el-radio-button :label="2">间隔</el-radio-button>
<el-radio-button :label="3">指定</el-radio-button>
<el-radio-button :label="0">{{ $t('任意值') }}</el-radio-button>
<el-radio-button :label="1">{{ $t('范围') }}</el-radio-button>
<el-radio-button :label="2">{{ $t('间隔') }}</el-radio-button>
<el-radio-button :label="3">{{ $t('指定') }}</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-if="value.second.type === 1" :label="$t('范围')">
@ -56,9 +56,9 @@
</el-form-item>
<el-form-item v-if="value.second.type === 2" :label="$t('间隔')">
<el-input-number v-model="value.second.loop.start" :max="59" :min="0" controls-position="right"></el-input-number>
秒开始
{{ $t('频率') }}
<el-input-number v-model="value.second.loop.end" :max="59" :min="0" controls-position="right"></el-input-number>
秒执行一次
{{ $t('秒') }}
</el-form-item>
<el-form-item v-if="value.second.type === 3" :label="$t('指定')">
<el-select v-model="value.second.appoint" multiple style="width: 100%">
@ -70,17 +70,17 @@
<el-tab-pane>
<template #label>
<div class="sc-cron-num">
<h2>分钟</h2>
<h2>{{ $t('分钟') }}</h2>
<h4>{{ value_minute }}</h4>
</div>
</template>
<el-form>
<el-form-item :label="$t('类型')">
<el-radio-group v-model="value.minute.type">
<el-radio-button :label="0">任意值</el-radio-button>
<el-radio-button :label="1">范围</el-radio-button>
<el-radio-button :label="2">间隔</el-radio-button>
<el-radio-button :label="3">指定</el-radio-button>
<el-radio-button :label="0">{{ $t('任意值') }}</el-radio-button>
<el-radio-button :label="1">{{ $t('范围') }}</el-radio-button>
<el-radio-button :label="2">{{ $t('间隔') }}</el-radio-button>
<el-radio-button :label="3">{{ $t('指定') }}</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-if="value.minute.type === 1" :label="$t('范围')">
@ -90,9 +90,9 @@
</el-form-item>
<el-form-item v-if="value.minute.type === 2" :label="$t('间隔')">
<el-input-number v-model="value.minute.loop.start" :max="59" :min="0" controls-position="right"></el-input-number>
分钟开始
{{ $t('频率') }}
<el-input-number v-model="value.minute.loop.end" :max="59" :min="0" controls-position="right"></el-input-number>
分钟执行一次
{{ $t('分钟') }}
</el-form-item>
<el-form-item v-if="value.minute.type === 3" :label="$t('指定')">
<el-select v-model="value.minute.appoint" multiple style="width: 100%">
@ -104,17 +104,17 @@
<el-tab-pane>
<template #label>
<div class="sc-cron-num">
<h2>小时</h2>
<h2>{{ $t('小时') }}</h2>
<h4>{{ value_hour }}</h4>
</div>
</template>
<el-form>
<el-form-item :label="$t('类型')">
<el-radio-group v-model="value.hour.type">
<el-radio-button :label="0">任意值</el-radio-button>
<el-radio-button :label="1">范围</el-radio-button>
<el-radio-button :label="2">间隔</el-radio-button>
<el-radio-button :label="3">指定</el-radio-button>
<el-radio-button :label="0">{{ $t('任意值') }}</el-radio-button>
<el-radio-button :label="1">{{ $t('范围') }}</el-radio-button>
<el-radio-button :label="2">{{ $t('间隔') }}</el-radio-button>
<el-radio-button :label="3">{{ $t('指定') }}</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-if="value.hour.type === 1" :label="$t('范围')">
@ -124,9 +124,9 @@
</el-form-item>
<el-form-item v-if="value.hour.type === 2" :label="$t('间隔')">
<el-input-number v-model="value.hour.loop.start" :max="23" :min="0" controls-position="right"></el-input-number>
小时开始
{{ $t('频率') }}
<el-input-number v-model="value.hour.loop.end" :max="23" :min="0" controls-position="right"></el-input-number>
小时执行一次
{{ $t('小时') }}
</el-form-item>
<el-form-item v-if="value.hour.type === 3" :label="$t('指定')">
<el-select v-model="value.hour.appoint" multiple style="width: 100%">
@ -138,19 +138,19 @@
<el-tab-pane>
<template #label>
<div class="sc-cron-num">
<h2></h2>
<h2>{{ $t('') }}</h2>
<h4>{{ value_day }}</h4>
</div>
</template>
<el-form>
<el-form-item :label="$t('类型')">
<el-radio-group v-model="value.day.type">
<el-radio-button :label="0">任意值</el-radio-button>
<el-radio-button :label="1">范围</el-radio-button>
<el-radio-button :label="2">间隔</el-radio-button>
<el-radio-button :label="3">指定</el-radio-button>
<el-radio-button :label="4">本月最后一天</el-radio-button>
<el-radio-button :label="5">不指定</el-radio-button>
<el-radio-button :label="0">{{ $t('任意值') }}</el-radio-button>
<el-radio-button :label="1">{{ $t('范围') }}</el-radio-button>
<el-radio-button :label="2">{{ $t('间隔') }}</el-radio-button>
<el-radio-button :label="3">{{ $t('指定') }}</el-radio-button>
<el-radio-button :label="4">{{ $t('本月最后一天') }}</el-radio-button>
<el-radio-button :label="5">{{ $t('不指定') }}</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-if="value.day.type === 1" :label="$t('范围')">
@ -160,9 +160,9 @@
</el-form-item>
<el-form-item v-if="value.day.type === 2" :label="$t('间隔')">
<el-input-number v-model="value.day.loop.start" :max="31" :min="1" controls-position="right"></el-input-number>
号开始
{{ $t('频率') }}
<el-input-number v-model="value.day.loop.end" :max="31" :min="1" controls-position="right"></el-input-number>
天执行一次
{{ $t('天') }}
</el-form-item>
<el-form-item v-if="value.day.type === 3" :label="$t('指定')">
<el-select v-model="value.day.appoint" multiple style="width: 100%">
@ -174,17 +174,17 @@
<el-tab-pane>
<template #label>
<div class="sc-cron-num">
<h2></h2>
<h2>{{ $t('') }}</h2>
<h4>{{ value_month }}</h4>
</div>
</template>
<el-form>
<el-form-item :label="$t('类型')">
<el-radio-group v-model="value.month.type">
<el-radio-button :label="0">任意值</el-radio-button>
<el-radio-button :label="1">范围</el-radio-button>
<el-radio-button :label="2">间隔</el-radio-button>
<el-radio-button :label="3">指定</el-radio-button>
<el-radio-button :label="0">{{ $t('任意值') }}</el-radio-button>
<el-radio-button :label="1">{{ $t('范围') }}</el-radio-button>
<el-radio-button :label="2">{{ $t('间隔') }}</el-radio-button>
<el-radio-button :label="3">{{ $t('指定') }}</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-if="value.month.type === 1" :label="$t('范围')">
@ -194,9 +194,9 @@
</el-form-item>
<el-form-item v-if="value.month.type === 2" :label="$t('间隔')">
<el-input-number v-model="value.month.loop.start" :max="12" :min="1" controls-position="right"></el-input-number>
月开始
{{ $t('频率') }}
<el-input-number v-model="value.month.loop.end" :max="12" :min="1" controls-position="right"></el-input-number>
月执行一次
{{ $t('月') }}
</el-form-item>
<el-form-item v-if="value.month.type === 3" :label="$t('指定')">
<el-select v-model="value.month.appoint" multiple style="width: 100%">
@ -208,7 +208,7 @@
<el-tab-pane>
<template #label>
<div class="sc-cron-num">
<h2></h2>
<h2>{{ $t('') }}</h2>
<h4>{{ value_week }}</h4>
</div>
</template>
@ -216,12 +216,12 @@
<el-form>
<el-form-item :label="$t('类型')">
<el-radio-group v-model="value.week.type">
<el-radio-button :label="0">任意值</el-radio-button>
<el-radio-button :label="1">范围</el-radio-button>
<el-radio-button :label="2">间隔</el-radio-button>
<el-radio-button :label="3">指定</el-radio-button>
<el-radio-button :label="4">本月最后一周</el-radio-button>
<el-radio-button :label="5">不指定</el-radio-button>
<el-radio-button :label="0">{{ $t('任意值') }}</el-radio-button>
<el-radio-button :label="1">{{ $t('范围') }}</el-radio-button>
<el-radio-button :label="2">{{ $t('间隔') }}</el-radio-button>
<el-radio-button :label="3">{{ $t('指定') }}</el-radio-button>
<el-radio-button :label="4">{{ $t('本月最后一周') }}</el-radio-button>
<el-radio-button :label="5">{{ $t('不指定') }}</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-if="value.week.type === 1" :label="$t('范围')">
@ -234,13 +234,12 @@
</el-select>
</el-form-item>
<el-form-item v-if="value.week.type === 2" :label="$t('间隔')">
<el-input-number v-model="value.week.loop.start" :max="4" :min="1" controls-position="right"></el-input-number>
周的星期
{{ $t('频率') }}
<el-select v-model="value.week.loop.end" style="width: 10rem">
<el-option v-for="(item, index) in data.week" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
执行一次
{{ $t('执行一次') }}
</el-form-item>
<el-form-item v-if="value.week.type === 3" :label="$t('指定')">
<el-select v-model="value.week.appoint" multiple style="width: 100%">
@ -258,18 +257,18 @@
<el-tab-pane>
<template #label>
<div class="sc-cron-num">
<h2></h2>
<h2>{{ $t('') }}</h2>
<h4>{{ value_year }}</h4>
</div>
</template>
<el-form>
<el-form-item :label="$t('类型')">
<el-radio-group v-model="value.year.type">
<el-radio-button :label="-1">忽略</el-radio-button>
<el-radio-button :label="0">任意值</el-radio-button>
<el-radio-button :label="1">范围</el-radio-button>
<el-radio-button :label="2">间隔</el-radio-button>
<el-radio-button :label="3">指定</el-radio-button>
<el-radio-button :label="-1">{{ $t('忽略') }}</el-radio-button>
<el-radio-button :label="0">{{ $t('任意值') }}</el-radio-button>
<el-radio-button :label="1">{{ $t('范围') }}</el-radio-button>
<el-radio-button :label="2">{{ $t('间隔') }}</el-radio-button>
<el-radio-button :label="3">{{ $t('指定') }}</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-if="value.year.type === 1" :label="$t('范围')">
@ -279,9 +278,9 @@
</el-form-item>
<el-form-item v-if="value.year.type === 2" :label="$t('间隔')">
<el-input-number v-model="value.year.loop.start" controls-position="right"></el-input-number>
年开始
{{ $t('频率') }}
<el-input-number v-model="value.year.loop.end" :min="1" controls-position="right"></el-input-number>
年执行一次
{{ $t('年') }}
</el-form-item>
<el-form-item v-if="value.year.type === 3" :label="$t('指定')">
<el-select v-model="value.year.appoint" multiple style="width: 100%">
@ -294,8 +293,8 @@
</div>
<template #footer>
<el-button @click="dialogVisible = false"> </el-button>
<el-button @click="submit()" type="primary"> </el-button>
<el-button @click="dialogVisible = false">{{ $t('取消') }}</el-button>
<el-button @click="submit()" type="primary">{{ $t('确认') }}</el-button>
</template>
</el-dialog>
</template>
@ -465,31 +464,31 @@ export default {
week: [
{
value: '1',
label: '周日',
label: this.$t('周日'),
},
{
value: '2',
label: '周一',
label: this.$t('周一'),
},
{
value: '3',
label: '周二',
label: this.$t('周二'),
},
{
value: '4',
label: '周三',
label: this.$t('周三'),
},
{
value: '5',
label: '周四',
label: this.$t('周四'),
},
{
value: '6',
label: '周五',
label: this.$t('周五'),
},
{
value: '7',
label: '周六',
label: this.$t('周六'),
},
],
year: this.getYear(),

View File

@ -14,7 +14,7 @@
<img :src="src" ref="img" />
</div>
<div class="sc-cropper__preview">
<h4>图像预览</h4>
<h4>{{ $t('图像预览') }}</h4>
<div class="sc-cropper__preview__img" ref="preview"></div>
</div>
</div>

View File

@ -9,7 +9,7 @@
<template>
<slot :open="open">
<el-button @click="open" plain type="primary">导出</el-button>
<el-button @click="open" plain type="primary">{{ $t('导出') }}</el-button>
</slot>
<el-drawer v-model="dialog" :size="400" :title="$t('导出')" append-to-body destroy-on-close direction="rtl">
<el-main style="padding: 0 20px 20px 20px">
@ -42,7 +42,9 @@
type="primary"
>发起导出任务
</el-button>
<el-button v-else @click="download" icon="el-icon-download" size="large" style="width: 100%" type="primary"> </el-button>
<el-button v-else @click="download" icon="el-icon-download" size="large" style="width: 100%" type="primary">{{
$t('下 载')
}}</el-button>
</el-tab-pane>
<el-tab-pane v-if="columnData.length > 0" :label="$t('列设置')" lazy>
<columnSet :column="columnData"></columnSet>
@ -188,7 +190,7 @@ export default {
this.dialog = false
this.$msgbox({
title: '成功发起任务',
message: `<p>已成功发起导出任务,您可以操作其他事务</p><p>稍后可在 <b>任务中心</b> 查看执行结果</p>`,
message: `<p>{{ $t('已成功发起导出任务,您可以操作其他事务') }}</p><p>{{ $t('稍后可在 ') }}<b>{{ $t('任务中心') }}</b> 查看执行结果</p>`,
type: 'success',
confirmButtonText: '知道了',
dangerouslyUseHTMLString: true,

View File

@ -9,7 +9,7 @@
<template>
<slot :open="open">
<el-button @click="open" plain type="primary">导入</el-button>
<el-button @click="open" plain type="primary">{{ $t('导入') }}</el-button>
</slot>
<el-dialog v-model="dialog" :close-on-click-modal="false" :title="$t('导入')" :width="550" append-to-body destroy-on-close>
<el-progress v-if="loading" :percentage="percentage" :stroke-width="20" :text-inside="true" style="margin-bottom: 1rem" />
@ -31,14 +31,16 @@
<el-icon class="el-icon--upload">
<el-icon-upload-filled />
</el-icon>
<div class="el-upload__text">将文件拖到此处或 <em>点击选择文件上传</em></div>
<div class="el-upload__text">
{{ $t('将文件拖到此处或 ') }}<em>{{ $t('点击选择文件上传') }}</em>
</div>
</slot>
<template #tip>
<div class="el-upload__tip">
<template v-if="tip">{{ tip }}</template>
<template v-else>请上传小于或等于 {{ maxSize }}M {{ accept }} 格式文件</template>
<template v-else>{{ $t('请上传小于或等于 {{ maxSize }}M {{ accept }} 格式文件') }}</template>
<p v-if="templateUrl" style="margin-top: 7px">
<el-link :href="templateUrl" :underline="false" target="_blank" type="primary">下载导入模板</el-link>
<el-link :href="templateUrl" :underline="false" target="_blank" type="primary">{{ $t('下载导入模板') }}</el-link>
</p>
</div>
</template>

View File

@ -46,10 +46,10 @@
action=""
class="sc-file-select__upload"
multiple>
<el-button icon="el-icon-upload" type="primary">本地上传</el-button>
<el-button icon="el-icon-upload" type="primary">{{ $t('本地上传') }}</el-button>
</el-upload>
<span class="tips"
><el-icon><el-icon-warning /></el-icon>大小不超过{{ maxSize }}MB</span
><el-icon><el-icon-warning /></el-icon>{{ $t('大小不超过{{ maxSize }}MB') }}</span
>
</div>
<div class="keyword">
@ -117,7 +117,7 @@
</div>
<div class="sc-file-select__do">
<slot name="do"></slot>
<el-button :disabled="value.length <= 0" @click="submit" type="primary"> </el-button>
<el-button :disabled="value.length <= 0" @click="submit" type="primary">{{ $t('确 定') }}</el-button>
</div>
</div>
</div>

View File

@ -21,12 +21,12 @@
<el-tabs class="root">
<el-tab-pane lazy>
<template #label>
<div class="tabs-label">过滤项</div>
<div class="tabs-label">{{ $t('过滤项') }}</div>
</template>
<el-scrollbar>
<div class="sc-filter-main">
<h2>设置过滤条件</h2>
<div v-if="filter.length <= 0" class="nodata">没有默认过滤条件请点击增加过滤项</div>
<h2>{{ $t('设置过滤条件') }}</h2>
<div v-if="filter.length <= 0" class="nodata">{{ $t('没有默认过滤条件请点击增加过滤项') }}</div>
<table v-else>
<colgroup>
<col width="50" />
@ -158,13 +158,13 @@
</td>
</tr>
</table>
<el-button @click="addFilter" icon="el-icon-plus" text type="primary">增加过滤项</el-button>
<el-button @click="addFilter" icon="el-icon-plus" text type="primary">{{ $t('增加过滤项') }}</el-button>
</div>
</el-scrollbar>
</el-tab-pane>
<el-tab-pane lazy>
<template #label>
<div class="tabs-label">常用</div>
<div class="tabs-label">{{ $t('常用') }}</div>
</template>
<el-scrollbar>
<my :data="myFilter" :filterName="filterName" @selectMyfilter="selectMyfilter" ref="my"></my>
@ -173,9 +173,9 @@
</el-tabs>
</el-main>
<el-footer>
<el-button :disabled="filter.length <= 0" @click="ok" type="primary">立即过滤</el-button>
<el-button :disabled="filter.length <= 0" @click="saveMy" plain type="primary">另存为常用</el-button>
<el-button @click="clear">清空过滤</el-button>
<el-button :disabled="filter.length <= 0" @click="ok" type="primary">{{ $t('立即过滤') }}</el-button>
<el-button :disabled="filter.length <= 0" @click="saveMy" plain type="primary">{{ $t('另存为常用') }}</el-button>
<el-button @click="clear">{{ $t('清空过滤') }}</el-button>
</el-footer>
</el-container>
</el-drawer>
@ -333,7 +333,7 @@ export default {
//
saveMy() {
this.$prompt('常用过滤名称', '另存为常用', {
inputPlaceholder: '请输入识别度较高的常用过滤名称',
inputplaceholder: $t('请输入识别度较高的常用过滤名称'),
inputPattern: /\S/,
inputErrorMessage: '名称不能为空',
})

View File

@ -15,12 +15,12 @@
<template v-else>
<el-empty v-if="myFilter.length <= 0" :image-size="100">
<template #description>
<h2>没有常用的过滤</h2>
<p style="margin-top: 10px; max-width: 300px">常用过滤可以将多个过滤条件保存为一个集合方便下次进行相同条件的过滤</p>
<h2>{{ $t('没有常用的过滤') }}</h2>
<p style="margin-top: 10px; max-width: 300px">{{ $t('常用过滤可以将多个过滤条件保存为一个集合,方便下次进行相同条件的过滤') }}</p>
</template>
</el-empty>
<ul v-else class="sc-filter-my-list">
<h2>我的常用过滤</h2>
<h2>{{ $t('我的常用过滤') }}</h2>
<li v-for="(item, index) in myFilter" :key="index" @click="selectMyfilter(item)">
<label>{{ item.title }}</label>
<el-popconfirm :title="$t('确认删除此常用过滤吗?')" @confirm="closeMyfilter(item, index)">

View File

@ -48,8 +48,8 @@
</el-tabs>
</div>
<template #footer>
<el-button @click="clear" text>清除</el-button>
<el-button @click="dialogVisible = false">取消</el-button>
<el-button @click="clear" text>{{ $t('清除') }}</el-button>
<el-button @click="dialogVisible = false">{{ $t('取消') }}</el-button>
</template>
</el-dialog>
</div>

View File

@ -9,7 +9,7 @@
<template>
<div class="sc-select-filter">
<div v-if="data.length <= 0" class="sc-select-filter__no-data">暂无数据</div>
<div v-if="data.length <= 0" class="sc-select-filter__no-data">{{ $t('暂无数据') }}</div>
<div v-for="item in data" :key="item.key" class="sc-select-filter__item">
<div :style="{ width: labelWidth + 'rem' }" class="sc-select-filter__item-title">
<label>{{ item.title }}</label>

View File

@ -2,11 +2,11 @@
<div v-if="usercolumn.length > 0" v-loading="isSave" class="setting-column">
<div class="setting-column__title">
<span class="move_b"></span>
<span class="show_b">显示</span>
<span class="name_b">名称</span>
<span class="width_b">宽度</span>
<span class="sortable_b">排序</span>
<span class="fixed_b">固定</span>
<span class="show_b">{{ $t('显示') }}</span>
<span class="name_b">{{ $t('名称') }}</span>
<span class="width_b">{{ $t('宽度') }}</span>
<span class="sortable_b">{{ $t('排序') }}</span>
<span class="fixed_b">{{ $t('固定') }}</span>
</div>
<div class="setting-column__list" ref="list">
<ul>
@ -31,8 +31,8 @@
</ul>
</div>
<div class="setting-column__bottom">
<el-button :disabled="isSave" @click="backDefaul">重置</el-button>
<el-button @click="save" type="primary">保存</el-button>
<el-button :disabled="isSave" @click="backDefaul">{{ $t('重置') }}</el-button>
<el-button @click="save" type="primary">{{ $t('保存') }}</el-button>
</div>
</div>
<el-empty v-else :description="$t('暂无可配置的列')" :image-size="80"></el-empty>

View File

@ -96,9 +96,9 @@
<el-form label-position="left" label-width="10rem">
<el-form-item :label="$t('表格尺寸')">
<el-radio-group v-model="config.size" @change="configSizeChange" size="small">
<el-radio-button label="large"></el-radio-button>
<el-radio-button label="default">正常</el-radio-button>
<el-radio-button label="small"></el-radio-button>
<el-radio-button label="large">{{ $t('') }}</el-radio-button>
<el-radio-button label="default">{{ $t('正常') }}</el-radio-button>
<el-radio-button label="small">{{ $t('') }}</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item :label="$t('样式')">
@ -133,42 +133,47 @@
title="≤"></sc-contextmenu-item>
<sc-contextmenu-item
:command="`${menu}^|^Contains^|^${tool.getNestedProperty(current.row, menu) ?? ''}`"
divided
title="包含"></sc-contextmenu-item>
:title="$t('包含')"
divided></sc-contextmenu-item>
<sc-contextmenu-item
:command="`${menu}^|^NotContains^|^${tool.getNestedProperty(current.row, menu) ?? ''}`"
title="不含"></sc-contextmenu-item>
:title="$t('不含')"></sc-contextmenu-item>
<sc-contextmenu-item
:command="`${menu}^|^StartsWith^|^${tool.getNestedProperty(current.row, menu) ?? ''}`"
divided
title="以 x 开始"></sc-contextmenu-item>
:title="$t('以 x 开始')"
divided></sc-contextmenu-item>
<sc-contextmenu-item
:command="`${menu}^|^NotStartsWith^|^${tool.getNestedProperty(current.row, menu) ?? ''}`"
title="非 x 开始"></sc-contextmenu-item>
:title="$t('非 x 开始')"></sc-contextmenu-item>
<sc-contextmenu-item
:command="`${menu}^|^EndsWith^|^${tool.getNestedProperty(current.row, menu) ?? ''}`"
title="以 x 结束"></sc-contextmenu-item>
:title="$t('以 x 结束')"></sc-contextmenu-item>
<sc-contextmenu-item
:command="`${menu}^|^NotEndsWith^|^${tool.getNestedProperty(current.row, menu) ?? ''}`"
title="非 x 结束"></sc-contextmenu-item>
:title="$t('非 x 结束')"></sc-contextmenu-item>
<sc-contextmenu-item
:command="`${menu}^|^Range^|^${tool.getNestedProperty(current.row, menu) ?? ''}`"
divided
title="数值范围"></sc-contextmenu-item>
:title="$t('数值范围')"
divided></sc-contextmenu-item>
<sc-contextmenu-item
:command="`${menu}^|^DateRange^|^${tool.getNestedProperty(current.row, menu) ?? ''}`"
title="日期范围"></sc-contextmenu-item>
:title="$t('日期范围')"></sc-contextmenu-item>
<sc-contextmenu-item
:command="`${menu}^|^Any^|^${tool.getNestedProperty(current.row, menu) ?? ''}`"
divided
title="为其一"></sc-contextmenu-item>
:title="$t('为其一')"
divided></sc-contextmenu-item>
<sc-contextmenu-item
:command="`${menu}^|^NotAny^|^${tool.getNestedProperty(current.row, menu) ?? ''}`"
title="非其一"></sc-contextmenu-item>
:title="$t('非其一')"></sc-contextmenu-item>
</sc-contextmenu-item>
<sc-contextmenu-item v-if="contextOpers.includes('view')" command="view" divided icon="el-icon-view" title="查看"></sc-contextmenu-item>
<sc-contextmenu-item v-if="contextOpers.includes('edit')" command="edit" icon="el-icon-edit" title="编辑"></sc-contextmenu-item>
<sc-contextmenu-item v-if="contextOpers.includes('del')" command="del" icon="el-icon-delete" title="删除"></sc-contextmenu-item>
<sc-contextmenu-item
v-if="contextOpers.includes('view')"
:title="$t('查看')"
command="view"
divided
icon="el-icon-view"></sc-contextmenu-item>
<sc-contextmenu-item v-if="contextOpers.includes('edit')" :title="$t('编辑')" command="edit" icon="el-icon-edit"></sc-contextmenu-item>
<sc-contextmenu-item v-if="contextOpers.includes('del')" :title="$t('删除')" command="del" icon="el-icon-delete"></sc-contextmenu-item>
<sc-contextmenu-item
v-for="(adv, index) in contextAdvs"
:command="adv"
@ -177,7 +182,7 @@
:key="index"
:title="adv.label">
</sc-contextmenu-item>
<sc-contextmenu-item command="refresh" divided icon="el-icon-refresh" suffix="Ctrl+R" title="重新加载"></sc-contextmenu-item>
<sc-contextmenu-item :title="$t('重新加载')" command="refresh" divided icon="el-icon-refresh" suffix="Ctrl+R"></sc-contextmenu-item>
</sc-contextmenu>
</template>
<script>
@ -343,7 +348,7 @@ export default {
}
if (command === 'del') {
try {
await this.$confirm(h('div', [h('p', '是否确认删除?'), h('p', this.current.row.id)]), '提示', {
await this.$confirm(h('div', [h('p', this.$t('是否确认删除?')), h('p', this.current.row.id)]), this.$t('提示'), {
type: 'warning',
})
} catch {
@ -356,8 +361,8 @@ export default {
const kv = command.split('^|^')
let value
try {
value = await this.$prompt(`仅显示 ${kv[0]} ${kv[1]}`, '高级筛选', {
inputPlaceholder: '一行一个',
value = await this.$prompt(this.$t('仅显示 {field} {operator}', { field: kv[0], operator: kv[1] }), this.$t('高级筛选'), {
inputplaceholder: this.$t('一行一个'),
inputPattern: /.*/,
inputType: 'textarea',
inputValue: kv[2],

View File

@ -73,7 +73,7 @@ export default {
type: Object,
default: () => {},
},
placeholder: { type: String, default: '请选择' },
placeholder: { type: String },
size: { type: String, default: 'default' },
clearable: { type: Boolean, default: false },
multiple: { type: Boolean, default: false },

View File

@ -51,8 +51,8 @@
<el-dialog v-model="cropperDialogVisible" :title="$t('剪裁')" :width="580" @closed="cropperClosed" destroy-on-close draggable>
<sc-cropper :aspectRatio="aspectRatio" :compress="compress" :src="cropperFile.tempCropperFile" ref="cropper"></sc-cropper>
<template #footer>
<el-button @click="cropperDialogVisible = false"> </el-button>
<el-button @click="cropperSave" type="primary"> </el-button>
<el-button @click="cropperDialogVisible = false">{{ $t('取消') }}</el-button>
<el-button @click="cropperSave" type="primary">{{ $t('确 定') }}</el-button>
</template>
</el-dialog>
</div>

View File

@ -47,7 +47,7 @@ import scWaterMark from '@/components/scWaterMark'
// net-admin组件
import naArea from '@/components/naArea/index.vue'
import naButtonAdd from '@/components/naButtonAdd/index.vue'
import naButtonBatchDel from '@/components/naButtonBatchDel/index.vue'
import naButtonBulkDel from '@/components/naButtonBulkDel/index.vue'
import naColAvatar from '@/components/naColAvatar'
import naColId from '@/components/naColId/index.vue'
import naColIndicator from '@/components/naColIndicator/index.vue'
@ -88,7 +88,7 @@ export default {
// net-admin组件
app.component('naArea', naArea)
app.component('naButtonAdd', naButtonAdd)
app.component('naButtonBatchDel', naButtonBatchDel)
app.component('naButtonBulkDel', naButtonBulkDel)
app.component('naColAvatar', naColAvatar)
app.component('naColId', naColId)
app.component('naColIndicator', naColIndicator)

View File

@ -22,7 +22,7 @@
</el-tag>
</div>
<div class="sc-search-result">
<div v-if="result.length <= 0" class="sc-search-no-result">暂无搜索结果</div>
<div v-if="result.length <= 0" class="sc-search-no-result">{{ $t('暂无搜索结果') }}</div>
<ul v-else>
<el-scrollbar max-height="30rem">
<li v-for="item in result" :key="item.path" @click="to(item)">

View File

@ -3,7 +3,7 @@
<el-main>
<el-empty v-if="jobs.length === 0" :image-size="120">
<template #description>
<h2>没有正在执行的作业</h2>
<h2>{{ $t('没有正在执行的作业') }}</h2>
</template>
<p style="color: #999; line-height: 1.5; margin: 0 3rem">
在处理耗时过久的作业时为了不阻碍正在处理的工作可在作业中心进行异步执行
@ -17,15 +17,17 @@
<div class="jobMain">
<div class="title">
<h2>{{ job.jobName }}</h2>
<p>上次执行<span v-time.tip="job.lastExecTime"></span></p>
<p>{{ $t('上次执行:') }}<span v-time.tip="job.lastExecTime"></span></p>
<p>
下次执行<span>{{ job.nextExecTime }}</span>
</p>
</div>
<div class="bottom">
<div class="status">
<el-tag v-if="job.status === 'running'" type="warning">执行中</el-tag>
<el-tag v-if="job.status === 'idle'" :type="job.lastStatusCode === 'ok' ? 'primary' : 'danger'">空闲</el-tag>
<el-tag v-if="job.status === 'running'" type="warning">{{ $t('执行中') }}</el-tag>
<el-tag v-if="job.status === 'idle'" :type="job.lastStatusCode === 'ok' ? 'primary' : 'danger'">{{
$t('空闲')
}}</el-tag>
</div>
<div class="handler">
<el-button

View File

@ -141,7 +141,7 @@ export default {
this.$router.push({ path: '/cmd' })
}
if (command === 'clearCache') {
this.$confirm('清除缓存会将系统初始化,包括登录状态、主题、语言设置等,是否继续?', '提示', {
this.$confirm(this.$t('清除缓存会将系统初始化,包括登录状态、主题、语言设置等,是否继续?'), this.$t('提示'), {
type: 'info',
})
.then(() => {
@ -159,9 +159,9 @@ export default {
})
}
if (command === 'outLogin') {
this.$confirm('确认是否退出当前用户?', '提示', {
this.$confirm(this.$t('确认是否退出当前用户?'), this.$t('提示'), {
type: 'warning',
confirmButtonText: '退出',
confirmButtonText: this.$t('退出'),
confirmButtonClass: 'el-button--danger',
})
.then(() => {

View File

@ -4,11 +4,11 @@
<img src="@/assets/img/404.png" />
</div>
<div class="router-err__content">
<h2>无权限或找不到页面</h2>
<p>当前页面无权限访问或者打开了一个不存在的链接请检查当前账户权限和链接的可访问性</p>
<el-button @click="goHome" plain round type="primary">返回首页</el-button>
<el-button @click="goLogin" plain round type="primary">重新登录</el-button>
<el-button @click="goBack" round type="primary">返回上一页</el-button>
<h2>{{ $t('无权限或找不到页面') }}</h2>
<p>{{ $t('当前页面无权限访问或者打开了一个不存在的链接,请检查当前账户权限和链接的可访问性。') }}</p>
<el-button @click="goHome" plain round type="primary">{{ $t('返回首页') }}</el-button>
<el-button @click="goLogin" plain round type="primary">{{ $t('重新登录') }}</el-button>
<el-button @click="goBack" round type="primary">{{ $t('返回上一页') }}</el-button>
</div>
</div>
</template>

View File

@ -3,7 +3,6 @@ export default {
'15分钟': '15 minutes',
'1分钟': '1 minute',
'20分钟': '20 minutes',
'24小时免登录': '24-hour login-free',
'25分钟': '25 minutes',
'30分钟': '30 minutes',
'35分钟': '35 minutes',
@ -13,129 +12,433 @@ export default {
'55分钟': '55 minutes',
'5分钟': '5 minutes',
'60分钟': '60 minutes',
'用户名 / 手机 / 邮箱': 'Username / Mobile phone / Email',
'耗时(毫秒)': '耗时(毫秒)',
'还没有账号?': "Don't have an account?",
'上次执行耗时(毫秒)': 'Last execution time (milliseconds)',
'作业编号 / 作业名称': 'Job ID / Job name',
'作业编号 / 执行编号': 'Job ID / Execution ID',
'删除 {count} 项': 'Delete the {count} item',
'日志编号 / 用户 / 客户端IP': 'Log ID / User / Client IP',
'日志编号 / 登录名 / 客户端IP': 'Log ID / Login Name / Client IP',
'消息编号 / 消息主题 / 消息内容': 'Message ID / Message subject / Message content',
'用户编号 / 用户名 / 手机号 / 邮箱 / 备注': 'User ID / Username / Mobile Phone Number / Email / Remarks',
'确定删除选中的 {count} 项吗?': 'Are you sure you want to delete the selected {count} item?',
'角色编号 / 角色名称 / 备注': 'Role ID / Role Name / Remarks',
'部门编号 / 部门名称 / 备注': 'Department ID / Department Name / Remarks',
'项名 / 项值': 'Item Name / Item Value',
English: 'English',
上传头像: '上传头像',
个人设置: 'Personal settings',
主题样式: 'Theme style',
主题颜色: 'Theme color',
二维码登录: 'QR code login',
人工审核: '人工审核',
上传头像: 'Upload your avatar',
上次执行: 'Last executed',
上次执行时间: 'Last Execution Time',
上级菜单: 'Parent menu',
上级部门: 'Parent department',
下次执行时间: 'Next execution time',
下次执行时间编号: 'Next execution time ID',
个人中心: 'Personal Center',
个人设置: 'Settings',
主题样式: 'Theme styles',
主题颜色: 'Theme colors',
人工审核: 'Manual review',
从不: 'Never',
作业中心: '作业中心',
关于项目: '关于项目',
其他登录方式: 'Other login methods',
内存使用量: '内存使用量',
创建新账号: 'Create a new account',
创建时间: '创建时间',
剪裁: '剪裁',
代码: 'Code',
仪表板: 'Dashboard',
住宅地址: 'Residential address',
住宅电话: 'Residential phones',
作业中心: 'Job Center',
作业分布: 'Job distribution',
作业名称: 'Job name',
作业名称不能为空: 'The job name cannot be empty',
作业状态: 'Status',
作业编号: 'Job ID',
作业趋势: 'Job trends',
保存: 'Save',
修改密码: 'Change your password',
修改时间: 'Modify time',
修改者用户名: 'Modifier username',
修改者编号: 'Modifier ID',
全部: 'All',
其他设置: 'Other settings',
内存使用量: 'Memory usage',
出生日期: 'Date of birth',
创建时间: 'Creation time',
创建者用户名: 'Creator username',
创建者编号: 'Creator ID',
初始密码: 'Initial password',
删除作业: 'Delete job',
删除消息: 'Delete message',
别名: 'Alias',
剪裁: 'Crop',
功能坞: 'Dock',
启用: '启用',
响应码: '响应码',
图标名称: '图标名称',
基本设置: '基本设置',
备注: '备注',
: '天',
头像: '头像',
存储空间信息: '存储空间信息',
客户端IP: '客户端IP',
密码: '密码',
已扫描: 'Scanned',
开始日期: '开始日期',
忘记密码: 'Forgot your password?',
所属角色: '所属角色',
所属部门: '所属部门',
手机号: '手机号',
手机号登录: 'Mobile phone login',
手机号码: '手机号码',
原始数据: 'Raw data',
取消: 'Cancel',
同步接口: 'Synchronize Interface',
启用: 'Enable',
启用状态: 'Enabled status',
响应状态码: 'Response status code',
响应码: 'Response code',
唯一编码: 'Unique code',
图标名称: 'Icon name',
图标选择器: 'Icon selector',
地区: 'Region',
基本信息: 'Basic information',
基本设置: 'Basic settings',
备注: 'Remarks',
: 'Large',
: 'Days',
失败: 'Failed',
头像: 'Avatar',
婚姻状况: 'Marital status',
字典分类: 'Dictionary Classification',
客户端IP: 'Client IP',
密码: 'Password',
: 'Small',
工作单位: 'Work unit',
工作台: 'Workbench',
工作地址: 'Work address',
工作电话: 'Work phone',
已应用的查询条件: 'Applied query conditions',
开发依赖: 'Development dependencies',
开启人工审核: 'Enable manual review',
开始日期: 'Start date',
性别: 'Gender',
成功: 'Successful',
我的消息: 'My messages',
所属字典: 'Dictionary',
所属角色: 'Role',
所属部门: 'Department',
手机号: 'Mobile',
手机号码: 'Mobile phone number',
手风琴菜单: 'Accordion menu',
折叠菜单: 'Collapsible menu',
排序: '排序',
接口名称: '接口名称',
接口描述: '接口描述',
接口路径: '接口路径',
描述: '描述',
搜索: '搜索',
操作: '操作',
操作日志: '操作日志',
操作系统: '操作系统',
数据管理: '数据管理',
数据范围: '数据范围',
斑马纹: '斑马纹',
新消息: '新消息',
方法: '方法',
无限权限: '无限权限',
日志时间: '日志时间',
日志编号: '日志编号',
时钟: '时钟',
显示仪表板: '显示仪表板',
执行用户: 'Executing user',
执行用户不能为空: 'Executing user cannot be empty',
执行用户编号: 'Executing user ID',
执行耗时: 'Execution time',
执行计划: 'Execution plan',
执行计划不正确: 'Execution plan is incorrect',
执行记录: 'Execution record',
折叠菜单: 'Collapse menu',
排序: 'Sort',
接口名称: 'API name',
接口描述: 'API description',
接口权限: 'API permissions',
接口路径: 'API path',
控制台: 'Console',
控制台视图: 'Console view',
提示: 'Prompt',
搜索: 'Search',
操作系统: 'Operating system',
操作结果: 'Operation result',
政治面貌: 'Political affiliation',
数据版本: 'Data version',
数据管理: 'Data management',
数据范围: 'Data scope',
整页路由: 'Full page routing',
文化程度: 'Educational level',
斑马纹: 'Zebra pattern',
新增作业: 'Add job',
新增字典项: 'Add Dictionary Item',
新增消息: 'Add Message',
新增用户: 'Add User',
新增角色: 'Add Role',
新增部门: 'Add Department',
新增配置: 'Add Configuration',
新密码: 'New password',
新手机号码: 'New mobile phone number',
新手机验证码: 'New mobile verification code',
新消息: 'New message',
方法: 'Method',
无限权限: 'Unlimited permissions',
日志编号: 'Log ID',
旧密码: 'Old password',
时间: 'Time',
是否隐藏: 'Is hidden',
显示仪表板: 'Display dashboard',
显示名称: 'Display name',
更换手机: 'Change mobile phone',
更新日志: 'Change logs',
查看作业: 'View job',
查看字典项: 'View Dictionary Item',
查看消息: 'View Message',
查看用户: 'View User',
查看角色: 'View Role',
查看部门: 'View Department',
查看配置: 'View Configuration',
查询: 'Search',
标签: 'Tag',
标签栏: 'Tab bar',
样式: '样式',
框架布局: 'Frame layout',
模块名称: '模块名称',
模块类型: '模块类型',
模块说明: '模块说明',
模拟3秒后自动扫描: 'Simulate automatic scan after 3 seconds',
欢迎: '欢迎',
注册时间: '注册时间',
注释信息: '注释信息',
滑动过期: '滑动过期',
版本信息: '版本信息',
状态: '状态',
用户: '用户',
用户名: '用户名',
用户名称: '用户名称',
用户注册: '用户注册',
用户编号: '用户编号',
电子邮箱: '电子邮箱',
样式: 'Style',
框架布局: 'Framework layout',
档案信息: 'File information',
模块名称: 'Module name',
模块类型: 'Module type',
模块说明: 'Module description',
正常: 'Normal',
每分钟: 'Every Minute',
每周星期日零点: 'Every Sunday at Midnight',
每天零点: 'Every Day at Midnight',
每小时: 'Every Hour',
每月一号零点: 'The First of Every Month at Midnight',
每月最后一天零点: 'The Last Day of Every Month at Midnight',
毕业学校: 'Graduation school',
民族: 'Ethnic group',
注册时间: 'Registration time',
注释信息: 'Annotation information',
消息中心: 'Message center',
消息主题: 'Message subject',
消息内容: 'Message content',
消息摘要: 'Message summary',
消息类型: 'Message type',
消息编号: 'Message ID',
清除缓存: 'Clear cache',
滑动过期: 'Sliding expiration',
状态: 'Status',
状态码: 'Status Code',
用于控制角色登录后控制台的视图: 'Used to control the console view after role login',
用于登录系统: 'Used to log in to the system',
用户代理: 'User agent',
用户名: 'Username',
用户名称: 'User name',
用户注册: 'User registration',
用户注册设置: 'User registration settings',
用户编号: 'User ID',
电子邮箱: 'Email',
界面语言: 'Interface language',
登录: 'Log in',
登录名: 'Login name',
登录密码: 'Login password',
登录结果: 'Login result',
登录账号: 'Login account',
真实姓名: 'Real name',
短信验证码: 'SMS verification code',
确认新密码: 'Confirm new password',
禁用: 'Disable',
简体中文: 'Simplified Chinese',
粘贴SVG代码: '粘贴SVG代码',
系统设置: '系统设置',
纵向边框: '纵向边框',
籍贯: 'Native place',
类型: 'Type',
粘贴SVG代码: 'Paste SVG code',
系统设置: 'System settings',
紧急联系人: 'Emergency contact',
纵向边框: 'Vertical border',
经典: 'Classic',
结束日期: '结束日期',
绝对过期: '绝对过期',
缓存命中率: '缓存命中率',
缓存数量: '缓存数量',
缓存管理: '缓存管理',
缓存统计: '缓存统计',
自动登出: 'Auto logout',
: '至',
表单代码: '表单代码',
表格代码: '表格代码',
表格尺寸: '表格尺寸',
表格设置: '表格设置',
角色名称: '角色名称',
角色编号: '角色编号',
请使用微信扫一扫登录: 'Please use WeChat to scan and log in',
请在设备中点击授权登录: 'Please authorize and log in on your device',
请求方式: '请求方式',
请求服务: '请求服务',
请输入密码: 'Please enter your password',
请输入用户名: 'Please enter your username',
请选择左侧菜单后操作: '请选择左侧菜单后操作',
账号信息: '账号信息',
账号登录: 'Account login',
路径: '路径',
输入关键字进行过滤: '输入关键字进行过滤',
进度环: '进度环',
通栏: 'Full column',
通知设置: '通知设置',
邮箱: '邮箱',
部门名称: '部门名称',
部门编号: '部门编号',
配置编号: '配置编号',
键值: '键值',
键名: '键名',
项值: '项值',
项名: '项名',
黑夜模式: 'Dark mode',
绑定手机: 'Bind mobile phone',
结束日期: 'End date',
结果: 'Result',
绝对过期: 'Absolute expiration',
缓存命中率: 'Cache hit rate',
缓存数量: 'Cache quantity',
编辑作业: 'Edit job',
编辑字典项: 'Edit Dictionary Item',
编辑消息: 'Edit Message',
编辑用户: 'Edit User',
编辑角色: 'Edit Role',
编辑部门: 'Edit Department',
编辑配置: 'Edit Configuration',
耗时: 'Duration',
职业: 'Occupation',
联系人地址: 'Contact address',
联系人手机号: 'Contact mobile number',
自动登出: 'Automatic logout',
自定义: 'Custom',
: 'To',
菜单别名: 'Menu alias',
菜单图标: 'Menu icon',
菜单显示名字: 'Menu display name',
菜单权限: 'Menu permissions',
菜单高亮: 'Menu highlight',
表单代码: 'Form code',
表格代码: 'Table code',
表格尺寸: 'Table size',
表格设置: 'Table settings',
规则类型: 'Rule type',
视图: 'View',
角色名称: 'Role name',
角色编号: 'Role ID',
设置邮箱: 'Set email',
访问分布: 'Access distribution',
访问趋势: 'Access trends',
证件号码: 'ID number',
证件类型: 'ID type',
请再次输入新密码: 'Please enter the new password again',
请求体: 'Request body',
请求头: 'Request header',
请求方不能为空: 'Requester cannot be empty',
请求方式: 'Request method',
请求方法: 'Request method',
请求服务: 'Request service',
请求的网络地址: 'Requested network address',
请求的网络地址不正确: 'Requested network address is incorrect',
请输入关键词后检索: 'Please enter keywords and search',
请输入地区或代码: 'Please enter region or code',
请输入当前密码: 'Please enter current password',
请输入手机号: 'Please enter your mobile phone number',
请输入新密码: 'Please enter a new password',
请输入订单号: 'Please enter the order ID',
请输入邮箱: 'Please enter your email address',
请输入部门名称: 'Please enter the name of the department',
请选择左侧菜单后操作: 'Please select a menu on the left before proceeding',
请选择月份: 'Please select a month',
请选择类型: 'Please select a type',
请选择通知类型: 'Please select a notification type',
账号信息: 'Account information',
路径: 'Path',
路由地址: 'Routing address',
身高: 'Height',
输入关键字进行过滤: 'Enter keywords to filter',
运行依赖: 'Run dependencies',
退出登录: 'Logout',
送至用户: 'Send to user',
送至角色: 'Send to role',
送至部门: 'Send to department',
选择部门: 'Select department',
通栏: 'Full screen',
邮箱: 'Email',
邮箱地址: 'Email address',
邮箱验证码: 'Email verification code',
部门名称: 'Department name',
部门编号: 'Department ID',
配置编号: 'Configuration ID',
重定向: 'Redirect',
重置: 'Reset',
键值: 'Key value',
键名: 'Key name',
隐藏菜单: 'Hide Menu',
隐藏面包屑: 'Hide Breadcrumb',
顶级菜单: 'Top menu',
项值: 'Item value',
项名: 'Item name',
颜色: 'Color',
黑夜模式: 'Night mode',
默认: 'Default',
默认角色: '默认角色',
默认部门: '默认部门',
默认角色: 'Default role',
默认部门: 'Default department',
'清除缓存会将系统初始化,包括登录状态、主题、语言设置等,是否继续?':
'Clearing the cache will reset the system, including login status, theme, language settings, etc. Are you sure you want to continue?',
'确认是否退出当前用户?': 'Confirm if you want to log out the current user?',
退出: 'Exit',
账号登录: 'Account login',
手机号登录: 'Phone number login',
'忘记密码?': 'Forgot password?',
'24小时免登录': '24-hour auto-login',
'还没有账号?': 'No account yet?',
创建新账号: 'Create a new account',
返回登录: 'Return to login',
注册新账号: 'Register a new account',
平台服务协议: 'Platform service agreement',
我已阅读并同意: 'I have read and agreed to',
下一步: 'Next',
上一步: 'Previous',
'请输入包含英文、数字的8位以上密码': 'Please enter a password containing English and numbers of 8 or more digits',
请再一次输入登录密码: 'Please enter your login password again',
请输入登录账号: 'Please enter your login account',
请输入登录密码: 'Please enter your login password',
确认密码: 'Confirm password',
用户名已被使用: 'Username has been used',
请阅读并同意协议: 'Please read and agree to the agreement',
填写账号: 'Fill in the account',
验证手机: 'Verify mobile phone',
注册成功: 'Registration successful',
'Star 后可登录': 'Star to login',
登录: 'Login',
获取验证码: 'Get verification code',
提交: 'Submit',
重置密码: 'Reset password',
填写新密码: 'Fill in the new password',
完成重置: 'Complete reset',
请完成安全验证: 'complete the security verification',
向右滑动完成验证: 'Slide to the right',
可以使用登录账号以及手机号登录系统: 'You can log in to the system using the login account and mobile phone number',
前去登录: 'Go to login',
验证失败: 'Verification failed',
'{secs} 秒 验证成功': '{secs} secs verification successful',
密码重置成功: 'Password reset successful',
'请牢记自己的新密码,返回登录后使用新密码登录': 'Please remember your new password. Log in again using the new password',
请再一次输入新密码: 'Please enter the new password again',
两次输入密码不一致: 'The two passwords entered are inconsistent',
必须提供当前登录用户密码才能进行更改: 'You must provide the current login user password to change',
设置密码: 'Set password',
今天: 'Today',
昨天: 'Yesterday',
最近三天: 'Last 3 days',
最近一周: 'Last week',
最近一月: 'Last month',
最近三月: 'Last 3 months',
最近六月: 'Last 6 months',
最近一年: 'Last year',
查看: 'View',
编辑: 'Edit',
删除: 'Delete',
重新加载: 'Reload',
包含: 'Contains',
不含: 'Does not contain',
'以 x 开始': 'Starts with x',
'非 x 开始': 'Does not start with x',
'以 x 结束': 'Ends with x',
'非 x 结束': 'Does not end with x',
数值范围: 'Numeric range',
日期范围: 'Date range',
为其一: 'Is one of',
非其一: 'Is not one of',
'仅显示 {field} {operator}': 'Only show {field} {operator}:',
高级筛选: 'Advanced filtering',
'是否确认删除?': 'Are you sure you want to delete?',
'确定删除 {item} 吗?': 'Are you sure you want to delete {item}?',
'确定 {title}': 'Are you sure you want to {title}?',
'执行耗时(毫秒)': 'Execution time (milliseconds)',
响应体: 'Response body',
响应头: 'Response header',
执行时间编号: 'Execution time ID',
新增字典: 'Add dictionary',
字典名称: 'Dictionary name',
字典编码: 'Dictionary code',
父路径: 'Parent path',
编辑字典: 'Edit dictionary',
操作成功: 'Operation successful',
发现新版本: 'New version found',
'即将开始更新……': 'Update will start soon...',
立即更新: 'Update now',
'CPU 使用率': 'CPU usage',
'Redis 运行时间': 'Redis running time',
'Redis 版本': 'Redis version',
最近一时: 'Recent hour',
昨日此时: 'Yesterday now',
用户: 'User',
'日志详情:{id}': 'Log details: {id}',
生成前端代码: 'Generate front-end code',
生成后端代码: 'Generate back-end code',
生成图标代码: 'Generate icon code',
生成表格代码: 'Generate table code',
生成表单代码: 'Generate form code',
生成: 'Generate',
本页消息已清空: 'This page message has been cleared',
添加应用: 'Add application',
我的常用: 'My common applications',
全部应用: 'All applications',
设置常用成功: 'Set common applications successfully',
暂无搜索结果: 'No search results',
'Cron 规则生成器': 'Cron rule generator',
任意值: 'Any value',
范围: 'Range',
间隔: 'Interval',
指定: 'Specified',
: 'Seconds',
分钟: 'Minutes',
小时: 'Hours',
: 'Days',
: 'Months',
: 'Weeks',
: 'Years',
频率: 'Frequency',
本月最后一天: 'Last day of the month',
不指定: 'Not specified',
本月最后一周: 'Last week of the month',
'已发起执行请求5 秒后弹出执行结果': 'The execution request has been initiated. The execution result will pop up after 5 seconds',
执行一次: 'Execute once',
最后一周: 'Last week',
忽略: 'Ignore',
确认: 'Confirm',
周日: 'Sunday',
周一: 'Monday',
周二: 'Tuesday',
周三: 'Wednesday',
周四: 'Thursday',
周五: 'Friday',
周六: 'Saturday',
JSON格式化: 'JSON formatting',
}

View File

@ -1 +1,443 @@
export default {}
export default {
'10分钟': '10分钟',
'15分钟': '15分钟',
'1分钟': '1分钟',
'20分钟': '20分钟',
'25分钟': '25分钟',
'30分钟': '30分钟',
'35分钟': '35分钟',
'40分钟': '40分钟',
'45分钟': '45分钟',
'50分钟': '50分钟',
'55分钟': '55分钟',
'5分钟': '5分钟',
'60分钟': '60分钟',
'上次执行耗时(毫秒)': '上次执行耗时(毫秒)',
'作业编号 / 作业名称': '作业编号 / 作业名称',
'作业编号 / 执行编号': '作业编号 / 执行编号',
'删除 {count} 项': '删除 {count} 项',
'日志编号 / 用户 / 客户端IP': '日志编号 / 用户 / 客户端IP',
'日志编号 / 登录名 / 客户端IP': '日志编号 / 登录名 / 客户端IP',
'消息编号 / 消息主题 / 消息内容': '消息编号 / 消息主题 / 消息内容',
'用户编号 / 用户名 / 手机号 / 邮箱 / 备注': '用户编号 / 用户名 / 手机号 / 邮箱 / 备注',
'确定删除选中的 {count} 项吗?': '确定删除选中的 {count} 项吗?',
'角色编号 / 角色名称 / 备注': '角色编号 / 角色名称 / 备注',
'部门编号 / 部门名称 / 备注': '部门编号 / 部门名称 / 备注',
'项名 / 项值': '项名 / 项值',
English: 'English',
上传头像: '上传头像',
上次执行: '上次执行',
上次执行时间: '上次执行时间',
上级菜单: '上级菜单',
上级部门: '上级部门',
下次执行时间: '下次执行时间',
下次执行时间编号: '下次执行时间编号',
个人中心: '个人中心',
个人设置: '个人设置',
主题样式: '主题样式',
主题颜色: '主题颜色',
人工审核: '人工审核',
从不: '从不',
代码: '代码',
仪表板: '仪表板',
住宅地址: '住宅地址',
住宅电话: '住宅电话',
作业中心: '作业中心',
作业分布: '作业分布',
作业名称: '作业名称',
作业名称不能为空: '作业名称不能为空',
作业状态: '作业状态',
作业编号: '作业编号',
作业趋势: '作业趋势',
保存: '保存',
修改密码: '修改密码',
修改时间: '修改时间',
修改者用户名: '修改者用户名',
修改者编号: '修改者编号',
全部: '全部',
其他设置: '其他设置',
内存使用量: '内存使用量',
出生日期: '出生日期',
创建时间: '创建时间',
创建者用户名: '创建者用户名',
创建者编号: '创建者编号',
初始密码: '初始密码',
删除作业: '删除作业',
删除消息: '删除消息',
别名: '别名',
剪裁: '剪裁',
功能坞: '功能坞',
原始数据: '原始数据',
取消: '取消',
同步接口: '同步接口',
启用: '启用',
启用状态: '启用状态',
响应状态码: '响应状态码',
响应码: '响应码',
唯一编码: '唯一编码',
图标名称: '图标名称',
图标选择器: '图标选择器',
地区: '地区',
基本信息: '基本信息',
基本设置: '基本设置',
备注: '备注',
: '大',
: '天',
失败: '失败',
头像: '头像',
婚姻状况: '婚姻状况',
字典分类: '字典分类',
客户端IP: '客户端IP',
密码: '密码',
: '小',
工作单位: '工作单位',
工作台: '工作台',
工作地址: '工作地址',
工作电话: '工作电话',
已应用的查询条件: '已应用的查询条件',
开发依赖: '开发依赖',
开启人工审核: '开启人工审核',
开始日期: '开始日期',
性别: '性别',
成功: '成功',
我的消息: '我的消息',
所属字典: '所属字典',
所属角色: '所属角色',
所属部门: '所属部门',
手机号: '手机号',
手机号码: '手机号码',
手风琴菜单: '手风琴菜单',
执行用户: '执行用户',
执行用户不能为空: '执行用户不能为空',
执行用户编号: '执行用户编号',
执行耗时: '执行耗时',
执行计划: '执行计划',
执行计划不正确: '执行计划不正确',
执行记录: '执行记录',
折叠菜单: '折叠菜单',
排序: '排序',
接口名称: '接口名称',
接口描述: '接口描述',
接口权限: '接口权限',
接口路径: '接口路径',
控制台: '控制台',
控制台视图: '控制台视图',
提示: '提示',
搜索: '搜索',
操作系统: '操作系统',
操作结果: '操作结果',
政治面貌: '政治面貌',
数据版本: '数据版本',
数据管理: '数据管理',
数据范围: '数据范围',
整页路由: '整页路由',
文化程度: '文化程度',
斑马纹: '斑马纹',
新增作业: '新增作业',
新增字典项: '新增字典项',
新增消息: '新增消息',
新增用户: '新增用户',
新增角色: '新增角色',
新增部门: '新增部门',
新增配置: '新增配置',
新密码: '新密码',
新手机号码: '新手机号码',
新手机验证码: '新手机验证码',
新消息: '新消息',
方法: '方法',
无限权限: '无限权限',
日志编号: '日志编号',
旧密码: '旧密码',
时间: '时间',
是否隐藏: '是否隐藏',
显示仪表板: '显示仪表板',
显示名称: '显示名称',
更换手机: '更换手机',
更新日志: '更新日志',
查看作业: '查看作业',
查看字典项: '查看字典项',
查看消息: '查看消息',
查看用户: '查看用户',
查看角色: '查看角色',
查看部门: '查看部门',
查看配置: '查看配置',
查询: '查询',
标签: '标签',
标签栏: '标签栏',
样式: '样式',
框架布局: '框架布局',
档案信息: '档案信息',
模块名称: '模块名称',
模块类型: '模块类型',
模块说明: '模块说明',
正常: '正常',
每分钟: '每分钟',
每周星期日零点: '每周星期日零点',
每天零点: '每天零点',
每小时: '每小时',
每月一号零点: '每月一号零点',
每月最后一天零点: '每月最后一天零点',
毕业学校: '毕业学校',
民族: '民族',
注册时间: '注册时间',
注释信息: '注释信息',
消息中心: '消息中心',
消息主题: '消息主题',
消息内容: '消息内容',
消息摘要: '消息摘要',
消息类型: '消息类型',
消息编号: '消息编号',
清除缓存: '清除缓存',
滑动过期: '滑动过期',
状态: '状态',
状态码: '状态码',
用于控制角色登录后控制台的视图: '用于控制角色登录后控制台的视图',
用于登录系统: '用于登录系统',
用户代理: '用户代理',
用户名: '用户名',
用户名称: '用户名称',
用户注册: '用户注册',
用户注册设置: '用户注册设置',
用户编号: '用户编号',
电子邮箱: '电子邮箱',
界面语言: '界面语言',
登录名: '登录名',
登录密码: '登录密码',
登录结果: '登录结果',
登录账号: '登录账号',
真实姓名: '真实姓名',
短信验证码: '短信验证码',
确认新密码: '确认新密码',
禁用: '禁用',
简体中文: '简体中文',
籍贯: '籍贯',
类型: '类型',
粘贴SVG代码: '粘贴SVG代码',
系统设置: '系统设置',
紧急联系人: '紧急联系人',
纵向边框: '纵向边框',
经典: '经典',
绑定手机: '绑定手机',
结束日期: '结束日期',
结果: '结果',
绝对过期: '绝对过期',
缓存命中率: '缓存命中率',
缓存数量: '缓存数量',
编辑作业: '编辑作业',
编辑字典项: '编辑字典项',
编辑消息: '编辑消息',
编辑用户: '编辑用户',
编辑角色: '编辑角色',
编辑部门: '编辑部门',
编辑配置: '编辑配置',
耗时: '耗时',
职业: '职业',
联系人地址: '联系人地址',
联系人手机号: '联系人手机号',
自动登出: '自动登出',
自定义: '自定义',
: '至',
菜单别名: '菜单别名',
菜单图标: '菜单图标',
菜单显示名字: '菜单显示名字',
菜单权限: '菜单权限',
菜单高亮: '菜单高亮',
表单代码: '表单代码',
表格代码: '表格代码',
表格尺寸: '表格尺寸',
表格设置: '表格设置',
规则类型: '规则类型',
视图: '视图',
角色名称: '角色名称',
角色编号: '角色编号',
设置邮箱: '设置邮箱',
访问分布: '访问分布',
访问趋势: '访问趋势',
证件号码: '证件号码',
证件类型: '证件类型',
请再次输入新密码: '请再次输入新密码',
请求体: '请求体',
请求头: '请求头',
请求方不能为空: '请求方不能为空',
请求方式: '请求方式',
请求方法: '请求方法',
请求服务: '请求服务',
请求的网络地址: '请求的网络地址',
请求的网络地址不正确: '请求的网络地址不正确',
请输入关键词后检索: '请输入关键词后检索',
请输入地区或代码: '请输入地区或代码',
请输入当前密码: '请输入当前密码',
请输入手机号: '请输入手机号',
请输入新密码: '请输入新密码',
请输入订单号: '请输入订单号',
请输入邮箱: '请输入邮箱',
请输入部门名称: '请输入部门名称',
请选择左侧菜单后操作: '请选择左侧菜单后操作',
请选择月份: '请选择月份',
请选择类型: '请选择类型',
请选择通知类型: '请选择通知类型',
账号信息: '账号信息',
路径: '路径',
路由地址: '路由地址',
身高: '身高',
输入关键字进行过滤: '输入关键字进行过滤',
运行依赖: '运行依赖',
退出登录: '退出登录',
送至用户: '送至用户',
送至角色: '送至角色',
送至部门: '送至部门',
选择部门: '选择部门',
通栏: '通栏',
邮箱: '邮箱',
邮箱地址: '邮箱地址',
邮箱验证码: '邮箱验证码',
部门名称: '部门名称',
部门编号: '部门编号',
配置编号: '配置编号',
重定向: '重定向',
重置: '重置',
键值: '键值',
键名: '键名',
隐藏菜单: '隐藏菜单',
隐藏面包屑: '隐藏面包屑',
顶级菜单: '顶级菜单',
项值: '项值',
项名: '项名',
颜色: '颜色',
黑夜模式: '黑夜模式',
默认: '默认',
默认角色: '默认角色',
默认部门: '默认部门',
'清除缓存会将系统初始化,包括登录状态、主题、语言设置等,是否继续?': '清除缓存会将系统初始化,包括登录状态、主题、语言设置等,是否继续?',
'确认是否退出当前用户?': '确认是否退出当前用户?',
退出: '退出',
账号登录: '账号登录',
手机号登录: '手机号登录',
'忘记密码?': '忘记密码?',
'24小时免登录': '24小时免登录',
'还没有账号?': '还没有账号?',
创建新账号: '创建新账号',
返回登录: '返回登录',
注册新账号: '注册新账号',
平台服务协议: '平台服务协议',
我已阅读并同意: '我已阅读并同意',
下一步: '下一步',
上一步: '上一步',
'请输入包含英文、数字的8位以上密码': '请输入包含英文、数字的8位以上密码',
请再一次输入登录密码: '请再一次输入登录密码',
请输入登录账号: '请输入登录账号',
请输入登录密码: '请输入登录密码',
确认密码: '确认密码',
用户名已被使用: '用户名已被使用',
请阅读并同意协议: '请阅读并同意协议',
填写账号: '填写账号',
验证手机: '验证手机',
注册成功: '注册成功',
'Star 后可登录': 'Star 后可登录',
登录: '登录',
获取验证码: '获取验证码',
提交: '提交',
重置密码: '重置密码',
填写新密码: '填写新密码',
完成重置: '完成重置',
请完成安全验证: '请完成安全验证',
向右滑动完成验证: '向右滑动完成验证',
可以使用登录账号以及手机号登录系统: '可以使用登录账号以及手机号登录系统',
前去登录: '前去登录',
验证失败: '验证失败',
'{secs} 秒 验证成功': '{secs} 秒 验证成功',
密码重置成功: '密码重置成功',
'请牢记自己的新密码,返回登录后使用新密码登录': '请牢记自己的新密码,返回登录后使用新密码登录',
请再一次输入新密码: '请再一次输入新密码',
两次输入密码不一致: '两次输入密码不一致',
必须提供当前登录用户密码才能进行更改: '必须提供当前登录用户密码才能进行更改',
设置密码: '设置密码',
今天: '今天',
昨天: '昨天',
最近三天: '最近三天',
最近一周: '最近一周',
最近一月: '最近一月',
最近三月: '最近三月',
最近六月: '最近六月',
最近一年: '最近一年',
查看: '查看',
编辑: '编辑',
删除: '删除',
重新加载: '重新加载',
包含: '包含',
不含: '不含',
'以 x 开始': '以 x 开始',
'非 x 开始': '非 x 开始',
'以 x 结束': '以 x 结束',
'非 x 结束': '非 x 结束',
数值范围: '数值范围',
日期范围: '日期范围',
为其一: '为其一',
非其一: '非其一',
'仅显示 {field} {operator}': '仅显示 {field} {operator}',
高级筛选: '高级筛选',
'是否确认删除?': '是否确认删除?',
'确定删除 {item} 吗?': '确定删除 {item} 吗?',
'确定 {title}': '确定 {title}',
'执行耗时(毫秒)': '执行耗时(毫秒)',
响应体: '响应体',
响应头: '响应头',
执行时间编号: '执行时间编号',
新增字典: '新增字典',
字典名称: '字典名称',
字典编码: '字典编码',
父路径: '父路径',
编辑字典: '编辑字典',
操作成功: '操作成功',
发现新版本: '发现新版本',
'即将开始更新……': '即将开始更新……',
立即更新: '立即更新',
'CPU 使用率': 'CPU 使用率',
'Redis 运行时间': 'Redis 运行时间',
'Redis 版本': 'Redis 版本',
最近一时: '最近一时',
昨日此时: '昨日此时',
用户: '用户',
'日志详情:{id}': '日志详情:{id}',
生成前端代码: '生成前端代码',
生成后端代码: '生成后端代码',
生成图标代码: '生成图标代码',
生成表格代码: '生成表格代码',
生成表单代码: '生成表单代码',
生成: '生成',
本页消息已清空: '本页消息已清空',
添加应用: '添加应用',
我的常用: '我的常用',
全部应用: '全部应用',
设置常用成功: '设置常用成功',
暂无搜索结果: '暂无搜索结果',
'Cron 规则生成器': 'Cron 规则生成器',
任意值: '任意值',
范围: '范围',
间隔: '间隔',
指定: '指定',
: '秒',
分钟: '分钟',
小时: '小时',
: '日',
: '月',
: '周',
: '年',
频率: '频率',
本月最后一天: '本月最后一天',
不指定: '不指定',
本月最后一周: '本月最后一周',
'已发起执行请求5 秒后弹出执行结果': '已发起执行请求5 秒后弹出执行结果',
执行一次: '执行一次',
最后一周: '最后一周',
忽略: '忽略',
确认: '确认',
周日: '周日',
周一: '周一',
周二: '周二',
周三: '周三',
周四: '周四',
周五: '周五',
周六: '周六',
JSON格式化: 'JSON格式化',
}

View File

@ -6,7 +6,7 @@ html {
height: 100%;
background-color: #f6f8f9;
font-size: var(--el-font-size-base);
font-family: 'Lucida Console', 'Microsoft YaHei', 'monospace';
font-family: 'Arial', 'Microsoft YaHei', 'monospace';
}
a {

View File

@ -166,6 +166,10 @@
}
.el-table {
td {
font-family: 'Lucida Console', 'Microsoft YaHei', 'monospace';
}
.el-link:after {
border-bottom: 1px solid var(--el-link-text-color);
bottom: 0;

View File

@ -11,9 +11,9 @@
</el-icon>
</div>
<div class="title">
<h2>生成前端代码</h2>
<h2>{{ $t('生成前端代码') }}</h2>
<p>
<el-button @click="generateJsCode()">生成</el-button>
<el-button @click="generateJsCode()">{{ $t('生成') }}</el-button>
</p>
</div>
</div>
@ -28,7 +28,7 @@
</el-icon>
</div>
<div class="title">
<h2>生成后端代码</h2>
<h2>{{ $t('生成后端代码') }}</h2>
<p>
<el-input v-model="formCs.type" :placeholder="$t('模块类型')"></el-input>
</p>
@ -39,7 +39,7 @@
<el-input v-model="formCs.moduleRemark" :placeholder="$t('模块说明')"></el-input>
</p>
<p>
<el-button @click="generateCsCode()">生成</el-button>
<el-button @click="generateCsCode()">{{ $t('生成') }}</el-button>
</p>
</div>
</div>
@ -54,7 +54,7 @@
</el-icon>
</div>
<div class="title">
<h2>生成图标代码</h2>
<h2>{{ $t('生成图标代码') }}</h2>
<p>
<el-input v-model="form.iconName" :placeholder="$t('图标名称')"></el-input>
</p>
@ -64,7 +64,7 @@
<p>
<el-row align="middle">
<el-col :span="12">
<el-button @click="generateIconCode()">生成</el-button>
<el-button @click="generateIconCode()">{{ $t('生成') }}</el-button>
</el-col>
<el-col :span="12">
<el-link href="https://www.iconfont.cn/" target="_blank">Iconfont</el-link>
@ -84,7 +84,7 @@
</el-icon>
</div>
<div class="title">
<h2>生成表格代码</h2>
<h2>{{ $t('生成表格代码') }}</h2>
<p>
<el-input v-model="form.summaryInfo" :placeholder="$t('注释信息')" type="textarea"></el-input>
</p>
@ -95,7 +95,7 @@
<el-input v-model="form.formCode" :placeholder="$t('表单代码')" type="textarea"></el-input>
</p>
<p>
<el-button @click="generateTableCode()">生成</el-button>
<el-button @click="generateTableCode()">{{ $t('生成') }}</el-button>
</p>
</div>
</div>

View File

@ -9,7 +9,7 @@
<div class="common-header-title">{{ title }}</div>
</div>
<div class="common-header-right">
<router-link to="/guest/login">返回登录</router-link>
<router-link to="/guest/login">{{ $t('返回登录') }}</router-link>
</div>
</el-header>
<el-main>

View File

@ -11,7 +11,7 @@
<el-checkbox v-model="autoLogin" :label="$t('24小时免登录')"></el-checkbox>
</el-col>
<el-col :span="12" class="login-forgot">
<router-link to="/guest/reset-password">{{ $t('忘记密码') }}</router-link>
<router-link to="/guest/reset-password">{{ $t('忘记密码') }}</router-link>
</el-col>
</el-form-item>
<el-form-item>
@ -20,7 +20,7 @@
</el-button>
</el-form-item>
<div class="login-reg">
{{ $t('还没有账号?') }}
{{ $t('还没有账号') }}
<router-link to="/guest/register">{{ $t('创建新账号') }}</router-link>
</div>
</el-form>

View File

@ -1,11 +1,17 @@
<template>
<el-form :model="form" :rules="rules" @keyup.enter="login" label-width="0" ref="loginForm" size="large">
<na-form-phone v-model="form" :vue="this" code-field="code" form-name="loginForm" phone-field="destDevice"></na-form-phone>
<na-form-phone
v-model="form"
:phone-place-holder="$t('手机号码')"
:vue="this"
code-field="code"
form-name="loginForm"
phone-field="destDevice"></na-form-phone>
<el-form-item>
<el-button :loading="loading" @click="login" class="w100p" round type="primary">{{ $t('登录') }}</el-button>
</el-form-item>
<div class="login-reg">
{{ $t('还没有账号?') }}
{{ $t('还没有账号') }}
<router-link to="/guest/register">{{ $t('创建新账号') }}</router-link>
</div>
</el-form>

View File

@ -5,7 +5,7 @@
<el-step :title="$t('验证手机')" />
<el-step :title="$t('注册成功')" />
</el-steps>
<el-form v-if="stepActive === 0" :model="form" :rules="rules" @keyup.enter="next" label-width="120" ref="stepForm_0" size="large">
<el-form v-if="stepActive === 0" :model="form" :rules="rules" @keyup.enter="next" label-width="15rem" ref="stepForm_0" size="large">
<el-form-item :label="$t('登录账号')" prop="userName">
<el-input v-model="form.userName" :placeholder="$t('请输入登录账号')" clearable maxlength="16"></el-input>
</el-form-item>
@ -18,7 +18,7 @@
show-password
type="password"></el-input>
<sc-password-strength v-model="form.passwordText"></sc-password-strength>
<div class="el-form-item-msg">请输入包含英文数字的8位以上密码</div>
<div class="el-form-item-msg">{{ $t('请输入包含英文、数字的8位以上密码') }}</div>
</el-form-item>
<el-form-item :label="$t('确认密码')" prop="passwordText2">
<el-input
@ -30,8 +30,8 @@
type="password"></el-input>
</el-form-item>
<el-form-item label="" prop="agree">
<el-checkbox v-model="form.agree" label="">已阅读并同意</el-checkbox>
<span @click="showAgree = true" class="link">平台服务协议</span>
<el-checkbox v-model="form.agree" label="">{{ $t('已阅读并同意') }}</el-checkbox>
<span @click="showAgree = true" class="link">{{ $t('平台服务协议') }}</span>
</el-form-item>
</el-form>
<el-form v-if="stepActive === 1" :model="form" :rules="rules" ref="stepForm_1" size="large">
@ -39,25 +39,25 @@
v-model="form.verifySmsCodeReq"
:code-field="['verifySmsCodeReq.code', 'code']"
:phone-field="['verifySmsCodeReq.destDevice', 'destDevice']"
:phone-place-holder="$t('手机号码')"
:vue="this"
form-name="stepForm_1"></na-form-phone>
</el-form>
<div v-if="stepActive >= 2">
<el-result :sub-title="$t('可以使用登录账号以及手机号登录系统')" :title="$t('注册成功')" icon="success">
<template #extra>
<el-button @click="goLogin" size="large" type="primary">前去登录</el-button>
<el-button @click="goLogin" size="large" type="primary">{{ $t('前去登录') }}</el-button>
</template>
</el-result>
</div>
<el-form size="large" style="text-align: center">
<el-button v-if="stepActive > 0 && stepActive < 2" @click="pre" size="large">上一步</el-button>
<el-button v-if="stepActive < 1" @click="next" size="large" type="primary">下一步</el-button>
<el-button v-if="stepActive === 1" :loading="loading" @click="save" size="large" type="primary"> </el-button>
<el-button v-if="stepActive > 0 && stepActive < 2" @click="pre" size="large">{{ $t('上一步') }}</el-button>
<el-button v-if="stepActive < 1" @click="next" size="large" type="primary">{{ $t('下一步') }}</el-button>
<el-button v-if="stepActive === 1" :loading="loading" @click="save" size="large" type="primary">{{ $t('提交') }}</el-button>
</el-form>
<el-dialog v-model="showAgree" :title="$t('平台服务协议')" destroy-on-close>
平台服务协议
<template #footer>
<el-button @click="showAgree = false">取消</el-button>
<el-button @click="showAgree = false">{{ $t('取消') }}</el-button>
<el-button
@click="
() => {
@ -65,8 +65,8 @@
form.agree = true
}
"
type="primary"
>我已阅读并同意
type="primary">
{{ $t('我已阅读并同意') }}
</el-button>
</template>
</el-dialog>
@ -102,7 +102,7 @@ export default {
{
validator: (rule, value, callback) => {
if (!value) {
callback(new Error('请阅读并同意协议'))
callback(new Error(this.$t('请阅读并同意协议')))
} else {
callback()
}
@ -120,7 +120,7 @@ export default {
userName: valueEquals,
id: this.form.id,
})
return res.data ? callback() : callback(new Error('用户名已被使用'))
return res.data ? callback() : callback(new Error(this.$t('用户名已被使用')))
} catch (ex) {
return callback(new Error(ex.data.msg.userName[0].children))
}

View File

@ -4,30 +4,31 @@
<el-step :title="$t('填写新密码')" />
<el-step :title="$t('完成重置')" />
</el-steps>
<el-form v-if="stepActive === 0" :label-width="120" :model="form" :rules="rules" @keyup.enter="save" ref="form" size="large">
<el-form v-if="stepActive === 0" :model="form" :rules="rules" @keyup.enter="save" label-width="15rem" ref="form" size="large">
<na-form-phone
v-model="form.verifySmsCodeReq"
:code-field="['verifySmsCodeReq.code', 'code']"
:code-label="$t('短信验证码')"
:phone-field="['verifySmsCodeReq.destDevice', 'destDevice']"
:phone-label="$t('手机号码')"
:phone-place-holder="$t('手机号码')"
:vue="this"
form-name="form"></na-form-phone>
<el-form-item :label="$t('新密码')" prop="passwordText">
<el-input v-model="form.passwordText" :placeholder="$t('请输入新密码')" show-password></el-input>
<sc-password-strength v-model="form.passwordText"></sc-password-strength>
<div class="el-form-item-msg">请输入包含英文数字的8位以上密码</div>
<div class="el-form-item-msg">{{ $t('请输入包含英文、数字的8位以上密码') }}</div>
</el-form-item>
<el-form-item :label="$t('确认新密码')" prop="passwordText2">
<el-input v-model="form.passwordText2" :placeholder="$t('请再一次输入新密码')" show-password></el-input>
</el-form-item>
<el-form-item>
<el-button :loading="loading" @click="save" type="primary">提交</el-button>
<el-button :loading="loading" @click="save" type="primary">{{ $t('提交') }}</el-button>
</el-form-item>
</el-form>
<el-result v-if="stepActive >= 1" :sub-title="$t('请牢记自己的新密码,返回登录后使用新密码登录')" :title="$t('密码重置成功')" icon="success">
<el-result v-if="stepActive >= 1" :sub-title="$t('请牢记自己的新密码返回登录后使用新密码登录')" :title="$t('密码重置成功')" icon="success">
<template #extra>
<el-button @click="backLogin" size="large" type="primary">返回登录</el-button>
<el-button @click="backLogin" size="large" type="primary">{{ $t('返回登录') }}</el-button>
</template>
</el-result>
</common-page>

View File

@ -1,5 +1,5 @@
<template>
<el-card v-loading="loading" header="更新日志" shadow="never">
<el-card v-loading="loading" :header="$t('更新日志')" shadow="never">
<div v-html="changeLog" class="change-log"></div>
</el-card>
</template>

View File

@ -1,11 +1,11 @@
<template>
<div v-loading="loading">
<el-card header="开发依赖" shadow="never">
<el-card :header="$t('开发依赖')" shadow="never">
<el-descriptions :column="2" border>
<el-descriptions-item v-for="(value, key) in packageJson.devDependencies" :key="key" :label="key">{{ value }}</el-descriptions-item>
</el-descriptions>
</el-card>
<el-card header="运行依赖" shadow="never">
<el-card :header="$t('运行依赖')" shadow="never">
<el-descriptions :column="2" border>
<el-descriptions-item v-for="(value, key) in packageJson.dependencies" :key="key" :label="key">{{ value }}</el-descriptions-item>
</el-descriptions>
@ -20,9 +20,9 @@
import packageJson from '/package.json'
export default {
title: '模块信息',
title: null,
icon: 'el-icon-monitor',
description: '当前项目模块信息',
description: null,
data() {
return {
loading: true,
@ -31,6 +31,8 @@ export default {
}
},
created() {
this.title = this.$t('模块信息')
this.description = this.$t('当前项目模块信息')
this.getModules()
},
methods: {

View File

@ -4,7 +4,7 @@
<img alt="" src="@/assets/img/logo.png" />
<h2>{{ packageJson.name }}</h2>
<p>{{ ver }}</p>
<el-link href="https://github.com/nsnail/NetAdmin" target="_blank">喜欢就点个 Star </el-link>
<el-link href="https://github.com/nsnail/NetAdmin" target="_blank">{{ $t('喜欢就点个 Star⭐ 吧!') }}</el-link>
</div>
</el-card>
</template>

View File

@ -54,7 +54,7 @@
添加部件
</div>
<div>
<el-button v-if="customizing" @click="save" icon="el-icon-check" round type="primary">完成</el-button>
<el-button v-if="customizing" @click="save" icon="el-icon-check" round type="primary">{{ $t('完成') }}</el-button>
</div>
<div @click="close()" class="widgets-aside-close">
<el-icon>
@ -122,7 +122,7 @@
</div>
</el-main>
<el-footer>
<el-button @click="backDefault()" size="small">恢复默认</el-button>
<el-button @click="backDefault()" size="small">{{ $t('恢复默认') }}</el-button>
</el-footer>
</el-container>
</div>

View File

@ -26,7 +26,7 @@
<el-drawer v-model="modsDrawer" :size="570" :title="$t('添加应用')" destroy-on-close>
<div class="setMods">
<h4>我的常用 ( {{ myMods.length }} )</h4>
<h4>{{ $t('我的常用') }} ( {{ myMods.length }} )</h4>
<draggable v-model="myMods" animation="200" group="people" item-key="path" tag="ul">
<template #item="{ element }">
<li :style="{ background: element.meta.color || '#909399' }">
@ -39,7 +39,7 @@
</draggable>
</div>
<div class="setMods">
<h4>全部应用 ( {{ filterMods.length }} )</h4>
<h4>{{ $t('全部应用') }} ( {{ filterMods.length }} )</h4>
<draggable v-model="filterMods" :sort="false" animation="200" group="people" item-key="path" tag="ul">
<template #item="{ element }">
<li :style="{ background: element.meta.color || '#909399' }">
@ -52,8 +52,8 @@
</draggable>
</div>
<template #footer>
<el-button @click="modsDrawer = false">取消</el-button>
<el-button @click="saveMods" type="primary">保存</el-button>
<el-button @click="modsDrawer = false">{{ $t('取消') }}</el-button>
<el-button @click="saveMods" type="primary">{{ $t('保存') }}</el-button>
</template>
</el-drawer>
</div>
@ -113,7 +113,7 @@ export default {
'MY_MODS',
this.myMods.map((v) => v.name),
)
this.$message.success('设置常用成功')
this.$message.success(this.$t('设置常用成功'))
this.modsDrawer = false
},
},

View File

@ -1,6 +1,6 @@
<template>
<el-card :header="$t('账号信息')" shadow="never">
<el-form :model="form" label-width="10rem" ref="form">
<el-form :model="form" label-width="15rem" ref="form">
<el-form-item :label="$t('头像')">
<sc-upload v-model="form.avatar" :onSuccess="updateUser" :title="$t('上传头像')"></sc-upload>
</el-form-item>
@ -13,7 +13,7 @@
<el-form-item :label="$t('密码')">
<div class="flex w100p gap05">
<el-input readonly value="******"></el-input>
<el-button @click="setPasswordClick">设置密码</el-button>
<el-button @click="setPasswordClick">{{ $t('设置密码') }}</el-button>
</div>
</el-form-item>
<el-form-item :label="$t('注册时间')">
@ -28,7 +28,7 @@
<el-form-item :label="$t('电子邮箱')">
<div class="flex w100p gap05">
<el-input v-model="form.email" readonly></el-input>
<el-button @click="setEmailClick">设置邮箱</el-button>
<el-button @click="setEmailClick">{{ $t('设置邮箱') }}</el-button>
</div>
</el-form-item>
</el-form>

View File

@ -18,6 +18,7 @@
v-model="form"
:code-label="$t('邮箱验证码')"
:email-label="$t('邮箱地址')"
:email-place-holder="$t('邮箱地址')"
:vue="this"
code-field="code"
email-field="destDevice"
@ -27,8 +28,8 @@
</el-form>
<template #footer>
<el-button @click="visible = false"> </el-button>
<el-button :loading="loading" @click="submit" type="primary"> </el-button>
<el-button @click="visible = false">{{ $t('取消') }}</el-button>
<el-button :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button>
</template>
</el-dialog>
</template>
@ -58,7 +59,7 @@ export default {
const res = await this.$API.sys_user.setEmail.post(this.form)
this.$emit('success', res.data)
this.visible = false
this.$message.success('操作成功')
this.$message.success(this.$t('操作成功'))
} catch {}
this.loading = false
},

View File

@ -25,6 +25,7 @@
:code-label="$t('新手机验证码')"
:phone-field="['newverifySmsCodeReq.destDevice', 'destDevice']"
:phone-label="$t('新手机号码')"
:phone-place-holder="$t('新手机号码')"
:vue="this"
form-name="form" />
</el-col>
@ -32,8 +33,8 @@
</el-form>
<template #footer>
<el-button @click="visible = false"> </el-button>
<el-button :loading="loading" @click="submit" type="primary"> </el-button>
<el-button @click="visible = false">{{ $t('取消') }}</el-button>
<el-button :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button>
</template>
</el-dialog>
</template>
@ -63,7 +64,7 @@ export default {
const res = await this.$API.sys_user.setMobile.post(this.form)
this.$emit('success', res.data, this.mode)
this.visible = false
this.$message.success($t('操作成功'))
this.$message.success(this.$t('操作成功'))
} catch {}
this.loading = false
},

View File

@ -1,6 +1,6 @@
<template>
<el-dialog v-model="visible" :title="$t('修改密码')" :width="800" @closed="$emit('closed')" destroy-on-close>
<el-form :model="form" :rules="rules" label-width="120" ref="form">
<el-form :model="form" :rules="rules" label-width="15rem" ref="form">
<el-form-item :label="$t('旧密码')" prop="oldPassword">
<el-input
v-model="form.oldPassword"
@ -9,7 +9,7 @@
maxlength="16"
show-password
type="password"></el-input>
<div class="el-form-item-msg">必须提供当前登录用户密码才能进行更改</div>
<div class="el-form-item-msg">{{ $t('必须提供当前登录用户密码才能进行更改') }}</div>
</el-form-item>
<el-form-item :label="$t('新密码')" prop="newPassword">
<el-input
@ -20,7 +20,7 @@
show-password
type="password"></el-input>
<sc-password-strength v-model="form.newPassword"></sc-password-strength>
<div class="el-form-item-msg">请输入包含英文数字的8位以上密码</div>
<div class="el-form-item-msg">{{ $t('请输入包含英文、数字的8位以上密码') }}</div>
</el-form-item>
<el-form-item :label="$t('确认新密码')" prop="confirmNewPassword">
<el-input
@ -33,8 +33,8 @@
</el-form-item>
</el-form>
<template #footer>
<el-button @click="visible = false"> </el-button>
<el-button :loading="loading" @click="submit" type="primary"> </el-button>
<el-button @click="visible = false">{{ $t('取消') }}</el-button>
<el-button :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button>
</template>
</el-dialog>
</template>
@ -63,7 +63,7 @@ export default {
const res = await this.$API.sys_user.setPassword.post(this.form)
this.$emit('success', res.data, this.mode)
this.visible = false
this.$message.success('操作成功')
this.$message.success(this.$t('操作成功'))
} catch {
//
}

View File

@ -5,7 +5,7 @@
<sc-table-column :label="$t('业务名称')" min-width="240" prop="title"></sc-table-column>
<sc-table-column label="IP" prop="ip" width="150"></sc-table-column>
<sc-table-column :label="$t('结果')" prop="code" width="150">
<el-tag type="success">成功</el-tag>
<el-tag type="success">{{ $t('成功') }}</el-tag>
</sc-table-column>
<sc-table-column :label="$t('操作时间')" prop="time" width="150"></sc-table-column>
</scTable>

View File

@ -1,6 +1,6 @@
<template>
<el-card :header="$t('主题样式')" shadow="never">
<el-form class="mt-4" label-width="10rem">
<el-form class="mt-4" label-width="15rem">
<el-form-item :label="$t('黑夜模式')">
<el-switch v-model="config.dark" active-icon="el-icon-moon" inactive-icon="el-icon-sunny" inline-prompt />
</el-form-item>
@ -27,7 +27,7 @@
</el-form>
</el-card>
<el-card :header="$t('个人设置')" class="mt-4" shadow="never">
<el-form class="mt-4" label-width="10rem">
<el-form class="mt-4" label-width="15rem">
<el-form-item :label="$t('界面语言')">
<el-select v-model="config.lang">
<el-option :label="$t('简体中文')" value="zh-cn" />

View File

@ -3,7 +3,7 @@
<el-header>
<div class="left-panel"></div>
<div class="right-panel">
<el-button :loading="loading" @click="sync" icon="sc-icon-sync" type="primary">同步接口</el-button>
<el-button :loading="loading" @click="sync" icon="sc-icon-sync" type="primary">{{ $t('同步接口') }}</el-button>
</div>
</el-header>
<el-main class="nopadding">
@ -28,7 +28,7 @@
align="center"
prop="method"
sortable="custom"
width="100" />
width="150" />
<el-table-column :label="$t('接口描述')" prop="summary" />
</sc-table>
</el-main>

View File

@ -5,25 +5,25 @@
<el-row :gutter="15">
<el-col :lg="4">
<el-card shadow="never">
<sc-statistic :value="statistics.version" group-separator title="Redis 版本"></sc-statistic>
<sc-statistic :title="$t('Redis 版本')" :value="statistics.version" group-separator></sc-statistic>
</el-card>
</el-col>
<el-col :lg="4">
<el-card shadow="never">
<sc-statistic
:suffix="$t('天')"
:title="$t('Redis 运行时间')"
:value="parseInt(statistics.upTime / 86400)"
group-separator
title="Redis 运行时间"></sc-statistic>
group-separator></sc-statistic>
</el-card>
</el-col>
<el-col :lg="4">
<el-card shadow="never">
<sc-statistic
:title="$t('CPU 使用率')"
:value="statistics.upTime ? (statistics.usedCpu / statistics.upTime).toFixed(2) : 0"
group-separator
suffix="%"
title="CPU 使用率"></sc-statistic>
suffix="%"></sc-statistic>
</el-card>
</el-col>
<el-col :lg="4">

View File

@ -13,8 +13,8 @@
],
},
]"
:label-width="6"
@on-change="filterChange"
label-width="10"
ref="selectFilter"></sc-select-filter>
</el-header>
<el-header>
@ -28,7 +28,7 @@
</div>
<div class="right-panel">
<na-button-add :vue="this" />
<el-button :disabled="selection.length === 0" @click="batchDel" icon="el-icon-delete" plain type="danger"></el-button>
<na-button-bulk-del :api="$API.sys_config.bulkDelete" :vue="this" />
</div>
</el-header>
<el-main class="nopadding">
@ -51,7 +51,7 @@
<el-table-column :label="$t('用户注册')" align="center">
<el-table-column :label="$t('默认部门')" align="center" prop="userRegisterDept.name" width="150" />
<el-table-column :label="$t('默认角色')" align="center" prop="userRegisterRole.name" width="150" />
<el-table-column :label="$t('人工审核')" align="center" prop="userRegisterConfirm" width="100">
<el-table-column :label="$t('人工审核')" align="center" prop="userRegisterConfirm" width="120">
<template #default="scope">
<el-switch v-model="scope.row.userRegisterConfirm" @change="changeSwitch($event, scope.row)"></el-switch>
</template>
@ -123,27 +123,10 @@ export default {
},
inject: ['reload'],
methods: {
async batchDel() {
let loading
try {
await this.$confirm(`确定删除选中的 ${this.selection.length} 项吗?`, '提示', {
type: 'warning',
})
loading = this.$loading()
const res = await this.$API.sys_config.bulkDelete.post({
items: this.selection,
})
this.$message.success(`删除 ${res.data}`)
} catch {
//
}
this.$refs.table.refresh()
loading?.close()
},
async changeSwitch(event, row) {
try {
await this.$API.sys_config.edit.post(row)
this.$message.success(`操作成功`)
this.$message.success(this.$t('操作成功'))
} catch {
//
}
@ -159,7 +142,7 @@ export default {
async rowDel(row) {
try {
const res = await this.$API.sys_config.delete.post({ id: row.id })
this.$message.success(`删除 ${res.data}`)
this.$message.success(this.$t('删除 {count} 项', { count: res.data }))
} catch {
//
}

View File

@ -3,7 +3,7 @@
<div v-loading="loading">
<el-tabs v-if="!loading" tab-position="top">
<el-tab-pane :label="$t('基本信息')">
<el-form :disabled="mode === 'view'" :model="form" :rules="rules" label-width="10rem" ref="dialogForm">
<el-form :disabled="mode === 'view'" :model="form" :rules="rules" label-width="15rem" ref="dialogForm">
<el-collapse>
<el-collapse-item :title="$t('用户注册设置')" name="1">
<div style="margin: 1rem">
@ -44,8 +44,8 @@
</el-tabs>
</div>
<template #footer>
<el-button @click="visible = false"> </el-button>
<el-button v-if="mode !== 'view'" :loading="loading" @click="submit" type="primary"> </el-button>
<el-button @click="visible = false">{{ $t('取消') }}</el-button>
<el-button v-if="mode !== 'view'" :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button>
</template>
</sc-dialog>
</template>
@ -58,9 +58,9 @@ export default {
return {
mode: 'add',
titleMap: {
add: '新增配置',
edit: '编辑配置',
view: '查看配置',
add: this.$t('新增配置'),
edit: this.$t('编辑配置'),
view: this.$t('查看配置'),
},
visible: false,
loading: false,
@ -102,7 +102,7 @@ export default {
const res = await method.post(this.form)
this.$emit('success', res.data, this.mode)
this.visible = false
this.$message.success('操作成功')
this.$message.success(this.$t('操作成功'))
} catch {
///
}

View File

@ -13,7 +13,7 @@
],
},
]"
:label-width="6"
:label-width="10"
@on-change="filterChange"
ref="selectFilter"></sc-select-filter>
</el-header>
@ -24,7 +24,7 @@
{
type: 'input',
field: ['root', 'keywords'],
placeholder: '部门编号 / 部门名称 / 备注',
placeholder: $t('部门编号 / 部门名称 / 备注'),
style: 'width:25rem',
},
]"
@ -35,7 +35,7 @@
</div>
<div class="right-panel">
<na-button-add :vue="this" />
<el-button :disabled="selection.length === 0" @click="batchDel" icon="el-icon-delete" plain type="danger"></el-button>
<na-button-bulk-del :api="$API.sys_dept.bulkDelete" :vue="this" />
</div>
</el-header>
<el-main class="nopadding">
@ -62,7 +62,7 @@
<el-table-column :label="$t('部门编号')" prop="id" sortable="custom" />
<el-table-column :label="$t('部门名称')" prop="name" sortable="custom" />
<el-table-column :label="$t('排序')" align="right" prop="sort" sortable="custom" />
<el-table-column :label="$t('启用')" align="center" prop="enabled" sortable="custom" width="80">
<el-table-column :label="$t('启用')" align="center" prop="enabled" sortable="custom" width="100">
<template #default="scope">
<el-switch v-model="scope.row.enabled" @change="changeSwitch($event, scope.row)"></el-switch>
</template>
@ -129,29 +129,12 @@ export default {
async changeSwitch(event, row) {
try {
await this.$API.sys_dept.setEnabled.post(row)
this.$message.success(`操作成功`)
this.$message.success(this.$t('操作成功'))
} catch {
//
}
this.$refs.table.refresh()
},
async batchDel() {
let loading
try {
await this.$confirm(`确定删除选中的 ${this.selection.length} 项吗?`, '提示', {
type: 'warning',
})
loading = this.$loading()
const res = await this.$API.sys_dept.bulkDelete.post({
items: this.selection,
})
this.$message.success(`删除 ${res.data}`)
} catch {
//
}
this.$refs.table.refresh()
loading?.close()
},
filterChange(data) {
Object.entries(data).forEach(([key, value]) => {
this.$refs.search.form.dy[key] = value === 'true' ? true : value === 'false' ? false : value
@ -161,7 +144,7 @@ export default {
async rowDel(row) {
try {
const res = await this.$API.sys_dept.delete.post({ id: row.id })
this.$message.success(`删除 ${res.data}`)
this.$message.success(this.$t('删除 {count} 项', { count: res.data }))
} catch {
//
}

View File

@ -1,9 +1,9 @@
<template>
<sc-dialog v-model="visible" :title="`${titleMap[mode]}${form?.id ?? '...'}`" :width="500" @closed="$emit('closed')" destroy-on-close>
<sc-dialog v-model="visible" :title="`${titleMap[mode]}${form?.id ?? '...'}`" :width="800" @closed="$emit('closed')" destroy-on-close>
<div v-loading="loading">
<el-tabs tab-position="top">
<el-tab-pane :label="$t('基本信息')">
<el-form :disabled="mode === 'view'" :model="form" :rules="rules" label-width="10rem" ref="dialogForm">
<el-form :disabled="mode === 'view'" :model="form" :rules="rules" label-width="15rem" ref="dialogForm">
<el-form-item :label="$t('上级部门')" prop="parentId">
<el-cascader
v-model="form.parentId"
@ -39,8 +39,8 @@
</el-tabs>
</div>
<template #footer>
<el-button @click="visible = false"> </el-button>
<el-button v-if="mode !== 'view'" :loading="loading" @click="submit" type="primary"> </el-button>
<el-button @click="visible = false">{{ $t('取消') }}</el-button>
<el-button v-if="mode !== 'view'" :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button>
</template>
</sc-dialog>
</template>
@ -53,9 +53,9 @@ export default {
return {
mode: 'add',
titleMap: {
add: '新增部门',
edit: '编辑部门',
view: '查看部门',
add: this.$t('新增部门'),
edit: this.$t('编辑部门'),
view: this.$t('查看部门'),
},
visible: false,
loading: false,
@ -112,7 +112,7 @@ export default {
const res = await method.post(this.form)
this.$emit('success', res.data, this.mode)
this.visible = false
this.$message.success('操作成功')
this.$message.success(this.$t('操作成功'))
} catch {
//
}

View File

@ -24,7 +24,7 @@
<span class="btn">
<el-button-group size="small">
<el-button @click.stop="edit(data)" icon="el-icon-edit"></el-button>
<el-popconfirm :title="`确定删除 ${data.name} 吗?`" @confirm="del(data)">
<el-popconfirm :title="$t('确定删除 {item} 吗?', { item: data.name })" @confirm="del(data)" width="20rem">
<template #reference>
<el-button @click.stop="() => {}" icon="el-icon-delete"></el-button>
</template>
@ -36,7 +36,7 @@
</el-tree>
</el-main>
<el-footer>
<el-button @click="add" icon="el-icon-plus" size="small" style="width: 100%" type="primary">字典分类</el-button>
<el-button @click="add" icon="el-icon-plus" size="small" style="width: 100%" type="primary">{{ $t('字典分类') }}</el-button>
</el-footer>
</el-container>
</el-aside>
@ -123,7 +123,7 @@ export default {
await this.$API.sys_dic.deleteCatalog.post({
id: data.id,
})
this.$message.success('操作成功')
this.$message.success(this.$t('操作成功'))
} catch {
//
}

View File

@ -7,7 +7,7 @@
{
type: 'input',
field: ['dy', 'keywords'],
placeholder: '项名 / 项值',
placeholder: $t('项名 / 项值'),
style: 'width:20rem',
},
]"
@ -17,7 +17,7 @@
</div>
<div class="right-panel">
<na-button-add :data="{ catalogId: this.catalogId }" :vue="this" />
<na-button-batch-del :api="$API.sys_dic.bulkDeleteContent" :vue="this" />
<na-button-bulk-del :api="$API.sys_dic.bulkDeleteContent" :vue="this" />
</div>
</el-header>
<el-main class="nopadding">
@ -139,7 +139,7 @@ export default {
async rowDel(row) {
try {
const res = await this.$API.sys_dic.deleteContent.post({ id: row.id })
this.$message.success(`删除 ${res.data}`)
this.$message.success(this.$t('删除 {count} 项', { count: res.data }))
} catch {
//
}

View File

@ -27,8 +27,8 @@
</el-tabs>
</div>
<template #footer>
<el-button @click="visible = false"> </el-button>
<el-button v-if="mode !== 'view'" :loading="loading" @click="submit" type="primary"> </el-button>
<el-button @click="visible = false">{{ $t('取消') }}</el-button>
<el-button v-if="mode !== 'view'" :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button>
</template>
</sc-dialog>
</template>
@ -41,9 +41,9 @@ export default {
return {
mode: 'add',
titleMap: {
view: '查看字典项',
add: '新增字典项',
edit: '编辑字典项',
view: this.$t('查看字典项'),
add: this.$t('新增字典项'),
edit: this.$t('编辑字典项'),
},
visible: false,
loading: false,
@ -81,7 +81,7 @@ export default {
const res = await method.post(this.form)
this.$emit('success', res.data, this.mode)
this.visible = false
this.$message.success('操作成功')
this.$message.success(this.$t('操作成功'))
} catch {
//
}

View File

@ -2,9 +2,9 @@
<sc-dialog v-model="visible" :title="`${titleMap[mode]}${form?.id ?? '...'}`" :width="800" @closed="$emit('closed')" destroy-on-close>
<el-form v-loading="loading" :model="form" :rules="rules" label-width="10rem" ref="dialogForm">
<el-form-item :label="$t('字典名称')" prop="name">
<el-input v-model="form.name" :placeholder="$t('字典显示名称')" clearable></el-input>
<el-input v-model="form.name" :placeholder="$t('字典名称')" clearable></el-input>
</el-form-item>
<el-form-item :label="$t('编码')" prop="code">
<el-form-item :label="$t('字典编码')" prop="code">
<el-input v-model="form.code" :placeholder="$t('字典编码')" clearable></el-input>
</el-form-item>
<el-form-item :label="$t('父路径')" prop="parentId">
@ -12,8 +12,8 @@
</el-form-item>
</el-form>
<template #footer>
<el-button @click="visible = false"> </el-button>
<el-button :loading="loading" @click="submit" type="primary"> </el-button>
<el-button @click="visible = false">{{ $t('取消') }}</el-button>
<el-button :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button>
</template>
</sc-dialog>
</template>
@ -25,8 +25,8 @@ export default {
return {
mode: 'add',
titleMap: {
add: '新增字典',
edit: '编辑字典',
add: this.$t('新增字典'),
edit: this.$t('编辑字典'),
},
visible: false,
loading: false,
@ -64,7 +64,7 @@ export default {
const res = await method.post(this.form)
this.$emit('success', res.data, this.mode)
this.visible = false
this.$message.success('操作成功')
this.$message.success(this.$t('操作成功'))
} catch {
//
}

View File

@ -23,7 +23,7 @@
],
},
]"
:label-width="6"
:label-width="10"
@on-change="filterChange"
ref="selectFilter"></sc-select-filter>
</el-header>
@ -44,7 +44,7 @@
return { value: x[0], label: x[1][1] }
}),
placeholder: $t('请求方式'),
style: 'width:10rem',
style: 'width:15rem',
},
]"
:vue="this"
@ -54,7 +54,7 @@
</div>
<div class="right-panel">
<na-button-add :vue="this" />
<el-button :disabled="selection.length === 0" @click="batchDel" icon="el-icon-delete" plain type="danger"></el-button>
<na-button-bulk-del :api="$API.sys_job.bulkDelete" :vue="this" />
</div>
</el-header>
<el-main class="nopadding">
@ -112,9 +112,9 @@
align="center"
prop="httpMethod"
sortable="custom"
width="100" />
width="150" />
<el-table-column :label="$t('上次执行')" align="center">
<el-table-column :label="$t('状态')" align="center" prop="lastExecTime" sortable="custom" width="150">
<el-table-column :label="$t('状态')" align="center" prop="lastExecTime" sortable="custom" width="100">
<template #default="scope">
<sc-status-indicator :type="scope.row.lastStatusCode === 'ok' ? 'success' : 'danger'" />
{{
@ -140,12 +140,12 @@
</el-table-column>
<el-table-column :label="$t('下次执行时间')" align="right" prop="nextExecTime" sortable="custom" width="170" />
<el-table-column :label="$t('启用')" align="center" prop="enabled" sortable="custom" width="80">
<el-table-column :label="$t('启用')" align="center" prop="enabled" sortable="custom" width="100">
<template #default="scope">
<el-switch v-model="scope.row.enabled" @change="changeSwitch($event, scope.row)"></el-switch>
</template>
</el-table-column>
<el-table-column :label="$t('创建时间')" align="right" prop="createdTime" sortable="custom" width="100">
<el-table-column :label="$t('创建时间')" align="right" prop="createdTime" sortable="custom" width="130">
<template #default="scope">
<span v-if="scope.row.createdTime" v-time.tip="scope.row.createdTime"></span>
</template>
@ -241,7 +241,7 @@ export default {
async changeSwitch(event, row) {
try {
await this.$API.sys_job.setEnabled.post(row)
this.$message.success(`操作成功`)
this.$message.success(this.$t('操作成功'))
} catch {
//
}
@ -252,7 +252,7 @@ export default {
await this.$API.sys_job.execute.post({ id: row.id })
this.$notify.success({
dangerouslyUseHTMLString: true,
message: `<div id="countdown">已发起执行请求5 秒后弹出执行结果</div>`,
message: `<div id="countdown">${this.$t('已发起执行请求5 秒后弹出执行结果')}</div>`,
onClose: async () => {
clearInterval(this.timer)
this.loading = true
@ -276,30 +276,12 @@ export default {
async rowDel(row) {
try {
const res = await this.$API.sys_job.delete.post({ id: row.id })
this.$message.success(`删除 ${res.data}`)
this.$message.success(this.$t('删除 {count} 项', { count: res.data }))
} catch {
//
}
this.$refs.table.refresh()
},
//
async batchDel() {
let loading
try {
await this.$confirm(`确定删除选中的 ${this.selection.length} 项吗?`, '提示', {
type: 'warning',
})
loading = this.$loading()
const res = await this.$API.sys_job.bulkDelete.post({
items: this.selection,
})
this.$message.success(`删除 ${res.data}`)
} catch {
//
}
loading?.close()
this.$refs.table.refresh()
},
//
onSearch(form) {

View File

@ -30,7 +30,7 @@
{ label: '50x', value: '500,599' },
{ label: '90x', value: '900,999' },
],
placeholder: '状态码',
placeholder: $t('状态码'),
style: 'width:20rem',
},
]"
@ -74,7 +74,7 @@
align="center"
prop="httpMethod"
sortable="custom"
width="100" />
width="150" />
<el-table-column :label="$t('响应状态码')" align="center" prop="httpStatusCode" sortable="custom" width="200">
<template #default="scope">
<sc-status-indicator :type="scope.row.httpStatusCode === 'ok' ? 'success' : 'danger'" />

View File

@ -12,7 +12,7 @@
:model="form"
:rules="rules"
label-position="right"
label-width="150px"
label-width="15rem"
ref="dialogForm">
<el-tabs tab-position="top">
<el-tab-pane :label="$t('基本信息')">
@ -45,7 +45,7 @@
</el-tabs>
</el-form>
<template #footer>
<el-button @click="visible = false"> </el-button>
<el-button @click="visible = false">{{ $t('取消') }}</el-button>
</template>
</sc-dialog>
</template>

View File

@ -14,7 +14,7 @@
:model="form"
:rules="rules"
label-position="right"
label-width="150px"
label-width="20rem"
ref="dialogForm">
<el-form-item v-if="mode === 'view'" :label="$t('作业编号')" prop="id">
<el-input v-model="form.id" clearable />
@ -51,7 +51,7 @@
:theme="this.$TOOL.data.get('APP_DARK') ? 'github_dark' : 'github'"
lang="json"
style="height: 5rem; width: 100%" />
<el-button @click="form.requestHeader = jsonFormat(form.requestHeader)" type="text">JSON格式化</el-button>
<el-button @click="form.requestHeader = jsonFormat(form.requestHeader)" type="text">{{ $t('JSON格式化') }}</el-button>
</el-form-item>
<el-form-item :label="$t('请求体')" prop="requestBody">
<v-ace-editor
@ -59,7 +59,7 @@
:theme="this.$TOOL.data.get('APP_DARK') ? 'github_dark' : 'github'"
lang="json"
style="height: 10rem; width: 100%" />
<el-button @click="form.requestBody = jsonFormat(form.requestBody)" type="text">JSON格式化</el-button>
<el-button @click="form.requestBody = jsonFormat(form.requestBody)" type="text">{{ $t('JSON格式化') }}</el-button>
</el-form-item>
<el-form-item :label="$t('请求的网络地址')" prop="requestUrl">
<el-input v-model="form.requestUrl" clearable />
@ -111,8 +111,8 @@
</el-tabs>
<template #footer>
<el-button @click="visible = false"> </el-button>
<el-button v-if="mode !== 'view'" :loading="loading" @click="submit" type="primary"> </el-button>
<el-button @click="visible = false">{{ $t('取消') }}</el-button>
<el-button v-if="mode !== 'view'" :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button>
</template>
</sc-dialog>
</template>
@ -242,9 +242,9 @@ export default {
this.loading = false
if (res.data) {
this.$emit('success', res.data, this.mode)
this.$message.success('操作成功')
this.$message.success(this.$t('操作成功'))
} else {
this.$message.error('操作失败')
this.$message.error(this.$t('操作失败'))
}
this.visible = false
} catch {

View File

@ -13,7 +13,7 @@
],
},
]"
:label-width="6"
:label-width="10"
@on-change="filterChange"
ref="selectFilter"></sc-select-filter>
</el-header>
@ -24,7 +24,7 @@
{
type: 'input',
field: ['root', 'keywords'],
placeholder: '日志编号 / 登录名 / 客户端IP',
placeholder: $t('日志编号 / 登录名 / 客户端IP'),
style: 'width:25rem',
},
]"
@ -55,7 +55,7 @@
stripe>
<el-table-column :label="$t('日志编号')" prop="id" sortable="custom" width="150" />
<el-table-column :label="$t('创建时间')" prop="createdTime" sortable="custom" width="170" />
<el-table-column :label="$t('结果')" align="center" prop="httpStatusCode" sortable="custom" width="80">
<el-table-column :label="$t('结果')" align="center" prop="httpStatusCode" sortable="custom" width="100">
<template #default="scope">
<sc-status-indicator :type="scope.row.httpStatusCode === 200 ? 'success' : 'danger'" />
{{ scope.row.httpStatusCode === 200 ? '成功' : '失败' }}
@ -176,7 +176,7 @@ export default {
const res = await this.$API.sys_log.query.post({
filter: { id: row.id },
})
this.$refs.info.open(tool.sortProperties(res.data[0]), `日志详情:${row.id}`)
this.$refs.info.open(tool.sortProperties(res.data[0]), this.$t('日志详情:{id}', { id: row.id }))
},
},
}

View File

@ -13,7 +13,7 @@
],
},
]"
:label-width="6"
:label-width="10"
@on-change="filterChange"
ref="selectFilter"></sc-select-filter>
</el-header>
@ -32,7 +32,7 @@
{ label: '50x', value: '500,599' },
{ label: '90x', value: '900,999' },
],
placeholder: '状态码',
placeholder: $t('状态码'),
style: 'width:15rem',
},
{
@ -40,13 +40,13 @@
field: ['dy', 'apiId'],
api: $API.sys_api.query,
props: { label: 'summary', value: 'id', checkStrictly: true, expandTrigger: 'hover', emitPath: false },
placeholder: '请求服务',
placeholder: $t('请求服务'),
style: 'width:20rem',
},
{
type: 'input',
field: ['root', 'keywords'],
placeholder: '日志编号 / 用户 / 客户端IP',
placeholder: $t('日志编号 / 用户 / 客户端IP'),
style: 'width:25rem',
},
]"
@ -75,7 +75,7 @@
stripe>
<el-table-column :label="$t('日志编号')" prop="id" sortable="custom" width="150" />
<el-table-column :label="$t('创建时间')" prop="createdTime" sortable="custom" width="170" />
<el-table-column :label="$t('响应码')" align="center" prop="httpStatusCode" sortable="custom" width="100">
<el-table-column :label="$t('响应码')" align="center" prop="httpStatusCode" sortable="custom" width="150">
<template #default="{ row }">
<sc-status-indicator :type="row.httpStatusCode >= 200 && row.httpStatusCode < 300 ? 'success' : 'danger'" />
{{ row.httpStatusCode }}
@ -106,8 +106,8 @@
</el-table-column>
<na-col-user
v-auth="'sys/log/operation/user'"
:label="$t('用户')"
header-align="center"
label="用户"
nestProp="user.userName"
nestProp2="user.id"
prop="userId"
@ -243,7 +243,7 @@ export default {
const res = await this.$API.sys_log.query.post({
filter: { id: row.id },
})
this.$refs.info.open(tool.sortProperties(res.data[0]), `日志详情:${row.id}`)
this.$refs.info.open(tool.sortProperties(res.data[0]), this.$t('日志详情:{id}', { id: row.id }))
},
},
}

View File

@ -29,7 +29,10 @@
<span class="btn">
<el-button-group size="small">
<el-button @click.stop="add(node, data)" icon="el-icon-plus"></el-button>
<el-popconfirm :title="`确定删除 ${data.meta.title} 吗?`" @confirm="del(node, data)">
<el-popconfirm
:title="this.$t('确定删除 {item} 吗?', { item: data.meta.title })"
@confirm="del(node, data)"
width="20rem">
<template #reference>
<el-button @click.stop="() => {}" icon="el-icon-delete"></el-button>
</template>
@ -57,6 +60,7 @@
import save from './save'
export default {
inject: ['reload'],
components: {
save,
},
@ -117,7 +121,7 @@ export default {
this.loading = true
try {
const res = await this.$API.sys_menu.delete.post({ id: data.id })
this.$message.success(`删除 ${res.data}`)
this.$message.success(this.$t('删除 {count} 项', { count: res.data }))
} catch {
//
}
@ -160,7 +164,7 @@ export default {
this.loading = false
},
async handleSuccess() {
this.$TOOL.refreshTab(this)
this.reload()
},
},
}

View File

@ -6,7 +6,7 @@
<template v-else>
<el-col>
<h2>{{ form.meta.title || '新增菜单' }}</h2>
<el-form :model="form" :rules="rules" label-width="10rem" ref="dialogForm">
<el-form :model="form" :rules="rules" label-width="15rem" ref="dialogForm">
<el-form-item :label="$t('显示名称')" prop="meta.title">
<el-input v-model="form.meta.title" :placeholder="$t('菜单显示名字')" clearable></el-input>
</el-form-item>
@ -31,9 +31,6 @@
</el-form-item>
<el-form-item :label="$t('别名')" prop="name">
<el-input v-model="form.name" :placeholder="$t('菜单别名')" clearable></el-input>
<div class="el-form-item-msg">
系统唯一且与内置组件名一致否则导致缓存失效如类型为Iframe的菜单别名将代替源地址显示在地址栏
</div>
</el-form-item>
<el-form-item :label="$t('菜单图标')" prop="meta.icon">
<sc-icon-select v-model="form.meta.icon" clearable></sc-icon-select>
@ -49,21 +46,18 @@
</el-form-item>
<el-form-item :label="$t('菜单高亮')" prop="active">
<el-input v-model="form.active" clearable placeholder=""></el-input>
<div class="el-form-item-msg">子节点或详情页需要高亮的上级菜单路由地址</div>
</el-form-item>
<el-form-item :label="$t('视图')" prop="component">
<el-input v-model="form.component" clearable placeholder="">
<template #prepend>views/</template>
</el-input>
<div class="el-form-item-msg">如父节点链接或Iframe等没有视图的菜单不需要填写</div>
</el-form-item>
<el-form-item :label="$t('颜色')" prop="color">
<el-color-picker v-model="form.meta.color" :predefine="predefineColors"></el-color-picker>
</el-form-item>
<el-form-item :label="$t('是否隐藏')" prop="meta.hidden">
<el-checkbox v-model="form.meta.hidden">隐藏菜单</el-checkbox>
<el-checkbox v-model="form.meta.hiddenBreadCrumb">隐藏面包屑</el-checkbox>
<div class="el-form-item-msg" style="margin-left: 1rem">菜单不显示在导航中但用户依然可以访问例如详情页</div>
<el-checkbox v-model="form.meta.hidden">{{ $t('隐藏菜单') }}</el-checkbox>
<el-checkbox v-model="form.meta.hiddenBreadCrumb">{{ $t('隐藏面包屑') }}</el-checkbox>
</el-form-item>
<el-form-item :label="$t('整页路由')" prop="fullPage">
<el-switch v-model="form.meta.fullPage" />
@ -72,7 +66,7 @@
<el-input v-model="form.meta.tag" clearable placeholder=""></el-input>
</el-form-item>
<el-form-item>
<el-button :loading="loading" @click="save" type="primary"> </el-button>
<el-button :loading="loading" @click="save" type="primary">{{ $t('保存') }}</el-button>
</el-form-item>
</el-form>
</el-col>

View File

@ -14,7 +14,7 @@
],
},
]"
:label-width="6"
:label-width="10"
@on-change="filterChange"
ref="selectFilter"></sc-select-filter>
</el-header>
@ -26,7 +26,7 @@
type: 'input',
field: ['root', 'keywords'],
placeholder: $t('消息编号 / 消息主题 / 消息内容'),
style: 'width:20rem',
style: 'width:25rem',
},
]"
:vue="this"
@ -36,7 +36,7 @@
</div>
<div class="right-panel">
<na-button-add :vue="this" />
<el-button :disabled="selection.length === 0" @click="batchDel" icon="el-icon-delete" plain type="danger"></el-button>
<na-button-bulk-del :api="$API.sys_sitemsg.bulkDelete" :vue="this" />
</div>
</el-header>
<el-main class="nopadding">
@ -70,7 +70,7 @@
align="center"
prop="msgType"
sortable="custom"
width="100" />
width="150" />
<el-table-column :label="$t('消息主题')" prop="title" show-overflow-tooltip sortable="custom" />
<el-table-column :label="$t('消息摘要')" prop="summary" show-overflow-tooltip sortable="custom" />
<el-table-column :label="$t('创建时间')" align="right" prop="createdTime" sortable="custom" width="170" />
@ -143,30 +143,12 @@ export default {
async rowDel(row) {
try {
const res = await this.$API.sys_sitemsg.delete.post({ id: row.id })
this.$message.success(`删除 ${res.data}`)
this.$message.success(this.$t('删除 {count} 项', { count: res.data }))
} catch {
//
}
this.$refs.table.refresh()
},
//
async batchDel() {
let loading
try {
await this.$confirm(`确定删除选中的 ${this.selection.length} 项吗?`, '提示', {
type: 'warning',
})
loading = this.$loading()
const res = await this.$API.sys_sitemsg.bulkDelete.post({
items: this.selection,
})
this.$message.success(`删除 ${res.data}`)
} catch {
//
}
loading?.close()
this.$refs.table.refresh()
},
//
onSearch(form) {

View File

@ -71,8 +71,8 @@
</el-tabs>
</el-form>
<template #footer>
<el-button @click="visible = false"> </el-button>
<el-button v-if="mode !== 'view'" :loading="loading" @click="submit" type="primary"> </el-button>
<el-button @click="visible = false">{{ $t('取消') }}</el-button>
<el-button v-if="mode !== 'view'" :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button>
</template>
</sc-dialog>
</template>
@ -80,6 +80,7 @@
<script>
import { AiEditor } from 'aieditor'
import 'aieditor/dist/style.css'
import sysConfig from '../../../config'
export default {
components: {},
@ -88,9 +89,9 @@ export default {
return {
mode: 'add',
titleMap: {
view: '查看消息',
add: '新增消息',
edit: '编辑消息',
view: this.$t('查看消息'),
add: this.$t('新增消息'),
edit: this.$t('编辑消息'),
},
visible: false,
loading: false,
@ -141,14 +142,15 @@ export default {
this.loading = false
await this.$nextTick()
new AiEditor({
const aiEditor = new AiEditor({
element: this.$refs.editor,
placeholder: '请输入消息内容...',
placeholder: this.$t('请输入消息内容...'),
content: this.form.content,
onChange: (content) => {
this.form.content = content.getHtml()
},
})
aiEditor.changeLang(this.$TOOL.data.get('APP_LANG') || sysConfig.LANG)
return this
},
@ -166,7 +168,7 @@ export default {
this.loading = false
this.$emit('success', res.data, this.mode)
this.visible = false
this.$message.success('操作成功')
this.$message.success(this.$t('操作成功'))
} catch {
//
this.loading = false

View File

@ -13,7 +13,7 @@
],
},
]"
:label-width="6"
:label-width="10"
@on-change="filterChange"
ref="selectFilter"></sc-select-filter>
</el-header>
@ -24,7 +24,7 @@
{
type: 'input',
field: ['root', 'keywords'],
placeholder: '角色编号 / 角色名称 / 备注',
placeholder: $t('角色编号 / 角色名称 / 备注'),
style: 'width:20rem',
},
{
@ -34,7 +34,7 @@
{ label: '是', value: true },
{ label: '否', value: false },
],
placeholder: '无限权限',
placeholder: $t('无限权限'),
style: 'width:15rem',
},
{
@ -44,7 +44,7 @@
{ label: '是', value: true },
{ label: '否', value: false },
],
placeholder: '显示仪表板',
placeholder: $t('显示仪表板'),
style: 'width:15rem',
},
]"
@ -55,7 +55,7 @@
</div>
<div class="right-panel">
<na-button-add :vue="this" />
<el-button :disabled="selection.length === 0" @click="batchDel" icon="el-icon-delete" plain type="danger"></el-button>
<na-button-bulk-del :api="$API.sys_role.bulkDelete" :vue="this" />
</div>
</el-header>
<el-main class="nopadding">
@ -80,7 +80,7 @@
<el-table-column :label="$t('角色编号')" prop="id" sortable="custom" />
<el-table-column :label="$t('角色名称')" prop="name" sortable="custom" />
<el-table-column :label="$t('排序')" align="right" prop="sort" sortable="custom" />
<el-table-column :label="$t('启用')" align="center" prop="enabled" sortable="custom" width="80">
<el-table-column :label="$t('启用')" align="center" prop="enabled" sortable="custom" width="100">
<template #default="scope">
<el-switch v-model="scope.row.enabled" @change="changeSwitch($event, scope.row)"></el-switch>
</template>
@ -101,9 +101,10 @@
return { value: x[0], text: x[1][1], type: x[1][2] }
})
"
align="center"
prop="dataScope"
sortable="custom"
width="100">
width="120">
</na-col-indicator>
<na-col-indicator
@ -177,29 +178,12 @@ export default {
async changeSwitch(event, row) {
try {
await this.$API.sys_role.setEnabled.post(row)
this.$message.success(`操作成功`)
this.$message.success(this.$t('操作成功'))
} catch {
//
}
this.$refs.table.refresh()
},
async batchDel() {
let loading
try {
await this.$confirm(`确定删除选中的 ${this.selection.length} 项吗?`, '提示', {
type: 'warning',
})
loading = this.$loading()
const res = await this.$API.sys_role.bulkDelete.post({
items: this.selection,
})
this.$message.success(`删除 ${res.data}`)
} catch {
//
}
loading?.close()
this.$refs.table.refresh()
},
filterChange(data) {
Object.entries(data).forEach(([key, value]) => {
this.$refs.search.form.dy[key] = value === 'true' ? true : value === 'false' ? false : value
@ -209,7 +193,7 @@ export default {
async rowDel(row) {
try {
const res = await this.$API.sys_role.delete.post({ id: row.id })
this.$message.success(`删除 ${res.data}`)
this.$message.success(this.$t('删除 {count} 项', { count: res.data }))
} catch {
//
}

View File

@ -3,7 +3,7 @@
<div v-loading="loading">
<el-tabs tab-position="top">
<el-tab-pane :label="$t('基本信息')">
<el-form :disabled="mode === 'view'" :model="form" :rules="rules" label-width="10rem" ref="dialogForm">
<el-form :disabled="mode === 'view'" :model="form" :rules="rules" label-width="15rem" ref="dialogForm">
<el-form-item :label="$t('角色名称')" prop="name">
<el-input v-model="form.name" clearable></el-input>
</el-form-item>
@ -72,7 +72,7 @@
<el-option :label="$t('仪表板')" :value="true"></el-option>
<el-option :label="$t('工作台')" :value="false"></el-option>
</el-select>
<div class="el-form-item-msg">用于控制角色登录后控制台的视图</div>
<div class="el-form-item-msg">{{ $t('用于控制角色登录后控制台的视图') }}</div>
</el-form-item>
</el-form>
</el-tab-pane>
@ -88,8 +88,8 @@
</el-tabs>
</div>
<template #footer>
<el-button @click="visible = false"> </el-button>
<el-button v-if="mode !== 'view'" :loading="loading" @click="submit" type="primary"> </el-button>
<el-button @click="visible = false">{{ $t('取消') }}</el-button>
<el-button v-if="mode !== 'view'" :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button>
</template>
</sc-dialog>
</template>
@ -102,9 +102,9 @@ export default {
return {
mode: 'add',
titleMap: {
add: '新增角色',
edit: '编辑角色',
view: '查看角色',
add: this.$t('新增角色'),
edit: this.$t('编辑角色'),
view: this.$t('查看角色'),
},
visible: false,
loading: false,
@ -171,7 +171,7 @@ export default {
const res = await method.post(postData)
this.$emit('success', res.data, this.mode)
this.visible = false
this.$message.success('操作成功')
this.$message.success(this.$t('操作成功'))
} catch {
//
}

View File

@ -13,7 +13,7 @@
],
},
]"
:label-width="6"
:label-width="10"
@on-change="filterChange"
ref="selectFilter"></sc-select-filter>
</el-header>
@ -24,7 +24,7 @@
{
type: 'input',
field: ['root', 'keywords'],
placeholder: '用户编号 / 用户名 / 手机号 / 邮箱 / 备注',
placeholder: $t('用户编号 / 用户名 / 手机号 / 邮箱 / 备注'),
style: 'width:25rem',
},
{
@ -32,7 +32,7 @@
field: ['filter', 'roleId'],
api: $API.sys_role.query,
config: { props: { label: 'name', value: 'id' } },
placeholder: '所属角色',
placeholder: $t('所属角色'),
style: 'width:15rem',
},
{
@ -40,7 +40,7 @@
field: ['filter', 'deptId'],
api: $API.sys_dept.query,
props: { label: 'name', value: 'id', checkStrictly: true, expandTrigger: 'hover', emitPath: false },
placeholder: '所属部门',
placeholder: $t('所属部门'),
style: 'width:15rem',
},
]"
@ -79,7 +79,7 @@
<el-table-column :label="$t('邮箱')" prop="email" sortable="custom" />
<na-col-tags :label="$t('所属角色')" @click="(item) => openDialog('sys_role', item.id, 'roleSave')" field="name" prop="roles" />
<na-col-tags :label="$t('所属部门')" @click="(item) => openDialog('sys_dept', item.id, 'deptSave')" field="name" prop="dept" />
<el-table-column :label="$t('启用')" align="center" prop="enabled" sortable="custom" width="80">
<el-table-column :label="$t('启用')" align="center" prop="enabled" sortable="custom" width="100">
<template #default="scope">
<el-switch v-model="scope.row.enabled" @change="changeSwitch($event, scope.row)"></el-switch>
</template>
@ -139,7 +139,7 @@ export default {
async changeSwitch(event, row) {
try {
await this.$API.sys_user.setEnabled.post(row)
this.$message.success(`操作成功`)
this.$message.success(this.$t('操作成功'))
} catch {
//
}

View File

@ -12,7 +12,7 @@
:model="form"
:rules="rules"
label-position="right"
label-width="10rem"
label-width="12rem"
ref="dialogForm">
<el-tabs tab-position="top">
<el-tab-pane :label="$t('基本信息')">
@ -46,7 +46,7 @@
maxlength="16"
oninput="value=value.replace(/[^\w]/g,'')"
placeholder="8位以上数字字母组合"></el-input>
<el-button @click="form.passwordText = '1234qwer'">初始密码</el-button>
<el-button @click="form.passwordText = '1234qwer'">{{ $t('初始密码') }}</el-button>
</div>
</el-form-item>
@ -234,8 +234,8 @@
</el-tabs>
</el-form>
<template #footer>
<el-button @click="visible = false"> </el-button>
<el-button v-if="mode !== 'view'" :loading="loading" @click="submit" type="primary"> </el-button>
<el-button @click="visible = false">{{ $t('取消') }}</el-button>
<el-button v-if="mode !== 'view'" :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button>
</template>
</sc-dialog>
</template>
@ -248,9 +248,9 @@ export default {
return {
mode: 'add',
titleMap: {
view: '查看用户',
add: '新增用户',
edit: '编辑用户',
view: this.$t('查看用户'),
add: this.$t('新增用户'),
edit: this.$t('编辑用户'),
},
visible: false,
loading: false,
@ -349,7 +349,7 @@ export default {
this.loading = false
this.$emit('success', res.data, this.mode)
this.visible = false
this.$message.success('操作成功')
this.$message.success(this.$t('操作成功'))
} catch {
this.loading = false
}