README.md
@@ -12,6 +12,7 @@ * æé认è¯ä½¿ç¨Jwtï¼æ¯æå¤ç»ç«¯è®¤è¯ç³»ç»ã * æ¯æå è½½å¨ææéèåï¼å¤æ¹å¼è½»æ¾æéæ§å¶ã * 髿çå¼åï¼ä½¿ç¨ä»£ç çæå¨å¯ä»¥ä¸é®çæåå端代ç ã * æä¾äºä¸ä¸ªOracleçæ¬[RuoYi-Vue-Oracle](https://github.com/yangzongzhuan/RuoYi-Vue-Oracle)ï¼ä¿æåæ¥æ´æ°ã * æè°¢[Vue-Element-Admin](https://github.com/PanJiaChen/vue-element-admin)ï¼[eladmin-web](https://gitee.com/elunez/eladmin-web?_from=gitee_search)ã * ä¸åç¦»çæ¬ï¼è¯·ç§»æ¥[RuoYi](https://gitee.com/y_project/RuoYi)ï¼å¾®æå¡çæ¬ï¼è¯·ç§»æ¥[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud) * é¿éäºä¼æ å¸ï¼[ç¹æè¿å ¥](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link)ï¼è ¾è®¯äºä¼æ å¸ï¼[ç¹æé¢å](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console) ruoyi-ui/package.json
@@ -1,11 +1,11 @@ { "name": "ruoyi", "version": "2.2.0", "version": "2.3.0", "description": "è¥ä¾ç®¡çç³»ç»", "author": "è¥ä¾", "license": "MIT", "scripts": { "dev": "vue-cli-service serve", "dev": "vue-cli-service serve --open", "build:prod": "vue-cli-service build", "build:stage": "vue-cli-service build --mode staging", "preview": "node build/index.js --preview", ruoyi-ui/src/api/system/config.js
@@ -51,6 +51,14 @@ }) } // æ¸ çåæ°ç¼å export function clearCache() { return request({ url: '/system/config/clearCache', method: 'delete' }) } // 导åºåæ° export function exportConfig(query) { return request({ ruoyi-ui/src/api/system/dict/data.js
@@ -20,7 +20,7 @@ // æ ¹æ®åå ¸ç±»åæ¥è¯¢åå ¸æ°æ®ä¿¡æ¯ export function getDicts(dictType) { return request({ url: '/system/dict/data/dictType/' + dictType, url: '/system/dict/data/type/' + dictType, method: 'get' }) } ruoyi-ui/src/api/system/dict/type.js
@@ -43,6 +43,14 @@ }) } // æ¸ çåæ°ç¼å export function clearCache() { return request({ url: '/system/dict/type/clearCache', method: 'delete' }) } // 导åºåå ¸ç±»å export function exportType(query) { return request({ ruoyi-ui/src/assets/styles/element-variables.scss
@@ -6,7 +6,7 @@ /* theme color */ $--color-primary: #1890ff; $--color-success: #13ce66; $--color-warning: #FFBA00; $--color-warning: #ffba00; $--color-danger: #ff4949; // $--color-info: #1E1E1E; ruoyi-ui/src/components/SvgIcon/index.vue
@@ -1,7 +1,7 @@ <template> <div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" /> <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners"> <use :href="iconName" /> <use :xlink:href="iconName" /> </svg> </template> ruoyi-ui/src/layout/components/Sidebar/Link.vue
@@ -1,7 +1,5 @@ <template> <!-- eslint-disable vue/require-component-is --> <component v-bind="linkProps(to)"> <component :is="type" v-bind="linkProps(to)"> <slot /> </component> </template> @@ -16,19 +14,28 @@ required: true } }, computed: { isExternal() { return isExternal(this.to) }, type() { if (this.isExternal) { return 'a' } return 'router-link' } }, methods: { linkProps(url) { if (isExternal(url)) { linkProps(to) { if (this.isExternal) { return { is: 'a', href: url, href: to, target: '_blank', rel: 'noopener' } } return { is: 'router-link', to: url to: to } } } ruoyi-ui/src/layout/components/Sidebar/index.vue
@@ -13,8 +13,8 @@ mode="vertical" > <sidebar-item v-for="route in permission_routes" :key="route.path" v-for="(route, index) in permission_routes" :key="route.path + index" :item="route" :base-path="route.path" /> ruoyi-ui/src/layout/components/TagsView/ScrollPane.vue
@@ -19,12 +19,21 @@ return this.$refs.scrollContainer.$refs.wrap } }, mounted() { this.scrollWrapper.addEventListener('scroll', this.emitScroll, true) }, beforeDestroy() { this.scrollWrapper.removeEventListener('scroll', this.emitScroll) }, methods: { handleScroll(e) { const eventDelta = e.wheelDelta || -e.deltaY * 40 const $scrollWrapper = this.scrollWrapper $scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4 }, emitScroll() { this.$emit('scroll') }, moveToTarget(currentTag) { const $container = this.$refs.scrollContainer.$el const $containerWidth = $container.offsetWidth ruoyi-ui/src/layout/components/TagsView/index.vue
@@ -1,6 +1,6 @@ <template> <div id="tags-view-container" class="tags-view-container"> <scroll-pane ref="scrollPane" class="tags-view-wrapper"> <scroll-pane ref="scrollPane" class="tags-view-wrapper" @scroll="handleScroll"> <router-link v-for="tag in visitedViews" ref="tag" @@ -14,11 +14,7 @@ @contextmenu.prevent.native="openMenu(tag,$event)" > {{ tag.title }} <span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" /> <span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" /> </router-link> </scroll-pane> <ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu"> @@ -31,8 +27,8 @@ </template> <script> import ScrollPane from "./ScrollPane"; import path from "path"; import ScrollPane from './ScrollPane' import path from 'path' export default { components: { ScrollPane }, @@ -43,14 +39,14 @@ left: 0, selectedTag: {}, affixTags: [] }; } }, computed: { visitedViews() { return this.$store.state.tagsView.visitedViews; return this.$store.state.tagsView.visitedViews }, routes() { return this.$store.state.permission.routes; return this.$store.state.permission.routes }, theme() { return this.$store.state.settings.theme; @@ -58,24 +54,24 @@ }, watch: { $route() { this.addTags(); this.moveToCurrentTag(); this.addTags() this.moveToCurrentTag() }, visible(value) { if (value) { document.body.addEventListener("click", this.closeMenu); document.body.addEventListener('click', this.closeMenu) } else { document.body.removeEventListener("click", this.closeMenu); document.body.removeEventListener('click', this.closeMenu) } } }, mounted() { this.initTags(); this.addTags(); this.initTags() this.addTags() }, methods: { isActive(route) { return route.path === this.$route.path; return route.path === this.$route.path }, activeStyle(tag) { if (!this.isActive(tag)) return {}; @@ -85,142 +81,131 @@ }; }, isAffix(tag) { return tag.meta && tag.meta.affix; return tag.meta && tag.meta.affix }, filterAffixTags(routes, basePath = "/") { let tags = []; filterAffixTags(routes, basePath = '/') { let tags = [] routes.forEach(route => { if (route.meta && route.meta.affix) { const tagPath = path.resolve(basePath, route.path); const tagPath = path.resolve(basePath, route.path) tags.push({ fullPath: tagPath, path: tagPath, name: route.name, meta: { ...route.meta } }); }) } if (route.children) { const tempTags = this.filterAffixTags( route.children, route.path ); const tempTags = this.filterAffixTags(route.children, route.path) if (tempTags.length >= 1) { tags = [...tags, ...tempTags]; tags = [...tags, ...tempTags] } } }); return tags; }) return tags }, initTags() { const affixTags = (this.affixTags = this.filterAffixTags( this.routes )); const affixTags = this.affixTags = this.filterAffixTags(this.routes) for (const tag of affixTags) { // Must have tag name if (tag.name) { this.$store.dispatch("tagsView/addVisitedView", tag); this.$store.dispatch('tagsView/addVisitedView', tag) } } }, addTags() { const { name } = this.$route; const { name } = this.$route if (name) { this.$store.dispatch("tagsView/addView", this.$route); this.$store.dispatch('tagsView/addView', this.$route) } return false; return false }, moveToCurrentTag() { const tags = this.$refs.tag; const tags = this.$refs.tag this.$nextTick(() => { for (const tag of tags) { if (tag.to.path === this.$route.path) { this.$refs.scrollPane.moveToTarget(tag); this.$refs.scrollPane.moveToTarget(tag) // when query is different then update if (tag.to.fullPath !== this.$route.fullPath) { this.$store.dispatch( "tagsView/updateVisitedView", this.$route ); this.$store.dispatch('tagsView/updateVisitedView', this.$route) } break; break } } }); }) }, refreshSelectedTag(view) { this.$store.dispatch("tagsView/delCachedView", view).then(() => { const { fullPath } = view; this.$store.dispatch('tagsView/delCachedView', view).then(() => { const { fullPath } = view this.$nextTick(() => { this.$router.replace({ path: "/redirect" + fullPath }); }); }); path: '/redirect' + fullPath }) }) }) }, closeSelectedTag(view) { this.$store .dispatch("tagsView/delView", view) .then(({ visitedViews }) => { this.$store.dispatch('tagsView/delView', view).then(({ visitedViews }) => { if (this.isActive(view)) { this.toLastView(visitedViews, view); this.toLastView(visitedViews, view) } }); }) }, closeOthersTags() { this.$router.push(this.selectedTag); this.$store .dispatch("tagsView/delOthersViews", this.selectedTag) .then(() => { this.moveToCurrentTag(); }); this.$router.push(this.selectedTag) this.$store.dispatch('tagsView/delOthersViews', this.selectedTag).then(() => { this.moveToCurrentTag() }) }, closeAllTags(view) { this.$store .dispatch("tagsView/delAllViews") .then(({ visitedViews }) => { this.$store.dispatch('tagsView/delAllViews').then(({ visitedViews }) => { if (this.affixTags.some(tag => tag.path === view.path)) { return; return } this.toLastView(visitedViews, view); }); this.toLastView(visitedViews, view) }) }, toLastView(visitedViews, view) { const latestView = visitedViews.slice(-1)[0]; const latestView = visitedViews.slice(-1)[0] if (latestView) { this.$router.push(latestView.fullPath); this.$router.push(latestView.fullPath) } else { // now the default is to redirect to the home page if there is no tags-view, // you can adjust it according to your needs. if (view.name === "Dashboard") { if (view.name === 'Dashboard') { // to reload home page this.$router.replace({ path: "/redirect" + view.fullPath }); this.$router.replace({ path: '/redirect' + view.fullPath }) } else { this.$router.push("/"); this.$router.push('/') } } }, openMenu(tag, e) { const menuMinWidth = 105; const offsetLeft = this.$el.getBoundingClientRect().left; // container margin left const offsetWidth = this.$el.offsetWidth; // container width const maxLeft = offsetWidth - menuMinWidth; // left boundary const left = e.clientX - offsetLeft + 15; // 15: margin right const menuMinWidth = 105 const offsetLeft = this.$el.getBoundingClientRect().left // container margin left const offsetWidth = this.$el.offsetWidth // container width const maxLeft = offsetWidth - menuMinWidth // left boundary const left = e.clientX - offsetLeft + 15 // 15: margin right if (left > maxLeft) { this.left = maxLeft; this.left = maxLeft } else { this.left = left; this.left = left } this.top = e.clientY; this.visible = true; this.selectedTag = tag; this.top = e.clientY this.visible = true this.selectedTag = tag }, closeMenu() { this.visible = false; this.visible = false }, handleScroll() { this.closeMenu() } } }; } </script> <style lang="scss" scoped> @@ -229,7 +214,7 @@ width: 100%; background: #fff; border-bottom: 1px solid #d8dce5; box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 0 3px 0 rgba(0, 0, 0, 0.04); box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .12), 0 0 3px 0 rgba(0, 0, 0, .04); .tags-view-wrapper { .tags-view-item { display: inline-block; @@ -255,7 +240,7 @@ color: #fff; border-color: #42b983; &::before { content: ""; content: ''; background: #fff; display: inline-block; width: 8px; @@ -278,7 +263,7 @@ font-size: 12px; font-weight: 400; color: #333; box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3); box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, .3); li { margin: 0; padding: 7px 16px; @@ -301,10 +286,10 @@ vertical-align: 2px; border-radius: 50%; text-align: center; transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); transition: all .3s cubic-bezier(.645, .045, .355, 1); transform-origin: 100% 50%; &:before { transform: scale(0.6); transform: scale(.6); display: inline-block; vertical-align: -3px; } ruoyi-ui/src/views/monitor/job/index.vue
@@ -438,8 +438,6 @@ this.msgSuccess("ä¿®æ¹æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } else { @@ -448,8 +446,6 @@ this.msgSuccess("æ°å¢æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } ruoyi-ui/src/views/system/config/index.vue
@@ -88,6 +88,15 @@ v-hasPermi="['system:config:export']" >导åº</el-button> </el-col> <el-col :span="1.5"> <el-button type="danger" icon="el-icon-refresh" size="mini" @click="handleClearCache" v-hasPermi="['system:config:remove']" >æ¸ çç¼å</el-button> </el-col> </el-row> <el-table v-loading="loading" :data="configList" @selection-change="handleSelectionChange"> @@ -165,7 +174,7 @@ </template> <script> import { listConfig, getConfig, delConfig, addConfig, updateConfig, exportConfig } from "@/api/system/config"; import { listConfig, getConfig, delConfig, addConfig, updateConfig, exportConfig, clearCache } from "@/api/system/config"; export default { name: "Config", @@ -296,8 +305,6 @@ this.msgSuccess("ä¿®æ¹æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } else { @@ -306,8 +313,6 @@ this.msgSuccess("æ°å¢æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } @@ -340,6 +345,14 @@ }).then(response => { this.download(response.msg); }).catch(function() {}); }, /** æ¸ çç¼åæé®æä½ */ handleClearCache() { clearCache().then(response => { if (response.code === 200) { this.msgSuccess("æ¸ çæå"); } }); } } }; ruoyi-ui/src/views/system/dept/index.vue
@@ -281,8 +281,6 @@ this.msgSuccess("ä¿®æ¹æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } else { @@ -291,8 +289,6 @@ this.msgSuccess("æ°å¢æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } ruoyi-ui/src/views/system/dict/data.vue
@@ -305,8 +305,6 @@ this.msgSuccess("ä¿®æ¹æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } else { @@ -315,8 +313,6 @@ this.msgSuccess("æ°å¢æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } ruoyi-ui/src/views/system/dict/index.vue
@@ -94,6 +94,15 @@ v-hasPermi="['system:dict:export']" >导åº</el-button> </el-col> <el-col :span="1.5"> <el-button type="danger" icon="el-icon-refresh" size="mini" @click="handleClearCache" v-hasPermi="['system:dict:remove']" >æ¸ çç¼å</el-button> </el-col> </el-row> <el-table v-loading="loading" :data="typeList" @selection-change="handleSelectionChange"> @@ -173,7 +182,7 @@ </template> <script> import { listType, getType, delType, addType, updateType, exportType } from "@/api/system/dict/type"; import { listType, getType, delType, addType, updateType, exportType, clearCache } from "@/api/system/dict/type"; export default { name: "Dict", @@ -300,8 +309,6 @@ this.msgSuccess("ä¿®æ¹æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } else { @@ -310,8 +317,6 @@ this.msgSuccess("æ°å¢æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } @@ -344,6 +349,14 @@ }).then(response => { this.download(response.msg); }).catch(function() {}); }, /** æ¸ çç¼åæé®æä½ */ handleClearCache() { clearCache().then(response => { if (response.code === 200) { this.msgSuccess("æ¸ çæå"); } }); } } }; ruoyi-ui/src/views/system/menu/index.vue
@@ -340,8 +340,6 @@ this.msgSuccess("ä¿®æ¹æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } else { @@ -350,8 +348,6 @@ this.msgSuccess("æ°å¢æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } ruoyi-ui/src/views/system/notice/index.vue
@@ -308,8 +308,6 @@ this.msgSuccess("ä¿®æ¹æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } else { @@ -318,8 +316,6 @@ this.msgSuccess("æ°å¢æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } ruoyi-ui/src/views/system/post/index.vue
@@ -277,8 +277,6 @@ this.msgSuccess("ä¿®æ¹æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } else { @@ -287,8 +285,6 @@ this.msgSuccess("æ°å¢æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } ruoyi-ui/src/views/system/role/index.vue
@@ -482,8 +482,6 @@ this.msgSuccess("ä¿®æ¹æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } else { @@ -493,8 +491,6 @@ this.msgSuccess("æ°å¢æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } @@ -510,8 +506,6 @@ this.msgSuccess("ä¿®æ¹æå"); this.openDataScope = false; this.getList(); } else { this.msgError(response.msg); } }); } ruoyi-ui/src/views/system/user/index.vue
@@ -572,8 +572,6 @@ resetUserPwd(row.userId, value).then(response => { if (response.code === 200) { this.msgSuccess("ä¿®æ¹æåï¼æ°å¯ç æ¯ï¼" + value); } else { this.msgError(response.msg); } }); }).catch(() => {}); @@ -588,8 +586,6 @@ this.msgSuccess("ä¿®æ¹æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } else { @@ -598,8 +594,6 @@ this.msgSuccess("æ°å¢æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } ruoyi-ui/src/views/system/user/profile/resetPwd.vue
@@ -59,8 +59,6 @@ response => { if (response.code === 200) { this.msgSuccess("ä¿®æ¹æå"); } else { this.msgError(response.msg); } } ); ruoyi-ui/src/views/system/user/profile/userAvatar.vue
@@ -122,8 +122,6 @@ this.open = false; this.options.img = process.env.VUE_APP_BASE_API + response.imgUrl; this.msgSuccess("ä¿®æ¹æå"); } else { this.msgError(response.msg); } this.$refs.cropper.clearCrop(); }); ruoyi-ui/src/views/system/user/profile/userInfo.vue
@@ -64,8 +64,6 @@ updateUserProfile(this.user).then(response => { if (response.code === 200) { this.msgSuccess("ä¿®æ¹æå"); } else { this.msgError(response.msg); } }); } ruoyi-ui/vue.config.js
@@ -83,12 +83,6 @@ .end() config // https://webpack.js.org/configuration/devtool/#development .when(process.env.NODE_ENV === 'development', config => config.devtool('cheap-source-map') ) config .when(process.env.NODE_ENV !== 'development', config => { config ruoyi/pom.xml
@@ -5,7 +5,7 @@ <groupId>com.ruoyi</groupId> <artifactId>ruoyi</artifactId> <version>2.2.0</version> <version>2.3.0</version> <packaging>jar</packaging> <name>ruoyi</name> @@ -25,7 +25,7 @@ <java.version>1.8</java.version> <mybatis.spring.boot.starter.version>1.3.2</mybatis.spring.boot.starter.version> <pagehelper.spring.boot.starter.version>1.2.5</pagehelper.spring.boot.starter.version> <fastjson.version>1.2.68</fastjson.version> <fastjson.version>1.2.70</fastjson.version> <druid.version>1.1.14</druid.version> <commons.io.version>2.5</commons.io.version> <commons.fileupload.version>1.3.3</commons.fileupload.version> ruoyi/src/main/java/com/ruoyi/common/constant/Constants.java
@@ -110,6 +110,16 @@ public static final String JWT_AUTHORITIES = "authorities"; /** * åæ°ç®¡ç cache key */ public static final String SYS_CONFIG_KEY = "sys_config:"; /** * åå ¸ç®¡ç cache key */ public static final String SYS_DICT_KEY = "sys_dict:"; /** * èµæºæ å°è·¯å¾ åç¼ */ public static final String RESOURCE_PREFIX = "/profile"; ruoyi/src/main/java/com/ruoyi/common/utils/DictUtils.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,64 @@ package com.ruoyi.common.utils; import java.util.Collection; import java.util.List; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.framework.redis.RedisCache; import com.ruoyi.project.system.domain.SysDictData; /** * åå ¸å·¥å ·ç±» * * @author ruoyi */ public class DictUtils { /** * 设置åå ¸ç¼å * * @param key åæ°é® * @param dictDatas åå ¸æ°æ®å表 */ public static void setDictCache(String key, List<SysDictData> dictDatas) { SpringUtils.getBean(RedisCache.class).setCacheObject(getCacheKey(key), dictDatas); } /** * è·ååå ¸ç¼å * * @param key åæ°é® * @return dictDatas åå ¸æ°æ®å表 */ public static List<SysDictData> getDictCache(String key) { Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key)); if (StringUtils.isNotNull(cacheObj)) { List<SysDictData> DictDatas = StringUtils.cast(cacheObj); return DictDatas; } return null; } /** * æ¸ ç©ºåå ¸ç¼å */ public static void clearDictCache() { Collection<String> keys = SpringUtils.getBean(RedisCache.class).keys(Constants.SYS_DICT_KEY + "*"); SpringUtils.getBean(RedisCache.class).deleteObject(keys); } /** * 设置cache key * * @param configKey åæ°é® * @return ç¼åé®key */ public static String getCacheKey(String configKey) { return Constants.SYS_DICT_KEY + configKey; } } ruoyi/src/main/java/com/ruoyi/common/utils/StringUtils.java
@@ -450,4 +450,10 @@ } return sb.toString(); } @SuppressWarnings("unchecked") public static <T> T cast(Object obj) { return (T) obj; } } ruoyi/src/main/java/com/ruoyi/project/system/controller/SysConfigController.java
@@ -118,4 +118,16 @@ { return toAjax(configService.deleteConfigByIds(configIds)); } /** * æ¸ ç©ºç¼å */ @PreAuthorize("@ss.hasPermi('system:config:remove')") @Log(title = "åæ°ç®¡ç", businessType = BusinessType.CLEAN) @DeleteMapping("/clearCache") public AjaxResult clearCache() { configService.clearCache(); return AjaxResult.success(); } } ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictDataController.java
@@ -21,6 +21,7 @@ import com.ruoyi.framework.web.page.TableDataInfo; import com.ruoyi.project.system.domain.SysDictData; import com.ruoyi.project.system.service.ISysDictDataService; import com.ruoyi.project.system.service.ISysDictTypeService; /** * æ°æ®åå ¸ä¿¡æ¯ @@ -33,6 +34,9 @@ { @Autowired private ISysDictDataService dictDataService; @Autowired private ISysDictTypeService dictTypeService; @PreAuthorize("@ss.hasPermi('system:dict:list')") @GetMapping("/list") @@ -66,10 +70,10 @@ /** * æ ¹æ®åå ¸ç±»åæ¥è¯¢åå ¸æ°æ®ä¿¡æ¯ */ @GetMapping(value = "/dictType/{dictType}") @GetMapping(value = "/type/{dictType}") public AjaxResult dictType(@PathVariable String dictType) { return AjaxResult.success(dictDataService.selectDictDataByType(dictType)); return AjaxResult.success(dictTypeService.selectDictDataByType(dictType)); } /** ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictTypeController.java
@@ -108,6 +108,18 @@ } /** * æ¸ ç©ºç¼å */ @PreAuthorize("@ss.hasPermi('system:dict:remove')") @Log(title = "åå ¸ç±»å", businessType = BusinessType.CLEAN) @DeleteMapping("/clearCache") public AjaxResult clearCache() { dictTypeService.clearCache(); return AjaxResult.success(); } /** * è·ååå ¸éæ©æ¡å表 */ @GetMapping("/optionselect") ruoyi/src/main/java/com/ruoyi/project/system/service/ISysConfigService.java
@@ -51,14 +51,6 @@ public int updateConfig(SysConfig config); /** * å é¤åæ°é ç½®ä¿¡æ¯ * * @param configId åæ°ID * @return ç»æ */ public int deleteConfigById(Long configId); /** * æ¹éå é¤åæ°ä¿¡æ¯ * * @param configIds éè¦å é¤çåæ°ID @@ -67,6 +59,11 @@ public int deleteConfigByIds(Long[] configIds); /** * æ¸ ç©ºç¼åæ°æ® */ public void clearCache(); /** * æ ¡éªåæ°é®åæ¯å¦å¯ä¸ * * @param config åæ°ä¿¡æ¯ ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictDataService.java
@@ -19,14 +19,6 @@ public List<SysDictData> selectDictDataList(SysDictData dictData); /** * æ ¹æ®åå ¸ç±»åæ¥è¯¢åå ¸æ°æ® * * @param dictType åå ¸ç±»å * @return åå ¸æ°æ®éåä¿¡æ¯ */ public List<SysDictData> selectDictDataByType(String dictType); /** * æ ¹æ®åå ¸ç±»åååå ¸é®å¼æ¥è¯¢åå ¸æ°æ®ä¿¡æ¯ * * @param dictType åå ¸ç±»å @@ -42,14 +34,6 @@ * @return åå ¸æ°æ® */ public SysDictData selectDictDataById(Long dictCode); /** * éè¿åå ¸IDå é¤åå ¸æ°æ®ä¿¡æ¯ * * @param dictCode åå ¸æ°æ®ID * @return ç»æ */ public int deleteDictDataById(Long dictCode); /** * æ¹éå é¤åå ¸æ°æ®ä¿¡æ¯ ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictTypeService.java
@@ -1,6 +1,7 @@ package com.ruoyi.project.system.service; import java.util.List; import com.ruoyi.project.system.domain.SysDictData; import com.ruoyi.project.system.domain.SysDictType; /** @@ -26,6 +27,14 @@ public List<SysDictType> selectDictTypeAll(); /** * æ ¹æ®åå ¸ç±»åæ¥è¯¢åå ¸æ°æ® * * @param dictType åå ¸ç±»å * @return åå ¸æ°æ®éåä¿¡æ¯ */ public List<SysDictData> selectDictDataByType(String dictType); /** * æ ¹æ®åå ¸ç±»åIDæ¥è¯¢ä¿¡æ¯ * * @param dictId åå ¸ç±»åID @@ -42,14 +51,6 @@ public SysDictType selectDictTypeByType(String dictType); /** * éè¿åå ¸IDå é¤åå ¸ä¿¡æ¯ * * @param dictId åå ¸ID * @return ç»æ */ public int deleteDictTypeById(Long dictId); /** * æ¹éå é¤åå ¸ä¿¡æ¯ * * @param dictIds éè¦å é¤çåå ¸ID @@ -58,6 +59,11 @@ public int deleteDictTypeByIds(Long[] dictIds); /** * æ¸ ç©ºç¼åæ°æ® */ public void clearCache(); /** * æ°å¢ä¿ååå ¸ç±»åä¿¡æ¯ * * @param dictType åå ¸ç±»åä¿¡æ¯ ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysConfigServiceImpl.java
@@ -1,10 +1,15 @@ package com.ruoyi.project.system.service.impl; import java.util.Collection; import java.util.List; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.redis.RedisCache; import com.ruoyi.project.system.domain.SysConfig; import com.ruoyi.project.system.mapper.SysConfigMapper; import com.ruoyi.project.system.service.ISysConfigService; @@ -19,6 +24,22 @@ { @Autowired private SysConfigMapper configMapper; @Autowired private RedisCache redisCache; /** * 项ç®å¯å¨æ¶ï¼åå§ååæ°å°ç¼å */ @PostConstruct public void init() { List<SysConfig> configsList = configMapper.selectConfigList(new SysConfig()); for (SysConfig config : configsList) { redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); } } /** * æ¥è¯¢åæ°é ç½®ä¿¡æ¯ @@ -43,10 +64,20 @@ @Override public String selectConfigByKey(String configKey) { String configValue = Convert.toStr(redisCache.getCacheObject(getCacheKey(configKey))); if (StringUtils.isNotEmpty(configValue)) { return configValue; } SysConfig config = new SysConfig(); config.setConfigKey(configKey); SysConfig retConfig = configMapper.selectConfig(config); return StringUtils.isNotNull(retConfig) ? retConfig.getConfigValue() : ""; if (StringUtils.isNotNull(retConfig)) { redisCache.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue()); return retConfig.getConfigValue(); } return StringUtils.EMPTY; } /** @@ -70,7 +101,12 @@ @Override public int insertConfig(SysConfig config) { return configMapper.insertConfig(config); int row = configMapper.insertConfig(config); if (row > 0) { redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); } return row; } /** @@ -82,19 +118,12 @@ @Override public int updateConfig(SysConfig config) { return configMapper.updateConfig(config); } /** * å é¤åæ°é ç½®ä¿¡æ¯ * * @param configId åæ°ID * @return ç»æ */ @Override public int deleteConfigById(Long configId) int row = configMapper.updateConfig(config); if (row > 0) { return configMapper.deleteConfigById(configId); redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); } return row; } /** @@ -106,7 +135,22 @@ @Override public int deleteConfigByIds(Long[] configIds) { return configMapper.deleteConfigByIds(configIds); int count = configMapper.deleteConfigByIds(configIds); if (count > 0) { Collection<String> keys = redisCache.keys(Constants.SYS_CONFIG_KEY + "*"); redisCache.deleteObject(keys); } return count; } /** * æ¸ ç©ºç¼åæ°æ® */ public void clearCache() { Collection<String> keys = redisCache.keys(Constants.SYS_CONFIG_KEY + "*"); redisCache.deleteObject(keys); } /** @@ -126,4 +170,15 @@ } return UserConstants.UNIQUE; } /** * 设置cache key * * @param configKey åæ°é® * @return ç¼åé®key */ private String getCacheKey(String configKey) { return Constants.SYS_CONFIG_KEY + configKey; } } ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictDataServiceImpl.java
@@ -3,6 +3,7 @@ import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.common.utils.DictUtils; import com.ruoyi.project.system.domain.SysDictData; import com.ruoyi.project.system.mapper.SysDictDataMapper; import com.ruoyi.project.system.service.ISysDictDataService; @@ -31,18 +32,6 @@ } /** * æ ¹æ®åå ¸ç±»åæ¥è¯¢åå ¸æ°æ® * * @param dictType åå ¸ç±»å * @return åå ¸æ°æ®éåä¿¡æ¯ */ @Override public List<SysDictData> selectDictDataByType(String dictType) { return dictDataMapper.selectDictDataByType(dictType); } /** * æ ¹æ®åå ¸ç±»åååå ¸é®å¼æ¥è¯¢åå ¸æ°æ®ä¿¡æ¯ * * @param dictType åå ¸ç±»å @@ -68,18 +57,6 @@ } /** * éè¿åå ¸IDå é¤åå ¸æ°æ®ä¿¡æ¯ * * @param dictCode åå ¸æ°æ®ID * @return ç»æ */ @Override public int deleteDictDataById(Long dictCode) { return dictDataMapper.deleteDictDataById(dictCode); } /** * æ¹éå é¤åå ¸æ°æ®ä¿¡æ¯ * * @param dictCodes éè¦å é¤çåå ¸æ°æ®ID @@ -87,7 +64,12 @@ */ public int deleteDictDataByIds(Long[] dictCodes) { return dictDataMapper.deleteDictDataByIds(dictCodes); int row = dictDataMapper.deleteDictDataByIds(dictCodes); if (row > 0) { DictUtils.clearDictCache(); } return row; } /** @@ -99,7 +81,12 @@ @Override public int insertDictData(SysDictData dictData) { return dictDataMapper.insertDictData(dictData); int row = dictDataMapper.insertDictData(dictData); if (row > 0) { DictUtils.clearDictCache(); } return row; } /** @@ -111,6 +98,11 @@ @Override public int updateDictData(SysDictData dictData) { return dictDataMapper.updateDictData(dictData); int row = dictDataMapper.updateDictData(dictData); if (row > 0) { DictUtils.clearDictCache(); } return row; } } ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictTypeServiceImpl.java
@@ -1,11 +1,15 @@ package com.ruoyi.project.system.service.impl; import java.util.List; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.DictUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.project.system.domain.SysDictData; import com.ruoyi.project.system.domain.SysDictType; import com.ruoyi.project.system.mapper.SysDictDataMapper; import com.ruoyi.project.system.mapper.SysDictTypeMapper; @@ -24,6 +28,20 @@ @Autowired private SysDictDataMapper dictDataMapper; /** * 项ç®å¯å¨æ¶ï¼åå§ååå ¸å°ç¼å */ @PostConstruct public void init() { List<SysDictType> dictTypeList = dictTypeMapper.selectDictTypeAll(); for (SysDictType dictType : dictTypeList) { List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(dictType.getDictType()); DictUtils.setDictCache(dictType.getDictType(), dictDatas); } } /** * æ ¹æ®æ¡ä»¶å页æ¥è¯¢åå ¸ç±»å @@ -46,6 +64,29 @@ public List<SysDictType> selectDictTypeAll() { return dictTypeMapper.selectDictTypeAll(); } /** * æ ¹æ®åå ¸ç±»åæ¥è¯¢åå ¸æ°æ® * * @param dictType åå ¸ç±»å * @return åå ¸æ°æ®éåä¿¡æ¯ */ @Override public List<SysDictData> selectDictDataByType(String dictType) { List<SysDictData> dictDatas = DictUtils.getDictCache(dictType); if (StringUtils.isNotNull(dictDatas)) { return dictDatas; } dictDatas = dictDataMapper.selectDictDataByType(dictType); if (StringUtils.isNotNull(dictDatas)) { DictUtils.setDictCache(dictType, dictDatas); return dictDatas; } return null; } /** @@ -72,18 +113,6 @@ } /** * éè¿åå ¸IDå é¤åå ¸ä¿¡æ¯ * * @param dictId åå ¸ID * @return ç»æ */ @Override public int deleteDictTypeById(Long dictId) { return dictTypeMapper.deleteDictTypeById(dictId); } /** * æ¹éå é¤åå ¸ç±»åä¿¡æ¯ * * @param dictIds éè¦å é¤çåå ¸ID @@ -91,7 +120,28 @@ */ public int deleteDictTypeByIds(Long[] dictIds) { return dictTypeMapper.deleteDictTypeByIds(dictIds); for (Long dictId : dictIds) { SysDictType dictType = selectDictTypeById(dictId); if (dictDataMapper.countDictDataByType(dictType.getDictType()) > 0) { throw new CustomException(String.format("%1$så·²åé ,ä¸è½å é¤", dictType.getDictName())); } } int count = dictTypeMapper.deleteDictTypeByIds(dictIds); if (count > 0) { DictUtils.clearDictCache(); } return count; } /** * æ¸ ç©ºç¼åæ°æ® */ public void clearCache() { DictUtils.clearDictCache(); } /** @@ -103,7 +153,12 @@ @Override public int insertDictType(SysDictType dictType) { return dictTypeMapper.insertDictType(dictType); int row = dictTypeMapper.insertDictType(dictType); if (row > 0) { DictUtils.clearDictCache(); } return row; } /** @@ -118,7 +173,12 @@ { SysDictType oldDict = dictTypeMapper.selectDictTypeById(dictType.getDictId()); dictDataMapper.updateDictDataType(oldDict.getDictType(), dictType.getDictType()); return dictTypeMapper.updateDictType(dictType); int row = dictTypeMapper.updateDictType(dictType); if (row > 0) { DictUtils.clearDictCache(); } return row; } /** ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysMenuServiceImpl.java
@@ -140,7 +140,7 @@ { RouterVo router = new RouterVo(); router.setHidden("1".equals(menu.getVisible())); router.setName(StringUtils.capitalize(menu.getPath())); router.setName(getRouteName(menu)); router.setPath(getRouterPath(menu)); router.setComponent(getComponent(menu)); router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); @@ -300,6 +300,23 @@ } /** * è·åè·¯ç±åç§° * * @param menu èåä¿¡æ¯ * @return è·¯ç±åç§° */ public String getRouteName(SysMenu menu) { String routerName = StringUtils.capitalize(menu.getPath()); // éå¤é¾å¹¶ä¸æ¯ä¸çº§ç®å½ï¼ç±»å为ç®å½ï¼ if (isMeunFrame(menu)) { routerName = StringUtils.EMPTY; } return routerName; } /** * è·åè·¯ç±å°å * * @param menu èåä¿¡æ¯ ruoyi/src/main/resources/application.yml
@@ -3,7 +3,7 @@ # åç§° name: RuoYi # çæ¬ version: 2.2.0 version: 2.3.0 # çæå¹´ä»½ copyrightYear: 2019 # å®ä¾æ¼ç¤ºå¼å ³ ruoyi/src/main/resources/vm/sql/sql.vm
ruoyi/src/main/resources/vm/vue/index-tree.vue.vm
@@ -375,8 +375,6 @@ this.msgSuccess("ä¿®æ¹æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } else { @@ -385,8 +383,6 @@ this.msgSuccess("æ°å¢æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } ruoyi/src/main/resources/vm/vue/index.vue.vm
@@ -392,8 +392,6 @@ this.msgSuccess("ä¿®æ¹æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); } else { @@ -402,8 +400,6 @@ this.msgSuccess("æ°å¢æå"); this.open = false; this.getList(); } else { this.msgError(response.msg); } }); }