vue2-client 1.2.48 → 1.2.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +130 -126
- package/package.json +1 -1
- package/src/base-client/all.js +61 -61
- package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +105 -104
- package/src/base-client/components/common/AmapMarker/index.js +3 -3
- package/src/base-client/components/common/ScrollList/SrcollList.vue +113 -113
- package/src/base-client/components/common/ScrollList/index.js +3 -3
- package/src/base-client/components/common/XAddForm/XAddForm.vue +339 -339
- package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +316 -316
- package/src/base-client/components/common/XForm/XFormItem.vue +6 -1
- package/src/base-client/components/common/XFormTable/XFormTable.vue +0 -2
- package/src/base-client/components/iot/CustomerDetailsView/index.md +1 -2
- package/src/base-client/components/iot/DeviceBrandDetailsView/DeviceBrandDetailsView.vue +1 -1
- package/src/base-client/components/iot/DeviceDetailsView/DeviceDetailsView.vue +2 -7
- package/src/base-client/components/iot/DeviceDetailsView/index.md +0 -2
- package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsException.vue +57 -57
- package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsMain.vue +240 -196
- package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsRead.vue +131 -131
- package/src/base-client/components/iot/DeviceTypeDetailsView/DeviceTypeDetailsView.vue +1 -5
- package/src/base-client/components/iot/InstructDetailsView/InstructDetailsView.vue +6 -14
- package/src/base-client/components/iot/InstructDetailsView/index.md +0 -2
- package/src/base-client/components/iot/LogDetailsView/LogDetailsView.vue +6 -13
- package/src/base-client/components/iot/LogDetailsView/index.md +0 -2
- package/src/base-client/components/iot/MeterDetailsView/MeterDetailsView.vue +17 -24
- package/src/base-client/components/iot/MeterDetailsView/index.md +0 -2
- package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsCount.vue +0 -5
- package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsException.vue +0 -5
- package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsHandPlan.vue +0 -6
- package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsInstruct.vue +0 -6
- package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsMain.vue +1 -6
- package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsSellGas.vue +1 -6
- package/src/base-client/components/iot/WebmeterAnalysisView/WebmeterAnalysisView.vue +8 -83
- package/src/base-client/components/iot/WebmeterAnalysisView/index.md +0 -6
- package/src/base-client/components/ticket/TicketDetailsView/TicketDetailsView.vue +13 -4
- package/src/base-client/components/ticket/TicketSubmitSuccessView/TicketSubmitSuccessView.vue +532 -532
- package/src/base-client/plugins/AppData.js +57 -57
- package/src/base-client/plugins/compatible/LoginServiceOA.js +19 -0
- package/src/config/default/setting.config.js +2 -2
- package/src/layouts/header/HeaderNotice.vue +96 -96
- package/src/layouts/tabs/TabsView.vue +0 -3
- package/src/pages/login/Login.vue +53 -22
- package/src/pages/system/ticket/submitTicketSuccess.vue +33 -13
- package/src/router/async/config.async.js +26 -26
- package/src/router/index.js +27 -27
- package/src/theme/default/style.less +47 -47
- package/src/utils/map-utils.js +28 -17
- package/src/utils/routerUtil.js +1 -10
- package/vue.config.js +143 -143
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
import { manageApi, post } from '@vue2-client/services/api'
|
|
2
|
-
|
|
3
|
-
const GetAppDataService = {
|
|
4
|
-
install (Vue) {
|
|
5
|
-
// 给vue增添对话框显示方法
|
|
6
|
-
Vue.$appdata = Vue.prototype.$appdata = GetAppDataService
|
|
7
|
-
},
|
|
8
|
-
async load () {
|
|
9
|
-
const params = {
|
|
10
|
-
orgList: []
|
|
11
|
-
}
|
|
12
|
-
await post(manageApi.getDictionaryValue, {}).then((res) => {
|
|
13
|
-
Object.assign(params, res)
|
|
14
|
-
const badgeItemArray = {}
|
|
15
|
-
for (const key of Object.keys(params)) {
|
|
16
|
-
badgeItemArray[key] = {}
|
|
17
|
-
for (const item of params[key]) {
|
|
18
|
-
if (item.status) {
|
|
19
|
-
badgeItemArray[key][item.value] = {
|
|
20
|
-
status: item.status,
|
|
21
|
-
text: item.text
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
// 追加参数
|
|
27
|
-
localStorage.setItem(process.env.VUE_APP_DICTIONARY_KEY, JSON.stringify(params))
|
|
28
|
-
localStorage.setItem(process.env.VUE_APP_BADGE_KEY, JSON.stringify(badgeItemArray))
|
|
29
|
-
})
|
|
30
|
-
},
|
|
31
|
-
getDictionaryList (key) {
|
|
32
|
-
const str = localStorage.getItem(process.env.VUE_APP_DICTIONARY_KEY)
|
|
33
|
-
const object = JSON.parse(str)
|
|
34
|
-
return object[key]
|
|
35
|
-
},
|
|
36
|
-
getParam (key, value) {
|
|
37
|
-
const str = localStorage.getItem(process.env.VUE_APP_BADGE_KEY)
|
|
38
|
-
const object = JSON.parse(str)
|
|
39
|
-
const result = object[key]
|
|
40
|
-
if (result && result.hasOwnProperty(value)) {
|
|
41
|
-
return result[value]
|
|
42
|
-
} else {
|
|
43
|
-
return null
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
-
getParams () {
|
|
47
|
-
const str = localStorage.getItem(process.env.VUE_APP_DICTIONARY_KEY)
|
|
48
|
-
const object = JSON.parse(str)
|
|
49
|
-
return object
|
|
50
|
-
},
|
|
51
|
-
getSingleValues () {
|
|
52
|
-
const str = localStorage.getItem(process.env.VUE_APP_BADGE_KEY)
|
|
53
|
-
const object = JSON.parse(str)
|
|
54
|
-
return object
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
export default GetAppDataService
|
|
1
|
+
import { manageApi, post } from '@vue2-client/services/api'
|
|
2
|
+
|
|
3
|
+
const GetAppDataService = {
|
|
4
|
+
install (Vue) {
|
|
5
|
+
// 给vue增添对话框显示方法
|
|
6
|
+
Vue.$appdata = Vue.prototype.$appdata = GetAppDataService
|
|
7
|
+
},
|
|
8
|
+
async load () {
|
|
9
|
+
const params = {
|
|
10
|
+
orgList: []
|
|
11
|
+
}
|
|
12
|
+
await post(manageApi.getDictionaryValue, {}).then((res) => {
|
|
13
|
+
Object.assign(params, res)
|
|
14
|
+
const badgeItemArray = {}
|
|
15
|
+
for (const key of Object.keys(params)) {
|
|
16
|
+
badgeItemArray[key] = {}
|
|
17
|
+
for (const item of params[key]) {
|
|
18
|
+
if (item.status) {
|
|
19
|
+
badgeItemArray[key][item.value] = {
|
|
20
|
+
status: item.status,
|
|
21
|
+
text: item.text
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// 追加参数
|
|
27
|
+
localStorage.setItem(process.env.VUE_APP_DICTIONARY_KEY, JSON.stringify(params))
|
|
28
|
+
localStorage.setItem(process.env.VUE_APP_BADGE_KEY, JSON.stringify(badgeItemArray))
|
|
29
|
+
})
|
|
30
|
+
},
|
|
31
|
+
getDictionaryList (key) {
|
|
32
|
+
const str = localStorage.getItem(process.env.VUE_APP_DICTIONARY_KEY)
|
|
33
|
+
const object = JSON.parse(str)
|
|
34
|
+
return object[key]
|
|
35
|
+
},
|
|
36
|
+
getParam (key, value) {
|
|
37
|
+
const str = localStorage.getItem(process.env.VUE_APP_BADGE_KEY)
|
|
38
|
+
const object = JSON.parse(str)
|
|
39
|
+
const result = object[key]
|
|
40
|
+
if (result && result.hasOwnProperty(value)) {
|
|
41
|
+
return result[value]
|
|
42
|
+
} else {
|
|
43
|
+
return null
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
getParams () {
|
|
47
|
+
const str = localStorage.getItem(process.env.VUE_APP_DICTIONARY_KEY)
|
|
48
|
+
const object = JSON.parse(str)
|
|
49
|
+
return object
|
|
50
|
+
},
|
|
51
|
+
getSingleValues () {
|
|
52
|
+
const str = localStorage.getItem(process.env.VUE_APP_BADGE_KEY)
|
|
53
|
+
const object = JSON.parse(str)
|
|
54
|
+
return object
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export default GetAppDataService
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { get } from '@vue2-client/services/api'
|
|
2
|
+
import Vue from 'vue'
|
|
3
|
+
|
|
4
|
+
async function loginStart (name, password) {
|
|
5
|
+
const resource = await get(`/rs/user/${name}/${password}/newoa`, {})
|
|
6
|
+
console.log('登陆获取', resource)
|
|
7
|
+
Vue.$login.f = resource
|
|
8
|
+
const login = {
|
|
9
|
+
f: Vue.$login.f,
|
|
10
|
+
jwt: Vue.$login.f.id,
|
|
11
|
+
r: Vue.$login.r
|
|
12
|
+
}
|
|
13
|
+
Vue.$store.commit('account/setLogin', login)
|
|
14
|
+
return resource
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export {
|
|
18
|
+
loginStart
|
|
19
|
+
}
|
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<a-dropdown :trigger="['click']" v-model="show">
|
|
3
|
-
<div slot="overlay">
|
|
4
|
-
<a-spin :spinning="loading">
|
|
5
|
-
<a-tabs class="dropdown-tabs" :tabBarStyle="{textAlign: 'center'}" :style="{width: '297px'}">
|
|
6
|
-
<a-tab-pane tab="通知" key="1">
|
|
7
|
-
<a-list>
|
|
8
|
-
<a-list-item :key="item.id" class="tab-pane" v-for=" item in exception">
|
|
9
|
-
<a-list-item-meta :title="'设备号'+ item.e_f_device_id" :description="item.e_f_error_msg" @click="read(item)">
|
|
10
|
-
<a-avatar style="background-color: white" slot="avatar" src="https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png"/>
|
|
11
|
-
</a-list-item-meta>
|
|
12
|
-
</a-list-item>
|
|
13
|
-
</a-list>
|
|
14
|
-
</a-tab-pane>
|
|
15
|
-
<a-tab-pane tab="消息" key="2">
|
|
16
|
-
<a-list class="tab-pane"></a-list>
|
|
17
|
-
</a-tab-pane>
|
|
18
|
-
<a-tab-pane tab="待办" key="3">
|
|
19
|
-
<a-list class="tab-pane"></a-list>
|
|
20
|
-
</a-tab-pane>
|
|
21
|
-
</a-tabs>
|
|
22
|
-
</a-spin>
|
|
23
|
-
</div>
|
|
24
|
-
<span @click="fetchNotice" class="header-notice">
|
|
25
|
-
<a-badge class="notice-badge" :count=" exception.length">
|
|
26
|
-
<a-icon :class="['header-notice-icon']" type="bell" />
|
|
27
|
-
</a-badge>
|
|
28
|
-
</span>
|
|
29
|
-
</a-dropdown>
|
|
30
|
-
</template>
|
|
31
|
-
|
|
32
|
-
<script>
|
|
33
|
-
import { post } from '@vue2-client/services/api'
|
|
34
|
-
export default {
|
|
35
|
-
name: 'HeaderNotice',
|
|
36
|
-
data () {
|
|
37
|
-
return {
|
|
38
|
-
loading: false,
|
|
39
|
-
show: false,
|
|
40
|
-
exception: []
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
computed: {
|
|
44
|
-
},
|
|
45
|
-
created () {
|
|
46
|
-
},
|
|
47
|
-
methods: {
|
|
48
|
-
read (item) {
|
|
49
|
-
post('/webmeterapi/saveSingleTable', { data: { tablename: 't_iot_device_exception', param: { id: item.e_id, f_is_read: 1 } } }).then(res => {
|
|
50
|
-
this.refresh()
|
|
51
|
-
})
|
|
52
|
-
},
|
|
53
|
-
refresh () {
|
|
54
|
-
post('/webmeterapi/commonQuery', { queryParamsName: 'deviceExceptionQueryParams', conditionParams: { e_f_is_read: 0 }, pageNo: 1, pageSize: 999999 }).then(res => {
|
|
55
|
-
this.exception = res.data
|
|
56
|
-
})
|
|
57
|
-
},
|
|
58
|
-
fetchNotice () {
|
|
59
|
-
if (this.loading) {
|
|
60
|
-
this.loading = false
|
|
61
|
-
return
|
|
62
|
-
}
|
|
63
|
-
this.loadding = true
|
|
64
|
-
setTimeout(() => {
|
|
65
|
-
this.loadding = false
|
|
66
|
-
}, 1000)
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
</script>
|
|
71
|
-
|
|
72
|
-
<style lang="less">
|
|
73
|
-
.header-notice{
|
|
74
|
-
display: inline-block;
|
|
75
|
-
transition: all 0.3s;
|
|
76
|
-
span {
|
|
77
|
-
vertical-align: initial;
|
|
78
|
-
}
|
|
79
|
-
.notice-badge{
|
|
80
|
-
color: inherit;
|
|
81
|
-
.header-notice-icon{
|
|
82
|
-
font-size: 16px;
|
|
83
|
-
padding: 4px;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
.dropdown-tabs{
|
|
88
|
-
background-color: @base-bg-color;
|
|
89
|
-
box-shadow: 0 2px 8px @shadow-color;
|
|
90
|
-
border-radius: 4px;
|
|
91
|
-
.tab-pane{
|
|
92
|
-
padding: 0 24px 12px;
|
|
93
|
-
min-height: 250px;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
</style>
|
|
1
|
+
<template>
|
|
2
|
+
<a-dropdown :trigger="['click']" v-model="show">
|
|
3
|
+
<div slot="overlay">
|
|
4
|
+
<a-spin :spinning="loading">
|
|
5
|
+
<a-tabs class="dropdown-tabs" :tabBarStyle="{textAlign: 'center'}" :style="{width: '297px'}">
|
|
6
|
+
<a-tab-pane tab="通知" key="1">
|
|
7
|
+
<a-list>
|
|
8
|
+
<a-list-item :key="item.id" class="tab-pane" v-for=" item in exception">
|
|
9
|
+
<a-list-item-meta :title="'设备号'+ item.e_f_device_id" :description="item.e_f_error_msg" @click="read(item)">
|
|
10
|
+
<a-avatar style="background-color: white" slot="avatar" src="https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png"/>
|
|
11
|
+
</a-list-item-meta>
|
|
12
|
+
</a-list-item>
|
|
13
|
+
</a-list>
|
|
14
|
+
</a-tab-pane>
|
|
15
|
+
<a-tab-pane tab="消息" key="2">
|
|
16
|
+
<a-list class="tab-pane"></a-list>
|
|
17
|
+
</a-tab-pane>
|
|
18
|
+
<a-tab-pane tab="待办" key="3">
|
|
19
|
+
<a-list class="tab-pane"></a-list>
|
|
20
|
+
</a-tab-pane>
|
|
21
|
+
</a-tabs>
|
|
22
|
+
</a-spin>
|
|
23
|
+
</div>
|
|
24
|
+
<span @click="fetchNotice" class="header-notice">
|
|
25
|
+
<a-badge class="notice-badge" :count=" exception.length">
|
|
26
|
+
<a-icon :class="['header-notice-icon']" type="bell" />
|
|
27
|
+
</a-badge>
|
|
28
|
+
</span>
|
|
29
|
+
</a-dropdown>
|
|
30
|
+
</template>
|
|
31
|
+
|
|
32
|
+
<script>
|
|
33
|
+
import { post } from '@vue2-client/services/api'
|
|
34
|
+
export default {
|
|
35
|
+
name: 'HeaderNotice',
|
|
36
|
+
data () {
|
|
37
|
+
return {
|
|
38
|
+
loading: false,
|
|
39
|
+
show: false,
|
|
40
|
+
exception: []
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
computed: {
|
|
44
|
+
},
|
|
45
|
+
created () {
|
|
46
|
+
},
|
|
47
|
+
methods: {
|
|
48
|
+
read (item) {
|
|
49
|
+
post('/webmeterapi/saveSingleTable', { data: { tablename: 't_iot_device_exception', param: { id: item.e_id, f_is_read: 1 } } }).then(res => {
|
|
50
|
+
this.refresh()
|
|
51
|
+
})
|
|
52
|
+
},
|
|
53
|
+
refresh () {
|
|
54
|
+
post('/webmeterapi/commonQuery', { queryParamsName: 'deviceExceptionQueryParams', conditionParams: { e_f_is_read: 0 }, pageNo: 1, pageSize: 999999 }).then(res => {
|
|
55
|
+
this.exception = res.data
|
|
56
|
+
})
|
|
57
|
+
},
|
|
58
|
+
fetchNotice () {
|
|
59
|
+
if (this.loading) {
|
|
60
|
+
this.loading = false
|
|
61
|
+
return
|
|
62
|
+
}
|
|
63
|
+
this.loadding = true
|
|
64
|
+
setTimeout(() => {
|
|
65
|
+
this.loadding = false
|
|
66
|
+
}, 1000)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
</script>
|
|
71
|
+
|
|
72
|
+
<style lang="less">
|
|
73
|
+
.header-notice{
|
|
74
|
+
display: inline-block;
|
|
75
|
+
transition: all 0.3s;
|
|
76
|
+
span {
|
|
77
|
+
vertical-align: initial;
|
|
78
|
+
}
|
|
79
|
+
.notice-badge{
|
|
80
|
+
color: inherit;
|
|
81
|
+
.header-notice-icon{
|
|
82
|
+
font-size: 16px;
|
|
83
|
+
padding: 4px;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
.dropdown-tabs{
|
|
88
|
+
background-color: @base-bg-color;
|
|
89
|
+
box-shadow: 0 2px 8px @shadow-color;
|
|
90
|
+
border-radius: 4px;
|
|
91
|
+
.tab-pane{
|
|
92
|
+
padding: 0 24px 12px;
|
|
93
|
+
min-height: 250px;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
</style>
|
|
@@ -60,9 +60,9 @@ import { loadRoutes, funcToRouter } from '@vue2-client/utils/routerUtil'
|
|
|
60
60
|
import { mapMutations, mapState } from 'vuex'
|
|
61
61
|
import JSEncrypt from 'jsencrypt'
|
|
62
62
|
import { ACCESS_TOKEN } from '@vue2-client/store/mutation-types'
|
|
63
|
-
import Vue from 'vue'
|
|
64
63
|
import { positions } from '@vue2-client/mock/common'
|
|
65
64
|
import { timeFix } from '@vue2-client/utils/util'
|
|
65
|
+
import { loginStart } from '@vue2-client/base-client/plugins/compatible/LoginServiceOA'
|
|
66
66
|
|
|
67
67
|
export default {
|
|
68
68
|
name: 'Login',
|
|
@@ -75,7 +75,7 @@ export default {
|
|
|
75
75
|
}
|
|
76
76
|
},
|
|
77
77
|
computed: {
|
|
78
|
-
...mapState('setting', ['systemName', 'systemDesc', 'homePage', 'ticketPage'])
|
|
78
|
+
...mapState('setting', ['systemName', 'systemDesc', 'homePage', 'ticketPage', 'compatible'])
|
|
79
79
|
},
|
|
80
80
|
methods: {
|
|
81
81
|
...mapMutations('account', ['setUser', 'setPermissions', 'setRoles']),
|
|
@@ -86,10 +86,27 @@ export default {
|
|
|
86
86
|
this.logging = true
|
|
87
87
|
const name = this.form.getFieldValue('name')
|
|
88
88
|
const password = this.form.getFieldValue('password')
|
|
89
|
-
|
|
89
|
+
switch (this.compatible) {
|
|
90
|
+
case 'V3': {
|
|
91
|
+
login(name, password).then(this.afterLogin)
|
|
92
|
+
break
|
|
93
|
+
}
|
|
94
|
+
case 'OA' : {
|
|
95
|
+
loginStart(name, password).then(this.afterLoginOA).finally(() => { this.logging = false })
|
|
96
|
+
break
|
|
97
|
+
}
|
|
98
|
+
}
|
|
90
99
|
}
|
|
91
100
|
})
|
|
92
101
|
},
|
|
102
|
+
afterLoginOA (result) {
|
|
103
|
+
// 默认第一个是旧OA地址
|
|
104
|
+
result.functions[0].navigate = result.functions[0].link
|
|
105
|
+
result.functions[0].link = null
|
|
106
|
+
this.afterGeneral(result)
|
|
107
|
+
this.setACCESSTOKEN(result.password)
|
|
108
|
+
this.$router.push(this.homePage).catch(() => {})
|
|
109
|
+
},
|
|
93
110
|
afterLogin (res) {
|
|
94
111
|
const name = this.form.getFieldValue('name')
|
|
95
112
|
const password = this.form.getFieldValue('password')
|
|
@@ -99,37 +116,51 @@ export default {
|
|
|
99
116
|
const encrypt = new JSEncrypt()
|
|
100
117
|
encrypt.setPublicKey('MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqPvovSfXcwBbW8cKMCgwqNpsYuzF8RPAPFb7LGsnVo44JhM/xxzDyzoYtdfNmtbIuKVi9PzIsyp6rg+09gbuI6UGwBZ5DWBDBMqv5MPdOF5dCQkB2Bbr5yPfURPENypUz+pBFBg41d+BC+rwRiXELwKy7Y9caD/MtJyHydj8OUwIDAQAB')
|
|
101
118
|
const data = encrypt.encrypt(JSON.stringify({ username: name, password: password }))
|
|
102
|
-
localStorage.setItem(ACCESS_TOKEN, data)
|
|
103
119
|
// 获取路由配置
|
|
104
120
|
getRoutesConfig(data).then(result => {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
name:
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
this.
|
|
115
|
-
this.
|
|
116
|
-
let timestamp = new Date().getTime()// 当前的时间戳
|
|
117
|
-
timestamp = timestamp + 60 * 60 * 1000
|
|
118
|
-
// 格式化时间获取年月日, 登陆过期时间
|
|
119
|
-
const dateAfter = new Date(timestamp)
|
|
120
|
-
setAuthorization({ token: data, expireAt: dateAfter })
|
|
121
|
-
loadRoutes(funcToRouter(user.functions))
|
|
121
|
+
this.$login.login(result).then(() => {
|
|
122
|
+
// V3任何情况首位加入资源管理
|
|
123
|
+
const resourceManageMain = {
|
|
124
|
+
name: '资源管理',
|
|
125
|
+
icon: 'api',
|
|
126
|
+
position: 1,
|
|
127
|
+
link: 'resourceManageMain'
|
|
128
|
+
}
|
|
129
|
+
result.functions.unshift(resourceManageMain)
|
|
130
|
+
this.afterGeneral(result)
|
|
131
|
+
this.setACCESSTOKEN(data)
|
|
122
132
|
if (result.deps === '用户工单登记') {
|
|
123
133
|
this.$router.push(this.ticketPage).catch(() => {})
|
|
124
134
|
} else {
|
|
125
135
|
this.$router.push(this.homePage).catch(() => {})
|
|
126
136
|
}
|
|
127
|
-
this.$message.success(timeFix().CN + ',欢迎回来', 3)
|
|
128
137
|
})
|
|
129
138
|
})
|
|
130
139
|
} else {
|
|
131
140
|
this.error = loginRes
|
|
132
141
|
}
|
|
142
|
+
},
|
|
143
|
+
afterGeneral (result) {
|
|
144
|
+
const user = Object.assign({
|
|
145
|
+
username: result.ename,
|
|
146
|
+
name: result.name,
|
|
147
|
+
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/jZUIxmJycoymBprLOUbT.png',
|
|
148
|
+
address: '西安市',
|
|
149
|
+
position: positions[0]
|
|
150
|
+
}, result)
|
|
151
|
+
this.setUser(user)
|
|
152
|
+
this.setPermissions([{ id: 'queryForm', operation: ['add', 'edit'] }])
|
|
153
|
+
this.setRoles([{ id: 'admin', operation: ['add', 'edit', 'delete'] }])
|
|
154
|
+
loadRoutes(funcToRouter(user.functions))
|
|
155
|
+
this.$message.success(timeFix().CN + `,${result.name} 欢迎回来`, 3)
|
|
156
|
+
},
|
|
157
|
+
setACCESSTOKEN (data) {
|
|
158
|
+
localStorage.setItem(ACCESS_TOKEN, data)
|
|
159
|
+
let timestamp = new Date().getTime()// 当前的时间戳
|
|
160
|
+
timestamp = timestamp + 60 * 60 * 1000
|
|
161
|
+
// 格式化时间获取年月日, 登陆过期时间
|
|
162
|
+
const dateAfter = new Date(timestamp)
|
|
163
|
+
setAuthorization({ token: data, expireAt: dateAfter })
|
|
133
164
|
}
|
|
134
165
|
}
|
|
135
166
|
}
|
|
@@ -84,6 +84,7 @@ export default {
|
|
|
84
84
|
// 控制加急按钮显示
|
|
85
85
|
UrgentAvailable: true,
|
|
86
86
|
// 刷新页面的定时器
|
|
87
|
+
time: undefined,
|
|
87
88
|
timer: undefined,
|
|
88
89
|
// 取消工单确认框可见性
|
|
89
90
|
closeVisible: false,
|
|
@@ -98,7 +99,8 @@ export default {
|
|
|
98
99
|
this.countDown = 0
|
|
99
100
|
},
|
|
100
101
|
beforeDestroy () {
|
|
101
|
-
|
|
102
|
+
this.stopTimer()
|
|
103
|
+
this.stopTimer2()
|
|
102
104
|
},
|
|
103
105
|
methods: {
|
|
104
106
|
format (date, format) {
|
|
@@ -115,7 +117,7 @@ export default {
|
|
|
115
117
|
this.title = '工单已关闭'
|
|
116
118
|
this.description = ''
|
|
117
119
|
this.icon = false
|
|
118
|
-
|
|
120
|
+
this.stopTimer()
|
|
119
121
|
}, err => {
|
|
120
122
|
console.error(err)
|
|
121
123
|
})
|
|
@@ -130,9 +132,11 @@ export default {
|
|
|
130
132
|
},
|
|
131
133
|
// 过10s刷新一下页面数据
|
|
132
134
|
refresh () {
|
|
133
|
-
this.timer
|
|
134
|
-
this.
|
|
135
|
-
|
|
135
|
+
if (this.timer === undefined) {
|
|
136
|
+
this.timer = setInterval(() => {
|
|
137
|
+
this.getTicketDetail()
|
|
138
|
+
}, 10 * 1000)
|
|
139
|
+
}
|
|
136
140
|
},
|
|
137
141
|
// 对工单进行加急处理
|
|
138
142
|
urgent () {
|
|
@@ -173,14 +177,16 @@ export default {
|
|
|
173
177
|
// 设置用于控制加急按钮倒计时定时器,加急按钮5分钟后才可点击
|
|
174
178
|
setTimer () {
|
|
175
179
|
this.countDown = 5
|
|
176
|
-
|
|
177
|
-
this.
|
|
178
|
-
|
|
179
|
-
this.
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
180
|
+
if (this.time === undefined) {
|
|
181
|
+
this.time = setInterval(() => {
|
|
182
|
+
this.countDown--
|
|
183
|
+
if (this.countDown <= 0) {
|
|
184
|
+
this.urgentAccess = false
|
|
185
|
+
this.stopTimer2()
|
|
186
|
+
this.countDown = -1
|
|
187
|
+
}
|
|
188
|
+
}, 1000)
|
|
189
|
+
}
|
|
184
190
|
},
|
|
185
191
|
// 获取工单详情
|
|
186
192
|
getTicketDetail () {
|
|
@@ -218,6 +224,20 @@ export default {
|
|
|
218
224
|
}, err => {
|
|
219
225
|
console.log(err)
|
|
220
226
|
})
|
|
227
|
+
},
|
|
228
|
+
// 停止定时器
|
|
229
|
+
stopTimer () {
|
|
230
|
+
if (this.timer) {
|
|
231
|
+
clearInterval(this.timer)
|
|
232
|
+
this.timer = undefined
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
// 停止定时器2
|
|
236
|
+
stopTimer2 () {
|
|
237
|
+
if (this.time) {
|
|
238
|
+
clearInterval(this.time)
|
|
239
|
+
this.time = undefined
|
|
240
|
+
}
|
|
221
241
|
}
|
|
222
242
|
},
|
|
223
243
|
computed: {
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import routerMap from './router.map'
|
|
2
|
-
import { parseRoutes } from '@vue2-client/utils/routerUtil'
|
|
3
|
-
|
|
4
|
-
// 异步路由配置
|
|
5
|
-
const routesConfig = [
|
|
6
|
-
'login',
|
|
7
|
-
'submitTicket',
|
|
8
|
-
'root',
|
|
9
|
-
{
|
|
10
|
-
router: 'exp404',
|
|
11
|
-
path: '*',
|
|
12
|
-
name: '404'
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
router: 'exp403',
|
|
16
|
-
path: '/403',
|
|
17
|
-
name: '403'
|
|
18
|
-
}
|
|
19
|
-
]
|
|
20
|
-
|
|
21
|
-
const options = {
|
|
22
|
-
mode: 'history',
|
|
23
|
-
routes: parseRoutes(routesConfig, routerMap)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export default options
|
|
1
|
+
import routerMap from './router.map'
|
|
2
|
+
import { parseRoutes } from '@vue2-client/utils/routerUtil'
|
|
3
|
+
|
|
4
|
+
// 异步路由配置
|
|
5
|
+
const routesConfig = [
|
|
6
|
+
'login',
|
|
7
|
+
'submitTicket',
|
|
8
|
+
'root',
|
|
9
|
+
{
|
|
10
|
+
router: 'exp404',
|
|
11
|
+
path: '*',
|
|
12
|
+
name: '404'
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
router: 'exp403',
|
|
16
|
+
path: '/403',
|
|
17
|
+
name: '403'
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
const options = {
|
|
22
|
+
mode: 'history',
|
|
23
|
+
routes: parseRoutes(routesConfig, routerMap)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export default options
|
package/src/router/index.js
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import { formatRoutes } from '@vue2-client/utils/routerUtil'
|
|
2
|
-
|
|
3
|
-
// 不需要登录拦截的路由配置
|
|
4
|
-
const loginIgnore = {
|
|
5
|
-
names: ['404', '403'], // 根据路由名称匹配
|
|
6
|
-
paths: ['/login', '/submitTicket'], // 根据路由fullPath匹配
|
|
7
|
-
/**
|
|
8
|
-
* 判断路由是否包含在该配置中
|
|
9
|
-
* @param route vue-router 的 route 对象
|
|
10
|
-
* @returns {boolean}
|
|
11
|
-
*/
|
|
12
|
-
includes (route) {
|
|
13
|
-
return this.names.includes(route.name) || this.paths.includes(route.path)
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* 初始化路由实例
|
|
19
|
-
* @param isAsync 是否异步路由模式
|
|
20
|
-
* @returns {RouterOptions}
|
|
21
|
-
*/
|
|
22
|
-
function initRouter (isAsync) {
|
|
23
|
-
const options = require('./async/config.async').default
|
|
24
|
-
formatRoutes(options.routes)
|
|
25
|
-
return options
|
|
26
|
-
}
|
|
27
|
-
export { loginIgnore, initRouter }
|
|
1
|
+
import { formatRoutes } from '@vue2-client/utils/routerUtil'
|
|
2
|
+
|
|
3
|
+
// 不需要登录拦截的路由配置
|
|
4
|
+
const loginIgnore = {
|
|
5
|
+
names: ['404', '403'], // 根据路由名称匹配
|
|
6
|
+
paths: ['/login', '/submitTicket'], // 根据路由fullPath匹配
|
|
7
|
+
/**
|
|
8
|
+
* 判断路由是否包含在该配置中
|
|
9
|
+
* @param route vue-router 的 route 对象
|
|
10
|
+
* @returns {boolean}
|
|
11
|
+
*/
|
|
12
|
+
includes (route) {
|
|
13
|
+
return this.names.includes(route.name) || this.paths.includes(route.path)
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* 初始化路由实例
|
|
19
|
+
* @param isAsync 是否异步路由模式
|
|
20
|
+
* @returns {RouterOptions}
|
|
21
|
+
*/
|
|
22
|
+
function initRouter (isAsync) {
|
|
23
|
+
const options = require('./async/config.async').default
|
|
24
|
+
formatRoutes(options.routes)
|
|
25
|
+
return options
|
|
26
|
+
}
|
|
27
|
+
export { loginIgnore, initRouter }
|