@tongfun/tf-widget 0.1.26 → 0.1.29
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/README.md +23 -2
- package/lib/tf-widget.common.js +168 -127
- package/lib/tf-widget.css +1 -1
- package/lib/tf-widget.umd.js +168 -127
- package/lib/tf-widget.umd.min.js +3 -3
- package/package/t-data-list/main.vue +1 -1
- package/package/t-input/children/basic.vue +16 -10
- package/package/t-input/children/group.vue +2 -2
- package/package/tf-widget/src/children/basic-data/basic-data.vue +5 -0
- package/package.json +2 -2
- package/src/api/edit.js +0 -97
- package/src/api/file-enclosure.js +0 -26
- package/src/api/push-down.js +0 -19
- package/src/api/table.js +0 -294
- package/src/api/tableV3.js +0 -166
- package/src/assets/images/icons/index.js +0 -9
- package/src/assets/images/icons/svg/add.svg +0 -5
- package/src/assets/images/icons/svg/push-down.svg +0 -2
- package/src/assets/images/icons/svg/remove.svg +0 -1
- package/src/assets/images/icons/svg/table-empty.svg +0 -1
- package/src/assets/styles/common-table.less +0 -202
- package/src/directives/debounce.js +0 -24
- package/src/index.js +0 -31
- package/src/mixins/t-data-query-mixin.js +0 -290
- package/src/utils/auth.js +0 -22
- package/src/utils/request.js +0 -42
- package/src/utils/stato-anormale.js +0 -59
- package/src/utils/utils.js +0 -109
- package/src/utils/validate.js +0 -84
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
import { getTableData, getTableSum, getTableLayout } from '@/api/tableV3.js'
|
|
2
|
-
import { getOperator } from '../../package/t-data-list/src/js/util'
|
|
3
|
-
export default {
|
|
4
|
-
data () {
|
|
5
|
-
return {
|
|
6
|
-
/**
|
|
7
|
-
* 通用过滤查询参数
|
|
8
|
-
*/
|
|
9
|
-
// 被指定为搜索建议的查询的字段列表
|
|
10
|
-
suggestFieldList: [],
|
|
11
|
-
// 搜索建议的高级条件
|
|
12
|
-
searchSuggestCondition: [],
|
|
13
|
-
// 方案切换的高级条件
|
|
14
|
-
queryPlanCondition: [],
|
|
15
|
-
|
|
16
|
-
// 数据查询接口的参数
|
|
17
|
-
query: {
|
|
18
|
-
// 常用条件
|
|
19
|
-
conditionAlwaysList: [],
|
|
20
|
-
// 分组条件
|
|
21
|
-
conditionGroup: null,
|
|
22
|
-
// 高级过滤条件
|
|
23
|
-
conditionMultiList: [],
|
|
24
|
-
// 表头的过滤条件
|
|
25
|
-
conditionQuickList: [],
|
|
26
|
-
// 分页条件
|
|
27
|
-
pageNum: 1,
|
|
28
|
-
pageSize: 200
|
|
29
|
-
},
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* 数据查询结果相关
|
|
33
|
-
*/
|
|
34
|
-
// 列表的字段信息(表头,可能包含了表头过滤的配置信息和其他的布局信息)
|
|
35
|
-
tableLayout: [],
|
|
36
|
-
// 列表数据
|
|
37
|
-
tableData: {
|
|
38
|
-
total: 1,
|
|
39
|
-
records: []
|
|
40
|
-
},
|
|
41
|
-
// 列表底部合计
|
|
42
|
-
tableSum: ['合计'],
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* 列表操作过程中使用组件变量
|
|
46
|
-
*/
|
|
47
|
-
// 被标记为id的字段,这个属性只在弹窗中才被使用
|
|
48
|
-
// 但是因为获取布局依赖了这个属性所以提取为公共属性,但是只有弹窗中才被使用
|
|
49
|
-
idField: null,
|
|
50
|
-
// 列表选中行的完整数据
|
|
51
|
-
selectedRows: [],
|
|
52
|
-
// 列表选中行的id数组
|
|
53
|
-
ids: [],
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* 通过provie传递全局数据
|
|
57
|
-
*/
|
|
58
|
-
syncData: {
|
|
59
|
-
displayField: '',
|
|
60
|
-
tableLoading: false,
|
|
61
|
-
tableSelectionClear: true // 表格数据刷新之后是否清空已选的标识
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
},
|
|
65
|
-
computed: {
|
|
66
|
-
/**
|
|
67
|
-
* 高级过滤条件由多个条件来源的数据拼凑而成,使用计算属性来达到缓存的目的
|
|
68
|
-
* 且无法确定需求上的变动是否需要动态让某个来源的条件消失,所以更改为计算属性
|
|
69
|
-
* 来源如下:
|
|
70
|
-
* 搜索建议和右上角复用搜索建议的接口的搜索框拼凑的高级过滤条件
|
|
71
|
-
* 来自限定搜索范围的条件生成的高级过滤条件
|
|
72
|
-
* 来自方案中填写点击查询按钮,或者进行切换方案的时候产生高级过滤条件
|
|
73
|
-
*/
|
|
74
|
-
multiCondition () {
|
|
75
|
-
const multiResult = []
|
|
76
|
-
// 拼接方案中的高级过滤条件
|
|
77
|
-
multiResult.push(...this.queryPlanCondition)
|
|
78
|
-
// 拼接限定查询的条件
|
|
79
|
-
multiResult.push(...this.limitationCondition)
|
|
80
|
-
|
|
81
|
-
// 搜索建议永远被拼接到最后面
|
|
82
|
-
// 并且在前面有条件的时候,将搜索建议的条件用双层括号整个进行包裹((a)(b))
|
|
83
|
-
// 避免后端sql 优先级问题导致结果不准确
|
|
84
|
-
const stillEmpty = multiResult.length === 0
|
|
85
|
-
this.searchSuggestCondition.forEach((item, index) => {
|
|
86
|
-
if (index === 0) {
|
|
87
|
-
item.leftBracket = stillEmpty ? '(' : '(('
|
|
88
|
-
}
|
|
89
|
-
if (index === multiResult.length - 1) {
|
|
90
|
-
item.rightBracket = stillEmpty ? ')' : '))'
|
|
91
|
-
}
|
|
92
|
-
})
|
|
93
|
-
multiResult.push(...this.searchSuggestCondition)
|
|
94
|
-
|
|
95
|
-
// 处理条件的排序的序号
|
|
96
|
-
multiResult.forEach((item, index) => {
|
|
97
|
-
item.sort = index
|
|
98
|
-
})
|
|
99
|
-
return multiResult
|
|
100
|
-
},
|
|
101
|
-
// 限定查询范围的条件
|
|
102
|
-
limitationCondition () {
|
|
103
|
-
if (!this.limitation) {
|
|
104
|
-
return []
|
|
105
|
-
}
|
|
106
|
-
const result = []
|
|
107
|
-
for (const key in this.limitation) {
|
|
108
|
-
const fieldItem = this.tableLayout.find(v => v.field === key)
|
|
109
|
-
if (!fieldItem) continue
|
|
110
|
-
|
|
111
|
-
let value = ''
|
|
112
|
-
if (fieldItem.componentValueType === 'PARAM_BASIC') {
|
|
113
|
-
value = this.limitation[key]?.name
|
|
114
|
-
} else if (fieldItem.componentValueType === 'PARAM_ENUM') {
|
|
115
|
-
value = this.limitation[key]?.id
|
|
116
|
-
} else {
|
|
117
|
-
value = this.limitation[key]
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
value && result.push(this.createMultiCondition(fieldItem, value))
|
|
121
|
-
}
|
|
122
|
-
return result
|
|
123
|
-
}
|
|
124
|
-
},
|
|
125
|
-
provide () {
|
|
126
|
-
return {
|
|
127
|
-
getDbRow: this.getDbRow,
|
|
128
|
-
target: this.target,
|
|
129
|
-
enumOptionCache: {},
|
|
130
|
-
selectedRows: this.selectedRows,
|
|
131
|
-
ids: this.ids,
|
|
132
|
-
showSummary: this.queryType === 'LIST',
|
|
133
|
-
syncData: this.syncData,
|
|
134
|
-
queryType: this.queryType
|
|
135
|
-
}
|
|
136
|
-
},
|
|
137
|
-
methods: {
|
|
138
|
-
/**
|
|
139
|
-
* 获取表单的布局
|
|
140
|
-
*/
|
|
141
|
-
async getTableLayout () {
|
|
142
|
-
const res = await getTableLayout(this.target)
|
|
143
|
-
if (res.code !== 0) {
|
|
144
|
-
return this.$message.error(res.msg)
|
|
145
|
-
}
|
|
146
|
-
this.tableLayout = res.data.sort((a, b) => a.sort - b.sort)
|
|
147
|
-
this.suggestFieldList = res.data.filter(item => item.isSuggest)
|
|
148
|
-
this.displayField = this.syncData.displayField = res.data.find(item => item.isDisplayField)?.field
|
|
149
|
-
this.idField = res.data.find(item => item.isId).field
|
|
150
|
-
},
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* 列表数据
|
|
154
|
-
* 获取列表数据有三个地方进行调用
|
|
155
|
-
* 1 搜索建议: 场景为SELECTOR ,不获取合计
|
|
156
|
-
* 2 列表中数据查询:使场景为LIST, 获取合计
|
|
157
|
-
* 3 弹窗中数据: 场景为SELECTOR,不获取合计
|
|
158
|
-
*
|
|
159
|
-
* 关于是否获取合计,还有一层判断来自获取合计的借口对场景进行判断
|
|
160
|
-
* 此函数的判断只判断针对翻页页码变化这类不获取合计,至于弹窗中还是列表中的判断,在获取合计的借口中进行判断
|
|
161
|
-
*/
|
|
162
|
-
async getTableData (isSuggest = false, getSum = false) {
|
|
163
|
-
if (!isSuggest) {
|
|
164
|
-
this.syncData.tableLoading = true
|
|
165
|
-
}
|
|
166
|
-
const queryParams = !isSuggest
|
|
167
|
-
? JSON.parse(JSON.stringify(this.query))
|
|
168
|
-
: {
|
|
169
|
-
conditionAlwaysList: [],
|
|
170
|
-
conditionGroup: null,
|
|
171
|
-
conditionMultiList: [],
|
|
172
|
-
conditionQuickList: [],
|
|
173
|
-
pageNum: 1,
|
|
174
|
-
pageSize: 20
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
this.enableSum && getSum && await this.getTableSum()
|
|
178
|
-
try {
|
|
179
|
-
// 查询数据之前赋值高级过滤条件
|
|
180
|
-
queryParams.conditionMultiList = this.multiCondition
|
|
181
|
-
const res = await getTableData(this.target, queryParams, this.queryType)
|
|
182
|
-
if (res.code !== 0) {
|
|
183
|
-
this.$message.error(res.msg)
|
|
184
|
-
this.syncData.tableSelectionClear = true
|
|
185
|
-
return !isSuggest ? undefined : []
|
|
186
|
-
}
|
|
187
|
-
if (isSuggest) {
|
|
188
|
-
return res.data.record
|
|
189
|
-
}
|
|
190
|
-
this.tableData.total = Number(res.data.total)
|
|
191
|
-
this.tableData.records = res.data.record
|
|
192
|
-
} catch (err) {
|
|
193
|
-
// 恢复成默认值
|
|
194
|
-
this.syncData.tableSelectionClear = true
|
|
195
|
-
} finally {
|
|
196
|
-
this.syncData.tableLoading = false
|
|
197
|
-
}
|
|
198
|
-
},
|
|
199
|
-
// 表格数据合计
|
|
200
|
-
async getTableSum () {
|
|
201
|
-
// 只有列表中显示合计,
|
|
202
|
-
if (this.queryType !== 'LIST') {
|
|
203
|
-
return
|
|
204
|
-
}
|
|
205
|
-
const params = JSON.parse(JSON.stringify(this.query))
|
|
206
|
-
delete params.pageNum
|
|
207
|
-
delete params.pageSize
|
|
208
|
-
params.conditionMultiList = this.multiCondition
|
|
209
|
-
const res = await getTableSum(this.target, params)
|
|
210
|
-
if (res.code !== 0) {
|
|
211
|
-
return this.$message.error(res.msg)
|
|
212
|
-
}
|
|
213
|
-
// 没有合计的时候后端返回空对象,有数据该对象只有一个sum属性
|
|
214
|
-
if (!res.data.sum) {
|
|
215
|
-
return
|
|
216
|
-
}
|
|
217
|
-
const sumData = res.data.sum
|
|
218
|
-
const sumArr = ['合计']
|
|
219
|
-
const tableVisibleColumn = this.tableLayout.filter(item => item.visible)
|
|
220
|
-
for (const key in sumData) {
|
|
221
|
-
const index = tableVisibleColumn.findIndex(item => item.field === key)
|
|
222
|
-
sumArr[index + 1] = sumData[key]
|
|
223
|
-
}
|
|
224
|
-
this.tableSum = sumArr
|
|
225
|
-
},
|
|
226
|
-
/**
|
|
227
|
-
* 处理条件变更和重新获取数据的逻辑
|
|
228
|
-
* @param {boolean} queryString 用户输入的内容
|
|
229
|
-
* @param {boolean} isList 分为两个场景,1:列表和弹窗中输入框 2:弹窗未打开之前的如输入框中搜索建议
|
|
230
|
-
*/
|
|
231
|
-
// 基础资料搜索建议和列表页面右上角的搜索输入框的条件处理
|
|
232
|
-
handleSuggestMultiCondition (queryString, isList = true) {
|
|
233
|
-
const conditionMultiList = []
|
|
234
|
-
for (const item of this.suggestFieldList) {
|
|
235
|
-
conditionMultiList.push(this.createMultiCondition(item, queryString, false, false))
|
|
236
|
-
}
|
|
237
|
-
this.searchSuggestCondition = conditionMultiList
|
|
238
|
-
// todo: 列表和弹窗 还有一个子分类,弹窗不进行合计调用
|
|
239
|
-
!isList
|
|
240
|
-
? this.getTableData(true, false)
|
|
241
|
-
: this.queryType === 'LIST'
|
|
242
|
-
? this.getTableData(false, true)
|
|
243
|
-
: this.getTableData(false, false)
|
|
244
|
-
},
|
|
245
|
-
/**
|
|
246
|
-
* 创建一个高级过滤条件
|
|
247
|
-
* @param {object} fieldObj 后端传递给前端的列表布局中一个字段的配置信息
|
|
248
|
-
* @param {*} value 高级过滤条件字段
|
|
249
|
-
* @param {boolean} isStrict 条件是否是严格匹配 "等于" 否则采用模糊匹配 "包含"
|
|
250
|
-
* @param {boolean} isAndRelation and还是or sql中多个条件的分隔符号
|
|
251
|
-
* @returns
|
|
252
|
-
*/
|
|
253
|
-
createMultiCondition (fieldObj, value, isStrict = true, isAndRelation = true) {
|
|
254
|
-
// isSuggest
|
|
255
|
-
const relation = isAndRelation ? 'AND' : 'OR'
|
|
256
|
-
const operator = getOperator(fieldObj.componentValueType, isStrict)?.value
|
|
257
|
-
return {
|
|
258
|
-
leftBracket: '(',
|
|
259
|
-
field: fieldObj.field,
|
|
260
|
-
fieldType: fieldObj.componentType,
|
|
261
|
-
operator,
|
|
262
|
-
sort: '',
|
|
263
|
-
value,
|
|
264
|
-
rightBracket: ')',
|
|
265
|
-
relation
|
|
266
|
-
}
|
|
267
|
-
},
|
|
268
|
-
// 每页条数变化
|
|
269
|
-
handleSizeChange (newSize) {
|
|
270
|
-
this.query.pageSize = newSize
|
|
271
|
-
this.query.pageNum = 1
|
|
272
|
-
this.getTableData(false, false)
|
|
273
|
-
},
|
|
274
|
-
// 翻页
|
|
275
|
-
handleCurrentChange (newNum) {
|
|
276
|
-
this.query.pageNum = newNum
|
|
277
|
-
this.getTableData(false, false)
|
|
278
|
-
},
|
|
279
|
-
// 分组条件改变
|
|
280
|
-
handleGroupChange (group) {
|
|
281
|
-
this.query.conditionGroup = group
|
|
282
|
-
this.getTableData(false, true)
|
|
283
|
-
},
|
|
284
|
-
// 表头快捷过滤条件变更
|
|
285
|
-
handleHeadChange (newHeadCondition) {
|
|
286
|
-
this.query.conditionQuickList = newHeadCondition
|
|
287
|
-
this.getTableData(false, true)
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
}
|
package/src/utils/auth.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
const TOKEN = 'token' // 用户token
|
|
2
|
-
// const RETOKEN = 'RefreshToken' // 刷线token
|
|
3
|
-
|
|
4
|
-
// 设置用户token
|
|
5
|
-
export function setToken (token) {
|
|
6
|
-
localStorage.setItem(TOKEN, token)
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
// 清除用户token
|
|
10
|
-
export function removeToken () {
|
|
11
|
-
localStorage.removeItem(TOKEN)
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
// 更新token
|
|
15
|
-
export function changeToken (token) {
|
|
16
|
-
localStorage.setItem(TOKEN, token)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// 获取用户token
|
|
20
|
-
export function getToken () {
|
|
21
|
-
return localStorage.getItem(TOKEN)
|
|
22
|
-
}
|
package/src/utils/request.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import axios from 'axios'
|
|
2
|
-
import { statusCode } from './stato-anormale'
|
|
3
|
-
import { Base64 } from 'js-base64'
|
|
4
|
-
import { getToken } from '@/utils/auth'
|
|
5
|
-
import { Message } from 'element-ui'
|
|
6
|
-
const clientId = 'tongfuncloud_web'
|
|
7
|
-
const clientSecret = 'tongfuncloud_web_secret'
|
|
8
|
-
axios.defaults.headers['Content-type'] = 'application/json'
|
|
9
|
-
|
|
10
|
-
const service = axios.create({
|
|
11
|
-
withCredentials: true, // send cookies when cross-domain requests
|
|
12
|
-
timeout: 15000 // request timeout
|
|
13
|
-
})
|
|
14
|
-
// request interceptor
|
|
15
|
-
service.interceptors.request.use(
|
|
16
|
-
config => {
|
|
17
|
-
config.headers['client-type'] = 'WEB'
|
|
18
|
-
config.headers.token = 'Bearer ' + getToken()
|
|
19
|
-
config.headers.Authorization = `Basic ${Base64.encode(`${clientId}:${clientSecret}`)}`
|
|
20
|
-
// 测试组件时使用下方头部信息,过期则修改后再测试
|
|
21
|
-
// config.headers.token = 'Bearer eyJ0eXAiOiJKc29uV2ViVG9rZW4iLCJhbGciOiJIUzI1NiJ9.eyJtb2JpbGUiOiIxMzE1MTYyODY1NyIsIm5hbWUiOiLmnLHmmI7mmI4iLCJ0b2tlbl90eXBlIjoidG9rZW4iLCJwVXNlcmlkIjoiMTM2ODg0NjcxOTU3OTU4NjU2MSIsInVzZXJpZCI6IjE0MTczNjg0NjMwODg4MTIwMzIiLCJ0ZW5hbnQiOiIwMDAxIiwiYWNjb3VudCI6InpodW1pbmdtaW5nIiwiaWF0IjoxNjM2MDgxNzM1LCJuYmYiOjE2MzYwODE3MzUsImV4cCI6MTYzNjExMDUzNX0.TTSbWUYTOd6znNko8sNyKz9KqLyeyO5AC4WgBvVNvBo'
|
|
22
|
-
// config.headers.Authorization = 'Basic dG9uZ2Z1bmNsb3VkX3dlYjp0b25nZnVuY2xvdWRfd2ViX3NlY3JldA=='
|
|
23
|
-
return config
|
|
24
|
-
},
|
|
25
|
-
error => {
|
|
26
|
-
return Promise.reject(error)
|
|
27
|
-
}
|
|
28
|
-
)
|
|
29
|
-
service.interceptors.response.use(
|
|
30
|
-
response => {
|
|
31
|
-
return response.data
|
|
32
|
-
},
|
|
33
|
-
error => {
|
|
34
|
-
const { response } = error
|
|
35
|
-
if (response.status === 400) {
|
|
36
|
-
return Message.error(response.data.msg)
|
|
37
|
-
}
|
|
38
|
-
if (statusCode[response.data.code]) Message.error(statusCode[response.data.code])
|
|
39
|
-
}
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
export default service
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
export const statusCode = {
|
|
2
|
-
'-2': '系统繁忙~请稍后再试~',
|
|
3
|
-
'-3': '参数类型解析异常',
|
|
4
|
-
'-4': '运行SQL出现异常',
|
|
5
|
-
'-5': '空指针异常',
|
|
6
|
-
'-6': '无效参数异常',
|
|
7
|
-
'-7': '请求类型异常',
|
|
8
|
-
'-8': '加载资源出错',
|
|
9
|
-
'-9': '统一验证参数异常',
|
|
10
|
-
'-10': '操作异常',
|
|
11
|
-
'-11': 'Mapper类转换异常',
|
|
12
|
-
'-12': '验证码校验失败',
|
|
13
|
-
'-13': 'JSON解析异常',
|
|
14
|
-
401: '未认证',
|
|
15
|
-
403: '被禁止',
|
|
16
|
-
404: '未找到资源',
|
|
17
|
-
405: '不支持当前请求类型',
|
|
18
|
-
429: '请求超过次数限制',
|
|
19
|
-
500: '内部服务错误',
|
|
20
|
-
502: '网关出错啦!',
|
|
21
|
-
504: '请求网关超时',
|
|
22
|
-
1001: '请求中必须至少包含一个有效文件',
|
|
23
|
-
2000: '新增数据失败!',
|
|
24
|
-
2001: '修改数据失败!',
|
|
25
|
-
2002: '批量新增数据过多!',
|
|
26
|
-
40000: '无效的基本身份验证令牌',
|
|
27
|
-
40001: '会话超时,请重新登录!',
|
|
28
|
-
40002: '不合法的token,请认真比对 token 的签名!',
|
|
29
|
-
40003: '缺少token参数!',
|
|
30
|
-
40004: '生成token失败!',
|
|
31
|
-
40005: '解析用户身份错误,请重新登录!',
|
|
32
|
-
40006: '用户名或密码错误!',
|
|
33
|
-
40007: '用户已经被禁用!',
|
|
34
|
-
40008: '您已在另一个设备登录!',
|
|
35
|
-
40009: '请先登录!',
|
|
36
|
-
40029: '无效的oauth_code!',
|
|
37
|
-
41027: '账号与密码不匹配,请重新输入!',
|
|
38
|
-
41028: '该账户已被禁用,请联系平台客服!',
|
|
39
|
-
41029: '用户不存在!',
|
|
40
|
-
41030: '参数异常!',
|
|
41
|
-
41031: '注册方式错误!',
|
|
42
|
-
41032: '用户已存在但未认证!',
|
|
43
|
-
41034: '手机号已被其他用户绑定!',
|
|
44
|
-
41035: '短信验证码输入错误!',
|
|
45
|
-
41036: '邮箱验证码输入错误!',
|
|
46
|
-
41037: '图形验证码验证错误!',
|
|
47
|
-
41040: '新增数据失败!',
|
|
48
|
-
41041: '修改数据失败!',
|
|
49
|
-
41042: '身份证号码不合法!',
|
|
50
|
-
41043: '用户实名认证次数超过限制,请联系客服!',
|
|
51
|
-
41044: '该身份证号码已被绑定,请联系客服!',
|
|
52
|
-
41045: '身份验证失败!',
|
|
53
|
-
41046: '姓名和身份证号不一致!',
|
|
54
|
-
41100: '该企业中不存在你的用户信息,请核实你的租户信息!',
|
|
55
|
-
41101: '你已被所在的租户禁止进入!',
|
|
56
|
-
41105: '租户信息不存在!',
|
|
57
|
-
49000: 'token转换获取失败!',
|
|
58
|
-
49001: '验证码错误!'
|
|
59
|
-
}
|
package/src/utils/utils.js
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
const util = (function util () {
|
|
2
|
-
'use strict'
|
|
3
|
-
/**
|
|
4
|
-
* @method
|
|
5
|
-
* @description 函数防抖
|
|
6
|
-
* @param func 防抖函数
|
|
7
|
-
* @param wait 函数出发时间间隔
|
|
8
|
-
* @param immediate 何时触发函数
|
|
9
|
-
* @returns {function(): *}
|
|
10
|
-
*/
|
|
11
|
-
function debounce (func, wait, immediate) {
|
|
12
|
-
if (typeof func !== 'function') throw new TypeError('func must be a function!')
|
|
13
|
-
if (typeof wait === 'undefined') {
|
|
14
|
-
wait = 500
|
|
15
|
-
immediate = false
|
|
16
|
-
}
|
|
17
|
-
if (typeof wait === 'boolean') {
|
|
18
|
-
immediate = wait
|
|
19
|
-
wait = 500
|
|
20
|
-
}
|
|
21
|
-
if (typeof wait !== 'number') throw new TypeError('wait must be a number!')
|
|
22
|
-
if (typeof immediate !== 'boolean') throw new TypeError('immediate must be a boolean!')
|
|
23
|
-
|
|
24
|
-
var timer = null
|
|
25
|
-
var result
|
|
26
|
-
return function proxy () {
|
|
27
|
-
var self = this
|
|
28
|
-
var params = [].slice.call(arguments)
|
|
29
|
-
var callNow = !timer && immediate
|
|
30
|
-
if (timer) clearTimeout(timer)
|
|
31
|
-
timer = setTimeout(function () {
|
|
32
|
-
// 清除最后一次定时器
|
|
33
|
-
clearTimeout(timer)
|
|
34
|
-
timer = null
|
|
35
|
-
if (!immediate) result = func.apply(self, params)
|
|
36
|
-
}, wait)
|
|
37
|
-
// 符合第一次立即执行「触发在开始的边界」
|
|
38
|
-
if (callNow) result = func.apply(self, params)
|
|
39
|
-
return result
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* @method
|
|
45
|
-
* @description 函数节流
|
|
46
|
-
* @param func 节流函数
|
|
47
|
-
* @param wait 等待执行时间
|
|
48
|
-
* @returns {function(): (*)}
|
|
49
|
-
*/
|
|
50
|
-
function throttle (func, wait) {
|
|
51
|
-
if (typeof func !== 'function') throw new TypeError('func must be a function!')
|
|
52
|
-
wait = +wait
|
|
53
|
-
if (isNaN(wait)) wait = 300
|
|
54
|
-
var timer = null
|
|
55
|
-
var previous = 0
|
|
56
|
-
var result
|
|
57
|
-
return function proxy () {
|
|
58
|
-
var self = this
|
|
59
|
-
var params = [].slice.call(arguments)
|
|
60
|
-
var now = +new Date()
|
|
61
|
-
var remaining = wait - (now - previous)
|
|
62
|
-
if (remaining <= 0) {
|
|
63
|
-
// 两次间隔时间已经超过WAIT了,此时我们立即执行
|
|
64
|
-
if (timer) {
|
|
65
|
-
clearTimeout(timer)
|
|
66
|
-
timer = null
|
|
67
|
-
}
|
|
68
|
-
previous = now
|
|
69
|
-
result = func.apply(self, params)
|
|
70
|
-
return result
|
|
71
|
-
}
|
|
72
|
-
if (!timer) {
|
|
73
|
-
timer = setTimeout(function () {
|
|
74
|
-
clearTimeout(timer)
|
|
75
|
-
timer = null
|
|
76
|
-
previous = +new Date()
|
|
77
|
-
result = func.apply(self, params)
|
|
78
|
-
}, remaining)
|
|
79
|
-
}
|
|
80
|
-
return result
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
function randomNum (len, radix) {
|
|
84
|
-
const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
|
|
85
|
-
const uuid = []
|
|
86
|
-
radix = radix || chars.length
|
|
87
|
-
if (len) {
|
|
88
|
-
for (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix]
|
|
89
|
-
} else {
|
|
90
|
-
let r
|
|
91
|
-
uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'
|
|
92
|
-
uuid[14] = '4'
|
|
93
|
-
for (let i = 0; i < 36; i++) {
|
|
94
|
-
if (!uuid[i]) {
|
|
95
|
-
r = 0 | Math.random() * 16
|
|
96
|
-
uuid[i] = chars[(i === 19) ? (r & 0x3) | 0x8 : r]
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
return uuid.join('') + new Date().getTime()
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return {
|
|
104
|
-
debounce,
|
|
105
|
-
throttle,
|
|
106
|
-
randomNum
|
|
107
|
-
}
|
|
108
|
-
})()
|
|
109
|
-
export default util
|
package/src/utils/validate.js
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
/* eslint-disable */
|
|
2
|
-
/**
|
|
3
|
-
* @param {string} path
|
|
4
|
-
* @returns {Boolean}
|
|
5
|
-
*/
|
|
6
|
-
export function isExternal (path) {
|
|
7
|
-
return /^(https?:|mailto:|tel:)/.test(path)
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* @param {string} str
|
|
12
|
-
* @returns {Boolean}
|
|
13
|
-
*/
|
|
14
|
-
export function validUsername (str) {
|
|
15
|
-
const valid_map = ['admin', 'editor']
|
|
16
|
-
return valid_map.indexOf(str.trim()) >= 0
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* @param {string} url
|
|
21
|
-
* @returns {Boolean}
|
|
22
|
-
*/
|
|
23
|
-
export function validURL (url) {
|
|
24
|
-
const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
|
|
25
|
-
return reg.test(url)
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* @param {string} str
|
|
30
|
-
* @returns {Boolean}
|
|
31
|
-
*/
|
|
32
|
-
export function validLowerCase (str) {
|
|
33
|
-
const reg = /^[a-z]+$/
|
|
34
|
-
return reg.test(str)
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* @param {string} str
|
|
39
|
-
* @returns {Boolean}
|
|
40
|
-
*/
|
|
41
|
-
export function validUpperCase (str) {
|
|
42
|
-
const reg = /^[A-Z]+$/
|
|
43
|
-
return reg.test(str)
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* @param {string} str
|
|
48
|
-
* @returns {Boolean}
|
|
49
|
-
*/
|
|
50
|
-
export function validAlphabets (str) {
|
|
51
|
-
const reg = /^[A-Za-z]+$/
|
|
52
|
-
return reg.test(str)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* @param {string} email
|
|
57
|
-
* @returns {Boolean}
|
|
58
|
-
*/
|
|
59
|
-
export function validEmail (email) {
|
|
60
|
-
const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
|
|
61
|
-
return reg.test(email)
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* @param {string} str
|
|
66
|
-
* @returns {Boolean}
|
|
67
|
-
*/
|
|
68
|
-
export function isString (str) {
|
|
69
|
-
if (typeof str === 'string' || str instanceof String) {
|
|
70
|
-
return true
|
|
71
|
-
}
|
|
72
|
-
return false
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* @param {Array} arg
|
|
77
|
-
* @returns {Boolean}
|
|
78
|
-
*/
|
|
79
|
-
export function isArray (arg) {
|
|
80
|
-
if (typeof Array.isArray === 'undefined') {
|
|
81
|
-
return Object.prototype.toString.call(arg) === '[object Array]'
|
|
82
|
-
}
|
|
83
|
-
return Array.isArray(arg)
|
|
84
|
-
}
|