hrp-ui-base 1.0.1 → 1.0.2

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 (190) hide show
  1. package/dist/components.cjs +1 -1
  2. package/dist/components.es.js +4 -4
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.es.js +83 -67
  5. package/dist/style.css +1 -1
  6. package/package.json +15 -4
  7. package/packages/approval-process/.eslintrc +7 -0
  8. package/packages/approval-process/README.md +130 -0
  9. package/packages/approval-process/index.ts +65 -0
  10. package/packages/approval-process/package.json +17 -0
  11. package/packages/approval-process/packages/components/choose-member/BO/departBo.ts +8 -0
  12. package/packages/approval-process/packages/components/choose-member/BO/memberBo.ts +14 -0
  13. package/packages/approval-process/packages/components/choose-member/BO/role.svg +1 -0
  14. package/packages/approval-process/packages/components/choose-member/BO/roleBo.ts +16 -0
  15. package/packages/approval-process/packages/components/choose-member/index.vue +497 -0
  16. package/packages/approval-process/packages/components/choose-member/styles/common.scss +134 -0
  17. package/packages/approval-process/packages/components/comment/assets/avatar.svg +1 -0
  18. package/packages/approval-process/packages/components/comment/assets/download.svg +4 -0
  19. package/packages/approval-process/packages/components/comment/assets/mp3.svg +11 -0
  20. package/packages/approval-process/packages/components/comment/assets/mp4.svg +11 -0
  21. package/packages/approval-process/packages/components/comment/assets/other.svg +11 -0
  22. package/packages/approval-process/packages/components/comment/assets/pdf.svg +11 -0
  23. package/packages/approval-process/packages/components/comment/assets/ppt.svg +11 -0
  24. package/packages/approval-process/packages/components/comment/assets/preview.svg +4 -0
  25. package/packages/approval-process/packages/components/comment/assets/remove.png +0 -0
  26. package/packages/approval-process/packages/components/comment/assets/word.svg +11 -0
  27. package/packages/approval-process/packages/components/comment/assets/xls.svg +11 -0
  28. package/packages/approval-process/packages/components/comment/index.vue +843 -0
  29. package/packages/approval-process/packages/components/comment/modules/previewMp.vue +54 -0
  30. package/packages/approval-process/packages/components/comment/styles/comment-style.scss +304 -0
  31. package/packages/approval-process/packages/components/image-cropper/index.vue +202 -0
  32. package/packages/approval-process/packages/components/sign/index.vue +766 -0
  33. package/packages/approval-process/packages/components/sign/modules/full-screen-sign.vue +20 -0
  34. package/packages/approval-process/packages/components/urge-dialog/index.vue +121 -0
  35. package/packages/approval-process/packages/components/vue-esign/index.vue +289 -0
  36. package/packages/approval-process/packages/flow/approve-component/approve-success.vue +82 -0
  37. package/packages/approval-process/packages/flow/approve-component/route-params-error.vue +49 -0
  38. package/packages/approval-process/packages/flow/approve-component/submit-success.vue +59 -0
  39. package/packages/approval-process/packages/flow/examine-approve-itr.vue +978 -0
  40. package/packages/approval-process/packages/flow/examine-approve.vue +1065 -0
  41. package/packages/approval-process/packages/flow/form-component/associated-approval-form/README.md +38 -0
  42. package/packages/approval-process/packages/flow/form-component/associated-approval-form/assets/avatar.svg +1 -0
  43. package/packages/approval-process/packages/flow/form-component/associated-approval-form/index.vue +159 -0
  44. package/packages/approval-process/packages/flow/form-component/associated-approval-form/modules/associated-approval-form-mobile.vue +297 -0
  45. package/packages/approval-process/packages/flow/form-component/associated-approval-form/modules/associated-approval-form-pc.vue +314 -0
  46. package/packages/approval-process/packages/flow/form-component/associated-approval-form/style/curd-area-mobile.scss +110 -0
  47. package/packages/approval-process/packages/flow/form-component/associated-approval-form/style/curd-area.scss +96 -0
  48. package/packages/approval-process/packages/flow/form-component/associated-approval-form/style/out-put.scss +48 -0
  49. package/packages/approval-process/packages/flow/form-component/show-sign.vue +27 -0
  50. package/packages/approval-process/packages/flow/styles/common.scss +134 -0
  51. package/packages/approval-process/packages/flow/styles/examine-approve-pc.scss +465 -0
  52. package/packages/approval-process/packages/flow/styles/examine-approve-phone.scss +293 -0
  53. package/packages/approval-process/packages/flow/styles/submit-approve-pc.scss +379 -0
  54. package/packages/approval-process/packages/flow/styles/submit-approve-phone.scss +337 -0
  55. package/packages/approval-process/packages/flow/submit-approve-itr.vue +623 -0
  56. package/packages/approval-process/packages/flow/submit-approve.vue +628 -0
  57. package/packages/approval-process/packages/flow/systemCom/BO/departBo.ts +8 -0
  58. package/packages/approval-process/packages/flow/systemCom/BO/memberBo.ts +14 -0
  59. package/packages/approval-process/packages/flow/systemCom/BO/role.svg +1 -0
  60. package/packages/approval-process/packages/flow/systemCom/BO/roleBo.ts +16 -0
  61. package/packages/approval-process/packages/flow/systemCom/choose-depart.vue +399 -0
  62. package/packages/approval-process/packages/flow/systemCom/choose-member-phone.vue +515 -0
  63. package/packages/approval-process/packages/flow/systemCom/choose-member.vue +565 -0
  64. package/packages/approval-process/packages/flow/systemCom/choose-role.vue +301 -0
  65. package/packages/approval-process/packages/styles/common.scss +134 -0
  66. package/packages/approval-process/packages/styles/flex-common.scss +118 -0
  67. package/packages/approval-process/packages/styles/flexCommon.scss +73 -0
  68. package/packages/approval-process/packages/styles/main.css +216 -0
  69. package/packages/approval-process/packages/styles/router-page.scss +371 -0
  70. package/packages/approval-process/packages/styles/style-set.ts +207 -0
  71. package/packages/approval-process/packages/types.d.ts +4 -0
  72. package/packages/approval-process/packages/utils/base.ts +15 -0
  73. package/packages/approval-process/packages/utils/crypto.ts +67 -0
  74. package/packages/approval-process/packages/utils/ddUtils.ts +56 -0
  75. package/packages/approval-process/packages/utils/debounce.ts +36 -0
  76. package/packages/approval-process/packages/utils/des.js +1107 -0
  77. package/packages/approval-process/packages/utils/download.ts +38 -0
  78. package/packages/approval-process/packages/utils/editor.ts +37 -0
  79. package/packages/approval-process/packages/utils/getEnv.ts +36 -0
  80. package/packages/approval-process/packages/utils/os.ts +20 -0
  81. package/packages/approval-process/packages/utils/path-util.ts +31 -0
  82. package/packages/approval-process/packages/utils/routerUtil.ts +304 -0
  83. package/packages/approval-process/packages/utils/string-utils.ts +13 -0
  84. package/packages/approval-process/packages/utils/throttle.ts +44 -0
  85. package/packages/approval-process/packages/utils/validate.ts +92 -0
  86. package/packages/approval-process/packages/utils/ws.ts +218 -0
  87. package/packages/approval-process/tsconfig.json +72 -0
  88. package/packages/approval-process/vite.config.ts +56 -0
  89. package/src/api/bms/flow/FlowCommentController.ts +50 -0
  90. package/src/api/bms/flow/FlowInstanceController.ts +167 -0
  91. package/src/api/bms/flow/FlowProcessController.ts +55 -0
  92. package/src/api/bms/flow/FlowSheetController.ts +27 -0
  93. package/src/api/bms/flow/FlowSignController.ts +76 -0
  94. package/src/api/bms/flow/bo/AssociatedApprovalBO.ts +15 -0
  95. package/src/api/bms/flow/bo/AssociatedApprovalVO.ts +35 -0
  96. package/src/api/bms/flow/bo/AuditBaseInfo.ts +39 -0
  97. package/src/api/bms/flow/bo/ButtonVo.ts +7 -0
  98. package/src/api/bms/flow/bo/DingCallbackBo.ts +13 -0
  99. package/src/api/bms/flow/bo/FlowCommentBO.ts +12 -0
  100. package/src/api/bms/flow/bo/FlowCommentVO.ts +23 -0
  101. package/src/api/bms/flow/bo/FlowInstanceBO.ts +14 -0
  102. package/src/api/bms/flow/bo/FlowNodeVO.ts +24 -0
  103. package/src/api/bms/flow/bo/FlowNoticeBO.ts +17 -0
  104. package/src/api/bms/flow/bo/FlowProcessBO.ts +13 -0
  105. package/src/api/bms/flow/bo/FlowProcessVO.ts +9 -0
  106. package/src/api/bms/flow/bo/FlowReplyVO.ts +23 -0
  107. package/src/api/bms/flow/bo/FlowSheetVO.ts +16 -0
  108. package/src/api/bms/flow/bo/InstanceBackBO.ts +9 -0
  109. package/src/api/bms/flow/bo/InstanceNodeBO.ts +13 -0
  110. package/src/api/bms/flow/bo/InstanceNodeVO.ts +21 -0
  111. package/src/api/bms/flow/bo/NodeShowVo.ts +19 -0
  112. package/src/api/bms/flow/bo/ReviewBO.ts +11 -0
  113. package/src/api/bms/flow/bo/SheetSearchBO.ts +11 -0
  114. package/src/api/bms/flow/bo/SystemVO.ts +7 -0
  115. package/src/api/bms/flow/bo/TransmitBO.ts +9 -0
  116. package/src/api/bms/flow/bo/UrgeFlowBO.ts +7 -0
  117. package/src/api/bms/flow/bo/UserBaseInfoVo.ts +13 -0
  118. package/src/api/bms/flow/bo/UserInfoVo.ts +44 -0
  119. package/src/api/bms/flow/bo/UserResultVo.ts +17 -0
  120. package/src/api/bms/flow/bo/ValueMapBo.ts +7 -0
  121. package/src/api/bms/home/HomeController.ts +106 -0
  122. package/src/api/bms/home/bo/CollectedMenuBo.ts +9 -0
  123. package/src/api/bms/home/bo/DeptBaseVo.ts +9 -0
  124. package/src/api/bms/home/bo/DomainVO.ts +13 -0
  125. package/src/api/bms/home/bo/FunPermission.ts +17 -0
  126. package/src/api/bms/home/bo/GroupVO.ts +10 -0
  127. package/src/api/bms/home/bo/HomeMenu.ts +22 -0
  128. package/src/api/bms/home/bo/HomeMenuVo.ts +11 -0
  129. package/src/api/bms/home/bo/PersonalizationBo.ts +17 -0
  130. package/src/api/bms/home/bo/PersonalizationVo.ts +19 -0
  131. package/src/api/bms/home/bo/PhoneMenu.ts +14 -0
  132. package/src/api/bms/home/bo/SearchMenuVo.ts +10 -0
  133. package/src/api/bms/home/bo/UserBaseInfoVo.ts +11 -0
  134. package/src/api/hrms/dept/bo/DeptBaseVo.ts +6 -0
  135. package/src/api/hrms/dept/bo/DeptTreeVo.ts +23 -0
  136. package/src/api/hrms/dept/bo/DeptUserVo.ts +9 -0
  137. package/src/api/hrms/dept/bo/DeptUsersVo.ts +10 -0
  138. package/src/api/hrms/dept/bo/DeptVo.ts +19 -0
  139. package/src/api/hrms/dept/bo/UserBaseInfoVo.ts +8 -0
  140. package/src/api/hrms/dept/deptController.ts +100 -0
  141. package/src/api/hrms/role/bo/RoleBaseVo.ts +6 -0
  142. package/src/api/hrms/role/bo/RoleGroupVo.ts +11 -0
  143. package/src/api/hrms/role/bo/RoleVo.ts +22 -0
  144. package/src/api/hrms/role/roleController.ts +19 -0
  145. package/src/api/hrms/user/bo/UserBaseInfoVo.ts +11 -0
  146. package/src/api/hrms/user/bo/UserCardVO.ts +14 -0
  147. package/src/api/hrms/user/bo/UserDeptBO.ts +13 -0
  148. package/src/api/hrms/user/bo/UserRoleBO.ts +11 -0
  149. package/src/api/hrms/user/bo/UserVO.ts +23 -0
  150. package/src/api/hrms/user/userController.ts +86 -0
  151. package/src/api/work-order-pc/flow/Bo/ValueMapBo.ts +7 -0
  152. package/src/api/work-order-pc/flow/ItrFlowProcessController.ts +42 -0
  153. package/src/api/work-order-pc/flow/Vo/FlowNodeVO.ts +24 -0
  154. package/src/api/work-order-pc/flow/Vo/UserInfoVo.ts +44 -0
  155. package/src/assets/process/agree.png +0 -0
  156. package/src/assets/process/defaultAvatar.png +0 -0
  157. package/src/assets/process/drawer/departManagerJump.png +0 -0
  158. package/src/assets/process/drawer/manyLevel1close.svg +10 -0
  159. package/src/assets/process/drawer/manyLevel1open.svg +7 -0
  160. package/src/assets/process/drawer/manyLevel2close.svg +7 -0
  161. package/src/assets/process/drawer/manyLevel2open.svg +7 -0
  162. package/src/assets/process/inProcess.png +0 -0
  163. package/src/assets/process/manyPeople.png +0 -0
  164. package/src/assets/process/manyPeople2.png +0 -0
  165. package/src/assets/process/reject.png +0 -0
  166. package/src/assets/process/revoke.png +0 -0
  167. package/src/components/annex-img-upload/index.vue +4 -4
  168. package/src/components/annex-img-upload/modules/previewMp.vue +1 -1
  169. package/src/components/annex-upload/index.vue +4 -4
  170. package/src/components/annex-upload/modules/previewMp.vue +1 -1
  171. package/src/components/annex-upload-weijian/index.vue +4 -4
  172. package/src/components/annex-upload-weijian/modules/previewMp.vue +1 -1
  173. package/src/components/list-search-content/components/search-date-range.vue +1 -1
  174. package/src/components/list-search-content/components/search-date-time-range.vue +1 -1
  175. package/src/components/list-search-content/components/search-date.vue +1 -1
  176. package/src/components/list-search-content/components/search-input-number.vue +1 -1
  177. package/src/components/list-search-content/components/search-input.vue +1 -1
  178. package/src/components/list-search-content/components/search-multiple_select.vue +1 -1
  179. package/src/components/list-search-content/components/search-select.vue +1 -1
  180. package/src/components/list-search-content/index.vue +6 -6
  181. package/src/components/list-search-content/modules/add-views-package-dialog.vue +3 -3
  182. package/src/components/list-search-content/modules/search-condition-area.vue +2 -2
  183. package/src/components/list-search-content/modules/views-package-manage-dialog.vue +5 -5
  184. package/src/index.ts +1 -0
  185. package/src/utils/dd-utils.ts +1 -1
  186. package/src/utils/get-dict.ts +2 -2
  187. package/src/utils/permit-utils.ts +2 -2
  188. package/src/api/bms/dict/bo/TotalDictSearchBO.ts +0 -8
  189. package/src/api/bms/file/FileExportController.ts +0 -18
  190. package/src/api/bms/file/bo/FileExportVO.ts +0 -17
@@ -0,0 +1,54 @@
1
+ <!--
2
+ * @description: 预览mp3,mp4等
3
+ * @fileName: previewMp.vue
4
+ * @author: huatuo
5
+ !-->
6
+ <template>
7
+ <el-dialog v-model="dialogVisible" :title="dialogTitle" width="50%" size="default" style="min-width: 800px" :destroy-on-close="true">
8
+ <div style="width: 100%;height: 100%;">
9
+ <audio controls v-if="fileType === 'mp3'" autoplay>
10
+ <source :src="fileInfo.url" type="audio/mpeg" style="width: 100%;height: 100%;">
11
+ 您浏览器暂不支持该播放器!
12
+ </audio>
13
+ <video id="video-element" controls v-if="fileType === 'mp4'" :src="fileInfo.url" autoplay style="width: 100%;height: 100%;">
14
+ 您浏览器暂不支持该播放器!
15
+ </video>
16
+ </div>
17
+ <template #footer>
18
+ <el-button @click="closePreview">关闭</el-button>
19
+ </template>
20
+ </el-dialog>
21
+ </template>
22
+ <script lang="ts" name="SystemTenantForm" setup>
23
+ import { ref, onMounted, reactive, PropType } from 'vue'
24
+ import { ElMessage } from 'element-plus';
25
+ import FileBaseInfo from "hrp-ui-base/api/bms/file/bo/FileBaseInfo"
26
+ const dialogVisible = ref(false) // 弹窗的是否展示
27
+ const dialogTitle = ref('') // 弹窗的标题
28
+ const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
29
+ /** 文件类型 */
30
+ const fileType = ref<'mp3' | 'mp4'>('mp3')
31
+ /** 文件信息 */
32
+ const fileInfo = ref<FileBaseInfo>(new FileBaseInfo())
33
+ /** 打开弹窗 */
34
+ const open = async (type: 'mp3' | 'mp4', row: FileBaseInfo) => {
35
+ dialogVisible.value = true
36
+ dialogTitle.value = '文件预览'
37
+ fileType.value = type
38
+ formLoading.value = true
39
+
40
+ resetForm()
41
+ fileInfo.value = row
42
+ formLoading.value = false
43
+
44
+ }
45
+ defineExpose({ open }) // 提供 open 方法,用于打开弹窗
46
+
47
+ /** 重置表单 */
48
+ const resetForm = () => {
49
+ }
50
+
51
+ const closePreview = () => {
52
+ dialogVisible.value = false
53
+ }
54
+ </script>
@@ -0,0 +1,304 @@
1
+ .at-member-box {
2
+ position: relative;
3
+ display: flex;
4
+ flex-direction: row;
5
+ justify-content: flex-start;
6
+ align-items: center;
7
+ flex-wrap: wrap;
8
+ width: 100%;
9
+ height: auto;
10
+ margin-bottom: 12px;
11
+
12
+ .at-member-item {
13
+ display: flex;
14
+ flex-direction: column;
15
+ justify-content: flex-start;
16
+ align-items: center;
17
+ width: 50px;
18
+ height: 66px;
19
+ margin: 12px 12px 0 0;
20
+
21
+ &:hover {
22
+ .at-member-close {
23
+ display: block;
24
+ }
25
+ }
26
+
27
+ .at-member-avatar {
28
+ width: 36px;
29
+ height: 36px;
30
+ margin-bottom: 12px;
31
+ }
32
+
33
+ .at-member-name {
34
+ font-size: 12px;
35
+ text-align: center;
36
+ width: 100%;
37
+ height: 28px;
38
+ line-height: 12px;
39
+ }
40
+
41
+ .at-member-close {
42
+ position: absolute;
43
+ top: 0px;
44
+ right: 0px;
45
+ cursor: pointer;
46
+ display: none; // 默认隐藏
47
+ width: 16px;
48
+ height: 16px;
49
+ background-color: var(--custom-theme-fill-7);
50
+ border-radius: 50%;
51
+ }
52
+ }
53
+ }
54
+
55
+ .comment-button-box {
56
+ width: 100%;
57
+ display: flex;
58
+ flex-direction: row;
59
+ justify-content: flex-start;
60
+ align-items: center;
61
+ height: 50px;
62
+ }
63
+
64
+
65
+ .preview-img {
66
+ img {
67
+ width: 100%;
68
+ }
69
+ }
70
+
71
+ .exceed-limit {
72
+ border-color: red !important;
73
+ }
74
+
75
+ .error-message {
76
+ color: red;
77
+ }
78
+
79
+
80
+ .file-list-box {
81
+ margin-top: 10px;
82
+ width: 100%;
83
+ height: auto;
84
+
85
+ .file-out-box {
86
+ border: 1px solid var(--custom-theme-border-4);
87
+ border-radius: 6px 6px 6px 6px;
88
+ background: var(--custom-theme-fill-7);
89
+ padding: 24px 8px 8px;
90
+ width: 272px;
91
+ height: 80px;
92
+ margin-right: 16px;
93
+ margin-bottom: 16px;
94
+ position: relative;
95
+ }
96
+
97
+ .file-list-item {
98
+ width: 256px;
99
+ height: 48px;
100
+
101
+ .file-list-item-left {
102
+ width: calc(100% - 20px);
103
+ height: 100%;
104
+
105
+ .file-list-item-icon {
106
+ width: 41px;
107
+ height: 41px;
108
+
109
+ .file-icon {
110
+ width: 41px;
111
+ }
112
+ }
113
+
114
+ .file-name-box {
115
+ margin-left: 8px;
116
+ height: 100%;
117
+ max-width: calc(100% - 50px);
118
+
119
+ .file-name {
120
+ font-weight: 400;
121
+ font-size: 12px;
122
+ color: var(--custom-theme-text-1);
123
+ line-height: 12x;
124
+ display: -webkit-box;
125
+ -webkit-box-orient: vertical;
126
+ -webkit-line-clamp: 2;
127
+ overflow: hidden;
128
+ word-break: break-all;
129
+ }
130
+
131
+ .file-size {
132
+
133
+ font-weight: 400;
134
+ font-size: 12px;
135
+ color: var(--custom-theme-text-3);
136
+ line-height: 11px;
137
+ }
138
+ }
139
+ }
140
+
141
+ .file-list-item-right {
142
+ height: 100%;
143
+
144
+ .file-preview {
145
+ width: 16px;
146
+ cursor: pointer;
147
+ }
148
+
149
+ .file-download {
150
+ width: 16px;
151
+ cursor: pointer;
152
+ }
153
+ }
154
+ }
155
+
156
+ .delete-box {
157
+ position: absolute;
158
+ right: -7px;
159
+ top: -7px;
160
+ overflow: hidden;
161
+ font-size: 16px;
162
+ cursor: pointer;
163
+
164
+ }
165
+
166
+ .table-delete {
167
+ position: absolute;
168
+ right: -7px;
169
+ top: -7px;
170
+ overflow: hidden;
171
+ font-size: 16px;
172
+ cursor: pointer;
173
+
174
+ }
175
+ }
176
+
177
+ .comment-item {
178
+ display: flex;
179
+ flex-direction: row;
180
+ justify-content: flex-start;
181
+ align-items: flex-start;
182
+ width: 100%;
183
+ height: auto;
184
+
185
+ .comment-item-avatar {
186
+ border-radius: 6px;
187
+ background-color: #d8d8d8;
188
+ background-size: cover;
189
+ border-radius: 6px;
190
+ float: left;
191
+ height: 40px;
192
+ margin-right: 12px;
193
+ width: 40px;
194
+ overflow: hidden;
195
+ margin-right: 12px;
196
+ }
197
+
198
+ .comment-show-box {
199
+ width: calc(100% - 52px);
200
+ display: flex;
201
+ flex-direction: column;
202
+ justify-content: flex-start;
203
+ align-items: flex-start;
204
+ height: auto;
205
+ margin-bottom: 16px;
206
+
207
+ .comment-show-name-box {
208
+ color: var(--custom-theme-text-3);
209
+ font-size: 16px;
210
+ margin-bottom: 6px;
211
+
212
+ .comment-show-name-box-name {
213
+ margin-right: 18px;
214
+ color: var(--custom-theme-text-1);
215
+
216
+ }
217
+ }
218
+
219
+ .comment-show-content-box {
220
+ color: var(--custom-theme-text-2);
221
+ font-size: 14px;
222
+ margin-bottom: 6px;
223
+ word-break: break-all;
224
+ }
225
+
226
+ .comment-show-at-box {
227
+ display: flex;
228
+ flex-direction: row;
229
+ justify-content: flex-start;
230
+ align-items: center;
231
+ height: auto;
232
+ width: 100%;
233
+
234
+ .comment-show-at-item {
235
+ margin-right: 12px;
236
+ color: var(--custom-theme-normal-normal);
237
+ font-size: 13px;
238
+ }
239
+ }
240
+ }
241
+ }
242
+
243
+ .comment-to-reply {
244
+ width: 100%;
245
+ margin-bottom: 8px;
246
+ .comment-to-reply-button {
247
+ width: 100%;
248
+ display: flex;
249
+ justify-content: flex-end;
250
+ }
251
+ }
252
+
253
+ .reply-box {
254
+ font-size: 14px;
255
+ width: 100%;
256
+ height: auto;
257
+ letter-spacing: 0.5px;
258
+ color: var(--custom-theme-text-1);
259
+ background: var(--custom-theme-fill-3);
260
+ padding: 12px 8px;
261
+ .reply-box-name {
262
+ color: var(--custom-theme-normal-normal);
263
+ margin: 0 8px;
264
+ }
265
+
266
+ .reply-item {
267
+ font-size: 14px;
268
+ width: 100%;
269
+ height: auto;
270
+ display: flex;
271
+ flex-direction: row;
272
+ justify-content: flex-start;
273
+ align-items: flex-start;
274
+ margin-bottom: 12px;
275
+ &:hover {
276
+ .reply-item-button {
277
+ display: inline-block !important;
278
+ }
279
+ }
280
+
281
+ &-button {
282
+ display: none; // 默认隐藏按钮
283
+ margin-left: 12px;
284
+ color: var(--custom-theme-normal-normal);
285
+ cursor: pointer;
286
+ transition: opacity 0.3s;
287
+
288
+ &:hover {
289
+ opacity: 0.8;
290
+ }
291
+ }
292
+ }
293
+ .reply-item-left{
294
+ width: calc(100% - 148px);
295
+ word-break: break-all;
296
+ }
297
+ .reply-item-time{
298
+ width: 148px;
299
+ text-align: right;
300
+ }
301
+ }
302
+ .comment-button-list{
303
+ margin: 8px 0;
304
+ }
@@ -0,0 +1,202 @@
1
+ <template>
2
+ <el-dialog v-model="dialogVisible" title="裁剪签名图片" width="560px" @close="closeDialog">
3
+ <div class="cropper-content">
4
+ <div class="cropper-container">
5
+ <vue-cropper
6
+ v-if="showCropper"
7
+ class="crop"
8
+ ref="cropperRef"
9
+ :autoCrop="option.autoCrop"
10
+ :autoCropHeight="option.autoCropHeight"
11
+ :autoCropWidth="option.autoCropWidth"
12
+ :canMove="option.canMove"
13
+ :canScale="option.canScale"
14
+ :centerBox="option.centerBox"
15
+ :fixed="option.fixed"
16
+ :fixedBox="option.fixedBox"
17
+ :fixedNumber="option.fixedNumber"
18
+ :img="currentFile"
19
+ :info-true="option.infoTrue"
20
+ :mode="option.mode"
21
+ :origin="option.origin"
22
+ :outputSize="option.outputSize"
23
+ :outputType="option.outputType"
24
+ ></vue-cropper>
25
+ </div>
26
+
27
+ <!-- 旋转控制按钮 -->
28
+ <div class="rotate-controls">
29
+ <el-button-group>
30
+ <el-button size="small" @click="rotateLeft" :icon="RefreshLeft">
31
+ 左旋转90°
32
+ </el-button>
33
+ <el-button size="small" @click="rotateRight" :icon="RefreshRight">
34
+ 右旋转90°
35
+ </el-button>
36
+ </el-button-group>
37
+ </div>
38
+ </div>
39
+
40
+ <template #footer>
41
+ <el-button @click="dialogVisible = false">取消</el-button>
42
+ <el-button type="primary" @click="confirmCrop" :loading="submitLoading">确定</el-button>
43
+ </template>
44
+ </el-dialog>
45
+ </template>
46
+
47
+ <script setup lang="ts">
48
+ import { ref, nextTick } from "vue";
49
+ import { ElMessage } from "element-plus";
50
+ import { RefreshLeft, RefreshRight } from '@element-plus/icons-vue';
51
+
52
+ const emits = defineEmits(["success"]);
53
+
54
+ const submitLoading = ref<boolean>(false)
55
+
56
+ const option = ref({
57
+ autoCrop: true,
58
+ autoCropHeight: 100,
59
+ autoCropWidth: 133,
60
+ canMove: true,
61
+ canScale: true,
62
+ centerBox: true,
63
+ fixed: true,
64
+ fixedBox: false,
65
+ fixedNumber: [133, 100],
66
+ infoTrue: true,
67
+ mode: "contain",
68
+ origin: false,
69
+ outputSize: 1,
70
+ outputType: "png",
71
+ });
72
+
73
+ const showCropper = ref(false);
74
+ const dialogVisible = ref(false);
75
+ const cropperRef = ref<any>();
76
+ const currentFile = ref<any>();
77
+
78
+ // 打开裁剪弹框
79
+ const open = async (file: File | Blob) => {
80
+ try {
81
+ dialogVisible.value = true;
82
+ currentFile.value = await fileToBase64(file);
83
+ await nextTick();
84
+ setTimeout(() => {
85
+ showCropper.value = true;
86
+ }, 10);
87
+ } catch (error) {
88
+ console.error('打开裁剪器失败:', error);
89
+ ElMessage.error("打开裁剪器失败,请重试!");
90
+ }
91
+ };
92
+
93
+ // 文件转 Base64
94
+ const fileToBase64 = (file: File | Blob): Promise<string> => {
95
+ return new Promise((resolve, reject) => {
96
+ const reader = new FileReader();
97
+ reader.readAsDataURL(file);
98
+ reader.onload = () => resolve(reader.result as string);
99
+ reader.onerror = (error) => reject(error);
100
+ });
101
+ };
102
+
103
+ // Base64 转 File
104
+ function base64ToFile(base64String: string, fileName: string, mimeType: string) {
105
+ const byteString = atob(base64String.split(',')[1]);
106
+ const ab = new ArrayBuffer(byteString.length);
107
+ const ia = new Uint8Array(ab);
108
+
109
+ for (let i = 0; i < byteString.length; i++) {
110
+ ia[i] = byteString.charCodeAt(i);
111
+ }
112
+
113
+ const blob = new Blob([ab], { type: mimeType });
114
+ return new File([blob], fileName, { type: mimeType });
115
+ }
116
+
117
+ // Base64 转 Blob
118
+ function base64ToBlob(base64String: string, mimeType: string): Blob {
119
+ const byteString = atob(base64String.split(',')[1]);
120
+ const ab = new ArrayBuffer(byteString.length);
121
+ const ia = new Uint8Array(ab);
122
+
123
+ for (let i = 0; i < byteString.length; i++) {
124
+ ia[i] = byteString.charCodeAt(i);
125
+ }
126
+
127
+ return new Blob([ab], { type: mimeType });
128
+ }
129
+
130
+ // 确认裁剪
131
+ const confirmCrop = async () => {
132
+ submitLoading.value = true;
133
+ try {
134
+ cropperRef.value?.getCropData((data: string) => {
135
+ if (data) {
136
+ // 将裁剪后的 base64 转为 Blob
137
+ const croppedBlob = base64ToBlob(data, 'image/png');
138
+
139
+ // 发送裁剪后的 Blob 给父组件
140
+ emits("success", croppedBlob);
141
+ dialogVisible.value = false;
142
+ showCropper.value = false;
143
+ }
144
+ submitLoading.value = false;
145
+ });
146
+ } catch (error) {
147
+ ElMessage.error("裁剪图片失败!");
148
+ submitLoading.value = false;
149
+ }
150
+ };
151
+
152
+ // 左旋转90度
153
+ const rotateLeft = () => {
154
+ cropperRef.value?.rotateLeft();
155
+ };
156
+
157
+ // 右旋转90度
158
+ const rotateRight = () => {
159
+ cropperRef.value?.rotateRight();
160
+ };
161
+
162
+ // 关闭弹框
163
+ const closeDialog = () => {
164
+ showCropper.value = false;
165
+ currentFile.value = null;
166
+ };
167
+
168
+ defineExpose({
169
+ open,
170
+ });
171
+ </script>
172
+
173
+ <style scoped lang="scss">
174
+ .cropper-content {
175
+ display: flex;
176
+ flex-direction: column;
177
+ gap: 16px;
178
+ }
179
+
180
+ .cropper-container {
181
+ width: 500px;
182
+ height: 400px;
183
+ position: relative;
184
+ }
185
+
186
+ .crop {
187
+ width: 100%;
188
+ height: 100%;
189
+ }
190
+
191
+ .rotate-controls {
192
+ display: flex;
193
+ justify-content: center;
194
+ align-items: center;
195
+ padding: 8px 0;
196
+
197
+ .el-button-group {
198
+ display: flex;
199
+ gap: 0;
200
+ }
201
+ }
202
+ </style>