lex 1 year ago
parent
commit
ad8fa3d660

+ 4 - 1
src/components/col-search/index.tsx

@@ -59,7 +59,7 @@ export default defineComponent({
       default: iconSearch
     }
   },
-  emits: ['click'],
+  emits: ['click', 'input'],
   watch: {
     modelValue() {
       this.search = this.modelValue
@@ -82,6 +82,9 @@ export default defineComponent({
           placeholder={this.placeholder}
           disabled={this.disabled}
           autofocus={this.autofocus}
+          onUpdate:modelValue={(val: any) => {
+            this.$emit('input', val)
+          }}
           onSearch={(val: string) => {
             this.onSearch(val)
           }}

+ 214 - 215
src/components/col-upload-video/index.tsx

@@ -1,215 +1,214 @@
-import request from '@/helpers/request'
-import { Icon, Toast, Uploader, Image } from 'vant'
-import { defineComponent } from 'vue'
-import styles from './index.module.less'
-import { useCustomFieldValue } from '@vant/use'
-import { browser } from '@/helpers/utils'
-import umiRequest from 'umi-request'
-import iconUploader from '@common/images/icon_uploader_video.png'
-import iconUploadPoster from '@common/images/icon_upload_poster.png'
-import { postMessage } from '@/helpers/native-message'
-import { getOssUploadUrl, state } from '@/state'
-
-export default defineComponent({
-  name: 'ColUploadVideo',
-  props: {
-    modelValue: String,
-    posterUrl: String,
-    tips: {
-      type: String,
-      default: '点击上传'
-    },
-    nativeUpload: {
-      // 是否使用原生上传, 且当前环境为app才会生效
-      type: Boolean,
-      default: true
-    },
-    size: {
-      type: Number,
-      default: 30
-    },
-    deletable: {
-      type: Boolean,
-      default: true
-    },
-    bucket: {
-      type: String,
-      default: 'daya'
-    }
-  },
-  methods: {
-    beforeRead(file: any) {
-      const isLt2M = file.size / 1024 / 1024 < this.size
-      // console.log(this.size)
-      if (!isLt2M) {
-        Toast(`上传视频大小不能超过 ${this.size}MB`)
-        return false
-      }
-      return true
-    },
-    beforeDelete(file: any, detail: { index: any }) {
-      // this.dataModel.splice(detail.index, 1)
-      return true
-    },
-    async afterRead(file: any, detail: any) {
-      try {
-        file.status = 'uploading'
-        file.message = '上传中...'
-        // 获取签名
-        const signUrl =
-          state.platformType === 'TEACHER'
-            ? '/api-teacher/getUploadSign'
-            : '/api-student/getUploadSign'
-
-        const fileName = file.file.name.replaceAll(' ', '_')
-        const key = new Date().getTime() + fileName
-        console.log(file)
-
-        const res = await request.post(signUrl, {
-          data: {
-            filename: fileName,
-            bucketName: this.bucket,
-            postData: {
-              filename: fileName,
-              acl: 'public-read',
-              key: key,
-              unknowValueField: []
-            }
-          }
-        })
-        Toast.loading({
-          message: '加载中...',
-          forbidClick: true,
-          loadingType: 'spinner',
-          duration: 0
-        })
-        const obj = {
-          policy: res.data.policy,
-          signature: res.data.signature,
-          key: key,
-          KSSAccessKeyId: res.data.kssAccessKeyId,
-          acl: 'public-read',
-          name: fileName
-        }
-        let formData = new FormData()
-        for (let key in obj) {
-          formData.append(key, obj[key])
-        }
-        formData.append('file', file.file)
-        await umiRequest(getOssUploadUrl(this.bucket), {
-          method: 'POST',
-          data: formData
-        })
-        const uploadUrl = getOssUploadUrl(this.bucket) + key
-        Toast.clear()
-        this.$emit('update:modelValue', uploadUrl)
-        // this.onUploadChange(uploadUrl)
-        // let formData = new FormData()
-        // formData.append('file', file.file)
-        // let res = await request.post('/api-teacher/uploadFile', {
-        //   data: formData
-        // })
-        // const url = res.data.url
-        // this.$emit('update:modelValue', uploadUrl)
-      } catch (error) {
-        //
-        console.log(error)
-      }
-    },
-    onClose(e: any) {
-      this.$emit('update:modelValue', null)
-      e.stopPropagation()
-    },
-    onNativeUpload() {
-      postMessage(
-        { api: 'chooseFile', content: { type: 'video', bucket: this.bucket } },
-        (res: any) => {
-          // this.posterUrlInner = res.firstFrameImg
-          this.$emit('update:modelValue', res.fileUrl)
-          // this.$emit('update:posterUrl', res.firstFrameImg)
-        }
-      )
-    },
-    getVideoBase64(url: string) {
-      return new Promise(function (resolve) {
-        let dataURL = ''
-        const video = document.createElement('video')
-        video.setAttribute('crossOrigin', 'anonymous') // 处理跨域
-        video.setAttribute('src', url)
-        video.setAttribute('preload', 'auto')
-        video.addEventListener('loadeddata', function () {
-          console.log(video, 'video loadeddata')
-          const canvas = document.createElement('canvas')
-          console.log('video.clientWidth', video.videoWidth) // 视频宽
-          console.log('video.clientHeight', video.videoHeight) // 视频高
-          const width = video.videoWidth || 750 // canvas的尺寸和图片一样
-          const height = video.videoHeight || 500 // 设置默认宽高为 750 * 500
-          canvas.width = width
-          canvas.height = height
-          ;(canvas as any)
-            .getContext('2d')
-            .drawImage(video, 0, 0, width, height) // 绘制canvas
-          dataURL = canvas.toDataURL('image/jpeg') // 转换为base64
-          resolve(dataURL)
-        })
-      })
-    }
-  },
-  render() {
-    useCustomFieldValue(() => this.modelValue)
-    return (
-      <div class={styles['uploader-section']}>
-        {this.modelValue && this.deletable ? (
-          <Icon
-            name="cross"
-            onClick={this.onClose}
-            class={styles['img-close']}
-          />
-        ) : null}
-        {browser().isApp && this.nativeUpload ? (
-          <div onClick={this.onNativeUpload} style={{ height: '100%' }}>
-            {this.modelValue ? (
-              <video
-                ref="videoUpload"
-                class={styles.uploadImg}
-                src={this.modelValue + '#t=1,4'}
-                // poster={iconUploadPoster}
-              />
-            ) : (
-              <div class={styles.uploader}>
-                <Icon name={iconUploader} size="32" />
-                <p class={styles.uploaderText}>{this.tips}</p>
-              </div>
-            )}
-          </div>
-        ) : (
-          <>
-            {/* @ts-ignore */}
-            <Uploader
-              accept=".mp4"
-              afterRead={this.afterRead}
-              beforeRead={this.beforeRead}
-              beforeDelete={this.beforeDelete}
-              v-slots={{
-                default: () =>
-                  this.modelValue ? (
-                    <video
-                      ref="videoUpload"
-                      class={styles.uploadImg}
-                      src={this.modelValue + '#t=1,4'}
-                      // poster={this.posterUrl || ''}
-                    />
-                  ) : (
-                    <div class={styles.uploader}>
-                      <Icon name={iconUploader} size="32" />
-                      <p class={styles.uploaderText}>{this.tips}</p>
-                    </div>
-                  )
-              }}
-            />
-          </>
-        )}
-      </div>
-    )
-  }
-})
+import request from '@/helpers/request'
+import { Icon, Toast, Uploader, Image } from 'vant'
+import { defineComponent } from 'vue'
+import styles from './index.module.less'
+import { useCustomFieldValue } from '@vant/use'
+import { browser } from '@/helpers/utils'
+import umiRequest from 'umi-request'
+import iconUploader from '@common/images/icon_uploader_video.png'
+import iconUploadPoster from '@common/images/icon_upload_poster.png'
+import { postMessage } from '@/helpers/native-message'
+import { getOssUploadUrl, state } from '@/state'
+
+export default defineComponent({
+  name: 'ColUploadVideo',
+  props: {
+    modelValue: String,
+    posterUrl: String,
+    tips: {
+      type: String,
+      default: '点击上传'
+    },
+    nativeUpload: {
+      // 是否使用原生上传, 且当前环境为app才会生效
+      type: Boolean,
+      default: true
+    },
+    size: {
+      type: Number,
+      default: 30
+    },
+    deletable: {
+      type: Boolean,
+      default: true
+    },
+    bucket: {
+      type: String,
+      default: 'daya'
+    }
+  },
+  methods: {
+    beforeRead(file: any) {
+      const isLt2M = file.size / 1024 / 1024 < this.size
+      // console.log(this.size)
+      if (!isLt2M) {
+        Toast(`上传视频大小不能超过 ${this.size}MB`)
+        return false
+      }
+      return true
+    },
+    beforeDelete(file: any, detail: { index: any }) {
+      // this.dataModel.splice(detail.index, 1)
+      return true
+    },
+    async afterRead(file: any, detail: any) {
+      try {
+        file.status = 'uploading'
+        file.message = '上传中...'
+        // 获取签名
+        const signUrl =
+          state.platformType === 'TEACHER'
+            ? '/api-teacher/getUploadSign'
+            : '/api-student/getUploadSign'
+
+        const fileName = file.file.name.replaceAll(' ', '_')
+        const key = new Date().getTime() + fileName
+        console.log(file)
+
+        const res = await request.post(signUrl, {
+          data: {
+            filename: fileName,
+            bucketName: this.bucket,
+            postData: {
+              filename: fileName,
+              acl: 'public-read',
+              key: key
+            }
+          }
+        })
+        Toast.loading({
+          message: '加载中...',
+          forbidClick: true,
+          loadingType: 'spinner',
+          duration: 0
+        })
+        const obj = {
+          policy: res.data.policy,
+          signature: res.data.signature,
+          key: key,
+          KSSAccessKeyId: res.data.kssAccessKeyId,
+          acl: 'public-read',
+          name: fileName
+        }
+        const formData = new FormData()
+        for (const key in obj) {
+          formData.append(key, obj[key])
+        }
+        formData.append('file', file.file)
+        await umiRequest(getOssUploadUrl(this.bucket), {
+          method: 'POST',
+          data: formData
+        })
+        const uploadUrl = getOssUploadUrl(this.bucket) + key
+        Toast.clear()
+        this.$emit('update:modelValue', uploadUrl)
+        // this.onUploadChange(uploadUrl)
+        // let formData = new FormData()
+        // formData.append('file', file.file)
+        // let res = await request.post('/api-teacher/uploadFile', {
+        //   data: formData
+        // })
+        // const url = res.data.url
+        // this.$emit('update:modelValue', uploadUrl)
+      } catch (error) {
+        //
+        console.log(error)
+      }
+    },
+    onClose(e: any) {
+      this.$emit('update:modelValue', null)
+      e.stopPropagation()
+    },
+    onNativeUpload() {
+      postMessage(
+        { api: 'chooseFile', content: { type: 'video', bucket: this.bucket } },
+        (res: any) => {
+          // this.posterUrlInner = res.firstFrameImg
+          this.$emit('update:modelValue', res.fileUrl)
+          // this.$emit('update:posterUrl', res.firstFrameImg)
+        }
+      )
+    },
+    getVideoBase64(url: string) {
+      return new Promise(function (resolve) {
+        let dataURL = ''
+        const video = document.createElement('video')
+        video.setAttribute('crossOrigin', 'anonymous') // 处理跨域
+        video.setAttribute('src', url)
+        video.setAttribute('preload', 'auto')
+        video.addEventListener('loadeddata', function () {
+          console.log(video, 'video loadeddata')
+          const canvas = document.createElement('canvas')
+          console.log('video.clientWidth', video.videoWidth) // 视频宽
+          console.log('video.clientHeight', video.videoHeight) // 视频高
+          const width = video.videoWidth || 750 // canvas的尺寸和图片一样
+          const height = video.videoHeight || 500 // 设置默认宽高为 750 * 500
+          canvas.width = width
+          canvas.height = height
+          ;(canvas as any)
+            .getContext('2d')
+            .drawImage(video, 0, 0, width, height) // 绘制canvas
+          dataURL = canvas.toDataURL('image/jpeg') // 转换为base64
+          resolve(dataURL)
+        })
+      })
+    }
+  },
+  render() {
+    useCustomFieldValue(() => this.modelValue)
+    return (
+      <div class={styles['uploader-section']}>
+        {this.modelValue && this.deletable ? (
+          <Icon
+            name="cross"
+            onClick={this.onClose}
+            class={styles['img-close']}
+          />
+        ) : null}
+        {browser().isApp && this.nativeUpload ? (
+          <div onClick={this.onNativeUpload} style={{ height: '100%' }}>
+            {this.modelValue ? (
+              <video
+                ref="videoUpload"
+                class={styles.uploadImg}
+                src={this.modelValue + '#t=1,4'}
+                // poster={iconUploadPoster}
+              />
+            ) : (
+              <div class={styles.uploader}>
+                <Icon name={iconUploader} size="32" />
+                <p class={styles.uploaderText}>{this.tips}</p>
+              </div>
+            )}
+          </div>
+        ) : (
+          <>
+            {/* @ts-ignore */}
+            <Uploader
+              accept=".mp4"
+              afterRead={this.afterRead}
+              beforeRead={this.beforeRead}
+              beforeDelete={this.beforeDelete}
+              v-slots={{
+                default: () =>
+                  this.modelValue ? (
+                    <video
+                      ref="videoUpload"
+                      class={styles.uploadImg}
+                      src={this.modelValue + '#t=1,4'}
+                      // poster={this.posterUrl || ''}
+                    />
+                  ) : (
+                    <div class={styles.uploader}>
+                      <Icon name={iconUploader} size="32" />
+                      <p class={styles.uploaderText}>{this.tips}</p>
+                    </div>
+                  )
+              }}
+            />
+          </>
+        )}
+      </div>
+    )
+  }
+})

+ 237 - 238
src/components/col-upload/index.tsx

@@ -1,238 +1,237 @@
-import { Icon, Image, Toast, Uploader } from 'vant'
-import { defineComponent } from 'vue'
-import styles from './index.module.less'
-import ColCropper from '../col-cropper'
-import { useCustomFieldValue } from '@vant/use'
-import { postMessage } from '@/helpers/native-message'
-import umiRequest from 'umi-request'
-import iconUploader from '@common/images/icon_uploader.png'
-import request from '@/helpers/request'
-import { getOssUploadUrl, state } from '@/state'
-
-export default defineComponent({
-  name: 'col-upload',
-  props: {
-    modelValue: String,
-    tips: {
-      type: String,
-      default: '点击上传'
-    },
-    deletable: {
-      type: Boolean,
-      default: true
-    },
-    native: {
-      // 是否原生上传
-      type: Boolean,
-      default: false
-    },
-    cropper: {
-      // 是否进行裁切
-      type: Boolean,
-      default: false
-    },
-    options: {
-      // 裁切需要参数
-      type: Object,
-      default: {}
-    },
-    uploadSize: {
-      // 上传图片大小
-      type: Number,
-      default: 5
-    },
-    onUploadChange: {
-      type: Function,
-      default: (url: string) => {}
-    },
-    bucket: {
-      type: String,
-      default: 'daya'
-    }
-  },
-  methods: {
-    nativeUpload() {
-      postMessage(
-        {
-          api: 'chooseFile',
-          content: { type: 'img', max: 1, bucket: this.bucket }
-        },
-        (res: any) => {
-          console.log(res, 'fileUrl')
-          this.$emit('update:modelValue', res.fileUrl)
-        }
-      )
-    },
-    beforeRead(file: any) {
-      console.log(file, 'beforeRead')
-      const isLt2M = file.size / 1024 / 1024 < this.uploadSize
-      if (!isLt2M) {
-        Toast(`上传文件大小不能超过 ${this.uploadSize}MB`)
-        return false
-      }
-      return true
-    },
-    beforeDelete(file: any, detail: { index: any }) {
-      // this.dataModel.splice(detail.index, 1)
-      return true
-    },
-    async afterRead(file: any, detail: any) {
-      try {
-        file.status = 'uploading'
-        file.message = '上传中...'
-        await this.uploadFile(file.file)
-      } catch (error) {
-        //
-        console.log(error, '2323')
-        Toast.clear()
-      }
-    },
-    onClose(e: any) {
-      this.$emit('update:modelValue', null)
-      this.onUploadChange()
-      e.stopPropagation()
-    },
-    async getFile(file: any) {
-      try {
-        await this.uploadFile(file)
-      } catch {
-        //
-      }
-    },
-    async uploadFile(file: any) {
-      // 上传文件
-      try {
-        // 获取签名
-        const signUrl =
-          state.platformType === 'TEACHER'
-            ? '/api-teacher/getUploadSign'
-            : '/api-student/getUploadSign'
-        let tempName = file.name || ''
-        const fileName = tempName && tempName.replace(/ /gi, '_')
-        const key = new Date().getTime() + fileName
-        console.log(file)
-
-        const res = await request.post(signUrl, {
-          data: {
-            filename: fileName,
-            bucketName: this.bucket,
-            postData: {
-              filename: fileName,
-              acl: 'public-read',
-              key: key,
-              unknowValueField: []
-            }
-          }
-        })
-        Toast.loading({
-          message: '加载中...',
-          forbidClick: true,
-          loadingType: 'spinner',
-          duration: 0
-        })
-        const obj = {
-          policy: res.data.policy,
-          signature: res.data.signature,
-          key: key,
-          KSSAccessKeyId: res.data.kssAccessKeyId,
-          acl: 'public-read',
-          name: fileName
-        }
-        let formData = new FormData()
-        for (let key in obj) {
-          formData.append(key, obj[key])
-        }
-        formData.append('file', file, fileName)
-        await umiRequest(getOssUploadUrl(this.bucket), {
-          method: 'POST',
-          data: formData
-        })
-        console.log(getOssUploadUrl(this.bucket) + key)
-        const uploadUrl = getOssUploadUrl(this.bucket) + key
-        Toast.clear()
-        this.$emit('update:modelValue', uploadUrl)
-        this.onUploadChange(uploadUrl)
-      } catch (error) {
-        console.log(error, 'uploadFile')
-      }
-    }
-  },
-  render() {
-    useCustomFieldValue(() => this.modelValue)
-    return (
-      <div class={styles['uploader-section']}>
-        {this.modelValue && this.deletable ? (
-          <Icon
-            name="cross"
-            onClick={this.onClose}
-            class={styles['img-close']}
-          />
-        ) : null}
-        {this.cropper && !this.native ? (
-          <div class={styles['col-uploader']}>
-            {this.modelValue ? (
-              <Image
-                fit="cover"
-                position="center"
-                class={styles.uploadImg}
-                src={this.modelValue}
-              />
-            ) : (
-              <div class={styles.uploader}>
-                <Icon name={iconUploader} size="32" />
-                <p class={styles.uploaderText}>{this.tips}</p>
-              </div>
-            )}
-            <ColCropper option={this.options} getFile={this.getFile} />
-          </div>
-        ) : this.native ? (
-          <div
-            style={{
-              display: 'flex',
-              alignItems: 'center',
-              justifyContent: 'center',
-              height: '100%'
-            }}
-            onClick={this.nativeUpload}
-          >
-            {this.modelValue ? (
-              <Image
-                fit="cover"
-                position="center"
-                class={styles.uploadImg}
-                src={this.modelValue}
-              />
-            ) : (
-              <div class={styles.uploader}>
-                <Icon name={iconUploader} size="32" />
-                <p class={styles.uploaderText}>{this.tips}</p>
-              </div>
-            )}
-          </div>
-        ) : (
-          <Uploader
-            afterRead={this.afterRead}
-            beforeRead={this.beforeRead}
-            beforeDelete={this.beforeDelete}
-            v-slots={{
-              default: () =>
-                this.modelValue ? (
-                  <Image
-                    fit="cover"
-                    position="center"
-                    class={styles.uploadImg}
-                    src={this.modelValue}
-                  />
-                ) : (
-                  <div class={styles.uploader}>
-                    <Icon name={iconUploader} size="32" />
-                    <p class={styles.uploaderText}>{this.tips}</p>
-                  </div>
-                )
-            }}
-          />
-        )}
-      </div>
-    )
-  }
-})
+import { Icon, Image, Toast, Uploader } from 'vant'
+import { defineComponent } from 'vue'
+import styles from './index.module.less'
+import ColCropper from '../col-cropper'
+import { useCustomFieldValue } from '@vant/use'
+import { postMessage } from '@/helpers/native-message'
+import umiRequest from 'umi-request'
+import iconUploader from '@common/images/icon_uploader.png'
+import request from '@/helpers/request'
+import { getOssUploadUrl, state } from '@/state'
+
+export default defineComponent({
+  name: 'col-upload',
+  props: {
+    modelValue: String,
+    tips: {
+      type: String,
+      default: '点击上传'
+    },
+    deletable: {
+      type: Boolean,
+      default: true
+    },
+    native: {
+      // 是否原生上传
+      type: Boolean,
+      default: false
+    },
+    cropper: {
+      // 是否进行裁切
+      type: Boolean,
+      default: false
+    },
+    options: {
+      // 裁切需要参数
+      type: Object,
+      default: {}
+    },
+    uploadSize: {
+      // 上传图片大小
+      type: Number,
+      default: 5
+    },
+    onUploadChange: {
+      type: Function,
+      default: (url: string) => {}
+    },
+    bucket: {
+      type: String,
+      default: 'daya'
+    }
+  },
+  methods: {
+    nativeUpload() {
+      postMessage(
+        {
+          api: 'chooseFile',
+          content: { type: 'img', max: 1, bucket: this.bucket }
+        },
+        (res: any) => {
+          console.log(res, 'fileUrl')
+          this.$emit('update:modelValue', res.fileUrl)
+        }
+      )
+    },
+    beforeRead(file: any) {
+      console.log(file, 'beforeRead')
+      const isLt2M = file.size / 1024 / 1024 < this.uploadSize
+      if (!isLt2M) {
+        Toast(`上传文件大小不能超过 ${this.uploadSize}MB`)
+        return false
+      }
+      return true
+    },
+    beforeDelete(file: any, detail: { index: any }) {
+      // this.dataModel.splice(detail.index, 1)
+      return true
+    },
+    async afterRead(file: any, detail: any) {
+      try {
+        file.status = 'uploading'
+        file.message = '上传中...'
+        await this.uploadFile(file.file)
+      } catch (error) {
+        //
+        console.log(error, '2323')
+        Toast.clear()
+      }
+    },
+    onClose(e: any) {
+      this.$emit('update:modelValue', null)
+      this.onUploadChange()
+      e.stopPropagation()
+    },
+    async getFile(file: any) {
+      try {
+        await this.uploadFile(file)
+      } catch {
+        //
+      }
+    },
+    async uploadFile(file: any) {
+      // 上传文件
+      try {
+        // 获取签名
+        const signUrl =
+          state.platformType === 'TEACHER'
+            ? '/api-teacher/getUploadSign'
+            : '/api-student/getUploadSign'
+        const tempName = file.name || ''
+        const fileName = tempName && tempName.replace(/ /gi, '_')
+        const key = new Date().getTime() + fileName
+        console.log(file)
+
+        const res = await request.post(signUrl, {
+          data: {
+            filename: fileName,
+            bucketName: this.bucket,
+            postData: {
+              filename: fileName,
+              acl: 'public-read',
+              key: key
+            }
+          }
+        })
+        Toast.loading({
+          message: '加载中...',
+          forbidClick: true,
+          loadingType: 'spinner',
+          duration: 0
+        })
+        const obj = {
+          policy: res.data.policy,
+          signature: res.data.signature,
+          key: key,
+          KSSAccessKeyId: res.data.kssAccessKeyId,
+          acl: 'public-read',
+          name: fileName
+        }
+        const formData = new FormData()
+        for (const key in obj) {
+          formData.append(key, obj[key])
+        }
+        formData.append('file', file, fileName)
+        await umiRequest(getOssUploadUrl(this.bucket), {
+          method: 'POST',
+          data: formData
+        })
+        console.log(getOssUploadUrl(this.bucket) + key)
+        const uploadUrl = getOssUploadUrl(this.bucket) + key
+        Toast.clear()
+        this.$emit('update:modelValue', uploadUrl)
+        this.onUploadChange(uploadUrl)
+      } catch (error) {
+        console.log(error, 'uploadFile')
+      }
+    }
+  },
+  render() {
+    useCustomFieldValue(() => this.modelValue)
+    return (
+      <div class={styles['uploader-section']}>
+        {this.modelValue && this.deletable ? (
+          <Icon
+            name="cross"
+            onClick={this.onClose}
+            class={styles['img-close']}
+          />
+        ) : null}
+        {this.cropper && !this.native ? (
+          <div class={styles['col-uploader']}>
+            {this.modelValue ? (
+              <Image
+                fit="cover"
+                position="center"
+                class={styles.uploadImg}
+                src={this.modelValue}
+              />
+            ) : (
+              <div class={styles.uploader}>
+                <Icon name={iconUploader} size="32" />
+                <p class={styles.uploaderText}>{this.tips}</p>
+              </div>
+            )}
+            <ColCropper option={this.options} getFile={this.getFile} />
+          </div>
+        ) : this.native ? (
+          <div
+            style={{
+              display: 'flex',
+              alignItems: 'center',
+              justifyContent: 'center',
+              height: '100%'
+            }}
+            onClick={this.nativeUpload}
+          >
+            {this.modelValue ? (
+              <Image
+                fit="cover"
+                position="center"
+                class={styles.uploadImg}
+                src={this.modelValue}
+              />
+            ) : (
+              <div class={styles.uploader}>
+                <Icon name={iconUploader} size="32" />
+                <p class={styles.uploaderText}>{this.tips}</p>
+              </div>
+            )}
+          </div>
+        ) : (
+          <Uploader
+            afterRead={this.afterRead}
+            beforeRead={this.beforeRead}
+            beforeDelete={this.beforeDelete}
+            v-slots={{
+              default: () =>
+                this.modelValue ? (
+                  <Image
+                    fit="cover"
+                    position="center"
+                    class={styles.uploadImg}
+                    src={this.modelValue}
+                  />
+                ) : (
+                  <div class={styles.uploader}>
+                    <Icon name={iconUploader} size="32" />
+                    <p class={styles.uploaderText}>{this.tips}</p>
+                  </div>
+                )
+            }}
+          />
+        )}
+      </div>
+    )
+  }
+})

+ 1 - 2
src/tenant/music/music-detail/index.tsx

@@ -204,8 +204,7 @@ export default defineComponent({
           postData: {
             filename: fileName,
             acl: 'public-read',
-            key: keyTime,
-            unknowValueField: []
+            key: keyTime
           }
         }
 

+ 1 - 2
src/tenant/music/music-detail/new-index.tsx

@@ -192,8 +192,7 @@ export default defineComponent({
           postData: {
             filename: fileName,
             acl: 'public-read',
-            key: keyTime,
-            unknowValueField: []
+            key: keyTime
           }
         }
 

+ 22 - 2
src/tenant/music/search/header.tsx

@@ -17,6 +17,7 @@ import { SubjectEnum, useSubjectId } from '@/helpers/hooks'
 import { state } from '@/state'
 import TheSticky from '@/components/the-sticky'
 import bgImg from '../../images/bg-image-search.png'
+import request from '@/helpers/request'
 
 export const mitter = new mitt()
 
@@ -85,12 +86,29 @@ export default defineComponent({
       }
       if (val) {
         words.value.unshift(val)
-        console.log(words.value.length, 'words.value.length')
+        // console.log(words.value.length, 'words.value.length')
         words.value.length = Math.min(words.value.length, 10)
+        defaultClose()
       }
       mitter.emit('search', val)
     }
 
+    // 输入时搜索
+    const onInputSearch = async (val: any) => {
+      console.log('测试', val)
+      try {
+        const { data } = await request.post('/api-student/music/sheet/search', {
+          data: {
+            subjectId: subjects.id,
+            name: val
+          }
+        })
+        console.log(data, 'val')
+      } catch {
+        //
+      }
+    }
+
     const onComfirmSubject = (item: any) => {
       // console.log('onSort', item)
       subject.name = item.name
@@ -167,9 +185,11 @@ export default defineComponent({
               <Search
                 modelValue={keyword.value}
                 background="transparent"
+                onInput={(val: any) => {
+                  onInputSearch(val)
+                }}
                 onSearch={(val: any) => {
                   onSearch(val)
-
                   // searchResultStatus.value = true
                 }}
                 type="tenant"

+ 14 - 9
src/tenant/music/train-list/index.tsx

@@ -34,13 +34,24 @@ export default defineComponent({
     const route = useRoute()
     const router = useRouter()
     //
+
+    const subjectType = route.query.subjectType || ''
+    let title = ''
+    if (subjectType === 'SUBJECT') {
+      title = '声部练习'
+    } else if (subjectType === 'MUSIC') {
+      title = '独奏曲目'
+    } else if (subjectType === 'ENSEMBLE') {
+      title = '合奏练习'
+    }
     const params = reactive({
       search: (route.query.search as string) || '',
-      subjectType: (route.query.subjectType as string) || '',
+      subjectType: subjectType,
       page: 1,
       subjectId: null,
       level: '',
-      type: ''
+      type: '',
+      title: title
     })
     const data = ref<any>(null)
     const loading = ref(false)
@@ -103,13 +114,6 @@ export default defineComponent({
       // SUBJECT: '声部练习',
       // MUSIC: '独奏曲目',
       // ENSEMBLE: '合奏练习'
-      if (params.subjectType === 'SUBJECT') {
-        document.title = '声部练习'
-      } else if (params.subjectType === 'MUSIC') {
-        document.title = '独奏曲目'
-      } else if (params.subjectType === 'ENSEMBLE') {
-        document.title = '合奏练习'
-      }
       loading.value = true
       await getSelectCondition()
       await FetchList()
@@ -124,6 +128,7 @@ export default defineComponent({
                 background="transparent"
                 isFixed={false}
                 border={false}
+                title={title}
                 color="#131415"
               />
               <Search

+ 4 - 2
src/tenant/music/train-tool/index.tsx

@@ -328,8 +328,10 @@ export default defineComponent({
             }}
           >
             {state.subjectCounts && <Tab title="声部练习" name="SUBJECT"></Tab>}
-            {state.musicCounts && <Tab title="合奏练习" name="ENSEMBLE"></Tab>}
-            {state.ensembleCounts && <Tab title="独奏曲目" name="MUSIC"></Tab>}
+            {state.ensembleCounts && (
+              <Tab title="合奏练习" name="ENSEMBLE"></Tab>
+            )}
+            {state.musicCounts && <Tab title="独奏曲目" name="MUSIC"></Tab>}
           </Tabs>
 
           <div class={styles.alumnList}>

+ 8 - 2
src/views/music/music-detail/index.tsx

@@ -204,8 +204,7 @@ export default defineComponent({
           postData: {
             filename: fileName,
             acl: 'public-read',
-            key: keyTime,
-            unknowValueField: []
+            key: keyTime
           }
         }
 
@@ -607,7 +606,14 @@ export default defineComponent({
                 ),
                 title: () => (
                   <div class={styles.info}>
+<<<<<<< Updated upstream
                     <h4 class="van-ellipsis">
+=======
+                    <h4
+                      class="van-ellipsis"
+                      onClick={() => handleGotoMusicScore(musicDetail.value)}
+                    >
+>>>>>>> Stashed changes
                       {musicDetail.value?.musicSheetName}
                     </h4>
                     <p

+ 1 - 1
vite.config.ts

@@ -12,7 +12,7 @@ function resolve(dir: string) {
 // https://vitejs.dev/config/
 // https://github.com/vitejs/vite/issues/1930 .env
 // const proxyUrl = 'https://online.colexiu.com/';
-const proxyUrl = 'https://test.colexiu.com/'
+const proxyUrl = 'https://dev.colexiu.com/'
 // const proxyUrl = 'http://192.168.3.143:8000/'
 export default defineConfig({
   base: './',