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

Merge branch 'ip' into gdrtvu

VITE_LOGIN_URL=https://login.segedu.cn/auth/login/index VITE_LOGIN_URL=http://172.16.3.201:1004/auth/login/index
VITE_LAB_URL=https://bi.segedu.cn/bi/?proc=0&action=index VITE_LAB_URL=http://172.16.3.201:1012/bi/?proc=0&action=index
VITE_SURVEYKING_URL=https://surveyking.segedu.cn VITE_SURVEYKING_URL=http://172.16.3.201:1011
\ No newline at end of file VITE_STATIC_URL=https://saas-lab-api
VITE_LOGIN_URL=https://login.ezijing.com/auth/login/index VITE_LOGIN_URL=https://login.zijing.chat/auth/login/index
# VITE_LAB_URL=https://digitalmarketinglab.ezijing.com # VITE_LAB_URL=https://digitalmarketinglab.zijing.chat
VITE_LAB_URL=https://bi.ezijing.com/bi/?proc=0&action=index VITE_LAB_URL=https://bi.zijing.chat/bi/?proc=0&action=index
VITE_LOGIN_URL=https://login2.ezijing.com/auth/login/index VITE_LOGIN_URL=https://login2.zijing.chat/auth/login/index
VITE_LAB_URL=https://bi.ezijing.com/bi/ VITE_LAB_URL=https://bi.zijing.chat/bi/
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite --mode dev", "dev": "vite --mode dev",
"build": "vue-tsc --noEmit && vite build --mode prod && npm run deploy", "build": "vue-tsc --noEmit && vite build --mode prod",
"build:test": "vue-tsc --noEmit && vite build --mode test", "build:test": "vue-tsc --noEmit && vite build --mode test",
"build:pre": "vue-tsc --noEmit && vite build --mode pre", "build:pre": "vue-tsc --noEmit && vite build --mode pre",
"preview": "vite preview --port 4173", "preview": "vite preview --port 4173",
......
...@@ -106,6 +106,31 @@ export function getMemberEvents() { ...@@ -106,6 +106,31 @@ export function getMemberEvents() {
} }
// 用户属性搜索 // 用户属性搜索
export function searchEventAttrs(params?: { search: string; experiment_meta_event_id?: string; experiment_meta_event_attr_id?: string; page?: number; per_page?: number }) { export function searchEventAttrs(params?: {
search: string
experiment_meta_event_id?: string
experiment_meta_event_attr_id?: string
page?: number
per_page?: number
}) {
return httpRequest.get('/api/lab/v1/experiment/event/search-attributes', { params }) return httpRequest.get('/api/lab/v1/experiment/event/search-attributes', { 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,8 +2,8 @@ ...@@ -2,8 +2,8 @@
import type { UploadProps, UploadUserFile } from 'element-plus' import type { UploadProps, UploadUserFile } from 'element-plus'
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 md5 from 'blueimp-md5' // import md5 from 'blueimp-md5'
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 }[]
...@@ -41,19 +41,12 @@ const handleBeforeUpload = async (file: any) => { ...@@ -41,19 +41,12 @@ const handleBeforeUpload = async (file: any) => {
ElMessage.error(`文件大小不能超过${props.size / 1024 / 1024}M`) ElMessage.error(`文件大小不能超过${props.size / 1024 / 1024}M`)
return false return false
} }
const fileName = file.name const response: Record<string, any> = await getLocalFileChunk({ file_name: file.name, file_size: file.size })
const key = props.prefix + md5(fileName + new Date().getTime()) + fileName.substr(fileName.lastIndexOf('.'))
const response: Record<string, any> = await getSignature()
uploadData.value = { uploadData.value = {
key, file_name: response.data.detail.file_name,
host: response.host, now_package_num: 1,
OSSAccessKeyId: response.accessid, total_package_num: 1
policy: response.policy,
signature: response.signature,
success_action_status: '200',
url: `${response.host}/${key}`
} }
file.url = `${response.host}/${key}`
if (props.beforeUpload) { if (props.beforeUpload) {
return props.beforeUpload(file) return props.beforeUpload(file)
} }
...@@ -61,6 +54,7 @@ const handleBeforeUpload = async (file: any) => { ...@@ -61,6 +54,7 @@ const handleBeforeUpload = async (file: any) => {
// 上传成功 // 上传成功
const handleSuccess = (response: any, file: any, files: any) => { const handleSuccess = (response: any, file: any, files: any) => {
file.url = response.data.detail.uri
if (!files.every((item: any) => item.status === 'success')) return if (!files.every((item: any) => item.status === 'success')) return
if (showFileList.value) { if (showFileList.value) {
if (props.limit && props.limit === 1) { if (props.limit && props.limit === 1) {
...@@ -87,7 +81,7 @@ const handleSuccess = (response: any, file: any, files: any) => { ...@@ -87,7 +81,7 @@ const handleSuccess = (response: any, file: any, files: any) => {
) )
} }
} else { } else {
emit('update:modelValue', file.raw.url) emit('update:modelValue', response.data.detail.uri)
} }
emit('success', file, files) emit('success', file, files)
} }
...@@ -119,7 +113,7 @@ const handlePreview: UploadProps['onPreview'] = uploadFile => { ...@@ -119,7 +113,7 @@ const handlePreview: UploadProps['onPreview'] = uploadFile => {
<template> <template>
<el-upload <el-upload
:action="uploadData?.host" action="/api/lab/v1/common/file/upload"
:data="uploadData" :data="uploadData"
:show-file-list="showFileList" :show-file-list="showFileList"
:before-upload="handleBeforeUpload" :before-upload="handleBeforeUpload"
......
...@@ -3,7 +3,7 @@ import { ElMessage } from 'element-plus' ...@@ -3,7 +3,7 @@ import { ElMessage } from 'element-plus'
// import router from '@/router' // import router from '@/router'
const httpRequest = axios.create({ const httpRequest = axios.create({
timeout: 60000, // timeout: 60000,
withCredentials: true, withCredentials: true,
headers: { headers: {
// 'Content-Type': 'application/x-www-form-urlencoded' // 'Content-Type': 'application/x-www-form-urlencoded'
...@@ -49,6 +49,14 @@ httpRequest.interceptors.response.use( ...@@ -49,6 +49,14 @@ httpRequest.interceptors.response.use(
ElMessage.error(data.message || data.msg) ElMessage.error(data.message || data.msg)
return Promise.reject(data) return Promise.reject(data)
} }
if (import.meta.env.VITE_STATIC_URL) {
try {
const regex = /(http|https):\/\/(.*?)saas-lab-api/gi
return JSON.parse(JSON.stringify(data).replaceAll(regex, import.meta.env.VITE_STATIC_URL))
} catch (error) {
console.log(error)
}
}
return data return data
}, },
function (error) { function (error) {
......
...@@ -7,8 +7,8 @@ import vue from '@vitejs/plugin-vue' ...@@ -7,8 +7,8 @@ import vue from '@vitejs/plugin-vue'
// import checker from 'vite-plugin-checker' // import checker from 'vite-plugin-checker'
import AutoImport from 'unplugin-auto-import/vite' import AutoImport from 'unplugin-auto-import/vite'
export default defineConfig(({ mode }) => ({ export default defineConfig(() => ({
base: mode === 'prod' ? 'https://webapp-pub.ezijing.com/website/prod/saas-dml/' : '/', // base: mode === 'prod' ? 'https://webapp-pub.ezijing.com/website/prod/saas-dml/' : '/',
plugins: [ plugins: [
vue({ script: { defineModel: true }, reactivityTransform: true }), vue({ script: { defineModel: true }, reactivityTransform: true }),
AutoImport({ AutoImport({
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论