diff --git a/public/resource/example/datasource_example.xml b/public/resource/example/datasource_example.xml new file mode 100644 index 0000000000000000000000000000000000000000..6ec4067f0267bd672fdcf94699b071d23450a6dc --- /dev/null +++ b/public/resource/example/datasource_example.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/rsbuild.config.ts b/rsbuild.config.ts index 734d87bf484f9ff72121831ec488b207d7569bba..e39e567504b2106c44947b839e21a9bc287b70b5 100644 --- a/rsbuild.config.ts +++ b/rsbuild.config.ts @@ -2,6 +2,7 @@ import { rspack, defineConfig } from '@rsbuild/core'; import { pluginVue2 } from '@rsbuild/plugin-vue2'; import { pluginLess } from '@rsbuild/plugin-less'; let commercialModule = './src/commercial-module'; +let communityModule = './src/community-module'; import path from 'path'; import glob from 'glob'; const { tenantName, urlPrefix } = require('./apiconfig.json'); @@ -12,7 +13,31 @@ let table_style = 'border'; let imgModule = './public/resource'; let copyPath = ''; let faviconPath = './public/resource/img/common/tsfavicon.png'; -let importCustomConfig = glob.sync(`${commercialModule}/**/customconfig.js`) || []; + +let importCustomConfig = glob.sync(`${communityModule}/**/customconfig.js`) || []; +importCustomConfig.forEach((filePath) => { + if (filePath) { + let {tableStyle, title, loginTitle, imgPath, publicPath, faviconIconPath} = require(filePath); + copyPath = publicPath; + if (loginTitle) { + login_Title = String(loginTitle); + } + if (tableStyle) { + table_style = String(tableStyle); + } + if (title) { + pageTitle = String(title); + } + if (imgPath) { + imgModule = imgPath; + } + if (faviconIconPath) { + faviconPath = faviconIconPath; + } + } +}); + +importCustomConfig = glob.sync(`${commercialModule}/**/customconfig.js`) || []; importCustomConfig.forEach((filePath) => { if (filePath) { let {tableStyle, title, loginTitle, imgPath, publicPath, faviconIconPath} = require(filePath); @@ -50,11 +75,13 @@ function getAllModuleList(modulePathList = []) { function getPages(pageList) { const pages = {}; const pagePathList = glob.sync(src + '/views/pages/*/router.js'); - const importModulePathList = glob.sync(`${commercialModule}/**/router.js`) || []; + const importCommercialModulePathList = glob.sync(`${commercialModule}/**/router.js`) || []; + const importCommunityModulePathList = glob.sync(`${communityModule}/**/router.js`) || []; const defaultModuleList = getAllModuleList(pagePathList); const commercialModuleList = []; + const communityModuleList = []; - importModulePathList.forEach(filePath => { + importCommercialModulePathList.forEach(filePath => { const moduleName = filePath.match(/\/([a-zA-Z0-9_-]+)\/router\.js$/)[1]; if (!defaultModuleList.includes(getModuleName(moduleName))) { pagePathList.push(filePath); @@ -62,14 +89,25 @@ function getPages(pageList) { } }); + importCommunityModulePathList.forEach(filePath => { + const moduleName = filePath.match(/\/([a-zA-Z0-9_-]+)\/router\.js$/)[1]; + if (!defaultModuleList.includes(getModuleName(moduleName))) { + pagePathList.push(filePath); + communityModuleList.push(getModuleName(moduleName)); + } + }); + pagePathList.forEach(filePath => { const moduleName = filePath.match(/\/([a-zA-Z0-9_-]+)\/router\.js$/)[1]; const filename = getModuleName(moduleName); const pageLogin = filename === 'login' ? pageTitle : `${pageTitle}-${filename}`; - const entry = commercialModuleList.includes(filename) - ? `${commercialModule}/${moduleName}/${filename}.js` - : `${src}/views/pages/${filename}/${filename}.js`; + let entry = `${src}/views/pages/${filename}/${filename}.js`; + if (communityModuleList.includes(filename)) { + entry = `${communityModule}/${moduleName}/${filename}.js`; + } else if (commercialModuleList.includes(filename)) { + entry = `${commercialModule}/${moduleName}/${filename}.js`; + } pages[filename] = { entry, template: `public/index.html`, @@ -193,14 +231,14 @@ export default defineConfig({ changeOrigin: true, secure: false, pathRewrite: { [`/${tenantName}/tenant/check`]: '/neatlogic/tenant/check/' + tenantName }, - headers: { Tenant: tenantName, Env: 'uat' } + headers: { Tenant: tenantName, 'Neatlogic-Rule-Env': 'sit', 'Neatlogic-Rule-Test': '1' } }, [`/${tenantName}/login/`]: { target: urlPrefix, changeOrigin: true, secure: false, pathRewrite: { [`/${tenantName}/login/check`]: '/neatlogic/login/check/' + tenantName }, - headers: { Tenant: tenantName, Env: 'uat' } + headers: { Tenant: tenantName, 'Neatlogic-Rule-Env': 'sit', 'Neatlogic-Rule-Test': '1' } } } }, diff --git a/src/resources/api/api.js b/src/resources/api/api.js index 2186b413446840200a60ea533ff7ef6d7ad000d7..baf1dc8805c45ee9f9a448c1c1870fbc25ac1b83 100644 --- a/src/resources/api/api.js +++ b/src/resources/api/api.js @@ -13,9 +13,7 @@ import report from './report'; import rdm from './rdm'; import documentonline from './documentonline'; -let moduleApiConfig = {}; -let moduleList = ['autoexec', 'cmdb', 'common', 'dashboard', 'deploy', 'framework', 'globalsearch', 'inspect', 'knowledge', 'pbc', 'process', 'report', 'rdm', 'documentonline', 'alert']; // 用于自定义页面接口导入做浅拷贝 -let moduleConfig = { +let moduleApiConfig = { autoexec: autoexec, cmdb: cmdb, common: common, @@ -29,18 +27,48 @@ let moduleConfig = { process: process, report: report, rdm: rdm, - documentonline: documentonline, - alert: alert + documentonline: documentonline }; +/*let moduleList = ['autoexec', 'cmdb', 'common', 'dashboard', 'deploy', 'framework', 'globalsearch', 'inspect', 'knowledge', 'pbc', 'process', 'report', 'rdm', 'documentonline']; // 用于自定义页面接口导入做浅拷贝 +let moduleConfig = { + autoexec: autoexec, + cmdb: cmdb, + common: common, + dashboard: dashboard, + deploy: deploy, + framework: framework, + globalsearch: globalsearch, + inspect: inspect, + knowledge: knowledge, + pbc: pbc, + process: process, + report: report, + rdm: rdm, + documentonline: documentonline +};*/ try { // 导入自定义模块,获取导出接口地址 - const apiConfig = require.context('@/commercial-module', true, /api.js$/); + let apiConfig = require.context('@/community-module', true, /api.js$/); + apiConfig.keys().forEach(apiPath => { + if (apiPath) { + const moduleName = apiPath.split('/')[1]?.split('-')?.pop() || apiPath.split('/')[1]; + const exportValue = apiConfig(apiPath).default || {}; + if (moduleApiConfig[moduleName]) { + moduleApiConfig[moduleName] = Object.assign(moduleApiConfig[moduleName], exportValue); //自定义页面接口导入,在现有模块基础上添加 + } else { + moduleApiConfig[moduleName] = exportValue; + } + } + }); + + // 导入自定义模块,获取导出接口地址 + apiConfig = require.context('@/commercial-module', true, /api.js$/); apiConfig.keys().forEach(apiPath => { if (apiPath) { const moduleName = apiPath.split('/')[1]?.split('-')?.pop() || apiPath.split('/')[1]; const exportValue = apiConfig(apiPath).default || {}; - if (moduleList.includes(moduleName)) { - moduleApiConfig[moduleName] = Object.assign(moduleConfig[moduleName], exportValue); //自定义页面接口导入,在现有模块基础上添加 + if (moduleApiConfig[moduleName]) { + moduleApiConfig[moduleName] = Object.assign(moduleApiConfig[moduleName], exportValue); //自定义页面接口导入,在现有模块基础上添加 } else { moduleApiConfig[moduleName] = exportValue; } @@ -51,19 +79,19 @@ try { } export default { - autoexec, - common, - cmdb, - pbc, - dashboard, - framework, - deploy, - globalsearch, - inspect, - knowledge, - process, - report, - rdm, - documentonline, + // autoexec, + // common, + // cmdb, + // pbc, + // dashboard, + // framework, + // deploy, + // globalsearch, + // inspect, + // knowledge, + // process, + // report, + // rdm, + // documentonline, ...moduleApiConfig }; diff --git a/src/resources/api/deploy/application-config/env.js b/src/resources/api/deploy/application-config/env.js index 71b0524a0d33e1e602b1c0ed773abc1ca5dd3643..44c74f0aa3cd59bfb113425ffa4aebbfb3c86398 100644 --- a/src/resources/api/deploy/application-config/env.js +++ b/src/resources/api/deploy/application-config/env.js @@ -43,6 +43,22 @@ const env = { getInstanceList(params) { // 实例列表 return axios.post('/api/rest/deploy/app/module/env/auto/config/instance/search', params); + }, + saveEnvDbResource(params) { + // 保存环境db资源 + return axios.post('/api/rest/deploy/app/config/env/cientity/save', params); + }, + saveEnvDbPublicAccount(params) { + // 保存发布应用配置DB公共账号 + return axios.post('/api/rest/deploy/app/config/env/db/publicaccount/save', params); + }, + saveEnvDbPrivateaccount(params) { + // 保存发布应用配置DB私有账号 + return axios.post('/api/rest/deploy/app/config/env/db/privateaccount/save', params); + }, + deleteEnvDbPrivateaccount(params) { + // 删除发布应用配置DB私有账号 + return axios.post('/api/rest/deploy/app/config/env/db/privateaccount/delete', params); } }; diff --git a/src/resources/api/framework/changelogaudit/changelogaudit.js b/src/resources/api/framework/changelogaudit/changelogaudit.js new file mode 100644 index 0000000000000000000000000000000000000000..438c4ff95a4e6af65b2af7e12f84d74969743768 --- /dev/null +++ b/src/resources/api/framework/changelogaudit/changelogaudit.js @@ -0,0 +1,9 @@ +import axios from '../../http'; + +const changelogaudit = { + searchChangelogAuditList(params) { + return axios.post('/api/rest/changelog/audit/search', params); + } +}; + +export default changelogaudit; diff --git a/src/resources/api/framework/database/database.js b/src/resources/api/framework/database/database.js new file mode 100644 index 0000000000000000000000000000000000000000..1340895db4ce964f03811a2750697a8e3fee84db --- /dev/null +++ b/src/resources/api/framework/database/database.js @@ -0,0 +1,21 @@ +import axios from '../../http'; + +const database = { + searchDatabaseList(params) { + return axios.post('/api/rest/database/search', params); + }, + getDatabaseById(params) { + return axios.post('/api/rest/database/get', params); + }, + deleteDatabaseById(params) { + return axios.post('/api/rest/database/delete', params); + }, + saveDatabase(params) { + return axios.post('/api/rest/database/save', params); + }, + testDatabaseById(params) { + return axios.post('/api/rest/database/test', params); + } +}; + +export default database; diff --git a/src/resources/api/framework/datawarehouse/datawarehouse.js b/src/resources/api/framework/datawarehouse/datawarehouse.js index 8dbe81a9fd947b3e29b3033645c60da7a4ce7646..a04551d165d6e3f7e291f03a096caa900c32e4a2 100644 --- a/src/resources/api/framework/datawarehouse/datawarehouse.js +++ b/src/resources/api/framework/datawarehouse/datawarehouse.js @@ -45,6 +45,13 @@ const datawarehouse = { }, validXml(xml) { return axios.post('/api/rest/datawarehouse/datasource/validxml', {xml: xml}); + }, + getExample() { + return fetch('/resource/example/datasource_example.xml', { + method: 'get', + credentials: 'same-origin', + responseType: 'text' + }).then(res => res.text()); } }; diff --git a/src/resources/api/framework/fulltextindex/fulltextindex.js b/src/resources/api/framework/fulltextindex/fulltextindex.js index 2531b5ffbb5de762938d5c91dd8549131dc8ce9a..b7bdd1c27bf2dc7971b64619aea8bb9f8711c445 100644 --- a/src/resources/api/framework/fulltextindex/fulltextindex.js +++ b/src/resources/api/framework/fulltextindex/fulltextindex.js @@ -6,6 +6,18 @@ const fulltextindex = { }, rebuildFullTextIndex(params) { return axios.post('/api/rest/fulltextindex/rebuild', params); + }, + searchWord(params) { + return axios.post('/api/rest/fulltextindex/dictionary/word/search', params); + }, + testSliceWord(content) { + return axios.post('/api/rest/fulltextindex/dictionary/word/test', { content: content }); + }, + deleteWordById(id) { + return axios.post('/api/rest/fulltextindex/dictionary/word/delete', { id: id }); + }, + addWord(params) { + return axios.post('/api/rest/fulltextindex/dictionary/word/insert', params); } }; export default fulltextindex; diff --git a/src/resources/api/framework/index.js b/src/resources/api/framework/index.js index 305a2e79b99913795b8db4c974cfc644ab87b1d7..867bb4256a8ab8f4c20433cee1749e2d97a3cb22 100644 --- a/src/resources/api/framework/index.js +++ b/src/resources/api/framework/index.js @@ -22,6 +22,7 @@ import mq from './mq/mq';//消息队列 import fulltextindex from './fulltextindex/fulltextindex';//全局检索 import healthcheck from './healthcheck/healthcheck';//健康检查 import datawarehouse from './datawarehouse/datawarehouse';//数据仓库 +import database from './database/database';//数据库 import theme from './theme/theme';//主题定制 import auditconfig from './auditconfig/auditconfig';//审计配置 import file from './file/file';//附件管理 @@ -35,6 +36,7 @@ import wechat from './wechat/wechat';// 企业微信 import extramenu from './extramenu/extramenu'; //附加菜单 import region from './region/region';//地域管理 import homepage from './homepage/homepage';//默认首页 +import changelogaudit from './changelogaudit/changelogaudit';//数据库变更记录 export default { role, user, @@ -60,6 +62,7 @@ export default { runner, healthcheck, datawarehouse, + database, auditconfig, file, module, @@ -71,5 +74,6 @@ export default { wechat, extramenu, region, - homepage + homepage, + changelogaudit }; diff --git a/src/resources/api/framework/mq/mq.js b/src/resources/api/framework/mq/mq.js index c505623f8eae8078aa8ef26162290b74472115de..a89715a43159203405289be48d3b2df58b6bc6de 100644 --- a/src/resources/api/framework/mq/mq.js +++ b/src/resources/api/framework/mq/mq.js @@ -39,6 +39,9 @@ const mq = { }, testTopic(param) { return axios.post('/api/rest/mq/topic/test', param); + }, + healthCheck(id) { + return axios.post('/api/rest/mq/subscribe/healthcheck', { id: id }); } }; export default mq; diff --git a/src/resources/api/framework/tagent/runner.js b/src/resources/api/framework/tagent/runner.js index 17efd657767cabbbcee2054329b0f136f5e28d6e..fe3e6b310438d61ce77e47ce92c368eee30d48f5 100644 --- a/src/resources/api/framework/tagent/runner.js +++ b/src/resources/api/framework/tagent/runner.js @@ -32,6 +32,9 @@ const runner = { delRunnerGroupRunner(id) { // 删除runner组里面的runner return axios.post('/api/rest/runnergroup/runner/delete', {id: id}); + }, + getRunnerStatus(params) { + return axios.post('/api/rest/runner/status/check', params); } }; export default runner; diff --git a/src/resources/api/framework/users/user.js b/src/resources/api/framework/users/user.js index a93736171638de97912c1aee0b3f9e0c730dcd4a..ff966c90623b99edc03790eb9c40604ae1bed412 100644 --- a/src/resources/api/framework/users/user.js +++ b/src/resources/api/framework/users/user.js @@ -98,5 +98,9 @@ export default { }, clearUserSessionCache() { //删除用户会话缓存 return axios.post('/api/rest/user/session/cache/clear'); + }, + getUserForEdit(params) { + // 获取用户信息(编辑页面回显专用) + return axios.post('api/rest/user/get/foredit', params); } }; diff --git a/src/resources/api/http.js b/src/resources/api/http.js index 218b8a57c556f18160dfc6963827a4acc6c4c21e..a4e7eb7445f316140d440bba26e342aed7dbd8cd 100644 --- a/src/resources/api/http.js +++ b/src/resources/api/http.js @@ -248,7 +248,8 @@ const errorHandle = res => { case 522: // 认证类型失败 Vue.prototype.$utils.removeCookie('neatlogic_authorization'); - toLogin(res.data && res.data.directUrl ? res.data.directUrl : null, status); + toLogin(res.data && res.data.DirectUrl ? res.data.DirectUrl : null, status); + // console.log(res.data.DirectUrl); break; case 523: // 没有资源权限 case 526: // 对象不存在 @@ -274,7 +275,7 @@ const errorHandle = res => { case 527: //会话已超时或已被终止,重新登录 Vue.prototype.$utils.removeCookie('neatlogic_authorization'); - toLogin(res.data && res.data.directUrl ? res.data.directUrl : null); + toLogin(res.data && res.data.DirectUrl ? res.data.DirectUrl : null); break; case 530: //接口参数不符合规范 diff --git a/src/resources/assets/css/common.less b/src/resources/assets/css/common.less index c80cf3303248b126907e577605bd487505be5712..18036cd5e00e13c6ebfbd8d6e838328c4306164f 100644 --- a/src/resources/assets/css/common.less +++ b/src/resources/assets/css/common.less @@ -2072,6 +2072,7 @@ span { //slider组件,防止圆圈掉下来 .ivu-tooltip-rel { display: -webkit-box; + display: flex; // 处理chrome 91版本浏览器,文案显示不全问题 } .color-picker-transfer-class { diff --git a/src/resources/assets/css/theme.less b/src/resources/assets/css/theme.less index 1e11750b45e84ee48c75bae3c0f03fb5cf0f7ff9..4d5f11d6c636ca6a702b9a1440d16f8f19c21cf4 100644 --- a/src/resources/assets/css/theme.less +++ b/src/resources/assets/css/theme.less @@ -1577,7 +1577,7 @@ .text-CRITICAL { //删除,警告 color: @error-color; - + fill: @error-color; &:before { color: @error-color; } diff --git a/src/resources/assets/font/tsfonts/font/tsfont_woff2.json b/src/resources/assets/font/tsfonts/font/tsfont_woff2.json new file mode 100644 index 0000000000000000000000000000000000000000..5ac0a938af91c12e3717ace4db0718a0cc819dab --- /dev/null +++ b/src/resources/assets/font/tsfonts/font/tsfont_woff2.json @@ -0,0 +1,3 @@ +{ + "woff2Base64": "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" +} \ No newline at end of file diff --git a/src/resources/assets/js/state.js b/src/resources/assets/js/state.js new file mode 100644 index 0000000000000000000000000000000000000000..7a93368492cb9204ab7a6471b68c9ce71750021a --- /dev/null +++ b/src/resources/assets/js/state.js @@ -0,0 +1,55 @@ +import Vue from 'vue'; +class State { + constructor(module) { + this.store = Vue.observable({ + /** + * Vue.observable 只有在对象初始化时定义的属性,才会被 Vue 2 的响应式系统处理。 + * 勿删data,主要目的就是让state.data是响应式,computed才可以监听其值的变化。 + */ + data: {} + }); + this.module = module; + } + /** + * 使用方法: + * computed: { + * getState() { + * return this.$state.get(key); // key为set时的key值 + * } + * }, + * watch: { + * getState(val) { + * // 处理逻辑 + * } + * } + */ + get(key, type) { + if (key) { + let finalKey = ''; + if (type) { + finalKey = `${this.module}_${type}_${key}`; + } else { + finalKey = `${this.module}_${key}`; + } + return this.store.data[finalKey]; + } + } + + /** + * 使用方法: + * this.$state.set(key, value); + */ + set(key, value, type) { + if (key && value != null && typeof value != 'undefined') { + let valueKey = ''; + if (type) { + valueKey = `${this.module}_${type}_${key}`; + } else { + valueKey = `${this.module}_${key}`; + } + Vue.set(this.store.data, valueKey, value); + } + } +} + +export default State; diff --git a/src/resources/assets/js/util.js b/src/resources/assets/js/util.js index a17a35c3f810d8521214a54b6f7eb1b4d5f2b1d3..a13b5964f7b9555c93653f09de65b5ef39523045 100644 --- a/src/resources/assets/js/util.js +++ b/src/resources/assets/js/util.js @@ -5,35 +5,80 @@ removeCookie(name) 清除cookie为name的值 deepClone(data) 复制数据(不改动原数据) setUuid() 生成32位随机uuid getCurrenttime(format) 根据指定格式格式化当前时间输出格式 -sortNumber() 数字排序 getDateByFormat(value, format, styleType) 通过时间戳获取指定格式的日期 +sortNumber() 数字排序 +concatArr(arr1, arr2) 两个数组合并,且非数组对象去重 +validForm($el,$scroll) 整体表单控件校验,并且滚动到报错地方 可以传dom对象,也可以传选择器字符串 toggleClass(el, classname, type) 修改class 1、el:目标元素 2、cls:需要操作的class 3、type:"add"代表添加对应的class "remove"代码删除对应的class 如果不传则有则删除,没有则添加 getValueByPath(value, path, isArrary) 值的为空判断 如果是数组,数组的长度判断 //1、value:[Nothing]需要做判断的值, 2、path:[String]需要层层遍历的 3、isArrary:[Boolean]最终获取的值是数组,而且数组的长度大于0 checkType(value, type) 检查value类型,如果type为空则返回值的类型 -validForm($el,$scroll) 整体表单控件校验,并且滚动到报错地方 可以传dom对象,也可以传选择器字符串 -isSame(str1, str2) 判断str1和str2是否相等 -translateNumber(values, codeType) 将阿拉伯数字转为对应需要的格式(中文一二三或者英文ABCD) +checkStringNotEmpty(value) 检查数据类型不为空 +equalStr(str1, str2) 检查两个字符串是否相等, +isEmpty(val) 判断数据是否为空:null undefined '' [] {} 五中情况情况中的任何一种则为true +isSame(str1, str2) 判断str1和str2是否相等,主要是为了对 0 和 '0'需要判断相同的情况下面 +toChinese(values) 将数字转为中文。例如toChinese(123) => 一二三 +toEnglish(values) 将数字转为英文。例如toEnglish(123) => ABC +translateNumber(values, codeType) 将阿拉伯数字转为对应需要的格式(中文一二三或者英文ABCD) +gotoHref(href, that) 通过链接跳转时,需要做路由拦截等操作 +disabledRepeatSubmit(obj,key,trueval,falseval) 全局处理禁止短时间内反复提交,obj:对应需要改变的数据,key:更新的值的key,trueval:正常的往下走的值(比如放开按钮的disable),falseval:需要停止正常操作的值(比如禁用按钮) +jumpDialog(config, to, from, next, url) // 下榻页面返回提示:您有未保存数据,是否保存当前修改并跳转新页面? +hexToRgb(str) 十六进制hex转为rgb,如果是3位的先补齐6位 +rgbToHex(a,b,c) rgb转为十六进制hex +convertHexToRGBA(hexCode, opacity = 1) 转换Hex颜色编码为RGBA getLightColor(colors, level, noOpacity) 将十六进制hex的colors按减淡level(小数点数字)后得到的颜色值,当noOpacity为true时为十六进制hex,默认是按百分比透明度处理 +checkHasSomeitem(arr1, arr2) 返回arr1里是否有跟arr2重复的数据(item不支持数组和对象),arr2可以是一个item isEmptyObj(obj) 判断对象是否为空 -goBack(fromPath, url) 返回上一步 -isEmpty(val) 判断数据是否为空:null undefined '' [] {} 五中情况情况中的任何一种则为true +mergeObj() 合并对象 +goBack(fromPath, url, _this) 返回上一步 +download(that, url, data, typeHttp) 下载文件 +formatFileSize(bytes, decimalPoint, type) 格式化文件大小 +ipVerification(ip) 验证ip合法性 +portVerfication(port) 验证端口合法性 +getProtocolDataList(nodeList) 处理连接协议默认值的数据结构 +getAccountNodeList(nodeList) 账号下拉列表展示数据 +getRunnerGroupList(list) 获取runner分组列表数据 +getRunnerGroupTagList(list) 获取runner分组标签列表数据 +getAppForselect(nodeList) 获取系统和模块下拉数据(资源中心) +getToolClassificationList(list) 获取工具分类下拉列表数据(自动化) +getRoundCountList() 获取分批数量下拉列表数据(自动化,自动发布) +getAbbrNameAndName(obj) 获取简称(名称) uniqueArr(list) 数组对象去重,返回去重后的数组 uniqueByField(arr,filterField) 根据某个字段,数组去重,返回去重后的数组,filterField需要去重的字段 matrixDataSourceRedirect(dataSourceId,dataSourceJson) 根据矩阵不同数据源,跳转不同页面 +handleInvalidDate(timeValue, format, styleType) 处理时间格式错误问题 +timestampCalculation(unit = null, value = 0, timstamp = null, format = '', styleType = '-') 时间戳计算 +isUserHasAuth(str) 判断用户是否有某个权限 +calculateDate(unit = '', value = 0, timstamp = null) 根据 hour/day/month/year 计算时间 +mergeObj(obj1, obj2) 两个对象合并成一个对象 +substr(name, len) 字符串截取 +jumpTo(id, behavior, parent, block) 跳转指定的位置 +scrollTo(parentId, childId, behavior) 滚动到指定的位置 copyText(id) 点击复制内容,id表示需要复制元素的id,使用方法:this.$utils.copyText('#codeContent') -mapArray(array, key) //从数组对象中挑出一个key,将其值作为数组返回 -intersectionArr // 返回一个包含所有传入数组交集元素的新数组。 -getComposedPath(e) // 返回事件流中元素的事件路径 -removeHTMLTag(str) //去除html标签 -evalWithLineNumber(e, code) //利用eval解析时,具体报错信息和行号 -isImage(filename) //判断是否是图片 -getUnicodeByClassName(className) //获取className的unicode编码 +nameRegularValidate(name) 名称校验:仅支持汉字、字母、数字和特殊字符(._-) +mapArray(array, key) 从数组对象中挑出一个key,将其值作为数组返回 +intersectionArr 返回一个包含所有传入数组交集元素的新数组。 +validParamValue(val, validateList) 参数校验规则:判断值是否满足正则规则 +getComposedPath(e) 返回事件流中元素的事件路径 +removeHTMLTag(str) 去除html标签 +handleTopoImagePath(nodesString) 处理topo图中的图片路径 +cleanObject(obj) 递归清理对象,移除对象中的null或者undefined属性 +getTextWidth({ text, fontSize = 12, isBold = false }) 获取文本宽度 +merge(obj1, obj2) 对象合并 +evalWithLineNumber(e, code) 利用eval解析时,具体报错信息和行号 +getFileExtension(fileName) 获取文件后缀名 +isImage(filename) 判断是否是图片 +isVideo(fileName) 判断是否是视频 +setInterval(callback, delay, alwaysRun = false) 定时器 +sortByObj(obj) 对象的属性按首字母排序 +getUnicodeByClassName(className) 获取className的unicode编码 +convertWoff2ToBase64 将woff2文件转换为base64 */ import _ from 'lodash'; import store from '@/resources/store'; import ViewUI from 'neatlogic-ui/iview/index.js'; import { $t } from '@/resources/init.js'; const FONT_UNICODE_LIST = require('@/resources/assets/font/tsfonts/codes.json'); +const FONT_WOFF2_BASE64 = require('@/resources/assets/font/tsfonts/font/tsfont_woff2.json') const methods = { getCookie: function (name) { if (name) { @@ -312,6 +357,7 @@ const methods = { return isEqual; }, toChinese(values) { + // 将数字转为中文。例如toChinese(123) => 一二三 let arr = []; let val = typeof values == 'number' ? values.toString() : values; let len = val.length; //统计出长度 @@ -328,6 +374,7 @@ const methods = { return arr.join(''); }, toEnglish(values) { + // 将数字转为英文。例如toEnglish(123) => ABC let arr = []; let val = typeof values == 'number' ? values : parseInt(values); val = val - 1; @@ -1166,6 +1213,18 @@ const methods = { } const matchedItem = FONT_UNICODE_LIST.find(item => item.css === className); return matchedItem && String.fromCharCode(matchedItem.hexCodepoint); + }, + convertWoff2ToBase64() { + // 将woff2文件转换为base64 + const fontWoff2Base64 = FONT_WOFF2_BASE64.woff2Base64; + return `@font-face { + font-family: 'tsfont'; + src: url('data:font/woff2;charset=utf-8;base64,${fontWoff2Base64}') format('woff2'); + font-weight: normal; + font-style: normal; + font-display: swap; + max-width: 16px; + }`; } }; export default methods; diff --git a/src/resources/assets/languages/page/en.json b/src/resources/assets/languages/page/en.json index 700c5718d0c4e1fc67e0758a2abaca19c21c6f25..e86bb39eaf6685d2f844a083f56bdc208f26be91 100644 --- a/src/resources/assets/languages/page/en.json +++ b/src/resources/assets/languages/page/en.json @@ -1057,13 +1057,24 @@ "copyerrorinfo": "Copy error message", "loadingfailed": "Load Fail", "topo": "Topology Map", - "movetothetop": "Move to the top level", - "movetothebottom": "Move to the bottom layer", "pastehere": "Paste here", "dragthecanvas": "Drag and drop canvas", "rubberband": "Frame Select", "actualpath": "actual path", "currentjob": "Current Job", "incompleteinformation": "incomplete information", - "requiredparameterhasnullvalue": "The required parameter field has a null value" + "requiredparameterhasnullvalue": "The required parameter field has a null value", + "executeall": "Execute all", + "cache": "Cache", + "connectionsuccessful": "Connection successful", + "driverjar": "Driver jar package", + "ignored": "Neglected", + "loaded": "Loaded", + "dictionary": "dictionary", + "healthcheckresult": "Inspection results", + "autoexecparallpolicy": "Concurrency Strategy", + "autoexecbatchround": "in batches", + "autoexecparall": "Concurrency", + "autoexecparallel": "Concurrent settings", + "paramkeyword": "Participate in search" } \ No newline at end of file diff --git a/src/resources/assets/languages/page/zh.json b/src/resources/assets/languages/page/zh.json index 0afc7d675e80d033b282f7eca51fe64f717a5238..fe13d332d3b55176dbe5a742736691b035b07285 100644 --- a/src/resources/assets/languages/page/zh.json +++ b/src/resources/assets/languages/page/zh.json @@ -961,7 +961,7 @@ "existiscoverimport": "{type}【{target}】已存在,是否继续导入并覆盖", "userauthfailedpleaselogin": "认证失败,请重新登录", "partial": "局部", - "rolerule": "登录认证的请求需要携带Header做规则表达式(注意表达式中header参数全小写),如果表达式执行后的值为true则该角色生效,false和语法异常都不生效 。 如:\"${DATA.env}\"==\"sit\"&&(\"${DATA.test}\"==\"1\"||\"${DATA.test2}\"==\"aaa\")", + "rolerule": "登录认证的请求需要携带Header做规则表达式(注意表达式中header参数全小写,且前缀必须为{prefix}),如果表达式执行后的值为true则该角色生效,false和语法异常都不生效 。 如:", "datasources": "数据来源", "formcomponents": "表单组件", "agree": "同意", @@ -1059,13 +1059,24 @@ "copyerrorinfo": "复制错误信息", "loadingfailed": "加载失败", "topo": "拓扑图", - "movetothetop": "移至顶层", - "movetothebottom": "移至底层", "pastehere": "在此粘贴", "dragthecanvas": "拖拽画布", "rubberband": "框选", "actualpath": "实际路径", "currentjob": "当前作业", "incompleteinformation": "信息不完整", - "requiredparameterhasnullvalue": "必填参数项存在空值" + "requiredparameterhasnullvalue": "必填参数项存在空值", + "executeall": "执行所有", + "cache": "缓存", + "connectionsuccessful": "连接成功", + "driverjar": "驱动jar包", + "ignored": "已忽略", + "loaded": "已加载", + "dictionary": "字典", + "healthcheckresult": "检查结果", + "autoexecparallpolicy": "并发策略", + "autoexecbatchround": "分批", + "autoexecparall": "并发", + "autoexecparallel": "并发设置", + "paramkeyword": "入参搜索" } \ No newline at end of file diff --git a/src/resources/assets/languages/router/en.json b/src/resources/assets/languages/router/en.json index e1861089fc71caa8a80291d29566b209e7485bc8..cc1a64b3e6c1eb0c88356121b1dc06275f4d2da3 100644 --- a/src/resources/assets/languages/router/en.json +++ b/src/resources/assets/languages/router/en.json @@ -130,6 +130,7 @@ "formmanage": "Forms", "integrationmanage": "Integration", "datawarehousemanage": "Data Warehouse", + "datasource": "Data source", "historymanage": "Messages", "subscriptionsetting": "Subscribe", "noticemanage": "Notice", @@ -168,7 +169,8 @@ "healthcheck": "Health Check", "license": "License Management", "extramenu": "Menu management", - "homepage": "default page " + "homepage": "default page ", + "changelogaudit": "Database Change Log" }, "knowledge": { "knowledgedetail": "entry details", diff --git a/src/resources/assets/languages/router/zh.json b/src/resources/assets/languages/router/zh.json index 81c58e9a7b3ed4a74dba21a513de8b9918269563..9d4626d540198177c65f3a64000b27728f8bc0b9 100644 --- a/src/resources/assets/languages/router/zh.json +++ b/src/resources/assets/languages/router/zh.json @@ -118,7 +118,7 @@ "teammanage": "分组管理", "authmanage": "权限管理", "useraddview": "编辑用户", - "worktimemanage": "服务窗口管理", + "worktimemanage": "服务时间管理", "usersetting": "个人设置", "roleaddview": "编辑角色", "authadduser": "编辑授权", @@ -130,6 +130,7 @@ "formmanage": "表单管理", "integrationmanage": "集成管理", "datawarehousemanage": "数据仓库", + "datasource": "数据源", "historymanage": "历史消息", "subscriptionsetting": "订阅设置", "noticemanage": "系统公告", @@ -168,7 +169,8 @@ "healthcheck": "健康检查", "license": "许可管理", "extramenu": "菜单管理", - "homepage": "默认首页" + "homepage": "默认首页", + "changelogaudit": "数据库变更记录" }, "knowledge": { "knowledgedetail": "词条详情", diff --git a/src/resources/assets/languages/term/en.json b/src/resources/assets/languages/term/en.json index d1014a2826d84d21109f6c18b1da3c26782d91f7..cb1cf8604cfc46b6de0cf6ae92c0e2cb95380cfc 100644 --- a/src/resources/assets/languages/term/en.json +++ b/src/resources/assets/languages/term/en.json @@ -628,7 +628,9 @@ "thirdpartyapi": "Third party callback interface", "reactivatestep": "Reactivation steps", "seeprocessconfig": "View the current work order process configuration", - "editprocessconfig": "Edit the current work order process configuration" + "editprocessconfig": "Edit the current work order process configuration", + "stepishandledby": "Step Handling Human", + "sercalendar": "Service Calendar" }, "autoexec": { "addrootdirectory": "Add root directory", @@ -903,7 +905,12 @@ "setinputloopoperations": "Settings: Please enter at least one tool", "runnergrouptagprocesstips": "If form assignment is required, please set the executor group to the \"Job Parameters\" type in the combination tool", "runnergroupprocesstips": "If form assignment is required, please set the \"Executor Group\" to the \"Job Parameter\" type in the combination tool", - "resetrunnerphase": "Reset phase or not" + "resetrunnerphase": "Reset phase or not", + "runnerGroupTooltip": "If the actuator group is not filled in here, the current stage will inherit the combination tool actuator group by default. If the actuator group is filled in here, the current stage will use the one filled in here; During execution, the executor group of the stage cannot be modified", + "isfirenext": "Do you want to activate the next group", + "inputnodelimit": "The quantity cannot exceed 1000", + "parall": "Concurrent quantity", + "paralldesc": "Execute the execution targets in order of concurrency." }, "framework": { "roleauth": "Authorize immediately after creating the role", @@ -1343,7 +1350,10 @@ "tagentupgrade": "Upgrade Package Management", "tagentupgradepkg": "Upgrade Package", "selecttagentupgradepkg": "Select an existing upgrade package", - "tagentuploadupgradepkg": "Upload upgrade package" + "tagentuploadupgradepkg": "Upload upgrade package", + "versionremarks": "Version Remarks", + "heartbeaturl": "Backend server address", + "runnergrouptips": "The request for login authentication needs to carry a header as a rule expression (note that the header parameter in the expression must be all lowercase and the prefix must be {prefix}). If the value of the expression after execution is true, the executor group will take effect, and false and syntax exceptions will not take effect. For example:" }, "knowledge": { "document": "Document", @@ -2143,7 +2153,10 @@ "buildnopending": "To be built", "actuatorgrouptag": "Actuator group label", "blueset": "Blue green setting", - "blueSet": "Blue Green" + "blueSet": "Blue Green", + "ismodified": "Modified", + "presetrunnergroup": "Preset actuator group", + "testrunnerdesc": "If not specified, actuators will be automatically assigned based on IP matching of actuator groups according to network segments" }, "inspect": { "alarmprompt": "Alarm Prompt", @@ -2840,5 +2853,8 @@ "isnormalattr": "As a regular attribute display", "closesuccess": "Close successfully", "istop": "topped" + }, + "runnergroup": { + "ruletips": "The request for login authentication needs to carry a header as a rule expression (note that the header parameter in the expression is all lowercase). If the value of the expression after execution is true, the executor group will take effect, and false and syntax exceptions will not take effect. For example: ${env}==\\ bit \\&&(${test}==\\ 1 \\ | | ${test2}==\\ aaa \\)" } } \ No newline at end of file diff --git a/src/resources/assets/languages/term/zh.json b/src/resources/assets/languages/term/zh.json index 438ae42af3a0ad03896005c3cdf102f6443e2bdc..63b7cdb88dfe5196026bddce4e7b2c6404f1d70a 100644 --- a/src/resources/assets/languages/term/zh.json +++ b/src/resources/assets/languages/term/zh.json @@ -296,7 +296,7 @@ "workflow": "工作流", "showpriority": "显示优先级", "defaultpriority": "默认优先级", - "serwindow": "服务窗口", + "serwindow": "服务时间", "sertype": "服务类型", "reporauth": "上报授权", "tranferreport": "转报", @@ -628,7 +628,9 @@ "thirdpartyapi": "第三方回调接口", "reactivatestep": "重新激活步骤", "seeprocessconfig": "查看当前工单流程配置", - "editprocessconfig": "编辑当前工单流程配置" + "editprocessconfig": "编辑当前工单流程配置", + "stepishandledby": "步骤处理人为", + "sercalendar": "服务日历" }, "autoexec": { "addrootdirectory": "添加根目录", @@ -707,7 +709,7 @@ "associateacustomtool": "关联自定义工具", "disassociatecandeletecatalog": "当前目录或其子目录已关联自定义工具,解除关联后,才可删除此目录", "bysubcatalogalldeletetips": "删除当前目录时,其所有子目录将同时被删除", - "ipformattip": "主机类目标输入格式为 IP,服务类目标输入格式为IP:PORT,数据库类目标格式为IP:PORT/SID,一行一个目标", + "ipformattip": "主机类目标输入格式为 IP,服务类目标输入格式为IP:PORT,数据库类目标格式为IP:PORT/SID,一行一个目标,最多支持输入1000个目标", "viewalltarget": "查看更多{target}个目标", "choosetagasnodetip": "选择标签过滤节点,作为执行目标", "jobparamnosettingtip": "作业参数中未设置【节点信息】参数", @@ -877,7 +879,7 @@ "pleaseselectdirectoryname": "请选择目录名称", "pleaseselectuploadfile": "脚本内容:请上传附件", "supportonlytarfile": "仅支持tar文件", - "scriptcontenttips": "帮助:\n 工具执行是通过标准的命令行参数来传参。\n 输入参数:\n 1)具备参数名的参数:\n option名称就是参数名,option值就是参数值。\n 2)没有参数名的参数:\n 对应工具的自由参数,通过参数序号来获取参数。\n 不同的编程语言如何处理命令行参数,具体请查看相关的demo。\n 输出参数:\n 通过把输出参数写入当前作业工作目录下的json文件ouput.json进行参数的输出。\n 平台提供的不同语言的输出封装,具体请查看相关的demo,例如:\n Python:\n from lib import AutoExecUtils\n out = {}\n out['outtext'] = 'this is the text out value'\n AutoExecUtils.saveOutput(out) \n Perl:\n use AutoExecUtils;\n my $out = {};\n $out->{outtext} = 'this is the text out value';\n AutoExecUtils::saveOutput($out); \n Bash:\n outtext='this is the text out value'\n if [ ! -z '$OUTPUT_PATH' ]; then\n cat <'$OUTPUT_PATH'\n {\n 'outtext':'$outtext'\n }\n EOF\n fi\n 退出码标识:\n 只要ExitCode不等于0则代表异常退出。\n注意:\n 如果需发起子进程,执行完毕后请注意关闭标准输出和错误输出,否则父进程可能无法正常退出。", + "scriptcontenttips": "帮助:\n 工具执行是通过标准的命令行参数来传参。\n 输入参数:\n 1)具备参数名的参数:\n option名称就是参数名,option值就是参数值。\n 2)没有参数名的参数:\n 对应工具的自由参数,通过参数序号来获取参数。\n 不同的编程语言如何处理命令行参数,具体请查看相关的demo。\n 输出参数:\n 通过把输出参数写入当前作业工作目录下的json文件ouput.json进行参数的输出。\n 平台提供的不同语言的输出封装,具体请查看相关的demo,例如:\n Python: \n #runner类型工具\n #import AutoExecUtils\n #target类型工具\n from lib import AutoExecUtils\n out = {}\n out['outtext'] = 'this is the text out value'\n AutoExecUtils.saveOutput(out) \n Perl:\n use AutoExecUtils;\n my $out = {};\n $out->{outtext} = 'this is the text out value';\n AutoExecUtils::saveOutput($out); \n Bash:\n outtext='this is the text out value'\n if [ ! -z '$OUTPUT_PATH' ]; then\n cat <'$OUTPUT_PATH'\n {\n 'outtext':'$outtext'\n }\n EOF\n fi\n 退出码标识:\n 只要ExitCode不等于0则代表异常退出。\n注意:\n 如果需发起子进程,执行完毕后请注意关闭标准输出和错误输出,否则父进程可能无法正常退出。", "speedlevel": "速度级别", "workthread": "工作线程", "loadedjob": "已加载作业", @@ -891,7 +893,7 @@ "toolparamstooltip": "工具参数是已关联的工具的参数集合。来源于自定义工具库的参数可增加、删除和修改,来源于工具库的参数无法增加、删除和修改。", "combophasexpired": "组合工具已失效", "pleasereedit": "请重新编辑后,提交审核", - "abortjob": "终止作业", + "abortjob": "中止作业", "runnergroupdeprecatedtips": "作业执行器组参数已失效,请重新点击确认并保存流程", "loopitem": "循环项", "loopoperation": "循环执行", @@ -903,7 +905,12 @@ "setinputloopoperations": "设置:请输入至少一个工具", "runnergrouptagprocesstips": "如果需要表单赋值,请在组合工具设置“执行器组标签”为“作业参数”类型", "runnergroupprocesstips": "如果需要表单赋值,请在组合工具设置“执行器组”为“作业参数”类型", - "resetrunnerphase": "是否重置阶段" + "resetrunnerphase": "是否重置阶段", + "runnerGroupTooltip": "若此处不填写执行器组,当前阶段默认继承组合工具执行器组,若此处填写执行器组,当前阶段将采用此处填写的;执行时,不可修改阶段的执行器组", + "isfirenext": "是否激活下一个组", + "inputnodelimit": "数量不能大于1000", + "parall": "并发数量", + "paralldesc": "将执行目标按并发数量先后执行。" }, "framework": { "roleauth": "创建完角色立即授权", @@ -1343,7 +1350,10 @@ "tagentupgrade": "升级包管理", "tagentupgradepkg": "升级包", "selecttagentupgradepkg": "选择已有的升级包", - "tagentuploadupgradepkg": "上传升级包" + "tagentuploadupgradepkg": "上传升级包", + "versionremarks": "版本备注", + "heartbeaturl": "后端服务器地址", + "runnergrouptips": "登录认证的请求需要携带Header做规则表达式(注意表达式中header参数全小写,且前缀必须为{prefix}),如果表达式执行后的值为true则该执行器组生效,false和语法异常都不生效。如:" }, "knowledge": { "document": "文档", @@ -2140,7 +2150,10 @@ "buildnopending": "待构建", "actuatorgrouptag": "执行器组标签", "blueset": "蓝绿设置", - "blueSet": "蓝绿" + "blueSet": "蓝绿", + "ismodified": "已修改", + "presetrunnergroup": "预设执行器组", + "testrunnerdesc": "如果不指定则会通过ip根据网段匹配执行器组自动分配执行器" }, "inspect": { "alarmprompt": "告警提示", diff --git a/src/resources/base.md b/src/resources/base.md index b1c56a5baab7d7ba5c470ca6839b7fcf1fdaaed9..ba9daae2edb765e912b682f364224b7e264334af 100644 --- a/src/resources/base.md +++ b/src/resources/base.md @@ -2,111 +2,120 @@ ## 样式传透 -rsbuild升级到v1版本之后,内置的less从v3升级到v4,导致`/deep/`样式的传透失效,所以后续需要使用`::v-deep`来实现样式的传透。 +rsbuild 升级到 v1 版本之后,内置的 less 从 v3 升级到 v4,导致`/deep/`样式的传透失效,所以后续需要使用`::v-deep`来实现样式的传透。 +## 常用 js 工具方法 + +| 文件 | 说明 | +| :-----------: | :------------: | +| authUtil.js | 权限方法库 | +| localStore.js | 本地缓存方法库 | +| state.js | 状态管理工具库 | +| util.js | 常用工具方法库 | ## 全局通用样式 > > > 页面栅格布局说明:(sm:800px,md:1024px,lg:1280px,xl:1400px,xxl:1920px) -#### 通用类样式class +#### 通用类样式 class -| class名 | 用途 | 说明 | +| class 名 | 用途 | 说明 | | :------------: | :------------------------: | :----------------- | -| h1 | 特大标题(登录页系统) | 字号28行高36 | -| h2 | 弹窗对话框标题文字 | 字号18行高26 | -| h3 | 大屏展示统计图标题、大标题 | 字号16行高24 | -| h4 | 一二级菜单 | 字号14行高22 | -| fz10 | 提示类文字 | 字号10(待调整) | -| fz16 | 无 | 字号16 | -| fz18 | 无 | 字号18 | -| fz20 | 无 | 字号20 | -| text | 正文、基本字号 | 字号13行高21 | -| tips | 表格头部、错误提示 | 字号12行高20 | +| h1 | 特大标题(登录页系统) | 字号 28 行高 36 | +| h2 | 弹窗对话框标题文字 | 字号 18 行高 26 | +| h3 | 大屏展示统计图标题、大标题 | 字号 16 行高 24 | +| h4 | 一二级菜单 | 字号 14 行高 22 | +| fz10 | 提示类文字 | 字号 10(待调整) | +| fz16 | 无 | 字号 16 | +| fz18 | 无 | 字号 18 | +| fz20 | 无 | 字号 20 | +| text | 正文、基本字号 | 字号 13 行高 21 | +| tips | 表格头部、错误提示 | 字号 12 行高 20 | | cursor-pointer | 鼠标上移显示可点击的手型 | 悬浮于连接上时,手 | -#### 通用类颜色样式class - -| class名 | 用途 | 说明 | -| :-------------: | :--------------------------------------------------------------------------: | :------------------------------------------------------------- | -| text-title | 标题字体 | 颜色为标题色,比正文字体颜色深 | -| text-action | 可操作类文字 | 默认正文颜色,移上去变可点击的蓝色+pointer | -| text-href | 跳转类文字 | 字体颜色可点击颜色+移上去pointer | -| text-white | 白色文字 | 不会随主题色发生改变的白色,目前是#fff | -| text-op | 相反色 | 适用于需要根据主题色改变的反色 | -| text-disabled | 不可操作文字 | 移上去鼠标显示不可操作+0.6透明度 | -| text-info | info颜色字体 | - | -| text-primary | 主题色字体 | - | -| text-success | 绿色成功色字体 | - | -| text-danger | 红色告警色字体 | - | -| text-warning | 橙色告警色字体 | - | -| text-error | 红色错误色字体 | - | -| border-error | 红色边框 | - | -| border-primary | 主题色边框 | - | -| text-tip | 提示类文字,颜色浅色 | 跟着主题走 | -| text-grey | 提示类文字 | 此class尽量少用,早期class,用text-tip | -| text-tip-active | 提示类文字,颜色浅色,移上去后显示主题色移上去交互,提供提示类问题可激活样式 | 跟着主题走 | -| require-label | 必填的文字(会在左边带一个\*必填的提示),后期调整ui把提示的红色字体去掉 | 跟着主题走 | -| bg-grey | 背景色灰色 | - | -| bg-tip-grey | 提示灰色背景(弱化) | - | -| bg-hover-grey | 移上去背景色为灰色 | - | -| bg-op | 背景色与字体颜色相反(浅色主题为白色,深色主题为墨蓝色) | - | -| bg-block | 主体区域的块状元素的背景色(目前是浅灰色) | - | -| bg-info | 蓝色背景 | - | -| bg-info-grey | 浅蓝色背景 | 用于蓝色背景(弱化) | -| bg-success | 绿色背景 | - | -| bg-success-grey | 浅绿色背景 | 用于绿色背景(弱化) | -| bg-warning | 橙色色背景 | - | -| bg-warning-grey | 浅橙色背景 | 用于橙色背景(弱化) | -| bg-error | 红色背景 | - | -| bg-error-grey | 浅红色背景 | 用于红色背景(弱化) | -| bg-code | 代码片段的背景色 | - | -| bg-selected | 选中的带浅色主题色背景色的样式 | 适用于部分场景选中只需要背景色 | -| item-selected | 选中的主题色字体颜色带浅色背景色的样式 | 适用于部分场景选中需要背景色+字体颜色 | -| bg-modal | 模态窗背景色 | 非白的,浅浅灰 | -| bg-footer-btn | 卡片式的底部操作栏背景色 | 前期为白色后期调整为浅灰色 | -| lh-2 | 行高2倍字号 | 用于有时候需要文字行高比一般的高一些(比如空数据提示等) | -| input-border | 输入框需要带边框 | 不推荐使用(早期风格为整体底框时专门处理需要四边框的输入框用) | - -#### 场景类样式class +#### 通用类颜色样式 class + +| class 名 | 用途 | 说明 | +| :-------------: | :----------------------: | :------------------------------------------------------------- | +| text-title | 标题字体 | 颜色为标题色,比正文字体颜色深 | +| text-action | 可操作类文字 | 默认正文颜色,移上去变可点击的蓝色+pointer | +| text-href | 跳转类文字 | 字体颜色可点击颜色+移上去 pointer | +| text-white | 白色文字 | 不会随主题色发生改变的白色,目前是#fff | +| text-op | 相反色 | 适用于需要根据主题色改变的反色 | +| text-disabled | 不可操作文字 | 移上去鼠标显示不可操作+0.6 透明度 | +| text-info | info 颜色字体 | - | +| text-primary | 主题色字体 | - | +| text-success | 绿色成功色字体 | - | +| text-danger | 红色告警色字体 | - | +| text-warning | 橙色告警色字体 | - | +| text-error | 红色错误色字体 | - | +| border-error | 红色边框 | - | +| border-primary | 主题色边框 | - | +| text-tip | 提示类文字,颜色浅色 | 跟着主题走 | +| text-grey | 提示类文字 | 此 class 尽量少用,早期 class,用 text-tip | +| text-tip-active | 提示类文字,颜色浅色 | 鼠标上移提示类颜色变色 | +| require-label | 必填的文字 | \*号必填样式红色 | +| bg-grey | 背景色灰色 | - | +| bg-tip-grey | 提示灰色背景(弱化) | - | +| bg-hover-grey | 移上去背景色为灰色 | - | +| bg-op | 背景色与字体颜色相反 | (浅色主题为白色,深色主题为墨蓝色) | +| bg-block | 块状元素背景色 | (目前是浅灰色) | +| bg-info | 蓝色背景 | - | +| bg-info-grey | 浅蓝色背景 | 用于蓝色背景(弱化) | +| bg-success | 绿色背景 | - | +| bg-success-grey | 浅绿色背景 | 用于绿色背景(弱化) | +| bg-warning | 橙色色背景 | - | +| bg-warning-grey | 浅橙色背景 | 用于橙色背景(弱化) | +| bg-error | 红色背景 | - | +| bg-error-grey | 浅红色背景 | 用于红色背景(弱化) | +| bg-code | 代码片段的背景色 | - | +| bg-selected | 选中背景色 | 选中的带浅色主题色背景色的样式 | +| item-selected | 选中的主题色 | 字体颜色带浅色背景色的样式 | +| bg-modal | 模态窗背景色 | 非白的,浅浅灰 | +| bg-footer-btn | 卡片式的底部操作栏背景色 | 前期为白色后期调整为浅灰色 | +| bg-stripe | 条纹背景色 | 用户折叠展开组件的 header | +| lh-2 | 行高 2 倍字号 | 用于有时候需要文字行高比一般的高一些(比如空数据提示等) | +| input-border | 输入框需要带边框 | 不推荐使用(早期风格为整体底框时专门处理需要四边框的输入框用) | + +#### 场景类样式 class ##### 页面排版涉及到圆角弧度,边框,阴影 -| class名 | 用途 | 说明 | -| :----------: | :----------------------------------------------: | :--- | -| radius-lg | 圆角10px,用于大块的元素 | -| radius-md | 圆角8px,一般用于table,卡片等等 | -| radius-sm | 圆角6px,一般用于条状元素,比如操作栏、输入框等等 | -| radius-mi | 圆角4px,一般用于按钮 | -| block-border | 块状元素边框 | - | -| shadow | 块状元素阴影 | - | +| class 名 | 用途 | 说明 | +| :----------: | :----------: | :--------------------------------------- | +| radius-lg | 圆角 10px | 用于大块的元素 | +| radius-md | 圆角 8px | 一般用于 table,卡片等等 | +| radius-sm | 圆角 6px | 一般用于条状元素,比如操作栏、输入框等等 | +| radius-mi | 圆角 4px | 一般用于按钮 | +| block-border | 块状元素边框 | - | +| shadow | 块状元素阴影 | - | ##### 超过内容区域显示处理 -| class名 | 用途 | 说明 | +| class 名 | 用途 | 说明 | | :----------------: | :------------------: | :--------------------- | | overflow | 超过宽度显示省略号 | - | -| line-2 | 超过2行显示省略号 | 以2倍行高为标准 | -| line-3 | 超过3行显示省略号 | 以3倍行高为标准 | +| line-2 | 超过 2 行显示省略号 | 以 2 倍行高为标准 | +| line-3 | 超过 3 行显示省略号 | 以 3 倍行高为标准 | | block-add | 添加按钮块状样式 | 需要独占一行的 | | tsscroll-container | 如果溢出则出现滚动条 | 该样式处理了滚动条样式 | ##### 对齐方式 -| class名 | 用途 | 说明 | -| :----------: | :----------------------------------------------------------------------: | :-------------------------------------------------------- | -| clearfix | 清除子级浮动造成的样式问题 | - | -| float-left | 元素左浮动 | 父级元素需加上清除浮动的样式,比如加上clearfix的classname | -| float-right | 元素右浮动 | 父级元素需加上清除浮动的样式,比如加上clearfix的classname | -| text-center | 元素水平方向(横轴)居中对齐 | - | -| text-left | 元素水平方向(横轴)左对齐 | - | -| text-right | 元素水平方向(横轴)右对齐 | - | -| flex-start | flex布局下水平方向(横轴)元素开始方向对齐 | - | -| flex-end | flex布局下水平方向(横轴)元素结束方向对齐 | - | -| flex-center | flex布局下水平方向(横轴)元素中心对齐 | - | -| flex-between | flex布局下水平方向(横轴)项目位于各行之间留有空白的容器内 | - | -| flex-around | flex布局下水平方向(横轴)项目位于各行之前、之间、之后都留有空白的容器内 | - | -| align-start | flex布局下垂直方向(竖轴)顶对齐(开始方向对齐) | - | +| class 名 | 用途 | 说明 | +| :----------: | :----------: | :----------------------------------------------------------- | +| clearfix | 清除浮动 | 子级浮动造成的样式问题- | +| float-left | 元素左浮动 | 父级元素需加上清除浮动的样式,比如加上 clearfix 的 classname | +| float-right | 元素右浮动 | 父级元素需加上清除浮动的样式,比如加上 clearfix 的 classname | +| text-center | 居中对齐 | 元素水平方向(横轴) | +| text-left | 左对齐 | 元素水平方向(横轴) | +| text-right | 右对齐 | 元素水平方向(横轴) | +| flex-start | 左对齐 | flex 布局横轴元素开始方向对齐 | +| flex-end | 右对齐 | flex 布局横轴元素结束方向对齐 | +| flex-center | 中心对齐 | flex 布局横轴元素 | +| flex-between | 两端对齐 | flex 布局横轴项目位于各行之间留有空白的容器内 | +| flex-around | 项目两侧等距 | flex 布局横轴项目位于各行之前、之间、之后都留有空白的容器内 | +| align-start | 交叉轴对齐 | flex 布局竖轴顶对齐(开始方向对齐) | ##### 间隙 @@ -114,7 +123,7 @@ rsbuild升级到v1版本之后,内置的less从v3升级到v4,导致`/deep/` > m 前缀的表示 margin,t/r/b/l 分别表示 top/right/bottom/left (上右下左) 四个方向的边距 -> 其中lg 表示 24像素,nm表示16像素,md表示12像素,sm表示10像素, xs表示6像素 +> 其中 lg 表示 24 像素,nm 表示 16 像素,md 表示 12 像素,sm 表示 10 像素, xs 表示 6 像素 | 内边距类名 | 用途 | 说明 | | :--------: | :--------------: | :------------------------------------- | @@ -123,22 +132,22 @@ rsbuild升级到v1版本之后,内置的less从v3升级到v4,导致`/deep/` | padding-md | 内间隙普通尺寸 | padding: 12px | | padding-sm | 内间隙小尺寸 | padding: 10px,一般用于文字间隙 | | padding-xs | 内间隙较小 | padding: 6px; 比如分页的页数之间的间隙 | -| pt-nm | 上内间隙16px | padding-top: 16px; | -| pb-nm | 下内间隙16px | padding-bottom: 16px; | -| pl-nm | 左内间隙16px | padding-left: 16px; | -| pr-nm | 右内间隙16px | padding-right: 16px; | +| pt-nm | 上内间隙 16px | padding-top: 16px; | +| pb-nm | 下内间隙 16px | padding-bottom: 16px; | +| pl-nm | 左内间隙 16px | padding-left: 16px; | +| pr-nm | 右内间隙 16px | padding-right: 16px; | | pr-md | 右内间隙普通尺寸 | padding-right: 12px; | | pl-md | 左内间隙普通尺寸 | padding-left: 12px; | | pt-md | 右内间隙普通尺寸 | padding-top: 12px; | | pb-md | 左内间隙普通尺寸 | padding-bottom: 12px; | -| pt-sm | 上内间隙10px | padding-top: 10px; | -| pb-sm | 下内间隙10px | padding-bottom: 10px; | -| pl-sm | 左内间隙10px | padding-left: 10px; | -| pr-sm | 右内间隙10px | padding-right: 10px; | -| pt-xs | 上内间隙6px | padding-top: 6px; | -| pb-xs | 下内间隙6px | padding-bottom: 6px; | -| pl-xs | 左内间隙6px | padding-left: 6px; | -| pr-xs | 右内间隙6px | padding-right: 6px; | +| pt-sm | 上内间隙 10px | padding-top: 10px; | +| pb-sm | 下内间隙 10px | padding-bottom: 10px; | +| pl-sm | 左内间隙 10px | padding-left: 10px; | +| pr-sm | 右内间隙 10px | padding-right: 10px; | +| pt-xs | 上内间隙 6px | padding-top: 6px; | +| pb-xs | 下内间隙 6px | padding-bottom: 6px; | +| pl-xs | 左内间隙 6px | padding-left: 6px; | +| pr-xs | 右内间隙 6px | padding-right: 6px; | | 外边距类名 | 说明 | | :--------: | :------------------ | @@ -164,99 +173,112 @@ rsbuild升级到v1版本之后,内置的less从v3升级到v4,导致`/deep/` ##### 图标文字间隙 -| class名 | 用途 | 说明 | -| :--------: | :----------------------: | :-------------- | -| icon-right | 字体图标到右侧文案的间隙 | 间隙大小为4像素 | +| class 名 | 用途 | 说明 | +| :--------: | :----------------------: | :---------------- | +| icon-right | 字体图标到右侧文案的间隙 | 间隙大小为 4 像素 | ##### 操作栏 -| class名 | 用途 | 说明 | -| :-------------------------------------: | :--------------------------------: | :------------------------------- | -| .action-group>.action-item\*n(.disable) | 操作分类组,常用于各种多个操作并列 | 禁用时action-item添加disable类名 | +| class 名 | 用途 | 说明 | +| :-------------------------------------: | :--------------------------------: | :----------------------------------- | +| .action-group>.action-item\*n(.disable) | 操作分类组,常用于各种多个操作并列 | 禁用时 action-item 添加 disable 类名 | ##### 动画 > 调用:直接动画里加上动画名字,其他参数按照实际(比如:animation: water-wave linear infinite;) -| 动画名 | 用途 | 说明 | -| :--------: | :--------------------------------: | :------------------------------------------------------------------- | -| fade | 渐明减暗效果 | 透明度从0.6到1的轮播,一般css这么写:animation: fade linear infinite; | -| rocking | 晃铃效果 | 一般css这么写:animation: rocking 2s; | -| water-wave | 水波纹效果 | 一般css这么写:animation: fade linear infinite; | -| rubberBand | animatecss的rubberBand弹橡皮筋动画 | 一般css这么写:animation: rubberBand 1s; | +| 动画名 | 用途 | 说明 | +| :--------: | :-----------------------------------: | :--------------------------------------------------------------- | +| fade | 渐明减暗效果 | 透明度从 0.6 到 1 的轮播,用法:animation: fade linear infinite; | +| rocking | 晃铃效果 | 用法:animation: rocking 2s; | +| water-wave | 水波纹效果 | 用法:animation: fade linear infinite; | +| rubberBand | animatecss 的 rubberBand 弹橡皮筋动画 | 用法:animation: rubberBand 1s; | ##### 兼容老的样式的表单布局 -| class名 | 用途 | 说明 | -| :------------------------------------: | :------------------------------------------: | :--------- | -| .form-block>(.block-left+.block-right) | 左侧label(宽度120px)右侧表单或者文字的布局 | 不推荐使用 | +| class 名 | 用途 | 说明 | +| :------------------------------------: | :--------------------------------------------: | :--------- | +| .form-block>(.block-left+.block-right) | 左侧 label(宽度 120px)右侧表单或者文字的布局 | 不推荐使用 | ## 全局方法 #### 全局变量 -| 名称 | 用途 | 说明 | 其他 | -| :-----------: | :--------------------------: | :-------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------- | -| TENANT | 获取当前租户 | 通过当前浏览器的TENANT变量可以获取 | - | -| HOME | 获取当前访问地址的前缀 | 目前是‘/租户’,主要用于写地址跳转时拼接路径前缀 | - | -| BASEURLPREFIX | 获取默认接口前缀 | 目前是‘/租户’,api调用路径只需要从租户后的路径开始 | 例如:调用‘/租户/api/rest/auth/module/get’时,api入口的路径为:‘/api/rest/auth/module/get’ | -| BASELANGUAGES | 获取当前页面的语言 | 目前支持中英文,zh/en | -| MODULEID | 获取当前模块的id | 需要跟rest/auth/module/get的接口返回的对应当前模块的数据的group的值对应上 | 模块的英文键名 | -| MENUTYPE | 获取当前的菜单的分类类型映射 | 为{key:分类名字,...}对象数据,需要跟左侧菜单的分类类型对应上,对应体现在路由的meta.type | +| 名称 | 用途 | 说明 | +| :-----------: | :--------------------: | :-------------------------------------------------: | +| TENANT | 获取当前租户 | 通过获取地址栏上的租户名称 | +| HOME | 获取当前访问地址的前缀 | 目前是"/租户",用户打开新标签页时拼接路径前缀 | +| BASEURLPREFIX | 获取默认接口前缀 | 目前是"/租户",api 调用路径只需要从租户后的路径开始 | +| BASELANGUAGES | 获取当前页面的语言 | 目前支持中英文,zh/en | +| MODULEID | 获取模块名称 | 模块的名称 | +| MENUTYPE | 获取菜单分类名称 | 左侧菜单大分类名称 | #### utils > > > 模版调用方法: -```javascript +````javascript +// 查看所有方法的地址:/src/resources/assets/js/util.js this.$utils.*** -``` +``` | -##### 方法 - -名称|用途|说明|其他 -:---:|:---:|:---:|:---| -getCookie|获取cookie为name的值|this.$utils.getCookie(name)|-| -setCookie|设置cookie为name的值为value,期限是time(如果是数字,单位为天;如果是字符串,直接赋值结束时间)|this.$utils.setCookie(name, value, time) |-| -removeCookie|清除cookie为name的值|this.$utils.removeCookie(name) |-| -deepClone|深拷贝,复制数据(不改动原数据)|this.$utils.deepClone(data) |-| -setUuid|生成32位随机uuid|this.$utils.setUuid() |-| -getCurrenttime|根据指定格式格式化当前时间输出格式|this.$utils.getCurrenttime(format)|参数默认格式:年月日 时:分:秒,其他选项:["HH:mm:ss","yyyy-MM-dd","HH:mm")]| -getDateByFormat|通过时间戳获取指定格式的日期|this.$utils.getDateByFormat(value, format, styleType)|format同上,styleType为链接付,默认'-'| -validForm|校验$el的表单控件,如有错误的触发$scroll的滚动到错误位置|this.$utils.validForm($el,$scroll) |可以传dom对象,也可以传选择器字符串| -toggleClass|修改classname|this.$utils.toggleClass(el, classname, type) |1、el:目标元素 2、cls:需要操作的class 3、type:"add"代表添加对应的class "remove"代码删除对应的class 如果不传则有则删除,没有则添加| -checkType|检查value类型是否为type类型,如果type为空则返回值的类型|this.$utils.checkType(value, type) |type可以是类型的字符串和多个类型的array| -checkStringNotEmpty|检查value类是否为空|this.$utils.checkStringNotEmpty(value) |包含null和undefined和空三种| -isSame|检查2个数组是否一样(类型和值)|this.$utils.isSame(str1, str2) |-| -translateNumber|将阿拉伯数字转为对应需要的格式(中文一二三或者英文ABCD)|this.$utils.translateNumber(values, codeType) |values为1、2、3这种数字(一般是下标),codeType:不填或者'en'| -getLightColor|获取十六进度hex色值转化为按指定百分比减淡的颜色|this.$utils.getLightColor('#333333', 0.2) |getLightColor(colors, level, noOpacity),color:十六进制hex,level:减淡到的百分比,用小数点形式,noOpacity:是否用透明度,默认否,如需要去掉透明度则会转为十六进制hex(部分浏览器如果对某些色值透明度处理有问题需要转为十六进制hex)| -gotoHref|全局的通过链接跳转时,需要做路由拦截等操作|this.$utils.gotoHref(href, this) |href为对应跳转地址,this为当前模版的this变量| -jumpDialog|返回提示统一操作,目的统一文案,和统一按钮交互方式,需要在每个路由的beforeRouteLeave里处理 | 如下示例|-| ```javascript -this.$utils.jumpDialog.call(this, { - save: { - fn: async(vnode) => { - return await _this.saveAction(); +this.$utils.jumpDialog.call( + this, + { + save: { + fn: async vnode => { + return await _this.saveAction(); + } } - } -}, to, from, next, url); -``` + }, + to, + from, + next, + url +); +```` ## 全局指令 > download(点击从指定地址下载文件) -```javascript - +```vue + + ``` -参数|用途|使用|其他 -:---:|:---:|:---:|:---| -downurl|设置下载的参数和地址|单纯url和{url:地址,method:'post',params:{参数},changeStatus(status)=>{//do something with status}}|url为必传,method、changeStatus、params均为非必传| -downloadok|下载接口回调成功回调事件|-|-| -downloaderror|下载接口回调失败回调事件|-|-| - - +| 参数 | 用途 | +| :-----------: | :----------------------: | +| downurl | 设置下载的参数和地址 | +| downloadok | 下载接口回调成功回调事件 | +| downloaderror | 下载接口回调失败回调事件 | > clipboard(点击复制指定内容到剪切板供其他地方粘贴复制用) @@ -279,7 +301,7 @@ downloaderror|下载接口回调失败回调事件|-|-| | 参数 | 用途 | 使用 | 其他 | | :--: | :--: | :--: | :--- | -> scroll-hidden(容器滚动时隐藏drop的内容,指令使用在滚动的容器里面,监听滚动事件) +> scroll-hidden(容器滚动时隐藏 drop 的内容,指令使用在滚动的容器里面,监听滚动事件) ```javascript
@@ -300,11 +322,11 @@ downloaderror|下载接口回调失败回调事件|-|-| ## 全局过滤器 -参数|用途|使用|其他 -:---:|:---:|:---:|:---| -formatDate|时间格式处理|{{ 时间戳 \| formatDate(指定格式) }}|指定格式可不传,默认yyyy-mm-dd hh:mm:ss| -formatTimeCost|处理耗时|{{ timeCost\|formatTimeCost({textUnit:’second’,valueUnit:’second’,unitType:’en’}) }}|通用场景:timecost为精确到毫秒的时间戳转化为标准时间格式,后面参数为非必填(默认显示文案单位textUnit为秒second、值的单位valueUnit为毫秒millisecond,单位语言类型默认为中文zh)更多设置:textUnit和valueUnit可供设置的有:{'day': '天','hour': '小时','minute': '分钟','second': '秒','millisecond': '毫秒'},unitType目前只支持中文zh和英文en| -unescapeHtml|转义特殊字符为html|{{ 字符串 \| unescapeHtml}}|-| +| 参数 | 用途 | 使用 | 其他 | +| :------------: | :-----------------: | :-------: | :---------------------- | --------------------------------------- | +| formatDate | 时间格式处理 | {{ 时间戳 | formatDate(指定格式) }} | 指定格式可不传,默认 yyyy-mm-dd hh:mm:ss | +| formatTimeCost | 处理耗时 | | | +| unescapeHtml | 转义特殊字符为 html | {{ 字符串 | unescapeHtml}} | - | ## 全局状态管理 @@ -318,29 +340,29 @@ unescapeHtml|转义特殊字符为html|{{ 字符串 \| unescapeHtml}}|-| #### 基础组件 -| 名称 | 用途 | 说明 | 其他 | -| :-------: | :--------------------: | :----------------: | :--------------------- | -| TsContain | 基本排版(页面最外层) | 见TsContain组件api | 全局组件,直接调用即可 | -| Button | 按钮 | iview的组件 | 全局组件,直接调用即可 | -| Tabs | 标签页 | iview的组件 | 全局组件,直接调用即可 | -| Dropdown | 下拉菜单 | iview的组件 | 全局组件,直接调用即可 | -| Badge | 徽标数 | iview的组件 | 全局组件,直接调用即可 | -| Loading | 加载中组件 | 封装过的组件 | 全局组件,直接调用即可 | -| NoData | 无数据提示组件 | 封装过的组件 | 全局组件,直接调用即可 | +| 名称 | 用途 | 说明 | 其他 | +| :-------: | :--------------------: | :-------------------: | :--------------------- | +| TsContain | 基本排版(页面最外层) | 见 TsContain 组件 api | 全局组件,直接调用即可 | +| Button | 按钮 | iview 的组件 | 全局组件,直接调用即可 | +| Tabs | 标签页 | iview 的组件 | 全局组件,直接调用即可 | +| Dropdown | 下拉菜单 | iview 的组件 | 全局组件,直接调用即可 | +| Badge | 徽标数 | iview 的组件 | 全局组件,直接调用即可 | +| Loading | 加载中组件 | 封装过的组件 | 全局组件,直接调用即可 | +| NoData | 无数据提示组件 | 封装过的组件 | 全局组件,直接调用即可 | #### 拓展定制组件 -| 名称 | 用途 | 说明 | 其他 | -| :----: | :------: | :-------------: | :----------- | -| TsForm | 表单组件 | 见TsForm组件api | 需要注册组件 | +| 名称 | 用途 | 说明 | 其他 | +| :----: | :------: | :----------------: | :----------- | +| TsForm | 表单组件 | 见 TsForm 组件 api | 需要注册组件 | #### 表单搜索、选择类组件 -| 名称 | 用途 | 说明 | 其他 | -| :-------------: | :------------: | :----------------------: | :--------------------------------------------------- | -| CombineSearcher | 组合下拉搜索 | 见CombineSearcher组件api | 需要注册组件 | -| PoptipSelect | 下拉选择器 | 见PoptipSelect组件api | 一般用于固定选项下拉展开后有描述等内容,需要注册组件 | -| TimeSelect | 时间下拉选择器 | 见TimeSelect组件api | 一般用于选择固定时间范围和具体时间范围,需要注册组件 | +| 名称 | 用途 | 说明 | 其他 | +| :-------------: | :------------: | :-------------------------: | :--------------------------------------------------- | +| CombineSearcher | 组合下拉搜索 | 见 CombineSearcher 组件 api | 需要注册组件 | +| PoptipSelect | 下拉选择器 | 见 PoptipSelect 组件 api | 一般用于固定选项下拉展开后有描述等内容,需要注册组件 | +| TimeSelect | 时间下拉选择器 | 见 TimeSelect 组件 api | 一般用于选择固定时间范围和具体时间范围,需要注册组件 | #### 表格的类 diff --git a/src/resources/components/CombineSearcher/CombineSearcher.vue b/src/resources/components/CombineSearcher/CombineSearcher.vue index 0ba61ab66e858772126f7363bc331b8a21e54266..75b947c8dc18694a23be5b3bc40d457547ec7ae5 100644 --- a/src/resources/components/CombineSearcher/CombineSearcher.vue +++ b/src/resources/components/CombineSearcher/CombineSearcher.vue @@ -52,7 +52,7 @@ :class="{seachable:search,clearable:clearable && totalText && Object.keys(totalText).length,'form-target':!border}" @click="clickItem" > - +
+
+ +
+ + + diff --git a/src/resources/components/Condition/components/index.js b/src/resources/components/Condition/components/index.js index dabebae3034c9eb77d7c79a6f92e8114ca023e47..65e23d827667567de7ceabd0cb50365b87d7bac2 100644 --- a/src/resources/components/Condition/components/index.js +++ b/src/resources/components/Condition/components/index.js @@ -1,6 +1,10 @@ +//通用组件 export { default as textConditionHandler } from '@/resources/components/Condition/components/text-condition-handler.vue'; export { default as numberConditionHandler } from '@/resources/components/Condition/components/number-condition-handler.vue'; export { default as datetimeConditionHandler } from '@/resources/components/Condition/components/datetime-condition-handler.vue'; export { default as selectConditionHandler } from '@/resources/components/Condition/components/select-condition-handler.vue'; export { default as userselectConditionHandler } from '@/resources/components/Condition/components/user-condition-handler.vue'; export { default as enumConditionHandler } from '@/resources/components/Condition/components/enum-condition-handler.vue'; +//特定表达式组件 +export { default as ex_inworktime_ConditionHandler } from '@/resources/components/Condition/components/ex-worktime-condition-handler.vue'; +export { default as ex_outworktime_ConditionHandler } from '@/resources/components/Condition/components/ex-worktime-condition-handler.vue'; diff --git a/src/resources/components/Condition/condition-group.vue b/src/resources/components/Condition/condition-group.vue index 198faa77e7c59d60ad3e3cfa607c7e41a841bc37..483d255940300f7b9c8248e34b68042f863624bc 100644 --- a/src/resources/components/Condition/condition-group.vue +++ b/src/resources/components/Condition/condition-group.vue @@ -25,6 +25,7 @@ :disabled="readonly" :value="conItem.name" :transfer="true" + border="border" valueName="name" textName="label" :validateList="[{ name: 'required', message: ' ' }]" @@ -43,6 +44,7 @@ :value="conItem.expression" :dataList="getExpressionList(conItem)" :transfer="true" + border="border" :validateList="[{ name: 'required', message: ' ' }]" @change=" (value, option) => { @@ -57,7 +59,9 @@ v-if="getAttr(conItem)" :readonly="readonly" :value="conItem.valueList" + :expression="conItem.expression" :conditionItem="getAttr(conItem)" + :conditionItemData="conItem" @change=" val => { setAttrValue(conItem, val); @@ -154,7 +158,9 @@ export default { gte: '大于等于', lte: '小于等于', 'is-null': '为空', - 'is-not-null': '不为空' + 'is-not-null': '不为空', + inworktime: '在服务时间内', + outworktime: '在服务时间外' }, joinTypeList: [ { diff --git a/src/resources/components/Condition/condition-item.vue b/src/resources/components/Condition/condition-item.vue index 596134640cdcc9915e4675938512808db00bbe83..2ad59c79a6c30b2a8d5afbdc043a83326660e791 100644 --- a/src/resources/components/Condition/condition-item.vue +++ b/src/resources/components/Condition/condition-item.vue @@ -1,5 +1,14 @@ + + + @@ -148,6 +152,10 @@ export default { title: this.$t('page.keeprecords'), key: 'needAudit' }, + { + title: this.$t('page.loaded'), + key: 'isLoad' + }, { title: this.$t('page.plantime'), key: 'cron' diff --git a/src/views/pages/framework/schedule/job-memory.vue b/src/views/pages/framework/schedule/job-memory.vue index 98fedd48e155ecf6095354e882649c2a43c08d6c..60c3784c480fca94c5d6c9c92af1e7f37b84cdfc 100644 --- a/src/views/pages/framework/schedule/job-memory.vue +++ b/src/views/pages/framework/schedule/job-memory.vue @@ -58,6 +58,7 @@ export default { valueName: 'value', search: true, transfer: true, + border: 'border', onChange: val => { this.changeJobGroupName(val); } @@ -74,6 +75,7 @@ export default { search: true, transfer: true, disabled: true, + border: 'border', onChange: val => { this.changeJobName(val); } diff --git a/src/views/pages/framework/server/server-manage.vue b/src/views/pages/framework/server/server-manage.vue index 3fc4d95d2d69e573b73e3581c22f1eb3e61ff120..2c7916484732aba8a5de1ab7b073301b1226f161 100644 --- a/src/views/pages/framework/server/server-manage.vue +++ b/src/views/pages/framework/server/server-manage.vue @@ -78,7 +78,7 @@ export default { }, { key: 'host', - title: this.$t('term.framework.host') + title: this.$t('term.framework.heartbeaturl') }, { key: 'heartbeatTime', @@ -111,7 +111,7 @@ export default { }, host: { type: 'text', - label: this.$t('term.framework.host'), + label: this.$t('term.framework.heartbeaturl'), placeholder: 'http(s)://ip:port', validateList: ['required'] } diff --git a/src/views/pages/framework/tagent/tagent/install-tips-dialog.vue b/src/views/pages/framework/tagent/tagent/install-tips-dialog.vue index 2551e9cba86ca2622f141a8639edbe45df9732bf..513d5d3d144130191e8065b2bbec83ddf4210304 100644 --- a/src/views/pages/framework/tagent/tagent/install-tips-dialog.vue +++ b/src/views/pages/framework/tagent/tagent/install-tips-dialog.vue @@ -76,7 +76,7 @@ export default { { id: this.$utils.setUuid(), systemName: 'Windows', - WindowScripts: '#Open cmd.exec in Administrator mode\ncd "%Temp%"\n#use browser downlaod install.vbs to directory:%Temp%\n#http://192.168.0.26:8080/download/tagent-bootstrap/install.vbs\nset RUNNER_ADDR=http://10.68.10.60:8084\ncscript install.vbs /tenant:develop /pkgurl:%RUNNER_ADDR%/autoexecrunner/tagent/download/tagent_windows_x64.tar /serveraddr:%RUNNER_ADDR% /listenaddr:0.0.0.0 /port:3939' + WindowScripts: '#Open cmd.exe in Administrator mode\ncd "%Temp%"\n#use browser download install.vbs to directory:%Temp%\n#http://10.68.10.60:8084/autoexecrunner/tagent/download/install.vbs\nset RUNNER_ADDR=http://10.68.10.60:8084\ncscript install.vbs /tenant:develop /pkgurl:%RUNNER_ADDR%/autoexecrunner/tagent/download/tagent_windows_x64.tar /serveraddr:%RUNNER_ADDR% /listenaddr:0.0.0.0 /port:3939' } ] }, diff --git a/src/views/pages/framework/users/common/common-auth.vue b/src/views/pages/framework/users/common/common-auth.vue index 84271a7717845b86275c69a0512da58a7e096a95..67f5247b14d3dd7c9839d12037b184e35a163045 100644 --- a/src/views/pages/framework/users/common/common-auth.vue +++ b/src/views/pages/framework/users/common/common-auth.vue @@ -89,9 +89,19 @@ export default { isDisabled(row) { // 继承角色权限,不允许取消授权 let isDisabled = false; - let authRoleObj = JSON.stringify(this.authRoleSelectList); - let hasAuthRole = authRoleObj.indexOf(row.name); - isDisabled = hasAuthRole != '-1'; + const {name = ''} = row || {}; + if (this.$utils.isEmpty(name)) { + return false; + } + // 处理继承角色权限,之前是转成JSON字符串去匹配,导致匹配的权限不对,授权范围扩大了。 + for (let key in this.authRoleSelectList) { + if (key && this.authRoleSelectList[key] && this.authRoleSelectList[key].length > 0 && Array.isArray(this.authRoleSelectList[key])) { + if (this.authRoleSelectList[key].some(authName => authName === row.name)) { + isDisabled = true; + break; + } + } + } return isDisabled; }, isReadOnly() { diff --git a/src/views/pages/framework/users/role-addview.vue b/src/views/pages/framework/users/role-addview.vue index c051a4df7821c45fdae4b95745787f82bbb96722..351bd0d7e05f94d4fe79e6598b54f3cbe887ef51 100644 --- a/src/views/pages/framework/users/role-addview.vue +++ b/src/views/pages/framework/users/role-addview.vue @@ -219,7 +219,9 @@ export default { value: '', placeholder: this.$t('form.placeholder.pleaseinput', {target: this.$t('page.rule')}), label: this.$t('page.rule'), - tooltip: this.$t('page.rolerule') + tooltip: this.$t('page.rolerule', { + prefix: this.rulePrefix + }) + '${' + this.rulePrefix + "env}=='sit'&&(${" + this.rulePrefix + "test}=='1'||${" + this.rulePrefix + "test2}=='aaa')" } ], uuid: '', //角色uuid @@ -262,11 +264,14 @@ export default { isRefreshRoleUserList: false }, defaultAuthUserSelectList: {}, // 默认授权列表回显选中数据 - isRefreshCommonAuth: false // 是否刷新授权列表 + isRefreshCommonAuth: false, // 是否刷新授权列表 + rulePrefix: '' //规则key前缀 }; }, - beforeCreate() {}, + beforeCreate() { + this.rulePrefix = this.$route.query.rulePrefix || ''; + }, created() { this.uuid = this.$route.query.uuid || null; diff --git a/src/views/pages/framework/users/role-manage.vue b/src/views/pages/framework/users/role-manage.vue index 4a7575897d8817495b75e4535007e99ad476058c..fc28daf728701c43cd7eb3a054e6e2e67ad91513 100644 --- a/src/views/pages/framework/users/role-manage.vue +++ b/src/views/pages/framework/users/role-manage.vue @@ -77,7 +77,8 @@ export default { { title: this.$t('term.framework.usercount'), key: 'userCount' }, { title: this.$t('term.framework.teamcount'), key: 'teamCount' }, { title: ' ', key: 'action'} - ] + ], + rulePrefix: '' }; }, created() {}, @@ -98,6 +99,7 @@ export default { this.$api.framework.role.roleList(data).then(res => { if (res.Status == 'OK') { this.tableData = res.Return; + this.rulePrefix = res.Return.prefix; } }).finally(() => { this.loadingShow = false; @@ -171,7 +173,7 @@ export default { } this.$router.push({ path: `role-addview`, - query: { roleId: roleId, key: key, uuid: uuid, groupType: this.groupType} + query: { roleId: roleId, key: key, uuid: uuid, groupType: this.groupType, rulePrefix: this.rulePrefix} }); } }, diff --git a/src/views/pages/framework/users/user-addview.vue b/src/views/pages/framework/users/user-addview.vue index d95a0c11f7e40e3c7a18c825f50e68482d961400..937146940834378a3ee895b91c3c5090500a5d46 100644 --- a/src/views/pages/framework/users/user-addview.vue +++ b/src/views/pages/framework/users/user-addview.vue @@ -15,7 +15,7 @@
-
+
-
+
- - + @@ -77,17 +73,17 @@ type="primary" :loading="isLoading" @click="submit()" - >{{ $t('dialog.title.createtarget', {target: $t('page.user')}) }} + >{{ $t('dialog.title.createtarget', { target: $t('page.user') }) }}
- +
@@ -136,7 +132,7 @@ >{{ $t('page.save') }}
- +
v.name === 'teamRoleList'); - if (newConfig) { - newConfig.isHidden = false; - } - } - this.label1 = this.getLabel(this.$t('page.basicinfo'), 'user'); - this.label2 = this.getLabel(this.$t('page.auth'), 'auth'); - this.getRoleList(); - this.getAuthList(); - this.getProfile(); + this.initData(); }, - beforeMount() {}, - mounted() {}, - beforeUpdate() {}, - updated() {}, - activated() {}, - deactivated() {}, - beforeDestroy() {}, - destroyed() {}, - methods: { + initData() { + let { uuid = null, userId = null, key = null, readonly = false } = this.$route.query; + this.uuid = uuid; + this.userId = userId; + this.tabsName = key; + this.readonly = readonly; + this.handleDataByUuid(); + this.handleReadonly(); + this.basicInfoTabLabelName = this.getLabel(this.$t('page.basicinfo'), 'user'); + this.authTabLabelName = this.getLabel(this.$t('page.auth'), 'auth'); + this.getAuthList(); + this.getProfile(); + }, + handleDataByUuid() { + if (!this.$utils.isEmpty(this.uuid)) { + this.getUserDetail(this.uuid); + this.getAuthSelect(this.uuid); + this.getUserToken(this.uuid); + } + }, + handleReadonly() { + if (this.readonly) { + this.formData.forEach(item => { + item.disabled = true; + }); + this.formData + .filter(d => d.name == 'roleUuidList' || d.name == 'teamUuidList') + .forEach(item => { + item.readonly = true; + }); + } else { + this.formData.forEach(item => { + if (this.uuid && item.name == 'userId') { + item.disabled = true; + } else if (item.name != 'uuid') { + item.disabled = false; + item.readonly = false; + } + }); + } + if (this.readonly && this.uuid) { + let findTeamRoleItem = this.formData.find(v => v.name === 'teamRoleList'); + if (findTeamRoleItem) { + findTeamRoleItem.isHidden = false; + } + } + }, //密码框改变 psdChange: function(val) { if (this.userId != null) { @@ -500,7 +515,6 @@ export default { }, //下一步 next() { - let _this = this; let data = this.$refs.userForm.getFormValue(); if (!this.$refs.userForm.valid()) { this.stepStatus = 'error'; @@ -590,7 +604,7 @@ export default { .then(res => { if (res.Status == 'OK') { this.$Message.success(this.$t('message.savesuccess')); - this.userTabsDataList = this.$refs.userForm ? this.$refs.userForm.getFormValue() : null; + this.defaultUserDataTab = this.$refs.userForm ? this.$refs.userForm.getFormValue() : null; this.userData = this.getData(); } }) @@ -618,7 +632,6 @@ export default { }, //获取当前用户信息 getUserDetail(id) { - let _this = this; let obj_name = this.formData.find(d => d.name === 'userId'); let psd = this.formData.find(d => d.name === 'password'); let newpwd = this.formData.find(d => d.name === 'confirmpwd'); @@ -633,10 +646,9 @@ export default { } this.formShow = true; let data = { - userUuid: id, - isRuleRole: false + userUuid: id }; - this.$api.common.getUser(data).then(res => { + this.$api.framework.user.getUserForEdit(data).then(res => { if (res.Status == 'OK') { let row = res.Return; this.userDetail = row; @@ -674,34 +686,16 @@ export default { //获取所有权限列表 getAuthList: function() { let data = {}; - let _this = this; - this.$api.common - .getAuthGrouplist(data) - .then(res => { - if (res.Status == 'OK') { - _this.authList = res.Return.authGroupList; - _this.$nextTick(() => { - setTimeout(() => { - _this.userData = _this.getData(); - _this.userTabsDataList = _this.$refs.userForm.getFormValue(); - _this.userTabsAuthList = JSON.parse(JSON.stringify(_this.$refs.commonAuth.authSelectList)); - }, 500); - }); - } - }); - }, - //获取角色列表 - getRoleList: function() { - let data = { - needPage: false - }; - this.$api.framework.role.roleList(data).then(res => { + this.$api.common.getAuthGrouplist(data).then(res => { if (res.Status == 'OK') { - let list = res.Return.tbodyList; - let newConfig = this.formData.find(d => d.name == 'roleUuidList'); - if (newConfig) { - newConfig.dataList = list; - } + this.authList = res.Return.authGroupList; + this.$nextTick(() => { + setTimeout(() => { + this.userData = this.getData(); + this.defaultUserDataTab = this.$refs.userForm?.getFormValue(); + this.userTabsAuthList = JSON.parse(JSON.stringify(this.$refs.commonAuth.authSelectList)); + }, 500); + }); } }); }, @@ -724,7 +718,7 @@ export default { if (this.tabsName != name) { if (name == 'auth') { let newData = this.$refs.userForm.getFormValue(); - if (JSON.stringify(newData) == JSON.stringify(this.userTabsDataList)) { + if (this.$utils.isSame(newData, this.defaultUserDataTab)) { this.tabSaveTip = false; //可以跳转 } else { this.tabSaveTip = true; @@ -733,7 +727,7 @@ export default { } if (name == 'user') { let newData = this.$refs.commonAuth.authSelectList; - if (JSON.stringify(newData) == JSON.stringify(this.userTabsAuthList)) { + if (this.$utils.isSame(newData, this.userTabsAuthList)) { this.tabSaveTip = false; //可以跳转 } else { this.tabSaveTip = true; @@ -760,7 +754,6 @@ export default { }, //自定义初始化tabs getLabel(label, name) { - var _this = this; return h => { return h( 'div', @@ -770,7 +763,7 @@ export default { }, on: { click: e => { - var tip = _this.tabClick(name); // 判断条件是否满足 + const tip = this.tabClick(name); // 判断条件是否满足 if (tip) { e.stopPropagation(); // 不满足条件则阻止事件冒泡 本质是不让触发tab的on-click事件 } @@ -872,46 +865,9 @@ export default { }); } }, - filter: {}, - computed: {}, - watch: { - uuid() { - if (this.uuid != undefined) { - let uuid = this.uuid; - this.getUserDetail(uuid); - this.getAuthSelect(uuid); - this.getUserToken(uuid); - } - }, - // userId: function () { - // if (this.userId != undefined) { - // let userId = this.userId; - // } - // }, - readonly: function(newVal) { - if (newVal) { - this.formData.forEach(item => { - item.disabled = true; - }); - this.formData - .filter(d => d.name == 'roleUuidList' || d.name == 'teamUuidList') - .forEach(item => { - item.readonly = true; - }); - } else { - this.formData.forEach(item => { - if (this.uuid && item.name == 'userId') { - item.disabled = true; - } else if (item.name != 'uuid') { - item.disabled = false; - item.readonly = false; - } - }); - } - } }, //路由离开之前 beforeRouteLeave(to, from, next, url) { @@ -954,7 +910,7 @@ export default { diff --git a/src/views/pages/process/task/processdetail/workorder/activity/item/index.js b/src/views/pages/process/task/processdetail/workorder/activity/item/index.js index c8190789e664e06ec5055f2257ca0964aa1a98ba..7e227eeb93639ad9fd58d594b323f78f64a6a95d 100644 --- a/src/views/pages/process/task/processdetail/workorder/activity/item/index.js +++ b/src/views/pages/process/task/processdetail/workorder/activity/item/index.js @@ -7,6 +7,7 @@ import formHandler from './form-handler'; import fileHandler from './file-handler'; import restfulactionHandler from './restfulaction-handler'; import workerlistHandler from './workerlist-handler'; +import assignworkerlistHandler from './assignworkerlist-handler'; import workerHandler from './worker-handler'; import causeHandler from './cause-handler'; import ruleHandler from './rule-handler'; @@ -33,6 +34,7 @@ export default { restfulactionHandler, //动作激活 workerHandler, workerlistHandler, + assignworkerlistHandler, causeHandler, //条件异常原因 ruleHandler, //条件规则 fromprocesstaskHandler, //原工单 diff --git a/src/views/pages/rdm/project/viewtab/components/issue-list-table.vue b/src/views/pages/rdm/project/viewtab/components/issue-list-table.vue index 52d6dc5d4e3a11b2aa148fb1964f83d090c5f102..4af939e9f71ef9c3de66b84645c682b391d0a903 100644 --- a/src/views/pages/rdm/project/viewtab/components/issue-list-table.vue +++ b/src/views/pages/rdm/project/viewtab/components/issue-list-table.vue @@ -108,6 +108,11 @@ export default { beforeDestroy() {}, destroyed() {}, methods: { + newWindowOpen(row) { + const { appType = '', projectId = null, appId = null, id = null} = row || {}; + const path = `${appType}-detail/${projectId}/${appId}/${id}`; + window.open(HOME + '/rdm.html#/' + path, '_blank'); + }, highlightKeywords(text, wordList) { if (!wordList || wordList.length === 0) return text; const escapedWords = wordList.map(word => this.escapeRegExp(word)); @@ -148,7 +153,12 @@ export default { this.$emit('deleteIssue', row); }, openIssueDetail(row) { - this.$emit('openIssue', row); + if (row && row.parentId) { + // 子需求新标签页打开 + this.newWindowOpen(row); + } else { + this.$emit('openIssue', row); + } }, searchIssue(currentPage) { this.$emit('searchIssue', currentPage); diff --git a/src/views/pages/rdm/rdm.js b/src/views/pages/rdm/rdm.js index cd5ca014379ca8986eed0e43546747ffda44eec1..280c81b4abc044a8e74be04e7b44115e64154db7 100644 --- a/src/views/pages/rdm/rdm.js +++ b/src/views/pages/rdm/rdm.js @@ -7,6 +7,7 @@ import VueI18n from 'vue-i18n'; import CompareUtil from '@/resources/assets/js/compareUtil.js'; import api from '@/resources/api/api.js'; import LocalStore from '@/resources/assets/js/localStore.js'; +import State from '@/resources/assets/js/state.js'; //公共的全局组件、样式等 import '@/resources/base.js'; @@ -28,6 +29,7 @@ Vue.config.productionTip = false; Vue.prototype.$api = api; Vue.prototype.$tsrouter = router; Vue.prototype.$localStore = new LocalStore('rdm', router); +Vue.prototype.$state = new State('rdm'); new Vue({ router, diff --git a/src/views/pages/report/report.js b/src/views/pages/report/report.js index 6701013a7c87ebc4d49287e8f7fdac394d8b858f..c66681f5797596b6604e938a2c071cf428db50d6 100644 --- a/src/views/pages/report/report.js +++ b/src/views/pages/report/report.js @@ -7,6 +7,7 @@ import VueI18n from 'vue-i18n'; import CompareUtil from '@/resources/assets/js/compareUtil.js'; import api from '@/resources/api/api.js'; import LocalStore from '@/resources/assets/js/localStore.js'; +import State from '@/resources/assets/js/state.js'; import md5 from 'js-md5'; @@ -42,6 +43,7 @@ Vue.prototype.$api = api; Vue.prototype.$md5 = md5; Vue.prototype.$tsrouter = router; Vue.prototype.$localStore = new LocalStore('report', router); +Vue.prototype.$state = new State('report'); new Vue({ router, diff --git a/src/views/pages/report/sendjob/sendjob-manage.vue b/src/views/pages/report/sendjob/sendjob-manage.vue index ed7e50919ddc6cdfda7024f07fd1a378fcf6139c..3a314469d0f854eb00cc4e09b415d747d2410135 100644 --- a/src/views/pages/report/sendjob/sendjob-manage.vue +++ b/src/views/pages/report/sendjob/sendjob-manage.vue @@ -36,6 +36,10 @@ + @@ -48,7 +52,7 @@ >