vue2-client 1.3.2 → 1.3.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.
Files changed (104) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/index.js +30 -28
  3. package/package.json +1 -1
  4. package/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox.vue +225 -225
  5. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +777 -777
  6. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +553 -553
  7. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +165 -163
  8. package/src/base-client/components/common/Upload/Upload.vue +161 -158
  9. package/src/base-client/components/common/XAddForm/XAddForm.vue +349 -349
  10. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +321 -322
  11. package/src/base-client/components/common/XForm/XForm.vue +273 -268
  12. package/src/base-client/components/common/XForm/XFormItem.vue +387 -371
  13. package/src/base-client/components/common/XFormTable/XFormTable.vue +6 -5
  14. package/src/base-client/components/common/XTable/XTable.vue +278 -274
  15. package/src/base-client/components/{iot → system}/LogDetailsView/LogDetailsView.vue +0 -0
  16. package/src/base-client/components/{iot → system}/LogDetailsView/index.js +0 -0
  17. package/src/base-client/components/{iot → system}/LogDetailsView/index.md +0 -0
  18. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -280
  19. package/src/base-client/components/ticket/TicketDetailsView/TicketDetailsView.vue +806 -804
  20. package/src/base-client/components/ticket/TicketSubmitSuccessView/TicketSubmitSuccessView.vue +24 -24
  21. package/src/base-client/plugins/PagedList.js +177 -176
  22. package/src/components/STable/index.js +318 -316
  23. package/src/components/index.js +36 -36
  24. package/src/components/table/StandardTable.vue +141 -142
  25. package/src/components/tool/TagSelect.vue +83 -83
  26. package/src/layouts/header/AdminHeader.vue +104 -109
  27. package/src/layouts/header/HeaderNotice.vue +167 -199
  28. package/src/layouts/header/InstitutionDetail.vue +181 -182
  29. package/src/pages/CreateQueryPage.vue +65 -59
  30. package/src/pages/system/dictionary/index.vue +43 -41
  31. package/src/pages/system/file/Info.vue +56 -0
  32. package/src/pages/system/file/index.vue +317 -0
  33. package/src/pages/system/queryParams/index.vue +43 -41
  34. package/src/pages/system/ticket/index.vue +458 -452
  35. package/src/pages/system/ticket/submitTicketSuccess.vue +206 -203
  36. package/src/router/async/router.map.js +56 -60
  37. package/src/services/api/DictionaryDetailsViewApi.js +6 -6
  38. package/src/services/api/LogDetailsViewApi.js +10 -10
  39. package/src/services/api/QueryParamsDetailsViewApi.js +6 -6
  40. package/src/services/api/TicketDetailsViewApi.js +42 -40
  41. package/src/services/api/commonTempTable.js +10 -0
  42. package/src/services/api/index.js +2 -24
  43. package/src/services/api/manage.js +8 -16
  44. package/src/utils/excel/Blob.js +181 -181
  45. package/src/utils/excel/Export2Excel.js +141 -142
  46. package/src/utils/i18n.js +80 -80
  47. package/src/utils/request.js +4 -4
  48. package/src/utils/theme-color-replacer-extend.js +91 -92
  49. package/vue.config.js +109 -163
  50. package/src/base-client/all.js +0 -62
  51. package/src/base-client/components/iot/CustomerDetailsView/CustomerDetailsView.vue +0 -225
  52. package/src/base-client/components/iot/CustomerDetailsView/index.js +0 -3
  53. package/src/base-client/components/iot/CustomerDetailsView/index.md +0 -40
  54. package/src/base-client/components/iot/DataAnalysisUser/DataAnalysisUser.vue +0 -127
  55. package/src/base-client/components/iot/DataAnalysisUser/index.js +0 -3
  56. package/src/base-client/components/iot/DeviceBrandDetailsView/DeviceBrandDetailsView.vue +0 -452
  57. package/src/base-client/components/iot/DeviceBrandDetailsView/index.js +0 -3
  58. package/src/base-client/components/iot/DeviceDetailsView/DeviceDetailsView.vue +0 -232
  59. package/src/base-client/components/iot/DeviceDetailsView/index.js +0 -3
  60. package/src/base-client/components/iot/DeviceDetailsView/index.md +0 -41
  61. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsCount.vue +0 -678
  62. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsException.vue +0 -57
  63. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsInstruct.vue +0 -122
  64. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsInstructOperate.vue +0 -121
  65. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsMain.vue +0 -269
  66. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsRead.vue +0 -131
  67. package/src/base-client/components/iot/DeviceDetailsView/part/index.js +0 -8
  68. package/src/base-client/components/iot/DeviceTypeDetailsView/DeviceTypeDetailsView.vue +0 -300
  69. package/src/base-client/components/iot/DeviceTypeDetailsView/index.js +0 -3
  70. package/src/base-client/components/iot/InstructDetailsView/InstructDetailsView.vue +0 -464
  71. package/src/base-client/components/iot/InstructDetailsView/index.js +0 -3
  72. package/src/base-client/components/iot/InstructDetailsView/index.md +0 -43
  73. package/src/base-client/components/iot/MeterDetailsView/MeterDetailsView.vue +0 -352
  74. package/src/base-client/components/iot/MeterDetailsView/index.js +0 -3
  75. package/src/base-client/components/iot/MeterDetailsView/index.md +0 -41
  76. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsCount.vue +0 -330
  77. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsException.vue +0 -179
  78. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsHandPlan.vue +0 -285
  79. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsInstruct.vue +0 -230
  80. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsMain.vue +0 -251
  81. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsSellGas.vue +0 -184
  82. package/src/base-client/components/iot/MeterDetailsView/part/index.js +0 -9
  83. package/src/base-client/components/iot/WebmeterAnalysisView/WebmeterAnalysisView.vue +0 -960
  84. package/src/base-client/components/iot/WebmeterAnalysisView/index.js +0 -3
  85. package/src/base-client/components/iot/WebmeterAnalysisView/index.md +0 -42
  86. package/src/base-client/components/ticket/EmployeeDetailsView/EmployeeDetailsView.vue +0 -370
  87. package/src/base-client/components/ticket/EmployeeDetailsView/index.js +0 -3
  88. package/src/base-client/components/ticket/EmployeeDetailsView/index.md +0 -28
  89. package/src/components/Charts/DataUserOrderSituation.vue +0 -77
  90. package/src/components/Charts/DataUserReporting.vue +0 -74
  91. package/src/components/Charts/DataUserSituation.vue +0 -107
  92. package/src/services/api/CustomerDetailsViewApi.js +0 -6
  93. package/src/services/api/DeviceBrandDetailsViewApi.js +0 -14
  94. package/src/services/api/DeviceDetailsViewApi.js +0 -10
  95. package/src/services/api/DeviceTypeDetailsViewApi.js +0 -6
  96. package/src/services/api/EmployeeDetailsViewApi.js +0 -12
  97. package/src/services/api/FormGroupEditApi.js +0 -6
  98. package/src/services/api/InstructDetailsViewApi.js +0 -12
  99. package/src/services/api/MeterDetailsViewApi.js +0 -24
  100. package/src/services/api/WebmeterAnalysisViewApi.js +0 -24
  101. package/src/services/api/applyInstallApi.js +0 -14
  102. package/src/services/api/iot/DeviceDetailsView/DeviceDetailsCountApi.js +0 -18
  103. package/src/services/api/iot.js +0 -7
  104. package/src/services/api/service.js +0 -12
@@ -1,163 +1,165 @@
1
- <template>
2
- <a-drawer
3
- title="表单参数组配置"
4
- placement="right"
5
- :width="isMobile ? screenWidth : screenWidth * 0.85"
6
- :visible="visible"
7
- @close="onClose"
8
- >
9
- <create-simple-form-query
10
- :to-edit-json="editItem()"
11
- :visible.sync="createQueryVisible"
12
- @saveSimpleFormQueryParams="saveQueryParams"
13
- />
14
- <a-list
15
- :grid="{gutter: 24, lg: 4, md: 3, sm: 1, xs: 1}"
16
- :dataSource="columnJsonCopy()"
17
- >
18
- <a-list-item slot="renderItem" slot-scope="item, index">
19
- <template v-if="item.type">
20
- <a-button class="new-btn" type="dashed" @click="toCreateQuery">
21
- <a-icon type="plus" />新增参数组
22
- </a-button>
23
- </template>
24
- <template v-else>
25
- <a-card :hoverable="true">
26
- <a-card-meta >
27
- <div style="margin-bottom: 3px" slot="title">{{ item.group }}</div>
28
- <a-icon type="tags" slot="avatar" :style="{ fontSize:'2em' }"/>
29
- <div class="meta-content" slot="description">{{ item.describe }}</div>
30
- </a-card-meta>
31
- <a slot="actions" @click="toEditQuery(index)">编辑</a>
32
- <a slot="actions" @click="toDelete(index)">删除</a>
33
- </a-card>
34
- </template>
35
- </a-list-item>
36
- </a-list>
37
- </a-drawer>
38
- </template>
39
-
40
- <script>
41
- import { mapState } from 'vuex'
42
-
43
- export default {
44
- name: 'FormGroupQuery',
45
- components: {
46
- },
47
- data () {
48
- return {
49
- // 页面宽度
50
- screenWidth: document.documentElement.clientWidth,
51
- // 是否显示生成查询配置抽屉
52
- createQueryVisible: false,
53
- targetIndex: 0,
54
- columnJson: {},
55
- editIndex: -1
56
- }
57
- },
58
- mounted () {
59
- this.initView()
60
- },
61
- computed: {
62
- ...mapState('setting', ['isMobile'])
63
- },
64
- props: {
65
- visible: {
66
- type: Boolean,
67
- default: false
68
- }
69
- },
70
- watch: {
71
- visible (rel) {
72
- if (rel) {
73
- this.initView()
74
- }
75
- }
76
- },
77
- methods: {
78
- // 初始化组件
79
- initView () {
80
- this.editIndex = -1
81
- this.$emit('getColumnJson', val => {
82
- this.columnJson = val
83
- })
84
- },
85
- toCreateQuery () {
86
- this.editIndex = -1
87
- this.createQueryVisible = true
88
- },
89
- toEditQuery (index) {
90
- this.editIndex = index
91
- this.createQueryVisible = true
92
- },
93
- toDelete (index) {
94
- const _this = this
95
- this.$confirm({
96
- title: '您确定要删除该参数组?',
97
- content: '删除的参数组无法恢复',
98
- okText: '确定',
99
- okType: 'danger',
100
- cancelText: '取消',
101
- onOk () {
102
- _this.columnJson.groups.splice(index, 1)
103
- _this.$emit('saveQueryParams', _this.columnJson)
104
- }
105
- })
106
- },
107
- onClose () {
108
- this.$emit('update:visible', false)
109
- },
110
- // 存储查询配置信息
111
- saveQueryParams (source) {
112
- if (!this.columnJson.groups) {
113
- this.columnJson.groups = []
114
- }
115
- if (this.editIndex !== -1) {
116
- this.columnJson.groups[this.editIndex] = source
117
- } else {
118
- this.columnJson.groups.push(source)
119
- }
120
- this.$emit('saveQueryParams', this.columnJson)
121
- this.createQueryVisible = false
122
- },
123
- columnJsonCopy () {
124
- let groups
125
- if (this.columnJson.groups) {
126
- groups = JSON.parse(JSON.stringify(this.columnJson.groups))
127
- } else {
128
- groups = []
129
- }
130
- groups.push({ type: 'add' })
131
- return groups
132
- },
133
- editItem () {
134
- if (this.editIndex !== -1) {
135
- return JSON.parse(JSON.stringify(this.columnJson.groups[this.editIndex]))
136
- } else {
137
- return {}
138
- }
139
- }
140
- }
141
- }
142
- </script>
143
- <style lang="less" scoped>
144
- .card-avatar {
145
- width: 48px;
146
- height: 48px;
147
- border-radius: 48px;
148
- }
149
- .new-btn{
150
- border-radius: 2px;
151
- width: 100%;
152
- height: 187px;
153
- }
154
- .meta-content{
155
- position: relative;
156
- overflow: hidden;
157
- text-overflow: ellipsis;
158
- display: -webkit-box;
159
- height: 64px;
160
- -webkit-line-clamp: 3;
161
- -webkit-box-orient: vertical;
162
- }
163
- </style>
1
+ <template>
2
+ <a-drawer
3
+ :visible="visible"
4
+ :width="isMobile ? screenWidth : screenWidth * 0.85"
5
+ placement="right"
6
+ title="表单参数组配置"
7
+ @close="onClose"
8
+ >
9
+ <create-simple-form-query
10
+ :to-edit-json="editItem()"
11
+ :visible.sync="createQueryVisible"
12
+ @saveSimpleFormQueryParams="saveQueryParams"
13
+ />
14
+ <a-list
15
+ :dataSource="columnJsonCopy()"
16
+ :grid="{gutter: 24, lg: 4, md: 3, sm: 1, xs: 1}"
17
+ >
18
+ <a-list-item slot="renderItem" slot-scope="item, index">
19
+ <template v-if="item.type">
20
+ <a-button class="new-btn" type="dashed" @click="toCreateQuery">
21
+ <a-icon type="plus" />新增参数组
22
+ </a-button>
23
+ </template>
24
+ <template v-else>
25
+ <a-card :hoverable="true">
26
+ <a-card-meta >
27
+ <div slot="title" style="margin-bottom: 3px">{{ item.group }}</div>
28
+ <a-icon slot="avatar" :style="{ fontSize:'2em' }" type="tags"/>
29
+ <div slot="description" class="meta-content">{{ item.describe }}</div>
30
+ </a-card-meta>
31
+ <a slot="actions" @click="toEditQuery(index)">编辑</a>
32
+ <a slot="actions" @click="toDelete(index)">删除</a>
33
+ </a-card>
34
+ </template>
35
+ </a-list-item>
36
+ </a-list>
37
+ </a-drawer>
38
+ </template>
39
+
40
+ <script>
41
+ import { mapState } from 'vuex'
42
+ import CreateSimpleFormQuery from '@/base-client/components/common/CreateSimpleFormQuery'
43
+
44
+ export default {
45
+ name: 'FormGroupQuery',
46
+ components: {
47
+ CreateSimpleFormQuery
48
+ },
49
+ data () {
50
+ return {
51
+ // 页面宽度
52
+ screenWidth: document.documentElement.clientWidth,
53
+ // 是否显示生成查询配置抽屉
54
+ createQueryVisible: false,
55
+ targetIndex: 0,
56
+ columnJson: {},
57
+ editIndex: -1
58
+ }
59
+ },
60
+ mounted () {
61
+ this.initView()
62
+ },
63
+ computed: {
64
+ ...mapState('setting', ['isMobile'])
65
+ },
66
+ props: {
67
+ visible: {
68
+ type: Boolean,
69
+ default: false
70
+ }
71
+ },
72
+ watch: {
73
+ visible (rel) {
74
+ if (rel) {
75
+ this.initView()
76
+ }
77
+ }
78
+ },
79
+ methods: {
80
+ // 初始化组件
81
+ initView () {
82
+ this.editIndex = -1
83
+ this.$emit('getColumnJson', val => {
84
+ this.columnJson = val
85
+ })
86
+ },
87
+ toCreateQuery () {
88
+ this.editIndex = -1
89
+ this.createQueryVisible = true
90
+ },
91
+ toEditQuery (index) {
92
+ this.editIndex = index
93
+ this.createQueryVisible = true
94
+ },
95
+ toDelete (index) {
96
+ const _this = this
97
+ this.$confirm({
98
+ title: '您确定要删除该参数组?',
99
+ content: '删除的参数组无法恢复',
100
+ okText: '确定',
101
+ okType: 'danger',
102
+ cancelText: '取消',
103
+ onOk () {
104
+ _this.columnJson.groups.splice(index, 1)
105
+ _this.$emit('saveQueryParams', _this.columnJson)
106
+ }
107
+ })
108
+ },
109
+ onClose () {
110
+ this.$emit('update:visible', false)
111
+ },
112
+ // 存储查询配置信息
113
+ saveQueryParams (source) {
114
+ if (!this.columnJson.groups) {
115
+ this.columnJson.groups = []
116
+ }
117
+ if (this.editIndex !== -1) {
118
+ this.columnJson.groups[this.editIndex] = source
119
+ } else {
120
+ this.columnJson.groups.push(source)
121
+ }
122
+ this.$emit('saveQueryParams', this.columnJson)
123
+ this.createQueryVisible = false
124
+ },
125
+ columnJsonCopy () {
126
+ let groups
127
+ if (this.columnJson.groups) {
128
+ groups = JSON.parse(JSON.stringify(this.columnJson.groups))
129
+ } else {
130
+ groups = []
131
+ }
132
+ groups.push({ type: 'add' })
133
+ return groups
134
+ },
135
+ editItem () {
136
+ if (this.editIndex !== -1) {
137
+ return JSON.parse(JSON.stringify(this.columnJson.groups[this.editIndex]))
138
+ } else {
139
+ return {}
140
+ }
141
+ }
142
+ }
143
+ }
144
+ </script>
145
+ <style lang="less" scoped>
146
+ .card-avatar {
147
+ width: 48px;
148
+ height: 48px;
149
+ border-radius: 48px;
150
+ }
151
+ .new-btn{
152
+ border-radius: 2px;
153
+ width: 100%;
154
+ height: 187px;
155
+ }
156
+ .meta-content{
157
+ position: relative;
158
+ overflow: hidden;
159
+ text-overflow: ellipsis;
160
+ display: -webkit-box;
161
+ height: 64px;
162
+ -webkit-line-clamp: 3;
163
+ -webkit-box-orient: vertical;
164
+ }
165
+ </style>
@@ -1,158 +1,161 @@
1
- <template>
2
- <div>
3
- <a-upload-dragger
4
- v-if="model.type === 'file'"
5
- name="file"
6
- :multiple="true"
7
- :accept="model.accept.join('')"
8
- :remove="deleteFileItem"
9
- :customRequest="uploadFiles"
10
- :file-list="uploadedFileList">
11
- <p class="ant-upload-drag-icon">
12
- <a-icon type="inbox"/>
13
- </p>
14
- <p class="ant-upload-text">
15
- 点击或拖动文件到该区域上传
16
- </p>
17
- <p class="ant-upload-hint">
18
- 支持单个或多个文件
19
- </p>
20
- </a-upload-dragger>
21
- <a-upload
22
- v-if=" model.type === 'image'"
23
- list-type="picture-card"
24
- :accept="model.accept.join('')"
25
- :customRequest="uploadFiles"
26
- :remove="deleteFileItem"
27
- :file-list="uploadedFileList">
28
- <a-icon type="plus"/>
29
- <div class="ant-upload-text">
30
- Upload
31
- </div>
32
- </a-upload>
33
- </div>
34
- </template>
35
-
36
- <script>
37
-
38
- import { post } from '@vue2-client/services/api'
39
- import { mapState } from 'vuex'
40
-
41
- export default {
42
- name: 'uploads',
43
- data () {
44
- return {
45
- uploadedFileList: [],
46
- }
47
- },
48
- props: {
49
- // 表单属性
50
- model: {
51
- type: Object,
52
- default: () => {
53
- return {}
54
- }
55
- },
56
- files: {
57
- type: Array,
58
- default: () => {
59
- return []
60
- }
61
- },
62
- images: {
63
- type: Array,
64
- default: () => {
65
- return []
66
- }
67
- }
68
- },
69
- computed: {
70
- ...mapState('account', { currUser: 'user' })
71
- },
72
- created () {
73
- const list = this.model.type === 'file' ? [...this.files] : [...this.images]
74
- if (this.model.useType) {
75
- this.uploadedFileList = list.filter(item => item.f_use_type === this.model.useType)
76
- } else {
77
- this.uploadedFileList = list
78
- }
79
- this.$emit('setFiles', this.uploadedFileList.filter(item => item.status === 'done').map(item => item.id))
80
- },
81
- methods: {
82
- uploadFiles (info) {
83
- if (this.uploadedFileList.length >= this.model.acceptCount) {
84
- this.$message.error(`当前表单限制仅可上传 ${this.model.acceptCount} 个文件`)
85
- return
86
- }
87
- // 初始化文件信息
88
- const fileInfo = {
89
- uid: info.file.uid,
90
- name: info.file.name,
91
- status: 'uploading',
92
- response: '',
93
- url: '',
94
- }
95
- // 放入上传列表中,以便于显示上传进度
96
- this.uploadedFileList.push(fileInfo)
97
- // 组装上传数据
98
- const headers = {
99
- 'Content-Type': 'multipart/form-data',
100
- }
101
- // TODO 暂时给默认值 基础表单调整好后处理
102
- const formData = new FormData()
103
- formData.append('avatar', info.file)
104
- formData.append('resUploadMode', this.model.resUploadMode ?? 'server')
105
- if (this.model.pathKey) {
106
- formData.append('pathKey', this.model.pathKey ?? 'Default')
107
- }
108
- // formData.append('stockAlias', this.model.stockAlias)
109
- formData.append('formType', this.model.type)
110
- formData.append('useType', this.model.useType ?? 'Default')
111
- formData.append('resUploadStock', this.model.resUploadStock)
112
- formData.append('filename', info.file.name)
113
- formData.append('filesize', (info.file.size / 1024 / 1024).toFixed(4))
114
- formData.append('f_operator', this.currUser ? this.currUser.username : '')
115
-
116
- // const url = '/webmeteruploadapi/resource'
117
- // if (process.env.NODE_ENV === 'production') {
118
- // url = `/${this.model.stockAlias}/webmeteruploadapi/resource`
119
- // }
120
- post('/webmeterresourceapi/upload', formData, { headers, timeout: 60*1000 }).then(res => {
121
- // 根据服务端返回的结果判断成功与否,设置文件条目的状态
122
- if (res.success) {
123
- fileInfo.status = 'done'
124
- fileInfo.response = JSON.parse(res.data)
125
- fileInfo.id = JSON.parse(res.data).id
126
- fileInfo.url = JSON.parse(res.data).f_downloadpath
127
- this.$emit('setFiles', this.uploadedFileList.filter(item => item.status === 'done').map(item => item.id))
128
- this.$message.success('上传成功!')
129
- } else {
130
- fileInfo.status = 'error'
131
- fileInfo.response = res.data
132
- this.$message.error('上传失败!')
133
- }
134
- }).catch((e) => {
135
- fileInfo.status = 'error'
136
- fileInfo.response = e
137
- this.$message.error(`请求失败!${e}`)
138
- })
139
- },
140
- // 删除文件
141
- deleteFileItem (file) {
142
- if (file.id) {
143
- post('/rs/entity/t_files', { id: file.id, f_state: '删除' }).then(res => {
144
- }).catch(e => { })
145
- }
146
- // 找到当前文件所在列表的索引
147
- const index = this.uploadedFileList.indexOf(file)
148
- // 从列表中移除该文件
149
- this.uploadedFileList.splice(index, 1)
150
- this.$emit('setFiles', this.uploadedFileList.filter(item => item.status === 'done').map(item => item.id))
151
- return true
152
- }
153
- }
154
- }
155
- </script>
156
- <style lang="less" scoped>
157
-
158
- </style>
1
+ <template>
2
+ <div>
3
+ <a-upload-dragger
4
+ v-if="model.type === 'file'"
5
+ :accept="model.accept.join('')"
6
+ :customRequest="uploadFiles"
7
+ :file-list="uploadedFileList"
8
+ :multiple="true"
9
+ :remove="deleteFileItem"
10
+ name="file">
11
+ <p class="ant-upload-drag-icon">
12
+ <a-icon type="inbox"/>
13
+ </p>
14
+ <p class="ant-upload-text">
15
+ 点击或拖动文件到该区域上传
16
+ </p>
17
+ <p class="ant-upload-hint">
18
+ 支持单个或多个文件
19
+ </p>
20
+ </a-upload-dragger>
21
+ <a-upload
22
+ v-if=" model.type === 'image'"
23
+ :accept="model.accept.join('')"
24
+ :customRequest="uploadFiles"
25
+ :file-list="uploadedFileList"
26
+ :remove="deleteFileItem"
27
+ list-type="picture-card">
28
+ <a-icon type="plus"/>
29
+ <div class="ant-upload-text">
30
+ Upload
31
+ </div>
32
+ </a-upload>
33
+ </div>
34
+ </template>
35
+
36
+ <script>
37
+
38
+ import { post } from '@vue2-client/services/api'
39
+ import { mapState } from 'vuex'
40
+
41
+ export default {
42
+ name: 'uploads',
43
+ data () {
44
+ return {
45
+ uploadedFileList: [],
46
+ }
47
+ },
48
+ props: {
49
+ // 表单属性
50
+ model: {
51
+ type: Object,
52
+ default: () => {
53
+ return {}
54
+ }
55
+ },
56
+ files: {
57
+ type: Array,
58
+ default: () => {
59
+ return []
60
+ }
61
+ },
62
+ images: {
63
+ type: Array,
64
+ default: () => {
65
+ return []
66
+ }
67
+ },
68
+ serviceName: {
69
+ type: String,
70
+ default: 'af-system'
71
+ }
72
+ },
73
+ computed: {
74
+ ...mapState('account', { currUser: 'user' })
75
+ },
76
+ created () {
77
+ const list = this.model.type === 'file' ? [...this.files] : [...this.images]
78
+ if (this.model.useType) {
79
+ this.uploadedFileList = list.filter(item => item.f_use_type === this.model.useType)
80
+ } else {
81
+ this.uploadedFileList = list
82
+ }
83
+ this.$emit('setFiles', this.uploadedFileList.filter(item => item.status === 'done').map(item => item.id))
84
+ },
85
+ methods: {
86
+ uploadFiles (info) {
87
+ if (this.uploadedFileList.length >= this.model.acceptCount) {
88
+ this.$message.error(`当前表单限制仅可上传 ${this.model.acceptCount} 个文件`)
89
+ return
90
+ }
91
+ // 初始化文件信息
92
+ const fileInfo = {
93
+ uid: info.file.uid,
94
+ name: info.file.name,
95
+ status: 'uploading',
96
+ response: '',
97
+ url: '',
98
+ }
99
+ // 放入上传列表中,以便于显示上传进度
100
+ this.uploadedFileList.push(fileInfo)
101
+ // 组装上传数据
102
+ const headers = {
103
+ 'Content-Type': 'multipart/form-data',
104
+ }
105
+ const formData = new FormData()
106
+ formData.append('avatar', info.file)
107
+ formData.append('resUploadMode', this.model.resUploadMode ?? 'server')
108
+ if (this.model.pathKey) {
109
+ formData.append('pathKey', this.model.pathKey ?? 'Default')
110
+ }
111
+ // formData.append('stockAlias', this.model.stockAlias)
112
+ formData.append('formType', this.model.type)
113
+ formData.append('useType', this.model.useType ?? 'Default')
114
+ formData.append('resUploadStock', this.model.resUploadStock)
115
+ formData.append('filename', info.file.name)
116
+ formData.append('filesize', (info.file.size / 1024 / 1024).toFixed(4))
117
+ formData.append('f_operator', this.currUser ? this.currUser.username : '')
118
+
119
+ // const url = '/af-system/resource'
120
+ // if (process.env.NODE_ENV === 'production') {
121
+ // url = `/${this.model.stockAlias}/af-system/resource`
122
+ // }
123
+ post(this.serviceName + '/resource/upload', formData, { headers, timeout: 60 * 1000 }).then(res => {
124
+ // 根据服务端返回的结果判断成功与否,设置文件条目的状态
125
+ if (res.success) {
126
+ fileInfo.status = 'done'
127
+ fileInfo.response = JSON.parse(res.data)
128
+ fileInfo.id = JSON.parse(res.data).id
129
+ fileInfo.url = JSON.parse(res.data).f_downloadpath
130
+ this.$emit('setFiles', this.uploadedFileList.filter(item => item.status === 'done').map(item => item.id))
131
+ this.$message.success('上传成功!')
132
+ } else {
133
+ fileInfo.status = 'error'
134
+ fileInfo.response = res.data
135
+ this.$message.error('上传失败!')
136
+ }
137
+ }).catch((e) => {
138
+ fileInfo.status = 'error'
139
+ fileInfo.response = e
140
+ this.$message.error(`请求失败!${e}`)
141
+ })
142
+ },
143
+ // 删除文件
144
+ deleteFileItem (file) {
145
+ if (file.id) {
146
+ post(this.serviceName + '/entity/t_files', { id: file.id, f_state: '删除' }).then(res => {
147
+ }).catch(e => { })
148
+ }
149
+ // 找到当前文件所在列表的索引
150
+ const index = this.uploadedFileList.indexOf(file)
151
+ // 从列表中移除该文件
152
+ this.uploadedFileList.splice(index, 1)
153
+ this.$emit('setFiles', this.uploadedFileList.filter(item => item.status === 'done').map(item => item.id))
154
+ return true
155
+ }
156
+ }
157
+ }
158
+ </script>
159
+ <style lang="less" scoped>
160
+
161
+ </style>