Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
projecttwo
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wangtao
projecttwo
Commits
333c54f5
Commit
333c54f5
authored
Jun 11, 2025
by
wangzhengwen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
6.10
parent
bfbd5862
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
171 additions
and
34 deletions
+171
-34
Course.php
app/api/controller/Course.php
+14
-1
CourseProgress.php
app/api/controller/CourseProgress.php
+1
-1
User.php
app/api/controller/User.php
+48
-3
Cert.php
app/api/controller/cert/Cert.php
+1
-1
Project.php
app/api/controller/project/Project.php
+1
-1
CourseProgressService.php
app/api/service/CourseProgressService.php
+75
-13
CourseValidate.php
app/api/validate/CourseValidate.php
+2
-1
Cert.php
app/model/Cert.php
+6
-1
Course.php
app/model/Course.php
+10
-6
CourseCategory.php
app/model/CourseCategory.php
+2
-2
CourseUserWork.php
app/model/CourseUserWork.php
+5
-3
Project.php
app/model/Project.php
+6
-1
No files found.
app/api/controller/Course.php
View file @
333c54f5
...
...
@@ -57,6 +57,19 @@ class Course extends BaseController
return
$this
->
returnMsg
(
'success'
,
1
,
$list
);
}
public
function
getCourseCategoryChildrenList
(
Request
$request
)
{
$vo
=
(
new
CourseValidate
())
->
goCheck
([
'pid'
]);
if
(
$vo
!==
true
)
{
return
$vo
;
}
$data
=
$request
->
param
();
$list
=
(
new
CourseCategoryModel
())
->
getCourseCategoryList
(
$data
[
'pid'
]
??
0
);
return
$this
->
returnMsg
(
'success'
,
1
,
$list
);
}
/**课程搜索
* @param Request $request
* @return \app\html|\think\response\Json|true
...
...
@@ -101,7 +114,7 @@ class Course extends BaseController
$page
=
$request
->
param
(
'page/d'
,
1
);
$pageSize
=
$request
->
param
(
'pageSize/d'
,
10
);
$list
=
(
new
CourseModel
())
->
getCourseList
(
$data
[
'category_id'
],
$page
,
$pageSize
);
$list
=
(
new
CourseModel
())
->
getCourseList
(
$data
[
'category_id'
],
$page
,
$pageSize
,
$data
[
'searchKeyWords'
]
??
null
);
return
$this
->
returnMsg
(
'success'
,
1
,
$list
);
...
...
app/api/controller/CourseProgress.php
View file @
333c54f5
...
...
@@ -8,7 +8,7 @@ use app\api\service\UtilService;
use
app\api\validate\CourseValidate
;
use
app\BaseController
;
use
app\model\Payment
;
use
think\
F
acade\Request
;
use
think\
f
acade\Request
;
use
app\api\service\CourseProgressService
;
use
app\model\Course
as
CourseModel
;
...
...
app/api/controller/User.php
View file @
333c54f5
...
...
@@ -65,12 +65,17 @@ class User extends BaseController
return
$this
->
returnMsg
(
'用户已存在'
,
0
);
}
$checkSmsCode
=
UtilService
::
checkSmsCode
(
$data
[
'mobile'
],
$data
[
'code'
]);
if
(
!
$checkSmsCode
)
//只有普通用户验证验证码
if
(
$data
[
'role'
]
==
1
)
{
return
$this
->
returnMsg
(
'验证码错误'
);
$checkSmsCode
=
UtilService
::
checkSmsCode
(
$data
[
'mobile'
],
$data
[
'code'
]);
if
(
!
$checkSmsCode
)
{
return
$this
->
returnMsg
(
'验证码错误'
);
}
}
$user
[
'username'
]
=
$data
[
'name'
];
$user
[
'mobile'
]
=
$data
[
'mobile'
];
$user
[
'salt'
]
=
random
(
4
);
...
...
@@ -168,6 +173,46 @@ class User extends BaseController
}
/**验证验证码
* @param Request $request
* @return \app\html|\think\response\Json|true
*/
public
function
checkSmsCode
(
Request
$request
)
{
$vo
=
(
new
UserValidate
())
->
goCheck
([
'mobile'
,
'code'
]);
if
(
$vo
!==
true
)
{
return
$vo
;
}
$data
=
$request
->
param
();
$checkSmsCode
=
UtilService
::
checkSmsCode
(
$data
[
'mobile'
],
$data
[
'code'
]);
if
(
!
$checkSmsCode
)
{
return
$this
->
returnMsg
(
'验证码错误'
);
}
return
$this
->
returnMsg
(
'success'
,
1
);
}
public
function
checkMobile
(
Request
$request
)
{
$vo
=
(
new
UserValidate
())
->
goCheck
([
'mobile'
]);
if
(
$vo
!==
true
)
{
return
$vo
;
}
$data
=
$request
->
param
();
$count
=
userModel
::
where
([
'mobile'
=>
$data
[
'mobile'
]])
->
count
();
if
(
$count
>
0
)
{
return
$this
->
returnMsg
(
'手机号已存在'
);
}
return
$this
->
returnMsg
(
'success'
,
1
);
}
}
\ No newline at end of file
app/api/controller/cert/Cert.php
View file @
333c54f5
...
...
@@ -47,7 +47,7 @@ class Cert extends BaseController
$page
=
$request
->
param
(
'page/d'
,
1
);
$pageSize
=
$request
->
param
(
'pageSize/d'
,
10
);
$list
=
(
new
CertModel
())
->
getCertList
(
$data
[
'category_id'
],
$page
,
$pageSize
,
$data
[
'type'
]);
$list
=
(
new
CertModel
())
->
getCertList
(
$data
[
'category_id'
],
$page
,
$pageSize
,
$data
[
'type'
]
,
$data
[
'searchKeyWords'
]
??
null
);
return
$this
->
returnMsg
(
'success'
,
1
,
$list
);
}
...
...
app/api/controller/project/Project.php
View file @
333c54f5
...
...
@@ -47,7 +47,7 @@ class Project extends BaseController
$page
=
$request
->
param
(
'page/d'
,
1
);
$pageSize
=
$request
->
param
(
'pageSize/d'
,
10
);
$list
=
(
new
ProjectModel
())
->
getProjectList
(
$data
[
'category_id'
],
$page
,
$pageSize
,
$data
[
'type'
]);
$list
=
(
new
ProjectModel
())
->
getProjectList
(
$data
[
'category_id'
],
$page
,
$pageSize
,
$data
[
'type'
]
,
$data
[
'searchKeyWords'
]
??
null
);
return
$this
->
returnMsg
(
'success'
,
1
,
$list
);
}
...
...
app/api/service/CourseProgressService.php
View file @
333c54f5
...
...
@@ -9,6 +9,11 @@ use app\model\CourseWork;
class
CourseProgressService
{
// 常量定义
const
MIN_CONSIDERED_FINISHED_SECONDS
=
10
;
// 视为完成的最小观看秒数
const
FINISHED_THRESHOLD_PERCENT
=
95
;
// 视为完成的进度百分比阈值
/**
* 更新学习进度
* @param int $userId 用户ID
...
...
@@ -29,7 +34,7 @@ class CourseProgressService
// 判断是否看完(观看进度超过95%或最后10秒)
$isFinished
=
(
$currentTime
>=
$duration
-
10
)
||
(
$currentTime
>=
$duration
*
0.95
);
$isFinished
=
(
$currentTime
>=
$duration
-
self
::
MIN_CONSIDERED_FINISHED_SECONDS
)
||
(
$currentTime
>=
$duration
*
self
::
FINISHED_THRESHOLD_PERCENT
);
// 查找或创建记录
$progress
=
CourseProgress
::
where
([
...
...
@@ -170,12 +175,50 @@ class CourseProgressService
];
}
/**
* 获取用户课程进度统计
* @param int $userId 用户ID
* @param int $courseId 课程ID
* @return array
*/
// /**
// * 获取用户课程进度统计
// * @param int $userId 用户ID
// * @param int $courseId 课程ID
// * @return array
// */
// public static function getCourseProgress($userId, $courseId)
// {
// // 获取所有课时进度
// $progressList = CourseProgress::with(['class'])
// ->where('user_id', $userId)
// ->where('course_id', $courseId)
// ->select();
// // 统计计算
// $finishedCount = 0;
// $totalDuration = 0;
// $learnedDuration = 0;
//
// $classProgress = [];
// foreach ($progressList as $item) {
// if ($item->is_wc_look) {
// $finishedCount++;
// }
// $totalDuration += $item->tvtime;
// $learnedDuration += min($item->look_tvtime, $item->tvtime);
//
// $classProgress[$item->class_id] = [
// 'progress' => $item->look_tvtime,
// 'duration' => $item->tvtime,
// 'is_finished' => $item->is_wc_look,
// 'last_learn' => $item->createtime,
// 'class_id' => $item->class_id//课时id,
// ];
// }
// $progress_percent = $totalDuration > 0 ? round($learnedDuration / $totalDuration * 100) : 0;
//
// return [
// 'finished_count' => $finishedCount,
// 'total_classes' => count($progressList),
// 'progress_percent' => $totalDuration > 0 ? round($learnedDuration / $totalDuration * 100) : 0,
// 'classes' => $classProgress
// ];
// }
public
static
function
getCourseProgress
(
$userId
,
$courseId
)
{
// 获取所有课时进度
...
...
@@ -183,6 +226,7 @@ class CourseProgressService
->
where
(
'user_id'
,
$userId
)
->
where
(
'course_id'
,
$courseId
)
->
select
();
// 统计计算
$finishedCount
=
0
;
$totalDuration
=
0
;
...
...
@@ -190,30 +234,48 @@ class CourseProgressService
$classProgress
=
[];
foreach
(
$progressList
as
$item
)
{
if
(
$item
->
is_wc_look
)
{
// 计算当前课时的观看比例
$currentProgress
=
(
$item
->
tvtime
>
0
)
?
(
$item
->
look_tvtime
/
$item
->
tvtime
)
:
0
;
// 判断是否满足"视为完成"的条件(观看时间<10s 或 进度>95%)
$isConsideredFinished
=
(
$item
->
look_tvtime
<
self
::
MIN_CONSIDERED_FINISHED_SECONDS
)
||
(
$currentProgress
>
self
::
FINISHED_THRESHOLD_PERCENT
);
if
(
$item
->
is_wc_look
||
$isConsideredFinished
)
{
$finishedCount
++
;
$learnedDuration
+=
$item
->
tvtime
;
// 视为完成则计入全部时长
}
else
{
$learnedDuration
+=
min
(
$item
->
look_tvtime
,
$item
->
tvtime
);
}
$totalDuration
+=
$item
->
tvtime
;
$learnedDuration
+=
min
(
$item
->
look_tvtime
,
$item
->
tvtime
);
$classProgress
[
$item
->
class_id
]
=
[
'progress'
=>
$item
->
look_tvtime
,
'duration'
=>
$item
->
tvtime
,
'is_finished'
=>
$item
->
is_wc_look
,
'is_finished'
=>
$item
->
is_wc_look
||
$isConsideredFinished
,
'last_learn'
=>
$item
->
createtime
,
'class_id'
=>
$item
->
class_id
//课时id,
'class_id'
=>
$item
->
class_id
];
}
// 计算总进度(如果满足条件则直接显示100%)
$progress_percent
=
(
$totalDuration
>
0
)
?
round
(
$learnedDuration
/
$totalDuration
*
100
)
:
0
;
// 应用优化规则:如果观看进度<10s或已完成>95%,则显示100%
if
(
$progress_percent
>
self
::
FINISHED_THRESHOLD_PERCENT
||
$learnedDuration
<
self
::
MIN_CONSIDERED_FINISHED_SECONDS
)
{
$progress_percent
=
100
;
}
return
[
'finished_count'
=>
$finishedCount
,
'total_classes'
=>
count
(
$progressList
),
'progress_percent'
=>
$totalDuration
>
0
?
round
(
$learnedDuration
/
$totalDuration
*
100
)
:
0
,
'progress_percent'
=>
min
(
$progress_percent
,
100
),
// 确保不超过100%
'classes'
=>
$classProgress
];
}
/**
* 获取课程最后学习时间
*/
...
...
app/api/validate/CourseValidate.php
View file @
333c54f5
...
...
@@ -16,7 +16,8 @@ class CourseValidate extends BaseValidate
'work_id'
=>
'require|number'
,
'content'
=>
'require'
,
'comment_id'
=>
'require|number'
,
'reason'
=>
'require|length:1,255'
'reason'
=>
'require|length:1,255'
,
'pid'
=>
'require|number'
,
];
protected
$message
=
[
...
...
app/model/Cert.php
View file @
333c54f5
...
...
@@ -68,7 +68,7 @@ class Cert extends Model
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public
function
getCertList
(
$category_id
,
$page
,
$pageSize
,
$type
)
public
function
getCertList
(
$category_id
,
$page
,
$pageSize
,
$type
,
$searchKeyWords
=
null
)
{
$where
=
[
'is_sell'
=>
1
,
'is_del'
=>
0
];
if
(
$category_id
)
{
...
...
@@ -77,6 +77,11 @@ class Cert extends Model
$query
=
self
::
where
(
$where
);
if
(
$searchKeyWords
)
{
$query
->
where
(
'title'
,
'like'
,
'%'
.
$searchKeyWords
.
'%'
);
}
if
(
$type
==
2
)
{
$currentTime
=
time
();
$query
->
where
(
'start_time'
,
'<='
,
$currentTime
)
...
...
app/model/Course.php
View file @
333c54f5
...
...
@@ -87,16 +87,20 @@ class Course extends Model
/**获取分类下的课程列表
*
*/
public
function
getCourseList
(
$category_id
,
$page
,
$pageSize
)
public
function
getCourseList
(
$category_id
,
$page
,
$pageSize
,
$searchKeyWords
=
null
)
{
$where
=
[
'status'
=>
3
,
'is_sell'
=>
1
,
'is_del'
=>
0
];
if
(
$category_id
)
{
$where
=
[
'status'
=>
3
,
'is_sell'
=>
1
,
'is_del'
=>
0
];
if
(
$category_id
)
{
$where
[
'cate_id'
]
=
$category_id
;
}
return
self
::
where
(
$where
)
->
field
(
'id,thumb,title,createtime,description,price,content'
)
$query
=
self
::
where
(
$where
);
if
(
$searchKeyWords
)
{
$query
->
where
(
'title'
,
'like'
,
'%'
.
$searchKeyWords
.
'%'
);
}
return
$query
->
field
(
'id,thumb,title,createtime,description,price,content'
)
->
paginate
([
'page'
=>
$page
,
'list_rows'
=>
$pageSize
...
...
app/model/CourseCategory.php
View file @
333c54f5
...
...
@@ -51,14 +51,14 @@ class CourseCategory extends Model
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public
function
getCourseCategoryList
()
public
function
getCourseCategoryList
(
$pid
=
0
)
{
$where
[]
=
[
'is_del'
,
'='
,
0
];
return
$this
->
with
([
'children'
=>
function
(
$query
)
use
(
$where
)
{
$query
->
where
(
$where
);
$query
->
order
(
'sort'
,
'asc'
);
}])
->
where
(
'pid'
,
0
)
->
where
(
'pid'
,
$pid
)
->
where
(
$where
)
->
order
(
'sort'
,
'asc'
)
->
select
();
...
...
app/model/CourseUserWork.php
View file @
333c54f5
...
...
@@ -46,7 +46,7 @@ class CourseUserWork extends Model
{
$detail
=
self
::
where
([
'id'
=>
$id
,
'is_del'
=>
0
])
->
with
([
'course'
,
'courseWork'
])
->
field
(
'id,user_id,work_id,status,course_id,createtime'
)
->
field
(
'id,user_id,work_id,status,course_id,createtime
,attachment_ids,note
'
)
->
findOrEmpty
();
if
(
$detail
->
isEmpty
())
{
...
...
@@ -72,7 +72,6 @@ class CourseUserWork extends Model
$attachmentIds
=
!
empty
(
$detail
[
'attachment_ids'
])
?
(
is_string
(
$detail
[
'attachment_ids'
])
?
explode
(
','
,
$detail
[
'attachment_ids'
])
:
(
array
)
$detail
[
'attachment_ids'
])
:
[];
$detail
[
'attachment_file'
]
=
!
empty
(
$attachmentIds
)
?
SystemUploadFile
::
whereIn
(
'fileid'
,
$attachmentIds
)
->
field
(
'fileurl,fileid,filename,filetype'
)
...
...
@@ -98,7 +97,10 @@ class CourseUserWork extends Model
//关联作业
public
function
courseWork
()
{
return
$this
->
hasOne
(
CourseWork
::
class
,
'id'
,
'work_id'
)
->
append
([
'filelist'
])
->
where
(
'is_del'
,
0
)
->
field
(
'id,title,file_id_str'
);
return
$this
->
hasOne
(
CourseWork
::
class
,
'id'
,
'work_id'
)
// ->append(['filelist'])
->
where
(
'is_del'
,
0
)
->
field
(
'id,title,file_id_str,content'
);
}
//关联课程
...
...
app/model/Project.php
View file @
333c54f5
...
...
@@ -111,7 +111,7 @@ class Project extends Model
return
$statustxt
;
}
public
function
getProjectList
(
$category_id
,
$page
,
$pageSize
,
$type
)
public
function
getProjectList
(
$category_id
,
$page
,
$pageSize
,
$type
,
$searchKeyWords
=
null
)
{
$where
=
[
'sh_status'
=>
2
,
'status'
=>
1
];
...
...
@@ -122,6 +122,11 @@ class Project extends Model
$query
=
self
::
where
(
$where
);
if
(
$searchKeyWords
)
{
$query
->
where
(
'title'
,
'like'
,
'%'
.
$searchKeyWords
.
'%'
);
}
$query
->
order
(
'createtime'
,
'desc'
);
//热门项目
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment