Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
S
saas-learn
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
saas-learn
Commits
57ef886b
提交
57ef886b
authored
4月 22, 2024
作者:
王鹏飞
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'ip' into gdrtvu
上级
f2322e59
e0778d33
隐藏空白字符变更
内嵌
并排
正在显示
12 个修改的文件
包含
71 行增加
和
44 行删除
+71
-44
.env
.env
+4
-1
.env.dev
.env.dev
+1
-1
.env.test
.env.test
+1
-1
package.json
package.json
+1
-1
base.ts
src/api/base.ts
+19
-0
AppEditor.vue
src/components/base/AppEditor.vue
+8
-16
AppUpload.vue
src/components/base/AppUpload.vue
+9
-15
Header.vue
src/components/layout/Header.vue
+5
-5
CoursePlayerVideo.vue
src/modules/course/components/CoursePlayerVideo.vue
+9
-2
types.ts
src/types.ts
+2
-0
axios.ts
src/utils/axios.ts
+10
-0
vite.config.ts
vite.config.ts
+2
-2
没有找到文件。
.env
浏览文件 @
57ef886b
VITE_LOGIN_URL=https://login.segedu.cn/auth/login/index
VITE_LOGIN_URL=http://172.16.3.201:1001/auth/login/index
VITE_SAAS_LAB_URL=http://172.16.3.201:1008
VITE_SAAS_DML_URL=http://172.16.3.201:1006
VITE_STATIC_URL=https://saas-lab-api
.env.dev
浏览文件 @
57ef886b
VITE_LOGIN_URL=https://login.
ezijing.com
/auth/login/index
VITE_LOGIN_URL=https://login.
zijing.chat
/auth/login/index
.env.test
浏览文件 @
57ef886b
VITE_LOGIN_URL
=
https
://
login2
.
ezijing
.
com
/
auth
/
login
/
index
VITE_LOGIN_URL
=
https
://
login2
.
zijing
.
chat
/
auth
/
login
/
index
package.json
浏览文件 @
57ef886b
...
@@ -4,7 +4,7 @@
...
@@ -4,7 +4,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"
,
...
...
src/api/base.ts
浏览文件 @
57ef886b
...
@@ -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'
}
})
}
src/components/base/AppEditor.vue
浏览文件 @
57ef886b
<
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
()
get
Signature
(
)
get
LocalFileChunk
({
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
)
upload
Local
File
(
params
)
.
then
((
res
:
any
)
=>
{
.
then
((
res
:
any
)
=>
{
resolve
(
res
.
url
)
resolve
(
res
.
data
.
detail
.
uri
)
})
})
.
catch
(()
=>
{
.
catch
(()
=>
{
reject
(
'上传失败'
)
reject
(
'上传失败'
)
})
})
})
})
.
catch
(()
=>
{
.
catch
(()
=>
{
reject
(
'
获取Signature
失败'
)
reject
(
'
上传
失败'
)
})
})
})
})
...
...
src/components/base/AppUpload.vue
浏览文件 @
57ef886b
...
@@ -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
{
get
Signature
}
from
'@/api/base'
import
{
get
LocalFileChunk
}
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
}
})
})
}
}
...
...
src/components/layout/Header.vue
浏览文件 @
57ef886b
...
@@ -11,22 +11,22 @@ const logout = async () => {
...
@@ -11,22 +11,22 @@ const logout = async () => {
await
userStore
.
logout
()
await
userStore
.
logout
()
location
.
href
=
`
${
import
.
meta
.
env
.
VITE_LOGIN_URL
}
?rd=
${
encodeURIComponent
(
location
.
origin
)}
`
location
.
href
=
`
${
import
.
meta
.
env
.
VITE_LOGIN_URL
}
?rd=
${
encodeURIComponent
(
location
.
origin
)}
`
}
}
const
SAAS_LAB_URL
=
import
.
meta
.
env
.
VITE_SAAS_LAB_URL
const
SAAS_DML_URL
=
import
.
meta
.
env
.
VITE_SAAS_DML_URL
</
script
>
</
script
>
<
template
>
<
template
>
<header
class=
"app-header"
>
<header
class=
"app-header"
>
<div
class=
"app-header-left"
>
<div
class=
"app-header-left"
>
<div
class=
"logo"
>
<div
class=
"logo"
>
<router-link
to=
"/"
<router-link
to=
"/"
><img
src=
"https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/pc/base/ezijing-logo-white.svg"
/></router-link>
><img
src=
"https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/pc/base/ezijing-logo-white.svg"
/></router-link>
</div>
</div>
<h1
class=
"app-name"
>
数字技能实训中心
</h1>
<h1
class=
"app-name"
>
数字技能实训中心
</h1>
</div>
</div>
<div
class=
"app-header-center"
>
<div
class=
"app-header-center"
>
<a
href=
"/"
class=
"is-active"
>
理论课程
</a>
<a
href=
"/"
class=
"is-active"
>
理论课程
</a>
<!--
<a
href=
"https://saas-lab.ezijing.com
"
target=
"_blank"
>
商业数据分析
</a>
-->
<!--
<a
:href=
"SAAS_LAB_URL
"
target=
"_blank"
>
商业数据分析
</a>
-->
<a
href=
"https://saas-dml-web.ezijing.com
"
target=
"_blank"
>
数字营销
</a>
<a
:href=
"SAAS_DML_URL
"
target=
"_blank"
>
数字营销
</a>
</div>
</div>
<div
class=
"app-header-right"
>
<div
class=
"app-header-right"
>
<el-dropdown
v-if=
"userInfo"
>
<el-dropdown
v-if=
"userInfo"
>
...
...
src/modules/course/components/CoursePlayerVideo.vue
浏览文件 @
57ef886b
...
@@ -117,7 +117,10 @@ const progress = reactive<VideoRecordType>({
...
@@ -117,7 +117,10 @@ const progress = reactive<VideoRecordType>({
})
})
let
playList
=
$ref
<
PlayItemType
[]
>
([])
let
playList
=
$ref
<
PlayItemType
[]
>
([])
const
currentPlayList
=
$computed
<
PlayItemType
[]
>
(()
=>
{
const
currentPlayList
=
$computed
<
any
>
(()
=>
{
if
(
resource
?.
info
.
video_type
===
2
)
{
return
[{
PlayURL
:
resource
?.
info
.
video_play_address
}]
}
return
playList
return
playList
.
filter
(
item
=>
item
.
StreamType
===
'video'
&&
item
.
Format
===
'mp4'
)
.
filter
(
item
=>
item
.
StreamType
===
'video'
&&
item
.
Format
===
'mp4'
)
.
map
(
item
=>
{
.
map
(
item
=>
{
...
@@ -156,7 +159,11 @@ async function fetchVideoRecords() {
...
@@ -156,7 +159,11 @@ async function fetchVideoRecords() {
watchEffect
(
async
()
=>
{
watchEffect
(
async
()
=>
{
if
(
!
resource
)
return
if
(
!
resource
)
return
await
fetchVideoRecords
()
await
fetchVideoRecords
()
await
fetchInfo
()
try
{
await
fetchInfo
()
}
catch
(
error
)
{
console
.
log
(
error
)
}
console
.
log
(
'watch'
,
progress
.
current_playing_time
)
console
.
log
(
'watch'
,
progress
.
current_playing_time
)
changeSrc
(
currentPlayList
[
0
])
changeSrc
(
currentPlayList
[
0
])
})
})
...
...
src/types.ts
浏览文件 @
57ef886b
...
@@ -88,6 +88,8 @@ export interface FileType {
...
@@ -88,6 +88,8 @@ export interface FileType {
source_id
:
string
source_id
:
string
ppt_arr
?:
PptType
[]
ppt_arr
?:
PptType
[]
can_download
:
number
can_download
:
number
video_type
?:
1
|
2
video_play_address
?:
string
}
}
export
interface
PptType
{
export
interface
PptType
{
...
...
src/utils/axios.ts
浏览文件 @
57ef886b
...
@@ -62,6 +62,16 @@ httpRequest.interceptors.response.use(
...
@@ -62,6 +62,16 @@ 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
)
{
...
...
vite.config.ts
浏览文件 @
57ef886b
...
@@ -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
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论