mirror of
				https://github.com/nsnail/NetAdmin.git
				synced 2025-11-01 03:35:28 +08:00 
			
		
		
		
	perf: ⚡ 精简全局组件
This commit is contained in:
		| @@ -7,7 +7,7 @@ | ||||
|  | ||||
| <script> | ||||
| import colorTool from '@/utils/color' | ||||
| import naVersionUpdater from '@/components/naVersionUpdater/index.vue' | ||||
| import naVersionUpdater from '@/components/naVersionUpdater' | ||||
| import UseTabs from '@/utils/useTabs' | ||||
|  | ||||
| export default { | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <template> | ||||
|     <sc-table-select | ||||
|     <scTableSelect | ||||
|         v-model="area" | ||||
|         :params="form" | ||||
|         :props="{ label: 'key', value: 'value' }" | ||||
| @@ -16,10 +16,13 @@ | ||||
|         </template> | ||||
|         <el-table-column :label="$t('地区')" prop="key" width="400" /> | ||||
|         <el-table-column :label="$t('代码')" prop="value" /> | ||||
|     </sc-table-select> | ||||
|     </scTableSelect> | ||||
| </template> | ||||
| <style scoped></style> | ||||
| <script> | ||||
| import { defineAsyncComponent } from 'vue' | ||||
|  | ||||
| const scTableSelect = defineAsyncComponent(() => import('@/components/scTableSelect')) | ||||
| export default { | ||||
|     props: { | ||||
|         modelValue: { type: Object }, | ||||
| @@ -31,6 +34,9 @@ export default { | ||||
|                 dynamicFilter: { | ||||
|                     filters: [], | ||||
|                     logic: 'or', | ||||
|                     field: 'catalogId', | ||||
|                     value: this.$GLOBAL.numbers.ID_DIC_CATALOG_GEO_AREA, | ||||
|                     operator: 'eq', | ||||
|                 }, | ||||
|             }, | ||||
|         } | ||||
| @@ -50,7 +56,9 @@ export default { | ||||
|     }, | ||||
|     mounted() {}, | ||||
|     created() {}, | ||||
|     components: {}, | ||||
|     components: { | ||||
|         scTableSelect, | ||||
|     }, | ||||
|     computed: {}, | ||||
|     methods: { | ||||
|         onInput() { | ||||
|   | ||||
| @@ -25,10 +25,12 @@ export default { | ||||
|         //批量删除 | ||||
|         async bulkDel() { | ||||
|             this.loading = true | ||||
|             let load | ||||
|             try { | ||||
|                 await this.$confirm(this.$t('确定删除选中的 {count} 项吗?', { count: this.vue.selection.length }), this.$t('提示'), { | ||||
|                     type: 'warning', | ||||
|                 }) | ||||
|                 load = this.$loading() | ||||
|                 const res = await this.api.post({ | ||||
|                     items: this.vue.selection, | ||||
|                 }) | ||||
| @@ -37,6 +39,7 @@ export default { | ||||
|             } catch { | ||||
|                 // | ||||
|             } | ||||
|             load?.close() | ||||
|             this.loading = false | ||||
|         }, | ||||
|     }, | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|     </el-table-column> | ||||
| </template> | ||||
| <script> | ||||
| import naIndicator from '@/components/naIndicator/index.vue' | ||||
| import naIndicator from '@/components/naIndicator' | ||||
| export default { | ||||
|     emits: [], | ||||
|     props: { | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
|                         width="20rem"> | ||||
|                         <template #reference> | ||||
|                             <el-button | ||||
|                                 v-loading="loading" | ||||
|                                 :disabled="disabled" | ||||
|                                 :icon="item.icon" | ||||
|                                 :title="item.title ? $t(item.title) : ''" | ||||
|                                 :type="item.type" | ||||
| @@ -20,7 +20,7 @@ | ||||
|                     </el-popconfirm> | ||||
|                     <el-button | ||||
|                         v-else | ||||
|                         v-loading="loading" | ||||
|                         :disabled="disabled" | ||||
|                         :icon="item.icon" | ||||
|                         :title="item.title ? $t(item.title) : ''" | ||||
|                         :type="item.type" | ||||
| @@ -47,7 +47,7 @@ export default { | ||||
|     }, | ||||
|     data() { | ||||
|         return { | ||||
|             loading: false, | ||||
|             disabled: false, | ||||
|         } | ||||
|     }, | ||||
|     mounted() {}, | ||||
| @@ -56,9 +56,9 @@ export default { | ||||
|     computed: {}, | ||||
|     methods: { | ||||
|         async click(item, row, vue) { | ||||
|             this.loading = true | ||||
|             this.disabled = true | ||||
|             await item.click(row, vue) | ||||
|             this.loading = false | ||||
|             this.disabled = false | ||||
|         }, | ||||
|     }, | ||||
| } | ||||
|   | ||||
| @@ -33,7 +33,7 @@ | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import naVerify from '@/components/naVerifition/index.vue' | ||||
| import naVerify from '@/components/naVerifition' | ||||
|  | ||||
| export default { | ||||
|     emits: [], | ||||
|   | ||||
| @@ -35,7 +35,7 @@ | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import naVerify from '@/components/naVerifition/index.vue' | ||||
| import naVerify from '@/components/naVerifition' | ||||
|  | ||||
| export default { | ||||
|     emits: [], | ||||
|   | ||||
| @@ -36,7 +36,7 @@ | ||||
|                     </el-select> | ||||
|                 </template> | ||||
|             </el-input> | ||||
|             <sc-select | ||||
|             <scSelect | ||||
|                 v-else-if="item.type === 'remote-select' && (!item.condition || item.condition())" | ||||
|                 v-model="form[item.field[0]][item.field[1]]" | ||||
|                 v-role="item.role || '*/*/*'" | ||||
| @@ -71,7 +71,7 @@ | ||||
|                 :style="item.style" | ||||
|                 clearable | ||||
|                 filterable /> | ||||
|             <na-user-select | ||||
|             <naUserSelect | ||||
|                 v-else-if="item.type === 'user-select' && (!item.condition || item.condition())" | ||||
|                 v-model="form[item.field[0]][item.field[1]]" | ||||
|                 v-role="item.role || '*/*/*'" | ||||
| @@ -89,7 +89,7 @@ | ||||
|                     <template #reference> | ||||
|                         <el-button @click="reset" icon="el-icon-refresh-left">{{ $t('重置') }}</el-button> | ||||
|                     </template> | ||||
|                     <v-ace-editor | ||||
|                     <VAceEditor | ||||
|                         v-model:value="aceEditorValue" | ||||
|                         :theme="$TOOL.data.get('APP_SET_DARK') || $CONFIG.APP_SET_DARK ? 'github_dark' : 'github'" | ||||
|                         lang="json" | ||||
| @@ -148,7 +148,14 @@ | ||||
| import tool from '@/utils/tool' | ||||
| import vkbeautify from 'vkbeautify/index' | ||||
|  | ||||
| import { defineAsyncComponent } from 'vue' | ||||
| const naUserSelect = defineAsyncComponent(() => import('@/components/naUserSelect')) | ||||
| const scSelect = defineAsyncComponent(() => import('@/components/scSelect')) | ||||
| export default { | ||||
|     components: { | ||||
|         naUserSelect, | ||||
|         scSelect, | ||||
|     }, | ||||
|     emits: ['search', 'reset', 'reSearch'], | ||||
|     props: { | ||||
|         dateField: { type: String, default: 'createdTime' }, | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <template> | ||||
|     <sc-table-select | ||||
|     <scTableSelect | ||||
|         v-model="user" | ||||
|         :params="form" | ||||
|         :props="{ label: 'userName', value: 'id' }" | ||||
| @@ -21,10 +21,13 @@ | ||||
|         <el-table-column :label="$t('用户编号')" prop="id" /> | ||||
|         <el-table-column :label="$t('用户名')" prop="userName" /> | ||||
|         <el-table-column :label="$t('手机号')" prop="mobile" /> | ||||
|     </sc-table-select> | ||||
|     </scTableSelect> | ||||
| </template> | ||||
| <style scoped></style> | ||||
| <script> | ||||
| import { defineAsyncComponent } from 'vue' | ||||
|  | ||||
| const scTableSelect = defineAsyncComponent(() => import('@/components/scTableSelect')) | ||||
| export default { | ||||
|     props: { | ||||
|         modelValue: { type: Object }, | ||||
| @@ -52,7 +55,9 @@ export default { | ||||
|     }, | ||||
|     mounted() {}, | ||||
|     created() {}, | ||||
|     components: {}, | ||||
|     components: { | ||||
|         scTableSelect, | ||||
|     }, | ||||
|     computed: {}, | ||||
|     methods: { | ||||
|         onInput() { | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <template> | ||||
|     <sc-dialog v-model="visible" :title="$t('高级筛选')" destroy-on-close> | ||||
|     <scDialog v-model="visible" :title="$t('高级筛选')" destroy-on-close> | ||||
|         <el-form :model="form" :rules="rules" label-width="10rem" ref="form"> | ||||
|             <el-form-item :label="$t('字段名')" prop="field"> | ||||
|                 <el-input v-model="form.field" :placeholder="$t('字段名')" clearable /> | ||||
| @@ -16,7 +16,7 @@ | ||||
|             <el-button @click="visible = false">{{ $t('取消') }}</el-button> | ||||
|             <el-button @click="submit" type="primary">{{ $t('确定') }}</el-button> | ||||
|         </template> | ||||
|     </sc-dialog> | ||||
|     </scDialog> | ||||
| </template> | ||||
| <script> | ||||
| export default { | ||||
|   | ||||
| @@ -217,7 +217,7 @@ | ||||
| import config from '@/config/table' | ||||
| import columnSetting from './columnSetting' | ||||
| import scContextmenuItem from '@/components/scContextmenu/item.vue' | ||||
| import scContextmenu from '@/components/scContextmenu/index.vue' | ||||
| import scContextmenu from '@/components/scContextmenu' | ||||
| import fieldFilter from './fieldFilter.vue' | ||||
| import { h } from 'vue' | ||||
| import tool from '@/utils/tool' | ||||
|   | ||||
| @@ -15,4 +15,23 @@ export default { | ||||
|             }, | ||||
|         }, | ||||
|     ], | ||||
|     delButton(title, api, idField = 'id', idProc = (id) => id) { | ||||
|         return { | ||||
|             icon: 'el-icon-delete', | ||||
|             type: 'danger', | ||||
|             confirm: true, | ||||
|             title: title, | ||||
|             click: async (row, vue) => { | ||||
|                 let loading = vue.$loading() | ||||
|                 try { | ||||
|                     const res = await api.post({ | ||||
|                         id: idProc(row[idField]), | ||||
|                     }) | ||||
|                     vue.$message.success(vue.$t('删除 {count} 项', { count: res.data })) | ||||
|                     vue.$refs.table.refresh() | ||||
|                 } catch {} | ||||
|                 loading?.close() | ||||
|             }, | ||||
|         } | ||||
|     }, | ||||
| } | ||||
| @@ -26,38 +26,19 @@ import 'ace-builds/src-noconflict/theme-github_dark' // Load the theme definitio | ||||
| import { VAceEditor } from 'vue3-ace-editor' | ||||
|  | ||||
| // sc组件 | ||||
| import scCron from '@/components/scCron/index.vue' | ||||
| import scDialog from '@/components/scDialog' | ||||
| import scFormTable from '@/components/scFormTable' | ||||
| import scPageHeader from '@/components/scPageHeader' | ||||
| import scSelect from '@/components/scSelect' | ||||
| import scSelectFilter from '@/components/scSelectFilter' | ||||
| import scStatistic from '@/components/scStatistic/index.vue' | ||||
| import scStatistic from '@/components/scStatistic' | ||||
| import scStatusIndicator from '@/components/scMini/scStatusIndicator' | ||||
| import scTable from '@/components/scTable' | ||||
| import scTableColumn from '@/components/scTable/column.js' | ||||
| import scTableSelect from '@/components/scTableSelect' | ||||
| import scTrend from '@/components/scMini/scTrend' | ||||
| import scUpload from '@/components/scUpload' | ||||
| import scUploadFile from '@/components/scUpload/file' | ||||
| import scUploadMultiple from '@/components/scUpload/multiple' | ||||
| import scWaterMark from '@/components/scWaterMark' | ||||
|  | ||||
| // net-admin组件 | ||||
| import naArea from '@/components/naArea/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' | ||||
| import naButtonBulkDel from '@/components/naButtonBulkDel' | ||||
| import naColId from '@/components/naColId' | ||||
| import naColIndicator from '@/components/naColIndicator' | ||||
| import naColOperation from '@/components/naColOperation' | ||||
| import naColTag from '@/components/naColTag/index.vue' | ||||
| import naColTags from '@/components/naColTags/index.vue' | ||||
| import naColTime from '@/components/naColTime/index.vue' | ||||
| import naColUser from '@/components/naColUser/index.vue' | ||||
| import naDept from '@/components/naDept/index.vue' | ||||
| import naFormEmail from '@/components/naFormEmail/index.vue' | ||||
| import naColUser from '@/components/naColUser' | ||||
| import naSearch from '@/components/naSearch' | ||||
| import naUserSelect from '@/components/naUserSelect/index.vue' | ||||
|  | ||||
| export default { | ||||
|     install(app) { | ||||
| @@ -86,38 +67,19 @@ export default { | ||||
|         app.component('VAceEditor', VAceEditor) | ||||
|  | ||||
|         // net-admin组件 | ||||
|         app.component('naArea', naArea) | ||||
|         app.component('naButtonBulkDel', naButtonBulkDel) | ||||
|         app.component('naColAvatar', naColAvatar) | ||||
|         app.component('naColId', naColId) | ||||
|         app.component('naColIndicator', naColIndicator) | ||||
|         app.component('naColOperation', naColOperation) | ||||
|         app.component('naColTag', naColTag) | ||||
|         app.component('naColTags', naColTags) | ||||
|         app.component('naColTime', naColTime) | ||||
|         app.component('naColUser', naColUser) | ||||
|         app.component('naDept', naDept) | ||||
|         app.component('naFormEmail', naFormEmail) | ||||
|         app.component('naSearch', naSearch) | ||||
|         app.component('naUserSelect', naUserSelect) | ||||
|  | ||||
|         // sc组件 | ||||
|         app.component('scCron', scCron) | ||||
|         app.component('scDialog', scDialog) | ||||
|         app.component('scFormTable', scFormTable) | ||||
|         app.component('scPageHeader', scPageHeader) | ||||
|         app.component('scSelect', scSelect) | ||||
|         app.component('scSelectFilter', scSelectFilter) | ||||
|         app.component('scStatistic', scStatistic) | ||||
|         app.component('scStatusIndicator', scStatusIndicator) | ||||
|         app.component('scTable', scTable) | ||||
|         app.component('scTableColumn', scTableColumn) | ||||
|         app.component('scTableSelect', scTableSelect) | ||||
|         app.component('scTrend', scTrend) | ||||
|         app.component('scUpload', scUpload) | ||||
|         app.component('scUploadFile', scUploadFile) | ||||
|         app.component('scUploadMultiple', scUploadMultiple) | ||||
|         app.component('scWaterMark', scWaterMark) | ||||
|  | ||||
|         //注册全局指令 | ||||
|         app.directive('auth', auth) | ||||
|   | ||||
| @@ -24,21 +24,21 @@ const routes = [ | ||||
|                     }, | ||||
|                     { | ||||
|                         path: '/profile/message', | ||||
|                         component: () => import(/* webpackChunkName: "userRegister" */ '@/views/profile/message/index.vue'), | ||||
|                         component: () => import(/* webpackChunkName: "userRegister" */ '@/views/profile/message'), | ||||
|                         meta: { | ||||
|                             title: '消息中心', | ||||
|                         }, | ||||
|                     }, | ||||
|                     { | ||||
|                         path: '/profile/account', | ||||
|                         component: () => import(/* webpackChunkName: "userRegister" */ '@/views/profile/account/index.vue'), | ||||
|                         component: () => import(/* webpackChunkName: "userRegister" */ '@/views/profile/account'), | ||||
|                         meta: { | ||||
|                             title: '基本资料', | ||||
|                         }, | ||||
|                     }, | ||||
|                     { | ||||
|                         path: '/profile/token', | ||||
|                         component: () => import(/* webpackChunkName: "userRegister" */ '@/views/profile/token/index.vue'), | ||||
|                         component: () => import(/* webpackChunkName: "userRegister" */ '@/views/profile/token'), | ||||
|                         meta: { | ||||
|                             title: '授权信息', | ||||
|                         }, | ||||
|   | ||||
| @@ -629,4 +629,10 @@ textarea { | ||||
| .el-header.el-header-select-filter { | ||||
|     height: auto; | ||||
|     padding: 0 1rem; | ||||
| } | ||||
|  | ||||
| .children-nopadding { | ||||
|     * { | ||||
|         padding: 0 !important; | ||||
|     } | ||||
| } | ||||
| @@ -17,7 +17,7 @@ | ||||
|     </el-form> | ||||
| </template> | ||||
| <script> | ||||
| import naFormPhone from '@/components/naFormPhone/index.vue' | ||||
| import naFormPhone from '@/components/naFormPhone' | ||||
| import phoneConfig from '@/config/naFormPhone' | ||||
|  | ||||
| export default { | ||||
|   | ||||
| @@ -75,7 +75,7 @@ | ||||
| <script> | ||||
| import commonPage from './components/commonPage' | ||||
| import naFormPassword from '@/config/naFormPassword' | ||||
| import naFormPhone from '@/components/naFormPhone/index.vue' | ||||
| import naFormPhone from '@/components/naFormPhone' | ||||
| import phoneConfig from '@/config/naFormPhone' | ||||
| import scPasswordStrength from '@/components/scPasswordStrength' | ||||
|  | ||||
|   | ||||
| @@ -37,9 +37,9 @@ | ||||
| <script> | ||||
| import commonPage from './components/commonPage' | ||||
| import naFormPassword from '@/config/naFormPassword' | ||||
| import naFormPhone from '@/components/naFormPhone/index.vue' | ||||
| import naFormPhone from '@/components/naFormPhone' | ||||
| import phoneConfig from '@/config/naFormPhone' | ||||
| import scPasswordStrength from '@/components/scPasswordStrength/index.vue' | ||||
| import scPasswordStrength from '@/components/scPasswordStrength' | ||||
|  | ||||
| export default { | ||||
|     components: { | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <template> | ||||
|     <sc-dialog v-model="visible" :title="`${title}`" @closed="$emit('closed')" destroy-on-close> | ||||
|     <scDialog v-model="visible" :title="`${title}`" @closed="$emit('closed')" destroy-on-close> | ||||
|         <el-form :model="form" ref="form"> | ||||
|             <el-form-item | ||||
|                 v-for="(row, index) in form.rows" | ||||
| @@ -24,7 +24,7 @@ | ||||
|             <el-button @click="this.form.rows.push({ value: '' })">{{ $t('添加一行') }}</el-button> | ||||
|             <el-button @click="submit" type="primary">{{ $t('保存') }}</el-button> | ||||
|         </template> | ||||
|     </sc-dialog> | ||||
|     </scDialog> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|     <el-card :header="$t('基本资料')" shadow="never"> | ||||
|         <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> | ||||
|                 <scUpload v-model="form.avatar" :onSuccess="updateUser" :title="$t('上传头像')"></scUpload> | ||||
|             </el-form-item> | ||||
|             <el-form-item :label="$t('用户编号')"> | ||||
|                 <el-input v-model="form.id" readonly></el-input> | ||||
| @@ -58,9 +58,10 @@ import { defineAsyncComponent } from 'vue' | ||||
| const setMobileDialog = defineAsyncComponent(() => import('@/views/profile/account/set-mobile.vue')) | ||||
| const setPasswordDialog = defineAsyncComponent(() => import('@/views/profile/account/set-password.vue')) | ||||
| const setEmailDialog = defineAsyncComponent(() => import('@/views/profile/account/set-email.vue')) | ||||
| const scUpload = defineAsyncComponent(() => import('@/components/scUpload')) | ||||
|  | ||||
| export default { | ||||
|     components: { setMobileDialog, setPasswordDialog, setEmailDialog }, | ||||
|     components: { setMobileDialog, setPasswordDialog, setEmailDialog, scUpload }, | ||||
|     created() { | ||||
|         this.form = this.$GLOBAL.user | ||||
|     }, | ||||
|   | ||||
| @@ -14,7 +14,7 @@ | ||||
|                         form-name="form" /> | ||||
|                 </el-col> | ||||
|                 <el-col :lg="10"> | ||||
|                     <na-form-email | ||||
|                     <naFormEmail | ||||
|                         v-model="form" | ||||
|                         :code-label="$t('邮箱验证码')" | ||||
|                         :email-label="$t('邮箱地址')" | ||||
| @@ -35,13 +35,15 @@ | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import naFormPhone from '@/components/naFormPhone/index.vue' | ||||
| import naFormPhone from '@/components/naFormPhone' | ||||
| import phoneConfig from '@/config/naFormPhone' | ||||
| import emailConfig from '@/config/naFormEmail' | ||||
|  | ||||
| import { defineAsyncComponent } from 'vue' | ||||
| const naFormEmail = defineAsyncComponent(() => import('@/components/naFormEmail')) | ||||
| export default { | ||||
|     components: { | ||||
|         naFormPhone, | ||||
|         naFormEmail, | ||||
|     }, | ||||
|     created() {}, | ||||
|  | ||||
|   | ||||
| @@ -40,7 +40,7 @@ | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import naFormPhone from '@/components/naFormPhone/index.vue' | ||||
| import naFormPhone from '@/components/naFormPhone' | ||||
| import phoneConfig from '@/config/naFormPhone' | ||||
|  | ||||
| export default { | ||||
|   | ||||
| @@ -41,7 +41,7 @@ | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import scPasswordStrength from '@/components/scPasswordStrength/index.vue' | ||||
| import scPasswordStrength from '@/components/scPasswordStrength' | ||||
| import naFormPassword from '@/config/naFormPassword' | ||||
|  | ||||
| export default { | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import LoginLog from '@/views/sys/log/login/index.vue' | ||||
| import LoginLog from '@/views/sys/log/login' | ||||
|  | ||||
| export default { | ||||
|     components: { LoginLog }, | ||||
|   | ||||
| @@ -19,7 +19,7 @@ | ||||
|                 stripe> | ||||
|                 <el-table-column :label="$t('接口路径')" min-width="400" prop="id" /> | ||||
|                 <el-table-column :label="$t('接口名称')" min-width="200" prop="name" /> | ||||
|                 <na-col-indicator | ||||
|                 <naColIndicator | ||||
|                     :label="$t('请求方式')" | ||||
|                     :options=" | ||||
|                         Object.entries(this.$GLOBAL.enums.httpMethods).map((x) => { | ||||
|   | ||||
| @@ -83,7 +83,7 @@ | ||||
|                 <el-table-column :label="$t('键名')" min-width="400" prop="key" /> | ||||
|                 <el-table-column :label="$t('数据类型')" align="center" prop="type" width="100" /> | ||||
|                 <el-table-column :label="$t('过期时间')" align="right" prop="expireTime" width="200" /> | ||||
|                 <na-col-operation | ||||
|                 <naColOperation | ||||
|                     :buttons="[ | ||||
|                         { | ||||
|                             icon: 'el-icon-view', | ||||
| @@ -108,7 +108,7 @@ | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import naInfo from '@/components/naInfo/index.vue' | ||||
| import naInfo from '@/components/naInfo' | ||||
|  | ||||
| export default { | ||||
|     components: { | ||||
|   | ||||
| @@ -40,7 +40,7 @@ | ||||
|             </div> | ||||
|             <div class="right-panel"> | ||||
|                 <el-button @click="this.dialog.save = { mode: 'add' }" icon="el-icon-plus" type="primary"></el-button> | ||||
|                 <na-button-bulk-del :api="$API.sys_config.bulkDelete" :vue="this" /> | ||||
|                 <naButtonBulkDel :api="$API.sys_config.bulkDelete" :vue="this" /> | ||||
|                 <el-dropdown v-show="this.selection.length > 0"> | ||||
|                     <el-button type="primary"> | ||||
|                         {{ $t('批量操作') }} | ||||
| @@ -74,7 +74,7 @@ | ||||
|                 row-key="id" | ||||
|                 stripe> | ||||
|                 <el-table-column type="selection" width="50" /> | ||||
|                 <na-col-id :label="$t('配置编号')" min-width="170" prop="id" /> | ||||
|                 <naColId :label="$t('配置编号')" min-width="170" prop="id" /> | ||||
|                 <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" /> | ||||
| @@ -89,16 +89,8 @@ | ||||
|                         <el-switch v-model="row.enabled" @change="changeSwitch($event, row)"></el-switch> | ||||
|                     </template> | ||||
|                 </el-table-column> | ||||
|                 <na-col-operation | ||||
|                     :buttons=" | ||||
|                         naColOperation.buttons.concat({ | ||||
|                             icon: 'el-icon-delete', | ||||
|                             confirm: true, | ||||
|                             title: '删除部门', | ||||
|                             click: this.rowDel, | ||||
|                             type: 'danger', | ||||
|                         }) | ||||
|                     " | ||||
|                 <naColOperation | ||||
|                     :buttons="naColOperation.buttons.concat(naColOperation.delButton('删除部门', $API.sys_config.delete))" | ||||
|                     :vue="this" | ||||
|                     width="150" /> | ||||
|             </sc-table> | ||||
| @@ -212,15 +204,6 @@ export default { | ||||
|             }) | ||||
|             this.$refs.search.search() | ||||
|         }, | ||||
|         async rowDel(row) { | ||||
|             try { | ||||
|                 const res = await this.$API.sys_config.delete.post({ id: row.id }) | ||||
|                 this.$message.success(this.$t('删除 {count} 项', { count: res.data })) | ||||
|             } catch { | ||||
|                 // | ||||
|             } | ||||
|             this.$refs.table.refresh() | ||||
|         }, | ||||
|         //重置 | ||||
|         onReset() { | ||||
|             Object.entries(this.$refs.selectFilter.selected).forEach(([key, _]) => (this.$refs.selectFilter.selected[key] = [''])) | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <template> | ||||
|     <sc-dialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close> | ||||
|     <scDialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close> | ||||
|         <div v-loading="loading"> | ||||
|             <el-tabs v-if="!loading" tab-position="top"> | ||||
|                 <el-tab-pane :label="$t('基本信息')"> | ||||
| @@ -8,7 +8,7 @@ | ||||
|                             <el-collapse-item :title="$t('用户注册设置')" name="1"> | ||||
|                                 <div style="margin: 1rem"> | ||||
|                                     <el-form-item :label="$t('默认角色')" prop="userRegisterRoleId"> | ||||
|                                         <sc-select | ||||
|                                         <scSelect | ||||
|                                             v-model="form.userRegisterRoleId" | ||||
|                                             :config="{ props: { label: 'name', value: 'id' } }" | ||||
|                                             :export-api="$API.sys_role.export" | ||||
| @@ -18,7 +18,7 @@ | ||||
|                                             style="width: 15rem" /> | ||||
|                                     </el-form-item> | ||||
|                                     <el-form-item :label="$t('默认部门')" prop="userRegisterDeptId"> | ||||
|                                         <na-dept v-model="form.userRegisterDeptId" style="width: 15rem"></na-dept> | ||||
|                                         <naDept v-model="form.userRegisterDeptId" style="width: 15rem"></naDept> | ||||
|                                     </el-form-item> | ||||
|                                     <el-form-item :label="$t('开启人工审核')" prop="userRegisterConfirm"> | ||||
|                                         <el-switch v-model="form.userRegisterConfirm"></el-switch> | ||||
| @@ -33,13 +33,13 @@ | ||||
|                     </el-form> | ||||
|                 </el-tab-pane> | ||||
|                 <el-tab-pane v-if="mode === 'view'" :label="$t('原始数据')"> | ||||
|                     <json-viewer | ||||
|                     <JsonViewer | ||||
|                         :expand-depth="5" | ||||
|                         :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'dark' : 'light'" | ||||
|                         :value="form" | ||||
|                         copyable | ||||
|                         expanded | ||||
|                         sort></json-viewer> | ||||
|                         sort></JsonViewer> | ||||
|                 </el-tab-pane> | ||||
|             </el-tabs> | ||||
|         </div> | ||||
| @@ -47,12 +47,15 @@ | ||||
|             <el-button @click="visible = false">{{ $t('取消') }}</el-button> | ||||
|             <el-button v-if="mode !== 'view'" :disabled="loading" :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button> | ||||
|         </template> | ||||
|     </sc-dialog> | ||||
|     </scDialog> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import { defineAsyncComponent } from 'vue' | ||||
| const naDept = defineAsyncComponent(() => import('@/components/naDept')) | ||||
| const scSelect = defineAsyncComponent(() => import('@/components/scSelect')) | ||||
| export default { | ||||
|     components: {}, | ||||
|     components: { naDept, scSelect }, | ||||
|     data() { | ||||
|         return { | ||||
|             //表单数据 | ||||
|   | ||||
| @@ -47,7 +47,7 @@ | ||||
|             </div> | ||||
|             <div class="right-panel"> | ||||
|                 <el-button @click="this.dialog.save = { mode: 'add' }" icon="el-icon-plus" type="primary"></el-button> | ||||
|                 <na-button-bulk-del :api="$API.sys_dept.bulkDelete" :vue="this" /> | ||||
|                 <naButtonBulkDel :api="$API.sys_dept.bulkDelete" :vue="this" /> | ||||
|                 <el-dropdown v-show="this.selection.length > 0"> | ||||
|                     <el-button type="primary"> | ||||
|                         {{ $t('批量操作') }} | ||||
| @@ -87,7 +87,7 @@ | ||||
|                 stripe> | ||||
|                 <el-table-column type="selection" width="50" /> | ||||
|                 <el-table-column :label="$t('部门名称')" min-width="150" prop="name" sortable="custom" /> | ||||
|                 <na-col-id :label="$t('部门编号')" prop="id" sortable="custom" width="170" /> | ||||
|                 <naColId :label="$t('部门编号')" prop="id" sortable="custom" width="170" /> | ||||
|                 <el-table-column :label="$t('用户数量')" align="right" width="100"> | ||||
|                     <template #default="{ row }"> | ||||
|                         <el-link @click.native="dialog.save = { mode: 'view', row, tabId: 'user' }" | ||||
| @@ -102,16 +102,8 @@ | ||||
|                         <el-switch v-model="row.enabled" @change="changeSwitch($event, row)"></el-switch> | ||||
|                     </template> | ||||
|                 </el-table-column> | ||||
|                 <na-col-operation | ||||
|                     :buttons=" | ||||
|                         naColOperation.buttons.concat({ | ||||
|                             icon: 'el-icon-delete', | ||||
|                             confirm: true, | ||||
|                             title: '删除部门', | ||||
|                             click: this.rowDel, | ||||
|                             type: 'danger', | ||||
|                         }) | ||||
|                     " | ||||
|                 <naColOperation | ||||
|                     :buttons="naColOperation.buttons.concat(naColOperation.delButton('删除部门', $API.sys_dept.delete))" | ||||
|                     :vue="this" | ||||
|                     width="120" /> | ||||
|             </sc-table> | ||||
| @@ -229,15 +221,6 @@ export default { | ||||
|             }) | ||||
|             this.$refs.search.search() | ||||
|         }, | ||||
|         async rowDel(row) { | ||||
|             try { | ||||
|                 const res = await this.$API.sys_dept.delete.post({ id: row.id }) | ||||
|                 this.$message.success(this.$t('删除 {count} 项', { count: res.data })) | ||||
|             } catch { | ||||
|                 // | ||||
|             } | ||||
|             this.$refs.table.refresh() | ||||
|         }, | ||||
|         //重置 | ||||
|         onReset() { | ||||
|             Object.entries(this.$refs.selectFilter.selected).forEach(([key, _]) => (this.$refs.selectFilter.selected[key] = [''])) | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <template> | ||||
|     <sc-dialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close full-screen> | ||||
|     <scDialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close full-screen> | ||||
|         <div v-loading="loading"> | ||||
|             <el-tabs v-model="tabId" tab-position="top"> | ||||
|                 <el-tab-pane :label="$t('基本信息')"> | ||||
| @@ -31,13 +31,13 @@ | ||||
|                     <user v-if="tabId === 'user'" :dept-id="form.id"></user> | ||||
|                 </el-tab-pane> | ||||
|                 <el-tab-pane v-if="mode === 'view'" :label="$t('原始数据')"> | ||||
|                     <json-viewer | ||||
|                     <JsonViewer | ||||
|                         :expand-depth="5" | ||||
|                         :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'dark' : 'light'" | ||||
|                         :value="form" | ||||
|                         copyable | ||||
|                         expanded | ||||
|                         sort></json-viewer> | ||||
|                         sort></JsonViewer> | ||||
|                 </el-tab-pane> | ||||
|             </el-tabs> | ||||
|         </div> | ||||
| @@ -45,13 +45,13 @@ | ||||
|             <el-button @click="visible = false">{{ $t('取消') }}</el-button> | ||||
|             <el-button v-if="mode !== 'view'" :disabled="loading" :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button> | ||||
|         </template> | ||||
|     </sc-dialog> | ||||
|     </scDialog> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import { defineAsyncComponent } from 'vue' | ||||
|  | ||||
| const User = defineAsyncComponent(() => import('@/views/sys/user/index.vue')) | ||||
| const User = defineAsyncComponent(() => import('@/views/sys/user')) | ||||
| export default { | ||||
|     components: { User }, | ||||
|     data() { | ||||
|   | ||||
| @@ -50,7 +50,7 @@ | ||||
|                     @click="this.dialog.save = { mode: 'add', data: { catalogId: this.catalogId } }" | ||||
|                     icon="el-icon-plus" | ||||
|                     type="primary"></el-button> | ||||
|                 <na-button-bulk-del :api="$API.sys_dic.bulkDeleteContent" :vue="this" /> | ||||
|                 <naButtonBulkDel :api="$API.sys_dic.bulkDeleteContent" :vue="this" /> | ||||
|                 <el-dropdown v-show="this.selection.length > 0"> | ||||
|                     <el-button type="primary"> | ||||
|                         {{ $t('批量操作') }} | ||||
| @@ -90,7 +90,7 @@ | ||||
|                 row-key="id" | ||||
|                 stripe> | ||||
|                 <el-table-column type="selection" width="50" /> | ||||
|                 <na-col-id :label="$t('唯一编码')" prop="id" sortable="custom" width="170" /> | ||||
|                 <naColId :label="$t('唯一编码')" prop="id" sortable="custom" width="170" /> | ||||
|                 <el-table-column :label="$t('项名')" min-width="150" prop="key" sortable="custom" /> | ||||
|                 <el-table-column :label="$t('项值')" min-width="150" prop="value" sortable="custom" /> | ||||
|                 <el-table-column :label="$t('备注')" min-width="150" prop="summary" sortable="custom" /> | ||||
| @@ -99,16 +99,8 @@ | ||||
|                         <el-switch v-model="row.enabled" @change="changeSwitch($event, row)"></el-switch> | ||||
|                     </template> | ||||
|                 </el-table-column> | ||||
|                 <na-col-operation | ||||
|                     :buttons=" | ||||
|                         naColOperation.buttons.concat({ | ||||
|                             icon: 'el-icon-delete', | ||||
|                             confirm: true, | ||||
|                             title: '删除字典项', | ||||
|                             click: this.rowDel, | ||||
|                             type: 'danger', | ||||
|                         }) | ||||
|                     " | ||||
|                 <naColOperation | ||||
|                     :buttons="naColOperation.buttons.concat(naColOperation.delButton('删除字典项', $API.sys_dic.deleteContent))" | ||||
|                     :vue="this" | ||||
|                     width="120" /> | ||||
|             </sc-table> | ||||
| @@ -261,17 +253,6 @@ export default { | ||||
|  | ||||
|             await this.$refs.table.upData() | ||||
|         }, | ||||
|  | ||||
|         //删除 | ||||
|         async rowDel(row) { | ||||
|             try { | ||||
|                 const res = await this.$API.sys_dic.deleteContent.post({ id: row.id }) | ||||
|                 this.$message.success(this.$t('删除 {count} 项', { count: res.data })) | ||||
|             } catch { | ||||
|                 // | ||||
|             } | ||||
|             this.$refs.table.refresh() | ||||
|         }, | ||||
|     }, | ||||
|     mounted() { | ||||
|         if (this.keywords) { | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <template> | ||||
|     <sc-dialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close> | ||||
|     <scDialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close> | ||||
|         <div v-loading="loading"> | ||||
|             <el-tabs tab-position="top"> | ||||
|                 <el-tab-pane :label="$t('基本信息')"> | ||||
| @@ -19,13 +19,13 @@ | ||||
|                     </el-form> | ||||
|                 </el-tab-pane> | ||||
|                 <el-tab-pane v-if="mode === 'view'" :label="$t('原始数据')"> | ||||
|                     <json-viewer | ||||
|                     <JsonViewer | ||||
|                         :expand-depth="5" | ||||
|                         :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'dark' : 'light'" | ||||
|                         :value="form" | ||||
|                         copyable | ||||
|                         expanded | ||||
|                         sort></json-viewer> | ||||
|                         sort></JsonViewer> | ||||
|                 </el-tab-pane> | ||||
|             </el-tabs> | ||||
|         </div> | ||||
| @@ -33,7 +33,7 @@ | ||||
|             <el-button @click="visible = false">{{ $t('取消') }}</el-button> | ||||
|             <el-button v-if="mode !== 'view'" :disabled="loading" :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button> | ||||
|         </template> | ||||
|     </sc-dialog> | ||||
|     </scDialog> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <template> | ||||
|     <sc-dialog v-model="visible" :title="$t('批量修改')" @closed="$emit('closed')" destroy-on-close> | ||||
|     <scDialog v-model="visible" :title="$t('批量修改')" @closed="$emit('closed')" destroy-on-close> | ||||
|         <div v-loading="loading"> | ||||
|             <el-tabs tab-position="top"> | ||||
|                 <el-tab-pane :label="$t('基本信息')"> | ||||
| @@ -10,13 +10,13 @@ | ||||
|                     </el-form> | ||||
|                 </el-tab-pane> | ||||
|                 <el-tab-pane v-if="mode === 'view'" :label="$t('原始数据')"> | ||||
|                     <json-viewer | ||||
|                     <JsonViewer | ||||
|                         :expand-depth="5" | ||||
|                         :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'dark' : 'light'" | ||||
|                         :value="form" | ||||
|                         copyable | ||||
|                         expanded | ||||
|                         sort></json-viewer> | ||||
|                         sort></JsonViewer> | ||||
|                 </el-tab-pane> | ||||
|             </el-tabs> | ||||
|         </div> | ||||
| @@ -24,7 +24,7 @@ | ||||
|             <el-button @click="visible = false">{{ $t('取消') }}</el-button> | ||||
|             <el-button v-if="mode !== 'view'" :disabled="loading" :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button> | ||||
|         </template> | ||||
|     </sc-dialog> | ||||
|     </scDialog> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <template> | ||||
|     <sc-dialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close> | ||||
|     <scDialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @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> | ||||
| @@ -15,7 +15,7 @@ | ||||
|             <el-button @click="visible = false">{{ $t('取消') }}</el-button> | ||||
|             <el-button v-if="mode !== 'view'" :disabled="loading" :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button> | ||||
|         </template> | ||||
|     </sc-dialog> | ||||
|     </scDialog> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   | ||||
| @@ -64,7 +64,7 @@ | ||||
|                     @click="this.dialog.save = { mode: 'add', data: { catalogId: this.catalogId } }" | ||||
|                     icon="el-icon-plus" | ||||
|                     type="primary"></el-button> | ||||
|                 <na-button-bulk-del :api="$API.sys_doc.bulkDeleteContent" :vue="this" /> | ||||
|                 <naButtonBulkDel :api="$API.sys_doc.bulkDeleteContent" :vue="this" /> | ||||
|                 <el-dropdown v-show="this.selection.length > 0"> | ||||
|                     <el-button type="primary"> | ||||
|                         {{ $t('批量操作') }} | ||||
| @@ -101,9 +101,9 @@ | ||||
|                 row-key="id" | ||||
|                 stripe> | ||||
|                 <el-table-column type="selection" width="50" /> | ||||
|                 <na-col-id :label="$t('唯一编码')" prop="id" sortable="custom" width="170" /> | ||||
|                 <naColId :label="$t('唯一编码')" prop="id" sortable="custom" width="170" /> | ||||
|                 <el-table-column :label="$t('文档标题')" min-width="200" prop="title" sortable="custom" /> | ||||
|                 <na-col-indicator | ||||
|                 <naColIndicator | ||||
|                     :label="$t('档案可见性')" | ||||
|                     :options=" | ||||
|                         Object.entries(this.$GLOBAL.enums.archiveVisibilities).map((x) => { | ||||
| @@ -119,7 +119,7 @@ | ||||
|                         <el-switch v-model="row.enabled" @change="changeSwitch($event, row)"></el-switch> | ||||
|                     </template> | ||||
|                 </el-table-column> | ||||
|                 <na-col-operation | ||||
|                 <naColOperation | ||||
|                     :buttons="[ | ||||
|                         { | ||||
|                             icon: 'el-icon-view', | ||||
| @@ -138,13 +138,7 @@ | ||||
|                             click: share, | ||||
|                             title: '分享文档', | ||||
|                         }, | ||||
|                         { | ||||
|                             icon: 'el-icon-delete', | ||||
|                             confirm: true, | ||||
|                             title: '删除文档', | ||||
|                             click: this.rowDel, | ||||
|                             type: 'danger', | ||||
|                         }, | ||||
|                         naColOperation.delButton('删除文档', $API.sys_doc.deleteContent), | ||||
|                     ]" | ||||
|                     :vue="this" | ||||
|                     width="180" /> | ||||
| @@ -303,16 +297,6 @@ export default { | ||||
|             } | ||||
|             document.body.removeChild(textarea) | ||||
|         }, | ||||
|         //删除 | ||||
|         async rowDel(row) { | ||||
|             try { | ||||
|                 const res = await this.$API.sys_doc.deleteContent.post({ id: row.id }) | ||||
|                 this.$message.success(this.$t('删除 {count} 项', { count: res.data })) | ||||
|             } catch { | ||||
|                 // | ||||
|             } | ||||
|             this.$refs.table.refresh() | ||||
|         }, | ||||
|     }, | ||||
|     mounted() { | ||||
|         if (this.keywords) { | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <template> | ||||
|     <sc-dialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close full-screen> | ||||
|     <scDialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close full-screen> | ||||
|         <div v-loading="loading"> | ||||
|             <el-tabs tab-position="top"> | ||||
|                 <el-tab-pane :label="$t('基本信息')"> | ||||
| @@ -27,13 +27,13 @@ | ||||
|                     </el-form> | ||||
|                 </el-tab-pane> | ||||
|                 <el-tab-pane v-if="mode === 'view'" :label="$t('原始数据')"> | ||||
|                     <json-viewer | ||||
|                     <JsonViewer | ||||
|                         :expand-depth="5" | ||||
|                         :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'dark' : 'light'" | ||||
|                         :value="form" | ||||
|                         copyable | ||||
|                         expanded | ||||
|                         sort></json-viewer> | ||||
|                         sort></JsonViewer> | ||||
|                 </el-tab-pane> | ||||
|             </el-tabs> | ||||
|         </div> | ||||
| @@ -41,7 +41,7 @@ | ||||
|             <el-button @click="visible = false">{{ $t('取消') }}</el-button> | ||||
|             <el-button v-if="mode !== 'view'" :disabled="loading" :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button> | ||||
|         </template> | ||||
|     </sc-dialog> | ||||
|     </scDialog> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <template> | ||||
|     <sc-dialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close> | ||||
|     <scDialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @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> | ||||
| @@ -15,7 +15,7 @@ | ||||
|             <el-button @click="visible = false">{{ $t('取消') }}</el-button> | ||||
|             <el-button v-if="mode !== 'view'" :disabled="loading" :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button> | ||||
|         </template> | ||||
|     </sc-dialog> | ||||
|     </scDialog> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   | ||||
| @@ -84,7 +84,7 @@ | ||||
|             </div> | ||||
|             <div class="right-panel"> | ||||
|                 <el-button @click="this.dialog.save = { mode: 'add' }" icon="el-icon-plus" type="primary"></el-button> | ||||
|                 <na-button-bulk-del :api="$API.sys_job.bulkDelete" :vue="this" /> | ||||
|                 <naButtonBulkDel :api="$API.sys_job.bulkDelete" :vue="this" /> | ||||
|                 <el-dropdown v-show="this.selection.length > 0"> | ||||
|                     <el-button type="primary"> | ||||
|                         {{ $t('批量操作') }} | ||||
| @@ -143,7 +143,7 @@ | ||||
|                 row-key="id" | ||||
|                 stripe> | ||||
|                 <el-table-column type="selection" width="50" /> | ||||
|                 <na-col-id :label="$t('作业编号')" prop="id" sortable="custom" width="170" /> | ||||
|                 <naColId :label="$t('作业编号')" prop="id" sortable="custom" width="170" /> | ||||
|                 <el-table-column :label="$t('作业名称')" min-width="150" prop="jobName" show-overflow-tooltip sortable="custom" /> | ||||
|                 <el-table-column :label="$t('执行计划')" align="right" prop="executionCron" sortable="custom" width="150"> | ||||
|                     <template #default="{ row }"> | ||||
| @@ -151,7 +151,7 @@ | ||||
|                         <p>{{ row.executionCron }}</p> | ||||
|                     </template> | ||||
|                 </el-table-column> | ||||
|                 <na-col-indicator | ||||
|                 <naColIndicator | ||||
|                     :label="$t('作业状态')" | ||||
|                     :options=" | ||||
|                         Object.entries(this.$GLOBAL.enums.jobStatues).map((x) => { | ||||
| @@ -162,7 +162,7 @@ | ||||
|                     prop="status" | ||||
|                     sortable="custom" | ||||
|                     width="100" /> | ||||
|                 <na-col-indicator | ||||
|                 <naColIndicator | ||||
|                     :label="$t('请求方式')" | ||||
|                     :options=" | ||||
|                         Object.entries(this.$GLOBAL.enums.httpMethods).map((x) => { | ||||
| @@ -206,7 +206,7 @@ | ||||
|                         <el-switch v-model="row.enabled" @change="changeSwitch($event, row)"></el-switch> | ||||
|                     </template> | ||||
|                 </el-table-column> | ||||
|                 <na-col-operation | ||||
|                 <naColOperation | ||||
|                     :buttons=" | ||||
|                         naColOperation.buttons.concat( | ||||
|                             { | ||||
| @@ -220,13 +220,7 @@ | ||||
|                                 title: '复制作业', | ||||
|                                 click: copyJob, | ||||
|                             }, | ||||
|                             { | ||||
|                                 icon: 'el-icon-delete', | ||||
|                                 confirm: true, | ||||
|                                 title: '删除作业', | ||||
|                                 click: this.rowDel, | ||||
|                                 type: 'danger', | ||||
|                             }, | ||||
|                             naColOperation.delButton('删除作业', $API.sys_job.delete), | ||||
|                         ) | ||||
|                     " | ||||
|                     :vue="this" | ||||
| @@ -247,7 +241,7 @@ | ||||
| import { defineAsyncComponent, h } from 'vue' | ||||
| import table from '@/config/table' | ||||
| import naColOperation from '@/config/naColOperation' | ||||
| import naIndicator from '@/components/naIndicator/index.vue' | ||||
| import naIndicator from '@/components/naIndicator' | ||||
|  | ||||
| const saveDialog = defineAsyncComponent(() => import('./save.vue')) | ||||
| export default { | ||||
| @@ -396,15 +390,6 @@ export default { | ||||
|             } catch {} | ||||
|             this.$refs.table.refresh() | ||||
|         }, | ||||
|         async rowDel(row) { | ||||
|             try { | ||||
|                 const res = await this.$API.sys_job.delete.post({ id: row.id }) | ||||
|                 this.$message.success(this.$t('删除 {count} 项', { count: res.data })) | ||||
|             } catch { | ||||
|                 // | ||||
|             } | ||||
|             this.$refs.table.refresh() | ||||
|         }, | ||||
|         //重置 | ||||
|         onReset() { | ||||
|             Object.entries(this.$refs.selectFilter.selected).forEach(([key, _]) => (this.$refs.selectFilter.selected[key] = [''])) | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <template> | ||||
|     <sc-dialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close full-screen> | ||||
|     <scDialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close full-screen> | ||||
|         <el-tabs v-model="tabId" tab-position="top"> | ||||
|             <el-tab-pane :label="$t('基本信息')"> | ||||
|                 <el-form | ||||
| @@ -14,7 +14,7 @@ | ||||
|                         <el-input v-model="form.id" clearable /> | ||||
|                     </el-form-item> | ||||
|                     <el-form-item :label="$t('执行计划')" prop="executionCron"> | ||||
|                         <sc-cron v-model="form.executionCron" class="font-monospace" clearable /> | ||||
|                         <scCron v-model="form.executionCron" class="font-monospace" clearable /> | ||||
|                     </el-form-item> | ||||
|                     <el-form-item :label="$t('请求方法')" prop="httpMethod"> | ||||
|                         <el-select v-model="form.httpMethod" clearable filterable> | ||||
| @@ -40,7 +40,7 @@ | ||||
|                         <el-input v-model="form.nextTimeId" clearable /> | ||||
|                     </el-form-item> | ||||
|                     <el-form-item :label="$t('请求头')" prop="requestHeader"> | ||||
|                         <v-ace-editor | ||||
|                         <VAceEditor | ||||
|                             v-model:value="form.requestHeader" | ||||
|                             :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'github_dark' : 'github'" | ||||
|                             lang="json" | ||||
| @@ -48,7 +48,7 @@ | ||||
|                         <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 | ||||
|                         <VAceEditor | ||||
|                             v-model:value="form.requestBody" | ||||
|                             :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'github_dark' : 'github'" | ||||
|                             lang="json" | ||||
| @@ -81,7 +81,7 @@ | ||||
|                         <el-input v-model="form.userId" clearable /> | ||||
|                     </el-form-item> | ||||
|                     <el-form-item v-else :label="$t('执行用户')" prop="user"> | ||||
|                         <na-user-select v-model="form.user"></na-user-select> | ||||
|                         <naUserSelect v-model="form.user"></naUserSelect> | ||||
|                     </el-form-item> | ||||
|                     <el-form-item v-if="mode === 'view'" :label="$t('创建时间')" prop="createdTime"> | ||||
|                         <el-input v-model="form.createdTime" clearable /> | ||||
| @@ -110,13 +110,13 @@ | ||||
|                 <record v-if="tabId === 'record'" :job-id="form.id" /> | ||||
|             </el-tab-pane> | ||||
|             <el-tab-pane v-if="mode === 'view'" :label="$t('原始数据')"> | ||||
|                 <json-viewer | ||||
|                 <JsonViewer | ||||
|                     :expand-depth="5" | ||||
|                     :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'dark' : 'light'" | ||||
|                     :value="form" | ||||
|                     copyable | ||||
|                     expanded | ||||
|                     sort></json-viewer> | ||||
|                     sort></JsonViewer> | ||||
|             </el-tab-pane> | ||||
|         </el-tabs> | ||||
|  | ||||
| @@ -124,16 +124,18 @@ | ||||
|             <el-button @click="visible = false">{{ $t('取消') }}</el-button> | ||||
|             <el-button v-if="mode !== 'view'" :disabled="loading" :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button> | ||||
|         </template> | ||||
|     </sc-dialog> | ||||
|     </scDialog> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import { defineAsyncComponent } from 'vue' | ||||
| import vkbeautify from 'vkbeautify/index' | ||||
|  | ||||
| const Record = defineAsyncComponent(() => import('@/views/sys/job/record/index.vue')) | ||||
| const Record = defineAsyncComponent(() => import('@/views/sys/job/record')) | ||||
| const naUserSelect = defineAsyncComponent(() => import('@/components/naUserSelect')) | ||||
| const scCron = defineAsyncComponent(() => import('@/components/scCron')) | ||||
| export default { | ||||
|     components: { Record }, | ||||
|     components: { Record, naUserSelect, scCron }, | ||||
|     data() { | ||||
|         return { | ||||
|             //表单数据 | ||||
|   | ||||
| @@ -14,8 +14,8 @@ | ||||
|  | ||||
| <script> | ||||
| import { defineAsyncComponent } from 'vue' | ||||
| const log = defineAsyncComponent(() => import('@/views/sys/job/record/index.vue')) | ||||
| const all = defineAsyncComponent(() => import('@/views/sys/job/all/index.vue')) | ||||
| const log = defineAsyncComponent(() => import('@/views/sys/job/record')) | ||||
| const all = defineAsyncComponent(() => import('@/views/sys/job/all')) | ||||
|  | ||||
| export default { | ||||
|     components: { all, log }, | ||||
|   | ||||
| @@ -110,7 +110,7 @@ | ||||
|                 remote-sort | ||||
|                 row-key="id" | ||||
|                 stripe> | ||||
|                 <na-col-id :label="$t('唯一编码')" prop="id" sortable="custom" width="170" /> | ||||
|                 <naColId :label="$t('唯一编码')" prop="id" sortable="custom" width="170" /> | ||||
|                 <el-table-column :label="$t('响应状态码')" prop="httpStatusCode" sortable="custom" width="200"> | ||||
|                     <template #default="{ row }"> | ||||
|                         <p> | ||||
| @@ -155,7 +155,7 @@ | ||||
|                     </template> | ||||
|                 </el-table-column> | ||||
|                 <el-table-column :label="$t('响应体')" min-width="300" prop="responseBody" show-overflow-tooltip sortable="custom" /> | ||||
|                 <na-col-operation :buttons="[naColOperation.buttons[0]]" :vue="this" width="50" /> | ||||
|                 <naColOperation :buttons="[naColOperation.buttons[0]]" :vue="this" width="50" /> | ||||
|             </sc-table> | ||||
|         </el-main> | ||||
|     </el-container> | ||||
| @@ -179,7 +179,7 @@ | ||||
| import { defineAsyncComponent } from 'vue' | ||||
| import table from '@/config/table' | ||||
| import naColOperation from '@/config/naColOperation' | ||||
| import naIndicator from '@/components/naIndicator/index.vue' | ||||
| import naIndicator from '@/components/naIndicator' | ||||
|  | ||||
| const saveDialog = defineAsyncComponent(() => import('./save.vue')) | ||||
| const jobDialog = defineAsyncComponent(() => import('@/views/sys/job/all/save.vue')) | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <template> | ||||
|     <sc-dialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close full-screen> | ||||
|     <scDialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close full-screen> | ||||
|         <el-form | ||||
|             v-loading="loading" | ||||
|             :disabled="mode === 'view'" | ||||
| @@ -11,7 +11,7 @@ | ||||
|             <el-tabs tab-position="top"> | ||||
|                 <el-tab-pane :label="$t('基本信息')"> | ||||
|                     <el-row :gutter="10"> | ||||
|                         <el-col :lg="8"> | ||||
|                         <el-col :lg="6"> | ||||
|                             <el-form-item :label="$t('唯一编码')" prop="id"> | ||||
|                                 <el-input v-model="form.id" clearable /> | ||||
|                             </el-form-item> | ||||
| @@ -28,7 +28,7 @@ | ||||
|                                 <el-input v-model="form.jobId" clearable /> | ||||
|                             </el-form-item> | ||||
|                             <el-form-item :label="$t('请求的网络地址')" prop="requestUrl"> | ||||
|                                 <el-input v-model="form.requestUrl" clearable /> | ||||
|                                 <el-input v-model="form.requestUrl" clearable type="textarea" /> | ||||
|                             </el-form-item> | ||||
|                             <el-form-item :label="$t('执行时间编号')" prop="timeId"> | ||||
|                                 <el-input v-model="form.timeId" clearable /> | ||||
| @@ -37,71 +37,86 @@ | ||||
|                                 <el-input v-model="form.createdTime" clearable /> | ||||
|                             </el-form-item> | ||||
|                         </el-col> | ||||
|                         <el-col :lg="16"> | ||||
|                             <el-form-item v-if="form.requestHeader" :label="$t('请求头')" prop="requestHeader"> | ||||
|                                 <json-viewer | ||||
|                                     v-if="mode === 'view'" | ||||
|                                     :expand-depth="1" | ||||
|                                     :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'dark' : 'light'" | ||||
|                                     :value="JSON.parse(form.requestHeader)" | ||||
|                                     copyable | ||||
|                                     expanded | ||||
|                                     sort></json-viewer> | ||||
|                                 <el-input v-else v-model="form.requestHeader" clearable rows="5" type="textarea" /> | ||||
|                             </el-form-item> | ||||
|                         <el-col :lg="col2Width"> | ||||
|                             <el-form-item v-if="form.requestBody" :label="$t('请求体')" prop="requestBody"> | ||||
|                                 <json-viewer | ||||
|                                 <JsonViewer | ||||
|                                     v-if="mode === 'view'" | ||||
|                                     :expand-depth="5" | ||||
|                                     :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'dark' : 'light'" | ||||
|                                     :value="JSON.parse(form.requestBody)" | ||||
|                                     class="w100p children-nopadding" | ||||
|                                     copyable | ||||
|                                     expanded | ||||
|                                     sort></json-viewer> | ||||
|                                     sort></JsonViewer> | ||||
|                                 <el-input v-else v-model="form.requestBody" clearable rows="5" type="textarea" /> | ||||
|                             </el-form-item> | ||||
|  | ||||
|                             <el-form-item v-if="form.responseHeader" :label="$t('响应头')" prop="responseHeader"> | ||||
|                                 <json-viewer | ||||
|                                     v-if="mode === 'view'" | ||||
|                                     :expand-depth="1" | ||||
|                                     :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'dark' : 'light'" | ||||
|                                     :value="JSON.parse(form.responseHeader)" | ||||
|                                     copyable | ||||
|                                     expanded | ||||
|                                     sort></json-viewer> | ||||
|                                 <el-input v-else v-model="form.responseHeader" clearable rows="5" type="textarea" /> | ||||
|                             </el-form-item> | ||||
|                             <el-form-item v-if="form.responseBody" :label="$t('响应体')" prop="responseBody"> | ||||
|                                 <json-viewer | ||||
|                                 <JsonViewer | ||||
|                                     v-if="mode === 'view'" | ||||
|                                     :expand-depth="5" | ||||
|                                     :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'dark' : 'light'" | ||||
|                                     :value="JSON.parse(form.responseBody)" | ||||
|                                     class="w100p children-nopadding" | ||||
|                                     copyable | ||||
|                                     expanded | ||||
|                                     sort> | ||||
|                                 </json-viewer> | ||||
|                                 </JsonViewer> | ||||
|                                 <el-input v-else v-model="form.responseBody" clearable rows="5" type="textarea" /> | ||||
|                             </el-form-item> | ||||
|                             <el-form-item v-if="form.requestHeader" :label="$t('请求头')" prop="requestHeader"> | ||||
|                                 <JsonViewer | ||||
|                                     v-if="mode === 'view'" | ||||
|                                     :expand-depth="1" | ||||
|                                     :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'dark' : 'light'" | ||||
|                                     :value="JSON.parse(form.requestHeader)" | ||||
|                                     class="w100p children-nopadding" | ||||
|                                     copyable | ||||
|                                     expanded | ||||
|                                     sort></JsonViewer> | ||||
|                                 <el-input v-else v-model="form.requestHeader" clearable rows="5" type="textarea" /> | ||||
|                             </el-form-item> | ||||
|                             <el-form-item v-if="form.responseHeader" :label="$t('响应头')" prop="responseHeader"> | ||||
|                                 <JsonViewer | ||||
|                                     v-if="mode === 'view'" | ||||
|                                     :expand-depth="1" | ||||
|                                     :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'dark' : 'light'" | ||||
|                                     :value="JSON.parse(form.responseHeader)" | ||||
|                                     class="w100p children-nopadding" | ||||
|                                     copyable | ||||
|                                     expanded | ||||
|                                     sort></JsonViewer> | ||||
|                                 <el-input v-else v-model="form.responseHeader" clearable rows="5" type="textarea" /> | ||||
|                             </el-form-item> | ||||
|                         </el-col> | ||||
|  | ||||
|                         <el-col v-if="this.esData" :lg="9"> | ||||
|                             <JsonViewer | ||||
|                                 v-if="mode === 'view'" | ||||
|                                 :expand-depth="1" | ||||
|                                 :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'dark' : 'light'" | ||||
|                                 :value="this.esData" | ||||
|                                 class="children-nopadding" | ||||
|                                 copyable | ||||
|                                 expanded | ||||
|                                 sort></JsonViewer> | ||||
|                         </el-col> | ||||
|                     </el-row> | ||||
|                 </el-tab-pane> | ||||
|                 <el-tab-pane v-if="mode === 'view'" :label="$t('原始数据')"> | ||||
|                     <json-viewer | ||||
|                     <JsonViewer | ||||
|                         :expand-depth="5" | ||||
|                         :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'dark' : 'light'" | ||||
|                         :value="form" | ||||
|                         copyable | ||||
|                         expanded | ||||
|                         sort></json-viewer> | ||||
|                         sort></JsonViewer> | ||||
|                 </el-tab-pane> | ||||
|             </el-tabs> | ||||
|         </el-form> | ||||
|         <template #footer> | ||||
|             <el-button @click="visible = false">{{ $t('取消') }}</el-button> | ||||
|         </template> | ||||
|     </sc-dialog> | ||||
|     </scDialog> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -109,6 +124,8 @@ export default { | ||||
|     components: {}, | ||||
|     data() { | ||||
|         return { | ||||
|             col2Width: 18, | ||||
|             esData: null, | ||||
|             //表单数据 | ||||
|             form: {}, | ||||
|             loading: true, | ||||
| @@ -131,8 +148,45 @@ export default { | ||||
|             this.loading = true | ||||
|             this.mode = data.mode | ||||
|             if (data.row?.id) { | ||||
|                 const res = await this.$API.sys_job.getRecord.post({ id: data.row.id }) | ||||
|                 let res = await this.$API.sys_job.getRecord.post({ id: data.row.id }) | ||||
|                 Object.assign(this.form, res.data) | ||||
|                 const traceId = /"traceId":"(.+?)"/.exec(this.form.responseBody) | ||||
|                 if (traceId && traceId[1]) { | ||||
|                     res = await this.$API.adm_tools.queryEsLog.post({ | ||||
|                         query: { | ||||
|                             bool: { | ||||
|                                 must: [ | ||||
|                                     { | ||||
|                                         range: { | ||||
|                                             '@timestamp': { | ||||
|                                                 gt: new Date(this.form.createdTime).getTime() - 1000 * 60 * 60, | ||||
|                                                 lt: new Date(this.form.createdTime).getTime() + 1000 * 60 * 60, | ||||
|                                             }, | ||||
|                                         }, | ||||
|                                     }, | ||||
|                                     { | ||||
|                                         match_phrase: { | ||||
|                                             log_source: 'NetAdmin.SysComponent.Host.Utils.RequestLogger', | ||||
|                                         }, | ||||
|                                     }, | ||||
|                                     { | ||||
|                                         match_phrase: { | ||||
|                                             log_message: traceId[1], | ||||
|                                         }, | ||||
|                                     }, | ||||
|                                 ], | ||||
|                             }, | ||||
|                         }, | ||||
|                         size: 1000, | ||||
|                         sort: [ | ||||
|                             { | ||||
|                                 '@timestamp': 'desc', | ||||
|                             }, | ||||
|                         ], | ||||
|                     }) | ||||
|                     this.esData = res.data.hits.hits[0]._source | ||||
|                     this.col2Width = 9 | ||||
|                 } | ||||
|             } | ||||
|             this.loading = false | ||||
|             return this | ||||
|   | ||||
| @@ -105,7 +105,7 @@ | ||||
|                 remote-sort | ||||
|                 row-key="id" | ||||
|                 stripe> | ||||
|                 <na-col-id label="日志编号" prop="id" sortable="custom" width="170" /> | ||||
|                 <naColId label="日志编号" prop="id" sortable="custom" width="170" /> | ||||
|                 <el-table-column :label="$t('结果')" align="center" prop="httpStatusCode" sortable="custom" width="100"> | ||||
|                     <template #default="{ row }"> | ||||
|                         <sc-status-indicator :type="row.httpStatusCode === 200 ? 'success' : 'danger'" /> | ||||
| @@ -123,7 +123,7 @@ | ||||
|                 </el-table-column> | ||||
|                 <el-table-column :label="$t('操作系统')" align="center" prop="os" width="150" /> | ||||
|                 <el-table-column :label="$t('用户代理')" min-width="150" prop="createdUserAgent" show-overflow-tooltip sortable="custom" /> | ||||
|                 <na-col-operation | ||||
|                 <naColOperation | ||||
|                     :buttons="[ | ||||
|                         { | ||||
|                             icon: 'el-icon-view', | ||||
| @@ -141,7 +141,7 @@ | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import naInfo from '@/components/naInfo/index.vue' | ||||
| import naInfo from '@/components/naInfo' | ||||
| import http from '@/utils/request' | ||||
|  | ||||
| export default { | ||||
|   | ||||
| @@ -131,7 +131,7 @@ | ||||
|                 remote-sort | ||||
|                 row-key="id" | ||||
|                 stripe> | ||||
|                 <na-col-id label="日志编号" prop="id" sortable="custom" width="170" /> | ||||
|                 <naColId label="日志编号" prop="id" sortable="custom" width="170" /> | ||||
|                 <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'" /> | ||||
| @@ -196,7 +196,7 @@ | ||||
|                         </template> | ||||
|                     </template> | ||||
|                 </el-table-column> | ||||
|                 <na-col-operation | ||||
|                 <naColOperation | ||||
|                     :buttons="[ | ||||
|                         { | ||||
|                             icon: 'el-icon-view', | ||||
| @@ -223,7 +223,7 @@ | ||||
| import { defineAsyncComponent } from 'vue' | ||||
| import http from '@/utils/request' | ||||
| const saveDialog = defineAsyncComponent(() => import('@/views/sys/user/save.vue')) | ||||
| import naInfo from '@/components/naInfo/index.vue' | ||||
| import naInfo from '@/components/naInfo' | ||||
|  | ||||
| export default { | ||||
|     components: { | ||||
|   | ||||
| @@ -52,7 +52,7 @@ | ||||
|             </div> | ||||
|             <div class="right-panel"> | ||||
|                 <el-button @click="this.dialog.save = { mode: 'add' }" icon="el-icon-plus" type="primary"></el-button> | ||||
|                 <na-button-bulk-del :api="$API.sys_sitemsg.bulkDelete" :vue="this" /> | ||||
|                 <naButtonBulkDel :api="$API.sys_sitemsg.bulkDelete" :vue="this" /> | ||||
|             </div> | ||||
|         </el-header> | ||||
|         <el-main class="nopadding"> | ||||
| @@ -75,9 +75,9 @@ | ||||
|                 row-key="id" | ||||
|                 stripe> | ||||
|                 <el-table-column type="selection" width="50" /> | ||||
|                 <na-col-id :label="$t('消息编号')" prop="id" sortable="custom" width="170" /> | ||||
|                 <na-col-avatar :label="$t('用户名')" min-width="100" prop="createdUserName" /> | ||||
|                 <na-col-indicator | ||||
|                 <naColId :label="$t('消息编号')" prop="id" sortable="custom" width="170" /> | ||||
|                 <naColAvatar :label="$t('用户名')" min-width="100" prop="createdUserName" /> | ||||
|                 <naColIndicator | ||||
|                     :label="$t('消息类型')" | ||||
|                     :options=" | ||||
|                         Object.entries(this.$GLOBAL.enums.siteMsgTypes).map((x) => { | ||||
| @@ -91,16 +91,8 @@ | ||||
|                 <el-table-column :label="$t('消息主题')" min-width="200" prop="title" show-overflow-tooltip sortable="custom" /> | ||||
|                 <el-table-column :label="$t('消息摘要')" min-width="400" prop="summary" show-overflow-tooltip sortable="custom" /> | ||||
|  | ||||
|                 <na-col-operation | ||||
|                     :buttons=" | ||||
|                         naColOperation.buttons.concat({ | ||||
|                             icon: 'el-icon-delete', | ||||
|                             confirm: true, | ||||
|                             title: '删除消息', | ||||
|                             click: this.rowDel, | ||||
|                             type: 'danger', | ||||
|                         }) | ||||
|                     " | ||||
|                 <naColOperation | ||||
|                     :buttons="naColOperation.buttons.concat(naColOperation.delButton('删除消息', $API.sys_sitemsg.delete))" | ||||
|                     :vue="this" | ||||
|                     width="120" /> | ||||
|             </sc-table> | ||||
| @@ -119,11 +111,12 @@ | ||||
| import { defineAsyncComponent } from 'vue' | ||||
| import table from '@/config/table' | ||||
| import naColOperation from '@/config/naColOperation' | ||||
|  | ||||
| const naColAvatar = defineAsyncComponent(() => import('@/components/naColAvatar')) | ||||
| const saveDialog = defineAsyncComponent(() => import('./save.vue')) | ||||
| export default { | ||||
|     components: { | ||||
|         saveDialog, | ||||
|         naColAvatar, | ||||
|     }, | ||||
|     computed: { | ||||
|         naColOperation() { | ||||
| @@ -172,15 +165,6 @@ export default { | ||||
|             }) | ||||
|             this.$refs.search.search() | ||||
|         }, | ||||
|         async rowDel(row) { | ||||
|             try { | ||||
|                 const res = await this.$API.sys_sitemsg.delete.post({ id: row.id }) | ||||
|                 this.$message.success(this.$t('删除 {count} 项', { count: res.data })) | ||||
|             } catch { | ||||
|                 // | ||||
|             } | ||||
|             this.$refs.table.refresh() | ||||
|         }, | ||||
|         async onSearch(form) { | ||||
|             if (Array.isArray(form.dy.createdTime)) { | ||||
|                 this.query.dynamicFilter.filters.push({ | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <template> | ||||
|     <sc-dialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close full-screen> | ||||
|     <scDialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close full-screen> | ||||
|         <el-form | ||||
|             v-loading="loading" | ||||
|             :disabled="mode === 'view'" | ||||
| @@ -29,7 +29,7 @@ | ||||
|                     </el-form-item> | ||||
|  | ||||
|                     <el-form-item :label="$t('送至角色')" prop="roleIds"> | ||||
|                         <sc-select | ||||
|                         <scSelect | ||||
|                             v-if="!this.loading" | ||||
|                             v-model="form.roleIds" | ||||
|                             :config="{ props: { label: 'name', value: 'id' } }" | ||||
| @@ -40,10 +40,10 @@ | ||||
|                             multiple /> | ||||
|                     </el-form-item> | ||||
|                     <el-form-item :label="$t('送至部门')" prop="deptIds"> | ||||
|                         <na-dept v-model="form.deptIds" :multiple="true" class="w100p"></na-dept> | ||||
|                         <naDept v-model="form.deptIds" :multiple="true" class="w100p"></naDept> | ||||
|                     </el-form-item> | ||||
|                     <el-form-item :label="$t('送至用户')" prop="userIds"> | ||||
|                         <na-user-select v-model="form.userIds" :multiple="true" class="w100p"></na-user-select> | ||||
|                         <naUserSelect v-model="form.userIds" :multiple="true" class="w100p"></naUserSelect> | ||||
|                     </el-form-item> | ||||
|                     <el-form-item v-if="mode === 'view'" :label="$t('创建时间')" prop="createdTime"> | ||||
|                         <el-input v-model="form.createdTime" clearable /> | ||||
| @@ -54,13 +54,13 @@ | ||||
|                 </el-tab-pane> | ||||
|  | ||||
|                 <el-tab-pane v-if="mode === 'view'" :label="$t('原始数据')"> | ||||
|                     <json-viewer | ||||
|                     <JsonViewer | ||||
|                         :expand-depth="5" | ||||
|                         :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'dark' : 'light'" | ||||
|                         :value="form" | ||||
|                         copyable | ||||
|                         expanded | ||||
|                         sort></json-viewer> | ||||
|                         sort></JsonViewer> | ||||
|                 </el-tab-pane> | ||||
|             </el-tabs> | ||||
|         </el-form> | ||||
| @@ -68,17 +68,23 @@ | ||||
|             <el-button @click="visible = false">{{ $t('取消') }}</el-button> | ||||
|             <el-button v-if="mode !== 'view'" :disabled="loading" :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button> | ||||
|         </template> | ||||
|     </sc-dialog> | ||||
|     </scDialog> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import { AiEditor } from 'aieditor' | ||||
| import 'aieditor/dist/style.css' | ||||
| import sysConfig from '../../../config' | ||||
|  | ||||
| import { defineAsyncComponent } from 'vue' | ||||
| const naDept = defineAsyncComponent(() => import('@/components/naDept')) | ||||
| const naUserSelect = defineAsyncComponent(() => import('@/components/naUserSelect')) | ||||
| const scSelect = defineAsyncComponent(() => import('@/components/scSelect')) | ||||
| export default { | ||||
|     components: {}, | ||||
|     emits: ['success', 'closed'], | ||||
|     components: { | ||||
|         naDept, | ||||
|         naUserSelect, | ||||
|         scSelect, | ||||
|     }, | ||||
|     data() { | ||||
|         return { | ||||
|             //表单数据 | ||||
|   | ||||
| @@ -95,7 +95,7 @@ | ||||
|             </div> | ||||
|             <div class="right-panel"> | ||||
|                 <el-button @click="this.dialog.save = { mode: 'add' }" icon="el-icon-plus" type="primary"></el-button> | ||||
|                 <na-button-bulk-del :api="$API.sys_role.bulkDelete" :vue="this" /> | ||||
|                 <naButtonBulkDel :api="$API.sys_role.bulkDelete" :vue="this" /> | ||||
|                 <el-dropdown v-show="this.selection.length > 0"> | ||||
|                     <el-button type="primary"> | ||||
|                         {{ $t('批量操作') }} | ||||
| @@ -132,7 +132,7 @@ | ||||
|                 row-key="id" | ||||
|                 stripe> | ||||
|                 <el-table-column type="selection" width="50" /> | ||||
|                 <na-col-id :label="$t('角色编号')" prop="id" sortable="custom" width="170" /> | ||||
|                 <naColId :label="$t('角色编号')" prop="id" sortable="custom" width="170" /> | ||||
|                 <el-table-column :label="$t('角色名称')" min-width="150" prop="name" sortable="custom" /> | ||||
|                 <el-table-column :label="$t('用户数量')" align="right" width="100"> | ||||
|                     <template #default="{ row }"> | ||||
| @@ -147,7 +147,7 @@ | ||||
|                         <el-switch v-model="row.ignorePermissionControl" @change="changeIgnorePermissionControl($event, row)"></el-switch> | ||||
|                     </template> | ||||
|                 </el-table-column> | ||||
|                 <na-col-indicator | ||||
|                 <naColIndicator | ||||
|                     :label="$t('数据范围')" | ||||
|                     :options=" | ||||
|                         Object.entries(this.$GLOBAL.enums.dataScopes).map((x) => { | ||||
| @@ -158,7 +158,7 @@ | ||||
|                     prop="dataScope" | ||||
|                     sortable="custom" | ||||
|                     width="120"> | ||||
|                 </na-col-indicator> | ||||
|                 </naColIndicator> | ||||
|  | ||||
|                 <el-table-column :label="$t('显示仪表板')" align="center" prop="displayDashboard" sortable="custom" width="120"> | ||||
|                     <template #default="{ row }"> | ||||
| @@ -170,7 +170,7 @@ | ||||
|                         <el-switch v-model="row.enabled" @change="changeEnabled($event, row)"></el-switch> | ||||
|                     </template> | ||||
|                 </el-table-column> | ||||
|                 <na-col-operation | ||||
|                 <naColOperation | ||||
|                     :buttons=" | ||||
|                         naColOperation.buttons.concat( | ||||
|                             { | ||||
| @@ -179,13 +179,7 @@ | ||||
|                                 title: '复制角色', | ||||
|                                 click: copyRole, | ||||
|                             }, | ||||
|                             { | ||||
|                                 icon: 'el-icon-delete', | ||||
|                                 confirm: true, | ||||
|                                 title: '删除角色', | ||||
|                                 click: this.rowDel, | ||||
|                                 type: 'danger', | ||||
|                             }, | ||||
|                             naColOperation.delButton('删除角色', $API.sys_role.delete), | ||||
|                         ) | ||||
|                     " | ||||
|                     :vue="this" | ||||
| @@ -350,15 +344,6 @@ export default { | ||||
|             }) | ||||
|             this.$refs.search.search() | ||||
|         }, | ||||
|         async rowDel(row) { | ||||
|             try { | ||||
|                 const res = await this.$API.sys_role.delete.post({ id: row.id }) | ||||
|                 this.$message.success(this.$t('删除 {count} 项', { count: res.data })) | ||||
|             } catch { | ||||
|                 // | ||||
|             } | ||||
|             this.$refs.table.refresh() | ||||
|         }, | ||||
|         //重置 | ||||
|         onReset() { | ||||
|             Object.entries(this.$refs.selectFilter.selected).forEach(([key, _]) => (this.$refs.selectFilter.selected[key] = [''])) | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <template> | ||||
|     <sc-dialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close full-screen> | ||||
|     <scDialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close full-screen> | ||||
|         <div v-loading="loading"> | ||||
|             <el-tabs v-model="tabId" tab-position="top"> | ||||
|                 <el-tab-pane :label="$t('基本信息')"> | ||||
| @@ -74,7 +74,7 @@ | ||||
|                             </el-radio-group> | ||||
|                         </el-form-item> | ||||
|                         <el-form-item v-if="form.displayDashboard" :label="$t('仪表板布局')"> | ||||
|                             <v-ace-editor | ||||
|                             <VAceEditor | ||||
|                                 v-model:value="form.dashboardLayout" | ||||
|                                 :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'github_dark' : 'github'" | ||||
|                                 lang="json" | ||||
| @@ -89,13 +89,13 @@ | ||||
|                     <user v-if="tabId === 'user'" :role-id="form.id"></user> | ||||
|                 </el-tab-pane> | ||||
|                 <el-tab-pane v-if="mode === 'view'" :label="$t('原始数据')"> | ||||
|                     <json-viewer | ||||
|                     <JsonViewer | ||||
|                         :expand-depth="5" | ||||
|                         :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'dark' : 'light'" | ||||
|                         :value="form" | ||||
|                         copyable | ||||
|                         expanded | ||||
|                         sort></json-viewer> | ||||
|                         sort></JsonViewer> | ||||
|                 </el-tab-pane> | ||||
|             </el-tabs> | ||||
|         </div> | ||||
| @@ -103,7 +103,7 @@ | ||||
|             <el-button @click="visible = false">{{ $t('取消') }}</el-button> | ||||
|             <el-button v-if="mode !== 'view'" :disabled="loading" :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button> | ||||
|         </template> | ||||
|     </sc-dialog> | ||||
|     </scDialog> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -111,7 +111,7 @@ import { defineAsyncComponent } from 'vue' | ||||
| import vkbeautify from 'vkbeautify/index' | ||||
| import config from '@/config/index' | ||||
|  | ||||
| const User = defineAsyncComponent(() => import('@/views/sys/user/index.vue')) | ||||
| const User = defineAsyncComponent(() => import('@/views/sys/user')) | ||||
| export default { | ||||
|     components: { User }, | ||||
|     created() {}, | ||||
|   | ||||
| @@ -111,21 +111,21 @@ | ||||
|                         row-key="id" | ||||
|                         stripe> | ||||
|                         <el-table-column type="selection" width="50" /> | ||||
|                         <na-col-id :label="$t('用户编号')" prop="id" sortable="custom" width="170" /> | ||||
|                         <na-col-avatar :label="$t('用户名')" prop="userName" width="170" /> | ||||
|                         <naColId :label="$t('用户编号')" prop="id" sortable="custom" width="170" /> | ||||
|                         <naColAvatar :label="$t('用户名')" prop="userName" width="170" /> | ||||
|                         <el-table-column :label="$t('手机号 / 邮箱')" align="right" prop="mobile" sortable="custom" width="250"> | ||||
|                             <template #default="{ row }"> | ||||
|                                 <p>{{ row.mobile }}</p> | ||||
|                                 <p>{{ row.email }}</p> | ||||
|                             </template> | ||||
|                         </el-table-column> | ||||
|                         <na-col-tags | ||||
|                         <naColTags | ||||
|                             :label="$t('所属部门')" | ||||
|                             @click="(item) => (this.dialog.deptSave = { row: item, mode: 'view' })" | ||||
|                             field="name" | ||||
|                             prop="dept" | ||||
|                             width="120" /> | ||||
|                         <na-col-tags | ||||
|                         <naColTags | ||||
|                             :label="$t('所属角色')" | ||||
|                             @click="(item) => (this.dialog.roleSave = { row: item, mode: 'view' })" | ||||
|                             field="name" | ||||
| @@ -141,7 +141,7 @@ | ||||
|                                 <el-switch v-model="row.enabled" @change="changeSwitch($event, row)"></el-switch> | ||||
|                             </template> | ||||
|                         </el-table-column> | ||||
|                         <na-col-operation :vue="this" width="120" /> | ||||
|                         <naColOperation :vue="this" width="120" /> | ||||
|                     </sc-table> | ||||
|                 </el-col> | ||||
|             </el-row> | ||||
| @@ -173,11 +173,15 @@ import table from '@/config/table' | ||||
| const roleSaveDialog = defineAsyncComponent(() => import('@/views/sys/role/save.vue')) | ||||
| const deptSaveDialog = defineAsyncComponent(() => import('@/views/sys/dept/save.vue')) | ||||
| const saveDialog = defineAsyncComponent(() => import('./save.vue')) | ||||
| const naColAvatar = defineAsyncComponent(() => import('@/components/naColAvatar')) | ||||
| const naColTags = defineAsyncComponent(() => import('@/components/naColTags')) | ||||
| export default { | ||||
|     components: { | ||||
|         naColAvatar, | ||||
|         deptSaveDialog, | ||||
|         roleSaveDialog, | ||||
|         saveDialog, | ||||
|         naColTags, | ||||
|     }, | ||||
|     computed: { | ||||
|         table() { | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <template> | ||||
|     <sc-dialog | ||||
|     <scDialog | ||||
|         v-model="visible" | ||||
|         :title="`${titleMap[mode]}:${form?.id ?? '...'}`" | ||||
|         @closed="$emit('closed')" | ||||
| @@ -17,7 +17,7 @@ | ||||
|             <el-tabs v-model="tabId" tab-position="top"> | ||||
|                 <el-tab-pane :label="$t('基本信息')"> | ||||
|                     <el-form-item prop="avatar"> | ||||
|                         <sc-upload v-model="form.avatar" :title="$t('上传头像')"></sc-upload> | ||||
|                         <scUpload v-model="form.avatar" :title="$t('上传头像')"></scUpload> | ||||
|                     </el-form-item> | ||||
|                     <el-form-item v-if="mode === 'view'" :label="$t('唯一编码')" prop="id"> | ||||
|                         <el-input v-model="form.id" clearable></el-input> | ||||
| @@ -51,7 +51,7 @@ | ||||
|                     </el-form-item> | ||||
|  | ||||
|                     <el-form-item :label="$t('所属角色')" prop="roleIds"> | ||||
|                         <sc-select | ||||
|                         <scSelect | ||||
|                             v-if="!this.loading" | ||||
|                             v-model="form.roleIds" | ||||
|                             :config="{ props: { label: 'name', value: 'id' } }" | ||||
| @@ -62,7 +62,7 @@ | ||||
|                             multiple /> | ||||
|                     </el-form-item> | ||||
|                     <el-form-item :label="$t('所属部门')" prop="deptId"> | ||||
|                         <na-dept v-model="form.deptId" class="w100p"></na-dept> | ||||
|                         <naDept v-model="form.deptId" class="w100p"></naDept> | ||||
|                     </el-form-item> | ||||
|  | ||||
|                     <template v-if="mode !== 'add'"> | ||||
| @@ -144,7 +144,7 @@ | ||||
|                         </el-col> | ||||
|                         <el-col :lg="12"> | ||||
|                             <el-form-item :label="$t('籍贯')" prop="profile.nationArea"> | ||||
|                                 <na-area v-model="form.profile.nationArea"></na-area> | ||||
|                                 <naArea v-model="form.profile.nationArea"></naArea> | ||||
|                             </el-form-item> | ||||
|                         </el-col> | ||||
|  | ||||
| @@ -166,7 +166,7 @@ | ||||
|                             <el-form-item :label="$t('住宅地址')" prop="profile.homeAddress"> | ||||
|                                 <el-input v-model="form.profile.homeAddress" clearable> | ||||
|                                     <template v-slot:prepend> | ||||
|                                         <na-area v-model="form.profile.homeArea" style="width: 15rem"></na-area> | ||||
|                                         <naArea v-model="form.profile.homeArea" style="width: 15rem"></naArea> | ||||
|                                     </template> | ||||
|                                 </el-input> | ||||
|                             </el-form-item> | ||||
| @@ -187,7 +187,7 @@ | ||||
|                             <el-form-item :label="$t('工作地址')" prop="profile.companyAddress"> | ||||
|                                 <el-input v-model="form.profile.companyAddress" clearable> | ||||
|                                     <template v-slot:prepend> | ||||
|                                         <na-area v-model="form.profile.companyArea" style="width: 15rem"></na-area> | ||||
|                                         <naArea v-model="form.profile.companyArea" style="width: 15rem"></naArea> | ||||
|                                     </template> | ||||
|                                 </el-input> | ||||
|                             </el-form-item> | ||||
| @@ -218,14 +218,14 @@ | ||||
|                             <el-form-item :label="$t('联系人地址')" prop="profile.emergencyContactAddress"> | ||||
|                                 <el-input v-model="form.profile.emergencyContactAddress" clearable> | ||||
|                                     <template v-slot:prepend> | ||||
|                                         <na-area v-model="form.profile.emergencyContactArea" style="width: 15rem"></na-area> | ||||
|                                         <naArea v-model="form.profile.emergencyContactArea" style="width: 15rem"></naArea> | ||||
|                                     </template> | ||||
|                                 </el-input> | ||||
|                             </el-form-item> | ||||
|                         </el-col> | ||||
|                         <el-col :span="24"> | ||||
|                             <el-form-item :label="$t('应用配置')" prop="profile.appConfig"> | ||||
|                                 <v-ace-editor | ||||
|                                 <VAceEditor | ||||
|                                     v-model:value="form.profile.appConfig" | ||||
|                                     :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'github_dark' : 'github'" | ||||
|                                     lang="json" | ||||
| @@ -238,13 +238,13 @@ | ||||
|                     <log v-if="tabId === 'log'" :owner-id="form.id"></log> | ||||
|                 </el-tab-pane> | ||||
|                 <el-tab-pane v-if="mode === 'view'" :label="$t('原始数据')"> | ||||
|                     <json-viewer | ||||
|                     <JsonViewer | ||||
|                         :expand-depth="5" | ||||
|                         :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'dark' : 'light'" | ||||
|                         :value="form" | ||||
|                         copyable | ||||
|                         expanded | ||||
|                         sort></json-viewer> | ||||
|                         sort></JsonViewer> | ||||
|                 </el-tab-pane> | ||||
|             </el-tabs> | ||||
|         </el-form> | ||||
| @@ -252,15 +252,19 @@ | ||||
|             <el-button @click="visible = false">{{ $t('取消') }}</el-button> | ||||
|             <el-button v-if="mode !== 'view'" :disabled="loading" :loading="loading" @click="submit" type="primary">{{ $t('保存') }}</el-button> | ||||
|         </template> | ||||
|     </sc-dialog> | ||||
|     </scDialog> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import { defineAsyncComponent } from 'vue' | ||||
|  | ||||
| const log = defineAsyncComponent(() => import('@/views/sys/log/operation/index.vue')) | ||||
| const log = defineAsyncComponent(() => import('@/views/sys/log/operation')) | ||||
| const naArea = defineAsyncComponent(() => import('@/components/naArea')) | ||||
| const naDept = defineAsyncComponent(() => import('@/components/naDept')) | ||||
| const scUpload = defineAsyncComponent(() => import('@/components/scUpload')) | ||||
| const scSelect = defineAsyncComponent(() => import('@/components/scSelect')) | ||||
| export default { | ||||
|     components: { log }, | ||||
|     components: { log, naArea, naDept, scUpload, scSelect }, | ||||
|     data() { | ||||
|         return { | ||||
|             //表单数据 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user