From 7bddb24d0852bad897b0cc94b21c15bb569423c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=91=E5=B9=B4=E6=A2=A6=E4=B8=8E=E7=A0=96?= <2847127106@qq.com> Date: Sun, 22 Sep 2024 09:43:39 +0800 Subject: [PATCH 1/5] =?UTF-8?q?saasUI=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 + package.json | 5 +- src/api/firm/firmInfo.js | 44 ++ src/api/login.js | 5 +- src/api/monitor/job.js | 71 +++ src/api/monitor/jobLog.js | 26 + src/main.js | 35 ++ src/permission.js | 10 +- src/router/index.js | 18 + src/store/modules/user.js | 35 +- src/utils/auth.js | 14 + src/utils/request.js | 8 +- src/views/firm/firmInfo/index.vue | 310 +++++++++++ src/views/index.vue | 884 ++++++++++++++++++++++++++++++ src/views/login.vue | 54 +- src/views/monitor/job/index.vue | 527 ++++++++++++++++++ src/views/monitor/job/log.vue | 302 ++++++++++ src/views/platform_login.vue | 229 ++++++++ src/views/system/user/index.vue | 14 +- vue.config.js | 8 + 20 files changed, 2572 insertions(+), 30 deletions(-) create mode 100644 src/api/firm/firmInfo.js create mode 100644 src/api/monitor/job.js create mode 100644 src/api/monitor/jobLog.js create mode 100644 src/views/firm/firmInfo/index.vue create mode 100644 src/views/monitor/job/index.vue create mode 100644 src/views/monitor/job/log.vue create mode 100644 src/views/platform_login.vue diff --git a/README.md b/README.md index cf2bc13b..5b20ccba 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,9 @@ npm install # 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 npm install --registry=https://registry.npmmirror.com +# 更新启动配置 +set NODE_OPTIONS=--openssl-legacy-provider + # 启动服务 npm run dev ``` diff --git a/package.json b/package.json index 1aa9f709..567e3a18 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "clipboard": "2.0.8", "core-js": "3.25.3", "echarts": "5.4.0", - "element-ui": "2.15.14", + "element-ui": "2.15.13", "file-saver": "2.0.5", "fuse.js": "6.4.3", "highlight.js": "9.18.5", @@ -51,6 +51,7 @@ "nprogress": "0.2.0", "quill": "1.3.7", "screenfull": "5.0.2", + "skywalking-client-js": "^0.11.0", "sortablejs": "1.10.2", "vue": "2.6.12", "vue-count-to": "1.0.13", @@ -67,7 +68,7 @@ "babel-eslint": "10.1.0", "babel-plugin-dynamic-import-node": "2.3.3", "chalk": "4.1.0", - "compression-webpack-plugin": "6.1.2", + "compression-webpack-plugin": "5.0.2", "connect": "3.6.6", "eslint": "7.15.0", "eslint-plugin-vue": "7.2.0", diff --git a/src/api/firm/firmInfo.js b/src/api/firm/firmInfo.js new file mode 100644 index 00000000..d6f38a4c --- /dev/null +++ b/src/api/firm/firmInfo.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询企业基础信息列表 +export function listFirmInfo(query) { + return request({ + url: '/firm/firmInfo/list', + method: 'get', + params: query + }) +} + +// 查询企业基础信息详细 +export function getFirmInfo(id) { + return request({ + url: '/firm/firmInfo/' + id, + method: 'get' + }) +} + +// 新增企业基础信息 +export function addFirmInfo(data) { + return request({ + url: '/firm/firmInfo', + method: 'post', + data: data + }) +} + +// 修改企业基础信息 +export function updateFirmInfo(data) { + return request({ + url: '/firm/firmInfo', + method: 'put', + data: data + }) +} + +// 删除企业基础信息 +export function delFirmInfo(id) { + return request({ + url: '/firm/firmInfo/' + id, + method: 'delete' + }) +} diff --git a/src/api/login.js b/src/api/login.js index 3691abe3..c06c6bdd 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -1,7 +1,7 @@ import request from '@/utils/request' // 登录方法 -export function login(username, password, code, uuid) { +export function login(firmCode, username, password, code, uuid) { return request({ url: '/auth/login', headers: { @@ -9,10 +9,11 @@ export function login(username, password, code, uuid) { repeatSubmit: false }, method: 'post', - data: {username, password, code, uuid} + data: {firmCode, username, password, code, uuid} }) } + // 注册方法 export function register(data) { return request({ diff --git a/src/api/monitor/job.js b/src/api/monitor/job.js new file mode 100644 index 00000000..d373cb1d --- /dev/null +++ b/src/api/monitor/job.js @@ -0,0 +1,71 @@ +import request from '@/utils/request' + +// 查询定时任务调度列表 +export function listJob(query) { + return request({ + url: '/schedule/job/list', + method: 'get', + params: query + }) +} + +// 查询定时任务调度详细 +export function getJob(jobId) { + return request({ + url: '/schedule/job/' + jobId, + method: 'get' + }) +} + +// 新增定时任务调度 +export function addJob(data) { + return request({ + url: '/schedule/job', + method: 'post', + data: data + }) +} + +// 修改定时任务调度 +export function updateJob(data) { + return request({ + url: '/schedule/job', + method: 'put', + data: data + }) +} + +// 删除定时任务调度 +export function delJob(jobId) { + return request({ + url: '/schedule/job/' + jobId, + method: 'delete' + }) +} + +// 任务状态修改 +export function changeJobStatus(jobId, status) { + const data = { + jobId, + status + } + return request({ + url: '/schedule/job/changeStatus', + method: 'put', + data: data + }) +} + + +// 定时任务立即执行一次 +export function runJob(jobId, jobGroup) { + const data = { + jobId, + jobGroup + } + return request({ + url: '/schedule/job/run', + method: 'put', + data: data + }) +} diff --git a/src/api/monitor/jobLog.js b/src/api/monitor/jobLog.js new file mode 100644 index 00000000..eea2666e --- /dev/null +++ b/src/api/monitor/jobLog.js @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// 查询调度日志列表 +export function listJobLog(query) { + return request({ + url: '/schedule/job/log/list', + method: 'get', + params: query + }) +} + +// 删除调度日志 +export function delJobLog(jobLogId) { + return request({ + url: '/schedule/job/log/' + jobLogId, + method: 'delete' + }) +} + +// 清空调度日志 +export function cleanJobLog() { + return request({ + url: '/schedule/job/log/clean', + method: 'delete' + }) +} diff --git a/src/main.js b/src/main.js index 546f1251..0f2d185c 100644 --- a/src/main.js +++ b/src/main.js @@ -63,6 +63,41 @@ Vue.use(plugins) Vue.use(VueMeta) DictData.install() +//skywalking监控系统 +import ClientMonitor from 'skywalking-client-js'; + +//注册skywalking +ClientMonitor.register({ + service: 'muyu::cloud-ui',//应用名称 + serviceVersion:'2.0.1',//应用版本号 + traceSDKInternal:true,//追踪sdk + pagePath: location.href,//当前路由地址 + useFmp: true, + vue:Vue,//vue实例 +}); +// Vue 报错上报到skywalking。 +Vue.config.errorHandler = (error) => { + console.error(error); + reportFrameErrors(error); +} +//监听ajax报错 +window.addEventListener('error', error=>{ + console.log("error--->",error) + reportFrameErrors(error); +}, true); + +//上报错误信息方法 +function reportFrameErrors(error){ + ClientMonitor.reportFrameErrors({ + service: 'muyu::cloud-ui',//应用名称 + serviceVersion:'2.0.1',//应用版本号 + pagePath: location.href, + vue:Vue, + }, error); +} + + + /** * If you don't want to use mock-server * you want to use MockJs for mock api diff --git a/src/permission.js b/src/permission.js index 60342398..93ca18fe 100644 --- a/src/permission.js +++ b/src/permission.js @@ -5,12 +5,20 @@ import NProgress from 'nprogress' import 'nprogress/nprogress.css' import {getToken} from '@/utils/auth' import {isRelogin} from '@/utils/request' +import Vue from 'vue' NProgress.configure({showSpinner: false}) -const whiteList = ['/login', '/register'] +const whiteList = ['/login','/platform/login', '/register'] router.beforeEach((to, from, next) => { + //路由上报到skywalking + //因为有些参数已经在ClientMonitor.register中注册过了所以不用填加了。 + ClientMonitor.setPerformance({ + pagePath: location.href,//当前路由地址。 + useFmp: true, + vue:Vue, + }); NProgress.start() if (getToken()) { to.meta.title && store.dispatch('settings/setTitle', to.meta.title) diff --git a/src/router/index.js b/src/router/index.js index 186e20b7..873b448b 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -44,6 +44,10 @@ export const constantRoutes = [ path: '/login', component: () => import('@/views/login'), hidden: true + },{ + path: '/platform/login', + component: () => import('@/views/login'), + hidden: true }, { path: '/register', @@ -133,6 +137,20 @@ export const dynamicRoutes = [ } ] }, + { + path: '/monitor/job-log', + component: Layout, + hidden: true, + permissions: ['monitor:job:list'], + children: [ + { + path: 'index/:jobId(\\d+)', + component: () => import('@/views/monitor/job/log'), + name: 'JobLog', + meta: {title: '调度日志', activeMenu: '/monitor/job'} + } + ] + }, { path: '/tool/gen-edit', component: Layout, diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 6c109a6e..52aedf5c 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -1,9 +1,10 @@ -import {getInfo, login, logout, refreshToken} from '@/api/login' -import {getToken, removeToken, setExpiresIn, setToken} from '@/utils/auth' +import {getInfo, login, logout, firmLogin, refreshToken} from '@/api/login' +import {getEntCode, getToken, removeEntCode, removeToken, setEntCode, setExpiresIn, setToken} from '@/utils/auth' const user = { state: { token: getToken(), + ent_code: getEntCode(), id: '', name: '', avatar: '', @@ -15,6 +16,9 @@ const user = { SET_TOKEN: (state, token) => { state.token = token }, + SET_ENT_CODE: (state, ent_code) => { + state.ent_code = ent_code + }, SET_EXPIRES_IN: (state, time) => { state.expires_in = time }, @@ -55,6 +59,29 @@ const user = { }) }) }, + // 企业登录 + firmLogin({commit}, userInfo) { + const firmCode = userInfo.firmCode.trim() + const firmUser = userInfo.firmUser.trim() + const firmPassword = userInfo.firmPassword.trim() + const rememberMe = userInfo.rememberMe + const code = userInfo.code + const uuid = userInfo.uuid + return new Promise((resolve, reject) => { + login(firmCode,firmUser,firmPassword, rememberMe, code, uuid).then(res => { + let data = res.data + setToken(data.access_token) + setEntCode(data.ent_code) + commit('SET_TOKEN', data.access_token) + commit('SET_ENT_CODE', data.ent_code) + commit('SET_EXPIRES_IN', data.expires_in) + setExpiresIn(data.expires_in) + resolve() + }).catch(error => { + reject(error) + }) + }) + }, // 获取用户信息 GetInfo({commit, state}) { @@ -96,9 +123,11 @@ const user = { return new Promise((resolve, reject) => { logout(state.token).then(() => { commit('SET_TOKEN', '') + commit('SET_ENT_CODE', '') commit('SET_ROLES', []) commit('SET_PERMISSIONS', []) removeToken() + removeEntCode() resolve() }).catch(error => { reject(error) @@ -110,7 +139,9 @@ const user = { FedLogOut({commit}) { return new Promise(resolve => { commit('SET_TOKEN', '') + commit('SET_ENT_CODE', '') removeToken() + removeEntCode() resolve() }) } diff --git a/src/utils/auth.js b/src/utils/auth.js index a673d227..837458f9 100644 --- a/src/utils/auth.js +++ b/src/utils/auth.js @@ -2,6 +2,8 @@ import Cookies from 'js-cookie' const TokenKey = 'Admin-Token' +const EntCode = 'ent-code' + const ExpiresInKey = 'Admin-Expires-In' export function getToken() { @@ -16,6 +18,18 @@ export function removeToken() { return Cookies.remove(TokenKey) } +export function getEntCode() { + return Cookies.get(EntCode) +} + +export function setEntCode(entCode) { + return Cookies.set(EntCode, entCode) +} + +export function removeEntCode() { + return Cookies.remove(EntCode) +} + export function getExpiresIn() { return Cookies.get(ExpiresInKey) || -1 } diff --git a/src/utils/request.js b/src/utils/request.js index 47d1bcb4..3ea65ed8 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -1,7 +1,7 @@ import axios from 'axios' import {Loading, Message, MessageBox, Notification} from 'element-ui' import store from '@/store' -import {getToken} from '@/utils/auth' +import {getEntCode, getToken} from '@/utils/auth' import errorCode from '@/utils/errorCode' import {blobValidate, tansParams} from "@/utils/muyu"; import cache from '@/plugins/cache' @@ -17,7 +17,7 @@ const service = axios.create({ // axios中请求配置有baseURL选项,表示请求URL公共部分 baseURL: process.env.VUE_APP_BASE_API, // 超时 - timeout: 10000 + timeout: 20000 }) // request拦截器 @@ -29,6 +29,9 @@ service.interceptors.request.use(config => { if (getToken() && !isToken) { config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 } + if (getEntCode() && !isToken) { + config.headers['ent-code'] = getEntCode() // 让每个请求携带自定义token 请根据实际情况自行修改 + } // get请求映射params参数 if (config.method === 'get' && config.params) { let url = config.url + '?' + tansParams(config.params); @@ -73,7 +76,6 @@ service.interceptors.request.use(config => { // 响应拦截器 service.interceptors.response.use(res => { - debugger // 未设置状态码则默认成功状态 const code = res.data.code || 200; // 获取错误信息 diff --git a/src/views/firm/firmInfo/index.vue b/src/views/firm/firmInfo/index.vue new file mode 100644 index 00000000..8e8f9794 --- /dev/null +++ b/src/views/firm/firmInfo/index.vue @@ -0,0 +1,310 @@ + + + diff --git a/src/views/index.vue b/src/views/index.vue index 9952d64a..93edae18 100644 --- a/src/views/index.vue +++ b/src/views/index.vue @@ -1,6 +1,885 @@ @@ -9,9 +888,14 @@ export default { name: "Index", data() { return { + // 版本号 + version: "3.6.3", }; }, methods: { + goTarget(href) { + window.open(href, "_blank"); + }, }, }; diff --git a/src/views/login.vue b/src/views/login.vue index bdd86d9d..66ef097e 100644 --- a/src/views/login.vue +++ b/src/views/login.vue @@ -2,9 +2,19 @@

若依后台管理系统

- + + + + + + - + { + this.$store.dispatch("firmLogin", this.loginForm).then(() => { this.$router.push({path: this.redirect || "/"}).catch(() => { }); }).catch(() => { diff --git a/src/views/monitor/job/index.vue b/src/views/monitor/job/index.vue new file mode 100644 index 00000000..d20b070f --- /dev/null +++ b/src/views/monitor/job/index.vue @@ -0,0 +1,527 @@ + + + diff --git a/src/views/monitor/job/log.vue b/src/views/monitor/job/log.vue new file mode 100644 index 00000000..e7a07174 --- /dev/null +++ b/src/views/monitor/job/log.vue @@ -0,0 +1,302 @@ + + + diff --git a/src/views/platform_login.vue b/src/views/platform_login.vue new file mode 100644 index 00000000..53eded56 --- /dev/null +++ b/src/views/platform_login.vue @@ -0,0 +1,229 @@ + + + + + diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue index a5014a88..f150c9b2 100644 --- a/src/views/system/user/index.vue +++ b/src/views/system/user/index.vue @@ -374,6 +374,7 @@ import { import {getToken} from "@/utils/auth"; import Treeselect from "@riophae/vue-treeselect"; import "@riophae/vue-treeselect/dist/vue-treeselect.css"; +import {listDept} from "@/api/system/dept"; export default { name: "User", @@ -507,8 +508,17 @@ export default { }, /** 查询部门下拉树结构 */ getDeptTree() { - deptTreeSelect().then(response => { - this.deptOptions = response.data; + listDept(this.queryParams).then(response => { + const deptList = response.data.map(dept => { + return { + id: dept.deptId, + label: dept.deptName, + parentId: dept.parentId, + children: null + } + }) + this.deptOptions = this.handleTree(deptList) + console.log(this.deptOptions) }); }, // 筛选节点 diff --git a/vue.config.js b/vue.config.js index dd8b15dc..e4406685 100644 --- a/vue.config.js +++ b/vue.config.js @@ -40,6 +40,14 @@ module.exports = { pathRewrite: { ['^' + process.env.VUE_APP_BASE_API]: '' } + }, + '/browser': { + target:'http://192.168.138.130:12800',//这里是路由和报错报告的代理 + changeOrigin: true + }, + '/v3':{ + target:'http://192.168.138.130:12800', + changeOrigin: true//这里是追踪报告的代理 } }, disableHostCheck: true From 57ce2e523ca9ef0931683d2b4ce20bfcf64ec613 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=91=E5=B9=B4=E6=A2=A6=E4=B8=8E=E7=A0=96?= <2847127106@qq.com> Date: Sun, 22 Sep 2024 23:16:47 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=A7=9F=E6=88=B7?= =?UTF-8?q?=E7=9A=84=E9=83=A8=E9=97=A8=E7=94=A8=E6=88=B7=E6=9D=83=E9=99=90?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/system/role/index.vue | 3 +++ src/views/system/user/authRole.vue | 3 +++ src/views/system/user/index.vue | 28 +++++++++++++++++++++++++--- vue.config.js | 16 ++++++++-------- 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue index a5e5ea6b..03e5ef13 100644 --- a/src/views/system/role/index.vue +++ b/src/views/system/role/index.vue @@ -105,6 +105,7 @@ + @@ -277,6 +278,7 @@ import { updateRole } from "@/api/system/role"; import {roleMenuTreeselect, treeselect as menuTreeselect} from "@/api/system/menu"; +import {getEntCode} from "@/utils/auth"; export default { name: "Role", @@ -368,6 +370,7 @@ export default { this.getList(); }, methods: { + getEntCode, /** 查询角色列表 */ getList() { this.loading = true; diff --git a/src/views/system/user/authRole.vue b/src/views/system/user/authRole.vue index e849c055..3d2f91c2 100644 --- a/src/views/system/user/authRole.vue +++ b/src/views/system/user/authRole.vue @@ -26,6 +26,7 @@ + @@ -48,6 +49,7 @@