name.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <script setup lang='ts'>
  2. import request from '~/request'
  3. import { showFailToast, showSuccessToast, showDialog } from 'vant';
  4. const router = useRouter()
  5. function onClickLeft() {
  6. router.back()
  7. }
  8. const form = reactive({
  9. // axa_sycj_zdysyid_v2: undefined,
  10. axi_name: undefined,
  11. mode: '2',
  12. file: undefined,
  13. axi_rxcj_spwj_v2: undefined,
  14. })
  15. function onSubmit() {
  16. request({
  17. url: '/aimooc/xnszr_img/add',
  18. data: {
  19. aimooc_xnszr_img: {
  20. axi_is_system: 2,
  21. axi_name: form.axi_name,
  22. axi_rxcj_spwj_v2: form.axi_rxcj_spwj_v2,
  23. }
  24. }
  25. }).then((res: any) => {
  26. const info = res.data.one_info
  27. console.log('info : ', info)
  28. if (res?.code === '1') {
  29. showDialog({
  30. title: '提示',
  31. message: '提交成功',
  32. confirmButtonText: '返回首页',
  33. }).then(() => {
  34. router.back()
  35. })
  36. } else {
  37. showDialog({
  38. title: '提示',
  39. message: res?.msg,
  40. confirmButtonText: '重新提交',
  41. }).then(() => {
  42. onSubmit()
  43. })
  44. }
  45. // router.back()
  46. })
  47. };
  48. function afterRead(file: any) {
  49. file.status = 'uploading';
  50. file.message = '上传中...';
  51. console.log('文件类型 : ', file.file.type)
  52. // form.axi_rxcj_spwj_v2 = file.content
  53. request({
  54. url: '/upload/main/file',
  55. // 120 min
  56. timeout: 120 * 60000,
  57. data: {
  58. filedata: file.file
  59. },
  60. transformRequest: [
  61. function (data: any) {
  62. const formData = new FormData();
  63. Object.keys(data).forEach(key => formData.append(key, data[key]))
  64. return formData;
  65. },
  66. ],
  67. }).then((res: any) => {
  68. console.log('res : ', res)
  69. if (res?.code === '1') {
  70. form.axi_rxcj_spwj_v2 = res.data.url
  71. file.status = 'finished';
  72. file.message = '上传成功';
  73. } else {
  74. showFailToast(res?.msg)
  75. file.status = 'failed';
  76. file.message = '上传失败';
  77. }
  78. }).catch((error: any) => {
  79. if (error.code === 'ECONNABORTED') {
  80. showFailToast('请求超时,请检查网络连接并重试')
  81. }
  82. file.status = 'failed';
  83. file.message = '上传超时';
  84. })
  85. }
  86. function changeMode(name: string) {
  87. if (form.axi_rxcj_spwj_v2) {
  88. form.file = undefined
  89. form.axi_rxcj_spwj_v2 = undefined
  90. }
  91. if (name === '2') {
  92. try {
  93. navigator?.mediaDevices
  94. ?.getUserMedia({ video: true })
  95. ?.catch(() => {
  96. showDialog({
  97. title: '提示',
  98. message: '请在设置中打开相机权限,如果已经打开依然提示说明您的浏览器不支持',
  99. });
  100. form.mode = '1'
  101. });
  102. } catch (error) {
  103. showDialog({
  104. title: '提示',
  105. message: '请在设置中打开相机权限,如果已经打开依然提示说明您的浏览器不支持',
  106. });
  107. form.mode = '1'
  108. }
  109. }
  110. }
  111. // 2G 视频大小限制
  112. const videoSize = 2 * 1024 * 1024 * 1024;
  113. function beforeRead (file: any) {
  114. console.log('上传视频预校验 : ', file)
  115. if(file.type !== 'video/mp4' && file.type !== 'video/mov' && file.type !== 'video/webm'){
  116. showFailToast('视频类型'+file.type+'不支持采集,请上传 mp4、mov、webm 格式的视频')
  117. return false
  118. }
  119. if (file.size > videoSize){
  120. showFailToast('文件大小不能超过 2GB')
  121. return false
  122. }else{
  123. return true
  124. }
  125. }
  126. </script>
  127. <template>
  128. <van-nav-bar title="选择人像采集模式" left-arrow @click-left="onClickLeft"></van-nav-bar>
  129. <div class="flex-auto py-4 ">
  130. <van-form class="h-full flex flex-col" @submit="onSubmit">
  131. <van-cell-group inset>
  132. <van-field v-model="form.axi_name" name="请输入数字人名称" label="数字人名称" placeholder=""
  133. :rules="[{ required: true, message: '数字人名称不能为空' }]" />
  134. <van-field name="请选择人像采集模式" label="人像采集模式">
  135. <template #input>
  136. <van-radio-group v-model="form.mode" @change="changeMode">
  137. <van-radio name="2">已有录制,上传视频</van-radio>
  138. <van-radio class="mt-14px" name="1">手机录制</van-radio>
  139. </van-radio-group>
  140. </template>
  141. </van-field>
  142. <van-field v-if="form.mode === '1'" name="录制视频" label="录制视频" :rules="[{ required: true, message: '录制视频不能为空' }]">
  143. <template #input>
  144. <van-uploader v-model="form.file" :max-count="1" accept="video/mp4,video/mov,video/webm" capture="user" :after-read="afterRead"
  145. :max-size="videoSize" :before-read="beforeRead ">
  146. <van-button type="primary">手机录制入口</van-button>
  147. </van-uploader>
  148. </template>
  149. </van-field>
  150. <van-field v-if="form.mode === '2'" name="上传视频" label="上传视频" :rules="[{ required: true, message: '上传视频不能为空' }]">
  151. <template #input>
  152. <van-uploader v-model="form.file" :max-count="1" accept="video/mp4,video/mov,video/webm" :after-read="afterRead"
  153. :max-size="videoSize" :before-read="beforeRead " />
  154. </template>
  155. </van-field>
  156. </van-cell-group>
  157. <div class="px-4 mt-20">
  158. <van-button block type="primary" native-type="submit">
  159. 提交
  160. </van-button>
  161. </div>
  162. </van-form>
  163. </div>
  164. </template>