vue2-client 1.11.1 → 1.11.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue2-client",
3
- "version": "1.11.1",
3
+ "version": "1.11.3",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "serve": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint",
@@ -774,7 +774,9 @@ export default {
774
774
  },
775
775
  labelCol: {
776
776
  type: Object,
777
- default: () => { return { span: 8 } }
777
+ default: () => {
778
+ return { span: 8 }
779
+ }
778
780
  }
779
781
  },
780
782
  provide () {
@@ -1095,6 +1097,8 @@ export default {
1095
1097
  } else if (this.attr.keyName.indexOf('async ') !== -1 || this.attr.keyName.indexOf('function ') !== -1) {
1096
1098
  this.updateOptions()
1097
1099
  }
1100
+ } else if (this.attr.keys) {
1101
+ this.getDataCallback(this.attr.keys)
1098
1102
  }
1099
1103
  this.focusInput()
1100
1104
  },
@@ -1110,14 +1114,16 @@ export default {
1110
1114
  getDataCallback (res) {
1111
1115
  this.option = res
1112
1116
  if (this.attr.type === 'treeSelect') {
1113
- this.$refs.xTreeSelect.init({
1114
- option: this.option,
1115
- form: this.form,
1116
- queryType: this.attr.queryType,
1117
- name: this.attr.name,
1118
- model: this.attr.model,
1119
- mode: this.mode,
1120
- disabled: this.disabled
1117
+ this.$nextTick(() => {
1118
+ this.$refs.xTreeSelect.init({
1119
+ option: this.option,
1120
+ form: this.form,
1121
+ queryType: this.attr.queryType,
1122
+ name: this.attr.name,
1123
+ model: this.attr.model,
1124
+ mode: this.mode,
1125
+ disabled: this.disabled
1126
+ })
1121
1127
  })
1122
1128
  } else if (this.attr.type === 'radio' || ['radioGroup', 'clickChange'].includes(this.attr.showMode)) {
1123
1129
  this.initRadioValue()
@@ -89,6 +89,7 @@ export default {
89
89
  if (this.mode === '查询') {
90
90
  const values = []
91
91
  this.getValues(option, value, values)
92
+ this.$emit('onChange', values)
92
93
  } else {
93
94
  this.value = value
94
95
  }
@@ -101,14 +102,25 @@ export default {
101
102
  this.$emit('mounted', this)
102
103
  this.loaded = true
103
104
  },
104
- getValues (option, value, values, flag) {
105
+ getValues (option, value, values) {
105
106
  for (const item of option) {
106
107
  if (value.includes(item.value)) {
107
108
  values.push(item.value)
108
- flag = true
109
+ // 找到匹配节点后,递归添加所有子节点的值
110
+ if (item.children && item.children.length) {
111
+ this.getAllChildrenValues(item.children, values)
112
+ }
109
113
  }
110
114
  if (item.children && item.children.length) {
111
- this.getValues(item.children, value, values, flag)
115
+ this.getValues(item.children, value, values)
116
+ }
117
+ }
118
+ },
119
+ getAllChildrenValues (children, values) {
120
+ for (const child of children) {
121
+ values.push(child.value)
122
+ if (child.children && child.children.length) {
123
+ this.getAllChildrenValues(child.children, values)
112
124
  }
113
125
  }
114
126
  },
@@ -181,7 +193,9 @@ export default {
181
193
  const values = []
182
194
  if (extra.allCheckedNodes) {
183
195
  for (const item of extra.allCheckedNodes) {
184
- if (item.node.key && item.node?.data?.props?.label !== item.node?.data?.props?.value) {
196
+ console.log(item.node.key, '=====', item.children)
197
+ if (item.node.key) {
198
+ // if (item.node.key && item.node?.data?.props?.label !== item.node?.data?.props?.value) {
185
199
  values.push(`${item.node.key}`)
186
200
  }
187
201
  if (item.children && item.children.length) {
@@ -8,7 +8,7 @@
8
8
  <a-rate disabled v-model="formJson.default[item.groupName][col.model]" />
9
9
  </template>
10
10
  <template v-else>
11
- {{formJson.default[item.groupName][col.model]}}
11
+ {{ formJson.default[item.groupName][col.model] }}
12
12
  </template>
13
13
  </a-descriptions-item>
14
14
  </template>
@@ -6,7 +6,7 @@
6
6
  title="示例表单"
7
7
  :queryParamsName="queryParamsName"
8
8
  :fixedAddForm="fixedAddForm"
9
- service-name="af-system"
9
+ service-name="af-revenue"
10
10
  @action="action"
11
11
  @columnClick="columnClick"
12
12
  ref="xFormTable">
@@ -25,7 +25,7 @@ export default {
25
25
  data () {
26
26
  return {
27
27
  // 查询配置文件名
28
- queryParamsName: 'ceshiCRUD',
28
+ queryParamsName: 'ExceptionQueryCRUD',
29
29
  // 查询配置左侧tree
30
30
  // xTreeConfigName: 'addressType',
31
31
  // 新增表单固定值
@@ -1,16 +1,16 @@
1
1
  const reportData = [
2
- { '气费': { 'span': 8 } },
2
+ { 气费: { span: 8 } },
3
3
  ['付款方式', '用户类型', '用气性质', '笔数', '气量', '应收金额', '实收金额', '滞纳金'],
4
4
  {
5
- '刷卡': {
6
- '非民用': {
7
- '公服用气': [3, 2777, 6998.04, 7000, 0],
8
- '商业用气': [17, 28720, 83811.50, 83806.70, 0]
5
+ 刷卡: {
6
+ 非民用: {
7
+ 公服用气: [3, 2777, 6998.04, 7000, 0],
8
+ 商业用气: [17, 28720, 83811.50, 83806.70, 0]
9
9
  },
10
- '民用': {
11
- '居民用气': [255, 19310, 44219.70, 44345.50, 0]
10
+ 民用: {
11
+ 居民用气: [255, 19310, 44219.70, 44345.50, 0]
12
12
  },
13
- '合计': { 'span': 2, 'value': [275, 50807, 135029.24, 135152.20, 0] }
13
+ 合计: { span: 2, value: [275, 50807, 135029.24, 135152.20, 0] }
14
14
  }
15
15
  }
16
16
  ]
@@ -22,7 +22,7 @@ export default {
22
22
  searchReport (source) {
23
23
  return post('/rs/report/saleMonthReport', {
24
24
  // data: this.data.data
25
- data: this.data['data']
25
+ data: this.data.data
26
26
  }).then(res => {
27
27
  this.model = res
28
28
  }).catch(err => {
@@ -6,7 +6,7 @@
6
6
 
7
7
  <script>
8
8
  export default {
9
- name: 'depListManage',
9
+ name: 'DepListManage',
10
10
  data () {
11
11
  return {}
12
12
  },
@@ -6,7 +6,7 @@
6
6
 
7
7
  <script>
8
8
  export default {
9
- name: 'funListManage',
9
+ name: 'FunListManage',
10
10
  data () {
11
11
  return {}
12
12
  },
@@ -55,7 +55,7 @@
55
55
  import { getConfigByName } from '@vue2-client/services/api/common'
56
56
  export default {
57
57
  // 组织管理
58
- name: 'orgListManage',
58
+ name: 'OrgListManage',
59
59
  data () {
60
60
  return {
61
61
  columnsJson: [],
@@ -6,7 +6,7 @@
6
6
 
7
7
  <script>
8
8
  export default {
9
- name: 'roleListManage',
9
+ name: 'RoleListManage',
10
10
  data () {
11
11
  return {}
12
12
  },
@@ -6,7 +6,7 @@
6
6
 
7
7
  <script>
8
8
  export default {
9
- name: 'staffListManage',
9
+ name: 'StaffListManage',
10
10
  data () {
11
11
  return {}
12
12
  },
@@ -1,188 +1,114 @@
1
1
  const { homePage } = require('../../config')
2
- // 视图组件
2
+ // 视图组件
3
3
  const view = {
4
- tabs: () =>
5
- import('@vue2-client/layouts/tabs'),
6
- blank: () =>
7
- import('@vue2-client/layouts/BlankView'),
8
- page: () =>
9
- import('@vue2-client/layouts/PageView'),
10
- // his-web$ceshiGrid?type=GridView&configName=RxPreparedMed
11
- gridView: () =>
12
- import('@vue2-client/layouts/GridView'),
13
- login: () =>
14
- import('@vue2-client/pages/login/Login'),
15
- loginv3: () =>
16
- import('@vue2-client/pages/login/LoginV3')
17
- }
18
- // 动态路由对象定义
4
+ tabs: () => import('@vue2-client/layouts/tabs'),
5
+ blank: () => import('@vue2-client/layouts/BlankView'),
6
+ page: () => import('@vue2-client/layouts/PageView'),
7
+ // his-web$ceshiGrid?type=GridView&configName=RxPreparedMed
8
+ gridView: () => import('@vue2-client/layouts/GridView'),
9
+ login: () => import('@vue2-client/pages/login/Login'),
10
+ loginv3: () => import('@vue2-client/pages/login/LoginV3')
11
+ }
12
+ // 动态路由对象定义
19
13
  const routerResource = {}
20
- // --------------------------------------基本视图组件--------------------------------------
21
- // 空白视图
14
+ // --------------------------------------基本视图组件--------------------------------------
15
+ // 空白视图
22
16
  routerResource.blank = view.blank
23
- // 单页面视图
17
+ // 单页面视图
24
18
  routerResource.singlePage = view.blank
25
- // 栅格配置视图
19
+ // 栅格配置视图
26
20
  routerResource.gridView = view.gridView
27
21
 
28
22
  // --------------------------------------仪表盘--------------------------------------
29
23
  routerResource.dashboard = view.blank
30
- // 工作台
24
+ // 工作台
31
25
  routerResource.workplace = () =>
32
- import('@vue2-client/pages/dashboard/workplace')
33
- // --------------------------------------系统配置--------------------------------------
26
+ import('@vue2-client/pages/dashboard/workplace')
27
+ // --------------------------------------系统配置--------------------------------------
34
28
  routerResource.system = view.blank
35
- // 字典管理
36
- routerResource.dictionaryManage = () =>
37
- import('@vue2-client/pages/system/dictionary')
38
- // 文件管理
39
- routerResource.fileManager = () =>
40
- import('@vue2-client/pages/system/file')
41
- // 登录日志
42
- routerResource.loginInfor = () =>
43
- import('@vue2-client/pages/system/monitor/loginInfor')
44
- // 操作日志
45
- routerResource.operLog = () =>
46
- import('@vue2-client/pages/system/monitor/operLog')
47
- // 系统问题反馈工单
48
- routerResource.submitTicket = () =>
49
- import('@vue2-client/pages/system/ticket')
50
- // 通用服务评价
51
- routerResource.ServiceReview = () =>
52
- import('@vue2-client/pages/ServiceReview')
53
- // 系统设置
54
- routerResource.settings = () =>
55
- import('@vue2-client/pages/system/settings')
56
- // AMIS示例页面
57
- routerResource.amisDemo = () =>
58
- import('@vue2-client/pages/AMisDemo/AMisDemo')
59
- // 页面编辑器
60
- routerResource.editablePage = () =>
61
- import('@vue2-client/pages/lowCode/lowCodeEditor.vue')
62
- // 数据检索
63
- routerResource.dynamicStatistics = () =>
64
- import('@vue2-client/pages/DynamicStatistics')
65
- // 数据检索(新)
66
- routerResource.newDynamicStatistics = () =>
67
- import('@vue2-client/pages/NewDynamicStatistics')
68
- // 示例页面
29
+ // 字典管理
30
+ routerResource.dictionaryManage = () => import('@vue2-client/pages/system/dictionary')
31
+ // 文件管理
32
+ routerResource.fileManager = () => import('@vue2-client/pages/system/file')
33
+ // 登录日志
34
+ routerResource.loginInfor = () => import('@vue2-client/pages/system/monitor/loginInfor')
35
+ // 操作日志
36
+ routerResource.operLog = () => import('@vue2-client/pages/system/monitor/operLog')
37
+ // 系统问题反馈工单
38
+ routerResource.submitTicket = () => import('@vue2-client/pages/system/ticket')
39
+ // 通用服务评价
40
+ routerResource.ServiceReview = () => import('@vue2-client/pages/ServiceReview')
41
+ // 系统设置
42
+ routerResource.settings = () => import('@vue2-client/pages/system/settings')
43
+ // AMIS示例页面
44
+ routerResource.amisDemo = () => import('@vue2-client/pages/AMisDemo/AMisDemo')
45
+ // 页面编辑器
46
+ routerResource.editablePage = () => import('@vue2-client/pages/lowCode/lowCodeEditor.vue')
47
+ // 数据检索
48
+ routerResource.dynamicStatistics = () => import('@vue2-client/pages/DynamicStatistics')
49
+ // 数据检索()
50
+ routerResource.newDynamicStatistics = () => import('@vue2-client/pages/NewDynamicStatistics')
51
+ // 示例页面
69
52
  routerResource.example = {
70
- path: 'example',
71
- name: '示例主页面',
72
- component: () => import('@vue2-client/pages/Example'),
73
- children: [
74
- {
75
- path: '',
76
- name: '示例页面2',
77
- redirect: 'default',
78
- meta: {
79
- // 菜单中不显示
80
- invisible: true,
81
- }
82
- },
83
- {
84
- path: 'default',
85
- name: '示例页面',
86
- // component: () => import('@vue2-client/base-client/components/common/XAddNativeForm/demo.vue'),
87
- // component: () => import('@vue2-client/base-client/components/common/XFormGroup/demo.vue'),
88
- // component: () => import('@vue2-client/base-client/components/common/XReport/XReportDemo.vue'),
89
- component: () => import('@vue2-client/base-client/components/common/XFormTable/demo.vue'),
90
- // component: () => import('@vue2-client/base-client/components/common/XDatePicker/demo.vue'),
91
- // component: () => import('@vue2-client/base-client/components/common/XTab/XTabDemo.vue'),
92
- // component: () => import('@vue2-client/base-client/components/common/XReportGrid/XReportDemo.vue'),
93
- // component: () => import('@vue2-client/pages/WorkflowDetail/WorkFlowDemo.vue'),
94
- // component: () => import('@vue2-client/base-client/components/common/XConversation/XConversationDemo.vue'),
95
- // component: () => import('@vue2-client/base-client/components/common/XButtons/XButtonDemo.vue'),
96
- // component: () => import('@vue2-client/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue'),
97
- // component: () => import('@vue2-client/base-client/components/common/XCheckList/XCheckList.vue'),
98
- // component: () => import('@vue2-client/base-client/components/common/XPrint/Demo.vue'),
99
- // component: () => import('@vue2-client/base-client/components/AI/demo.vue'),
100
- // component: () => import('@vue2-client/components/g2Charts/demo.vue'),
101
- meta: {
102
- // 菜单中不显示
103
- invisible: true,
104
- }
105
- },
106
- {
107
- path: 'sub-example',
108
- name: '示例页面1',
109
- component: () => import('@vue2-client/pages/SubExample'),
110
- meta: {
111
- // 菜单中不显示
112
- invisible: true,
113
- // 跳转不打开新页签
114
- noPusTabs: true
115
- }
116
- },
117
- {
118
- path: 'x-tree-one-pro-example',
119
- name: 'TreeView布局示例',
120
- component: () => import('@vue2-client/pages/XTreeOneProExample'),
121
- meta: {
122
- // 菜单中不显示
123
- invisible: true,
124
- // 跳转不打开新页签
125
- noPusTabs: true
126
- }
127
- },
128
- {
129
- path: 'page-view-example',
130
- name: 'PageView示例',
131
- component: () => import('@vue2-client/pages/XPageViewExample'),
132
- meta: {
133
- // 菜单中不显示
134
- invisible: true,
135
- // 跳转不打开新页签
136
- noPusTabs: true
137
- }
138
- },
139
- ]
53
+ path: 'example',
54
+ name: '示例主页面',
55
+ // component: () => import('@vue2-client/base-client/components/common/XAddNativeForm/demo.vue'),
56
+ // component: () => import('@vue2-client/base-client/components/common/XFormGroup/demo.vue'),
57
+ // component: () => import('@vue2-client/base-client/components/common/XReport/XReportDemo.vue'),
58
+ component: () => import('@vue2-client/base-client/components/common/XFormTable/demo.vue'),
59
+ // component: () => import('@vue2-client/base-client/components/common/XDatePicker/demo.vue'),
60
+ // component: () => import('@vue2-client/base-client/components/common/XTab/XTabDemo.vue'),
61
+ // component: () => import('@vue2-client/base-client/components/common/XReportGrid/XReportDemo.vue'),
62
+ // component: () => import('@vue2-client/pages/WorkflowDetail/WorkFlowDemo.vue'),
63
+ // component: () => import('@vue2-client/base-client/components/common/XConversation/XConversationDemo.vue'),
64
+ // component: () => import('@vue2-client/base-client/components/common/XButtons/XButtonDemo.vue'),
65
+ // component: () => import('@vue2-client/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue'),
66
+ // component: () => import('@vue2-client/base-client/components/common/XCheckList/XCheckList.vue'),
67
+ // component: () => import('@vue2-client/base-client/components/common/XPrint/Demo.vue'),
68
+ // component: () => import('@vue2-client/base-client/components/AI/demo.vue'),
69
+ // component: () => import('@vue2-client/components/g2Charts/demo.vue'),
140
70
  }
141
71
  // routerResource.example = () =>
142
72
  // import('@vue2-client/pages/Example')
143
- routerResource.XReportView = () =>
144
- import('@vue2-client/pages/XReportView')
73
+ routerResource.XReportView = () => import('@vue2-client/pages/XReportView')
145
74
 
146
- routerResource.XReportGrid = () =>
147
- import('@vue2-client/base-client/components/common/XReportGrid/XReportDemo')
75
+ routerResource.XReportGrid = () => import('@vue2-client/base-client/components/common/XReportGrid/XReportDemo')
148
76
 
149
- routerResource.XTab = () =>
150
- import('@vue2-client/base-client/components/common/XTab/XTabDemo')
77
+ routerResource.XTab = () => import('@vue2-client/base-client/components/common/XTab/XTabDemo')
151
78
 
152
- console.log(process.env)
153
- // 基础路由组件注册
79
+ // 基础路由组件注册
154
80
  const routerMap = {
155
- login: {
156
- authority: '*',
157
- path: '/login',
158
- component: process.env.VUE_APP_LOGIN_VERSION === 'V3'
159
- ? view.loginv3 : view.login
160
- },
161
- root: {
162
- path: '/',
163
- name: '首页',
164
- redirect: homePage,
165
- component: process.env.VUE_APP_SINGLE_PAPER === 'TRUE' ? view.blank : view.tabs,
166
- },
167
- exp403: {
168
- authority: '*',
169
- name: 'exp403',
170
- path: '403',
171
- component: () =>
172
- import('@vue2-client/pages/exception/403')
173
- },
174
- exp404: {
175
- name: 'exp404',
176
- path: '404',
177
- component: () =>
178
- import('@vue2-client/pages/exception/404')
179
- },
180
- exp500: {
181
- name: 'exp500',
182
- path: '500',
183
- component: () =>
184
- import('@vue2-client/pages/exception/500')
185
- }
81
+ login: {
82
+ authority: '*',
83
+ path: '/login',
84
+ component: process.env.VUE_APP_LOGIN_VERSION === 'V3'
85
+ ? view.loginv3 : view.login
86
+ },
87
+ root: {
88
+ path: '/',
89
+ name: '首页',
90
+ redirect: homePage,
91
+ component: process.env.VUE_APP_SINGLE_PAPER === 'TRUE' ? view.blank : view.tabs,
92
+ },
93
+ exp403: {
94
+ authority: '*',
95
+ name: 'exp403',
96
+ path: '403',
97
+ component: () =>
98
+ import('@vue2-client/pages/exception/403')
99
+ },
100
+ exp404: {
101
+ name: 'exp404',
102
+ path: '404',
103
+ component: () =>
104
+ import('@vue2-client/pages/exception/404')
105
+ },
106
+ exp500: {
107
+ name: 'exp500',
108
+ path: '500',
109
+ component: () =>
110
+ import('@vue2-client/pages/exception/500')
111
+ }
186
112
  }
187
113
  Object.assign(routerMap, routerResource)
188
114
  export default routerMap
@@ -1,214 +1,234 @@
1
- import { post } from '@vue2-client/services/api'
2
-
3
- const DB_CONFIG = {
4
- NAME: window.__MICRO_APP_NAME__ ? `view_${window.__MICRO_APP_NAME__}` : 'view',
5
- STORE_NAME: 'metaCache',
6
- VERSION: 1,
7
- CURRENT_VERSION: 1
8
- }
9
-
10
- class IndexedDBManager {
11
- constructor () {
12
- this.db = undefined
13
- this.locks = {}
14
- this.isInMicroApp = !!window.__MICRO_APP_NAME__
15
- this.microAppName = window.__MICRO_APP_NAME__ || ''
16
- this.indexedDB = window?.rawWindow?.indexedDB || window.indexedDB || window.webkitindexedDB
17
- this.IDBKeyRange = window?.rawWindow?.IDBKeyRange || window.IDBKeyRange || window.webkitIDBKeyRange
18
- }
19
-
20
- async openDatabase () {
21
- try {
22
- return await new Promise((resolve, reject) => {
23
- const checkRequest = this.indexedDB.open(DB_CONFIG.NAME)
24
-
25
- checkRequest.onsuccess = (e) => {
26
- const db = e.target.result
27
- const currentVersion = db.version
28
- db.close()
29
-
30
- DB_CONFIG.CURRENT_VERSION = Math.max(currentVersion, DB_CONFIG.VERSION)
31
- const request = this.indexedDB.open(DB_CONFIG.NAME, DB_CONFIG.CURRENT_VERSION)
32
-
33
- request.onerror = (e) => reject(e.currentTarget.error)
34
-
35
- request.onsuccess = (e) => {
36
- const db = e.target.result
37
- if (!db.objectStoreNames.contains(DB_CONFIG.STORE_NAME)) {
38
- db.close()
39
- DB_CONFIG.CURRENT_VERSION++
40
- this.upgradeDatabase(resolve, reject)
41
- } else {
42
- resolve(db)
43
- }
44
- }
45
-
46
- request.onupgradeneeded = (e) => {
47
- const db = e.target.result
48
- if (!db.objectStoreNames.contains(DB_CONFIG.STORE_NAME)) {
49
- db.createObjectStore(DB_CONFIG.STORE_NAME, { keyPath: 'key' })
50
- }
51
- }
52
- }
53
-
54
- checkRequest.onerror = (e) => reject(e.currentTarget.error)
55
- })
56
- } catch (error) {
57
- console.error('打开数据库失败:', error)
58
- throw error
59
- }
60
- }
61
-
62
- async upgradeDatabase (resolve, reject) {
63
- const request = this.indexedDB.open(DB_CONFIG.NAME, DB_CONFIG.CURRENT_VERSION)
64
-
65
- request.onupgradeneeded = (e) => {
66
- const db = e.target.result
67
- if (!db.objectStoreNames.contains(DB_CONFIG.STORE_NAME)) {
68
- db.createObjectStore(DB_CONFIG.STORE_NAME, { keyPath: 'key' })
69
- }
70
- }
71
-
72
- request.onsuccess = (e) => resolve(e.target.result)
73
- request.onerror = (e) => reject(e.currentTarget.error)
74
- }
75
-
76
- async openDB (callback) {
77
- try {
78
- if (this.db) {
79
- const isAlive = await this.checkConnection()
80
- if (isAlive) {
81
- callback(this.db)
82
- return
83
- }
84
- }
85
-
86
- this.db = await this.openDatabase()
87
- callback(this.db)
88
- } catch (error) {
89
- console.error('数据库操作失败:', error)
90
- if (error.message?.includes('version')) {
91
- await this.recreateDatabase()
92
- callback(this.db)
93
- }
94
- }
95
- }
96
-
97
- async checkConnection () {
98
- try {
99
- const transaction = this.db.transaction([DB_CONFIG.STORE_NAME], 'readwrite')
100
- const store = transaction.objectStore(DB_CONFIG.STORE_NAME)
101
- await this.promisifyRequest(store.add({ key: 'alive', data: true }))
102
- return true
103
- } catch {
104
- return false
105
- }
106
- }
107
-
108
- promisifyRequest (request) {
109
- return new Promise((resolve, reject) => {
110
- request.onsuccess = () => resolve(request.result)
111
- request.onerror = () => reject(request.error)
112
- })
113
- }
114
-
115
- async getByWeb (key, url, params, callback, processFun) {
116
- if (this.locks[key]) {
117
- await this.locks[key]
118
- return this.getByWeb(key, url, params, callback, processFun)
119
- }
120
-
121
- this.locks[key] = (async () => {
122
- try {
123
- const data = await this.getData(key)
124
- if (!data && url) {
125
- const res = await post(url, params)
126
- const processedData = processFun ? processFun(res) : res
127
-
128
- if (process.env.NODE_ENV === 'production' || key !== 'webMobileConfig') {
129
- await this.add(key, processedData)
130
- }
131
-
132
- callback(processedData)
133
- } else {
134
- callback(data)
135
- }
136
- } catch (error) {
137
- console.error('获取数据失败:', error)
138
- if (process.env.NODE_ENV === 'production' && key !== 'webMobileConfig') {
139
- await this.add(key, null)
140
- }
141
- callback(null)
142
- }
143
- })()
144
-
145
- try {
146
- await this.locks[key]
147
- } finally {
148
- delete this.locks[key]
149
- }
150
- }
151
-
152
- async getData (key) {
153
- return new Promise((resolve) => {
154
- this.openDB((db) => {
155
- const store = db.transaction(DB_CONFIG.STORE_NAME, 'readwrite').objectStore(DB_CONFIG.STORE_NAME)
156
- const request = store.get(key)
157
- request.onsuccess = (e) => resolve(e.target.result?.data)
158
- request.onerror = () => resolve(null)
159
- })
160
- })
161
- }
162
-
163
- async add (key, data) {
164
- this.openDB((db) => {
165
- const store = db.transaction(DB_CONFIG.STORE_NAME, 'readwrite').objectStore(DB_CONFIG.STORE_NAME)
166
- const request = store.add({ key, data })
167
- request.onerror = () => this.update(key, data)
168
- })
169
- }
170
-
171
- async update (key, data) {
172
- this.openDB((db) => {
173
- const store = db.transaction(DB_CONFIG.STORE_NAME, 'readwrite').objectStore(DB_CONFIG.STORE_NAME)
174
- const request = store.put({ key, data })
175
- request.onerror = () => console.error('数据更新失败')
176
- })
177
- }
178
-
179
- async delete (key) {
180
- this.openDB((db) => {
181
- const store = db.transaction(DB_CONFIG.STORE_NAME, 'readwrite').objectStore(DB_CONFIG.STORE_NAME)
182
- const request = store.delete(key)
183
- request.onerror = () => console.error('数据删除失败')
184
- })
185
- }
186
-
187
- async clear (callback) {
188
- this.openDB((db) => {
189
- const store = db.transaction(DB_CONFIG.STORE_NAME, 'readwrite').objectStore(DB_CONFIG.STORE_NAME)
190
- const request = store.clear()
191
- request.onerror = () => {
192
- console.error('数据删除失败')
193
- callback()
194
- }
195
- request.onsuccess = () => {
196
- if (typeof callback === 'function') {
197
- callback()
198
- }
199
- }
200
- })
201
- }
202
-
203
- clearCache () {
204
- if (this.indexedDB) {
205
- this.clear(() => {
206
- location.reload()
207
- })
208
- } else {
209
- location.reload()
210
- }
211
- }
212
- }
213
-
214
- export const indexedDB = new IndexedDBManager()
1
+ import { post } from '@vue2-client/services/api'
2
+
3
+ const DB_CONFIG = {
4
+ NAME: window.__MICRO_APP_NAME__ ? `view_${window.__MICRO_APP_NAME__}` : 'view',
5
+ STORE_NAME: 'metaCache',
6
+ VERSION: 1,
7
+ CURRENT_VERSION: 1
8
+ }
9
+
10
+ export class IndexedDBManager {
11
+ constructor () {
12
+ this.db = undefined
13
+ this.locks = {}
14
+ this.isInMicroApp = !!window.__MICRO_APP_NAME__
15
+ this.microAppName = window.__MICRO_APP_NAME__ || ''
16
+ this.indexedDB = window?.rawWindow?.indexedDB || window.indexedDB || window.webkitindexedDB
17
+ this.IDBKeyRange = window?.rawWindow?.IDBKeyRange || window.IDBKeyRange || window.webkitIDBKeyRange
18
+ }
19
+
20
+ async openDatabase () {
21
+ try {
22
+ return await new Promise((resolve, reject) => {
23
+ const checkRequest = this.indexedDB.open(DB_CONFIG.NAME)
24
+
25
+ checkRequest.onsuccess = (e) => {
26
+ const db = e.target.result
27
+ const currentVersion = db.version
28
+ db.close()
29
+
30
+ DB_CONFIG.CURRENT_VERSION = Math.max(currentVersion, DB_CONFIG.VERSION)
31
+ const request = this.indexedDB.open(DB_CONFIG.NAME, DB_CONFIG.CURRENT_VERSION)
32
+
33
+ request.onerror = (e) => reject(e.currentTarget.error)
34
+
35
+ request.onsuccess = (e) => {
36
+ const db = e.target.result
37
+ if (!db.objectStoreNames.contains(DB_CONFIG.STORE_NAME)) {
38
+ db.close()
39
+ DB_CONFIG.CURRENT_VERSION++
40
+ this.upgradeDatabase(resolve, reject)
41
+ } else {
42
+ resolve(db)
43
+ }
44
+ }
45
+
46
+ request.onupgradeneeded = (e) => {
47
+ const db = e.target.result
48
+ if (!db.objectStoreNames.contains(DB_CONFIG.STORE_NAME)) {
49
+ db.createObjectStore(DB_CONFIG.STORE_NAME, { keyPath: 'key' })
50
+ }
51
+ }
52
+ }
53
+
54
+ checkRequest.onerror = (e) => reject(e.currentTarget.error)
55
+ })
56
+ } catch (error) {
57
+ console.error('打开数据库失败:', error)
58
+ throw error
59
+ }
60
+ }
61
+
62
+ async upgradeDatabase (resolve, reject) {
63
+ const request = this.indexedDB.open(DB_CONFIG.NAME, DB_CONFIG.CURRENT_VERSION)
64
+
65
+ request.onupgradeneeded = (e) => {
66
+ const db = e.target.result
67
+ if (!db.objectStoreNames.contains(DB_CONFIG.STORE_NAME)) {
68
+ db.createObjectStore(DB_CONFIG.STORE_NAME, { keyPath: 'key' })
69
+ }
70
+ }
71
+
72
+ request.onsuccess = (e) => resolve(e.target.result)
73
+ request.onerror = (e) => reject(e.currentTarget.error)
74
+ }
75
+
76
+ async openDB (callback) {
77
+ try {
78
+ if (this.db) {
79
+ const isAlive = await this.checkConnection()
80
+ if (isAlive) {
81
+ callback(this.db)
82
+ return
83
+ }
84
+ }
85
+
86
+ this.db = await this.openDatabase()
87
+ callback(this.db)
88
+ } catch (error) {
89
+ console.error('数据库操作失败:', error)
90
+ if (error.message?.includes('version')) {
91
+ await this.recreateDatabase()
92
+ callback(this.db)
93
+ }
94
+ }
95
+ }
96
+
97
+ async checkConnection () {
98
+ try {
99
+ const transaction = this.db.transaction([DB_CONFIG.STORE_NAME], 'readwrite')
100
+ const store = transaction.objectStore(DB_CONFIG.STORE_NAME)
101
+ await this.promisifyRequest(store.add({ key: 'alive', data: true }))
102
+ return true
103
+ } catch {
104
+ return false
105
+ }
106
+ }
107
+
108
+ promisifyRequest (request) {
109
+ return new Promise((resolve, reject) => {
110
+ request.onsuccess = () => resolve(request.result)
111
+ request.onerror = () => reject(request.error)
112
+ })
113
+ }
114
+
115
+ async getByWeb (key, url, params, callback, processFun) {
116
+ if (this.locks[key]) {
117
+ await this.locks[key]
118
+ return this.getByWeb(key, url, params, callback, processFun)
119
+ }
120
+
121
+ this.locks[key] = (async () => {
122
+ try {
123
+ const data = await this.getData(key)
124
+ if (!data && url) {
125
+ const res = await post(url, params)
126
+ const processedData = processFun ? processFun(res) : res
127
+
128
+ if (process.env.NODE_ENV === 'production' || key !== 'webMobileConfig') {
129
+ await this.add(key, processedData)
130
+ }
131
+
132
+ callback(processedData)
133
+ } else {
134
+ callback(data)
135
+ }
136
+ } catch (error) {
137
+ console.error('获取数据失败:', error)
138
+ if (process.env.NODE_ENV === 'production' && key !== 'webMobileConfig') {
139
+ await this.add(key, null)
140
+ }
141
+ callback(null)
142
+ }
143
+ })()
144
+
145
+ try {
146
+ await this.locks[key]
147
+ } finally {
148
+ delete this.locks[key]
149
+ }
150
+ }
151
+
152
+ async getData (key) {
153
+ return new Promise((resolve) => {
154
+ this.openDB((db) => {
155
+ const store = db.transaction(DB_CONFIG.STORE_NAME, 'readwrite').objectStore(DB_CONFIG.STORE_NAME)
156
+ const request = store.get(key)
157
+ request.onsuccess = (e) => resolve(e.target.result?.data)
158
+ request.onerror = () => resolve(null)
159
+ })
160
+ })
161
+ }
162
+
163
+ async add (key, data) {
164
+ this.openDB((db) => {
165
+ const store = db.transaction(DB_CONFIG.STORE_NAME, 'readwrite').objectStore(DB_CONFIG.STORE_NAME)
166
+ const request = store.add({ key, data })
167
+ request.onerror = () => this.update(key, data)
168
+ })
169
+ }
170
+
171
+ async update (key, data) {
172
+ this.openDB((db) => {
173
+ const store = db.transaction(DB_CONFIG.STORE_NAME, 'readwrite').objectStore(DB_CONFIG.STORE_NAME)
174
+ const request = store.put({ key, data })
175
+ request.onerror = () => console.error('数据更新失败')
176
+ })
177
+ }
178
+
179
+ async delete (key) {
180
+ this.openDB((db) => {
181
+ const store = db.transaction(DB_CONFIG.STORE_NAME, 'readwrite').objectStore(DB_CONFIG.STORE_NAME)
182
+ const request = store.delete(key)
183
+ request.onerror = () => console.error('数据删除失败')
184
+ })
185
+ }
186
+
187
+ async clear (callback) {
188
+ this.openDB((db) => {
189
+ const store = db.transaction(DB_CONFIG.STORE_NAME, 'readwrite').objectStore(DB_CONFIG.STORE_NAME)
190
+ const request = store.clear()
191
+ request.onerror = () => {
192
+ console.error('数据删除失败')
193
+ callback()
194
+ }
195
+ request.onsuccess = () => {
196
+ if (typeof callback === 'function') {
197
+ callback()
198
+ }
199
+ }
200
+ })
201
+ }
202
+
203
+ clearCache () {
204
+ if (this.indexedDB) {
205
+ this.clear(() => {
206
+ location.reload()
207
+ })
208
+ } else {
209
+ location.reload()
210
+ }
211
+ }
212
+
213
+ async getAll () {
214
+ return new Promise((resolve, reject) => {
215
+ this.openDB((db) => {
216
+ const store = db.transaction(DB_CONFIG.STORE_NAME, 'readonly').objectStore(DB_CONFIG.STORE_NAME)
217
+ const request = store.getAll()
218
+ request.onsuccess = (e) => resolve(e.target.result)
219
+ request.onerror = (e) => reject(e.target.error)
220
+ })
221
+ })
222
+ }
223
+
224
+ getAllLegacy (callback) {
225
+ this.openDB((res) => {
226
+ const store = res.transaction(DB_CONFIG.STORE_NAME, 'readonly').objectStore(DB_CONFIG.STORE_NAME)
227
+ const request = store.getAll()
228
+ request.onerror = (e) => callback(null, e.target.error)
229
+ request.onsuccess = (e) => callback(e.target.result)
230
+ })
231
+ }
232
+ }
233
+
234
+ export const indexedDB = new IndexedDBManager()
@@ -1,91 +1,92 @@
1
- const { cssResolve } = require('../config/replacer')
2
- // 修正 webpack-theme-color-replacer 插件提取的 css 结果
3
- function resolveCss (output, srcArr) {
4
- const regExps = []
5
- // 提取 resolve 配置中所有的正则配置
6
- Object.keys(cssResolve).forEach(key => {
7
- let isRegExp
8
- let reg = {}
9
- try {
10
- reg = eval(key)
11
- isRegExp = reg instanceof RegExp
12
- } catch (e) {
13
- isRegExp = false
14
- }
15
- if (isRegExp) {
16
- regExps.push([reg, cssResolve[key]])
17
- }
18
- })
19
-
20
- // 去重
21
- srcArr = dropDuplicate(srcArr)
22
-
23
- // 处理 css
24
- const outArr = []
25
- srcArr.forEach(text => {
26
- // 转换为 css 对象
27
- const cssObj = parseCssObj(text)
28
- // 根据selector匹配配置,匹配成功,则按配置处理 css
29
- if (cssResolve[cssObj.selector] !== undefined) {
30
- const cfg = cssResolve[cssObj.selector]
31
- if (cfg) {
32
- outArr.push(cfg.resolve(text, cssObj))
33
- }
34
- } else {
35
- let cssText = ''
36
- // 匹配不成功,则测试是否有匹配的正则配置,有则按正则对应的配置处理
37
- for (const regExp of regExps) {
38
- if (regExp[0].test(cssObj.selector)) {
39
- const cssCfg = regExp[1]
40
- cssText = cssCfg ? cssCfg.resolve(text, cssObj) : ''
41
- break
42
- }
43
- // 未匹配到正则,则设置 cssText 为默认的 css(即不处理)
44
- cssText = text
45
- }
46
- if (cssText !== '') {
47
- outArr.push(cssText)
48
- }
49
- }
50
- })
51
- output = outArr.join('\n')
52
- return output
53
- }
54
-
55
- // 数组去重
56
- function dropDuplicate (arr) {
57
- const map = {}
58
- const r = []
59
- for (const s of arr) {
60
- if (!map[s]) {
61
- r.push(s)
62
- map[s] = 1
63
- }
64
- }
65
- return r
66
- }
67
-
68
- /**
69
- * 从字符串解析 css 对象
70
- * @param cssText
71
- * @returns {{
72
- * name: String,
73
- * rules: Array[String],
74
- * toText: function
75
- * }}
76
- */
77
- function parseCssObj (cssText) {
78
- const css = {}
79
- const ruleIndex = cssText.indexOf('{')
80
- css.selector = cssText.substring(0, ruleIndex)
81
- const ruleBody = cssText.substring(ruleIndex + 1, cssText.length - 1)
82
- css.rules = ruleBody.split(';')
83
- css.toText = function () {
84
- let body = ''
85
- this.rules.forEach(item => { body += item + ';' })
86
- return `${this.selector}{${body}}`
87
- }
88
- return css
89
- }
90
-
91
- module.exports = { resolveCss }
1
+ const { cssResolve } = require('../config/replacer')
2
+ // 修正 webpack-theme-color-replacer 插件提取的 css 结果
3
+ function resolveCss (output, srcArr) {
4
+ const regExps = []
5
+ // 提取 resolve 配置中所有的正则配置
6
+ Object.keys(cssResolve).forEach(key => {
7
+ let isRegExp
8
+ let reg = {}
9
+ try {
10
+ // eslint-disable-next-line no-eval
11
+ reg = eval(key)
12
+ isRegExp = reg instanceof RegExp
13
+ } catch (e) {
14
+ isRegExp = false
15
+ }
16
+ if (isRegExp) {
17
+ regExps.push([reg, cssResolve[key]])
18
+ }
19
+ })
20
+
21
+ // 去重
22
+ srcArr = dropDuplicate(srcArr)
23
+
24
+ // 处理 css
25
+ const outArr = []
26
+ srcArr.forEach(text => {
27
+ // 转换为 css 对象
28
+ const cssObj = parseCssObj(text)
29
+ // 根据selector匹配配置,匹配成功,则按配置处理 css
30
+ if (cssResolve[cssObj.selector] !== undefined) {
31
+ const cfg = cssResolve[cssObj.selector]
32
+ if (cfg) {
33
+ outArr.push(cfg.resolve(text, cssObj))
34
+ }
35
+ } else {
36
+ let cssText = ''
37
+ // 匹配不成功,则测试是否有匹配的正则配置,有则按正则对应的配置处理
38
+ for (const regExp of regExps) {
39
+ if (regExp[0].test(cssObj.selector)) {
40
+ const cssCfg = regExp[1]
41
+ cssText = cssCfg ? cssCfg.resolve(text, cssObj) : ''
42
+ break
43
+ }
44
+ // 未匹配到正则,则设置 cssText 为默认的 css(即不处理)
45
+ cssText = text
46
+ }
47
+ if (cssText !== '') {
48
+ outArr.push(cssText)
49
+ }
50
+ }
51
+ })
52
+ output = outArr.join('\n')
53
+ return output
54
+ }
55
+
56
+ // 数组去重
57
+ function dropDuplicate (arr) {
58
+ const map = {}
59
+ const r = []
60
+ for (const s of arr) {
61
+ if (!map[s]) {
62
+ r.push(s)
63
+ map[s] = 1
64
+ }
65
+ }
66
+ return r
67
+ }
68
+
69
+ /**
70
+ * 从字符串解析 css 对象
71
+ * @param cssText
72
+ * @returns {{
73
+ * name: String,
74
+ * rules: Array[String],
75
+ * toText: function
76
+ * }}
77
+ */
78
+ function parseCssObj (cssText) {
79
+ const css = {}
80
+ const ruleIndex = cssText.indexOf('{')
81
+ css.selector = cssText.substring(0, ruleIndex)
82
+ const ruleBody = cssText.substring(ruleIndex + 1, cssText.length - 1)
83
+ css.rules = ruleBody.split(';')
84
+ css.toText = function () {
85
+ let body = ''
86
+ this.rules.forEach(item => { body += item + ';' })
87
+ return `${this.selector}{${body}}`
88
+ }
89
+ return css
90
+ }
91
+
92
+ module.exports = { resolveCss }