diff --git a/jsconfig.json b/jsconfig.json index 4c6b424..4d178d3 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -4,9 +4,10 @@ "module": "commonjs", "allowSyntheticDefaultImports": true, "baseUrl": "./", - "paths": { + "paths": { "@/*": ["src/*"] } }, "exclude": ["node_modules", "*.ignore.*"] } + \ No newline at end of file diff --git a/package.json b/package.json index ba9d63d..4de6213 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,9 @@ "@ckeditor/ckeditor5-vue": "^4.0.1", "@element-plus/icons": "^0.0.11", "@tinymce/tinymce-vue": "^5.0.0", + "@vue-office/docx": "^1.6.3", + "@vue-office/excel": "^1.7.14", + "@vue-office/pdf": "^2.0.10", "axios": "^0.21.1", "clipboard": "^2.0.8", "core-js": "^3.15.0", @@ -51,6 +54,7 @@ "lodash": "^4.17.21", "mockjs": "^1.1.0", "nprogress": "^0.2.0", + "qrcode": "^1.5.4", "qs": "^6.10.1", "quill-image-drop-module": "^1.0.3", "quill-image-resize-module": "^3.0.0", @@ -63,6 +67,7 @@ "vue-echarts": "^6.0.0-rc.6", "vue-quill-editor": "^3.0.6", "vue-router": "^4.0.0-rc.6", + "vue3-print-nb": "^0.1.4", "vuex": "^4.0.0-rc.2", "xlsx": "^0.18.5" }, diff --git a/src/api/knowledge.js b/src/api/knowledge.js index b8ec6b3..714bdc9 100644 --- a/src/api/knowledge.js +++ b/src/api/knowledge.js @@ -45,3 +45,92 @@ export function getCategoryDict(data) { data, }); } + +// 知识库分类树 +export function getTypeCategoryTree(data) { + return request({ + url: '/knowledgeCategory/categoryTree', + method: 'get', + data, + }); +} + +// 知识库分类 +export function getTypeList(data) { + return request({ + url: '/knowledgeCategory/list', + method: 'get', + data, + }); +} + +// 添加分类 +export function doTypeAdd(data) { + return request({ + url: '/knowledgeCategory/add', + method: 'post', + data, + }); +} + +// 编辑分类 +export function doTypeEdit(data) { + return request({ + url: '/knowledgeCategory/update', + method: 'post', + data, + }); +} + +// 删除分类 +export function doTypeDel(data) { + return request({ + url: '/knowledgeCategory/delete?categoryId=' + data.categoryId, + method: 'post', + data, + }); +} + +// 知识库查询 +export function getKnowledgeList(data) { + let param = '?page=' + data.page + '&size=' + data.size; + if (data.title != undefined && data.title != '') { + param += '&title=' + data.title; + } + if (data.category != undefined && data.category != '') { + param += '&category=' + data.category; + } + return request({ + url: '/knowledge/list' + param, + method: 'get', + data, + }); +} + +// 附件上传 +export function upload(data) { + return request({ + url: '/file/upload', + method: 'post', + data, + }); +} + +// 附件删除 +export function fileDel(data) { + return request({ + url: '/file/del', + method: 'post', + data, + }); +} + +// 类型字典查询 +export function getTypeDict(data) { + return request({ + url: '/knowledge/typeDict', + method: 'get', + data, + }); +} + diff --git a/src/api/operation.js b/src/api/operation.js new file mode 100644 index 0000000..9c99ca7 --- /dev/null +++ b/src/api/operation.js @@ -0,0 +1,54 @@ +import request from '@/utils/request'; +import { baseURL } from '@/config'; +// 获取故障信息 +export function getData(data) { + let param = '?page=' + data.page + '&size=' + data.size; + if (data.projectId != '') { + param += '&projectId=' + data.projectId; + } + if (data.deviceId != '') { + param += '&deviceId=' + data.deviceId; + } + if (data.start != '') { + param += '&start=' + data.start; + } + if (data.end != '') { + param += '&end=' + data.end; + } + return request({ + url: '/faultAnalysis/getFaultInfo' + param, + method: 'get', + data, + }); +} + +// 获取层级项目站点 +export function getProjectDeviceTree(data) { + return request({ + url: '/faultAnalysis/getProjectDeviceTree', + method: 'get', + data, + }); +} + +// 获取故障详情 +export function getFaultDetails(data) { + let param = '?page=' + data.page + '&size=' + data.size; + if (data.projectId != '') { + param += '&projectId=' + data.projectId; + } + if (data.deviceId != '') { + param += '&deviceId=' + data.deviceId; + } + if (data.start != '') { + param += '&start=' + data.start; + } + if (data.end != '') { + param += '&end=' + data.end; + } + return request({ + url: '/faultAnalysis/getFaultDetails' + param, + method: 'get', + data, + }); +} diff --git a/src/api/platform.js b/src/api/platform.js new file mode 100644 index 0000000..946ba96 --- /dev/null +++ b/src/api/platform.js @@ -0,0 +1,63 @@ +import request from '@/utils/request'; +// 平台三级按钮列表 +export function getList(data) { + let param = '?page=' + data.page + '&size=' + data.size; + if (data.name !== '' && data.name !== undefined) { + param += '&name=' + data.name; + } + return request({ + url: '/sysButton/list' + param, + method: 'get', + data, + }); +} + +// 平台按钮树桩列表 +export async function buttonTree(data) { + return request({ + url: '/sysButton/buttonTree', + method: 'get', + data, + }); +} + +// 添加平台三级按钮 +export async function doAdd(data) { + return request({ + url: '/sysButton/insert', + method: 'post', + data, + }); +} +// 修改平台三级按钮 +export async function doEdit(data) { + return request({ + url: '/sysButton/update', + method: 'post', + data, + }); +} +// 分配平台三级按钮 +export async function assignButton(data) { + return request({ + url: '/sysRole/assignButton', + method: 'post', + data, + }); +} +// 查询角色已有按钮权限id +export async function getButtonIds(data) { + return request({ + url: '/sysRole/getButtonIds', + method: 'get', + params: data, + }); +} +// 查询当前用户按钮权限标识 +export async function getButtonPerms(data) { + return request({ + url: '/system/getButtonPerms', + method: 'get', + params: data, + }); +} diff --git a/src/api/product.js b/src/api/product.js new file mode 100644 index 0000000..e7b9d67 --- /dev/null +++ b/src/api/product.js @@ -0,0 +1,52 @@ +import request from '@/utils/request'; +//查询tuya设备列表 +export function getList(data) { + let param = '?page=' + data.page + '&size=' + data.size; + if (data.name != '' && data.name != undefined) { + param += '&name=' + data.name; + } + if (data.materialCode != '' && data.materialCode != undefined) { + param += '&materialCode=' + data.materialCode; + } + return request({ + url: '/productCategory/list' + param, + method: 'get', + data, + }); +} +//注册设备 +export function addData(data) { + return request({ + url: '/productCategory/add', + method: 'post', + data, + }); +} +//删除设备 +export function updateData(data) { + return request({ + url: '/productCategory/update', + method: 'post', + data, + }); +} +export function delectData(ids) { + return request({ + url: '/productCategory/delete/' + ids, + method: 'post', + }); +} +//配置产品参数 +export function addAttribute(data) { + return request({ + url: '/productCategory/addAttribute', + method: 'post', + data, + }); +} +export function getAttribute(id) { + return request({ + url: '/productCategory/getAttribute/' + id, + method: 'get', + }); +} diff --git a/src/api/program.js b/src/api/program.js new file mode 100644 index 0000000..1ff53db --- /dev/null +++ b/src/api/program.js @@ -0,0 +1,55 @@ +import request from '@/utils/request'; +// 小程序三级按钮列表 +export function getList(data) { + let param = '?page=' + data.page + '&size=' + data.size; + if (data.name !== '' && data.name !== undefined) { + param += '&name=' + data.name; + } + return request({ + url: '/wechatButton/list' + param, + method: 'get', + data, + }); +} + +// 添加小程序三级按钮 +export async function doAdd(data) { + return request({ + url: '/wechatButton/insert', + method: 'post', + data, + }); +} +// 修改小程序三级按钮 +export async function doEdit(data) { + return request({ + url: '/wechatButton/update', + method: 'post', + data, + }); +} +// 分配小程序三级按钮 +export async function assignButton(data) { + return request({ + url: '/miniRole/assignButton', + method: 'post', + data, + }); +} +// 查询角色已有按钮权限id +export async function getButtonIds(data) { + return request({ + url: '/miniRole/getButtonIds', + method: 'get', + params: data, + }); +} + +// 树形列表 +export async function buttonTree(data) { + return request({ + url: '/wechatButton/buttonTree', + method: 'get', + params: data, + }); +} diff --git a/src/api/sys.js b/src/api/sys.js index e878864..1a59233 100644 --- a/src/api/sys.js +++ b/src/api/sys.js @@ -23,3 +23,67 @@ export async function getData(data) { data, }); } + +// 基础信息 +export async function baseInfo(data) { + let param = ''; + if (data.month) { + param = '?month=' + data.month; + } + return request({ + url: '/systemAnalysis/baseInfo' + param, + method: 'get', + data, + }); +} +// 用户分析 +export async function user(data) { + let param = ''; + if (data.month) { + param = '?month=' + data.month; + } + return request({ + url: '/systemAnalysis/user' + param, + method: 'get', + data, + }); +} + +// 基础信息 +export async function dept(data) { + let param = ''; + if (data.month) { + param = '?month=' + data.month; + } + return request({ + url: '/systemAnalysis/dept' + param, + method: 'get', + data, + }); +} + +// 模块分析 +export async function module(data) { + let param = ''; + if (data.month) { + param = '?month=' + data.month; + } + return request({ + url: '/systemAnalysis/module' + param, + method: 'get', + data, + }); +} + +// 详情分析 +export async function details(data) { + let param = ''; + if (data.month) { + param = '?month=' + data.month; + } + return request({ + url: '/systemAnalysis/details' + param, + method: 'get', + data, + }); +} diff --git a/src/api/tuya.js b/src/api/tuya.js new file mode 100644 index 0000000..4fe12f2 --- /dev/null +++ b/src/api/tuya.js @@ -0,0 +1,31 @@ +import request from '@/utils/request'; +//查询tuya设备列表 +export function getList(data) { + let param = '?page=' + data.page + '&size=' + data.size; + if (data.ldDeviceSerial != '' && data.ldDeviceSerial != undefined) { + param += '&ldDeviceSerial=' + data.ldDeviceSerial; + } + if (data.tuyaDeviceId != '' && data.tuyaDeviceId != undefined) { + param += '&tuyaDeviceId=' + data.tuyaDeviceId; + } + return request({ + url: '/tuya/devices/list' + param, + method: 'get', + data, + }); +} +//注册设备 +export function register(data) { + return request({ + url: '/tuya/devices/register', + method: 'post', + data, + }); +} +//删除设备 +export function deleteDevice(tuyaDeviceId) { + return request({ + url: '/tuya/devices/delete/' + tuyaDeviceId, + method: 'post', + }); +} diff --git a/src/api/ywry.js b/src/api/ywry.js new file mode 100644 index 0000000..3fd9444 --- /dev/null +++ b/src/api/ywry.js @@ -0,0 +1,32 @@ +import request from '@/utils/request'; +//查询tuya设备列表 +export function getList(data) { + let param = + '?startIndex=' + (data.page - 1) * data.size + '&pageSize=' + data.size; + // if (data.ldDeviceSerial != '' && data.ldDeviceSerial != undefined) { + param += '&OrderString=date'; + param += '&orderType=desc'; + // } + // if (data.tuyaDeviceId != '' && data.tuyaDeviceId != undefined) { + // param += '&tuyaDeviceId=' + data.tuyaDeviceId; + // } + return request({ + url: '/k3Cloud/salStock/list' + param, + method: 'get', + data, + }); +} +//注册设备 +export function details(fid) { + return request({ + url: '/k3Cloud/salStock/details?fid=' + fid, + method: 'get', + }); +} +//删除设备 +export function productAttribute(materialCode) { + return request({ + url: '/k3Cloud/salStock/productAttribute?materialCode=' + materialCode, + method: 'get', + }); +} diff --git a/src/assets/mb.jpg b/src/assets/mb.jpg new file mode 100644 index 0000000..9cf6c38 Binary files /dev/null and b/src/assets/mb.jpg differ diff --git a/src/assets/mb.png b/src/assets/mb.png new file mode 100644 index 0000000..00e93b3 Binary files /dev/null and b/src/assets/mb.png differ diff --git a/src/common/times.js b/src/common/times.js index 5c192da..80fa302 100644 --- a/src/common/times.js +++ b/src/common/times.js @@ -65,12 +65,14 @@ export function getPastTime(month) { const d = time.getDate(); //获取当前日(1-31) // 获取指定的过去时间 const past = M - month; - const pastM = past < 0 ? past + 12 : past > 10 ? past : '0' + past; + const pastM = past <= 0 ? past + 12 : past > 10 ? past : '0' + past; + const startyy = past <= 0 ? yy - 1 : yy; + // 小于9的,在前面加0 const MM = M > 9 ? M : '0' + M; const dd = d > 9 ? d : '0' + d; // 指定的过去时间 - const PastTime = yy + '-' + pastM + '-' + dd; + const PastTime = startyy + '-' + pastM + '-' + dd; // 当前时间 const nowTime = yy + '-' + MM + '-' + dd; return [PastTime, nowTime]; diff --git a/src/config/net.config.js b/src/config/net.config.js index e30bff6..5878032 100644 --- a/src/config/net.config.js +++ b/src/config/net.config.js @@ -5,7 +5,7 @@ module.exports = { // 默认的接口地址,开发环境和生产环境走/mock-server // 当然你也可以选择自己配置成需要的接口地址,如"https://api.xxx.com" // process.env.NODE_ENV === 'development' ? '/mock-server' : '/mock-server', - baseURL:'api', + baseURL: 'http://101.133.141.167:8081', // 配后端数据的接收方式application/json;charset=UTF-8 或 application/x-www-form-urlencoded;charset=UTF-8 contentType: 'application/json;charset=UTF-8', // 最长请求时间 diff --git a/src/main.js b/src/main.js index e569f38..fec9121 100644 --- a/src/main.js +++ b/src/main.js @@ -6,11 +6,15 @@ import { setupStore } from '@/store'; import { setupRouter } from '@/router'; import '@/vab/styles/tianditu.scss'; import locale from 'element-plus/lib/locale/lang/zh-cn'; +import print from 'vue3-print-nb'; import CKEditor from '@ckeditor/ckeditor5-vue'; - const app = createApp(App); +import mixin from '@/mixin/index'; + +app.mixin(mixin); app.use(ElementPlus, { locale }); app.use(CKEditor); +app.use(print); /** * @description 正式环境默认使用mock,正式项目记得注释后再打包 */ diff --git a/src/mixin/index.js b/src/mixin/index.js new file mode 100644 index 0000000..801f4f2 --- /dev/null +++ b/src/mixin/index.js @@ -0,0 +1,20 @@ +import store from '@/store'; +// 利用mixin(混入)来封装全局函数 +// 这里封装在methods中的所有函数,都自动会添加到 +// 每个vue文件中methods中 +// 封装判断按钮权限的函数 +export default { + methods: { + // 判断是否具有按钮权限的函数 + // 判断需要有2个条件 + // 1、需要有判断的标识符(到底要判断哪个按钮显示隐藏),这个标识符就是绑定函数时传递过来的值 + // 2、按钮权限的数据集合,就是保存到vuex中的operation数组 + isBtnPerm(key) { + const button = store.state.user.button; + if (button && button.length) { + return button.some(item => item === key); + } + return false; + }, + }, +}; diff --git a/src/router/guard.js b/src/router/guard.js index 1247a4c..86f0d5d 100644 --- a/src/router/guard.js +++ b/src/router/guard.js @@ -45,6 +45,7 @@ export function setupGuard(router) { if (loginInterception) await store.dispatch('user/getUserInfo'); // settings.js loginInterception为false(关闭登录拦截时)时,创建虚拟角色 else await store.dispatch('user/setVirtualRoles'); + await store.dispatch('user/getButtonPerms'); // 根据路由模式获取路由并根据权限过滤 await store.dispatch('routes/setRoutes', authentication); next({ ...to, replace: true }); diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js index 92f8841..ce9c7c4 100644 --- a/src/store/modules/permission.js +++ b/src/store/modules/permission.js @@ -1,5 +1,6 @@ import { constantRoutes } from '@/router'; import { getAuthMenu } from '@/api/user'; +import { getButtonPerms } from '@/api/platform'; function filterAsyncRouter(asyncRouterMap) { // 遍历后台传来的路由字符串,转换为组件对象 diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 37cd5c8..1085348 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -5,6 +5,7 @@ import { resetRouter, setRouterMenus, delRouterMenus } from '@/router'; // import { isArray } from '@/utils/validate' import { title, tokenName } from '@/config'; import { ElNotification, ElMessage } from 'element-plus'; +import { getButtonPerms } from '@/api/platform'; const state = () => ({ token: getToken(), @@ -16,7 +17,7 @@ const getters = { username: state => state.username, avatar: state => state.avatar, roles: state => state.roles, - // menu: (state) => state.menu, + button: state => state.button, }; const mutations = { setToken(state, token) { @@ -32,6 +33,9 @@ const mutations = { SET_ROLES: (state, roles) => { state.roles = roles; }, + setButton(state, button) { + state.button = button; + }, // menu: (state, menu) => { // state.menu = menu // }, @@ -106,6 +110,10 @@ const actions = { return Promise.reject(); } }, + async getButtonPerms({ commit }) { + const { data } = await getButtonPerms(); + commit('setButton', data); + }, async logout({ dispatch }) { delRouterMenus(); await logout(state.token); diff --git a/src/utils/button.js b/src/utils/button.js new file mode 100644 index 0000000..d18605a --- /dev/null +++ b/src/utils/button.js @@ -0,0 +1,6 @@ +import { getButtonPerms } from '@/api/platform'; + +export default async function getButtonPermission(button) { + const { data } = await getButtonPerms(); + return !!data.indexOf(button); +} diff --git a/src/vab/components/VabAvatar/index.vue b/src/vab/components/VabAvatar/index.vue index 42e5454..5bc4359 100644 --- a/src/vab/components/VabAvatar/index.vue +++ b/src/vab/components/VabAvatar/index.vue @@ -6,7 +6,13 @@ type="danger" @click="jumpAlarm" > - + 项目大屏 diff --git a/src/vab/components/VabLogo/index.vue b/src/vab/components/VabLogo/index.vue index 95c1f4a..408ad89 100644 --- a/src/vab/components/VabLogo/index.vue +++ b/src/vab/components/VabLogo/index.vue @@ -2,16 +2,18 @@
- {{ title }} + {{ data.name }}
diff --git a/src/vab/components/VabNavBar/index.vue b/src/vab/components/VabNavBar/index.vue index a4c3784..0d0f1a8 100644 --- a/src/vab/components/VabNavBar/index.vue +++ b/src/vab/components/VabNavBar/index.vue @@ -19,7 +19,14 @@ :value="item.id" > - 首页大屏 + + 首页大屏 + @@ -87,7 +94,6 @@ export default { watch: { $route: { handler(route) { - console.log(route, ',,,,,,'); const firstMenu = route.matched[0].path || '/'; // if (this.firstMenu !== firstMenu) { // this.firstMenu = firstMenu; diff --git a/src/views/analysis/dfunction/components/elecDay.vue b/src/views/analysis/dfunction/components/elecDay.vue index 7efb210..e092d4a 100644 --- a/src/views/analysis/dfunction/components/elecDay.vue +++ b/src/views/analysis/dfunction/components/elecDay.vue @@ -26,7 +26,12 @@
重置 查询 - + 导出
@@ -50,7 +55,13 @@ > diff --git a/src/views/analysis/dfunction/components/waterDay.vue b/src/views/analysis/dfunction/components/waterDay.vue index e41c024..21e1886 100644 --- a/src/views/analysis/dfunction/components/waterDay.vue +++ b/src/views/analysis/dfunction/components/waterDay.vue @@ -26,7 +26,12 @@
重置 查询 - + 导出
@@ -50,7 +55,13 @@ > diff --git a/src/views/analysis/factoryData/index.vue b/src/views/analysis/factoryData/index.vue index af2a07d..e3f3d1c 100644 --- a/src/views/analysis/factoryData/index.vue +++ b/src/views/analysis/factoryData/index.vue @@ -30,7 +30,13 @@ - 新增 + + 新增 + @@ -355,11 +373,8 @@ export default { this.form[item.deviceId][val.name] = null; }); }); - console.log(this.form); }, save() { - console.log(this.form); - if ( !( this.form.basic.date != null && diff --git a/src/views/analysis/mfunction/components/elecMonth.vue b/src/views/analysis/mfunction/components/elecMonth.vue index ca1a320..691483a 100644 --- a/src/views/analysis/mfunction/components/elecMonth.vue +++ b/src/views/analysis/mfunction/components/elecMonth.vue @@ -26,7 +26,12 @@
重置 查询 - + 导出
@@ -50,7 +55,13 @@ > diff --git a/src/views/analysis/mfunction/components/siteMonth.vue b/src/views/analysis/mfunction/components/siteMonth.vue index 90075a4..2b83b67 100644 --- a/src/views/analysis/mfunction/components/siteMonth.vue +++ b/src/views/analysis/mfunction/components/siteMonth.vue @@ -19,7 +19,12 @@
重置 查询 - + 导出
diff --git a/src/views/analysis/mfunction/components/waterMonth.vue b/src/views/analysis/mfunction/components/waterMonth.vue index bab0d56..4842665 100644 --- a/src/views/analysis/mfunction/components/waterMonth.vue +++ b/src/views/analysis/mfunction/components/waterMonth.vue @@ -26,7 +26,12 @@
重置 查询 - + 导出
@@ -50,7 +55,13 @@ > diff --git a/src/views/analysis/site/components/siteIndex.vue b/src/views/analysis/site/components/siteIndex.vue index 4f87824..79429e4 100644 --- a/src/views/analysis/site/components/siteIndex.vue +++ b/src/views/analysis/site/components/siteIndex.vue @@ -79,7 +79,12 @@
重置 查询 - + 导出
@@ -286,6 +291,43 @@ width="200" align="center" > + + + + + + + +
+ +
+ + + + + diff --git a/src/views/department/list/index.vue b/src/views/department/list/index.vue index c9643b5..8577cce 100644 --- a/src/views/department/list/index.vue +++ b/src/views/department/list/index.vue @@ -15,7 +15,12 @@
- + 添加部门 @@ -76,8 +81,18 @@ align="center" > diff --git a/src/views/dev/alarm/components/current.vue b/src/views/dev/alarm/components/current.vue index 0ce492b..aa2e74b 100644 --- a/src/views/dev/alarm/components/current.vue +++ b/src/views/dev/alarm/components/current.vue @@ -75,9 +75,15 @@ >