suggestion-option.tsx 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. import { defineComponent, onMounted, reactive, ref } from 'vue';
  2. import styles from './suggestion-option.module.less';
  3. import {
  4. NButton,
  5. NForm,
  6. NFormItem,
  7. NInput,
  8. NSelect,
  9. NSpace,
  10. useMessage,
  11. NUpload,
  12. UploadFileInfo,
  13. NImage
  14. } from 'naive-ui';
  15. import { useUserStore } from '/src/store/modules/users';
  16. import chioseAdd from '../images/chioseAdd.png';
  17. import CSelect from '../../CSelect';
  18. import { policy } from '../../upload-file/api';
  19. import { addSuggestion, getSuggestionList,sysParamConfigPage } from '../modals/api';
  20. export default defineComponent({
  21. name: 'train-update',
  22. emits: ['close', 'submit'],
  23. setup(props, { emit }) {
  24. const message = useMessage();
  25. const userStore = useUserStore();
  26. const forms = reactive({
  27. suggestionTypeId: null,
  28. clientType: 'TEACHER',
  29. content: '',
  30. attachmentUrls: '',
  31. type: "APP",
  32. mobileNo:userStore.getUserInfo.phone
  33. });
  34. const state = reactive([]) as any;
  35. const suggestionTypeList = ref([]as any)
  36. const ossUploadUrl = `https://gyt.ks3-cn-beijing.ksyuncs.com/`;
  37. const uploadRef = ref();
  38. const fileListRef = ref<UploadFileInfo[]>([]);
  39. const formsRef = ref();
  40. const btnLoading = ref(false);
  41. const tempFiileBuffer = ref();
  42. const email = ref('')
  43. const phone = ref('')
  44. const onSubmit = async () => {
  45. if (!forms.suggestionTypeId) {
  46. message.error('请选择反馈类型');
  47. return;
  48. }
  49. if (!forms.content) {
  50. message.error('请填写反馈信息');
  51. return;
  52. }
  53. const attachmentUrlsList = fileListRef.value.map((item:any)=>{
  54. console.log(item,'item')
  55. const name = item.name;
  56. // const suffix = name.slice(name.lastIndexOf('.'));
  57. const fileName = `${item.id + name}`;
  58. const url = ossUploadUrl + fileName;
  59. return url
  60. })
  61. const attachmentUrls = attachmentUrlsList.join(',')
  62. try{
  63. const res = await addSuggestion({...forms,attachmentUrls})
  64. message.success('提交成功')
  65. emit('close')
  66. }catch(e){
  67. console.log(e)
  68. }
  69. console.log('onSubmit');
  70. };
  71. const onBeforeUpload = async (options: any) => {
  72. console.log(options, 'onBeforeUpload');
  73. const file = options.file;
  74. // 文件大小
  75. let isLt2M = true;
  76. const size = 2;
  77. if (size) {
  78. isLt2M = file.file.size / 1024 / 1024 < size;
  79. if (!isLt2M) {
  80. message.error(`文件大小不能超过${size}M`);
  81. return false;
  82. }
  83. }
  84. if (!isLt2M) {
  85. return isLt2M;
  86. }
  87. // 是否裁切
  88. try {
  89. btnLoading.value = true;
  90. const name = file.file.name;
  91. const fileName = `${file.id + name}`;
  92. const obj = {
  93. filename: fileName,
  94. bucketName: 'gyt',
  95. postData: {
  96. filename: fileName,
  97. acl: 'public-read',
  98. key: fileName,
  99. unknowValueField: []
  100. }
  101. };
  102. const { data } = await policy(obj);
  103. state.push({
  104. id: file.id,
  105. tempFiileBuffer: file.file,
  106. policy: data.policy,
  107. signature: data.signature,
  108. acl: 'public-read',
  109. key: fileName,
  110. KSSAccessKeyId: data.kssAccessKeyId,
  111. name: fileName
  112. })
  113. } catch {
  114. //
  115. // message.error('上传失败')
  116. btnLoading.value = false;
  117. return false;
  118. }
  119. return true;
  120. };
  121. const onFinish = (options: any) => {
  122. // const url =
  123. const name = options.file.name;
  124. // const suffix = name.slice(name.lastIndexOf('.'));
  125. const fileName = `${options.file.id + name}`;
  126. const url = ossUploadUrl + fileName;
  127. // urlList.value.push(url);
  128. // onFinishAfter(options);
  129. };
  130. const onRemove = async (event:any) => {
  131. console.log(event)
  132. btnLoading.value = false;
  133. };
  134. const getTypeList = async () => {
  135. try {
  136. const res = await getSuggestionList({ rows: 9999, page: 1 });
  137. suggestionTypeList.value = res.data.rows;
  138. } catch (e) {
  139. console.log('请求报错')
  140. console.log(e);
  141. }
  142. };
  143. const getPhoneInfo = async ()=>{
  144. try {
  145. const {data} = await sysParamConfigPage({ page: 1, rows: 999, group: 'OTHER' });
  146. const rows = data.rows || []
  147. email.value = rows.find((item:any)=>{
  148. return item.paramName == 'customer_service_email'
  149. }).paramValue
  150. phone.value = rows.find((item:any)=>{
  151. return item.paramName == 'customer_service_phone'
  152. }).paramValue
  153. console.log( email.value , phone.value)
  154. } catch (e) {
  155. console.log('请求报错')
  156. console.log(e);
  157. }
  158. }
  159. onMounted(()=>{
  160. getTypeList()
  161. getPhoneInfo()
  162. })
  163. return () => (
  164. <div class={styles.suggestOption}>
  165. <div class={[styles.updatePassword,isubmit.value?styles.isAni:'']}>
  166. <div class={[styles.formWrap,isubmit.value?styles.isAni:'']}>
  167. <NImage
  168. class={styles.closeBtn}
  169. src={suggestClose}
  170. previewDisabled onClick={() => emit('close')}></NImage>
  171. <NImage class={styles.bgLine} src={bgLine} previewDisabled></NImage>
  172. <h2 class={styles.formTitle}>意见反馈</h2>
  173. <div class={styles.formWrapInfo}>
  174. <NForm
  175. labelAlign="right"
  176. labelPlacement="left"
  177. labelWidth={'auto'}
  178. ref={formsRef}
  179. model={forms}
  180. requireMarkPlacement="left">
  181. {/* <NFormItem
  182. path="currentClass"
  183. label=""
  184. class={styles.phoneContainer}>
  185. <p class={styles.phone}>{forms.mobile}</p>
  186. </NFormItem> */}
  187. <NFormItem
  188. rule={[
  189. {
  190. required: true,
  191. message: '请选择反馈类型'
  192. }
  193. ]}
  194. path="suggestionTypeId">
  195. <CSelect
  196. value-field="id"
  197. label-field="name"
  198. style={{ width: '357px!important' }}
  199. {...({
  200. options: suggestionTypeList.value,
  201. placeholder: '反馈类型(必选)',
  202. clearable: true,
  203. inline: true
  204. } as any)}
  205. v-model:value={forms.suggestionTypeId}></CSelect>
  206. </NFormItem>
  207. <NFormItem path='content' rule={[
  208. {
  209. required: true,
  210. message: '请输入反馈内容'
  211. }
  212. ]}>
  213. <NInput
  214. class={styles.countInput}
  215. type="textarea"
  216. rows={5}
  217. placeholder={'请输入反馈内容'}
  218. maxlength={500}
  219. showCount
  220. v-model:value={forms.content}></NInput>
  221. </NFormItem>
  222. <NFormItem>
  223. <NUpload
  224. list-type="image-card"
  225. accept=".jpg,jpeg,.png"
  226. v-model:fileList={fileListRef.value}
  227. ref={uploadRef}
  228. multiple={true}
  229. max={5}
  230. data={(file: any) => {
  231. const item = state.find((c: any) => {
  232. return c.id == file.file.id;
  233. });
  234. const { id, tempFiileBuffer, ...more } = item;
  235. return { ...more };
  236. }}
  237. showPreviewButton
  238. action={ossUploadUrl}
  239. onBeforeUpload={(options: any) => onBeforeUpload(options)}
  240. onRemove={(options: any) => onRemove(options)}
  241. onFinish={(options: any) => onFinish(options)}>
  242. <div class={styles.addInput}>
  243. <NImage previewDisabled src={chioseAdd}></NImage>
  244. 点击上传
  245. </div>
  246. </NUpload>
  247. </NFormItem>
  248. {
  249. (phone.value || email.value)? <NFormItem>
  250. <div class={styles.messageWrap}>
  251. {phone.value? <p>客服电话:{phone.value}</p>:null}
  252. {email.value? <p>邮箱:{email.value}</p>:null}
  253. </div>
  254. </NFormItem>:null
  255. }
  256. <NSpace class={styles.updateBtnGroup}>
  257. <NButton strong type="default" round onClick={() => emit('close')}>
  258. 取消
  259. </NButton>
  260. <NButton strong type="primary" round onClick={() => onSubmit()}>
  261. 确认
  262. </NButton>
  263. </NSpace>
  264. </NForm>
  265. </div>
  266. </div>
  267. );
  268. }
  269. });