@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.
@@ -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
- }
@@ -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
- }
@@ -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
@@ -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
- }