提交 dc001032 authored 作者: 王鹏飞's avatar 王鹏飞

chore: add local

上级 0c77c29c
...@@ -85,3 +85,22 @@ export function getCourseList() { ...@@ -85,3 +85,22 @@ export function getCourseList() {
export function getCourseChapterList(params: { course_id: string }) { export function getCourseChapterList(params: { course_id: string }) {
return httpRequest.get('/api/learn/api/v1/chapter/all', { params }) return httpRequest.get('/api/learn/api/v1/chapter/all', { params })
} }
// 获取分片大小和唯一文件名
export function getLocalFileChunk(params: { file_size: number; file_name: string }) {
return httpRequest.get('/api/lab/v1/common/file/chunk', { params })
}
// 上传每个分片前请求接口来获取当前文件是否超时,之前的分片是否被清理,如果被请求则拒绝处理。返回客户端错误码,让客户端户端不再续传剩余分片
// 1文件被清理 0文件未被清理
export function checkLocalFile(params: { file_name: string }) {
return httpRequest.get('/api/lab/v1/common/file/check', { params })
}
// 上传文件
export function uploadLocalFile(data: { file: File; file_name: string; is_continuingly?: number; now_package_num: number; total_package_num: number }) {
return httpRequest.post('/api/lab/v1/common/file/upload', data, {
withCredentials: false,
headers: { 'Content-Type': 'multipart/form-data' }
})
}
<script setup lang="ts"> <script setup lang="ts">
import Editor from '@tinymce/tinymce-vue' import Editor from '@tinymce/tinymce-vue'
import md5 from 'blueimp-md5' import { getLocalFileChunk, uploadLocalFile } from '@/api/base'
import { getSignature, uploadFile } from '@/api/base'
const props = defineProps({ const props = defineProps({
height: { height: {
...@@ -13,31 +12,24 @@ const props = defineProps({ ...@@ -13,31 +12,24 @@ const props = defineProps({
const ImageUploadHandler = (blobInfo: any) => const ImageUploadHandler = (blobInfo: any) =>
new Promise((resolve, reject) => { new Promise((resolve, reject) => {
const file = blobInfo.blob() const file = blobInfo.blob()
getSignature() getLocalFileChunk({ file_name: file.name, file_size: file.size })
.then((response: any) => { .then((response: any) => {
const prefix = 'upload/admin/'
const key = prefix + md5(file.name + new Date().getTime()) + file.name.substr(file.name.lastIndexOf('.'))
const { accessid, policy, signature, host } = response
const params = { const params = {
key,
host,
OSSAccessKeyId: accessid,
policy,
signature,
success_action_status: '200',
file, file,
url: `${host}/${key}` file_name: response.data.detail.file_name,
now_package_num: 1,
total_package_num: 1
} }
uploadFile(params) uploadLocalFile(params)
.then((res: any) => { .then((res: any) => {
resolve(res.url) resolve(res.data.detail.uri)
}) })
.catch(() => { .catch(() => {
reject('上传失败') reject('上传失败')
}) })
}) })
.catch(() => { .catch(() => {
reject('获取Signature失败') reject('上传失败')
}) })
}) })
......
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { Plus } from '@element-plus/icons-vue' import { Plus } from '@element-plus/icons-vue'
import type { UploadProps, UploadUserFile, UploadFile, UploadFiles, UploadInstance } from 'element-plus' import type { UploadProps, UploadUserFile, UploadFile, UploadFiles, UploadInstance } from 'element-plus'
import md5 from 'blueimp-md5' // import md5 from 'blueimp-md5'
import axios from 'axios' import axios from 'axios'
import { getSignature } from '@/api/base' import { getLocalFileChunk } from '@/api/base'
interface Props { interface Props {
modelValue: string | { name: string; url: string }[] modelValue: string | { name: string; url: string }[]
...@@ -37,29 +37,23 @@ const showFileList = computed(() => { ...@@ -37,29 +37,23 @@ const showFileList = computed(() => {
// 自定义上传 // 自定义上传
const handleHttpRequest: UploadProps['httpRequest'] = async xhr => { const handleHttpRequest: UploadProps['httpRequest'] = async xhr => {
const name = xhr.file.name const signature: Record<string, any> = await getLocalFileChunk({ file_name: xhr.file.name, file_size: xhr.file.size })
const key = `${props.prefix}${md5(name + Date.now())}.${name.split('.').pop()}`
const signature: Record<string, any> = await getSignature()
const params = { const params = {
key, file_name: signature.data.detail.file_name,
host: signature.host, now_package_num: 1,
OSSAccessKeyId: signature.accessid, total_package_num: 1,
policy: signature.policy,
signature: signature.signature,
success_action_status: '200',
url: `${signature.host}/${key}`,
file: xhr.file file: xhr.file
} }
return axios return axios
.post(params.host || 'https://webapp-pub.ezijing.com', Object.assign(params, xhr.data), { .post('/api/lab/v1/common/file/upload', Object.assign(params, xhr.data), {
headers: { 'Content-Type': 'multipart/form-data' }, headers: { 'Content-Type': 'multipart/form-data' },
onUploadProgress(progress: any) { onUploadProgress(progress: any) {
progress.percent = progress.total > 0 ? (progress.loaded / progress.total) * 100 : 0 progress.percent = progress.total > 0 ? (progress.loaded / progress.total) * 100 : 0
xhr.onProgress(progress) xhr.onProgress(progress)
} }
}) })
.then(() => { .then(res => {
return params return { ...params, url: res.data.data.detail.uri }
}) })
} }
......
...@@ -7,8 +7,8 @@ import vue from '@vitejs/plugin-vue' ...@@ -7,8 +7,8 @@ import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite' import AutoImport from 'unplugin-auto-import/vite'
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig(({ mode }) => ({ export default defineConfig(() => ({
base: mode === 'prod' ? 'https://webapp-pub.ezijing.com/website/prod/saas-learn/' : '/', // base: mode === 'prod' ? 'https://webapp-pub.ezijing.com/website/prod/saas-learn/' : '/',
plugins: [ plugins: [
vue({ reactivityTransform: true }), vue({ reactivityTransform: true }),
AutoImport({ AutoImport({
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论