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..ec419d24 --- /dev/null +++ b/src/api/firm/firmInfo.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询企业基础信息列表 +export function listFirmInfo(query) { + return request({ + url: '/system/firmInfo/list', + method: 'get', + params: query + }) +} + +// 查询企业基础信息详细 +export function getFirmInfo(id) { + return request({ + url: '/system/firmInfo/' + id, + method: 'get' + }) +} + +// 新增企业基础信息 +export function addFirmInfo(data) { + return request({ + url: '/system/firmInfo', + method: 'post', + data: data + }) +} + +// 修改企业基础信息 +export function updateFirmInfo(data) { + return request({ + url: '/system/firmInfo', + method: 'put', + data: data + }) +} + +// 删除企业基础信息 +export function delFirmInfo(id) { + return request({ + url: '/system/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/api/system/user.js b/src/api/system/user.js index 89d3972d..8bd36992 100644 --- a/src/api/system/user.js +++ b/src/api/system/user.js @@ -21,7 +21,7 @@ export function getUser(userId) { // 新增用户 export function addUser(data) { return request({ - url: '/system/user', + url: '/saas/user', method: 'post', data: data }) 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/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 @@