已添加7个文件
已删除7个文件
已修改181个文件
| | |
| | | // æå®æ¯ä¸ªç¼©è¿çº§å«çç©ºæ ¼æ° |
| | | tabWidth: 2, |
| | | // 使ç¨å¶è¡¨ç¬¦è䏿¯ç©ºæ ¼ç¼©è¿è¡ |
| | | useTabs: true, |
| | | useTabs: false, |
| | | // å¨è¯å¥æ«å°¾æ¯å¦éè¦åå· |
| | | semi: true, |
| | | // æ¯å¦ä½¿ç¨åå¼å· |
| | |
| | | ## å¹³å°ç®ä» |
| | | |
| | | ## å¹³å°ç®ä» |
| | | |
| | | - æ¬ä»åºä¸ºåç«¯ææ¯æ [Vue3](https://v3.cn.vuejs.org) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) çæ¬ã |
| | | - é
å¥å端代ç ä»åºå°å |
| | | - [RuoYi-Vue-Plus 5.X(注æçæ¬å·)](https://gitee.com/dromara/RuoYi-Vue-Plus) |
| | | - [RuoYi-Cloud-Plus 2.X(注æçæ¬å·)](https://gitee.com/dromara/RuoYi-Cloud-Plus) |
| | | * æ¬ä»åºä¸ºåç«¯ææ¯æ [Vue3](https://v3.cn.vuejs.org) + [TS](https://www.typescriptlang.org/) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) çæ¬ã |
| | | * é
å¥å端代ç ä»åºå°å |
| | | * [RuoYi-Vue-Plus 5.X(注æçæ¬å·)](https://gitee.com/dromara/RuoYi-Vue-Plus) |
| | | * [RuoYi-Cloud-Plus 2.X(注æçæ¬å·)](https://gitee.com/dromara/RuoYi-Cloud-Plus) |
| | | |
| | | ## å端è¿è¡ |
| | | |
| | |
| | | # å¯å¨æå¡ |
| | | npm run dev |
| | | |
| | | # æå»ºæµè¯ç¯å¢ yarn build:stage |
| | | # æå»ºç产ç¯å¢ yarn build:prod |
| | | # å端访é®å°å http://localhost:80 |
| | | ``` |
| | |
| | | ## æ¬æ¡æ¶ä¸ RuoYi çä¸å¡å·®å¼ |
| | | |
| | | | ä¸å¡ | åè½è¯´æ | æ¬æ¡æ¶ | RuoYi | |
| | | | ------------ | --------------------------------------------------------------- | ------ | ------------------------------ | |
| | | |--------|-----------------------------------------|-----|------------------| |
| | | | ç§æ·ç®¡ç | ç³»ç»å
ç§æ·ç管ç å¦:ç§æ·å¥é¤ãè¿ææ¶é´ãç¨æ·æ°éãä¼ä¸ä¿¡æ¯ç | æ¯æ | æ | |
| | | | ç§æ·å¥é¤ç®¡ç | ç³»ç»å
ç§æ·æè½ä½¿ç¨çå¥é¤ç®¡ç å¦:å¥é¤å
æå
å«çèåç | æ¯æ | æ | |
| | | | ç¨æ·ç®¡ç | ç¨æ·ç管çé
ç½® å¦:æ°å¢ç¨æ·ãåé
ç¨æ·æå±é¨é¨ãè§è²ãå²ä½ç | æ¯æ | æ¯æ | |
| | |
| | | | å¨çº¿æå»ºå¨ | æå¨è¡¨åå
ç´ çæç¸åºç HTML 代ç ã | æ¯æ | æ¯æ | |
| | | | ä½¿ç¨æ¡ä¾ | ç³»ç»çä¸äºåè½æ¡ä¾ | æ¯æ | 䏿¯æ | |
| | | |
| | | ## æ¼ç¤ºå¾ |
| | | ## æ¼ç¤ºå¾ä¾ |
| | | |
| | | - æ¬ä»åºä¸ºåç«¯ææ¯æ [Vue3](https://v3.cn.vuejs.org) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) çæ¬ã |
| | | - é
å¥å端代ç ä»åºå°å |
| | | - [RuoYi-Vue-Plus 5.X(注æçæ¬å·)](https://gitee.com/dromara/RuoYi-Vue-Plus) |
| | | - [RuoYi-Cloud-Plus 2.X(注æçæ¬å·)](https://gitee.com/dromara/RuoYi-Cloud-Plus) |
| | | |
| | | ## å端è¿è¡ |
| | | |
| | | ```bash |
| | | # å
éé¡¹ç® |
| | | git clone https://gitee.com/JavaLionLi/plus-ui.git |
| | | |
| | | # å®è£
ä¾èµ |
| | | npm install --registry=https://registry.npmmirror.com |
| | | |
| | | # å¯å¨æå¡ |
| | | npm run dev |
| | | |
| | | # æå»ºæµè¯ç¯å¢ yarn build:stage |
| | | # æå»ºç产ç¯å¢ yarn build:prod |
| | | # å端访é®å°å http://localhost:80 |
| | | ``` |
| | | |
| | | ## å端æ¹é |
| | | |
| | | åèå端代ç å
`ruoyi-gen/resources/vm/vue/v3/readme.txt` 说æ |
| | | |
| | | ## å
ç½®åè½ |
| | | |
| | | 1. ç§æ·ç®¡çï¼é
置系ç»ç§æ·ï¼æ¯æ SaaS åºæ¯ä¸çå¤ç§æ·åè½ã |
| | | 2. ç¨æ·ç®¡çï¼ç¨æ·æ¯ç³»ç»æä½è
ï¼è¯¥åè½ä¸»è¦å®æç³»ç»ç¨æ·é
ç½®ã |
| | | 3. é¨é¨ç®¡çï¼é
置系ç»ç»ç»æºæï¼å
¬å¸ãé¨é¨ãå°ç»ï¼ï¼æ ç»æå±ç°æ¯ææ°æ®æéã |
| | | 4. å²ä½ç®¡çï¼é
置系ç»ç¨æ·æå±æ
ä»»èå¡ã |
| | | 5. èå管çï¼é
置系ç»èåï¼æä½æéï¼æé®æéæ è¯çã |
| | | 6. è§è²ç®¡çï¼è§è²èåæéåé
ã设置è§è²ææºæè¿è¡æ°æ®èå´æéååã |
| | | 7. åå
¸ç®¡çï¼å¯¹ç³»ç»ä¸ç»å¸¸ä½¿ç¨çä¸äºè¾ä¸ºåºå®çæ°æ®è¿è¡ç»´æ¤ã |
| | | 8. åæ°ç®¡çï¼å¯¹ç³»ç»å¨æé
置常ç¨åæ°ã |
| | | 9. éç¥å
¬åï¼ç³»ç»éç¥å
¬åä¿¡æ¯åå¸ç»´æ¤ã |
| | | 10. æä½æ¥å¿ï¼ç³»ç»æ£å¸¸æä½æ¥å¿è®°å½åæ¥è¯¢ï¼ç³»ç»å¼å¸¸ä¿¡æ¯æ¥å¿è®°å½åæ¥è¯¢ã |
| | | 11. ç»å½æ¥å¿ï¼ç³»ç»ç»å½æ¥å¿è®°å½æ¥è¯¢å
å«ç»å½å¼å¸¸ã |
| | | 12. å¨çº¿ç¨æ·ï¼å½åç³»ç»ä¸æ´»è·ç¨æ·ç¶æçæ§ã |
| | | 13. 宿¶ä»»å¡ï¼å¨çº¿ï¼æ·»å ãä¿®æ¹ãå é¤)ä»»å¡è°åº¦å
嫿§è¡ç»ææ¥å¿ã |
| | | 14. 代ç çæï¼åå端代ç ççæï¼javaãhtmlãxmlãsqlï¼æ¯æ CRUD ä¸è½½ ã |
| | | 15. ç³»ç»æ¥å£ï¼æ ¹æ®ä¸å¡ä»£ç èªå¨çæç¸å
³ç api æ¥å£ææ¡£ã |
| | | 16. æå¡çæ§ï¼çè§å½åç³»ç» CPUãå
åãç£çãå æ çç¸å
³ä¿¡æ¯ã |
| | | 17. ç¼åçæ§ï¼å¯¹ç³»ç»çç¼åä¿¡æ¯æ¥è¯¢ï¼å½ä»¤ç»è®¡çã |
| | | 18. å¨çº¿æå»ºå¨ï¼æå¨è¡¨åå
ç´ çæç¸åºç HTML 代ç ã |
| | | |
| | | ## æ¼ç¤ºå¾ |
| | | |
| | | <table> |
| | | <tr> |
| | | <td><img src="https://oscimg.oschina.net/oscnet/cd1f90be5f2684f4560c9519c0f2a232ee8.jpg"/></td> |
| | | <td><img src="https://oscimg.oschina.net/oscnet/1cbcf0e6f257c7d3a063c0e3f2ff989e4b3.jpg"/></td> |
| | | </tr> |
| | | <tr> |
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-8074972883b5ba0622e13246738ebba237a.png"/></td> |
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-9f88719cdfca9af2e58b352a20e23d43b12.png"/></td> |
| | | </tr> |
| | | <tr> |
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-39bf2584ec3a529b0d5a3b70d15c9b37646.png"/></td> |
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-936ec82d1f4872e1bc980927654b6007307.png"/></td> |
| | | </tr> |
| | | <tr> |
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-b2d62ceb95d2dd9b3fbe157bb70d26001e9.png"/></td> |
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-d67451d308b7a79ad6819723396f7c3d77a.png"/></td> |
| | | </tr> |
| | | <tr> |
| | | <td><img src="https://oscimg.oschina.net/oscnet/5e8c387724954459291aafd5eb52b456f53.jpg"/></td> |
| | | <td><img src="https://oscimg.oschina.net/oscnet/644e78da53c2e92a95dfda4f76e6d117c4b.jpg"/></td> |
| | | </tr> |
| | | <tr> |
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-8370a0d02977eebf6dbf854c8450293c937.png"/></td> |
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-49003ed83f60f633e7153609a53a2b644f7.png"/></td> |
| | | </tr> |
| | | <tr> |
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-d4fe726319ece268d4746602c39cffc0621.png"/></td> |
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-c195234bbcd30be6927f037a6755e6ab69c.png"/></td> |
| | | </tr> |
| | | <tr> |
| | | <td><img src="https://oscimg.oschina.net/oscnet/b6115bc8c31de52951982e509930b20684a.jpg"/></td> |
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-5e4daac0bb59612c5038448acbcef235e3a.png"/></td> |
| | | </tr> |
| | | </table> |
| | | | | | |
| | | |--------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------| |
| | | |  |  | |
| | | |  |  | |
| | | |  |  | |
| | | |  |  | |
| | | |  |  | |
| | | |  |  | |
| | | |  |  | |
| | | |  |  | |
| | | |  |  | |
| | | |  |  | |
| | | |  |  | |
| | | |  |  | |
| | | |  |  | |
| | | |  |  | |
| | | |  |  | |
| | | |  |  | |
| | | |  |  | |
| | | |  |  | |
| | | |  |  | |
| | |
| | | <template> |
| | | <el-breadcrumb class="app-breadcrumb" separator="/"> |
| | | <transition-group name="breadcrumb"> |
| | | <el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path"> |
| | | <span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">{{ |
| | | item.meta?.title }}</span> |
| | | <a v-else @click.prevent="handleLink(item)">{{ item.meta?.title }}</a> |
| | | </el-breadcrumb-item> |
| | | </transition-group> |
| | | </el-breadcrumb> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { RouteLocationMatched } from 'vue-router' |
| | | |
| | |
| | | getBreadcrumb(); |
| | | }) |
| | | </script> |
| | | |
| | | <template> |
| | | <el-breadcrumb class="app-breadcrumb" separator="/"> |
| | | <transition-group name="breadcrumb"> |
| | | <el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path"> |
| | | <span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">{{ |
| | | item.meta?.title }}</span> |
| | | <a v-else @click.prevent="handleLink(item)">{{ item.meta?.title }}</a> |
| | | </el-breadcrumb-item> |
| | | </transition-group> |
| | | </el-breadcrumb> |
| | | </template> |
| | | |
| | | <style lang="scss" scoped> |
| | | .app-breadcrumb.el-breadcrumb { |
| | |
| | | <script setup lang="ts"> |
| | | import { PropType } from 'vue'; |
| | | |
| | | const props = defineProps({ |
| | | // æ°æ® |
| | | options: { |
| | | type: Array as PropType<DictDataOption[]>, |
| | | default: null, |
| | | }, |
| | | // å½åçå¼ |
| | | value: [Number, String, Array], |
| | | }) |
| | | |
| | | const values = computed(() => { |
| | | if (props.value !== null && typeof props.value !== 'undefined') { |
| | | return Array.isArray(props.value) ? props.value : [String(props.value)]; |
| | | } else { |
| | | return []; |
| | | } |
| | | }) |
| | | </script> |
| | | |
| | | <template> |
| | | <div> |
| | | <template v-for="(item, index) in options"> |
| | |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { PropType } from 'vue'; |
| | | |
| | | const props = defineProps({ |
| | | // æ°æ® |
| | | options: { |
| | | type: Array as PropType<DictDataOption[]>, |
| | | default: null, |
| | | }, |
| | | // å½åçå¼ |
| | | value: [Number, String, Array], |
| | | }) |
| | | |
| | | const values = computed(() => { |
| | | if (props.value !== null && typeof props.value !== 'undefined') { |
| | | return Array.isArray(props.value) ? props.value : [String(props.value)]; |
| | | } else { |
| | | return []; |
| | | } |
| | | }) |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .el-tag + .el-tag { |
| | | margin-left: 10px; |
| | |
| | | <template> |
| | | <div> |
| | | <el-upload |
| | | :action="upload.url" |
| | | :before-upload="handleBeforeUpload" |
| | | :on-success="handleUploadSuccess" |
| | | :on-error="handleUploadError" |
| | | class="editor-img-uploader" |
| | | name="file" |
| | | :show-file-list="false" |
| | | :headers="upload.headers" |
| | | style="display: none" |
| | | v-if="type === 'url'" |
| | | > |
| | | </el-upload> |
| | | <div class="editor"> |
| | | <quill-editor |
| | | ref="myQuillEditor" |
| | | v-model:content="content" |
| | | contentType="html" |
| | | @textChange="(e: any) => $emit('update:modelValue', content)" |
| | | :options="options" |
| | | :style="styles" |
| | | /> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { QuillEditor, Quill } from '@vueup/vue-quill'; |
| | | import '@vueup/vue-quill/dist/vue-quill.snow.css'; |
| | |
| | | proxy?.$modal.msgError('ä¸ä¼ æä»¶å¤±è´¥'); |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <div> |
| | | <el-upload |
| | | :action="upload.url" |
| | | :before-upload="handleBeforeUpload" |
| | | :on-success="handleUploadSuccess" |
| | | :on-error="handleUploadError" |
| | | class="editor-img-uploader" |
| | | name="file" |
| | | :show-file-list="false" |
| | | :headers="upload.headers" |
| | | style="display: none" |
| | | v-if="type === 'url'" |
| | | > |
| | | </el-upload> |
| | | <div class="editor"> |
| | | <quill-editor |
| | | ref="myQuillEditor" |
| | | v-model:content="content" |
| | | contentType="html" |
| | | @textChange="(e: any) => $emit('update:modelValue', content)" |
| | | :options="options" |
| | | :style="styles" |
| | | /> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <style> |
| | | .editor, .ql-toolbar { |
| | |
| | | <template> |
| | | <div class="upload-file"> |
| | | <el-upload |
| | | multiple |
| | | :action="uploadFileUrl" |
| | | :before-upload="handleBeforeUpload" |
| | | :file-list="fileList" |
| | | :limit="limit" |
| | | :on-error="handleUploadError" |
| | | :on-exceed="handleExceed" |
| | | :on-success="handleUploadSuccess" |
| | | :show-file-list="false" |
| | | :headers="headers" |
| | | class="upload-file-uploader" |
| | | ref="fileUploadRef" |
| | | > |
| | | <!-- ä¸ä¼ æé® --> |
| | | <el-button type="primary">éåæä»¶</el-button> |
| | | </el-upload> |
| | | <!-- ä¸ä¼ æç¤º --> |
| | | <div class="el-upload__tip" v-if="showTip"> |
| | | 请ä¸ä¼ |
| | | <template v-if="fileSize"> |
| | | 大å°ä¸è¶
è¿ <b style="color: #f56c6c">{{ fileSize }}MB</b> |
| | | </template> |
| | | <template v-if="fileType"> |
| | | æ ¼å¼ä¸º <b style="color: #f56c6c">{{ fileType.join("/") }}</b> |
| | | </template> |
| | | çæä»¶ |
| | | </div> |
| | | <!-- æä»¶å表 --> |
| | | <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul"> |
| | | <li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList"> |
| | | <el-link :href="`${file.url}`" :underline="false" target="_blank"> |
| | | <span class="el-icon-document"> {{ getFileName(file.name) }} </span> |
| | | </el-link> |
| | | <div class="ele-upload-list__item-content-action"> |
| | | <el-link :underline="false" @click="handleDelete(index)" type="danger">å é¤</el-link> |
| | | </div> |
| | | </li> |
| | | </transition-group> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { getToken } from "@/utils/auth"; |
| | | import { listByIds, delOss } from "@/api/system/oss"; |
| | |
| | | return strs != "" ? strs.substring(0, strs.length - 1) : ""; |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="upload-file"> |
| | | <el-upload |
| | | multiple |
| | | :action="uploadFileUrl" |
| | | :before-upload="handleBeforeUpload" |
| | | :file-list="fileList" |
| | | :limit="limit" |
| | | :on-error="handleUploadError" |
| | | :on-exceed="handleExceed" |
| | | :on-success="handleUploadSuccess" |
| | | :show-file-list="false" |
| | | :headers="headers" |
| | | class="upload-file-uploader" |
| | | ref="fileUploadRef" |
| | | > |
| | | <!-- ä¸ä¼ æé® --> |
| | | <el-button type="primary">éåæä»¶</el-button> |
| | | </el-upload> |
| | | <!-- ä¸ä¼ æç¤º --> |
| | | <div class="el-upload__tip" v-if="showTip"> |
| | | 请ä¸ä¼ |
| | | <template v-if="fileSize"> |
| | | 大å°ä¸è¶
è¿ <b style="color: #f56c6c">{{ fileSize }}MB</b> |
| | | </template> |
| | | <template v-if="fileType"> |
| | | æ ¼å¼ä¸º <b style="color: #f56c6c">{{ fileType.join("/") }}</b> |
| | | </template> |
| | | çæä»¶ |
| | | </div> |
| | | <!-- æä»¶å表 --> |
| | | <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul"> |
| | | <li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList"> |
| | | <el-link :href="`${file.url}`" :underline="false" target="_blank"> |
| | | <span class="el-icon-document"> {{ getFileName(file.name) }} </span> |
| | | </el-link> |
| | | <div class="ele-upload-list__item-content-action"> |
| | | <el-link :underline="false" @click="handleDelete(index)" type="danger">å é¤</el-link> |
| | | </div> |
| | | </li> |
| | | </transition-group> |
| | | </div> |
| | | </template> |
| | | |
| | | <style scoped lang="scss"> |
| | | .upload-file-uploader { |
| | |
| | | <template> |
| | | <div class="component-upload-image"> |
| | | <el-upload |
| | | multiple |
| | | :action="uploadImgUrl" |
| | | list-type="picture-card" |
| | | :on-success="handleUploadSuccess" |
| | | :before-upload="handleBeforeUpload" |
| | | :limit="limit" |
| | | :on-error="handleUploadError" |
| | | :on-exceed="handleExceed" |
| | | ref="imageUpload" |
| | | :before-remove="handleDelete" |
| | | :show-file-list="true" |
| | | :headers="headers" |
| | | :file-list="fileList" |
| | | :on-preview="handlePictureCardPreview" |
| | | :class="{ hide: fileList.length >= limit }" |
| | | > |
| | | <el-icon class="avatar-uploader-icon"><plus /></el-icon> |
| | | </el-upload> |
| | | <!-- ä¸ä¼ æç¤º --> |
| | | <div class="el-upload__tip" v-if="showTip"> |
| | | 请ä¸ä¼ |
| | | <template v-if="fileSize"> |
| | | 大å°ä¸è¶
è¿ <b style="color: #f56c6c">{{ fileSize }}MB</b> |
| | | </template> |
| | | <template v-if="fileType"> |
| | | æ ¼å¼ä¸º <b style="color: #f56c6c">{{ fileType.join("/") }}</b> |
| | | </template> |
| | | çæä»¶ |
| | | </div> |
| | | |
| | | <el-dialog v-model="dialogVisible" title="é¢è§" width="800px" append-to-body> |
| | | <img :src="dialogImageUrl" style="display: block; max-width: 100%; margin: 0 auto" /> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { getToken } from "@/utils/auth"; |
| | | import { listByIds, delOss } from "@/api/system/oss"; |
| | |
| | | return strs != "" ? strs.substring(0, strs.length - 1) : ""; |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="component-upload-image"> |
| | | <el-upload |
| | | multiple |
| | | :action="uploadImgUrl" |
| | | list-type="picture-card" |
| | | :on-success="handleUploadSuccess" |
| | | :before-upload="handleBeforeUpload" |
| | | :limit="limit" |
| | | :on-error="handleUploadError" |
| | | :on-exceed="handleExceed" |
| | | ref="imageUpload" |
| | | :before-remove="handleDelete" |
| | | :show-file-list="true" |
| | | :headers="headers" |
| | | :file-list="fileList" |
| | | :on-preview="handlePictureCardPreview" |
| | | :class="{ hide: fileList.length >= limit }" |
| | | > |
| | | <el-icon class="avatar-uploader-icon"><plus /></el-icon> |
| | | </el-upload> |
| | | <!-- ä¸ä¼ æç¤º --> |
| | | <div class="el-upload__tip" v-if="showTip"> |
| | | 请ä¸ä¼ |
| | | <template v-if="fileSize"> |
| | | 大å°ä¸è¶
è¿ <b style="color: #f56c6c">{{ fileSize }}MB</b> |
| | | </template> |
| | | <template v-if="fileType"> |
| | | æ ¼å¼ä¸º <b style="color: #f56c6c">{{ fileType.join("/") }}</b> |
| | | </template> |
| | | çæä»¶ |
| | | </div> |
| | | |
| | | <el-dialog v-model="dialogVisible" title="é¢è§" width="800px" append-to-body> |
| | | <img :src="dialogImageUrl" style="display: block; max-width: 100%; margin: 0 auto" /> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <style scoped lang="scss"> |
| | | // .el-upload--picture-card æ§å¶å å·é¨å |
| | |
| | | <template> |
| | | <div :class="{ 'hidden': hidden }" class="pagination-container"> |
| | | <el-pagination |
| | | :background="background" |
| | | v-model:current-page="currentPage" |
| | | v-model:page-size="pageSize" |
| | | :layout="layout" |
| | | :page-sizes="pageSizes" |
| | | :pager-count="pagerCount" |
| | | :total="total" |
| | | @size-change="handleSizeChange" |
| | | @current-change="handleCurrentChange" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script lang="ts"> |
| | | export default { |
| | | name: 'Pagination' |
| | |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <div :class="{ 'hidden': hidden }" class="pagination-container"> |
| | | <el-pagination |
| | | :background="background" |
| | | v-model:current-page="currentPage" |
| | | v-model:page-size="pageSize" |
| | | :layout="layout" |
| | | :page-sizes="pageSizes" |
| | | :pager-count="pagerCount" |
| | | :total="total" |
| | | @size-change="handleSizeChange" |
| | | @current-change="handleCurrentChange" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | | <style lang="scss" scoped> |
| | | .pagination-container { |
| | |
| | | <template> |
| | | <div class="top-right-btn" :style="style"> |
| | | <el-row> |
| | | <el-tooltip class="item" effect="dark" :content="showSearch ? 'éèæç´¢' : 'æ¾ç¤ºæç´¢'" placement="top" v-if="search"> |
| | | <el-button circle icon="Search" @click="toggleSearch()" /> |
| | | </el-tooltip> |
| | | <el-tooltip class="item" effect="dark" content="å·æ°" placement="top"> |
| | | <el-button circle icon="Refresh" @click="refresh()" /> |
| | | </el-tooltip> |
| | | <el-tooltip class="item" effect="dark" content="æ¾éå" placement="top" v-if="columns"> |
| | | <el-button circle icon="Menu" @click="showColumn()" /> |
| | | </el-tooltip> |
| | | </el-row> |
| | | <el-dialog :title="title" v-model="open" append-to-body> |
| | | <el-transfer :titles="['æ¾ç¤º', 'éè']" v-model="value" :data="columns" @change="dataChange"></el-transfer> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { TransferKey } from "element-plus"; |
| | | import { PropType } from "vue"; |
| | |
| | | }) |
| | | }) |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="top-right-btn" :style="style"> |
| | | <el-row> |
| | | <el-tooltip class="item" effect="dark" :content="showSearch ? 'éèæç´¢' : 'æ¾ç¤ºæç´¢'" placement="top" v-if="search"> |
| | | <el-button circle icon="Search" @click="toggleSearch()" /> |
| | | </el-tooltip> |
| | | <el-tooltip class="item" effect="dark" content="å·æ°" placement="top"> |
| | | <el-button circle icon="Refresh" @click="refresh()" /> |
| | | </el-tooltip> |
| | | <el-tooltip class="item" effect="dark" content="æ¾éå" placement="top" v-if="columns"> |
| | | <el-button circle icon="Menu" @click="showColumn()" /> |
| | | </el-tooltip> |
| | | </el-row> |
| | | <el-dialog :title="title" v-model="open" append-to-body> |
| | | <el-transfer :titles="['æ¾ç¤º', 'éè']" v-model="value" :data="columns" @change="dataChange"></el-transfer> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <style lang="scss" scoped> |
| | | :deep(.el-transfer__button) { |
| | |
| | | <template> |
| | | <el-menu :default-active="activeMenu" mode="horizontal" @select="handleSelect" :ellipsis="false"> |
| | | <template v-for="(item, index) in topMenus"> |
| | | <el-menu-item :style="{'--theme': theme}" :index="item.path" :key="index" v-if="index < visibleNumber" |
| | | ><svg-icon :icon-class="item.meta ? item.meta.icon : '' " /> {{ item.meta?.title }}</el-menu-item |
| | | > |
| | | </template> |
| | | |
| | | <!-- é¡¶é¨èåè¶
åºæ°éæå --> |
| | | <el-sub-menu :style="{'--theme': theme}" index="more" v-if="topMenus.length > visibleNumber"> |
| | | <template #title>æ´å¤èå</template> |
| | | <template v-for="(item, index) in topMenus"> |
| | | <el-menu-item :index="item.path" :key="index" v-if="index >= visibleNumber" |
| | | ><svg-icon :icon-class="item.meta ? item.meta.icon : '' " /> {{ item.meta?.title }}</el-menu-item |
| | | > |
| | | </template> |
| | | </el-sub-menu> |
| | | </el-menu> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { constantRoutes } from '@/router'; |
| | | import { isHttp } from '@/utils/validate'; |
| | |
| | | setVisibleNumber() |
| | | }) |
| | | </script> |
| | | |
| | | <template> |
| | | <el-menu :default-active="activeMenu" mode="horizontal" @select="handleSelect" :ellipsis="false"> |
| | | <template v-for="(item, index) in topMenus"> |
| | | <el-menu-item :style="{'--theme': theme}" :index="item.path" :key="index" v-if="index < visibleNumber" |
| | | ><svg-icon :icon-class="item.meta ? item.meta.icon : '' " /> {{ item.meta?.title }}</el-menu-item |
| | | > |
| | | </template> |
| | | |
| | | <!-- é¡¶é¨èåè¶
åºæ°éæå --> |
| | | <el-sub-menu :style="{'--theme': theme}" index="more" v-if="topMenus.length > visibleNumber"> |
| | | <template #title>æ´å¤èå</template> |
| | | <template v-for="(item, index) in topMenus"> |
| | | <el-menu-item :index="item.path" :key="index" v-if="index >= visibleNumber" |
| | | ><svg-icon :icon-class="item.meta ? item.meta.icon : '' " /> {{ item.meta?.title }}</el-menu-item |
| | | > |
| | | </template> |
| | | </el-sub-menu> |
| | | </el-menu> |
| | | </template> |
| | | |
| | | <style lang="scss"> |
| | | .topmenu-container.el-menu--horizontal > .el-menu-item { |
| | |
| | | <template> |
| | | <section class="app-main"> |
| | | <router-view v-slot="{ Component, route }"> |
| | | <transition :enter-active-class="animante" mode="out-in"> |
| | | <keep-alive :include="tagsViewStore.cachedViews"> |
| | | <component v-if="!route.meta.link" :is="Component" :key="route.path" /> |
| | | </keep-alive> |
| | | </transition> |
| | | </router-view> |
| | | <iframe-toggle /> |
| | | </section> |
| | | </template> |
| | | |
| | | <script lang="ts"> |
| | | export default { |
| | | name: 'AppMin' |
| | |
| | | } |
| | | }, { immediate: true }); |
| | | </script> |
| | | |
| | | <template> |
| | | <section class="app-main"> |
| | | <router-view v-slot="{ Component, route }"> |
| | | <transition :enter-active-class="animante" mode="out-in"> |
| | | <keep-alive :include="tagsViewStore.cachedViews"> |
| | | <component v-if="!route.meta.link" :is="Component" :key="route.path" /> |
| | | </keep-alive> |
| | | </transition> |
| | | </router-view> |
| | | <iframe-toggle /> |
| | | </section> |
| | | </template> |
| | | |
| | | <style lang="scss" scoped> |
| | | .app-main { |
| | |
| | | <template> |
| | | <div :style="'height:' + height"> |
| | | <iframe :id="iframeId" style="width: 100%; height: 100%" :src="src" frameborder="no"></iframe> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | const props = defineProps({ |
| | | src: { |
| | |
| | | }); |
| | | const height = ref(document.documentElement.clientHeight - 94.5 + "px"); |
| | | </script> |
| | | |
| | | <template> |
| | | <div :style="'height:' + height"> |
| | | <iframe :id="iframeId" style="width: 100%; height: 100%" :src="src" frameborder="no"></iframe> |
| | | </div> |
| | | </template> |
| | |
| | | <template> |
| | | <div class="navbar"> |
| | | <hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" /> |
| | | <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!settingsStore.topNav" /> |
| | | <top-nav id="topmenu-container" class="topmenu-container" v-if="settingsStore.topNav" /> |
| | | |
| | | <div class="right-menu flex align-center"> |
| | | <template v-if="appStore.device !== 'mobile'"> |
| | | <el-select |
| | | v-model="companyName" |
| | | clearable |
| | | filterable |
| | | reserve-keyword |
| | | placeholder="è¯·éæ©ç§æ·" |
| | | v-if="userId === 1 && tenantEnabled" |
| | | @change="dynamicTenantEvent" |
| | | @clear="dynamicClearEvent" |
| | | > |
| | | <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"> </el-option> |
| | | <template #prefix><svg-icon icon-class="company" class="el-input__icon input-icon" /></template> |
| | | </el-select> |
| | | |
| | | <header-search id="header-search" class="right-menu-item" /> |
| | | |
| | | <el-tooltip content="æºç å°å" effect="dark" placement="bottom"> |
| | | <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" /> |
| | | </el-tooltip> |
| | | |
| | | <el-tooltip content="ææ¡£å°å" effect="dark" placement="bottom"> |
| | | <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" /> |
| | | </el-tooltip> |
| | | |
| | | <el-tooltip content="å
¨å±" effect="dark" placement="bottom"> |
| | | <screenfull id="screenfull" class="right-menu-item hover-effect" /> |
| | | </el-tooltip> |
| | | |
| | | <el-tooltip content="å¸å±å¤§å°" effect="dark" placement="bottom"> |
| | | <size-select id="size-select" class="right-menu-item hover-effect" /> |
| | | </el-tooltip> |
| | | </template> |
| | | <div class="avatar-container"> |
| | | <el-dropdown @command="handleCommand" class="right-menu-item hover-effect" trigger="click"> |
| | | <div class="avatar-wrapper"> |
| | | <img :src="userStore.avatar" class="user-avatar" /> |
| | | <el-icon><caret-bottom /></el-icon> |
| | | </div> |
| | | <template #dropdown> |
| | | <el-dropdown-menu> |
| | | <router-link to="/user/profile" v-if="!dynamic"> |
| | | <el-dropdown-item>个人ä¸å¿</el-dropdown-item> |
| | | </router-link> |
| | | <el-dropdown-item command="setLayout"> |
| | | <span>å¸å±è®¾ç½®</span> |
| | | </el-dropdown-item> |
| | | <el-dropdown-item divided command="logout"> |
| | | <span>éåºç»å½</span> |
| | | </el-dropdown-item> |
| | | </el-dropdown-menu> |
| | | </template> |
| | | </el-dropdown> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import useAppStore from '@/store/modules/app' |
| | | import useUserStore from '@/store/modules/user' |
| | |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="navbar"> |
| | | <hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" /> |
| | | <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!settingsStore.topNav" /> |
| | | <top-nav id="topmenu-container" class="topmenu-container" v-if="settingsStore.topNav" /> |
| | | |
| | | <div class="right-menu flex align-center"> |
| | | <template v-if="appStore.device !== 'mobile'"> |
| | | <el-select |
| | | v-model="companyName" |
| | | clearable |
| | | filterable |
| | | reserve-keyword |
| | | placeholder="è¯·éæ©ç§æ·" |
| | | v-if="userId === 1 && tenantEnabled" |
| | | @change="dynamicTenantEvent" |
| | | @clear="dynamicClearEvent" |
| | | > |
| | | <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"> </el-option> |
| | | <template #prefix><svg-icon icon-class="company" class="el-input__icon input-icon" /></template> |
| | | </el-select> |
| | | |
| | | <header-search id="header-search" class="right-menu-item" /> |
| | | |
| | | <el-tooltip content="æºç å°å" effect="dark" placement="bottom"> |
| | | <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" /> |
| | | </el-tooltip> |
| | | |
| | | <el-tooltip content="ææ¡£å°å" effect="dark" placement="bottom"> |
| | | <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" /> |
| | | </el-tooltip> |
| | | |
| | | <el-tooltip content="å
¨å±" effect="dark" placement="bottom"> |
| | | <screenfull id="screenfull" class="right-menu-item hover-effect" /> |
| | | </el-tooltip> |
| | | |
| | | <el-tooltip content="å¸å±å¤§å°" effect="dark" placement="bottom"> |
| | | <size-select id="size-select" class="right-menu-item hover-effect" /> |
| | | </el-tooltip> |
| | | </template> |
| | | <div class="avatar-container"> |
| | | <el-dropdown @command="handleCommand" class="right-menu-item hover-effect" trigger="click"> |
| | | <div class="avatar-wrapper"> |
| | | <img :src="userStore.avatar" class="user-avatar" /> |
| | | <el-icon><caret-bottom /></el-icon> |
| | | </div> |
| | | <template #dropdown> |
| | | <el-dropdown-menu> |
| | | <router-link to="/user/profile" v-if="!dynamic"> |
| | | <el-dropdown-item>个人ä¸å¿</el-dropdown-item> |
| | | </router-link> |
| | | <el-dropdown-item command="setLayout"> |
| | | <span>å¸å±è®¾ç½®</span> |
| | | </el-dropdown-item> |
| | | <el-dropdown-item divided command="logout"> |
| | | <span>éåºç»å½</span> |
| | | </el-dropdown-item> |
| | | </el-dropdown-menu> |
| | | </template> |
| | | </el-dropdown> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <style lang="scss" scoped> |
| | | |
| | |
| | | <template> |
| | | <div v-if="!item.hidden"> |
| | | <template v-if="hasOneShowingChild(item.children, item) && (!onlyOneChild.children || onlyOneChild.noShowingChildren) && !item.alwaysShow"> |
| | | <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path, onlyOneChild.query)"> |
| | | <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{ 'submenu-title-noDropdown': !isNest }"> |
| | | <svg-icon :icon-class="onlyOneChild.meta.icon || (item.meta && item.meta.icon)" /> |
| | | <template #title> |
| | | <span class="menu-title" :title="hasTitle(onlyOneChild.meta.title)">{{ onlyOneChild.meta.title }}</span> |
| | | </template> |
| | | </el-menu-item> |
| | | </app-link> |
| | | </template> |
| | | |
| | | <el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" teleported> |
| | | <template v-if="item.meta" #title> |
| | | <svg-icon :icon-class="item.meta ? item.meta.icon : '' " /> |
| | | <span class="menu-title" :title="hasTitle(item.meta?.title)">{{ item.meta?.title }}</span> |
| | | </template> |
| | | |
| | | <sidebar-item |
| | | v-for="child in item.children" |
| | | :key="child.path" |
| | | :is-nest="true" |
| | | :item="child as RouteOption" |
| | | :base-path="resolvePath(child.path)" |
| | | class="nest-menu" |
| | | /> |
| | | </el-sub-menu> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { isExternal } from '@/utils/validate' |
| | | import AppLink from './Link.vue' |
| | |
| | | return title; |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <div v-if="!item.hidden"> |
| | | <template v-if="hasOneShowingChild(item.children, item) && (!onlyOneChild.children || onlyOneChild.noShowingChildren) && !item.alwaysShow"> |
| | | <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path, onlyOneChild.query)"> |
| | | <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{ 'submenu-title-noDropdown': !isNest }"> |
| | | <svg-icon :icon-class="onlyOneChild.meta.icon || (item.meta && item.meta.icon)" /> |
| | | <template #title> |
| | | <span class="menu-title" :title="hasTitle(onlyOneChild.meta.title)">{{ onlyOneChild.meta.title }}</span> |
| | | </template> |
| | | </el-menu-item> |
| | | </app-link> |
| | | </template> |
| | | |
| | | <el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" teleported> |
| | | <template v-if="item.meta" #title> |
| | | <svg-icon :icon-class="item.meta ? item.meta.icon : '' " /> |
| | | <span class="menu-title" :title="hasTitle(item.meta?.title)">{{ item.meta?.title }}</span> |
| | | </template> |
| | | |
| | | <sidebar-item |
| | | v-for="child in item.children" |
| | | :key="child.path" |
| | | :is-nest="true" |
| | | :item="child as RouteOption" |
| | | :base-path="resolvePath(child.path)" |
| | | class="nest-menu" |
| | | /> |
| | | </el-sub-menu> |
| | | </div> |
| | | </template> |
| | |
| | | <template> |
| | | <div id="tags-view-container" class="tags-view-container"> |
| | | <scroll-pane ref="scrollPaneRef" class="tags-view-wrapper" @scroll="handleScroll"> |
| | | <router-link |
| | | v-for="tag in visitedViews" |
| | | :key="tag.path" |
| | | :data-path="tag.path" |
| | | :class="isActive(tag) ? 'active' : ''" |
| | | :to="{ path: tag.path ? tag.path : '', query: tag.query, fullPath: tag.fullPath ? tag.fullPath : '' }" |
| | | class="tags-view-item" |
| | | :style="activeStyle(tag)" |
| | | @click.middle="!isAffix(tag) ? closeSelectedTag(tag) : ''" |
| | | @contextmenu.prevent="openMenu(tag, $event)" |
| | | > |
| | | {{ tag.title }} |
| | | <span v-if="!isAffix(tag)" @click.prevent.stop="closeSelectedTag(tag)"> |
| | | <close class="el-icon-close" style="width: 1em; height: 1em;vertical-align: middle;" /> |
| | | </span> |
| | | </router-link> |
| | | </scroll-pane> |
| | | <ul v-show="visible" :style="{ left: left + 'px', top: top + 'px' }" class="contextmenu"> |
| | | <li @click="refreshSelectedTag(selectedTag)"><refresh-right style="width: 1em; height: 1em;" /> å·æ°é¡µé¢</li> |
| | | <li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)"><close style="width: 1em; height: 1em;" /> å
³éå½å</li> |
| | | <li @click="closeOthersTags"><circle-close style="width: 1em; height: 1em;" /> å
³éå
¶ä»</li> |
| | | <li v-if="!isFirstView()" @click="closeLeftTags"><back style="width: 1em; height: 1em;" /> å
³é左侧</li> |
| | | <li v-if="!isLastView()" @click="closeRightTags"><right style="width: 1em; height: 1em;" /> å
³éå³ä¾§</li> |
| | | <li @click="closeAllTags(selectedTag)"><circle-close style="width: 1em; height: 1em;" /> å
¨é¨å
³é</li> |
| | | </ul> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import ScrollPane from './ScrollPane.vue' |
| | | import { getNormalPath } from '@/utils/ruoyi' |
| | |
| | | addTags(); |
| | | }) |
| | | </script> |
| | | |
| | | <template> |
| | | <div id="tags-view-container" class="tags-view-container"> |
| | | <scroll-pane ref="scrollPaneRef" class="tags-view-wrapper" @scroll="handleScroll"> |
| | | <router-link |
| | | v-for="tag in visitedViews" |
| | | :key="tag.path" |
| | | :data-path="tag.path" |
| | | :class="isActive(tag) ? 'active' : ''" |
| | | :to="{ path: tag.path ? tag.path : '', query: tag.query, fullPath: tag.fullPath ? tag.fullPath : '' }" |
| | | class="tags-view-item" |
| | | :style="activeStyle(tag)" |
| | | @click.middle="!isAffix(tag) ? closeSelectedTag(tag) : ''" |
| | | @contextmenu.prevent="openMenu(tag, $event)" |
| | | > |
| | | {{ tag.title }} |
| | | <span v-if="!isAffix(tag)" @click.prevent.stop="closeSelectedTag(tag)"> |
| | | <close class="el-icon-close" style="width: 1em; height: 1em;vertical-align: middle;" /> |
| | | </span> |
| | | </router-link> |
| | | </scroll-pane> |
| | | <ul v-show="visible" :style="{ left: left + 'px', top: top + 'px' }" class="contextmenu"> |
| | | <li @click="refreshSelectedTag(selectedTag)"><refresh-right style="width: 1em; height: 1em;" /> å·æ°é¡µé¢</li> |
| | | <li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)"><close style="width: 1em; height: 1em;" /> å
³éå½å</li> |
| | | <li @click="closeOthersTags"><circle-close style="width: 1em; height: 1em;" /> å
³éå
¶ä»</li> |
| | | <li v-if="!isFirstView()" @click="closeLeftTags"><back style="width: 1em; height: 1em;" /> å
³é左侧</li> |
| | | <li v-if="!isLastView()" @click="closeRightTags"><right style="width: 1em; height: 1em;" /> å
³éå³ä¾§</li> |
| | | <li @click="closeAllTags(selectedTag)"><circle-close style="width: 1em; height: 1em;" /> å
¨é¨å
³é</li> |
| | | </ul> |
| | | </div> |
| | | </template> |
| | | |
| | | <style lang="scss" scoped> |
| | | .tags-view-container { |
| | |
| | | export {} |
| | | declare global { |
| | | const EffectScope: typeof import('vue')['EffectScope'] |
| | | const ElForm: typeof import('element-plus/es')['ElForm'] |
| | | const ElLoading: typeof import('element-plus/es')['ElLoading'] |
| | | const ElMessage: typeof import('element-plus/es')['ElMessage'] |
| | | const ElMessageBox: typeof import('element-plus/es')['ElMessageBox'] |
| | | const ElNotification: typeof import('element-plus/es')['ElNotification'] |
| | | const ElSelect: typeof import('element-plus/es')['ElSelect'] |
| | | const ElTable: typeof import('element-plus/es')['ElTable'] |
| | | const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate'] |
| | | const asyncComputed: typeof import('@vueuse/core')['asyncComputed'] |
| | | const autoResetRef: typeof import('@vueuse/core')['autoResetRef'] |
| | |
| | | declare module 'vue' { |
| | | interface ComponentCustomProperties { |
| | | readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']> |
| | | readonly ElForm: UnwrapRef<typeof import('element-plus/es')['ElForm']> |
| | | readonly ElLoading: UnwrapRef<typeof import('element-plus/es')['ElLoading']> |
| | | readonly ElMessage: UnwrapRef<typeof import('element-plus/es')['ElMessage']> |
| | | readonly ElMessageBox: UnwrapRef<typeof import('element-plus/es')['ElMessageBox']> |
| | | readonly ElNotification: UnwrapRef<typeof import('element-plus/es')['ElNotification']> |
| | | readonly ElSelect: UnwrapRef<typeof import('element-plus/es')['ElSelect']> |
| | | readonly ElTable: UnwrapRef<typeof import('element-plus/es')['ElTable']> |
| | | readonly acceptHMRUpdate: UnwrapRef<typeof import('pinia')['acceptHMRUpdate']> |
| | | readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']> |
| | | readonly autoResetRef: UnwrapRef<typeof import('@vueuse/core')['autoResetRef']> |
| | |
| | | ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem'] |
| | | ElButton: typeof import('element-plus/es')['ElButton'] |
| | | ElCard: typeof import('element-plus/es')['ElCard'] |
| | | ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] |
| | | ElCol: typeof import('element-plus/es')['ElCol'] |
| | | ElColorPicker: typeof import('element-plus/es')['ElColorPicker'] |
| | | ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider'] |
| | |
| | | ElDropdown: typeof import('element-plus/es')['ElDropdown'] |
| | | ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] |
| | | ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'] |
| | | ElForm: typeof import('element-plus/es')['ElForm'] |
| | | ElFormItem: typeof import('element-plus/es')['ElFormItem'] |
| | | ElIcon: typeof import('element-plus/es')['ElIcon'] |
| | | ElImage: typeof import('element-plus/es')['ElImage'] |
| | | ElInput: typeof import('element-plus/es')['ElInput'] |
| | | ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] |
| | | ElLink: typeof import('element-plus/es')['ElLink'] |
| | | ElMenu: typeof import('element-plus/es')['ElMenu'] |
| | | ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] |
| | | ElOption: typeof import('element-plus/es')['ElOption'] |
| | | ElPagination: typeof import('element-plus/es')['ElPagination'] |
| | | ElPopover: typeof import('element-plus/es')['ElPopover'] |
| | | ElRadio: typeof import('element-plus/es')['ElRadio'] |
| | | ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] |
| | | ElRow: typeof import('element-plus/es')['ElRow'] |
| | | ElScrollbar: typeof import('element-plus/es')['ElScrollbar'] |
| | | ElSelect: typeof import('element-plus/es')['ElSelect'] |
| | | ElSubMenu: typeof import('element-plus/es')['ElSubMenu'] |
| | | ElSwitch: typeof import('element-plus/es')['ElSwitch'] |
| | | ElTable: typeof import('element-plus/es')['ElTable'] |
| | | ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] |
| | | ElTabPane: typeof import('element-plus/es')['ElTabPane'] |
| | | ElTabs: typeof import('element-plus/es')['ElTabs'] |
| | | ElTag: typeof import('element-plus/es')['ElTag'] |
| | | ElTooltip: typeof import('element-plus/es')['ElTooltip'] |
| | | ElTransfer: typeof import('element-plus/es')['ElTransfer'] |
| | | ElTree: typeof import('element-plus/es')['ElTree'] |
| | | ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect'] |
| | | ElUpload: typeof import('element-plus/es')['ElUpload'] |
| | | FileUpload: typeof import('./../components/FileUpload/index.vue')['default'] |
| | | Hamburger: typeof import('./../components/Hamburger/index.vue')['default'] |
| | | HeaderSearch: typeof import('./../components/HeaderSearch/index.vue')['default'] |
| | | IconSelect: typeof import('./../components/IconSelect/index.vue')['default'] |
| | | IEpCaretBottom: typeof import('~icons/ep/caret-bottom')['default'] |
| | | IEpCaretTop: typeof import('~icons/ep/caret-top')['default'] |
| | | IEpUploadFilled: typeof import('~icons/ep/upload-filled')['default'] |
| | | IFrame: typeof import('./../components/iFrame/index.vue')['default'] |
| | | ImagePreview: typeof import('./../components/ImagePreview/index.vue')['default'] |
| | | ImageUpload: typeof import('./../components/ImageUpload/index.vue')['default'] |
| | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="keyé®" prop="testKey"> |
| | | <el-input v-model="queryParams.testKey" placeholder="请è¾å
¥keyé®" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="å¼" prop="value"> |
| | | <el-input v-model="queryParams.value" placeholder="请è¾å
¥å¼" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´"> |
| | | <el-date-picker |
| | | v-model="daterangeCreateTime" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button type="primary" icon="search" @click="handlePage">æç´¢(èªå®ä¹å页æ¥å£)</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['demo:demo:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['demo:demo:edit']">ä¿®æ¹</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['demo:demo:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="info" plain icon="Upload" @click="handleImport" v-hasPermi="['demo:demo:import']">导å
¥(æ ¡éª)</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['demo:demo:export']">导åº</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="demoList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="主é®" align="center" prop="id" v-if="columns[0].visible" /> |
| | | <el-table-column label="é¨é¨id" align="center" prop="deptId" v-if="columns[1].visible" /> |
| | | <el-table-column label="ç¨æ·id" align="center" prop="userId" v-if="columns[2].visible" /> |
| | | <el-table-column label="æåºå·" align="center" prop="orderNum" v-if="columns[3].visible" /> |
| | | <el-table-column label="keyé®" align="center" prop="testKey" v-if="columns[4].visible" /> |
| | | <el-table-column label="å¼" align="center" prop="value" v-if="columns[5].visible" /> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" v-if="columns[6].visible" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å建人" align="center" prop="createByName" v-if="columns[7].visible" /> |
| | | <el-table-column label="æ´æ°æ¶é´" align="center" prop="updateTime" v-if="columns[8].visible" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æ´æ°äºº" align="center" prop="updateByName" v-if="columns[9].visible" /> |
| | | <el-table-column label="æä½" fixed="right" align="center" width="150" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['demo:demo:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['demo:demo:remove']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | |
| | | <!-- æ·»å æä¿®æ¹æµè¯åè¡¨å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
| | | <el-form ref="demoFormRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-form-item label="é¨é¨id" prop="deptId"> |
| | | <el-input v-model="form.deptId" placeholder="请è¾å
¥é¨é¨id" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¨æ·id" prop="userId"> |
| | | <el-input v-model="form.userId" placeholder="请è¾å
¥ç¨æ·id" /> |
| | | </el-form-item> |
| | | <el-form-item label="æåºå·" prop="orderNum"> |
| | | <el-input v-model="form.orderNum" placeholder="请è¾å
¥æåºå·" /> |
| | | </el-form-item> |
| | | <el-form-item label="keyé®" prop="testKey"> |
| | | <el-input v-model="form.testKey" placeholder="请è¾å
¥keyé®" /> |
| | | </el-form-item> |
| | | <el-form-item label="å¼" prop="value"> |
| | | <el-input v-model="form.value" placeholder="请è¾å
¥å¼" /> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´" prop="createTime"> |
| | | <el-date-picker clearable v-model="form.createTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="éæ©å建æ¶é´"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button :loading="buttonLoading" type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | <!-- ç¨æ·å¯¼å
¥å¯¹è¯æ¡ --> |
| | | <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body> |
| | | <el-upload |
| | | ref="uploadRef" |
| | | :limit="1" |
| | | accept=".xlsx, .xls" |
| | | :headers="upload.headers" |
| | | :action="upload.url + '?updateSupport=' + upload.updateSupport" |
| | | :disabled="upload.isUploading" |
| | | :on-progress="handleFileUploadProgress" |
| | | :on-success="handleFileSuccess" |
| | | :auto-upload="false" |
| | | drag |
| | | > |
| | | <i class="el-icon-upload"></i> |
| | | <div class="el-upload__text">å°æä»¶æå°æ¤å¤ï¼æ<em>ç¹å»ä¸ä¼ </em></div> |
| | | </el-upload> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitFileForm">ç¡® å®</el-button> |
| | | <el-button @click="upload.open = false">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="Demo" lang="ts"> |
| | | import { listDemo, pageDemo, getDemo, delDemo, addDemo, updateDemo } from "@/api/demo/demo"; |
| | | import { getToken } from "@/utils/auth"; |
| | |
| | | getPage() |
| | | }) |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="keyé®" prop="testKey"> |
| | | <el-input v-model="queryParams.testKey" placeholder="请è¾å
¥keyé®" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="å¼" prop="value"> |
| | | <el-input v-model="queryParams.value" placeholder="请è¾å
¥å¼" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´"> |
| | | <el-date-picker |
| | | v-model="daterangeCreateTime" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button type="primary" icon="search" @click="handlePage">æç´¢(èªå®ä¹å页æ¥å£)</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['demo:demo:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['demo:demo:edit']">ä¿®æ¹</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['demo:demo:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="info" plain icon="Upload" @click="handleImport" v-hasPermi="['demo:demo:import']">导å
¥(æ ¡éª)</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['demo:demo:export']">导åº</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="demoList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="主é®" align="center" prop="id" v-if="columns[0].visible" /> |
| | | <el-table-column label="é¨é¨id" align="center" prop="deptId" v-if="columns[1].visible" /> |
| | | <el-table-column label="ç¨æ·id" align="center" prop="userId" v-if="columns[2].visible" /> |
| | | <el-table-column label="æåºå·" align="center" prop="orderNum" v-if="columns[3].visible" /> |
| | | <el-table-column label="keyé®" align="center" prop="testKey" v-if="columns[4].visible" /> |
| | | <el-table-column label="å¼" align="center" prop="value" v-if="columns[5].visible" /> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" v-if="columns[6].visible" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å建人" align="center" prop="createByName" v-if="columns[7].visible" /> |
| | | <el-table-column label="æ´æ°æ¶é´" align="center" prop="updateTime" v-if="columns[8].visible" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æ´æ°äºº" align="center" prop="updateByName" v-if="columns[9].visible" /> |
| | | <el-table-column label="æä½" fixed="right" align="center" width="150" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['demo:demo:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['demo:demo:remove']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | |
| | | <!-- æ·»å æä¿®æ¹æµè¯åè¡¨å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
| | | <el-form ref="demoFormRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-form-item label="é¨é¨id" prop="deptId"> |
| | | <el-input v-model="form.deptId" placeholder="请è¾å
¥é¨é¨id" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¨æ·id" prop="userId"> |
| | | <el-input v-model="form.userId" placeholder="请è¾å
¥ç¨æ·id" /> |
| | | </el-form-item> |
| | | <el-form-item label="æåºå·" prop="orderNum"> |
| | | <el-input v-model="form.orderNum" placeholder="请è¾å
¥æåºå·" /> |
| | | </el-form-item> |
| | | <el-form-item label="keyé®" prop="testKey"> |
| | | <el-input v-model="form.testKey" placeholder="请è¾å
¥keyé®" /> |
| | | </el-form-item> |
| | | <el-form-item label="å¼" prop="value"> |
| | | <el-input v-model="form.value" placeholder="请è¾å
¥å¼" /> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´" prop="createTime"> |
| | | <el-date-picker clearable v-model="form.createTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="éæ©å建æ¶é´"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button :loading="buttonLoading" type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | <!-- ç¨æ·å¯¼å
¥å¯¹è¯æ¡ --> |
| | | <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body> |
| | | <el-upload |
| | | ref="uploadRef" |
| | | :limit="1" |
| | | accept=".xlsx, .xls" |
| | | :headers="upload.headers" |
| | | :action="upload.url + '?updateSupport=' + upload.updateSupport" |
| | | :disabled="upload.isUploading" |
| | | :on-progress="handleFileUploadProgress" |
| | | :on-success="handleFileSuccess" |
| | | :auto-upload="false" |
| | | drag |
| | | > |
| | | <i class="el-icon-upload"></i> |
| | | <div class="el-upload__text">å°æä»¶æå°æ¤å¤ï¼æ<em>ç¹å»ä¸ä¼ </em></div> |
| | | </el-upload> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitFileForm">ç¡® å®</el-button> |
| | | <el-button @click="upload.open = false">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="qeuryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="æ èç¹å" prop="treeName"> |
| | | <el-input v-model="queryParams.treeName" placeholder="请è¾å
¥æ èç¹å" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´"> |
| | | <el-date-picker |
| | | v-model="daterangeCreateTime" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd()" v-hasPermi="['demo:tree:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">å±å¼/æå </el-button> |
| | | </el-col> |
| | | <right-toolbar :columns="columns" v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table |
| | | v-if="refreshTable" |
| | | v-loading="loading" |
| | | :data="treeList" |
| | | row-key="id" |
| | | :default-expand-all="isExpandAll" |
| | | :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" |
| | | ref="demoTreeTableRef" |
| | | > |
| | | <el-table-column label="ç¶id" prop="parentId" v-if="columns[0].visible" /> |
| | | <el-table-column label="é¨é¨id" align="center" prop="deptId" v-if="columns[1].visible" /> |
| | | <el-table-column label="ç¨æ·id" align="center" prop="userId" v-if="columns[2].visible" /> |
| | | <el-table-column label="æ èç¹å" align="center" prop="treeName" v-if="columns[3].visible" /> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" v-if="columns[4].visible" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" fixed="right" align="center" width="150" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['demo:tree:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="æ°å¢" placement="top"> |
| | | <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['demo:tree:add']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['demo:tree:remove']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | |
| | | <!-- æ·»å æä¿®æ¹æµè¯æ è¡¨å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
| | | <el-form ref="treeRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-form-item label="ç¶id" prop="parentId"> |
| | | <el-tree-select |
| | | v-model="form.parentId" |
| | | :data="treeOptions" |
| | | :props="{ value: 'id', label: 'treeName', children: 'children' }" |
| | | value-key="id" |
| | | check-strictly |
| | | placeholder="è¯·éæ©ç¶id" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="é¨é¨id" prop="deptId"> |
| | | <el-input v-model="form.deptId" placeholder="请è¾å
¥é¨é¨id" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¨æ·id" prop="userId"> |
| | | <el-input v-model="form.userId" placeholder="请è¾å
¥ç¨æ·id" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ èç¹å" prop="treeName"> |
| | | <el-input v-model="form.treeName" placeholder="请è¾å
¥æ èç¹å" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button :loading="buttonLoading" type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="Tree" lang="ts"> |
| | | import { listTree, getTree, delTree, addTree, updateTree } from '@/api/demo/tree'; |
| | | import { DemoTreeVO, DemoTreeForm, DemoTreeOptionsType, DemoTreeQuery } from '@/api/demo/types'; |
| | |
| | | getList() |
| | | }) |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="qeuryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="æ èç¹å" prop="treeName"> |
| | | <el-input v-model="queryParams.treeName" placeholder="请è¾å
¥æ èç¹å" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´"> |
| | | <el-date-picker |
| | | v-model="daterangeCreateTime" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd()" v-hasPermi="['demo:tree:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">å±å¼/æå </el-button> |
| | | </el-col> |
| | | <right-toolbar :columns="columns" v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table |
| | | v-if="refreshTable" |
| | | v-loading="loading" |
| | | :data="treeList" |
| | | row-key="id" |
| | | :default-expand-all="isExpandAll" |
| | | :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" |
| | | ref="demoTreeTableRef" |
| | | > |
| | | <el-table-column label="ç¶id" prop="parentId" v-if="columns[0].visible" /> |
| | | <el-table-column label="é¨é¨id" align="center" prop="deptId" v-if="columns[1].visible" /> |
| | | <el-table-column label="ç¨æ·id" align="center" prop="userId" v-if="columns[2].visible" /> |
| | | <el-table-column label="æ èç¹å" align="center" prop="treeName" v-if="columns[3].visible" /> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" v-if="columns[4].visible" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" fixed="right" align="center" width="150" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['demo:tree:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="æ°å¢" placement="top"> |
| | | <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['demo:tree:add']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['demo:tree:remove']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | |
| | | <!-- æ·»å æä¿®æ¹æµè¯æ è¡¨å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
| | | <el-form ref="treeRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-form-item label="ç¶id" prop="parentId"> |
| | | <el-tree-select |
| | | v-model="form.parentId" |
| | | :data="treeOptions" |
| | | :props="{ value: 'id', label: 'treeName', children: 'children' }" |
| | | value-key="id" |
| | | check-strictly |
| | | placeholder="è¯·éæ©ç¶id" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="é¨é¨id" prop="deptId"> |
| | | <el-input v-model="form.deptId" placeholder="请è¾å
¥é¨é¨id" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¨æ·id" prop="userId"> |
| | | <el-input v-model="form.userId" placeholder="请è¾å
¥ç¨æ·id" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ èç¹å" prop="treeName"> |
| | | <el-input v-model="form.treeName" placeholder="请è¾å
¥æ èç¹å" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button :loading="buttonLoading" type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | |
| | | <template> |
| | | <div class="login"> |
| | | <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form"> |
| | | <h3 class="title">RuoYi-Vue-Pluså¤ç§æ·ç®¡çç³»ç»</h3> |
| | | <el-form-item prop="tenantId" v-if="tenantEnabled"> |
| | | <el-select v-model="loginForm.tenantId" filterable placeholder="è¯·éæ©/è¾å
¥å
¬å¸åç§°" style="width: 100%"> |
| | | <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"> </el-option> |
| | | <template #prefix><svg-icon icon-class="company" class="el-input__icon input-icon" /></template> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item prop="username"> |
| | | <el-input v-model="loginForm.username" type="text" size="large" auto-complete="off" placeholder="è´¦å·"> |
| | | <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item prop="password"> |
| | | <el-input v-model="loginForm.password" type="password" size="large" auto-complete="off" placeholder="å¯ç " @keyup.enter="handleLogin"> |
| | | <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item prop="code" v-if="captchaEnabled"> |
| | | <el-input v-model="loginForm.code" size="large" auto-complete="off" placeholder="éªè¯ç " style="width: 63%" @keyup.enter="handleLogin"> |
| | | <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template> |
| | | </el-input> |
| | | <div class="login-code"> |
| | | <img :src="codeUrl" @click="getCode" class="login-code-img" /> |
| | | </div> |
| | | </el-form-item> |
| | | <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">è®°ä½å¯ç </el-checkbox> |
| | | <el-form-item style="width:100%;"> |
| | | <el-button :loading="loading" size="large" type="primary" style="width:100%;" @click.prevent="handleLogin"> |
| | | <span v-if="!loading">ç» å½</span> |
| | | <span v-else>ç» å½ ä¸...</span> |
| | | </el-button> |
| | | <div style="float: right;" v-if="register"> |
| | | <router-link class="link-type" :to="'/register'">ç«å³æ³¨å</router-link> |
| | | </div> |
| | | </el-form-item> |
| | | </el-form> |
| | | <!-- åºé¨ --> |
| | | <div class="el-login-footer"> |
| | | <span>Copyright © 2018-2023 ç¯ççç®åLi All Rights Reserved.</span> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { getCodeImg, getTenantList } from '@/api/login'; |
| | | import Cookies from 'js-cookie'; |
| | |
| | | getCookie(); |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="login"> |
| | | <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form"> |
| | | <h3 class="title">RuoYi-Vue-Pluså¤ç§æ·ç®¡çç³»ç»</h3> |
| | | <el-form-item prop="tenantId" v-if="tenantEnabled"> |
| | | <el-select v-model="loginForm.tenantId" filterable placeholder="è¯·éæ©/è¾å
¥å
¬å¸åç§°" style="width: 100%"> |
| | | <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"> </el-option> |
| | | <template #prefix><svg-icon icon-class="company" class="el-input__icon input-icon" /></template> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item prop="username"> |
| | | <el-input v-model="loginForm.username" type="text" size="large" auto-complete="off" placeholder="è´¦å·"> |
| | | <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item prop="password"> |
| | | <el-input v-model="loginForm.password" type="password" size="large" auto-complete="off" placeholder="å¯ç " @keyup.enter="handleLogin"> |
| | | <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item prop="code" v-if="captchaEnabled"> |
| | | <el-input v-model="loginForm.code" size="large" auto-complete="off" placeholder="éªè¯ç " style="width: 63%" @keyup.enter="handleLogin"> |
| | | <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template> |
| | | </el-input> |
| | | <div class="login-code"> |
| | | <img :src="codeUrl" @click="getCode" class="login-code-img" /> |
| | | </div> |
| | | </el-form-item> |
| | | <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">è®°ä½å¯ç </el-checkbox> |
| | | <el-form-item style="width:100%;"> |
| | | <el-button :loading="loading" size="large" type="primary" style="width:100%;" @click.prevent="handleLogin"> |
| | | <span v-if="!loading">ç» å½</span> |
| | | <span v-else>ç» å½ ä¸...</span> |
| | | </el-button> |
| | | <div style="float: right;" v-if="register"> |
| | | <router-link class="link-type" :to="'/register'">ç«å³æ³¨å</router-link> |
| | | </div> |
| | | </el-form-item> |
| | | </el-form> |
| | | <!-- åºé¨ --> |
| | | <div class="el-login-footer"> |
| | | <span>Copyright © 2018-2023 ç¯ççç®åLi All Rights Reserved.</span> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <style lang="scss" scoped> |
| | | .login { |
| | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="ç»å½å°å" prop="ipaddr"> |
| | | <el-input v-model="queryParams.ipaddr" placeholder="请è¾å
¥ç»å½å°å" clearable style="width: 240px;" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¨æ·åç§°" prop="userName"> |
| | | <el-input v-model="queryParams.userName" placeholder="请è¾å
¥ç¨æ·åç§°" clearable style="width: 240px;" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="ç»å½ç¶æ" clearable style="width: 240px"> |
| | | <el-option v-for="dict in sys_common_status" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="ç»å½æ¶é´" style="width: 308px"> |
| | | <el-date-picker |
| | | v-model="dateRange" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['monitor:logininfor:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" @click="handleClean" v-hasPermi="['monitor:logininfor:remove']">æ¸
空</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Unlock" :disabled="single" @click="handleUnlock" v-hasPermi="['monitor:logininfor:unlock']"> |
| | | è§£é |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['monitor:logininfor:export']">导åº</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table |
| | | ref="loginInfoTableRef" |
| | | v-loading="loading" |
| | | :data="loginInfoList" |
| | | @selection-change="handleSelectionChange" |
| | | :default-sort="defaultSort" |
| | | @sort-change="handleSortChange" |
| | | > |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="访é®ç¼å·" align="center" prop="infoId" /> |
| | | <el-table-column |
| | | label="ç¨æ·åç§°" |
| | | align="center" |
| | | prop="userName" |
| | | :show-overflow-tooltip="true" |
| | | sortable="custom" |
| | | :sort-orders="['descending', 'ascending']" |
| | | /> |
| | | <el-table-column label="å°å" align="center" prop="ipaddr" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="ç»å½å°ç¹" align="center" prop="loginLocation" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="æä½ç³»ç»" align="center" prop="os" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="æµè§å¨" align="center" prop="browser" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="ç»å½ç¶æ" align="center" prop="status"> |
| | | <template #default="scope"> |
| | | <dict-tag :options="sys_common_status" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æè¿°" align="center" prop="msg" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="è®¿é®æ¶é´" align="center" prop="loginTime" sortable="custom" :sort-orders="['descending', 'ascending']" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.loginTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="Logininfor" lang="ts"> |
| | | import { list, delLoginInfo, cleanLoginInfo, unlockLoginInfo } from "@/api/monitor/loginInfo"; |
| | | import { ComponentInternalInstance } from "vue"; |
| | |
| | | getList(); |
| | | }) |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="ç»å½å°å" prop="ipaddr"> |
| | | <el-input v-model="queryParams.ipaddr" placeholder="请è¾å
¥ç»å½å°å" clearable style="width: 240px;" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¨æ·åç§°" prop="userName"> |
| | | <el-input v-model="queryParams.userName" placeholder="请è¾å
¥ç¨æ·åç§°" clearable style="width: 240px;" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="ç»å½ç¶æ" clearable style="width: 240px"> |
| | | <el-option v-for="dict in sys_common_status" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="ç»å½æ¶é´" style="width: 308px"> |
| | | <el-date-picker |
| | | v-model="dateRange" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['monitor:logininfor:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" @click="handleClean" v-hasPermi="['monitor:logininfor:remove']">æ¸
空</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Unlock" :disabled="single" @click="handleUnlock" v-hasPermi="['monitor:logininfor:unlock']"> |
| | | è§£é |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['monitor:logininfor:export']">导åº</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table |
| | | ref="loginInfoTableRef" |
| | | v-loading="loading" |
| | | :data="loginInfoList" |
| | | @selection-change="handleSelectionChange" |
| | | :default-sort="defaultSort" |
| | | @sort-change="handleSortChange" |
| | | > |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="访é®ç¼å·" align="center" prop="infoId" /> |
| | | <el-table-column |
| | | label="ç¨æ·åç§°" |
| | | align="center" |
| | | prop="userName" |
| | | :show-overflow-tooltip="true" |
| | | sortable="custom" |
| | | :sort-orders="['descending', 'ascending']" |
| | | /> |
| | | <el-table-column label="å°å" align="center" prop="ipaddr" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="ç»å½å°ç¹" align="center" prop="loginLocation" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="æä½ç³»ç»" align="center" prop="os" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="æµè§å¨" align="center" prop="browser" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="ç»å½ç¶æ" align="center" prop="status"> |
| | | <template #default="scope"> |
| | | <dict-tag :options="sys_common_status" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æè¿°" align="center" prop="msg" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="è®¿é®æ¶é´" align="center" prop="loginTime" sortable="custom" :sort-orders="['descending', 'ascending']" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.loginTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | </div> |
| | | </template> |
| | |
| | | <script setup name="Online" lang="ts"> |
| | | import { forceLogout, list as initData } from "@/api/monitor/online"; |
| | | import { ComponentInternalInstance } from "vue"; |
| | | import { OnlineQuery, OnlineVO } from "@/api/monitor/online/types"; |
| | | |
| | | const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
| | | |
| | | const onlineList = ref<OnlineVO[]>([]); |
| | | const loading = ref(true); |
| | | const total = ref(0); |
| | | |
| | | const queryFormRef = ref(ElForm); |
| | | |
| | | const queryParams = ref<OnlineQuery>({ |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | ipaddr: '', |
| | | userName: '' |
| | | }); |
| | | |
| | | /** æ¥è¯¢ç»å½æ¥å¿å表 */ |
| | | const getList = async () => { |
| | | loading.value = true; |
| | | const res = await initData(queryParams.value); |
| | | onlineList.value = res.rows; |
| | | total.value = res.total; |
| | | loading.value = false; |
| | | } |
| | | /** æç´¢æé®æä½ */ |
| | | const handleQuery = () => { |
| | | queryParams.value.pageNum = 1; |
| | | getList(); |
| | | } |
| | | /** éç½®æé®æä½ */ |
| | | const resetQuery = () => { |
| | | queryFormRef.value.resetFields(); |
| | | handleQuery(); |
| | | } |
| | | /** 强éæé®æä½ */ |
| | | const handleForceLogout = async (row: OnlineVO) => { |
| | | await proxy?.$modal.confirm('æ¯å¦ç¡®è®¤å¼ºéå称为"' + row.userName + '"çç¨æ·?'); |
| | | await forceLogout(row.tokenId); |
| | | getList(); |
| | | proxy?.$modal.msgSuccess("å 餿å"); |
| | | } |
| | | |
| | | onMounted(() => { |
| | | getList(); |
| | | }) |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="p-2"> |
| | | <div class="search"> |
| | |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="Online" lang="ts"> |
| | | import { forceLogout, list as initData } from "@/api/monitor/online"; |
| | | import { ComponentInternalInstance } from "vue"; |
| | | import { OnlineQuery, OnlineVO } from "@/api/monitor/online/types"; |
| | | |
| | | const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
| | | |
| | | const onlineList = ref<OnlineVO[]>([]); |
| | | const loading = ref(true); |
| | | const total = ref(0); |
| | | |
| | | const queryFormRef = ref(ElForm); |
| | | |
| | | const queryParams = ref<OnlineQuery>({ |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | ipaddr: '', |
| | | userName: '' |
| | | }); |
| | | |
| | | /** æ¥è¯¢ç»å½æ¥å¿å表 */ |
| | | const getList = async () => { |
| | | loading.value = true; |
| | | const res = await initData(queryParams.value); |
| | | onlineList.value = res.rows; |
| | | total.value = res.total; |
| | | loading.value = false; |
| | | } |
| | | /** æç´¢æé®æä½ */ |
| | | const handleQuery = () => { |
| | | queryParams.value.pageNum = 1; |
| | | getList(); |
| | | } |
| | | /** éç½®æé®æä½ */ |
| | | const resetQuery = () => { |
| | | queryFormRef.value.resetFields(); |
| | | handleQuery(); |
| | | } |
| | | /** 强éæé®æä½ */ |
| | | const handleForceLogout = async (row: OnlineVO) => { |
| | | await proxy?.$modal.confirm('æ¯å¦ç¡®è®¤å¼ºéå称为"' + row.userName + '"çç¨æ·?'); |
| | | await forceLogout(row.tokenId); |
| | | getList(); |
| | | proxy?.$modal.msgSuccess("å 餿å"); |
| | | } |
| | | |
| | | onMounted(() => { |
| | | getList(); |
| | | }) |
| | | </script> |
| | |
| | | <script setup name="Operlog" lang="ts"> |
| | | import { list, delOperlog, cleanOperlog } from '@/api/monitor/operlog'; |
| | | import { ComponentInternalInstance } from 'vue'; |
| | | import { OperLogForm, OperLogQuery, OperLogVO } from '@/api/monitor/operlog/types'; |
| | | import { DateModelType } from 'element-plus'; |
| | | |
| | | const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
| | | const { sys_oper_type, sys_common_status } = toRefs<any>(proxy?.useDict("sys_oper_type","sys_common_status")); |
| | | |
| | | const operlogList = ref<OperLogVO[]>([]); |
| | | const loading = ref(true); |
| | | const showSearch = ref(true); |
| | | const ids = ref<Array<number | string>>([]); |
| | | const multiple = ref(true); |
| | | const total = ref(0); |
| | | const dateRange = ref<[DateModelType, DateModelType]>(['', '']); |
| | | const defaultSort = ref<any>({ prop: "operTime", order: "descending" }); |
| | | |
| | | const operLogTableRef = ref(ElTable); |
| | | const queryFormRef = ref(ElForm); |
| | | |
| | | const dialog = reactive<DialogOption>({ |
| | | visible: false, |
| | | title: '' |
| | | }); |
| | | |
| | | |
| | | const data = reactive<PageData<OperLogForm, OperLogQuery>>({ |
| | | form: { |
| | | operId: undefined, |
| | | tenantId: undefined, |
| | | title: '', |
| | | businessType: 0, |
| | | businessTypes: undefined, |
| | | method: '', |
| | | requestMethod: '', |
| | | operatorType: 0, |
| | | operName: '', |
| | | deptName: '', |
| | | operUrl: '', |
| | | operIp: '', |
| | | operLocation: '', |
| | | operParam: '', |
| | | jsonResult: '', |
| | | status: 0, |
| | | errorMsg: '', |
| | | operTime: '', |
| | | costTime: 0 |
| | | }, |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | title: '', |
| | | operName: '', |
| | | businessType: '', |
| | | status: '', |
| | | orderByColumn: defaultSort.value.prop, |
| | | isAsc: defaultSort.value.order |
| | | }, |
| | | rules: {} |
| | | }); |
| | | |
| | | const { queryParams, form } = toRefs(data); |
| | | |
| | | /** æ¥è¯¢ç»å½æ¥å¿ */ |
| | | const getList = async () => { |
| | | loading.value = true; |
| | | const res = await list(proxy?.addDateRange(queryParams.value, dateRange.value)); |
| | | operlogList.value = res.rows; |
| | | total.value = res.total; |
| | | loading.value = false; |
| | | } |
| | | /** æä½æ¥å¿ç±»ååå
¸ç¿»è¯ */ |
| | | const typeFormat = (row: OperLogForm) => { |
| | | return proxy?.selectDictLabel(sys_oper_type.value, row.businessType); |
| | | } |
| | | /** æç´¢æé®æä½ */ |
| | | const handleQuery = () => { |
| | | queryParams.value.pageNum = 1; |
| | | getList(); |
| | | } |
| | | /** éç½®æé®æä½ */ |
| | | const resetQuery = () => { |
| | | dateRange.value = ['', '']; |
| | | queryFormRef.value.resetFields(); |
| | | queryParams.value.pageNum = 1; |
| | | operLogTableRef.value.sort(defaultSort.value.prop, defaultSort.value.order); |
| | | } |
| | | /** å¤éæ¡é䏿°æ® */ |
| | | const handleSelectionChange = (selection: OperLogVO[]) => { |
| | | ids.value = selection.map(item => item.operId); |
| | | multiple.value = !selection.length; |
| | | } |
| | | /** æåºè§¦åäºä»¶ */ |
| | | const handleSortChange = (column: any) => { |
| | | queryParams.value.orderByColumn = column.prop; |
| | | queryParams.value.isAsc = column.order; |
| | | getList(); |
| | | } |
| | | /** è¯¦ç»æé®æä½ */ |
| | | const handleView = (row: OperLogVO) => { |
| | | dialog.visible = true; |
| | | form.value = row; |
| | | } |
| | | /** å é¤æé®æä½ */ |
| | | const handleDelete = async (row?: OperLogVO) => { |
| | | const operIds = row?.operId || ids.value; |
| | | await proxy?.$modal.confirm('æ¯å¦ç¡®è®¤å 餿¥å¿ç¼å·ä¸º"' + operIds + '"çæ°æ®é¡¹?'); |
| | | await delOperlog(operIds); |
| | | getList(); |
| | | proxy?.$modal.msgSuccess("å 餿å"); |
| | | } |
| | | |
| | | /** æ¸
空æé®æä½ */ |
| | | const handleClean = async () => { |
| | | await proxy?.$modal.confirm("æ¯å¦ç¡®è®¤æ¸
ç©ºæææä½æ¥å¿æ°æ®é¡¹?"); |
| | | await cleanOperlog(); |
| | | getList(); |
| | | proxy?.$modal.msgSuccess("æ¸
空æå"); |
| | | } |
| | | |
| | | /** å¯¼åºæé®æä½ */ |
| | | const handleExport = () => { |
| | | proxy?.download("monitor/operlog/export", { |
| | | ...queryParams.value, |
| | | }, `config_${new Date().getTime()}.xlsx`); |
| | | } |
| | | onMounted(() => { |
| | | getList(); |
| | | }) |
| | | </script> |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="Operlog" lang="ts"> |
| | | import { list, delOperlog, cleanOperlog } from '@/api/monitor/operlog'; |
| | | import { ComponentInternalInstance } from 'vue'; |
| | | import { OperLogForm, OperLogQuery, OperLogVO } from '@/api/monitor/operlog/types'; |
| | | import { DateModelType } from 'element-plus'; |
| | | |
| | | const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
| | | const { sys_oper_type, sys_common_status } = toRefs<any>(proxy?.useDict("sys_oper_type","sys_common_status")); |
| | | |
| | | const operlogList = ref<OperLogVO[]>([]); |
| | | const loading = ref(true); |
| | | const showSearch = ref(true); |
| | | const ids = ref<Array<number | string>>([]); |
| | | const multiple = ref(true); |
| | | const total = ref(0); |
| | | const dateRange = ref<[DateModelType, DateModelType]>(['', '']); |
| | | const defaultSort = ref<any>({ prop: "operTime", order: "descending" }); |
| | | |
| | | const operLogTableRef = ref(ElTable); |
| | | const queryFormRef = ref(ElForm); |
| | | |
| | | const dialog = reactive<DialogOption>({ |
| | | visible: false, |
| | | title: '' |
| | | }); |
| | | |
| | | |
| | | const data = reactive<PageData<OperLogForm, OperLogQuery>>({ |
| | | form: { |
| | | operId: undefined, |
| | | tenantId: undefined, |
| | | title: '', |
| | | businessType: 0, |
| | | businessTypes: undefined, |
| | | method: '', |
| | | requestMethod: '', |
| | | operatorType: 0, |
| | | operName: '', |
| | | deptName: '', |
| | | operUrl: '', |
| | | operIp: '', |
| | | operLocation: '', |
| | | operParam: '', |
| | | jsonResult: '', |
| | | status: 0, |
| | | errorMsg: '', |
| | | operTime: '', |
| | | costTime: 0 |
| | | }, |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | title: '', |
| | | operName: '', |
| | | businessType: '', |
| | | status: '', |
| | | orderByColumn: defaultSort.value.prop, |
| | | isAsc: defaultSort.value.order |
| | | }, |
| | | rules: {} |
| | | }); |
| | | |
| | | const { queryParams, form } = toRefs(data); |
| | | |
| | | /** æ¥è¯¢ç»å½æ¥å¿ */ |
| | | const getList = async () => { |
| | | loading.value = true; |
| | | const res = await list(proxy?.addDateRange(queryParams.value, dateRange.value)); |
| | | operlogList.value = res.rows; |
| | | total.value = res.total; |
| | | loading.value = false; |
| | | } |
| | | /** æä½æ¥å¿ç±»ååå
¸ç¿»è¯ */ |
| | | const typeFormat = (row: OperLogForm) => { |
| | | return proxy?.selectDictLabel(sys_oper_type.value, row.businessType); |
| | | } |
| | | /** æç´¢æé®æä½ */ |
| | | const handleQuery = () => { |
| | | queryParams.value.pageNum = 1; |
| | | getList(); |
| | | } |
| | | /** éç½®æé®æä½ */ |
| | | const resetQuery = () => { |
| | | dateRange.value = ['', '']; |
| | | queryFormRef.value.resetFields(); |
| | | queryParams.value.pageNum = 1; |
| | | operLogTableRef.value.sort(defaultSort.value.prop, defaultSort.value.order); |
| | | } |
| | | /** å¤éæ¡é䏿°æ® */ |
| | | const handleSelectionChange = (selection: OperLogVO[]) => { |
| | | ids.value = selection.map(item => item.operId); |
| | | multiple.value = !selection.length; |
| | | } |
| | | /** æåºè§¦åäºä»¶ */ |
| | | const handleSortChange = (column: any) => { |
| | | queryParams.value.orderByColumn = column.prop; |
| | | queryParams.value.isAsc = column.order; |
| | | getList(); |
| | | } |
| | | /** è¯¦ç»æé®æä½ */ |
| | | const handleView = (row: OperLogVO) => { |
| | | dialog.visible = true; |
| | | form.value = row; |
| | | } |
| | | /** å é¤æé®æä½ */ |
| | | const handleDelete = async (row?: OperLogVO) => { |
| | | const operIds = row?.operId || ids.value; |
| | | await proxy?.$modal.confirm('æ¯å¦ç¡®è®¤å 餿¥å¿ç¼å·ä¸º"' + operIds + '"çæ°æ®é¡¹?'); |
| | | await delOperlog(operIds); |
| | | getList(); |
| | | proxy?.$modal.msgSuccess("å 餿å"); |
| | | } |
| | | |
| | | /** æ¸
空æé®æä½ */ |
| | | const handleClean = async () => { |
| | | await proxy?.$modal.confirm("æ¯å¦ç¡®è®¤æ¸
ç©ºæææä½æ¥å¿æ°æ®é¡¹?"); |
| | | await cleanOperlog(); |
| | | getList(); |
| | | proxy?.$modal.msgSuccess("æ¸
空æå"); |
| | | } |
| | | |
| | | /** å¯¼åºæé®æä½ */ |
| | | const handleExport = () => { |
| | | proxy?.download("monitor/operlog/export", { |
| | | ...queryParams.value, |
| | | }, `config_${new Date().getTime()}.xlsx`); |
| | | } |
| | | onMounted(() => { |
| | | getList(); |
| | | }) |
| | | </script> |
| | |
| | | <template> |
| | | <div class="register"> |
| | | <el-form ref="registerRef" :model="registerForm" :rules="registerRules" class="register-form"> |
| | | <h3 class="title">RuoYi-Vue-Pluså¤ç§æ·ç®¡çç³»ç»</h3> |
| | | <el-form-item prop="tenantId" v-if="tenantEnabled"> |
| | | <el-select v-model="registerForm.tenantId" filterable placeholder="è¯·éæ©/è¾å
¥å
¬å¸åç§°" style="width: 100%"> |
| | | <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"> </el-option> |
| | | <template #prefix><svg-icon icon-class="company" class="el-input__icon input-icon" /></template> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item prop="username"> |
| | | <el-input v-model="registerForm.username" type="text" size="large" auto-complete="off" placeholder="è´¦å·"> |
| | | <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item prop="password"> |
| | | <el-input v-model="registerForm.password" type="password" size="large" auto-complete="off" placeholder="å¯ç " @keyup.enter="handleRegister"> |
| | | <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item prop="confirmPassword"> |
| | | <el-input |
| | | v-model="registerForm.confirmPassword" |
| | | type="password" |
| | | size="large" |
| | | auto-complete="off" |
| | | placeholder="确认å¯ç " |
| | | @keyup.enter="handleRegister" |
| | | > |
| | | <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item prop="code" v-if="captchaEnabled"> |
| | | <el-input size="large" v-model="registerForm.code" auto-complete="off" placeholder="éªè¯ç " style="width: 63%" @keyup.enter="handleRegister"> |
| | | <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template> |
| | | </el-input> |
| | | <div class="register-code"> |
| | | <img :src="codeUrl" @click="getCode" class="register-code-img" /> |
| | | </div> |
| | | </el-form-item> |
| | | <el-form-item style="width:100%;"> |
| | | <el-button :loading="loading" size="large" type="primary" style="width:100%;" @click.prevent="handleRegister"> |
| | | <span v-if="!loading">注 å</span> |
| | | <span v-else>注 å ä¸...</span> |
| | | </el-button> |
| | | <div style="float: right;"> |
| | | <router-link class="link-type" :to="'/login'">使ç¨å·²æè´¦æ·ç»å½</router-link> |
| | | </div> |
| | | </el-form-item> |
| | | </el-form> |
| | | <!-- åºé¨ --> |
| | | <div class="el-register-footer"> |
| | | <span>Copyright © 2018-2023 ç¯ççç®åLi All Rights Reserved.</span> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { getCodeImg, register, getTenantList } from '@/api/login'; |
| | | import { RegisterForm, TenantVO } from '@/api/types'; |
| | |
| | | initTenantList(); |
| | | }) |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="register"> |
| | | <el-form ref="registerRef" :model="registerForm" :rules="registerRules" class="register-form"> |
| | | <h3 class="title">RuoYi-Vue-Pluså¤ç§æ·ç®¡çç³»ç»</h3> |
| | | <el-form-item prop="tenantId" v-if="tenantEnabled"> |
| | | <el-select v-model="registerForm.tenantId" filterable placeholder="è¯·éæ©/è¾å
¥å
¬å¸åç§°" style="width: 100%"> |
| | | <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"> </el-option> |
| | | <template #prefix><svg-icon icon-class="company" class="el-input__icon input-icon" /></template> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item prop="username"> |
| | | <el-input v-model="registerForm.username" type="text" size="large" auto-complete="off" placeholder="è´¦å·"> |
| | | <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item prop="password"> |
| | | <el-input v-model="registerForm.password" type="password" size="large" auto-complete="off" placeholder="å¯ç " @keyup.enter="handleRegister"> |
| | | <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item prop="confirmPassword"> |
| | | <el-input |
| | | v-model="registerForm.confirmPassword" |
| | | type="password" |
| | | size="large" |
| | | auto-complete="off" |
| | | placeholder="确认å¯ç " |
| | | @keyup.enter="handleRegister" |
| | | > |
| | | <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item prop="code" v-if="captchaEnabled"> |
| | | <el-input size="large" v-model="registerForm.code" auto-complete="off" placeholder="éªè¯ç " style="width: 63%" @keyup.enter="handleRegister"> |
| | | <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template> |
| | | </el-input> |
| | | <div class="register-code"> |
| | | <img :src="codeUrl" @click="getCode" class="register-code-img" /> |
| | | </div> |
| | | </el-form-item> |
| | | <el-form-item style="width:100%;"> |
| | | <el-button :loading="loading" size="large" type="primary" style="width:100%;" @click.prevent="handleRegister"> |
| | | <span v-if="!loading">注 å</span> |
| | | <span v-else>注 å ä¸...</span> |
| | | </el-button> |
| | | <div style="float: right;"> |
| | | <router-link class="link-type" :to="'/login'">使ç¨å·²æè´¦æ·ç»å½</router-link> |
| | | </div> |
| | | </el-form-item> |
| | | </el-form> |
| | | <!-- åºé¨ --> |
| | | <div class="el-register-footer"> |
| | | <span>Copyright © 2018-2023 ç¯ççç®åLi All Rights Reserved.</span> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <style lang="scss" scoped> |
| | | .register { |
| | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> |
| | | <el-form-item label="èååç§°" prop="menuName"> |
| | | <el-input v-model="queryParams.deptName" placeholder="请è¾å
¥é¨é¨åç§°" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="é¨é¨ç¶æ" clearable> |
| | | <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd()" v-hasPermi="['system:dept:add']">æ°å¢ </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">å±å¼/æå </el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="deptList" |
| | | row-key="deptId" |
| | | :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" |
| | | ref="deptTableRef" |
| | | :default-expand-all="isExpandAll" |
| | | > |
| | | <el-table-column prop="deptName" label="é¨é¨åç§°" width="260"></el-table-column> |
| | | <el-table-column prop="orderNum" align="center" label="æåº" width="200"></el-table-column> |
| | | <el-table-column prop="status" align="center" label="ç¶æ" width="100"> |
| | | <template #default="scope"> |
| | | <dict-tag :options="sys_normal_disable" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="200"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column fixed="right" align="center" label="æä½"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dept:edit']" /> |
| | | </el-tooltip> |
| | | <el-tooltip content="æ°å¢" placement="top"> |
| | | <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['system:dept:add']" /> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dept:remove']" /> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" destroy-on-close append-to-bod width="600px"> |
| | | <el-form ref="deptFormRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-row> |
| | | <el-col :span="24" v-if="form.parentId !== 0"> |
| | | <el-form-item label="ä¸çº§é¨é¨" prop="parentId"> |
| | | <el-tree-select |
| | | v-model="form.parentId" |
| | | :data="deptOptions" |
| | | :props="{ value: 'deptId', label: 'deptName', children: 'children' }" |
| | | value-key="deptId" |
| | | placeholder="éæ©ä¸çº§é¨é¨" |
| | | check-strictly |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="é¨é¨åç§°" prop="deptName"> |
| | | <el-input v-model="form.deptName" placeholder="请è¾å
¥é¨é¨åç§°" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æ¾ç¤ºæåº" prop="orderNum"> |
| | | <el-input-number v-model="form.orderNum" controls-position="right" :min="0" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="è´è´£äºº" prop="leader"> |
| | | <el-input v-model="form.leader" placeholder="请è¾å
¥è´è´£äºº" maxlength="20" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="èç³»çµè¯" prop="phone"> |
| | | <el-input v-model="form.phone" placeholder="请è¾å
¥èç³»çµè¯" maxlength="11" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="é®ç®±" prop="email"> |
| | | <el-input v-model="form.email" placeholder="请è¾å
¥é®ç®±" maxlength="50" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="é¨é¨ç¶æ"> |
| | | <el-radio-group v-model="form.status"> |
| | | <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label |
| | | }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="Dept" lang="ts"> |
| | | import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from "@/api/system/dept" |
| | | import { ComponentInternalInstance } from 'vue'; |
| | |
| | | getList(); |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> |
| | | <el-form-item label="èååç§°" prop="menuName"> |
| | | <el-input v-model="queryParams.deptName" placeholder="请è¾å
¥é¨é¨åç§°" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="é¨é¨ç¶æ" clearable> |
| | | <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd()" v-hasPermi="['system:dept:add']">æ°å¢ </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">å±å¼/æå </el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="deptList" |
| | | row-key="deptId" |
| | | :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" |
| | | ref="deptTableRef" |
| | | :default-expand-all="isExpandAll" |
| | | > |
| | | <el-table-column prop="deptName" label="é¨é¨åç§°" width="260"></el-table-column> |
| | | <el-table-column prop="orderNum" align="center" label="æåº" width="200"></el-table-column> |
| | | <el-table-column prop="status" align="center" label="ç¶æ" width="100"> |
| | | <template #default="scope"> |
| | | <dict-tag :options="sys_normal_disable" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="200"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column fixed="right" align="center" label="æä½"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dept:edit']" /> |
| | | </el-tooltip> |
| | | <el-tooltip content="æ°å¢" placement="top"> |
| | | <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['system:dept:add']" /> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dept:remove']" /> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" destroy-on-close append-to-bod width="600px"> |
| | | <el-form ref="deptFormRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-row> |
| | | <el-col :span="24" v-if="form.parentId !== 0"> |
| | | <el-form-item label="ä¸çº§é¨é¨" prop="parentId"> |
| | | <el-tree-select |
| | | v-model="form.parentId" |
| | | :data="deptOptions" |
| | | :props="{ value: 'deptId', label: 'deptName', children: 'children' }" |
| | | value-key="deptId" |
| | | placeholder="éæ©ä¸çº§é¨é¨" |
| | | check-strictly |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="é¨é¨åç§°" prop="deptName"> |
| | | <el-input v-model="form.deptName" placeholder="请è¾å
¥é¨é¨åç§°" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æ¾ç¤ºæåº" prop="orderNum"> |
| | | <el-input-number v-model="form.orderNum" controls-position="right" :min="0" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="è´è´£äºº" prop="leader"> |
| | | <el-input v-model="form.leader" placeholder="请è¾å
¥è´è´£äºº" maxlength="20" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="èç³»çµè¯" prop="phone"> |
| | | <el-input v-model="form.phone" placeholder="请è¾å
¥èç³»çµè¯" maxlength="11" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="é®ç®±" prop="email"> |
| | | <el-input v-model="form.email" placeholder="请è¾å
¥é®ç®±" maxlength="50" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="é¨é¨ç¶æ"> |
| | | <el-radio-group v-model="form.status"> |
| | | <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label |
| | | }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="åå
¸åç§°" prop="dictType"> |
| | | <el-select v-model="queryParams.dictType" style="width: 200px"> |
| | | <el-option v-for="item in typeOptions" :key="item.dictId" :label="item.dictName" :value="item.dictType" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="åå
¸æ ç¾" prop="dictLabel"> |
| | | <el-input v-model="queryParams.dictLabel" placeholder="请è¾å
¥åå
¸æ ç¾" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="æ°æ®ç¶æ" clearable style="width: 200px"> |
| | | <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:dict:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:dict:edit']">ä¿®æ¹</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:dict:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:dict:export']">导åº</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Close" @click="handleClose">å
³é</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="åå
¸ç¼ç " align="center" prop="dictCode" v-if="false" /> |
| | | <el-table-column label="åå
¸æ ç¾" align="center" prop="dictLabel"> |
| | | <template #default="scope"> |
| | | <span v-if="scope.row.listClass === '' || scope.row.listClass === 'default'">{{ scope.row.dictLabel }}</span> |
| | | <el-tag v-else :type="scope.row.listClass === 'primary' ? '' : scope.row.listClass">{{ scope.row.dictLabel |
| | | }}</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="åå
¸é®å¼" align="center" prop="dictValue" /> |
| | | <el-table-column label="åå
¸æåº" align="center" prop="dictSort" /> |
| | | <el-table-column label="ç¶æ" align="center" prop="status"> |
| | | <template #default="scope"> |
| | | <dict-tag :options="sys_normal_disable" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="夿³¨" align="center" prop="remark" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" align="center" width="160" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dict:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dict:remove']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | <!-- æ·»å æä¿®æ¹åæ°é
ç½®å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
| | | <el-form ref="dataFormRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-form-item label="åå
¸ç±»å"> |
| | | <el-input v-model="form.dictType" :disabled="true" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ°æ®æ ç¾" prop="dictLabel"> |
| | | <el-input v-model="form.dictLabel" placeholder="请è¾å
¥æ°æ®æ ç¾" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ°æ®é®å¼" prop="dictValue"> |
| | | <el-input v-model="form.dictValue" placeholder="请è¾å
¥æ°æ®é®å¼" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ ·å¼å±æ§" prop="cssClass"> |
| | | <el-input v-model="form.cssClass" placeholder="请è¾å
¥æ ·å¼å±æ§" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ¾ç¤ºæåº" prop="dictSort"> |
| | | <el-input-number v-model="form.dictSort" controls-position="right" :min="0" /> |
| | | </el-form-item> |
| | | <el-form-item label="åæ¾æ ·å¼" prop="listClass"> |
| | | <el-select v-model="form.listClass"> |
| | | <el-option |
| | | v-for="item in listClassOptions" |
| | | :key="item.value" |
| | | :label="item.label + '(' + item.value + ')'" |
| | | :value="item.value" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-radio-group v-model="form.status"> |
| | | <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" type="textarea" placeholder="请è¾å
¥å
容"></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="Data" lang="ts"> |
| | | import useDictStore from '@/store/modules/dict' |
| | | import { optionselect as getDictOptionselect, getType } from "@/api/system/dict/type"; |
| | |
| | | getTypeList(); |
| | | }) |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="åå
¸åç§°" prop="dictType"> |
| | | <el-select v-model="queryParams.dictType" style="width: 200px"> |
| | | <el-option v-for="item in typeOptions" :key="item.dictId" :label="item.dictName" :value="item.dictType" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="åå
¸æ ç¾" prop="dictLabel"> |
| | | <el-input v-model="queryParams.dictLabel" placeholder="请è¾å
¥åå
¸æ ç¾" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="æ°æ®ç¶æ" clearable style="width: 200px"> |
| | | <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:dict:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:dict:edit']">ä¿®æ¹</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:dict:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:dict:export']">导åº</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Close" @click="handleClose">å
³é</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="åå
¸ç¼ç " align="center" prop="dictCode" v-if="false" /> |
| | | <el-table-column label="åå
¸æ ç¾" align="center" prop="dictLabel"> |
| | | <template #default="scope"> |
| | | <span v-if="scope.row.listClass === '' || scope.row.listClass === 'default'">{{ scope.row.dictLabel }}</span> |
| | | <el-tag v-else :type="scope.row.listClass === 'primary' ? '' : scope.row.listClass">{{ scope.row.dictLabel |
| | | }}</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="åå
¸é®å¼" align="center" prop="dictValue" /> |
| | | <el-table-column label="åå
¸æåº" align="center" prop="dictSort" /> |
| | | <el-table-column label="ç¶æ" align="center" prop="status"> |
| | | <template #default="scope"> |
| | | <dict-tag :options="sys_normal_disable" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="夿³¨" align="center" prop="remark" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" align="center" width="160" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dict:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dict:remove']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | <!-- æ·»å æä¿®æ¹åæ°é
ç½®å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
| | | <el-form ref="dataFormRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-form-item label="åå
¸ç±»å"> |
| | | <el-input v-model="form.dictType" :disabled="true" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ°æ®æ ç¾" prop="dictLabel"> |
| | | <el-input v-model="form.dictLabel" placeholder="请è¾å
¥æ°æ®æ ç¾" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ°æ®é®å¼" prop="dictValue"> |
| | | <el-input v-model="form.dictValue" placeholder="请è¾å
¥æ°æ®é®å¼" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ ·å¼å±æ§" prop="cssClass"> |
| | | <el-input v-model="form.cssClass" placeholder="请è¾å
¥æ ·å¼å±æ§" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ¾ç¤ºæåº" prop="dictSort"> |
| | | <el-input-number v-model="form.dictSort" controls-position="right" :min="0" /> |
| | | </el-form-item> |
| | | <el-form-item label="åæ¾æ ·å¼" prop="listClass"> |
| | | <el-select v-model="form.listClass"> |
| | | <el-option |
| | | v-for="item in listClassOptions" |
| | | :key="item.value" |
| | | :label="item.label + '(' + item.value + ')'" |
| | | :value="item.value" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-radio-group v-model="form.status"> |
| | | <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" type="textarea" placeholder="请è¾å
¥å
容"></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="åå
¸åç§°" prop="dictName"> |
| | | <el-input v-model="queryParams.dictName" placeholder="请è¾å
¥åå
¸åç§°" clearable style="width: 240px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="åå
¸ç±»å" prop="dictType"> |
| | | <el-input v-model="queryParams.dictType" placeholder="请è¾å
¥åå
¸ç±»å" clearable style="width: 240px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="åå
¸ç¶æ" clearable style="width: 240px"> |
| | | <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´" style="width: 308px"> |
| | | <el-date-picker |
| | | v-model="dateRange" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:dict:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:dict:edit']">ä¿®æ¹</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:dict:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:dict:export']">导åº</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Refresh" @click="handleRefreshCache" v-hasPermi="['system:dict:remove']">å·æ°ç¼å</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="typeList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="åå
¸ç¼å·" align="center" prop="dictId" v-if="false" /> |
| | | <el-table-column label="åå
¸åç§°" align="center" prop="dictName" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="åå
¸ç±»å" align="center" :show-overflow-tooltip="true"> |
| | | <template #default="scope"> |
| | | <router-link :to="'/system/dict-data/index/' + scope.row.dictId" class="link-type"> |
| | | <span>{{ scope.row.dictType }}</span> |
| | | </router-link> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç¶æ" align="center" prop="status"> |
| | | <template #default="scope"> |
| | | <dict-tag :options="sys_normal_disable" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="夿³¨" align="center" prop="remark" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" align="center" width="160" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dict:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dict:remove']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | <!-- æ·»å æä¿®æ¹åæ°é
ç½®å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
| | | <el-form ref="dictFormRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-form-item label="åå
¸åç§°" prop="dictName"> |
| | | <el-input v-model="form.dictName" placeholder="请è¾å
¥åå
¸åç§°" /> |
| | | </el-form-item> |
| | | <el-form-item label="åå
¸ç±»å" prop="dictType"> |
| | | <el-input v-model="form.dictType" placeholder="请è¾å
¥åå
¸ç±»å" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-radio-group v-model="form.status"> |
| | | <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" type="textarea" placeholder="请è¾å
¥å
容"></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="Dict" lang="ts"> |
| | | import useDictStore from '@/store/modules/dict' |
| | | import { listType, getType, delType, addType, updateType, refreshCache } from "@/api/system/dict/type"; |
| | |
| | | getList(); |
| | | }) |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="åå
¸åç§°" prop="dictName"> |
| | | <el-input v-model="queryParams.dictName" placeholder="请è¾å
¥åå
¸åç§°" clearable style="width: 240px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="åå
¸ç±»å" prop="dictType"> |
| | | <el-input v-model="queryParams.dictType" placeholder="请è¾å
¥åå
¸ç±»å" clearable style="width: 240px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="åå
¸ç¶æ" clearable style="width: 240px"> |
| | | <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´" style="width: 308px"> |
| | | <el-date-picker |
| | | v-model="dateRange" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:dict:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:dict:edit']">ä¿®æ¹</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:dict:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:dict:export']">导åº</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Refresh" @click="handleRefreshCache" v-hasPermi="['system:dict:remove']">å·æ°ç¼å</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="typeList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="åå
¸ç¼å·" align="center" prop="dictId" v-if="false" /> |
| | | <el-table-column label="åå
¸åç§°" align="center" prop="dictName" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="åå
¸ç±»å" align="center" :show-overflow-tooltip="true"> |
| | | <template #default="scope"> |
| | | <router-link :to="'/system/dict-data/index/' + scope.row.dictId" class="link-type"> |
| | | <span>{{ scope.row.dictType }}</span> |
| | | </router-link> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç¶æ" align="center" prop="status"> |
| | | <template #default="scope"> |
| | | <dict-tag :options="sys_normal_disable" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="夿³¨" align="center" prop="remark" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" align="center" width="160" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dict:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dict:remove']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | <!-- æ·»å æä¿®æ¹åæ°é
ç½®å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
| | | <el-form ref="dictFormRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-form-item label="åå
¸åç§°" prop="dictName"> |
| | | <el-input v-model="form.dictName" placeholder="请è¾å
¥åå
¸åç§°" /> |
| | | </el-form-item> |
| | | <el-form-item label="åå
¸ç±»å" prop="dictType"> |
| | | <el-input v-model="form.dictType" placeholder="请è¾å
¥åå
¸ç±»å" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-radio-group v-model="form.status"> |
| | | <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" type="textarea" placeholder="请è¾å
¥å
容"></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | |
| | | <script setup name="Menu" lang="ts"> |
| | | import { addMenu, delMenu, getMenu, listMenu, updateMenu } from '@/api/system/menu'; |
| | | import { MenuForm, MenuQuery, MenuVO } from '@/api/system/menu/types'; |
| | | import { ComponentInternalInstance } from 'vue'; |
| | | import { MenuTypeEnum } from '@/enums/MenuTypeEnum'; |
| | | import { ElTable, ElForm } from 'element-plus'; |
| | | |
| | | interface MenuOptionsType { |
| | | menuId: number; |
| | | menuName: string; |
| | | children: MenuOptionsType[] | undefined; |
| | | } |
| | | |
| | | const { proxy } = getCurrentInstance() as ComponentInternalInstance |
| | | const { sys_show_hide, sys_normal_disable } = toRefs<any>(proxy?.useDict("sys_show_hide", "sys_normal_disable")); |
| | | |
| | | const menuList = ref<MenuVO[]>([]) |
| | | const loading = ref(true) |
| | | const showSearch = ref(true) |
| | | const menuOptions = ref<MenuOptionsType[]>([]) |
| | | const isExpandAll = ref(false) |
| | | |
| | | const dialog = reactive<DialogOption>({ |
| | | visible: false, |
| | | title: '' |
| | | }); |
| | | |
| | | const queryFormRef = ref(ElForm); |
| | | const menuFormRef = ref(ElForm); |
| | | const initFormData = { |
| | | path: '', |
| | | menuId: undefined, |
| | | parentId: 0, |
| | | menuName: '', |
| | | icon: '', |
| | | menuType: MenuTypeEnum.M, |
| | | orderNum: 1, |
| | | isFrame: "1", |
| | | isCache: "0", |
| | | visible: "0", |
| | | status: "0" |
| | | } |
| | | const data = reactive<PageData<MenuForm, MenuQuery>>({ |
| | | form: { ...initFormData }, |
| | | queryParams: { |
| | | menuName: undefined, |
| | | status: undefined |
| | | }, |
| | | rules: { |
| | | menuName: [{ required: true, message: "èååç§°ä¸è½ä¸ºç©º", trigger: "blur" }], |
| | | orderNum: [{ required: true, message: "èå顺åºä¸è½ä¸ºç©º", trigger: "blur" }], |
| | | path: [{ required: true, message: "è·¯ç±å°åä¸è½ä¸ºç©º", trigger: "blur" }] |
| | | }, |
| | | }) |
| | | |
| | | const menuTableRef = ref(ElTable); |
| | | |
| | | const { queryParams, form, rules } = toRefs<PageData<MenuForm, MenuQuery>>(data) |
| | | /** æ¥è¯¢èåå表 */ |
| | | const getList = async () => { |
| | | loading.value = true |
| | | const res = await listMenu(queryParams.value); |
| | | const data = proxy?.handleTree<MenuVO>(res.data, "menuId") |
| | | if (data) { |
| | | menuList.value = data |
| | | } |
| | | loading.value = false |
| | | } |
| | | /** æ¥è¯¢èå䏿æ ç»æ */ |
| | | const getTreeselect = async () => { |
| | | menuOptions.value = [] |
| | | const response = await listMenu(); |
| | | const menu: MenuOptionsType = { menuId: 0, menuName: "主类ç®", children: [] } |
| | | menu.children = proxy?.handleTree<MenuOptionsType>(response.data, "menuId") |
| | | menuOptions.value.push(menu) |
| | | } |
| | | /** åæ¶æé® */ |
| | | const cancel = () => { |
| | | reset() |
| | | dialog.visible = false |
| | | } |
| | | /** 表åéç½® */ |
| | | const reset = () => { |
| | | form.value = { ...initFormData }; |
| | | menuFormRef.value.resetFields(); |
| | | } |
| | | |
| | | /** æç´¢æé®æä½ */ |
| | | const handleQuery = () => { |
| | | getList(); |
| | | } |
| | | /** éç½®æé®æä½ */ |
| | | const resetQuery = () => { |
| | | queryFormRef.value.resetFields(); |
| | | handleQuery(); |
| | | } |
| | | /** æ°å¢æé®æä½ */ |
| | | const handleAdd = (row?: MenuVO) => { |
| | | dialog.visible = true; |
| | | dialog.title = "æ·»å èå"; |
| | | getTreeselect(); |
| | | nextTick(() => { |
| | | reset(); |
| | | row && row.menuId ? form.value.parentId = row.menuId : form.value.parentId = 0; |
| | | }) |
| | | |
| | | } |
| | | /** å±å¼/æå æä½ */ |
| | | const handleToggleExpandAll = () => { |
| | | isExpandAll.value = !isExpandAll.value; |
| | | toggleExpandAll(menuList.value, isExpandAll.value) |
| | | } |
| | | /** å±å¼/æå ææ */ |
| | | const toggleExpandAll = (data: MenuVO[], status: boolean) => { |
| | | data.forEach((item: MenuVO) => { |
| | | menuTableRef.value.toggleRowExpansion(item, status) |
| | | if (item.children && item.children.length > 0) toggleExpandAll(item.children, status) |
| | | }) |
| | | } |
| | | /** ä¿®æ¹æé®æä½ */ |
| | | const handleUpdate = async (row: MenuVO) => { |
| | | await getTreeselect(); |
| | | dialog.visible = true; |
| | | dialog.title = "ä¿®æ¹èå"; |
| | | await nextTick(async () => { |
| | | if (row.menuId) { |
| | | const { data } = await getMenu(row.menuId); |
| | | reset(); |
| | | form.value = data; |
| | | } |
| | | }) |
| | | |
| | | } |
| | | /** æäº¤æé® */ |
| | | const submitForm = () => { |
| | | menuFormRef.value.validate(async (valid: boolean) => { |
| | | if (valid) { |
| | | form.value.menuId ? await updateMenu(form.value) : await addMenu(form.value); |
| | | proxy?.$modal.msgSuccess("æä½æå"); |
| | | dialog.visible = false; |
| | | getList(); |
| | | } |
| | | }) |
| | | } |
| | | /** å é¤æé®æä½ */ |
| | | const handleDelete = async (row: MenuVO) => { |
| | | await proxy?.$modal.confirm('æ¯å¦ç¡®è®¤å é¤å称为"' + row.menuName + '"çæ°æ®é¡¹?'); |
| | | await delMenu(row.menuId); |
| | | getList(); |
| | | proxy?.$modal.msgSuccess("å 餿å"); |
| | | } |
| | | |
| | | onMounted(() => { |
| | | getList(); |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="Menu" lang="ts"> |
| | | import { addMenu, delMenu, getMenu, listMenu, updateMenu } from '@/api/system/menu'; |
| | | import { MenuForm, MenuQuery, MenuVO } from '@/api/system/menu/types'; |
| | | import { ComponentInternalInstance } from 'vue'; |
| | | import { MenuTypeEnum } from '@/enums/MenuTypeEnum'; |
| | | import { ElTable, ElForm } from 'element-plus'; |
| | | |
| | | interface MenuOptionsType { |
| | | menuId: number; |
| | | menuName: string; |
| | | children: MenuOptionsType[] | undefined; |
| | | } |
| | | |
| | | const { proxy } = getCurrentInstance() as ComponentInternalInstance |
| | | const { sys_show_hide, sys_normal_disable } = toRefs<any>(proxy?.useDict("sys_show_hide", "sys_normal_disable")); |
| | | |
| | | const menuList = ref<MenuVO[]>([]) |
| | | const loading = ref(true) |
| | | const showSearch = ref(true) |
| | | const menuOptions = ref<MenuOptionsType[]>([]) |
| | | const isExpandAll = ref(false) |
| | | |
| | | const dialog = reactive<DialogOption>({ |
| | | visible: false, |
| | | title: '' |
| | | }); |
| | | |
| | | const queryFormRef = ref(ElForm); |
| | | const menuFormRef = ref(ElForm); |
| | | const initFormData = { |
| | | path: '', |
| | | menuId: undefined, |
| | | parentId: 0, |
| | | menuName: '', |
| | | icon: '', |
| | | menuType: MenuTypeEnum.M, |
| | | orderNum: 1, |
| | | isFrame: "1", |
| | | isCache: "0", |
| | | visible: "0", |
| | | status: "0" |
| | | } |
| | | const data = reactive<PageData<MenuForm, MenuQuery>>({ |
| | | form: { ...initFormData }, |
| | | queryParams: { |
| | | menuName: undefined, |
| | | status: undefined |
| | | }, |
| | | rules: { |
| | | menuName: [{ required: true, message: "èååç§°ä¸è½ä¸ºç©º", trigger: "blur" }], |
| | | orderNum: [{ required: true, message: "èå顺åºä¸è½ä¸ºç©º", trigger: "blur" }], |
| | | path: [{ required: true, message: "è·¯ç±å°åä¸è½ä¸ºç©º", trigger: "blur" }] |
| | | }, |
| | | }) |
| | | |
| | | const menuTableRef = ref(ElTable); |
| | | |
| | | const { queryParams, form, rules } = toRefs<PageData<MenuForm, MenuQuery>>(data) |
| | | /** æ¥è¯¢èåå表 */ |
| | | const getList = async () => { |
| | | loading.value = true |
| | | const res = await listMenu(queryParams.value); |
| | | const data = proxy?.handleTree<MenuVO>(res.data, "menuId") |
| | | if (data) { |
| | | menuList.value = data |
| | | } |
| | | loading.value = false |
| | | } |
| | | /** æ¥è¯¢èå䏿æ ç»æ */ |
| | | const getTreeselect = async () => { |
| | | menuOptions.value = [] |
| | | const response = await listMenu(); |
| | | const menu: MenuOptionsType = { menuId: 0, menuName: "主类ç®", children: [] } |
| | | menu.children = proxy?.handleTree<MenuOptionsType>(response.data, "menuId") |
| | | menuOptions.value.push(menu) |
| | | } |
| | | /** åæ¶æé® */ |
| | | const cancel = () => { |
| | | reset() |
| | | dialog.visible = false |
| | | } |
| | | /** 表åéç½® */ |
| | | const reset = () => { |
| | | form.value = { ...initFormData }; |
| | | menuFormRef.value.resetFields(); |
| | | } |
| | | |
| | | /** æç´¢æé®æä½ */ |
| | | const handleQuery = () => { |
| | | getList(); |
| | | } |
| | | /** éç½®æé®æä½ */ |
| | | const resetQuery = () => { |
| | | queryFormRef.value.resetFields(); |
| | | handleQuery(); |
| | | } |
| | | /** æ°å¢æé®æä½ */ |
| | | const handleAdd = (row?: MenuVO) => { |
| | | dialog.visible = true; |
| | | dialog.title = "æ·»å èå"; |
| | | getTreeselect(); |
| | | nextTick(() => { |
| | | reset(); |
| | | row && row.menuId ? form.value.parentId = row.menuId : form.value.parentId = 0; |
| | | }) |
| | | |
| | | } |
| | | /** å±å¼/æå æä½ */ |
| | | const handleToggleExpandAll = () => { |
| | | isExpandAll.value = !isExpandAll.value; |
| | | toggleExpandAll(menuList.value, isExpandAll.value) |
| | | } |
| | | /** å±å¼/æå ææ */ |
| | | const toggleExpandAll = (data: MenuVO[], status: boolean) => { |
| | | data.forEach((item: MenuVO) => { |
| | | menuTableRef.value.toggleRowExpansion(item, status) |
| | | if (item.children && item.children.length > 0) toggleExpandAll(item.children, status) |
| | | }) |
| | | } |
| | | /** ä¿®æ¹æé®æä½ */ |
| | | const handleUpdate = async (row: MenuVO) => { |
| | | await getTreeselect(); |
| | | dialog.visible = true; |
| | | dialog.title = "ä¿®æ¹èå"; |
| | | await nextTick(async () => { |
| | | if (row.menuId) { |
| | | const { data } = await getMenu(row.menuId); |
| | | reset(); |
| | | form.value = data; |
| | | } |
| | | }) |
| | | |
| | | } |
| | | /** æäº¤æé® */ |
| | | const submitForm = () => { |
| | | menuFormRef.value.validate(async (valid: boolean) => { |
| | | if (valid) { |
| | | form.value.menuId ? await updateMenu(form.value) : await addMenu(form.value); |
| | | proxy?.$modal.msgSuccess("æä½æå"); |
| | | dialog.visible = false; |
| | | getList(); |
| | | } |
| | | }) |
| | | } |
| | | /** å é¤æé®æä½ */ |
| | | const handleDelete = async (row: MenuVO) => { |
| | | await proxy?.$modal.confirm('æ¯å¦ç¡®è®¤å é¤å称为"' + row.menuName + '"çæ°æ®é¡¹?'); |
| | | await delMenu(row.menuId); |
| | | getList(); |
| | | proxy?.$modal.msgSuccess("å 餿å"); |
| | | } |
| | | |
| | | onMounted(() => { |
| | | getList(); |
| | | }); |
| | | </script> |
| | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="å
¬åæ é¢" prop="noticeTitle"> |
| | | <el-input v-model="queryParams.noticeTitle" placeholder="请è¾å
¥å
¬åæ é¢" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="æä½äººå" prop="createByName"> |
| | | <el-input v-model="queryParams.createByName" placeholder="请è¾å
¥æä½äººå" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç±»å" prop="noticeType"> |
| | | <el-select v-model="queryParams.noticeType" placeholder="å
¬åç±»å" clearable style="width: 200px"> |
| | | <el-option v-for="dict in sys_notice_type" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:notice:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:notice:edit']" |
| | | >ä¿®æ¹</el-button |
| | | > |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:notice:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="noticeList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="åºå·" align="center" prop="noticeId" width="100" v-if="false" /> |
| | | <el-table-column label="å
¬åæ é¢" align="center" prop="noticeTitle" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="å
¬åç±»å" align="center" prop="noticeType" width="100"> |
| | | <template #default="scope"> |
| | | <dict-tag :options="sys_notice_type" :value="scope.row.noticeType" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç¶æ" align="center" prop="status" width="100"> |
| | | <template #default="scope"> |
| | | <dict-tag :options="sys_notice_status" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å建è
" align="center" prop="createByName" width="100" /> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="100"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:notice:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:notice:remove']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | <!-- æ·»å æä¿®æ¹å
¬åå¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="780px" append-to-body> |
| | | <el-form ref="noticeFormRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å
¬åæ é¢" prop="noticeTitle"> |
| | | <el-input v-model="form.noticeTitle" placeholder="请è¾å
¥å
¬åæ é¢" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å
¬åç±»å" prop="noticeType"> |
| | | <el-select v-model="form.noticeType" placeholder="è¯·éæ©"> |
| | | <el-option v-for="dict in sys_notice_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <el-form-item label="ç¶æ"> |
| | | <el-radio-group v-model="form.status"> |
| | | <el-radio v-for="dict in sys_notice_status" :key="dict.value" :label="dict.value">{{ dict.label |
| | | }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <el-form-item label="å
容"> |
| | | <editor v-model="form.noticeContent" :min-height="192" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="Notice" lang="ts"> |
| | | import { listNotice, getNotice, delNotice, addNotice, updateNotice } from "@/api/system/notice"; |
| | | import { ComponentInternalInstance } from "vue"; |
| | |
| | | getList(); |
| | | }) |
| | | </script> |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="å
¬åæ é¢" prop="noticeTitle"> |
| | | <el-input v-model="queryParams.noticeTitle" placeholder="请è¾å
¥å
¬åæ é¢" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="æä½äººå" prop="createByName"> |
| | | <el-input v-model="queryParams.createByName" placeholder="请è¾å
¥æä½äººå" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç±»å" prop="noticeType"> |
| | | <el-select v-model="queryParams.noticeType" placeholder="å
¬åç±»å" clearable style="width: 200px"> |
| | | <el-option v-for="dict in sys_notice_type" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:notice:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:notice:edit']" |
| | | >ä¿®æ¹</el-button |
| | | > |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:notice:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="noticeList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="åºå·" align="center" prop="noticeId" width="100" v-if="false" /> |
| | | <el-table-column label="å
¬åæ é¢" align="center" prop="noticeTitle" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="å
¬åç±»å" align="center" prop="noticeType" width="100"> |
| | | <template #default="scope"> |
| | | <dict-tag :options="sys_notice_type" :value="scope.row.noticeType" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç¶æ" align="center" prop="status" width="100"> |
| | | <template #default="scope"> |
| | | <dict-tag :options="sys_notice_status" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å建è
" align="center" prop="createByName" width="100" /> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="100"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:notice:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:notice:remove']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | <!-- æ·»å æä¿®æ¹å
¬åå¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="780px" append-to-body> |
| | | <el-form ref="noticeFormRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å
¬åæ é¢" prop="noticeTitle"> |
| | | <el-input v-model="form.noticeTitle" placeholder="请è¾å
¥å
¬åæ é¢" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å
¬åç±»å" prop="noticeType"> |
| | | <el-select v-model="form.noticeType" placeholder="è¯·éæ©"> |
| | | <el-option v-for="dict in sys_notice_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <el-form-item label="ç¶æ"> |
| | | <el-radio-group v-model="form.status"> |
| | | <el-radio v-for="dict in sys_notice_status" :key="dict.value" :label="dict.value">{{ dict.label |
| | | }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <el-form-item label="å
容"> |
| | | <editor v-model="form.noticeContent" :min-height="192" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="é
ç½®key" prop="configKey"> |
| | | <el-input v-model="queryParams.configKey" placeholder="é
ç½®key" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ¡¶åç§°" prop="bucketName"> |
| | | <el-input v-model="queryParams.bucketName" placeholder="请è¾å
¥æ¡¶åç§°" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ¯å¦é»è®¤" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="è¯·éæ©ç¶æ" clearable style="width: 200px"> |
| | | <el-option key="0" label="æ¯" value="0" /> |
| | | <el-option key="1" label="å¦" value="1" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:oss:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:oss:edit']">ä¿®æ¹</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:oss:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="ossConfigList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="主建" align="center" prop="ossConfigId" v-if="columns[0].visible" /> |
| | | <el-table-column label="é
ç½®key" align="center" prop="configKey" v-if="columns[1].visible" /> |
| | | <el-table-column label="访é®ç«ç¹" align="center" prop="endpoint" v-if="columns[2].visible" width="200" /> |
| | | <el-table-column label="èªå®ä¹åå" align="center" prop="domain" v-if="columns[3].visible" width="200" /> |
| | | <el-table-column label="æ¡¶åç§°" align="center" prop="bucketName" v-if="columns[4].visible" /> |
| | | <el-table-column label="åç¼" align="center" prop="prefix" v-if="columns[5].visible" /> |
| | | <el-table-column label="å" align="center" prop="region" v-if="columns[6].visible" /> |
| | | <el-table-column label="æ¡¶æéç±»å" align="center" prop="accessPolicy" v-if="columns[7].visible"> |
| | | <template #default="scope"> |
| | | <el-tag type="warning" v-if="scope.row.accessPolicy === '0'">private</el-tag> |
| | | <el-tag type="success" v-if="scope.row.accessPolicy === '1'">public</el-tag> |
| | | <el-tag type="info" v-if="scope.row.accessPolicy === '2'">custom</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æ¯å¦é»è®¤" align="center" prop="status" v-if="columns[8].visible"> |
| | | <template #default="scope"> |
| | | <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" align="center" width="150" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:oss:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:oss:remove']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | <!-- æ·»å æä¿®æ¹å¯¹è±¡åå¨é
ç½®å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body> |
| | | <el-form ref="ossConfigFormRef" :model="form" :rules="rules" label-width="120px"> |
| | | <el-form-item label="é
ç½®key" prop="configKey"> |
| | | <el-input v-model="form.configKey" placeholder="请è¾å
¥é
ç½®key" /> |
| | | </el-form-item> |
| | | <el-form-item label="访é®ç«ç¹" prop="endpoint"> |
| | | <el-input v-model="form.endpoint" placeholder="请è¾å
¥è®¿é®ç«ç¹" /> |
| | | </el-form-item> |
| | | <el-form-item label="èªå®ä¹åå" prop="domain"> |
| | | <el-input v-model="form.domain" placeholder="请è¾å
¥èªå®ä¹åå" /> |
| | | </el-form-item> |
| | | <el-form-item label="accessKey" prop="accessKey"> |
| | | <el-input v-model="form.accessKey" placeholder="请è¾å
¥accessKey" /> |
| | | </el-form-item> |
| | | <el-form-item label="secretKey" prop="secretKey"> |
| | | <el-input v-model="form.secretKey" placeholder="请è¾å
¥ç§é¥" show-password /> |
| | | </el-form-item> |
| | | <el-form-item label="æ¡¶åç§°" prop="bucketName"> |
| | | <el-input v-model="form.bucketName" placeholder="请è¾å
¥æ¡¶åç§°" /> |
| | | </el-form-item> |
| | | <el-form-item label="åç¼" prop="prefix"> |
| | | <el-input v-model="form.prefix" placeholder="请è¾å
¥åç¼" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ¯å¦HTTPS"> |
| | | <el-radio-group v-model="form.isHttps"> |
| | | <el-radio v-for="dict in sys_yes_no" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="æ¡¶æéç±»å"> |
| | | <el-radio-group v-model="form.accessPolicy"> |
| | | <el-radio label="0">private</el-radio> |
| | | <el-radio label="1">public</el-radio> |
| | | <el-radio label="2">custom</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="å" prop="region"> |
| | | <el-input v-model="form.region" placeholder="请è¾å
¥å" /> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" type="textarea" placeholder="请è¾å
¥å
容" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button :loading="buttonLoading" type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="OssConfig" lang="ts"> |
| | | import { |
| | | listOssConfig, |
| | |
| | | getList(); |
| | | }) |
| | | </script> |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="é
ç½®key" prop="configKey"> |
| | | <el-input v-model="queryParams.configKey" placeholder="é
ç½®key" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ¡¶åç§°" prop="bucketName"> |
| | | <el-input v-model="queryParams.bucketName" placeholder="请è¾å
¥æ¡¶åç§°" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ¯å¦é»è®¤" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="è¯·éæ©ç¶æ" clearable style="width: 200px"> |
| | | <el-option key="0" label="æ¯" value="0" /> |
| | | <el-option key="1" label="å¦" value="1" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:oss:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:oss:edit']">ä¿®æ¹</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:oss:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="ossConfigList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="主建" align="center" prop="ossConfigId" v-if="columns[0].visible" /> |
| | | <el-table-column label="é
ç½®key" align="center" prop="configKey" v-if="columns[1].visible" /> |
| | | <el-table-column label="访é®ç«ç¹" align="center" prop="endpoint" v-if="columns[2].visible" width="200" /> |
| | | <el-table-column label="èªå®ä¹åå" align="center" prop="domain" v-if="columns[3].visible" width="200" /> |
| | | <el-table-column label="æ¡¶åç§°" align="center" prop="bucketName" v-if="columns[4].visible" /> |
| | | <el-table-column label="åç¼" align="center" prop="prefix" v-if="columns[5].visible" /> |
| | | <el-table-column label="å" align="center" prop="region" v-if="columns[6].visible" /> |
| | | <el-table-column label="æ¡¶æéç±»å" align="center" prop="accessPolicy" v-if="columns[7].visible"> |
| | | <template #default="scope"> |
| | | <el-tag type="warning" v-if="scope.row.accessPolicy === '0'">private</el-tag> |
| | | <el-tag type="success" v-if="scope.row.accessPolicy === '1'">public</el-tag> |
| | | <el-tag type="info" v-if="scope.row.accessPolicy === '2'">custom</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æ¯å¦é»è®¤" align="center" prop="status" v-if="columns[8].visible"> |
| | | <template #default="scope"> |
| | | <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" align="center" width="150" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:oss:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:oss:remove']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | <!-- æ·»å æä¿®æ¹å¯¹è±¡åå¨é
ç½®å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body> |
| | | <el-form ref="ossConfigFormRef" :model="form" :rules="rules" label-width="120px"> |
| | | <el-form-item label="é
ç½®key" prop="configKey"> |
| | | <el-input v-model="form.configKey" placeholder="请è¾å
¥é
ç½®key" /> |
| | | </el-form-item> |
| | | <el-form-item label="访é®ç«ç¹" prop="endpoint"> |
| | | <el-input v-model="form.endpoint" placeholder="请è¾å
¥è®¿é®ç«ç¹" /> |
| | | </el-form-item> |
| | | <el-form-item label="èªå®ä¹åå" prop="domain"> |
| | | <el-input v-model="form.domain" placeholder="请è¾å
¥èªå®ä¹åå" /> |
| | | </el-form-item> |
| | | <el-form-item label="accessKey" prop="accessKey"> |
| | | <el-input v-model="form.accessKey" placeholder="请è¾å
¥accessKey" /> |
| | | </el-form-item> |
| | | <el-form-item label="secretKey" prop="secretKey"> |
| | | <el-input v-model="form.secretKey" placeholder="请è¾å
¥ç§é¥" show-password /> |
| | | </el-form-item> |
| | | <el-form-item label="æ¡¶åç§°" prop="bucketName"> |
| | | <el-input v-model="form.bucketName" placeholder="请è¾å
¥æ¡¶åç§°" /> |
| | | </el-form-item> |
| | | <el-form-item label="åç¼" prop="prefix"> |
| | | <el-input v-model="form.prefix" placeholder="请è¾å
¥åç¼" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ¯å¦HTTPS"> |
| | | <el-radio-group v-model="form.isHttps"> |
| | | <el-radio v-for="dict in sys_yes_no" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="æ¡¶æéç±»å"> |
| | | <el-radio-group v-model="form.accessPolicy"> |
| | | <el-radio label="0">private</el-radio> |
| | | <el-radio label="1">public</el-radio> |
| | | <el-radio label="2">custom</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="å" prop="region"> |
| | | <el-input v-model="form.region" placeholder="请è¾å
¥å" /> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" type="textarea" placeholder="请è¾å
¥å
容" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button :loading="buttonLoading" type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="æä»¶å" prop="fileName"> |
| | | <el-input v-model="queryParams.fileName" placeholder="请è¾å
¥æä»¶å" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="åå" prop="originalName"> |
| | | <el-input v-model="queryParams.originalName" placeholder="请è¾å
¥åå" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="æä»¶åç¼" prop="fileSuffix"> |
| | | <el-input v-model="queryParams.fileSuffix" placeholder="请è¾å
¥æä»¶åç¼" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´"> |
| | | <el-date-picker |
| | | v-model="daterangeCreateTime" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="æå¡å" prop="service"> |
| | | <el-input v-model="queryParams.service" placeholder="请è¾å
¥æå¡å" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Upload" @click="handleFile" v-hasPermi="['system:oss:upload']">ä¸ä¼ æä»¶</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Upload" @click="handleImage" v-hasPermi="['system:oss:upload']">ä¸ä¼ å¾ç</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:oss:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | :type="previewListResource ? 'danger' : 'warning'" |
| | | plain |
| | | @click="handlePreviewListResource(!previewListResource)" |
| | | v-hasPermi="['system:oss:edit']" |
| | | >é¢è§å¼å
³ : |
| | | {{ |
| | | previewListResource ? "ç¦ç¨" : "å¯ç¨" }}</el-button |
| | | > |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="info" plain icon="Operation" @click="handleOssConfig" v-hasPermi="['system:oss:list']">é
置管ç</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="ossList" |
| | | @selection-change="handleSelectionChange" |
| | | :header-cell-class-name="handleHeaderClass" |
| | | @header-click="handleHeaderCLick" |
| | | v-if="showTable" |
| | | > |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="对象åå¨ä¸»é®" align="center" prop="ossId" v-if="false" /> |
| | | <el-table-column label="æä»¶å" align="center" prop="fileName" /> |
| | | <el-table-column label="åå" align="center" prop="originalName" /> |
| | | <el-table-column label="æä»¶åç¼" align="center" prop="fileSuffix" /> |
| | | <el-table-column label="æä»¶å±ç¤º" align="center" prop="url"> |
| | | <template #default="scope"> |
| | | <ImagePreview |
| | | v-if="previewListResource && checkFileSuffix(scope.row.fileSuffix)" |
| | | :width="100" |
| | | :height="100" |
| | | :src="scope.row.url" |
| | | :preview-src-list="[scope.row.url]" |
| | | /> |
| | | <span v-text="scope.row.url" v-if="!checkFileSuffix(scope.row.fileSuffix) || !previewListResource" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="180" sortable="custom"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ä¸ä¼ 人" align="center" prop="createByName" /> |
| | | <el-table-column label="æå¡å" align="center" prop="service" sortable="custom" /> |
| | | <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¸è½½" placement="top"> |
| | | <el-button link type="primary" icon="Download" @click="handleDownload(scope.row)" v-hasPermi="['system:oss:download']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:oss:remove']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | <!-- æ·»å æä¿®æ¹OSS对象åå¨å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
| | | <el-form ref="ossFormRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-form-item label="æä»¶å"> |
| | | <fileUpload v-model="form.file" v-if="type === 0" /> |
| | | <imageUpload v-model="form.file" v-if="type === 1" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button :loading="buttonLoading" type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="Oss" lang="ts"> |
| | | import { listOss, delOss } from "@/api/system/oss"; |
| | | import ImagePreview from "@/components/ImagePreview/index.vue"; |
| | |
| | | getList(); |
| | | }) |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="æä»¶å" prop="fileName"> |
| | | <el-input v-model="queryParams.fileName" placeholder="请è¾å
¥æä»¶å" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="åå" prop="originalName"> |
| | | <el-input v-model="queryParams.originalName" placeholder="请è¾å
¥åå" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="æä»¶åç¼" prop="fileSuffix"> |
| | | <el-input v-model="queryParams.fileSuffix" placeholder="请è¾å
¥æä»¶åç¼" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´"> |
| | | <el-date-picker |
| | | v-model="daterangeCreateTime" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="æå¡å" prop="service"> |
| | | <el-input v-model="queryParams.service" placeholder="请è¾å
¥æå¡å" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Upload" @click="handleFile" v-hasPermi="['system:oss:upload']">ä¸ä¼ æä»¶</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Upload" @click="handleImage" v-hasPermi="['system:oss:upload']">ä¸ä¼ å¾ç</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:oss:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | :type="previewListResource ? 'danger' : 'warning'" |
| | | plain |
| | | @click="handlePreviewListResource(!previewListResource)" |
| | | v-hasPermi="['system:oss:edit']" |
| | | >é¢è§å¼å
³ : |
| | | {{ |
| | | previewListResource ? "ç¦ç¨" : "å¯ç¨" }}</el-button |
| | | > |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="info" plain icon="Operation" @click="handleOssConfig" v-hasPermi="['system:oss:list']">é
置管ç</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="ossList" |
| | | @selection-change="handleSelectionChange" |
| | | :header-cell-class-name="handleHeaderClass" |
| | | @header-click="handleHeaderCLick" |
| | | v-if="showTable" |
| | | > |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="对象åå¨ä¸»é®" align="center" prop="ossId" v-if="false" /> |
| | | <el-table-column label="æä»¶å" align="center" prop="fileName" /> |
| | | <el-table-column label="åå" align="center" prop="originalName" /> |
| | | <el-table-column label="æä»¶åç¼" align="center" prop="fileSuffix" /> |
| | | <el-table-column label="æä»¶å±ç¤º" align="center" prop="url"> |
| | | <template #default="scope"> |
| | | <ImagePreview |
| | | v-if="previewListResource && checkFileSuffix(scope.row.fileSuffix)" |
| | | :width="100" |
| | | :height="100" |
| | | :src="scope.row.url" |
| | | :preview-src-list="[scope.row.url]" |
| | | /> |
| | | <span v-text="scope.row.url" v-if="!checkFileSuffix(scope.row.fileSuffix) || !previewListResource" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="180" sortable="custom"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ä¸ä¼ 人" align="center" prop="createByName" /> |
| | | <el-table-column label="æå¡å" align="center" prop="service" sortable="custom" /> |
| | | <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¸è½½" placement="top"> |
| | | <el-button link type="primary" icon="Download" @click="handleDownload(scope.row)" v-hasPermi="['system:oss:download']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:oss:remove']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | <!-- æ·»å æä¿®æ¹OSS对象åå¨å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
| | | <el-form ref="ossFormRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-form-item label="æä»¶å"> |
| | | <fileUpload v-model="form.file" v-if="type === 0" /> |
| | | <imageUpload v-model="form.file" v-if="type === 1" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button :loading="buttonLoading" type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="70"> |
| | | <el-form-item label="å²ä½ç¼ç " prop="postCode"> |
| | | <el-input v-model="queryParams.postCode" placeholder="请è¾å
¥å²ä½ç¼ç " clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="å²ä½åç§°" prop="postName"> |
| | | <el-input v-model="queryParams.postName" placeholder="请è¾å
¥å²ä½åç§°" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="å²ä½ç¶æ" clearable style="width: 200px"> |
| | | <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:post:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:post:edit']">ä¿®æ¹</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:post:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:post:export']">导åº</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="å²ä½ç¼å·" align="center" prop="postId" v-if="false" /> |
| | | <el-table-column label="å²ä½ç¼ç " align="center" prop="postCode" /> |
| | | <el-table-column label="å²ä½åç§°" align="center" prop="postName" /> |
| | | <el-table-column label="å²ä½æåº" align="center" prop="postSort" /> |
| | | <el-table-column label="ç¶æ" align="center" prop="status"> |
| | | <template #default="scope"> |
| | | <dict-tag :options="sys_normal_disable" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" width="180" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:post:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:post:remove']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | |
| | | <!-- æ·»å æä¿®æ¹å²ä½å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
| | | <el-form ref="postFormRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-form-item label="å²ä½åç§°" prop="postName"> |
| | | <el-input v-model="form.postName" placeholder="请è¾å
¥å²ä½åç§°" /> |
| | | </el-form-item> |
| | | <el-form-item label="å²ä½ç¼ç " prop="postCode"> |
| | | <el-input v-model="form.postCode" placeholder="请è¾å
¥ç¼ç åç§°" /> |
| | | </el-form-item> |
| | | <el-form-item label="å²ä½é¡ºåº" prop="postSort"> |
| | | <el-input-number v-model="form.postSort" controls-position="right" :min="0" /> |
| | | </el-form-item> |
| | | <el-form-item label="å²ä½ç¶æ" prop="status"> |
| | | <el-radio-group v-model="form.status"> |
| | | <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" type="textarea" placeholder="请è¾å
¥å
容" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="Post" lang="ts"> |
| | | import { listPost, addPost, delPost, getPost, updatePost } from "@/api/system/post"; |
| | | import { PostForm, PostQuery, PostVO } from "@/api/system/post/types"; |
| | |
| | | getList(); |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="70"> |
| | | <el-form-item label="å²ä½ç¼ç " prop="postCode"> |
| | | <el-input v-model="queryParams.postCode" placeholder="请è¾å
¥å²ä½ç¼ç " clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="å²ä½åç§°" prop="postName"> |
| | | <el-input v-model="queryParams.postName" placeholder="请è¾å
¥å²ä½åç§°" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="å²ä½ç¶æ" clearable style="width: 200px"> |
| | | <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:post:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:post:edit']">ä¿®æ¹</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:post:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:post:export']">导åº</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="å²ä½ç¼å·" align="center" prop="postId" v-if="false" /> |
| | | <el-table-column label="å²ä½ç¼ç " align="center" prop="postCode" /> |
| | | <el-table-column label="å²ä½åç§°" align="center" prop="postName" /> |
| | | <el-table-column label="å²ä½æåº" align="center" prop="postSort" /> |
| | | <el-table-column label="ç¶æ" align="center" prop="status"> |
| | | <template #default="scope"> |
| | | <dict-tag :options="sys_normal_disable" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" width="180" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:post:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:post:remove']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | |
| | | <!-- æ·»å æä¿®æ¹å²ä½å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
| | | <el-form ref="postFormRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-form-item label="å²ä½åç§°" prop="postName"> |
| | | <el-input v-model="form.postName" placeholder="请è¾å
¥å²ä½åç§°" /> |
| | | </el-form-item> |
| | | <el-form-item label="å²ä½ç¼ç " prop="postCode"> |
| | | <el-input v-model="form.postCode" placeholder="请è¾å
¥ç¼ç åç§°" /> |
| | | </el-form-item> |
| | | <el-form-item label="å²ä½é¡ºåº" prop="postSort"> |
| | | <el-input-number v-model="form.postSort" controls-position="right" :min="0" /> |
| | | </el-form-item> |
| | | <el-form-item label="å²ä½ç¶æ" prop="status"> |
| | | <el-radio-group v-model="form.status"> |
| | | <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" type="textarea" placeholder="请è¾å
¥å
容" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true"> |
| | | <el-form-item label="ç¨æ·åç§°" prop="userName"> |
| | | <el-input v-model="queryParams.userName" placeholder="请è¾å
¥ç¨æ·åç§°" clearable style="width: 240px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ææºå·ç " prop="phonenumber"> |
| | | <el-input v-model="queryParams.phonenumber" placeholder="请è¾å
¥ææºå·ç " clearable style="width: 240px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="openSelectUser" v-hasPermi="['system:role:add']">æ·»å ç¨æ·</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="CircleClose" :disabled="multiple" @click="cancelAuthUserAll" v-hasPermi="['system:role:remove']"> |
| | | æ¹éåæ¶ææ |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Close" @click="handleClose">å
³é</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :search="true"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="ç¨æ·åç§°" prop="userName" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="ç¨æ·æµç§°" prop="nickName" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="é®ç®±" prop="email" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="ææº" prop="phonenumber" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="ç¶æ" align="center" prop="status"> |
| | | <template #default="scope"> |
| | | <dict-tag :options="sys_normal_disable" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ scope.row.createTime }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="åæ¶ææ" placement="top"> |
| | | <el-button link type="primary" icon="CircleClose" @click="cancelAuthUser(scope.row)" v-hasPermi="['system:role:remove']"> </el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | v-model:page="queryParams.pageNum" |
| | | v-model:limit="queryParams.pageSize" |
| | | @pagination="handleQuery" |
| | | /> |
| | | <select-user ref="selectRef" :roleId="queryParams.roleId" @ok="handleQuery" /> |
| | | </el-card> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="AuthUser" lang="ts"> |
| | | import { allocatedUserList, authUserCancel, authUserCancelAll } from "@/api/system/role"; |
| | | import { UserQuery } from "@/api/system/user/types"; |
| | |
| | | getList(); |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true"> |
| | | <el-form-item label="ç¨æ·åç§°" prop="userName"> |
| | | <el-input v-model="queryParams.userName" placeholder="请è¾å
¥ç¨æ·åç§°" clearable style="width: 240px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ææºå·ç " prop="phonenumber"> |
| | | <el-input v-model="queryParams.phonenumber" placeholder="请è¾å
¥ææºå·ç " clearable style="width: 240px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="openSelectUser" v-hasPermi="['system:role:add']">æ·»å ç¨æ·</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="CircleClose" :disabled="multiple" @click="cancelAuthUserAll" v-hasPermi="['system:role:remove']"> |
| | | æ¹éåæ¶ææ |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Close" @click="handleClose">å
³é</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :search="true"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="ç¨æ·åç§°" prop="userName" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="ç¨æ·æµç§°" prop="nickName" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="é®ç®±" prop="email" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="ææº" prop="phonenumber" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="ç¶æ" align="center" prop="status"> |
| | | <template #default="scope"> |
| | | <dict-tag :options="sys_normal_disable" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ scope.row.createTime }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="åæ¶ææ" placement="top"> |
| | | <el-button link type="primary" icon="CircleClose" @click="cancelAuthUser(scope.row)" v-hasPermi="['system:role:remove']"> </el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | v-model:page="queryParams.pageNum" |
| | | v-model:limit="queryParams.pageSize" |
| | | @pagination="handleQuery" |
| | | /> |
| | | <select-user ref="selectRef" :roleId="queryParams.roleId" @ok="handleQuery" /> |
| | | </el-card> |
| | | </div> |
| | | </template> |
| | | |
| | | <style lang="scss" scoped></style> |
| | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> |
| | | <el-form-item label="è§è²åç§°" prop="roleName"> |
| | | <el-input v-model="queryParams.roleName" placeholder="请è¾å
¥è§è²åç§°" clearable style="width: 240px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="æéå符" prop="roleKey"> |
| | | <el-input v-model="queryParams.roleKey" placeholder="请è¾å
¥æéå符" clearable style="width: 240px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="è§è²ç¶æ" clearable style="width: 240px"> |
| | | <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´" style="width: 308px"> |
| | | <el-date-picker |
| | | v-model="dateRange" |
| | | value-format="YYYY-MM-DD" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleQuery" icon="Search">æç´¢</el-button> |
| | | <el-button @click="resetQuery" icon="Refresh">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain @click="handleAdd()" icon="Plus" v-hasPermi="['system:role:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain @click="handleUpdate()" :disabled="single" icon="Edit" v-hasPermi="['system:role:edit']">ä¿®æ¹</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain :disabled="ids.length === 0" @click="handleDelete()" v-hasPermi="['system:role:delete']">å é¤</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:role:export']">导åº</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table ref="roleTableRef" v-loading="loading" :data="roleList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="è§è²ç¼å·" prop="roleId" width="120" v-if="false" /> |
| | | <el-table-column label="è§è²åç§°" prop="roleName" :show-overflow-tooltip="true" width="150" /> |
| | | <el-table-column label="æéå符" prop="roleKey" :show-overflow-tooltip="true" width="200" /> |
| | | <el-table-column label="æ¾ç¤ºé¡ºåº" prop="roleSort" width="100" /> |
| | | <el-table-column label="ç¶æ" align="center" width="100"> |
| | | <template #default="scope"> |
| | | <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column fixed="right" label="æä½" width="180"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top" v-if="scope.row.roleId !== 1"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:role:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top" v-if="scope.row.roleId !== 1"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:role:remove']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="æ°æ®æé" placement="top" v-if="scope.row.roleId !== 1"> |
| | | <el-button link type="primary" icon="CircleCheck" @click="handleDataScope(scope.row)" v-hasPermi="['system:role:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="åé
ç¨æ·" placement="top" v-if="scope.row.roleId !== 1"> |
| | | <el-button link type="primary" icon="User" @click="handleAuthUser(scope.row)" v-hasPermi="['system:role:edit']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination |
| | | v-if="total > 0" |
| | | v-model:total="total" |
| | | v-model:page="queryParams.pageNum" |
| | | v-model:limit="queryParams.pageSize" |
| | | @pagination="handleQuery" |
| | | /> |
| | | </el-card> |
| | | |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
| | | <el-form ref="roleFormRef" :model="form" :rules="rules" label-width="100px"> |
| | | <el-form-item label="è§è²åç§°" prop="roleName"> |
| | | <el-input v-model="form.roleName" placeholder="请è¾å
¥è§è²åç§°" /> |
| | | </el-form-item> |
| | | <el-form-item prop="roleKey"> |
| | | <template #label> |
| | | <span> |
| | | <el-tooltip content="æ§å¶å¨ä¸å®ä¹çæéå符ï¼å¦ï¼@PreAuthorize(`@ss.hasRole('admin')`)" placement="top"> |
| | | <el-icon><question-filled /></el-icon> |
| | | </el-tooltip> |
| | | æéå符 |
| | | </span> |
| | | </template> |
| | | <el-input v-model="form.roleKey" placeholder="请è¾å
¥æéå符" /> |
| | | </el-form-item> |
| | | <el-form-item label="è§è²é¡ºåº" prop="roleSort"> |
| | | <el-input-number v-model="form.roleSort" controls-position="right" :min="0" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ"> |
| | | <el-radio-group v-model="form.status"> |
| | | <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ |
| | | dict.label |
| | | }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="èåæé"> |
| | | <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">å±å¼/æå </el-checkbox> |
| | | <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">å
¨é/å
¨ä¸é</el-checkbox> |
| | | <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">ç¶åèå¨</el-checkbox> |
| | | <el-tree |
| | | class="tree-border" |
| | | :data="menuOptions" |
| | | show-checkbox |
| | | ref="menuRef" |
| | | node-key="id" |
| | | :check-strictly="!form.menuCheckStrictly" |
| | | empty-text="å è½½ä¸ï¼è¯·ç¨å" |
| | | :props="{ label: 'label', children: 'children' }" |
| | | ></el-tree> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨"> |
| | | <el-input v-model="form.remark" type="textarea" placeholder="请è¾å
¥å
容"></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | |
| | | <!-- åé
è§è²æ°æ®æéå¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="openDataScope" width="500px" append-to-body> |
| | | <el-form :model="form" label-width="80px" ref="dataScopeRef"> |
| | | <el-form-item label="è§è²åç§°"> |
| | | <el-input v-model="form.roleName" :disabled="true" /> |
| | | </el-form-item> |
| | | <el-form-item label="æéå符"> |
| | | <el-input v-model="form.roleKey" :disabled="true" /> |
| | | </el-form-item> |
| | | <el-form-item label="æéèå´"> |
| | | <el-select v-model="form.dataScope" @change="dataScopeSelectChange"> |
| | | <el-option v-for="item in dataScopeOptions" :key="item.value" :label="item.label" :value="item.value"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="æ°æ®æé" v-show="form.dataScope === 2"> |
| | | <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">å±å¼/æå </el-checkbox> |
| | | <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">å
¨é/å
¨ä¸é</el-checkbox> |
| | | <el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">ç¶åèå¨</el-checkbox> |
| | | <el-tree |
| | | class="tree-border" |
| | | :data="deptOptions" |
| | | show-checkbox |
| | | default-expand-all |
| | | ref="deptRef" |
| | | node-key="id" |
| | | :check-strictly="!form.deptCheckStrictly" |
| | | empty-text="å è½½ä¸ï¼è¯·ç¨å" |
| | | :props="{ label: 'label', children: 'children' }" |
| | | ></el-tree> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitDataScope">ç¡® å®</el-button> |
| | | <el-button @click="cancelDataScope">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="Role" lang="ts"> |
| | | import { addRole, changeRoleStatus, dataScope, delRole, getRole, listRole, updateRole, deptTreeSelect } from "@/api/system/role"; |
| | | import { roleMenuTreeselect, treeselect as menuTreeselect } from '@/api/system/menu/index'; |
| | |
| | | getList(); |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> |
| | | <el-form-item label="è§è²åç§°" prop="roleName"> |
| | | <el-input v-model="queryParams.roleName" placeholder="请è¾å
¥è§è²åç§°" clearable style="width: 240px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="æéå符" prop="roleKey"> |
| | | <el-input v-model="queryParams.roleKey" placeholder="请è¾å
¥æéå符" clearable style="width: 240px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="è§è²ç¶æ" clearable style="width: 240px"> |
| | | <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´" style="width: 308px"> |
| | | <el-date-picker |
| | | v-model="dateRange" |
| | | value-format="YYYY-MM-DD" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleQuery" icon="Search">æç´¢</el-button> |
| | | <el-button @click="resetQuery" icon="Refresh">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain @click="handleAdd()" icon="Plus" v-hasPermi="['system:role:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain @click="handleUpdate()" :disabled="single" icon="Edit" v-hasPermi="['system:role:edit']">ä¿®æ¹</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain :disabled="ids.length === 0" @click="handleDelete()" v-hasPermi="['system:role:delete']">å é¤</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:role:export']">导åº</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table ref="roleTableRef" v-loading="loading" :data="roleList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="è§è²ç¼å·" prop="roleId" width="120" v-if="false" /> |
| | | <el-table-column label="è§è²åç§°" prop="roleName" :show-overflow-tooltip="true" width="150" /> |
| | | <el-table-column label="æéå符" prop="roleKey" :show-overflow-tooltip="true" width="200" /> |
| | | <el-table-column label="æ¾ç¤ºé¡ºåº" prop="roleSort" width="100" /> |
| | | <el-table-column label="ç¶æ" align="center" width="100"> |
| | | <template #default="scope"> |
| | | <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column fixed="right" label="æä½" width="180"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top" v-if="scope.row.roleId !== 1"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:role:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top" v-if="scope.row.roleId !== 1"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:role:remove']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="æ°æ®æé" placement="top" v-if="scope.row.roleId !== 1"> |
| | | <el-button link type="primary" icon="CircleCheck" @click="handleDataScope(scope.row)" v-hasPermi="['system:role:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="åé
ç¨æ·" placement="top" v-if="scope.row.roleId !== 1"> |
| | | <el-button link type="primary" icon="User" @click="handleAuthUser(scope.row)" v-hasPermi="['system:role:edit']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination |
| | | v-if="total > 0" |
| | | v-model:total="total" |
| | | v-model:page="queryParams.pageNum" |
| | | v-model:limit="queryParams.pageSize" |
| | | @pagination="handleQuery" |
| | | /> |
| | | </el-card> |
| | | |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
| | | <el-form ref="roleFormRef" :model="form" :rules="rules" label-width="100px"> |
| | | <el-form-item label="è§è²åç§°" prop="roleName"> |
| | | <el-input v-model="form.roleName" placeholder="请è¾å
¥è§è²åç§°" /> |
| | | </el-form-item> |
| | | <el-form-item prop="roleKey"> |
| | | <template #label> |
| | | <span> |
| | | <el-tooltip content="æ§å¶å¨ä¸å®ä¹çæéå符ï¼å¦ï¼@PreAuthorize(`@ss.hasRole('admin')`)" placement="top"> |
| | | <el-icon><question-filled /></el-icon> |
| | | </el-tooltip> |
| | | æéå符 |
| | | </span> |
| | | </template> |
| | | <el-input v-model="form.roleKey" placeholder="请è¾å
¥æéå符" /> |
| | | </el-form-item> |
| | | <el-form-item label="è§è²é¡ºåº" prop="roleSort"> |
| | | <el-input-number v-model="form.roleSort" controls-position="right" :min="0" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ"> |
| | | <el-radio-group v-model="form.status"> |
| | | <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ |
| | | dict.label |
| | | }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="èåæé"> |
| | | <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">å±å¼/æå </el-checkbox> |
| | | <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">å
¨é/å
¨ä¸é</el-checkbox> |
| | | <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">ç¶åèå¨</el-checkbox> |
| | | <el-tree |
| | | class="tree-border" |
| | | :data="menuOptions" |
| | | show-checkbox |
| | | ref="menuRef" |
| | | node-key="id" |
| | | :check-strictly="!form.menuCheckStrictly" |
| | | empty-text="å è½½ä¸ï¼è¯·ç¨å" |
| | | :props="{ label: 'label', children: 'children' }" |
| | | ></el-tree> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨"> |
| | | <el-input v-model="form.remark" type="textarea" placeholder="请è¾å
¥å
容"></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | |
| | | <!-- åé
è§è²æ°æ®æéå¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="openDataScope" width="500px" append-to-body> |
| | | <el-form :model="form" label-width="80px" ref="dataScopeRef"> |
| | | <el-form-item label="è§è²åç§°"> |
| | | <el-input v-model="form.roleName" :disabled="true" /> |
| | | </el-form-item> |
| | | <el-form-item label="æéå符"> |
| | | <el-input v-model="form.roleKey" :disabled="true" /> |
| | | </el-form-item> |
| | | <el-form-item label="æéèå´"> |
| | | <el-select v-model="form.dataScope" @change="dataScopeSelectChange"> |
| | | <el-option v-for="item in dataScopeOptions" :key="item.value" :label="item.label" :value="item.value"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="æ°æ®æé" v-show="form.dataScope === 2"> |
| | | <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">å±å¼/æå </el-checkbox> |
| | | <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">å
¨é/å
¨ä¸é</el-checkbox> |
| | | <el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">ç¶åèå¨</el-checkbox> |
| | | <el-tree |
| | | class="tree-border" |
| | | :data="deptOptions" |
| | | show-checkbox |
| | | default-expand-all |
| | | ref="deptRef" |
| | | node-key="id" |
| | | :check-strictly="!form.deptCheckStrictly" |
| | | empty-text="å è½½ä¸ï¼è¯·ç¨å" |
| | | :props="{ label: 'label', children: 'children' }" |
| | | ></el-tree> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitDataScope">ç¡® å®</el-button> |
| | | <el-button @click="cancelDataScope">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | |
| | | <template> |
| | | <el-row> |
| | | <el-dialog title="éæ©ç¨æ·" v-model="visible" width="800px" top="5vh" append-to-body> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true"> |
| | | <el-form-item label="ç¨æ·åç§°" prop="userName"> |
| | | <el-input v-model="queryParams.userName" placeholder="请è¾å
¥ç¨æ·åç§°" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ææºå·ç " prop="phonenumber"> |
| | | <el-input v-model="queryParams.phonenumber" placeholder="请è¾å
¥ææºå·ç " clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <el-row> |
| | | <el-table @row-click="clickRow" ref="tableRef" :data="userList" @selection-change="handleSelectionChange" height="260px"> |
| | | <el-table-column type="selection" width="55"></el-table-column> |
| | | <el-table-column label="ç¨æ·åç§°" prop="userName" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="ç¨æ·æµç§°" prop="nickName" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="é®ç®±" prop="email" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="ææº" prop="phonenumber" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="ç¶æ" align="center" prop="status"> |
| | | <template #default="scope"> |
| | | <dict-tag :options="sys_normal_disable" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination v-if="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-row> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="handleSelectUser">ç¡® å®</el-button> |
| | | <el-button @click="visible = false">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <script setup name="SelectUser" lang="ts"> |
| | | import { authUserSelectAll, unallocatedUserList } from "@/api/system/role"; |
| | | import { UserVO } from '@/api/system/user/types'; |
| | |
| | | show, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <el-row> |
| | | <el-dialog title="éæ©ç¨æ·" v-model="visible" width="800px" top="5vh" append-to-body> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true"> |
| | | <el-form-item label="ç¨æ·åç§°" prop="userName"> |
| | | <el-input v-model="queryParams.userName" placeholder="请è¾å
¥ç¨æ·åç§°" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ææºå·ç " prop="phonenumber"> |
| | | <el-input v-model="queryParams.phonenumber" placeholder="请è¾å
¥ææºå·ç " clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <el-row> |
| | | <el-table @row-click="clickRow" ref="tableRef" :data="userList" @selection-change="handleSelectionChange" height="260px"> |
| | | <el-table-column type="selection" width="55"></el-table-column> |
| | | <el-table-column label="ç¨æ·åç§°" prop="userName" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="ç¨æ·æµç§°" prop="nickName" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="é®ç®±" prop="email" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="ææº" prop="phonenumber" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="ç¶æ" align="center" prop="status"> |
| | | <template #default="scope"> |
| | | <dict-tag :options="sys_normal_disable" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination v-if="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-row> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="handleSelectUser">ç¡® å®</el-button> |
| | | <el-button @click="visible = false">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <style scoped></style> |
| | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="ç§æ·ç¼å·" prop="tenantId"> |
| | | <el-input v-model="queryParams.tenantId" placeholder="请è¾å
¥ç§æ·ç¼å·" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="è系人" prop="contactUserName"> |
| | | <el-input v-model="queryParams.contactUserName" placeholder="请è¾å
¥è系人" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="èç³»çµè¯" prop="contactPhone"> |
| | | <el-input v-model="queryParams.contactPhone" placeholder="请è¾å
¥èç³»çµè¯" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ä¼ä¸åç§°" prop="companyName"> |
| | | <el-input v-model="queryParams.companyName" placeholder="请è¾å
¥ä¼ä¸åç§°" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:tenant:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:tenant:edit']" |
| | | >ä¿®æ¹</el-button |
| | | > |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:tenant:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:tenant:export']">导åº</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="tenantList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="id" align="center" prop="id" v-if="false" /> |
| | | <el-table-column label="ç§æ·ç¼å·" align="center" prop="tenantId" /> |
| | | <el-table-column label="è系人" align="center" prop="contactUserName" /> |
| | | <el-table-column label="èç³»çµè¯" align="center" prop="contactPhone" /> |
| | | <el-table-column label="ä¼ä¸åç§°" align="center" prop="companyName" /> |
| | | <el-table-column label="社ä¼ä¿¡ç¨ä»£ç " align="center" prop="licenseNumber" /> |
| | | <el-table-column label="è¿ææ¶é´" align="center" prop="expireTime" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.expireTime, '{y}-{m}-{d}') }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç§æ·ç¶æ" align="center" prop="status"> |
| | | <template #default="scope"> |
| | | <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:tenant:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="忥å¥é¤" placement="top"> |
| | | <el-button link type="primary" icon="Refresh" @click="handleSyncTenantPackage(scope.row)" v-hasPermi="['system:tenant:edit']"> |
| | | </el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:tenant:remove']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total>0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | <!-- æ·»å æä¿®æ¹ç§æ·å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
| | | <el-form ref="tenantFormRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-form-item label="ä¼ä¸åç§°" prop="companyName"> |
| | | <el-input v-model="form.companyName" placeholder="请è¾å
¥ä¼ä¸åç§°" /> |
| | | </el-form-item> |
| | | <el-form-item label="è系人" prop="contactUserName"> |
| | | <el-input v-model="form.contactUserName" placeholder="请è¾å
¥è系人" /> |
| | | </el-form-item> |
| | | <el-form-item label="èç³»çµè¯" prop="contactPhone"> |
| | | <el-input v-model="form.contactPhone" placeholder="请è¾å
¥èç³»çµè¯" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="!form.id" label="ç¨æ·å" prop="username"> |
| | | <el-input v-model="form.username" placeholder="请è¾å
¥ç³»ç»ç¨æ·å" maxlength="30" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="!form.id" label="ç¨æ·å¯ç " prop="password"> |
| | | <el-input type="password" v-model="form.password" placeholder="请è¾å
¥ç³»ç»ç¨æ·å¯ç " maxlength="20" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç§æ·å¥é¤" prop="packageId"> |
| | | <el-select v-model="form.packageId" :disabled="!!form.tenantId" placeholder="è¯·éæ©ç§æ·å¥é¤" clearable style="width: 100%"> |
| | | <el-option v-for="item in packageList" :key="item.packageId" :label="item.packageName" :value="item.packageId" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="è¿ææ¶é´" prop="expireTime"> |
| | | <el-date-picker clearable v-model="form.expireTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="è¯·éæ©è¿ææ¶é´"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="ç¨æ·æ°é" prop="accountCount"> |
| | | <el-input v-model="form.accountCount" placeholder="请è¾å
¥ç¨æ·æ°é" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç»å®åå" prop="domain"> |
| | | <el-input v-model="form.domain" placeholder="请è¾å
¥ç»å®åå" /> |
| | | </el-form-item> |
| | | <el-form-item label="ä¼ä¸å°å" prop="address"> |
| | | <el-input v-model="form.address" placeholder="请è¾å
¥ä¼ä¸å°å" /> |
| | | </el-form-item> |
| | | <el-form-item label="ä¼ä¸ä»£ç " prop="licenseNumber"> |
| | | <el-input v-model="form.licenseNumber" placeholder="请è¾å
¥ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç " /> |
| | | </el-form-item> |
| | | <el-form-item label="ä¼ä¸ç®ä»" prop="intro"> |
| | | <el-input type="textarea" v-model="form.intro" placeholder="请è¾å
¥ä¼ä¸ç®ä»" /> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" placeholder="请è¾å
¥å¤æ³¨" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button :loading="buttonLoading" type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="Tenant" lang="ts"> |
| | | import { listTenant, getTenant, delTenant, addTenant, updateTenant, changeTenantStatus, syncTenantPackage} from '@/api/system/tenant'; |
| | | import { listTenantPackage } from '@/api/system/tenantPackage'; |
| | |
| | | getList(); |
| | | }) |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="ç§æ·ç¼å·" prop="tenantId"> |
| | | <el-input v-model="queryParams.tenantId" placeholder="请è¾å
¥ç§æ·ç¼å·" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="è系人" prop="contactUserName"> |
| | | <el-input v-model="queryParams.contactUserName" placeholder="请è¾å
¥è系人" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="èç³»çµè¯" prop="contactPhone"> |
| | | <el-input v-model="queryParams.contactPhone" placeholder="请è¾å
¥èç³»çµè¯" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ä¼ä¸åç§°" prop="companyName"> |
| | | <el-input v-model="queryParams.companyName" placeholder="请è¾å
¥ä¼ä¸åç§°" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:tenant:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:tenant:edit']" |
| | | >ä¿®æ¹</el-button |
| | | > |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:tenant:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:tenant:export']">导åº</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="tenantList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="id" align="center" prop="id" v-if="false" /> |
| | | <el-table-column label="ç§æ·ç¼å·" align="center" prop="tenantId" /> |
| | | <el-table-column label="è系人" align="center" prop="contactUserName" /> |
| | | <el-table-column label="èç³»çµè¯" align="center" prop="contactPhone" /> |
| | | <el-table-column label="ä¼ä¸åç§°" align="center" prop="companyName" /> |
| | | <el-table-column label="社ä¼ä¿¡ç¨ä»£ç " align="center" prop="licenseNumber" /> |
| | | <el-table-column label="è¿ææ¶é´" align="center" prop="expireTime" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.expireTime, '{y}-{m}-{d}') }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç§æ·ç¶æ" align="center" prop="status"> |
| | | <template #default="scope"> |
| | | <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:tenant:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="忥å¥é¤" placement="top"> |
| | | <el-button link type="primary" icon="Refresh" @click="handleSyncTenantPackage(scope.row)" v-hasPermi="['system:tenant:edit']"> |
| | | </el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:tenant:remove']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total>0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | <!-- æ·»å æä¿®æ¹ç§æ·å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
| | | <el-form ref="tenantFormRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-form-item label="ä¼ä¸åç§°" prop="companyName"> |
| | | <el-input v-model="form.companyName" placeholder="请è¾å
¥ä¼ä¸åç§°" /> |
| | | </el-form-item> |
| | | <el-form-item label="è系人" prop="contactUserName"> |
| | | <el-input v-model="form.contactUserName" placeholder="请è¾å
¥è系人" /> |
| | | </el-form-item> |
| | | <el-form-item label="èç³»çµè¯" prop="contactPhone"> |
| | | <el-input v-model="form.contactPhone" placeholder="请è¾å
¥èç³»çµè¯" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="!form.id" label="ç¨æ·å" prop="username"> |
| | | <el-input v-model="form.username" placeholder="请è¾å
¥ç³»ç»ç¨æ·å" maxlength="30" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="!form.id" label="ç¨æ·å¯ç " prop="password"> |
| | | <el-input type="password" v-model="form.password" placeholder="请è¾å
¥ç³»ç»ç¨æ·å¯ç " maxlength="20" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç§æ·å¥é¤" prop="packageId"> |
| | | <el-select v-model="form.packageId" :disabled="!!form.tenantId" placeholder="è¯·éæ©ç§æ·å¥é¤" clearable style="width: 100%"> |
| | | <el-option v-for="item in packageList" :key="item.packageId" :label="item.packageName" :value="item.packageId" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="è¿ææ¶é´" prop="expireTime"> |
| | | <el-date-picker clearable v-model="form.expireTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="è¯·éæ©è¿ææ¶é´"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="ç¨æ·æ°é" prop="accountCount"> |
| | | <el-input v-model="form.accountCount" placeholder="请è¾å
¥ç¨æ·æ°é" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç»å®åå" prop="domain"> |
| | | <el-input v-model="form.domain" placeholder="请è¾å
¥ç»å®åå" /> |
| | | </el-form-item> |
| | | <el-form-item label="ä¼ä¸å°å" prop="address"> |
| | | <el-input v-model="form.address" placeholder="请è¾å
¥ä¼ä¸å°å" /> |
| | | </el-form-item> |
| | | <el-form-item label="ä¼ä¸ä»£ç " prop="licenseNumber"> |
| | | <el-input v-model="form.licenseNumber" placeholder="请è¾å
¥ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç " /> |
| | | </el-form-item> |
| | | <el-form-item label="ä¼ä¸ç®ä»" prop="intro"> |
| | | <el-input type="textarea" v-model="form.intro" placeholder="请è¾å
¥ä¼ä¸ç®ä»" /> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" placeholder="请è¾å
¥å¤æ³¨" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button :loading="buttonLoading" type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="å¥é¤åç§°" prop="packageName"> |
| | | <el-input v-model="queryParams.packageName" placeholder="请è¾å
¥å¥é¤åç§°" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:tenantPackage:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:tenantPackage:edit']" |
| | | >ä¿®æ¹</el-button |
| | | > |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:tenantPackage:remove']" |
| | | >å é¤</el-button |
| | | > |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:tenantPackage:export']">导åº</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="tenantPackageList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="ç§æ·å¥é¤id" align="center" prop="packageId" v-if="false" /> |
| | | <el-table-column label="å¥é¤åç§°" align="center" prop="packageName" /> |
| | | <el-table-column label="夿³¨" align="center" prop="remark" /> |
| | | <el-table-column label="ç¶æ" align="center" prop="status"> |
| | | <template #default="scope"> |
| | | <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @click="handleStatusChange(scope.row)"></el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:tenantPackage:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:tenantPackage:remove']"> </el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total>0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | |
| | | <!-- æ·»å æä¿®æ¹ç§æ·å¥é¤å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
| | | <el-form ref="tenantPackageFormRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-form-item label="å¥é¤åç§°" prop="packageName"> |
| | | <el-input v-model="form.packageName" placeholder="请è¾å
¥å¥é¤åç§°" /> |
| | | </el-form-item> |
| | | <el-form-item label="å
³èèå"> |
| | | <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">å±å¼/æå </el-checkbox> |
| | | <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">å
¨é/å
¨ä¸é</el-checkbox> |
| | | <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">ç¶åèå¨</el-checkbox> |
| | | <el-tree |
| | | class="tree-border" |
| | | :data="menuOptions" |
| | | show-checkbox |
| | | ref="menuTreeRef" |
| | | node-key="id" |
| | | :check-strictly="!form.menuCheckStrictly" |
| | | empty-text="å è½½ä¸ï¼è¯·ç¨å" |
| | | :props="{ label: 'label', children: 'children' }" |
| | | ></el-tree> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" placeholder="请è¾å
¥å¤æ³¨" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button :loading="buttonLoading" type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="TenantPackage" lang="ts"> |
| | | import { listTenantPackage, getTenantPackage, delTenantPackage, addTenantPackage, updateTenantPackage, changePackageStatus } from "@/api/system/tenantPackage"; |
| | | import { treeselect as menuTreeselect, tenantPackageMenuTreeselect } from "@/api/system/menu"; |
| | |
| | | getList(); |
| | | }) |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="å¥é¤åç§°" prop="packageName"> |
| | | <el-input v-model="queryParams.packageName" placeholder="请è¾å
¥å¥é¤åç§°" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:tenantPackage:add']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:tenantPackage:edit']" |
| | | >ä¿®æ¹</el-button |
| | | > |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:tenantPackage:remove']" |
| | | >å é¤</el-button |
| | | > |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:tenantPackage:export']">导åº</el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="tenantPackageList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="ç§æ·å¥é¤id" align="center" prop="packageId" v-if="false" /> |
| | | <el-table-column label="å¥é¤åç§°" align="center" prop="packageName" /> |
| | | <el-table-column label="夿³¨" align="center" prop="remark" /> |
| | | <el-table-column label="ç¶æ" align="center" prop="status"> |
| | | <template #default="scope"> |
| | | <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @click="handleStatusChange(scope.row)"></el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:tenantPackage:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:tenantPackage:remove']"> </el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination v-show="total>0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | |
| | | <!-- æ·»å æä¿®æ¹ç§æ·å¥é¤å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
| | | <el-form ref="tenantPackageFormRef" :model="form" :rules="rules" label-width="80px"> |
| | | <el-form-item label="å¥é¤åç§°" prop="packageName"> |
| | | <el-input v-model="form.packageName" placeholder="请è¾å
¥å¥é¤åç§°" /> |
| | | </el-form-item> |
| | | <el-form-item label="å
³èèå"> |
| | | <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">å±å¼/æå </el-checkbox> |
| | | <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">å
¨é/å
¨ä¸é</el-checkbox> |
| | | <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">ç¶åèå¨</el-checkbox> |
| | | <el-tree |
| | | class="tree-border" |
| | | :data="menuOptions" |
| | | show-checkbox |
| | | ref="menuTreeRef" |
| | | node-key="id" |
| | | :check-strictly="!form.menuCheckStrictly" |
| | | empty-text="å è½½ä¸ï¼è¯·ç¨å" |
| | | :props="{ label: 'label', children: 'children' }" |
| | | ></el-tree> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" placeholder="请è¾å
¥å¤æ³¨" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button :loading="buttonLoading" type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | |
| | | <template> |
| | | <div class="p-2"> |
| | | <div class="panel"> |
| | | <h4 class="panel-title">åºæ¬ä¿¡æ¯</h4> |
| | | <el-form :model="form" label-width="80px" :inline="true"> |
| | | <el-row :gutter="10"> |
| | | <el-col :span="2.5"> |
| | | <el-form-item label="ç¨æ·æµç§°" prop="nickName"> |
| | | <el-input v-model="form.nickName" disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="2.5"> |
| | | <el-form-item label="ç»å½è´¦å·" prop="userName"> |
| | | <el-input v-model="form.userName" disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | </div> |
| | | <div class="panel"> |
| | | <h4 class="panel-title">è§è²ä¿¡æ¯</h4> |
| | | <div> |
| | | <el-table |
| | | v-loading="loading" |
| | | :row-key="getRowKey" |
| | | @row-click="clickRow" |
| | | ref="tableRef" |
| | | @selection-change="handleSelectionChange" |
| | | :data="roles.slice((pageNum - 1) * pageSize, pageNum * pageSize)" |
| | | > |
| | | <el-table-column label="åºå·" width="55" type="index" align="center"> |
| | | <template #default="scope"> |
| | | <span>{{ (pageNum - 1) * pageSize + scope.$index + 1 }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column type="selection" :reserve-selection="true" width="55"></el-table-column> |
| | | <el-table-column label="è§è²ç¼å·" align="center" prop="roleId" /> |
| | | <el-table-column label="è§è²åç§°" align="center" prop="roleName" /> |
| | | <el-table-column label="æéå符" align="center" prop="roleKey" /> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination v-show="total > 0" :total="total" v-model:page="pageNum" v-model:limit="pageSize" /> |
| | | <div style="text-align: center;margin-left:-120px;margin-top:30px;"> |
| | | <el-button type="primary" @click="submitForm()">æäº¤</el-button> |
| | | <el-button @click="close()">è¿å</el-button> |
| | | </div> |
| | | <div></div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="AuthRole" lang="ts"> |
| | | import { RoleVO } from '@/api/system/role/types'; |
| | | import { getAuthRole, updateAuthRole } from '@/api/system/user'; |
| | |
| | | getList(); |
| | | }) |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="p-2"> |
| | | <div class="panel"> |
| | | <h4 class="panel-title">åºæ¬ä¿¡æ¯</h4> |
| | | <el-form :model="form" label-width="80px" :inline="true"> |
| | | <el-row :gutter="10"> |
| | | <el-col :span="2.5"> |
| | | <el-form-item label="ç¨æ·æµç§°" prop="nickName"> |
| | | <el-input v-model="form.nickName" disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="2.5"> |
| | | <el-form-item label="ç»å½è´¦å·" prop="userName"> |
| | | <el-input v-model="form.userName" disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | </div> |
| | | <div class="panel"> |
| | | <h4 class="panel-title">è§è²ä¿¡æ¯</h4> |
| | | <div> |
| | | <el-table |
| | | v-loading="loading" |
| | | :row-key="getRowKey" |
| | | @row-click="clickRow" |
| | | ref="tableRef" |
| | | @selection-change="handleSelectionChange" |
| | | :data="roles.slice((pageNum - 1) * pageSize, pageNum * pageSize)" |
| | | > |
| | | <el-table-column label="åºå·" width="55" type="index" align="center"> |
| | | <template #default="scope"> |
| | | <span>{{ (pageNum - 1) * pageSize + scope.$index + 1 }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column type="selection" :reserve-selection="true" width="55"></el-table-column> |
| | | <el-table-column label="è§è²ç¼å·" align="center" prop="roleId" /> |
| | | <el-table-column label="è§è²åç§°" align="center" prop="roleName" /> |
| | | <el-table-column label="æéå符" align="center" prop="roleKey" /> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="180"> |
| | | <template #default="scope"> |
| | | <span>{{ parseTime(scope.row.createTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination v-show="total > 0" :total="total" v-model:page="pageNum" v-model:limit="pageSize" /> |
| | | <div style="text-align: center;margin-left:-120px;margin-top:30px;"> |
| | | <el-button type="primary" @click="submitForm()">æäº¤</el-button> |
| | | <el-button @click="close()">è¿å</el-button> |
| | | </div> |
| | | <div></div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | |
| | | <template> |
| | | <div class="p-2"> |
| | | <el-row :gutter="20"> |
| | | <!-- é¨é¨æ --> |
| | | <el-col :lg="4" :xs="24" style=""> |
| | | <el-card shadow="never"> |
| | | <el-input v-model="deptName" placeholder="请è¾å
¥é¨é¨åç§°" prefix-icon="Search" clearable /> |
| | | <el-tree |
| | | class="mt-2" |
| | | ref="deptTreeRef" |
| | | :data="deptOptions" |
| | | :props="{ label: 'label', children: 'children' }" |
| | | :expand-on-click-node="false" |
| | | :filter-node-method="filterNode" |
| | | highlight-current |
| | | default-expand-all |
| | | @node-click="handleNodeClick" |
| | | ></el-tree> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :lg="20" :xs="24"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> |
| | | <el-form-item label="ç¨æ·åç§°" prop="userName"> |
| | | <el-input v-model="queryParams.userName" placeholder="请è¾å
¥ç¨æ·åç§°" clearable style="width: 240px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ææºå·ç " prop="phonenumber"> |
| | | <el-input v-model="queryParams.phonenumber" placeholder="请è¾å
¥ææºå·ç " clearable style="width: 240px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="ç¨æ·ç¶æ" clearable style="width: 240px"> |
| | | <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´" style="width: 308px;"> |
| | | <el-date-picker |
| | | v-model="dateRange" |
| | | value-format="YYYY-MM-DD" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleQuery" icon="Search">æç´¢</el-button> |
| | | <el-button @click="resetQuery" icon="Refresh">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain @click="handleAdd()" v-has-permi="['sys:user:add']" icon="Plus">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain @click="handleUpdate()" :disabled="single" v-has-permi="['sys:user:add']" icon="Edit">ä¿®æ¹</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain @click="handleDelete()" :disabled="multiple" v-has-permi="['sys:user:delete']" icon="Delete"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-dropdown class="mt-[1px]"> |
| | | <el-button plain type="info"> |
| | | æ´å¤ |
| | | <el-icon class="el-icon--right"><arrow-down /></el-icon |
| | | ></el-button> |
| | | <template #dropdown> |
| | | <el-dropdown-menu> |
| | | <el-dropdown-item @click="importTemplate" icon="Download">ä¸è½½æ¨¡æ¿</el-dropdown-item> |
| | | <el-dropdown-item @click="handleImport" icon="Top"> 导å
¥æ°æ®</el-dropdown-item> |
| | | <el-dropdown-item @click="handleExport" icon="Download"> å¯¼åºæ°æ®</el-dropdown-item> |
| | | </el-dropdown-menu> |
| | | </template> |
| | | </el-dropdown> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" :search="true"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="50" align="center" /> |
| | | <el-table-column label="ç¨æ·ç¼å·" align="center" key="userId" prop="userId" v-if="columns[0].visible" /> |
| | | <el-table-column label="ç¨æ·åç§°" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="ç¨æ·æµç§°" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" /> |
| | | <el-table-column |
| | | label="é¨é¨" |
| | | align="center" |
| | | key="deptName" |
| | | prop="dept.deptName" |
| | | v-if="columns[3].visible" |
| | | :show-overflow-tooltip="true" |
| | | /> |
| | | <el-table-column label="ææºå·ç " align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible" width="120" /> |
| | | <el-table-column label="ç¶æ" align="center" key="status" v-if="columns[5].visible"> |
| | | <template #default="scope"> |
| | | <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" v-if="columns[6].visible" width="160"> |
| | | <template #default="scope"> |
| | | <span>{{ scope.row.createTime }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="æä½" fixed="right" width="180" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top" v-if="scope.row.userId !== 1"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:user:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top" v-if="scope.row.userId !== 1"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:user:remove']"></el-button> |
| | | </el-tooltip> |
| | | |
| | | <el-tooltip content="éç½®å¯ç " placement="top" v-if="scope.row.userId !== 1"> |
| | | <el-button link type="primary" icon="Key" @click="handleResetPwd(scope.row)" v-hasPermi="['system:user:resetPwd']"></el-button> |
| | | </el-tooltip> |
| | | |
| | | <el-tooltip content="åé
è§è²" placement="top" v-if="scope.row.userId !== 1"> |
| | | <el-button link type="primary" icon="CircleCheck" @click="handleAuthRole(scope.row)" v-hasPermi="['system:user:edit']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | v-model:page="queryParams.pageNum" |
| | | v-model:limit="queryParams.pageSize" |
| | | @pagination="handleQuery" |
| | | /> |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <!-- æ·»å æä¿®æ¹ç¨æ·é
ç½®å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="600px" append-to-body @close="closeDialog"> |
| | | <el-form :model="form" :rules="rules" ref="userFormRef" label-width="80px"> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç¨æ·æµç§°" prop="nickName"> |
| | | <el-input v-model="form.nickName" placeholder="请è¾å
¥ç¨æ·æµç§°" maxlength="30" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å½å±é¨é¨" prop="deptId"> |
| | | <el-tree-select |
| | | v-model="form.deptId" |
| | | :data="deptOptions" |
| | | :props="{ value: 'id', label: 'label', children: 'children' }" |
| | | value-key="id" |
| | | placeholder="è¯·éæ©å½å±é¨é¨" |
| | | check-strictly |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ææºå·ç " prop="phonenumber"> |
| | | <el-input v-model="form.phonenumber" placeholder="请è¾å
¥ææºå·ç " maxlength="11" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="é®ç®±" prop="email"> |
| | | <el-input v-model="form.email" placeholder="请è¾å
¥é®ç®±" maxlength="50" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item v-if="form.userId == undefined" label="ç¨æ·åç§°" prop="userName"> |
| | | <el-input v-model="form.userName" placeholder="请è¾å
¥ç¨æ·åç§°" maxlength="30" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item v-if="form.userId == undefined" label="ç¨æ·å¯ç " prop="password"> |
| | | <el-input v-model="form.password" placeholder="请è¾å
¥ç¨æ·å¯ç " type="password" maxlength="20" show-password /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç¨æ·æ§å«"> |
| | | <el-select v-model="form.sex" placeholder="è¯·éæ©"> |
| | | <el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label" :value="dict.value"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç¶æ"> |
| | | <el-radio-group v-model="form.status"> |
| | | <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ |
| | | dict.label }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å²ä½"> |
| | | <el-select v-model="form.postIds" multiple placeholder="è¯·éæ©"> |
| | | <el-option |
| | | v-for="item in postOptions" |
| | | :key="item.postId" |
| | | :label="item.postName" |
| | | :value="item.postId" |
| | | :disabled="item.status == '1'" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="è§è²"> |
| | | <el-select v-model="form.roleIds" multiple placeholder="è¯·éæ©"> |
| | | <el-option |
| | | v-for="item in roleOptions" |
| | | :key="item.roleId" |
| | | :label="item.roleName" |
| | | :value="item.roleId" |
| | | :disabled="item.status == '1'" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-form-item label="夿³¨"> |
| | | <el-input v-model="form.remark" type="textarea" placeholder="请è¾å
¥å
容"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel()">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | |
| | | <!-- ç¨æ·å¯¼å
¥å¯¹è¯æ¡ --> |
| | | <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body> |
| | | <el-upload |
| | | ref="uploadRef" |
| | | :limit="1" |
| | | accept=".xlsx, .xls" |
| | | :headers="upload.headers" |
| | | :action="upload.url + '?updateSupport=' + upload.updateSupport" |
| | | :disabled="upload.isUploading" |
| | | :on-progress="handleFileUploadProgress" |
| | | :on-success="handleFileSuccess" |
| | | :auto-upload="false" |
| | | drag |
| | | > |
| | | <el-icon class="el-icon--upload"> |
| | | <i-ep-upload-filled /> |
| | | </el-icon> |
| | | <div class="el-upload__text">å°æä»¶æå°æ¤å¤ï¼æ<em>ç¹å»ä¸ä¼ </em></div> |
| | | <template #tip> |
| | | <div class="text-center el-upload__tip"> |
| | | <div class="el-upload__tip"><el-checkbox v-model="upload.updateSupport" />æ¯å¦æ´æ°å·²ç»åå¨çç¨æ·æ°æ®</div> |
| | | <span>ä»
å
许导å
¥xlsãxlsxæ ¼å¼æä»¶ã</span> |
| | | <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">ä¸è½½æ¨¡æ¿</el-link> |
| | | </div> |
| | | </template> |
| | | </el-upload> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitFileForm">ç¡® å®</el-button> |
| | | <el-button @click="upload.open = false">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="User" lang="ts"> |
| | | import { |
| | | changeUserStatus, |
| | |
| | | getList() // åå§ååè¡¨æ°æ® |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="p-2"> |
| | | <el-row :gutter="20"> |
| | | <!-- é¨é¨æ --> |
| | | <el-col :lg="4" :xs="24" style=""> |
| | | <el-card shadow="never"> |
| | | <el-input v-model="deptName" placeholder="请è¾å
¥é¨é¨åç§°" prefix-icon="Search" clearable /> |
| | | <el-tree |
| | | class="mt-2" |
| | | ref="deptTreeRef" |
| | | :data="deptOptions" |
| | | :props="{ label: 'label', children: 'children' }" |
| | | :expand-on-click-node="false" |
| | | :filter-node-method="filterNode" |
| | | highlight-current |
| | | default-expand-all |
| | | @node-click="handleNodeClick" |
| | | ></el-tree> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :lg="20" :xs="24"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> |
| | | <el-form-item label="ç¨æ·åç§°" prop="userName"> |
| | | <el-input v-model="queryParams.userName" placeholder="请è¾å
¥ç¨æ·åç§°" clearable style="width: 240px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ææºå·ç " prop="phonenumber"> |
| | | <el-input v-model="queryParams.phonenumber" placeholder="请è¾å
¥ææºå·ç " clearable style="width: 240px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="ç¨æ·ç¶æ" clearable style="width: 240px"> |
| | | <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´" style="width: 308px;"> |
| | | <el-date-picker |
| | | v-model="dateRange" |
| | | value-format="YYYY-MM-DD" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleQuery" icon="Search">æç´¢</el-button> |
| | | <el-button @click="resetQuery" icon="Refresh">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain @click="handleAdd()" v-has-permi="['sys:user:add']" icon="Plus">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain @click="handleUpdate()" :disabled="single" v-has-permi="['sys:user:add']" icon="Edit">ä¿®æ¹</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain @click="handleDelete()" :disabled="multiple" v-has-permi="['sys:user:delete']" icon="Delete"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-dropdown class="mt-[1px]"> |
| | | <el-button plain type="info"> |
| | | æ´å¤ |
| | | <el-icon class="el-icon--right"><arrow-down /></el-icon |
| | | ></el-button> |
| | | <template #dropdown> |
| | | <el-dropdown-menu> |
| | | <el-dropdown-item @click="importTemplate" icon="Download">ä¸è½½æ¨¡æ¿</el-dropdown-item> |
| | | <el-dropdown-item @click="handleImport" icon="Top"> 导å
¥æ°æ®</el-dropdown-item> |
| | | <el-dropdown-item @click="handleExport" icon="Download"> å¯¼åºæ°æ®</el-dropdown-item> |
| | | </el-dropdown-menu> |
| | | </template> |
| | | </el-dropdown> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" :search="true"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="50" align="center" /> |
| | | <el-table-column label="ç¨æ·ç¼å·" align="center" key="userId" prop="userId" v-if="columns[0].visible" /> |
| | | <el-table-column label="ç¨æ·åç§°" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="ç¨æ·æµç§°" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" /> |
| | | <el-table-column |
| | | label="é¨é¨" |
| | | align="center" |
| | | key="deptName" |
| | | prop="dept.deptName" |
| | | v-if="columns[3].visible" |
| | | :show-overflow-tooltip="true" |
| | | /> |
| | | <el-table-column label="ææºå·ç " align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible" width="120" /> |
| | | <el-table-column label="ç¶æ" align="center" key="status" v-if="columns[5].visible"> |
| | | <template #default="scope"> |
| | | <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" v-if="columns[6].visible" width="160"> |
| | | <template #default="scope"> |
| | | <span>{{ scope.row.createTime }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="æä½" fixed="right" width="180" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top" v-if="scope.row.userId !== 1"> |
| | | <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:user:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top" v-if="scope.row.userId !== 1"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:user:remove']"></el-button> |
| | | </el-tooltip> |
| | | |
| | | <el-tooltip content="éç½®å¯ç " placement="top" v-if="scope.row.userId !== 1"> |
| | | <el-button link type="primary" icon="Key" @click="handleResetPwd(scope.row)" v-hasPermi="['system:user:resetPwd']"></el-button> |
| | | </el-tooltip> |
| | | |
| | | <el-tooltip content="åé
è§è²" placement="top" v-if="scope.row.userId !== 1"> |
| | | <el-button link type="primary" icon="CircleCheck" @click="handleAuthRole(scope.row)" v-hasPermi="['system:user:edit']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | v-model:page="queryParams.pageNum" |
| | | v-model:limit="queryParams.pageSize" |
| | | @pagination="handleQuery" |
| | | /> |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <!-- æ·»å æä¿®æ¹ç¨æ·é
ç½®å¯¹è¯æ¡ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="600px" append-to-body @close="closeDialog"> |
| | | <el-form :model="form" :rules="rules" ref="userFormRef" label-width="80px"> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç¨æ·æµç§°" prop="nickName"> |
| | | <el-input v-model="form.nickName" placeholder="请è¾å
¥ç¨æ·æµç§°" maxlength="30" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å½å±é¨é¨" prop="deptId"> |
| | | <el-tree-select |
| | | v-model="form.deptId" |
| | | :data="deptOptions" |
| | | :props="{ value: 'id', label: 'label', children: 'children' }" |
| | | value-key="id" |
| | | placeholder="è¯·éæ©å½å±é¨é¨" |
| | | check-strictly |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ææºå·ç " prop="phonenumber"> |
| | | <el-input v-model="form.phonenumber" placeholder="请è¾å
¥ææºå·ç " maxlength="11" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="é®ç®±" prop="email"> |
| | | <el-input v-model="form.email" placeholder="请è¾å
¥é®ç®±" maxlength="50" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item v-if="form.userId == undefined" label="ç¨æ·åç§°" prop="userName"> |
| | | <el-input v-model="form.userName" placeholder="请è¾å
¥ç¨æ·åç§°" maxlength="30" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item v-if="form.userId == undefined" label="ç¨æ·å¯ç " prop="password"> |
| | | <el-input v-model="form.password" placeholder="请è¾å
¥ç¨æ·å¯ç " type="password" maxlength="20" show-password /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç¨æ·æ§å«"> |
| | | <el-select v-model="form.sex" placeholder="è¯·éæ©"> |
| | | <el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label" :value="dict.value"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç¶æ"> |
| | | <el-radio-group v-model="form.status"> |
| | | <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ |
| | | dict.label }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å²ä½"> |
| | | <el-select v-model="form.postIds" multiple placeholder="è¯·éæ©"> |
| | | <el-option |
| | | v-for="item in postOptions" |
| | | :key="item.postId" |
| | | :label="item.postName" |
| | | :value="item.postId" |
| | | :disabled="item.status == '1'" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="è§è²"> |
| | | <el-select v-model="form.roleIds" multiple placeholder="è¯·éæ©"> |
| | | <el-option |
| | | v-for="item in roleOptions" |
| | | :key="item.roleId" |
| | | :label="item.roleName" |
| | | :value="item.roleId" |
| | | :disabled="item.status == '1'" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-form-item label="夿³¨"> |
| | | <el-input v-model="form.remark" type="textarea" placeholder="请è¾å
¥å
容"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel()">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | |
| | | <!-- ç¨æ·å¯¼å
¥å¯¹è¯æ¡ --> |
| | | <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body> |
| | | <el-upload |
| | | ref="uploadRef" |
| | | :limit="1" |
| | | accept=".xlsx, .xls" |
| | | :headers="upload.headers" |
| | | :action="upload.url + '?updateSupport=' + upload.updateSupport" |
| | | :disabled="upload.isUploading" |
| | | :on-progress="handleFileUploadProgress" |
| | | :on-success="handleFileSuccess" |
| | | :auto-upload="false" |
| | | drag |
| | | > |
| | | <el-icon class="el-icon--upload"> |
| | | <i-ep-upload-filled /> |
| | | </el-icon> |
| | | <div class="el-upload__text">å°æä»¶æå°æ¤å¤ï¼æ<em>ç¹å»ä¸ä¼ </em></div> |
| | | <template #tip> |
| | | <div class="text-center el-upload__tip"> |
| | | <div class="el-upload__tip"><el-checkbox v-model="upload.updateSupport" />æ¯å¦æ´æ°å·²ç»åå¨çç¨æ·æ°æ®</div> |
| | | <span>ä»
å
许导å
¥xlsãxlsxæ ¼å¼æä»¶ã</span> |
| | | <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">ä¸è½½æ¨¡æ¿</el-link> |
| | | </div> |
| | | </template> |
| | | </el-upload> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitFileForm">ç¡® å®</el-button> |
| | | <el-button @click="upload.open = false">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <style lang="scss" scoped></style> |
| | |
| | | <script setup name="GenEdit" lang="ts"> |
| | | import { getGenTable, updateGenTable } from '@/api/tool/gen'; |
| | | import { DbColumnVO, DbTableVO } from '@/api/tool/gen/types'; |
| | | import { optionselect as getDictOptionselect } from '@/api/system/dict/type'; |
| | | import { DictTypeVO } from '@/api/system/dict/type/types'; |
| | | import basicInfoForm from './basicInfoForm.vue'; |
| | | import genInfoForm from "./genInfoForm.vue"; |
| | | import { ComponentInternalInstance } from "vue"; |
| | | |
| | | const route = useRoute(); |
| | | const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
| | | |
| | | const activeName = ref('columnInfo'); |
| | | const tableHeight = ref(document.documentElement.scrollHeight - 245 + 'px'); |
| | | const tables = ref<DbTableVO[]>([]); |
| | | const columns = ref<DbColumnVO[]>([]); |
| | | const dictOptions = ref<DictTypeVO[]>([]); |
| | | const info = ref<Partial<DbTableVO>>({}); |
| | | |
| | | const basicInfo = ref(basicInfoForm); |
| | | const genInfo = ref(genInfoForm); |
| | | |
| | | /** æäº¤æé® */ |
| | | const submitForm = () => { |
| | | const basicForm = basicInfo.value.$refs.basicInfoForm; |
| | | const genForm = genInfo.value.$refs.genInfoForm; |
| | | |
| | | Promise.all([basicForm, genForm].map(getFormPromise)).then(async res => { |
| | | const validateResult = res.every(item => !!item); |
| | | if (validateResult) { |
| | | const genTable: any = Object.assign({}, info.value); |
| | | genTable.columns = columns.value; |
| | | genTable.params = { |
| | | treeCode: info.value?.treeCode, |
| | | treeName: info.value.treeName, |
| | | treeParentCode: info.value.treeParentCode, |
| | | parentMenuId: info.value.parentMenuId |
| | | }; |
| | | console.log(genTable) |
| | | const response = await updateGenTable(genTable); |
| | | proxy?.$modal.msgSuccess(response.msg); |
| | | if (response.code === 200) { |
| | | close(); |
| | | } |
| | | } else { |
| | | proxy?.$modal.msgError("è¡¨åæ ¡éªæªéè¿ï¼è¯·éæ°æ£æ¥æäº¤å
容"); |
| | | } |
| | | }); |
| | | } |
| | | const getFormPromise = (form: any) => { |
| | | return new Promise(resolve => { |
| | | form.validate((res: any) => { |
| | | resolve(res); |
| | | }); |
| | | }); |
| | | } |
| | | const close = () => { |
| | | const obj = { path: "/tool/gen", query: { t: Date.now(), pageNum: route.query.pageNum } }; |
| | | proxy?.$tab.closeOpenPage(obj); |
| | | } |
| | | |
| | | (async () => { |
| | | const tableId = route.params && route.params.tableId as string; |
| | | if (tableId) { |
| | | // è·å表详ç»ä¿¡æ¯ |
| | | const res = await getGenTable(tableId); |
| | | columns.value = res.data.rows; |
| | | info.value = res.data.info; |
| | | tables.value = res.data.tables; |
| | | /** æ¥è¯¢åå
¸ä¸æå表 */ |
| | | const response = await getDictOptionselect(); |
| | | dictOptions.value = response.data; |
| | | } |
| | | })(); |
| | | </script> |
| | | |
| | | <template> |
| | | <el-card> |
| | | <el-tabs v-model="activeName"> |
| | |
| | | </el-form> |
| | | </el-card> |
| | | </template> |
| | | |
| | | <script setup name="GenEdit" lang="ts"> |
| | | import { getGenTable, updateGenTable } from '@/api/tool/gen'; |
| | | import { DbColumnVO, DbTableVO } from '@/api/tool/gen/types'; |
| | | import { optionselect as getDictOptionselect } from '@/api/system/dict/type'; |
| | | import { DictTypeVO } from '@/api/system/dict/type/types'; |
| | | import basicInfoForm from './basicInfoForm.vue'; |
| | | import genInfoForm from "./genInfoForm.vue"; |
| | | import { ComponentInternalInstance } from "vue"; |
| | | |
| | | const route = useRoute(); |
| | | const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
| | | |
| | | const activeName = ref('columnInfo'); |
| | | const tableHeight = ref(document.documentElement.scrollHeight - 245 + 'px'); |
| | | const tables = ref<DbTableVO[]>([]); |
| | | const columns = ref<DbColumnVO[]>([]); |
| | | const dictOptions = ref<DictTypeVO[]>([]); |
| | | const info = ref<Partial<DbTableVO>>({}); |
| | | |
| | | const basicInfo = ref(basicInfoForm); |
| | | const genInfo = ref(genInfoForm); |
| | | |
| | | /** æäº¤æé® */ |
| | | const submitForm = () => { |
| | | const basicForm = basicInfo.value.$refs.basicInfoForm; |
| | | const genForm = genInfo.value.$refs.genInfoForm; |
| | | |
| | | Promise.all([basicForm, genForm].map(getFormPromise)).then(async res => { |
| | | const validateResult = res.every(item => !!item); |
| | | if (validateResult) { |
| | | const genTable: any = Object.assign({}, info.value); |
| | | genTable.columns = columns.value; |
| | | genTable.params = { |
| | | treeCode: info.value?.treeCode, |
| | | treeName: info.value.treeName, |
| | | treeParentCode: info.value.treeParentCode, |
| | | parentMenuId: info.value.parentMenuId |
| | | }; |
| | | console.log(genTable) |
| | | const response = await updateGenTable(genTable); |
| | | proxy?.$modal.msgSuccess(response.msg); |
| | | if (response.code === 200) { |
| | | close(); |
| | | } |
| | | } else { |
| | | proxy?.$modal.msgError("è¡¨åæ ¡éªæªéè¿ï¼è¯·éæ°æ£æ¥æäº¤å
容"); |
| | | } |
| | | }); |
| | | } |
| | | const getFormPromise = (form: any) => { |
| | | return new Promise(resolve => { |
| | | form.validate((res: any) => { |
| | | resolve(res); |
| | | }); |
| | | }); |
| | | } |
| | | const close = () => { |
| | | const obj = { path: "/tool/gen", query: { t: Date.now(), pageNum: route.query.pageNum } }; |
| | | proxy?.$tab.closeOpenPage(obj); |
| | | } |
| | | |
| | | (async () => { |
| | | const tableId = route.params && route.params.tableId as string; |
| | | if (tableId) { |
| | | // è·å表详ç»ä¿¡æ¯ |
| | | const res = await getGenTable(tableId); |
| | | columns.value = res.data.rows; |
| | | info.value = res.data.info; |
| | | tables.value = res.data.tables; |
| | | /** æ¥è¯¢åå
¸ä¸æå表 */ |
| | | const response = await getDictOptionselect(); |
| | | dictOptions.value = response.data; |
| | | } |
| | | })(); |
| | | </script> |
| | |
| | | <template> |
| | | <!-- 导å
¥è¡¨ --> |
| | | <el-dialog title="导å
¥è¡¨" v-model="visible" width="800px" top="5vh" append-to-body> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true"> |
| | | <el-form-item label="表åç§°" prop="tableName"> |
| | | <el-input v-model="queryParams.tableName" placeholder="请è¾å
¥è¡¨åç§°" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="表æè¿°" prop="tableComment"> |
| | | <el-input v-model="queryParams.tableComment" placeholder="请è¾å
¥è¡¨æè¿°" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <el-row> |
| | | <el-table @row-click="clickRow" ref="tableRef" :data="dbTableList" @selection-change="handleSelectionChange" height="260px"> |
| | | <el-table-column type="selection" width="55"></el-table-column> |
| | | <el-table-column prop="tableName" label="表åç§°" :show-overflow-tooltip="true"></el-table-column> |
| | | <el-table-column prop="tableComment" label="表æè¿°" :show-overflow-tooltip="true"></el-table-column> |
| | | <el-table-column prop="createTime" label="å建æ¶é´"></el-table-column> |
| | | <el-table-column prop="updateTime" label="æ´æ°æ¶é´"></el-table-column> |
| | | </el-table> |
| | | <pagination v-show="total>0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-row> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="handleImportTable">ç¡® å®</el-button> |
| | | <el-button @click="visible = false">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { listDbTable, importTable } from '@/api/tool/gen'; |
| | | import { DbTableQuery, DbTableVO } from '@/api/tool/gen/types'; |
| | |
| | | show, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <!-- 导å
¥è¡¨ --> |
| | | <el-dialog title="导å
¥è¡¨" v-model="visible" width="800px" top="5vh" append-to-body> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true"> |
| | | <el-form-item label="表åç§°" prop="tableName"> |
| | | <el-input v-model="queryParams.tableName" placeholder="请è¾å
¥è¡¨åç§°" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="表æè¿°" prop="tableComment"> |
| | | <el-input v-model="queryParams.tableComment" placeholder="请è¾å
¥è¡¨æè¿°" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <el-row> |
| | | <el-table @row-click="clickRow" ref="tableRef" :data="dbTableList" @selection-change="handleSelectionChange" height="260px"> |
| | | <el-table-column type="selection" width="55"></el-table-column> |
| | | <el-table-column prop="tableName" label="表åç§°" :show-overflow-tooltip="true"></el-table-column> |
| | | <el-table-column prop="tableComment" label="表æè¿°" :show-overflow-tooltip="true"></el-table-column> |
| | | <el-table-column prop="createTime" label="å建æ¶é´"></el-table-column> |
| | | <el-table-column prop="updateTime" label="æ´æ°æ¶é´"></el-table-column> |
| | | </el-table> |
| | | <pagination v-show="total>0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-row> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="handleImportTable">ç¡® å®</el-button> |
| | | <el-button @click="visible = false">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </template> |
| | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="æ°æ®æº" prop="dataName"> |
| | | <el-input v-model="queryParams.dataName" placeholder="请è¾å
¥æ°æ®æºåç§°" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="表åç§°" prop="tableName"> |
| | | <el-input v-model="queryParams.tableName" placeholder="请è¾å
¥è¡¨åç§°" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="表æè¿°" prop="tableComment"> |
| | | <el-input v-model="queryParams.tableComment" placeholder="请è¾å
¥è¡¨æè¿°" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´" style="width: 308px"> |
| | | <el-date-picker |
| | | v-model="dateRange" |
| | | value-format="YYYY-MM-DD" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Download" @click="handleGenTable()" v-hasPermi="['tool:gen:code']">çæ</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="info" plain icon="Upload" @click="openImportTable" v-hasPermi="['tool:gen:import']">导å
¥</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain icon="Edit" :disabled="single" @click="handleEditTable()" v-hasPermi="['tool:gen:edit']">ä¿®æ¹</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['tool:gen:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="tableList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" align="center" width="55"></el-table-column> |
| | | <el-table-column label="åºå·" type="index" width="50" align="center"> |
| | | <template #default="scope"> |
| | | <span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="表åç§°" align="center" prop="tableName" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="表æè¿°" align="center" prop="tableComment" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="å®ä½" align="center" prop="className" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="160" /> |
| | | <el-table-column label="æ´æ°æ¶é´" align="center" prop="updateTime" width="160" /> |
| | | <el-table-column label="æä½" align="center" width="330" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="é¢è§" placement="top"> |
| | | <el-button link type="primary" icon="View" @click="handlePreview(scope.row)" v-hasPermi="['tool:gen:preview']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="ç¼è¾" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleEditTable(scope.row)" v-hasPermi="['tool:gen:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['tool:gen:remove']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="忥" placement="top"> |
| | | <el-button link type="primary" icon="Refresh" @click="handleSynchDb(scope.row)" v-hasPermi="['tool:gen:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="çæä»£ç " placement="top"> |
| | | <el-button link type="primary" icon="Download" @click="handleGenTable(scope.row)" v-hasPermi="['tool:gen:code']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | |
| | | <!-- é¢è§çé¢ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="80%" top="5vh" append-to-body class="scrollbar"> |
| | | <el-tabs v-model="preview.activeName"> |
| | | <el-tab-pane |
| | | v-for="(value, key) in preview.data" |
| | | :label="(key as any).substring((key as any).lastIndexOf('/') + 1, (key as any).indexOf('.vm'))" |
| | | :name="(key as any).substring((key as any).lastIndexOf('/') + 1, (key as any).indexOf('.vm'))" |
| | | :key="value" |
| | | > |
| | | <el-link :underline="false" icon="DocumentCopy" v-copyText="value" v-copyText:callback="copyTextSuccess" style="float:right" |
| | | > å¤å¶</el-link |
| | | > |
| | | <pre>{{ value }}</pre> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </el-dialog> |
| | | <import-table ref="importRef" @ok="handleQuery" /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="Gen" lang="ts"> |
| | | import { listTable, previewTable, delTable, genCode, synchDb } from '@/api/tool/gen'; |
| | | import { TableQuery, TableVO } from '@/api/tool/gen/types'; |
| | |
| | | getList(); |
| | | }) |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="p-2"> |
| | | <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
| | | <div class="search" v-show="showSearch"> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> |
| | | <el-form-item label="æ°æ®æº" prop="dataName"> |
| | | <el-input v-model="queryParams.dataName" placeholder="请è¾å
¥æ°æ®æºåç§°" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="表åç§°" prop="tableName"> |
| | | <el-input v-model="queryParams.tableName" placeholder="请è¾å
¥è¡¨åç§°" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="表æè¿°" prop="tableComment"> |
| | | <el-input v-model="queryParams.tableComment" placeholder="请è¾å
¥è¡¨æè¿°" clearable style="width: 200px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´" style="width: 308px"> |
| | | <el-date-picker |
| | | v-model="dateRange" |
| | | value-format="YYYY-MM-DD" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </transition> |
| | | |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="Download" @click="handleGenTable()" v-hasPermi="['tool:gen:code']">çæ</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="info" plain icon="Upload" @click="openImportTable" v-hasPermi="['tool:gen:import']">导å
¥</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" plain icon="Edit" :disabled="single" @click="handleEditTable()" v-hasPermi="['tool:gen:edit']">ä¿®æ¹</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['tool:gen:remove']"> |
| | | å é¤ |
| | | </el-button> |
| | | </el-col> |
| | | <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </template> |
| | | |
| | | <el-table v-loading="loading" :data="tableList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" align="center" width="55"></el-table-column> |
| | | <el-table-column label="åºå·" type="index" width="50" align="center"> |
| | | <template #default="scope"> |
| | | <span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="表åç§°" align="center" prop="tableName" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="表æè¿°" align="center" prop="tableComment" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="å®ä½" align="center" prop="className" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="160" /> |
| | | <el-table-column label="æ´æ°æ¶é´" align="center" prop="updateTime" width="160" /> |
| | | <el-table-column label="æä½" align="center" width="330" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="é¢è§" placement="top"> |
| | | <el-button link type="primary" icon="View" @click="handlePreview(scope.row)" v-hasPermi="['tool:gen:preview']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="ç¼è¾" placement="top"> |
| | | <el-button link type="primary" icon="Edit" @click="handleEditTable(scope.row)" v-hasPermi="['tool:gen:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="å é¤" placement="top"> |
| | | <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['tool:gen:remove']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="忥" placement="top"> |
| | | <el-button link type="primary" icon="Refresh" @click="handleSynchDb(scope.row)" v-hasPermi="['tool:gen:edit']"></el-button> |
| | | </el-tooltip> |
| | | <el-tooltip content="çæä»£ç " placement="top"> |
| | | <el-button link type="primary" icon="Download" @click="handleGenTable(scope.row)" v-hasPermi="['tool:gen:code']"></el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
| | | </el-card> |
| | | |
| | | <!-- é¢è§çé¢ --> |
| | | <el-dialog :title="dialog.title" v-model="dialog.visible" width="80%" top="5vh" append-to-body class="scrollbar"> |
| | | <el-tabs v-model="preview.activeName"> |
| | | <el-tab-pane |
| | | v-for="(value, key) in preview.data" |
| | | :label="(key as any).substring((key as any).lastIndexOf('/') + 1, (key as any).indexOf('.vm'))" |
| | | :name="(key as any).substring((key as any).lastIndexOf('/') + 1, (key as any).indexOf('.vm'))" |
| | | :key="value" |
| | | > |
| | | <el-link :underline="false" icon="DocumentCopy" v-copyText="value" v-copyText:callback="copyTextSuccess" style="float:right" |
| | | > å¤å¶</el-link |
| | | > |
| | | <pre>{{ value }}</pre> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </el-dialog> |
| | | <import-table ref="importRef" @ok="handleQuery" /> |
| | | </div> |
| | | </template> |
| | |
| | | import { UserConfig, ConfigEnv, loadEnv, defineConfig } from 'vite'; |
| | | |
| | | import createPlugins from './Vite/plugins'; |
| | | import createPlugins from './vite/plugins'; |
| | | |
| | | import path from 'path'; |
| | | export default defineConfig(({ mode, command }: ConfigEnv): UserConfig => { |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import AutoImport from 'unplugin-auto-import/vite'; |
| | | import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'; |
| | | import IconsResolver from 'unplugin-icons/resolver'; |
| | | |
| | | export default (path: any) => { |
| | | return AutoImport({ |
| | | // èªå¨å¯¼å
¥ Vue ç¸å
³å½æ° |
| | | imports: ['vue', 'vue-router', '@vueuse/core', 'pinia'], |
| | | eslintrc: { |
| | | enabled: false, |
| | | filepath: './.eslintrc-auto-import.json', |
| | | globalsPropValue: true |
| | | }, |
| | | resolvers: [ |
| | | // èªå¨å¯¼å
¥ Element Plus ç¸å
³å½æ°ElMessage, ElMessageBox... (å¸¦æ ·å¼) |
| | | ElementPlusResolver(), |
| | | IconsResolver({ |
| | | prefix: 'Icon' |
| | | }) |
| | | ], |
| | | vueTemplate: true, // æ¯å¦å¨ vue 模æ¿ä¸èªå¨å¯¼å
¥ |
| | | dts: path.resolve(path.resolve(__dirname, '../../src'), 'types', 'auto-imports.d.ts') |
| | | }); |
| | | }; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import Components from 'unplugin-vue-components/vite'; |
| | | import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'; |
| | | import IconsResolver from 'unplugin-icons/resolver'; |
| | | |
| | | export default (path: any) => { |
| | | return Components({ |
| | | resolvers: [ |
| | | // èªå¨å¯¼å
¥ Element Plus ç»ä»¶ |
| | | ElementPlusResolver(), |
| | | // èªå¨æ³¨å徿 ç»ä»¶ |
| | | IconsResolver({ |
| | | enabledCollections: ['ep'] |
| | | }) |
| | | ], |
| | | dts: path.resolve(path.resolve(__dirname, '../../src'), 'types', 'components.d.ts') |
| | | }); |
| | | }; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import compression from 'vite-plugin-compression'; |
| | | |
| | | export default function createCompression(env: any) { |
| | | const { VITE_BUILD_COMPRESS } = env; |
| | | const plugin: any[] = []; |
| | | if (VITE_BUILD_COMPRESS) { |
| | | const compressList = VITE_BUILD_COMPRESS.split(','); |
| | | if (compressList.includes('gzip')) { |
| | | // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使ç¨gzipè§£åç¼©éææä»¶ |
| | | plugin.push( |
| | | compression({ |
| | | ext: '.gz', |
| | | deleteOriginFile: false |
| | | }) |
| | | ); |
| | | } |
| | | if (compressList.includes('brotli')) { |
| | | plugin.push( |
| | | compression({ |
| | | ext: '.br', |
| | | algorithm: 'brotliCompress', |
| | | deleteOriginFile: false |
| | | }) |
| | | ); |
| | | } |
| | | } |
| | | return plugin; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import Icons from 'unplugin-icons/vite'; |
| | | |
| | | export default () => { |
| | | return Icons({ |
| | | // èªå¨å®è£
徿 åº |
| | | autoInstall: true |
| | | }); |
| | | }; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import vue from '@vitejs/plugin-vue'; |
| | | import createUnoCss from './unocss'; |
| | | import createAutoImport from './auto-import'; |
| | | import createComponents from './components'; |
| | | import createIcons from './icons'; |
| | | import createSvgIconsPlugin from './svg-icon'; |
| | | import createCompression from './compression'; |
| | | import path from 'path'; |
| | | |
| | | export default (viteEnv: any, isBuild = false): [] => { |
| | | const vitePlusgins: any = []; |
| | | vitePlusgins.push(vue()); |
| | | vitePlusgins.push(createUnoCss()); |
| | | vitePlusgins.push(createAutoImport(path)); |
| | | vitePlusgins.push(createComponents(path)); |
| | | vitePlusgins.push(createCompression(viteEnv)); |
| | | vitePlusgins.push(createIcons()); |
| | | vitePlusgins.push(createSvgIconsPlugin(path, isBuild)); |
| | | return vitePlusgins; |
| | | }; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; |
| | | export default (path: any, isBuild: boolean) => { |
| | | return createSvgIconsPlugin({ |
| | | // æå®éè¦ç¼åç徿 æä»¶å¤¹ |
| | | iconDirs: [path.resolve(path.resolve(__dirname, '../../src'), 'assets/icons/svg')], |
| | | // æå®symbolIdæ ¼å¼ |
| | | symbolId: 'icon-[dir]-[name]', |
| | | svgoOptions: isBuild |
| | | }); |
| | | }; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import UnoCss from 'unocss/vite'; |
| | | import { presetUno, presetAttributify, presetIcons } from 'unocss'; |
| | | |
| | | export default () => { |
| | | return UnoCss({ |
| | | presets: [presetUno(), presetAttributify(), presetIcons()], |
| | | // rules: [['search', {}]], |
| | | shortcuts: { |
| | | 'panel-title': |
| | | 'pb-[5px] font-sans leading-[1.1] font-medium text-base text-[#6379bb] border-b border-b-solid border-[var(--el-border-color-light)] mb-5 mt-0' |
| | | } |
| | | }); |
| | | }; |