diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..9ed6d03 --- /dev/null +++ b/.env.example @@ -0,0 +1,8 @@ +VUE_APP_CROSS_DOMAIN=false +VUE_APP_API_URL=http://127.0.0.1/pearProjectApi/index.php +VUE_APP_WS_URI=ws://127.0.0.1:2345 +VUE_APP_HOME_PAGE=/home +VUE_APP_NAME=PearProject +VUE_APP_BUILD_PATH=./ +VUE_APP_DEV_HOST=127.0.0.1 +VUE_APP_DEV_PORT=8045 diff --git a/.gitignore b/.gitignore index f044205..901554e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,8 @@ node_modules /dist package-lock.json # local env files -.env.local -.env.*.local +.env +.env.production # Log files npm-debug.log* diff --git a/README.md b/README.md index ffeb9b8..cd538b4 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,15 @@ 有不明白的地方的可以加群:275264059,或者联系我,QQ:545522390 ### 演示地址 -> [https://beta.vilson.xyz](https://beta.vilson.xyz) +> [https://home.vilson.xyz](https://home.vilson.xyz) ### 登录 ### 账号:123456 密码:123456 + +### 友情链接 ### + +**JAVA版本:https://gitee.com/wulon/mk-teamwork-server** + ### 界面截图 ### ![1](https://static.vilson.xyz/overview/1.png) diff --git a/package.json b/package.json index 83f7020..2dcd445 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "lint": "vue-cli-service lint" }, "dependencies": { - "ant-design-vue": "latest", - "axios": "^0.19.0", + "ant-design-vue": "^1.7.8", + "axios": "^0.21.1", "core-js": "^2.6.9", "dingtalk-jsapi": "^2.7.6", "echarts": "^4.2.0-rc.1", diff --git a/public/favicon.ico b/public/favicon.ico index 8c33ea1..1f81ad6 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/src/App.vue b/src/App.vue index fe753d2..5da1e30 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,10 +1,10 @@ diff --git a/src/api/organization.js b/src/api/organization.js index d0967ba..745a6e0 100644 --- a/src/api/organization.js +++ b/src/api/organization.js @@ -1,7 +1,17 @@ import $http from '@/assets/js/http' +import store from '@/store'; export function list(data) { - return $http.post('project/organization',data); + return $http.post('project/organization', data); +} + +export function _getOrgList(data) { + return $http.post('project/organization/_getOrgList', data).then(res => { + if (res.data) { + store.dispatch('setOrganizationList', res.data); + } + return Promise.resolve(res); + }); } export function doData(data) { @@ -15,3 +25,6 @@ export function doData(data) { export function del(organizationCode) { return $http.post('project/organization/delete', {organizationCode: organizationCode}); } +export function _quitOrganization(data) { + return $http.post('project/organization/_quitOrganization', data); +} diff --git a/src/api/project.js b/src/api/project.js index b0cbc79..78c89aa 100644 --- a/src/api/project.js +++ b/src/api/project.js @@ -36,6 +36,12 @@ export function del(code) { export function read(code) { return $http.post('project/project/read', {projectCode: code}); } +export function analysis(data) { + return $http.post('project/project/analysis', data); +} export function _projectStats(data) { return $http.post('project/project/_projectStats', data); } +export function _getProjectReport(data) { + return $http.post('project/project/_getProjectReport', data); +} diff --git a/src/api/projectEvents.js b/src/api/projectEvents.js new file mode 100644 index 0000000..eee0c66 --- /dev/null +++ b/src/api/projectEvents.js @@ -0,0 +1,32 @@ +import $http from '@/assets/js/http' + +export function list(data) { + return $http.post('project/events', data); +} +export function myList(data) { + return $http.post('project/events/myList', data); +} +export function getEventsLog(data) { + return $http.post('project/events/_getEventsLog', data); +} +export function read(data) { + return $http.post('project/events/read', data); +} +export function confirmJoin(data) { + return $http.post('project/events/confirmJoin', data); +} +export function getEventsListByCalendar(data) { + return $http.post('project/events/getEventsListByCalendar', data); +} + +export function doData(data) { + let url = 'project/events/save'; + if (data.code) { + url = 'project/events/edit'; + } + return $http.post(url, data); +} + +export function del(data) { + return $http.post('project/events/delete', data); +} diff --git a/src/api/projectInfo.js b/src/api/projectInfo.js new file mode 100644 index 0000000..9fdb87a --- /dev/null +++ b/src/api/projectInfo.js @@ -0,0 +1,17 @@ +import $http from '@/assets/js/http' + +export function list(data) { + return $http.post('project/project_info', data); +} + +export function doData(data) { + let url = 'project/project_info/save'; + if (data.infoCode) { + url = 'project/project_info/edit'; + } + return $http.post(url, data); +} + +export function del(data) { + return $http.post('project/project_info/delete', data); +} diff --git a/src/api/projectMember.js b/src/api/projectMember.js index 743483f..7f2c17e 100644 --- a/src/api/projectMember.js +++ b/src/api/projectMember.js @@ -16,3 +16,6 @@ export function removeMember(memberCode, code) { export function list(data) { return $http.post('project/project_member/index', data); } +export function _listForInvite(data) { + return $http.post('project/project_member/_listForInvite', data); +} diff --git a/src/api/taskStages.js b/src/api/taskStages.js index 05b4821..dc76ff7 100644 --- a/src/api/taskStages.js +++ b/src/api/taskStages.js @@ -3,6 +3,9 @@ import $http from '@/assets/js/http' export function list(data) { return $http.post('project/task_stages', data); } +export function taskTree(data) { + return $http.post('project/task_stages/taskTree', data); +} export function _getAll(data) { return $http.post('project/task_stages/_getAll', data); } diff --git a/src/api/user.js b/src/api/user.js index 075ccf2..cfc23d6 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -1,4 +1,7 @@ import $http from '@/assets/js/http' +import router from '@/router'; +import store from '@/store'; +import {checkResponse, createRoute} from "../assets/js/utils"; export async function Login(data) { return $http.post('project/login', data); @@ -20,8 +23,44 @@ export function _resetPasswordByMail(data) { return $http.post('project/login/_resetPasswordByMail', data); } -export function changeCurrentOrganization(organizationCode) { - return $http.post('project/index/changeCurrentOrganization', {organizationCode: organizationCode}); +export function changeCurrentOrganization(organization) { + const organizationCode = organization.code; + store.dispatch('setCurrentOrganization', organization); + return $http.post('project/index/changeCurrentOrganization', {organizationCode: organizationCode}).then(res=>{ + if (checkResponse(res)) { + store.dispatch('SET_MENU', res.data.menuList); + store.dispatch('SET_USER', res.data.member); + store.dispatch('windowLoading', true); + setTimeout(function () { + const menu = res.data.menuList; + if (menu) { + let routes = router.options.routes; + menu.forEach(function (v) { + routes[0].children.push(createRoute(v)); + if (v.children) { + v.children.forEach(function (v2) { + routes[0].children.push(createRoute(v2)); + if (v2.children) { + v2.children.forEach(function (v3) { + routes[0].children.push(createRoute(v3)); + }); + } + + }); + } + }); + router.addRoutes(routes); + store.dispatch('windowLoading', false); + // router.replace('/'); + } + }, 500); + return Promise.resolve(res); + } + }); +} + +export function _allList(data) { + return $http.post('project/account/_allList', data); } export function list(data) { @@ -60,6 +99,9 @@ export function read(code) { return $http.post('project/account/read', {code: code}); } +export function syncDetail(data) { + return $http.post('project/account/_syncDetail', data); +} export function editAccount(data) { return $http.post('project/account/edit', data); } diff --git a/src/assets/css/components/base.less b/src/assets/css/components/base.less index 08ff6e3..fe78c2d 100644 --- a/src/assets/css/components/base.less +++ b/src/assets/css/components/base.less @@ -1,5 +1,6 @@ body { overflow: hidden; + font-family: Dosis,Open Sans,pingfang SC,helvetica neue,arial,hiragino sans gb,microsoft yahei ui,microsoft yahei,simsun,sans-serif; } .ant-layout{ background: #f5f5f5; @@ -83,6 +84,32 @@ body { font-size: 14px; } +//Alert + +.alert-white { + background: #fff; + border: 1px solid #dedede; + border-left: solid 3px #338fe5; + + .ant-alert-message { + margin: 5px 5px 5px 5px; + } +} + +.alert-error { + background: #fff; + border: 1px solid #f5222d; + border-left: solid 3px #f5222d; + + .ant-alert-message { + margin: 5px 5px 5px 5px; + } + + &.ant-alert-with-description { + padding: 5px 5px 5px 15px; + } +} + //Button .action-btn { margin-top: 12px; diff --git a/src/assets/css/components/layout.less b/src/assets/css/components/layout.less index 5518660..c61be7f 100644 --- a/src/assets/css/components/layout.less +++ b/src/assets/css/components/layout.less @@ -29,9 +29,9 @@ color: #FFF; cursor: pointer; .logo-img { - width: 23px; + width: 30px; position: absolute; - left: 45px; + left: 35px; top: 15px; transition: all .2s; } diff --git a/src/assets/css/components/task.less b/src/assets/css/components/task.less index fd6777b..1b2f4cd 100644 --- a/src/assets/css/components/task.less +++ b/src/assets/css/components/task.less @@ -168,6 +168,7 @@ overflow: auto; overflow-x: visible; -webkit-overflow-scrolling: touch; + padding-bottom: 40px; } .scrum-stage .scrum-stage-content > ul { @@ -1131,7 +1132,7 @@ li.activity.creator i { } .project-nav-footer .footer-item { - font-size: 15px; + font-size: 14px; position: relative; padding: 15px 10px; margin: 0 5px; @@ -1542,7 +1543,10 @@ li.activity.creator i { } .scrum-stage-wrap.ui-sortable { - padding-bottom: 35px; + padding-bottom: 40px; + } + .scrum-stage-wrap.ui-sortable.hidden-creator-bottom { + padding-bottom: 80px; } .scrum-stage { diff --git a/src/assets/image/common/logo.png b/src/assets/image/common/logo.png index 257b35f..1d81f28 100644 Binary files a/src/assets/image/common/logo.png and b/src/assets/image/common/logo.png differ diff --git a/src/assets/js/http.js b/src/assets/js/http.js index 4c926dc..5e58b88 100644 --- a/src/assets/js/http.js +++ b/src/assets/js/http.js @@ -7,7 +7,11 @@ import $router from '../../router/index'; import {notice} from './notice'; import config from "../../config/config"; -const HOME_PAGE = config.HOME_PAGE; +let HOME_PAGE = config.HOME_PAGE; +const currentOrganization = getStore('currentOrganization', true); +if (currentOrganization) { + HOME_PAGE = HOME_PAGE + '/' + currentOrganization.code; +} const crossDomain = config.crossDomain; let axiosConfig = {}; if (crossDomain) { diff --git a/src/assets/js/utils.js b/src/assets/js/utils.js index ec3cf0b..81c0edf 100644 --- a/src/assets/js/utils.js +++ b/src/assets/js/utils.js @@ -1,10 +1,6 @@ import {notice} from './notice'; -import config from '../../config/config' import {getStore} from "./storage"; -const PROD_URL = config.PROD_URL; -const crossDomain = config.crossDomain; - /** * 判断客户端返回状态 * @param res @@ -72,15 +68,19 @@ export const showWarConfirm = (options = {}, callback = function () { * 获取完整的api请求地址 */ export const getFullUrl = (api) => { - return PROD_URL + '/' + api + return process.env.VUE_APP_API_URL + '/' + api }; export const getApiUrl = (api) => { - if (crossDomain) { - return PROD_URL + '/' + api; //开启跨域直接返回 + if ( + process.env.VUE_APP_CROSS_DOMAIN === 'true' + || process.env.VUE_APP_CROSS_DOMAIN === true + || process.env.VUE_APP_CROSS_DOMAIN === '' + || process.env.VUE_APP_CROSS_DOMAIN === null) { + return process.env.VUE_APP_API_URL + '/' + api; //开启跨域直接返回 } if (process.env.NODE_ENV === 'production') { - return PROD_URL + '/' + api; + return process.env.VUE_APP_API_URL + '/' + api; } else { return '/api/' + api; } @@ -94,7 +94,7 @@ export const getApiUrl = (api) => { export const getUploadUrl = (api) => { let baseUrl = ''; // if (process.env.NODE_ENV === 'production') { - // baseUrl = PROD_URL + // baseUrl = process.env.VUE_APP_API_URL // } return baseUrl + getApiUrl(api) }; diff --git a/src/components/editor.vue b/src/components/editor.vue index aa2e2a4..2de0c07 100644 --- a/src/components/editor.vue +++ b/src/components/editor.vue @@ -1,181 +1,181 @@ diff --git a/src/components/error/errorPage.vue b/src/components/error/errorPage.vue index 9cfaaef..dbb3cac 100644 --- a/src/components/error/errorPage.vue +++ b/src/components/error/errorPage.vue @@ -20,6 +20,8 @@ + + diff --git a/src/components/project/events.vue b/src/components/project/events.vue new file mode 100644 index 0000000..f5f381b --- /dev/null +++ b/src/components/project/events.vue @@ -0,0 +1,364 @@ + + diff --git a/src/components/project/inviteProjectMember.vue b/src/components/project/inviteProjectMember.vue index 9ddee45..e6c7097 100644 --- a/src/components/project/inviteProjectMember.vue +++ b/src/components/project/inviteProjectMember.vue @@ -2,7 +2,7 @@
账号邀请 通过链接邀请
-
+
-
- - + +
+ + 已加入 - - {{item.name}} - - - - -
+ + {{item.name}} + + +
+
+
+ import _ from 'lodash' import moment from 'moment'; - import {inviteMember, searchInviteMember} from "../../api/projectMember"; + import {inviteMember, searchInviteMember, _listForInvite} from "../../api/projectMember"; import {checkResponse} from "../../assets/js/utils"; import {createInviteLink} from "../../api/common/common"; @@ -119,7 +121,16 @@ this.search(); } }, + created() { + this.getMembers(); + }, methods: { + getMembers() { + let app = this; + _listForInvite({projectCode: app.projectCode}).then(res=>{ + app.list = res.data; + }); + }, invite(item) { inviteMember(item.memberCode, this.projectCode).then((res) => { const success = checkResponse(res); @@ -148,6 +159,7 @@ this.list = []; } if (this.keyword.length <= 1) { + this.getMembers(); return false; } this.searching = true; @@ -169,6 +181,7 @@ .invite-project-member { .ant-modal-body { padding-top: 0; + padding-right: 12px; padding-bottom: 24px; min-height: 40vh; } @@ -181,7 +194,8 @@ } .member-list { - padding-top: 12px; + padding-right: 12px; + max-height: 400px; } } diff --git a/src/components/project/projectConfig.vue b/src/components/project/projectConfig.vue index e097c03..55785bc 100644 --- a/src/components/project/projectConfig.vue +++ b/src/components/project/projectConfig.vue @@ -471,6 +471,7 @@ this.project.open_prefix = !!res.data.open_prefix; this.project.open_begin_time = !!res.data.open_begin_time; this.project.open_task_private = !!res.data.open_task_private; + this.project.auto_update_schedule = !!res.data.auto_update_schedule; }); }, getTaskWorkflowList() { @@ -517,7 +518,8 @@ if (!checkResponse(res)) { return; } - app.$router.replace('/project/archive'); + app.$emit('complete'); + // app.$router.replace('/project/list/archive'); }); return Promise.resolve(); } @@ -534,7 +536,8 @@ if (!checkResponse(res)) { return; } - app.$router.replace('/project/list/my'); + app.$emit('complete'); + // app.$router.replace('/project/list/my'); }); return Promise.resolve(); } @@ -555,7 +558,8 @@ if (!checkResponse(res)) { return; } - app.$router.replace('/project/recycle'); + app.$emit('complete'); + // app.$router.replace('/project/recycle'); }); return Promise.resolve(); } @@ -572,7 +576,8 @@ if (!checkResponse(res)) { return; } - app.$router.replace('/project/list/my'); + app.$emit('complete'); + // app.$router.replace('/project/list/my'); }); return Promise.resolve(); } @@ -592,6 +597,7 @@ if (!checkResponse(res)) { return; } + app.$emit('complete'); app.$router.replace('/project/list/my'); }); diff --git a/src/components/project/projectSelect.vue b/src/components/project/projectSelect.vue index c03f8bf..952896d 100644 --- a/src/components/project/projectSelect.vue +++ b/src/components/project/projectSelect.vue @@ -4,7 +4,7 @@ v-model="visibleMenu" class="action-item" placement="bottomCenter"> - + {{currentProject.name}} @@ -48,7 +48,7 @@ + + diff --git a/src/components/project/taskTable.vue b/src/components/project/taskTable.vue new file mode 100644 index 0000000..92cae08 --- /dev/null +++ b/src/components/project/taskTable.vue @@ -0,0 +1,395 @@ + + + + + + + diff --git a/src/components/tools/VUploader.vue b/src/components/tools/VUploader.vue index 40cdf19..02facad 100644 --- a/src/components/tools/VUploader.vue +++ b/src/components/tools/VUploader.vue @@ -13,6 +13,7 @@ { + if (v.size > singleMaxSize) { + ignored = true; + fileName = v.file.name; + return false; + } + }); + files.ignored = ignored; + if (ignored) { + this.$info({ + title: '文件超过最大限制', + content: `上传文件「${fileName}」过大,请选择${this.singleMaxSize}MB以内的文件`, + }); + } + }, filesSubmitted(files) { //添加上传文件 // this.$refs.uploader.uploader.opts.query = this.tempData; this.showUploader = true; diff --git a/src/config/config.js b/src/config/config.js index 0fcb66b..c9bbba9 100644 --- a/src/config/config.js +++ b/src/config/config.js @@ -1,6 +1,6 @@ export default { - crossDomain: false, //是否开启跨域支持 - PROD_URL: 'https://beta.vilson.xyz/index.php', //生产环境接口地址 - WS_URI: 'ws://192.168.31.68:2345',//wss://beta.vilson.xyz:2345 //WebSocket地址 - HOME_PAGE: '/home',//主页路由 + crossDomain: process.env.VUE_APP_CROSS_DOMAIN, //是否开启跨域支持 + PROD_URL: process.env.VUE_APP_API_URL, //生产环境接口地址 + WS_URI: process.env.VUE_APP_WS_URI,//wss://beta.vilson.xyz:2345 //WebSocket地址 + HOME_PAGE: process.env.VUE_APP_HOME_PAGE,//主页路由 }; diff --git a/src/config/version.js b/src/config/version.js index ae09240..e56ab76 100644 --- a/src/config/version.js +++ b/src/config/version.js @@ -1,3 +1,3 @@ export default { - VERSION: '2.8.6', + VERSION: '2.8.17', }; diff --git a/src/const/common.js b/src/const/common.js index 539c447..2ff3953 100644 --- a/src/const/common.js +++ b/src/const/common.js @@ -1,5 +1,6 @@ export const COMMON = { PAGE_SIZE: 20, PAGE_NUM: 1, + TASK_STATUS: [{id: 0, name: '未开始', color: 'rgba(0, 0, 0, 0.65)'},{id: 1, name: '已完成', color: '#1890ff'},{id: 2, name: '进行中', color: '#52c41a'},{id: 3, name: '挂起', color: '#f5222d'},{id: 4, name: '测试中', color: '#faad14'},] }; diff --git a/src/main.js b/src/main.js index bef08ae..c3f2e4c 100644 --- a/src/main.js +++ b/src/main.js @@ -12,7 +12,7 @@ import '@/assets/css/theme.less' import '@/assets/icon/iconfont' import WrapperContent from '@/components/layout/WrapperContent' import {message, notification} from 'ant-design-vue' -import {notice, destroyNotice} from './assets/js/notice' +import {notice, destroyNotice} from 'assets/js/notice' import moment from 'moment'; import 'moment/locale/zh-cn'; diff --git a/src/mixins/common.js b/src/mixins/common.js index c5a898b..eb22778 100644 --- a/src/mixins/common.js +++ b/src/mixins/common.js @@ -1,4 +1,7 @@ // common-mixin.vue +import {getStore} from "../assets/js/storage"; +import config from "../config/config"; + export default { data() { return {} @@ -11,5 +14,13 @@ export default { this.$router.push(page); } }, + toHome() { + const currentOrganization = getStore('currentOrganization', true); + let home = config.HOME_PAGE; + if (currentOrganization) { + home = home + '/' + currentOrganization.code; + } + this.$router.push(home); + }, } } diff --git a/src/router/home.js b/src/router/home.js index 3d89511..655a481 100644 --- a/src/router/home.js +++ b/src/router/home.js @@ -25,4 +25,10 @@ export default [ component: resolve => require(['@/views/common/inviteFromLink'], resolve), meta: {model: 'Common', info: {show_slider: false}}, }, + { + name: 'calendar', + path: '/calendar', + component: resolve => require(['@/views/common/calendar'], resolve), + meta: {model: 'Common', info: {show_slider: false}}, + }, ]; diff --git a/src/router/index.js b/src/router/index.js index 271a13d..86ac64a 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -8,6 +8,12 @@ import {createRoute, isTokenExpired} from "../assets/js/utils"; import config from "../config/config"; import {refreshAccessToken} from "../api/common/common"; +let HOME_PAGE = config.HOME_PAGE; +const currentOrganization = getStore('currentOrganization', true); +if (currentOrganization) { + HOME_PAGE = HOME_PAGE + '/' + currentOrganization.code; +} + Vue.use(Router); const routes = [].concat( Home @@ -121,10 +127,13 @@ router.beforeEach((to, from, next) => { tokenList.accessToken = res.data.accessToken; tokenList.accessTokenExp = res.data.accessTokenExp; setStore('tokenList', tokenList); - }); + }).catch((() => { + store.state.logged = false; + store.state.userInfo = null; + return false; + })); } } - const HOME_PAGE = config.HOME_PAGE; //页面中转 if (to.name === 'index' || to.path === '/index' || to.path === '/') { next({path: HOME_PAGE}); diff --git a/src/store/actions.js b/src/store/actions.js index fabb146..2c99deb 100644 --- a/src/store/actions.js +++ b/src/store/actions.js @@ -5,7 +5,7 @@ export default { SET_LOGGED({commit}, data) { setStore('tokenList', data.tokenList); setStore('userInfo', data.userInfo); - commit('SET_LOGGED', data); + return commit('SET_LOGGED', data); }, SET_USER({commit}, data) { setStore('userInfo', data); @@ -57,11 +57,11 @@ export default { }, setOrganizationList({commit}, data) { setStore('organizationList', data); - commit('setOrganizationList', data); + return commit('setOrganizationList', data); }, setCurrentOrganization({commit}, data) { setStore('currentOrganization', data); - commit('setCurrentOrganization', data); + return commit('setCurrentOrganization', data); }, setSystem({commit}, data) { setStore('system', data); diff --git a/src/store/modules/menu.js b/src/store/modules/menu.js index 090d4cd..e077586 100644 --- a/src/store/modules/menu.js +++ b/src/store/modules/menu.js @@ -16,7 +16,7 @@ const common = { }, actions: { GET_MENU({commit}) { - getMenuForUser().then(res => { + return getMenuForUser().then(res => { setStore('menu', res.data); commit('SET_MENU', res.data); }); diff --git a/src/views/common/calendar.vue b/src/views/common/calendar.vue new file mode 100644 index 0000000..8d090c8 --- /dev/null +++ b/src/views/common/calendar.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/src/views/common/inviteFromLink.vue b/src/views/common/inviteFromLink.vue index 88b4f30..77fc6f7 100644 --- a/src/views/common/inviteFromLink.vue +++ b/src/views/common/inviteFromLink.vue @@ -75,12 +75,14 @@ }); } else if (this.inviteLink.invite_type == 'organization') { joinOrganation(this.$route.params.code).then(res => { - this.$store.dispatch('setOrganizationList', res.data.organizationList); - this.$store.dispatch('setCurrentOrganization', res.data.currentOrganization); - this.$notice({title: '你已成功加入组织', msg: '你可以在右上方切换当前组织'}, 'notice', 'success'); - setTimeout(function () { - app.$router.replace('/') - }, 500); + if (checkResponse(res)) { + this.$store.dispatch('setOrganizationList', res.data.organizationList); + this.$store.dispatch('setCurrentOrganization', res.data.currentOrganization); + this.$notice({title: '你已成功加入组织', msg: '你可以在右上方切换当前组织'}, 'notice', 'success'); + setTimeout(function () { + app.$router.replace('/') + }, 500); + } }); } } diff --git a/src/views/error/install.vue b/src/views/error/install.vue index 2c85839..e7b2bb6 100644 --- a/src/views/error/install.vue +++ b/src/views/error/install.vue @@ -2,6 +2,7 @@
+