Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nanMoMentorPlatform
Overview
Overview
Details
Activity
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
node_server
nanMoMentorPlatform
Commits
0ec2cabf
Commit
0ec2cabf
authored
Jul 03, 2026
by
PC-20251223ZVQQ\Administrator
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
测评题库设置锚点区分模板和试卷
parent
22e4e3f4
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
166 additions
and
53 deletions
+166
-53
proceduralRecord.ts
src/biz/admin/proceduralRecord.ts
+5
-3
teacherSurvey.ts
src/biz/admin/teacherSurvey.ts
+127
-46
myTeacher.ts
src/biz/student/myTeacher.ts
+12
-1
communication.ts
src/biz/teacher/communication.ts
+4
-3
mysqlTableConfig.ts
src/config/mysqlTableConfig.ts
+2
-0
admin.ts
src/routers/admin.ts
+16
-0
No files found.
src/biz/admin/proceduralRecord.ts
View file @
0ec2cabf
...
...
@@ -180,7 +180,8 @@ export async function growthMessageList(studentName: string, semesterId: number,
let
semester
=
await
getCurrentSemester
();
if
(
semesterId
)
{
semester
=
await
selectOneDataByParam
(
TABLENAME
.
学期表
,
{
id
:
semesterId
});
let
semesterData
=
await
selectOneDataByParam
(
TABLENAME
.
学期表
,
{
id
:
semesterId
});
semester
=
semesterData
.
data
?
semesterData
.
data
:
null
;
}
// 如果没有当前学期,返回空列表
...
...
@@ -260,7 +261,8 @@ export async function meetingList(studentName: string, semesterId: number, teach
let
semester
=
await
getCurrentSemester
();
if
(
semesterId
)
{
semester
=
await
selectOneDataByParam
(
TABLENAME
.
学期表
,
{
id
:
semesterId
});
let
semesterData
=
await
selectOneDataByParam
(
TABLENAME
.
学期表
,
{
id
:
semesterId
});
semester
=
semesterData
.
data
?
semesterData
.
data
:
null
;
}
if
(
!
semester
)
{
...
...
@@ -268,7 +270,7 @@ export async function meetingList(studentName: string, semesterId: number, teach
}
let
selectParam
:
any
=
{
semester_id
:
semester
.
id
semester_id
:
semester
Id
??
semester
.
id
};
// 时间筛选
...
...
src/biz/admin/teacherSurvey.ts
View file @
0ec2cabf
...
...
@@ -9,8 +9,9 @@ import { BizError } from "../../util/bizError";
import
{
ERRORENUM
}
from
"../../config/errorEnum"
;
import
{
getCurrentSemester
}
from
"../common/semesterService"
;
import
{
mysqlModelMap
}
from
"../../model/sqlModelBind"
;
import
{
Op
,
Sequelize
}
from
"sequelize"
;
import
{
Op
,
Sequelize
,
StringDataType
}
from
"sequelize"
;
import
{
hasData
}
from
"../../tools/system"
;
import
{
create
}
from
"domain"
;
/**CASE WHEN 状态计算表达式 */
const
STATUS_CASE_SQL
=
`CASE WHEN start_time IS NOT NULL AND NOW() < start_time THEN 0 WHEN end_time IS NOT NULL AND NOW() > end_time THEN 2 ELSE 1 END`
;
...
...
@@ -91,43 +92,54 @@ export async function createSurvey(param: {
/**获取当前学期 */
let
semester
=
await
getCurrentSemester
();
/**插入 survey 表 */
let
surveyData
:
any
=
{
name
:
surveyName
,
semester_id
:
semester
.
id
,
start_time
:
startTime
||
null
,
end_time
:
endTime
||
null
,
is_open
:
isOpen
?
true
:
false
,
description
:
description
||
null
};
await
addData
(
TABLENAME
.
测评活动表
,
surveyData
);
insertSurveyInfo
(
semester
.
id
,
surveyName
,
startTime
,
endTime
,
isOpen
,
description
,
1
,
null
);
/**查回自增ID */
let
newSurvey
=
await
selectOneDataByParam
(
TABLENAME
.
测评活动表
,
{
name
:
surveyName
,
semester_id
:
semester
.
id
,
is_temp
:
1
,
"%orderDesc%"
:
"id"
,
"%limit%"
:
1
});
let
surveyId
=
(
newSurvey
.
data
as
any
).
id
;
/**逐条插入题目 */
for
(
let
i
=
0
;
i
<
questions
.
length
;
i
++
)
{
let
q
=
questions
[
i
];
await
addData
(
TABLENAME
.
测评题目表
,
{
survey_id
:
surveyId
,
question_code
:
q
.
question_code
,
question_type
:
q
.
question_type
,
question_text
:
q
.
question_text
,
options
:
q
.
options
||
null
,
is_required
:
q
.
is_required
!==
undefined
?
(
q
.
is_required
?
true
:
false
)
:
true
,
sort_order
:
i
});
}
insertSurveyDetail
(
surveyId
,
questions
);
// 新增试卷
insertSurveyInfo
(
semester
.
id
,
surveyName
,
startTime
,
endTime
,
isOpen
,
description
,
2
,
surveyId
);
/**查回自增ID */
let
surveyInfo
=
await
selectOneDataByParam
(
TABLENAME
.
测评活动表
,
{
name
:
surveyName
,
semester_id
:
semester
.
id
,
is_temp
:
2
,
"%orderDesc%"
:
"id"
,
"%limit%"
:
1
});
let
survey_id
=
(
surveyInfo
.
data
as
any
).
id
;
insertSurveyDetail
(
survey_id
,
questions
);
return
{
isSuccess
:
true
};
}
/**
* 修改测评题库是否开放
* @param param
*/
export
async
function
updateIsOpenSurvey
(
surveyId
:
number
,
isOpen
:
number
)
{
/**校验测评是否存在 */
let
survey
=
await
selectOneDataByParam
(
TABLENAME
.
测评活动表
,
{
id
:
surveyId
});
if
(
!
hasData
(
survey
))
{
throw
new
BizError
(
ERRORENUM
.
未找到数据
,
'测评不存在'
);
}
/**更新 survey 表 */
await
updateManyData
(
TABLENAME
.
测评活动表
,
{
id
:
surveyId
},
{
is_open
:
isOpen
?
true
:
false
});
return
{
isSuccess
:
true
};
}
/**
* 修改测评题库
...
...
@@ -157,36 +169,43 @@ export async function updateSurvey(param: {
if
(
!
hasData
(
survey
))
{
throw
new
BizError
(
ERRORENUM
.
未找到数据
,
'测评不存在'
);
}
updateSurveyInfo
(
surveyId
,
surveyName
,
startTime
,
endTime
,
isOpen
,
description
,
questions
);
/**更新 survey 表 */
await
updateManyData
(
TABLENAME
.
测评活动表
,
{
id
:
surveyId
},
{
name
:
surveyName
,
start_time
:
startTime
||
null
,
end_time
:
endTime
||
null
,
is_open
:
isOpen
?
true
:
false
,
description
:
description
||
null
});
/**操作 survey_question 表:先删后加 */
await
delData
(
TABLENAME
.
测评题目表
,
{
survey_id
:
surveyId
});
// 若是没有更新开始时间,则同步更新试卷
if
(
survey
.
data
.
start_time
===
startTime
)
{
// 通过模板id查询试卷,按创建时间倒序取最晚一条
let
survey_template
=
await
selectOneDataByParam
(
TABLENAME
.
测评活动表
,
{
is_temp
:
2
,
temp_id
:
surveyId
,
"%orderDesc%"
:
"created_at"
,
"%limit%"
:
1
});
if
(
hasData
(
survey_template
))
{
let
survey_id
=
(
survey_template
.
data
as
any
).
id
;
// 更新试卷信息
updateSurveyInfo
(
survey_id
,
surveyName
,
startTime
,
endTime
,
isOpen
,
description
,
questions
);
}
}
else
{
let
semester
=
await
getCurrentSemester
();
// 若是更新开始时间,则通过模板创建试卷
let
tempId
=
survey
.
data
.
id
;
insertSurveyInfo
(
semester
.
id
,
surveyName
,
startTime
,
endTime
,
isOpen
,
description
,
2
,
tempId
);
for
(
let
i
=
0
;
i
<
questions
.
length
;
i
++
)
{
let
q
=
questions
[
i
];
await
addData
(
TABLENAME
.
测评题目表
,
{
survey_id
:
surveyId
,
question_code
:
q
.
question_code
,
question_type
:
q
.
question_type
,
question_text
:
q
.
question_text
,
options
:
q
.
options
||
null
,
is_required
:
q
.
is_required
!==
undefined
?
(
q
.
is_required
?
true
:
false
)
:
true
,
sort_order
:
i
/**查回自增ID */
let
newSurvey
=
await
selectOneDataByParam
(
TABLENAME
.
测评活动表
,
{
name
:
surveyName
,
semester_id
:
semester
.
id
,
"%orderDesc%"
:
"id"
,
"%limit%"
:
1
});
let
surveyId
=
(
newSurvey
.
data
as
any
).
id
;
insertSurveyDetail
(
surveyId
,
questions
);
}
return
{
isSuccess
:
true
};
}
/**
* 测评详情
* @param surveyId 测评ID
...
...
@@ -224,3 +243,64 @@ export async function surveyInfo(surveyId: number) {
questions
:
questionList
};
}
// 内联方法,用于插入测评信息
async
function
insertSurveyInfo
(
semesterId
:
number
,
surveyName
:
string
,
startTime
:
string
,
endTime
:
string
,
isOpen
:
number
,
description
:
string
,
is_temp
?:
number
,
tempId
?:
number
){
/**插入 survey 表 */
let
surveyData
:
any
=
{
name
:
surveyName
,
semester_id
:
semesterId
,
start_time
:
startTime
||
null
,
end_time
:
endTime
||
null
,
is_open
:
isOpen
?
true
:
false
,
description
:
description
||
null
,
is_temp
:
is_temp
,
tempId
:
tempId
||
null
};
await
addData
(
TABLENAME
.
测评活动表
,
surveyData
);
}
// 内联方法,用于插入测评题目列表
async
function
insertSurveyDetail
(
surveyId
:
number
,
questions
:
any
[]){
/**逐条插入题目 */
for
(
let
i
=
0
;
i
<
questions
.
length
;
i
++
)
{
let
q
=
questions
[
i
];
await
addData
(
TABLENAME
.
测评题目表
,
{
survey_id
:
surveyId
,
question_code
:
q
.
question_code
,
question_type
:
q
.
question_type
,
question_text
:
q
.
question_text
,
options
:
q
.
options
||
null
,
is_required
:
q
.
is_required
!==
undefined
?
(
q
.
is_required
?
true
:
false
)
:
true
,
sort_order
:
i
});
}
}
// 内联方法,用于更新测评信息和题目列表
async
function
updateSurveyInfo
(
surveyId
:
number
,
surveyName
:
string
,
startTime
:
string
,
endTime
:
string
,
isOpen
:
number
,
description
:
string
,
questions
:
any
[]){
/**更新 survey 表 */
await
updateManyData
(
TABLENAME
.
测评活动表
,
{
id
:
surveyId
},
{
name
:
surveyName
,
start_time
:
startTime
||
null
,
end_time
:
endTime
||
null
,
is_open
:
isOpen
?
true
:
false
,
description
:
description
||
null
});
/**操作 survey_question 表:先删后加 */
await
delData
(
TABLENAME
.
测评题目表
,
{
survey_id
:
surveyId
});
for
(
let
i
=
0
;
i
<
questions
.
length
;
i
++
)
{
let
q
=
questions
[
i
];
await
addData
(
TABLENAME
.
测评题目表
,
{
survey_id
:
surveyId
,
question_code
:
q
.
question_code
,
question_type
:
q
.
question_type
,
question_text
:
q
.
question_text
,
options
:
q
.
options
||
null
,
is_required
:
q
.
is_required
!==
undefined
?
(
q
.
is_required
?
true
:
false
)
:
true
,
sort_order
:
i
});
}
}
\ No newline at end of file
src/biz/student/myTeacher.ts
View file @
0ec2cabf
...
...
@@ -313,6 +313,7 @@ export async function getTeacherSurvey(studentId: string, surveyName?: string, s
/**查测评活动列表 */
let
surveyParam
:
any
=
{
semester_id
:
semester
.
id
,
is_temp
:
2
,
// 只查试卷
is_open
:
1
};
let
surveyList
=
await
selectDataListByParam
(
TABLENAME
.
测评活动表
,
surveyParam
);
...
...
@@ -339,12 +340,22 @@ export async function getTeacherSurvey(studentId: string, surveyName?: string, s
continue
;
}
// 时间维度状态: 0=未开始, 1=进行中, 2=已结束
let
now
=
new
Date
();
let
timeStatus
=
1
;
// 默认进行中
if
(
survey
.
start_time
&&
now
<
new
Date
(
survey
.
start_time
))
{
timeStatus
=
0
;
// 未开始
}
else
if
(
survey
.
end_time
&&
now
>
new
Date
(
survey
.
end_time
))
{
timeStatus
=
2
;
// 已结束
}
resultList
.
push
({
survey_id
:
survey
.
id
,
name
:
survey
.
name
,
start_time
:
survey
.
start_time
,
end_time
:
survey
.
end_time
,
status
:
surveyStatus
status
:
surveyStatus
,
time_status
:
timeStatus
});
}
...
...
src/biz/teacher/communication.ts
View file @
0ec2cabf
...
...
@@ -318,10 +318,11 @@ export async function getStudentOptions(teacherId: string, semesterId?: number,
/**获取目标学期 */
let
semester
;
if
(
semesterId
)
{
semester
=
await
selectOneDataByParam
(
TABLENAME
.
学期表
,
{
id
:
semesterId
});
if
(
!
semester
.
data
)
{
let
semesterData
=
await
selectOneDataByParam
(
TABLENAME
.
学期表
,
{
id
:
semesterId
});
if
(
!
semester
Data
.
data
)
{
throw
new
BizError
(
ERRORENUM
.
未找到数据
,
'学期不存在'
);
}
semester
=
semesterData
.
data
;
}
else
{
semester
=
await
getCurrentSemester
();
}
...
...
@@ -333,7 +334,7 @@ export async function getStudentOptions(teacherId: string, semesterId?: number,
/**获取该导师在指定学期的所有学生 */
let
matches
=
await
selectDataListByParam
(
TABLENAME
.
师生匹配表
,
{
teacher_id
:
teacherId
,
semester_id
:
semester
.
data
?.
id
||
semester
.
id
,
semester_id
:
semester
.
id
,
is_active
:
true
});
...
...
src/config/mysqlTableConfig.ts
View file @
0ec2cabf
...
...
@@ -450,6 +450,8 @@ export const TablesConfig = [
start_time
:
{
type
:
DataTypes
.
DATE
,
allowNull
:
true
,
comment
:
'答题开始时间,为空表示无限制'
},
end_time
:
{
type
:
DataTypes
.
DATE
,
allowNull
:
true
,
comment
:
'答题结束时间,为空表示无限制'
},
is_open
:
{
type
:
DataTypes
.
BOOLEAN
,
allowNull
:
false
,
defaultValue
:
false
,
comment
:
'是否开放答题(管理员手动开启/关闭)'
},
is_temp
:
{
type
:
DataTypes
.
INTEGER
,
allowNull
:
false
,
defaultValue
:
1
,
comment
:
'1模板2试卷'
},
temp_id
:
{
type
:
DataTypes
.
INTEGER
,
allowNull
:
true
,
comment
:
'模板ID'
},
created_at
:
{
type
:
DataTypes
.
DATE
,
allowNull
:
false
,
defaultValue
:
DataTypes
.
NOW
},
updated_at
:
{
type
:
DataTypes
.
DATE
,
allowNull
:
false
,
defaultValue
:
DataTypes
.
NOW
}
},
...
...
src/routers/admin.ts
View file @
0ec2cabf
...
...
@@ -248,6 +248,8 @@ export function setRouter(httpServer) {
httpServer
.
post
(
'/api/admin/survey/edit'
,
checkUser
,
checkRole
(
USERROLE
.
管理员
),
asyncHandler
(
updateSurvey
));
httpServer
.
post
(
'/api/admin/survey/info'
,
checkUser
,
checkRole
(
USERROLE
.
管理员
),
asyncHandler
(
surveyInfo
));
httpServer
.
post
(
'/api/admin/survey/edit_open'
,
checkUser
,
checkRole
(
USERROLE
.
管理员
),
asyncHandler
(
updateIsOpenSurvey
));
}
// ==================== 导师管理 ====================
...
...
@@ -1647,6 +1649,20 @@ async function surveyInfo(req, res) {
res
.
success
(
result
);
}
/**
* 修改测评题库是否开放
* @param req
* @param res
*/
async
function
updateIsOpenSurvey
(
req
,
res
)
{
const
userInfo
=
req
.
userInfo
;
let
reqConf
=
{
surveyId
:
'Number'
,
isOpen
:
'Number'
};
let
{
surveyId
,
isOpen
}
=
eccReqParamater
(
reqConf
,
req
.
body
);
let
result
=
await
teacherSurveyBiz
.
updateIsOpenSurvey
(
surveyId
,
isOpen
);
res
.
success
(
result
);
}
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