|
@@ -5,15 +5,545 @@
|
|
|
- 数据库:[PostgreSQL](https://www.postgresql.org/ "PostgreSQL")
|
|
|
- 数据表
|
|
|
- _User【用户】
|
|
|
+ ```js
|
|
|
+ "fields": {
|
|
|
+ "avatar": {
|
|
|
+ "type": "String"
|
|
|
+ },
|
|
|
+ "name": {
|
|
|
+ "type": "String"
|
|
|
+ },
|
|
|
+ "mobile": {
|
|
|
+ "type": "String"
|
|
|
+ },
|
|
|
+ // Authing 提供信息
|
|
|
+ "phone": {
|
|
|
+ "type": "String"
|
|
|
+ },
|
|
|
+ "lastIP":{
|
|
|
+ "type":"String"
|
|
|
+ },
|
|
|
+ "lastLogin": {
|
|
|
+ "type": "Date"
|
|
|
+ },
|
|
|
+ "userSourceType":{
|
|
|
+ "type": "String"
|
|
|
+ },
|
|
|
+ "loginsCount":{
|
|
|
+ "type": "Number"
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ```
|
|
|
- Profile 【用户角色】
|
|
|
+ ```js
|
|
|
+ "fields": {
|
|
|
+ "user": {
|
|
|
+ "type": "Pointer",
|
|
|
+ "targetClass": "_User",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "phone": {
|
|
|
+ "type": "String"
|
|
|
+ },
|
|
|
+ "email": {
|
|
|
+ "type": "String"
|
|
|
+ },
|
|
|
+ "telephone": {
|
|
|
+ "type": "String"
|
|
|
+ },
|
|
|
+ "province": {
|
|
|
+ "type": "String"
|
|
|
+ },
|
|
|
+ "companyType": {
|
|
|
+ "type": "String"
|
|
|
+ },
|
|
|
+ "postName": {
|
|
|
+ "type": "String"
|
|
|
+ },
|
|
|
+ "idcard": {
|
|
|
+ "type": "String"
|
|
|
+ },
|
|
|
+ "identity": {
|
|
|
+ "type": "String"
|
|
|
+ },
|
|
|
+ "identityFile": {
|
|
|
+ "type": "String"
|
|
|
+ },
|
|
|
+ "majorSubject": {
|
|
|
+ "type": "String"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ ```
|
|
|
- Department 【单位部门】
|
|
|
+ ```js
|
|
|
+ "fields": {
|
|
|
+ "parent": {//上级
|
|
|
+ "type": "Pointer",
|
|
|
+ "targetClass": "Department",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "name": {//单位、组织名称
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "code": {//标识码
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "branch": {//主管部门
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "address": {//所在地
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "type": { // 单位类型
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "hasChildren": {//办学层次
|
|
|
+ "type": "Boolean",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ```
|
|
|
- EduTextbook 【教材】
|
|
|
+ ```js
|
|
|
+ "fields": {
|
|
|
+ "status": {
|
|
|
+ /*状态
|
|
|
+ 101:待完善资料
|
|
|
+ 102:可提交状态
|
|
|
+ 103:已提交至高校管理员
|
|
|
+ 200:已提交遴选中
|
|
|
+ 201:公示中
|
|
|
+ 300:退回
|
|
|
+ 400:已报送
|
|
|
+ */
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "childrens":{//指向所有分册
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "user": {
|
|
|
+ "type": "Pointer",
|
|
|
+ "targetClass":"_User",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "department": { //所属流程
|
|
|
+ "type": "Pointer",
|
|
|
+ "targetClass":"Department",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "render": { //是否提交
|
|
|
+ "type": "Boolean",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "recommend": { //是否推荐
|
|
|
+ "type": "Boolean",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "complete": { //是否填写完整
|
|
|
+ "type": "Boolean",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "isDeleted": {
|
|
|
+ "type": "Boolean",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "discard": { //删除至回收站
|
|
|
+ "type": "Boolean",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "title": {
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "ISBN": {
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "author": {
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "unit": {
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "type": {
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "typeNumber": {//全册次数
|
|
|
+ "type": "Number",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "majorPoniter": {
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "lang": {
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "authors": {
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "editor": {
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "approval": {//是否为重点立项教材
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "edition": {
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "editionFirst": {
|
|
|
+ "type": "Date",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "carrierShape": {
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "editionDate": {
|
|
|
+ "type": "Date",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "editionNumber": {//出版版次
|
|
|
+ "type": "Number",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "printDate": {
|
|
|
+ "type": "Date",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "printNumber": {
|
|
|
+ "type": "Number",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "printSum": {
|
|
|
+ "type": "Number",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "importantProject": {//重点项目
|
|
|
+ "type": "Array",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "importantProjectOther": {//重点项目-其他
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "copyright": {
|
|
|
+ "type": "Array",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "CIP": {
|
|
|
+ "type": "Array",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ 'majors':{//适用专业代码(六位)及名称
|
|
|
+ "type":'Number',
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "period": {
|
|
|
+ "type": "Number",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "lessons": {
|
|
|
+ "type": "Array",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "characteristic": {
|
|
|
+ "type": "Array",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "authorList": {
|
|
|
+ "type": "Array",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "authorDetails": {
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "achievementOptions": {
|
|
|
+ "type": "Array",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "courses": {
|
|
|
+ "type": "Array",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "innovateExplain": {
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "influence": {
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "textbookFiles": {
|
|
|
+ "type": "Array",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "links": {
|
|
|
+ "type": "Array",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "opinions": {
|
|
|
+ "type": "Array",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "selfResults": {
|
|
|
+ "type": "Object",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "expertOpinion": {
|
|
|
+ "type": "Object",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "evidence": {
|
|
|
+ "type": "Object",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "moreMaterial": {
|
|
|
+ "type": "Array",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "authorSign": {
|
|
|
+ "type": "Array",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "unitMaterial": {
|
|
|
+ "type": "Object",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "accept": {//填写承诺书
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "approvedImgUrl":{//重点立项教材获批截图
|
|
|
+ "type":'String',
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "eduProcess": {//所属流程
|
|
|
+ "type": "Pointer",
|
|
|
+ "targetClass":"EduProcess",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "code":{//编号
|
|
|
+ "type":'String',
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ 'editionUnit':{
|
|
|
+ "type":'String',
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ 'copyrightImgUrl':{
|
|
|
+ "type":'String',
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ 'CIPImgurl':{
|
|
|
+ "type":'String',
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ 'examine':{//作者政治审核表
|
|
|
+ "type":'Array',
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ 'cipProveFile':{//cip相关截图
|
|
|
+ "type":'Array',
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ 'inviteUnit':{//推荐单位
|
|
|
+ "type":'Array',
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ 'unitType':{//推荐单位类型
|
|
|
+ "type":'Array',
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ 'score':{//平均分
|
|
|
+ "type":'Number',
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ```
|
|
|
- EduTextbookVolume 【分册】
|
|
|
- Activity 【评审活动】
|
|
|
+ ```js
|
|
|
+ "fields": {
|
|
|
+ "name":{//活动名称
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "eduProcess": { //评审教材
|
|
|
+ "type": "Pointer",
|
|
|
+ "targetClass": "EduProcess",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "startDate": {//开始时间
|
|
|
+ "type": "Date",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "deadline": {//截止时间
|
|
|
+ "type": "Date",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "status":{//是否开始
|
|
|
+ "type": "Number",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "desc":{//详情说明
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ```
|
|
|
- Company 【公司】
|
|
|
+ ```js
|
|
|
+ "fields": {
|
|
|
+ "title": {
|
|
|
+ "type": "String"
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ```
|
|
|
- EduProcess 【流程】
|
|
|
+ ```js
|
|
|
+ "fields": {
|
|
|
+ "eduCollection": { //指向报送合集
|
|
|
+ "type": "Pointer",
|
|
|
+ "targetClass": "EduCollection",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "branch": { //类别
|
|
|
+ "type": "Pointer",
|
|
|
+ "targetClass": "Department",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "department": { //部门/单位
|
|
|
+ "type": "Pointer",
|
|
|
+ "targetClass": "Department",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "profileSubmitted": {//流程管理员
|
|
|
+ "type": "Pointer",
|
|
|
+ "targetClass":"Profile",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "name": {//流程名称
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "num": {//报送名额
|
|
|
+ "type": "Number",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "code": {//流程唯一标识
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "startDate": {//开始时间
|
|
|
+ "type": "Date",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "deadline": {//截止时间
|
|
|
+ "type": "Date",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ /**@状态
|
|
|
+ * 100:暂停
|
|
|
+ * 200:已开始
|
|
|
+ * 201:评审中
|
|
|
+ * 300:已公示
|
|
|
+ * 400:已提交(完成)
|
|
|
+ */
|
|
|
+ "status": {
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "releaseDate": {//公示时间
|
|
|
+ "type": "Date",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+
|
|
|
+ "collectStartData": {//收集文件开始时间
|
|
|
+ "type": "Date",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "collectEndData": {//收集文件结束时间
|
|
|
+ "type": "Date",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ```
|
|
|
- EduReview 【评审记录】
|
|
|
+ ```js
|
|
|
+ "fields": {
|
|
|
+ "eduTextbook": { //评审教材
|
|
|
+ "type": "Pointer",
|
|
|
+ "targetClass": "EduTextbook",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "user": {
|
|
|
+ "type": "Pointer",
|
|
|
+ "targetClass": "_User",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "profile": { //评审用户
|
|
|
+ "type": "Pointer",
|
|
|
+ "targetClass": "Profile",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "score": {//最终分数
|
|
|
+ "type": "Number"
|
|
|
+ },
|
|
|
+ "num":{//预估分
|
|
|
+ "type": "Number"
|
|
|
+ },
|
|
|
+ "verify":{//是否完成
|
|
|
+ "type": "Boolean"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ ```
|
|
|
- ExpertGroup 【评审组】
|
|
|
+ ```js
|
|
|
+ "fields": {
|
|
|
+ "name":{//活动名称
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "eduProcess": { //评审流程
|
|
|
+ "type": "Pointer",
|
|
|
+ "targetClass": "EduProcess",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "textbookList": {//评审教材列表
|
|
|
+ "type": "Array",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "reviewList": {//评审教师列表
|
|
|
+ "type": "Array",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "checkTextbook": {//选择教材类型
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ "checkReview": {//选择评审专家类型
|
|
|
+ "type": "String",
|
|
|
+ "required": false
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ```
|
|
|
|
|
|
### 后端语言及框架
|
|
|
- 编写语言:JavaScript
|
|
@@ -56,6 +586,31 @@ graph TB
|
|
|
- 重点传入参数
|
|
|
- @files:回显文件
|
|
|
- @acl 上传类型,是否加密
|
|
|
+ - @type 可上传文件类型
|
|
|
+ ```js
|
|
|
+ //映射关系处理
|
|
|
+ get accept() {
|
|
|
+ let type;
|
|
|
+ switch (this.type) {
|
|
|
+ case 'image':
|
|
|
+ type = 'image/*';
|
|
|
+ break;
|
|
|
+ case 'pdf':
|
|
|
+ type = 'application/pdf';
|
|
|
+ break;
|
|
|
+ case 'audio':
|
|
|
+ type = 'audio/*';
|
|
|
+ break;
|
|
|
+ case 'video':
|
|
|
+ type = 'video/*';
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ type = 'file';
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return type;
|
|
|
+ }
|
|
|
+ ```
|
|
|
- 上传成功、失败、删除文件触发回调
|
|
|
- 函数`change`,返回fileList
|
|
|
- app-textbook 【教材列表组件】
|
|
@@ -82,8 +637,8 @@ graph TB
|
|
|
- initLoginModal 初始化登录模块
|
|
|
- app-login 登录页
|
|
|
- new ParseAuthing实例化authing登录服务,通过login成功后回调调用AuthServr服务类,profileVerify处理登录成功后函数
|
|
|
- ```
|
|
|
- let parseAuthing = new ParseAuthing({
|
|
|
+ ```js
|
|
|
+ let parseAuthing = new ParseAuthing({
|
|
|
// 监听事件:登陆成功后,返回用户信息
|
|
|
login:(user,authClient)=>{
|
|
|
console.log(user)
|
|
@@ -97,7 +652,20 @@ graph TB
|
|
|
}
|
|
|
});
|
|
|
parseAuthing.initLoginModal();
|
|
|
- ```
|
|
|
+ ```
|
|
|
+- app-account-info 工作联系人注册
|
|
|
+ - 功能说明
|
|
|
+ - 访客用户可在登录页点击“账户申请”进入工作联系人账户申请,国家级管理员可查看资料根据情况是否通过,通过条件会自动校验是否存在,如果流程存在该管理员会自动替换
|
|
|
+ - 主要函数方法
|
|
|
+ - `validateForm`:基础填写字段
|
|
|
+ - `identity`:注册身份
|
|
|
+ - `identityFile`:单位联系人认证文件
|
|
|
+ - 主要参数说明
|
|
|
+ - `getUnitTypes`:获取可选择注册单位
|
|
|
+ - `provinceChange`:根据所选单位类型获取对应单位
|
|
|
+ - `submitForm`:提交注册信息
|
|
|
+ - `profileSave`:提交角色信息
|
|
|
+ - `authUser`:注册基础字段信息校验,判断手机号、邮箱是否合规
|
|
|
##### 作者/教师/主编
|
|
|
- 路由模块:`NavAuthorRoutingModule`
|
|
|
- 组件(教材创建)
|
|
@@ -111,7 +679,7 @@ graph TB
|
|
|
- 保存接口中判断是否填写完成
|
|
|
- 判断各分册填写及获取分册id代码
|
|
|
- 部分主要代码
|
|
|
- ```
|
|
|
+ ```js
|
|
|
let eduTextbookVolumes = await this.saveEduTextbookVolume(this.eduTextbookId);
|
|
|
console.log(eduTextbookVolumes?.isVrifly);
|
|
|
console.log(eduTextbookVolumes.list);
|
|
@@ -131,14 +699,14 @@ graph TB
|
|
|
- `saveEduTextbookVolume`:上传分册数据
|
|
|
- 子组件调用
|
|
|
- 上传获批截图
|
|
|
- ```
|
|
|
+ ```html
|
|
|
<app-comp-upload
|
|
|
[type]="'pdf'"
|
|
|
(change)="upload($event, 'approvedImgUrl')"
|
|
|
title="上传教材获批截图"
|
|
|
></app-comp-upload>
|
|
|
- 分册信息
|
|
|
- ```
|
|
|
+ ```html
|
|
|
<app-one #children
|
|
|
[eduTextbookId]="eduTextbookId"
|
|
|
[eduTextbookVolumeId]="panel?.id"
|
|
@@ -151,7 +719,7 @@ graph TB
|
|
|
- `saveEduTextbookVolume`:上传分册数据
|
|
|
- 子组件调用
|
|
|
- 分册信息
|
|
|
- ```
|
|
|
+ ```html
|
|
|
<app-author
|
|
|
#children
|
|
|
[eduTextbook]="eduTextbook?.id"
|
|
@@ -165,7 +733,7 @@ graph TB
|
|
|
- `saveEduTextbookVolume`:上传分册数据
|
|
|
- 子组件调用
|
|
|
- 分册信息
|
|
|
- ```
|
|
|
+ ```html
|
|
|
<app-three
|
|
|
#children
|
|
|
[eduTextbook]="eduTextbook?.id"
|
|
@@ -191,14 +759,14 @@ graph TB
|
|
|
- 子组件调用
|
|
|
- app-comp-upload 附件上传组件
|
|
|
- 分册信息
|
|
|
- ```
|
|
|
+ ```html
|
|
|
<app-author-file
|
|
|
#children
|
|
|
[eduTextbook]="eduTextbook?.id"
|
|
|
[eduTextbookVolume]="panel"
|
|
|
></app-author-file>
|
|
|
```
|
|
|
-- 个人空间:app-space
|
|
|
+- ###### 个人空间:app-space
|
|
|
- 调用组件:app-textbook
|
|
|
- 主要函数:`getEduProcess` 获取教师所属单位的流程
|
|
|
- 创建教材:app-apply
|
|
@@ -209,7 +777,7 @@ graph TB
|
|
|
- app-faith
|
|
|
- app-attachment
|
|
|
- 应用代码
|
|
|
- ```
|
|
|
+ ```html
|
|
|
@switch (state) { @case (0) {
|
|
|
<app-basic
|
|
|
[eduTextbook]="textBook"
|
|
@@ -247,9 +815,9 @@ graph TB
|
|
|
></app-attachment>
|
|
|
} }
|
|
|
```
|
|
|
- - 回收站:app-recycle
|
|
|
+- ###### 回收站:app-recycle
|
|
|
- 调用组件:app-textbook
|
|
|
- ```
|
|
|
+ ```html
|
|
|
<app-textbook
|
|
|
[filterObj]="filterObj"
|
|
|
[uid]="user?.id"
|
|
@@ -277,7 +845,6 @@ graph TB
|
|
|
- 批量查看已提交至国家级管理员教材、教材文件上传管理
|
|
|
- 调用组件
|
|
|
- app-textbook
|
|
|
- - app-collect-textbook:
|
|
|
- app-collect-textbook
|
|
|
- 申报流程:app-process-list
|
|
|
- 功能说明
|
|
@@ -307,11 +874,57 @@ graph TB
|
|
|
- app-process-create:流程管理
|
|
|
- app-textbook
|
|
|
- app-collect-textbook
|
|
|
-- 用户列表:app-page-user
|
|
|
+- ###### 用户列表:app-page-user
|
|
|
- 功能说明
|
|
|
- 本页权限通过`tbookSer.profile.identity`判断给与相应权限,包含国家级管理员、高校联系人管理权限区分;国家级管理员可管理平台所有身份用户,工作联系人可管理所属部门节点及下级节点的部门用户,不包含“工作联系人”身份的用户
|
|
|
- 统一管理平台所有用户,可创建、删除、修改用户
|
|
|
- 创建用户:点击`addMember`弹出创建用户弹窗,填写用户基本信息后点击确定完成请求创建用户,人员类型校验必须选择部门后才能选择
|
|
|
+ - 在操作通过认证时,如果该工作联系人对应流程未被绑定,则会自动校验绑定至该单位的流程作为流程管理员(注:每一个流程只能对应一个流程管理员),诺已绑定,则会取消本次绑定事件,但会继续通过身份认证。部分代码逻辑
|
|
|
+ ```js
|
|
|
+ //更新工作联系人textbook.ts
|
|
|
+ async updateProfileSubmitted(
|
|
|
+ pid: string,
|
|
|
+ type: string,
|
|
|
+ dpid?: string,
|
|
|
+ msg?: NzMessageService
|
|
|
+ ): Promise<boolean | undefined> {
|
|
|
+ console.log(pid, type, dpid);
|
|
|
+ let query = new Parse.Query('EduProcess');
|
|
|
+ if (!dpid) {
|
|
|
+ query.equalTo('profileSubmitted', pid);
|
|
|
+ } else {
|
|
|
+ query.equalTo('department', dpid);
|
|
|
+ }
|
|
|
+ query.include('profileSubmitted');
|
|
|
+ query.select('objectId', 'profileSubmitted');
|
|
|
+ query.notEqualTo('isDeleted', true);
|
|
|
+ let res = await query.first();
|
|
|
+ if (!res?.id) {
|
|
|
+ msg?.warning('所属单位不存在');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (type == 'del') {
|
|
|
+ //删除工作联系人
|
|
|
+ res.set('profileSubmitted', null);
|
|
|
+ await res.save();
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ //添加工作联系人
|
|
|
+ if (res?.get('profileSubmitted')?.get('user')) {
|
|
|
+ msg?.warning('该单位已有部门联系人,请先移除后再操作');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ res?.set('profileSubmitted', {
|
|
|
+ __type: 'Pointer',
|
|
|
+ className: 'Profile',
|
|
|
+ objectId: pid,
|
|
|
+ });
|
|
|
+ await res.save();
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ ```
|
|
|
- 主要参数说明
|
|
|
- `profiles`:用户列表
|
|
|
- `parentList`:部门选择
|
|
@@ -331,7 +944,7 @@ graph TB
|
|
|
- 编辑、查看用户信息,含扩展字段,省份、职务等
|
|
|
- 修改密码:判断是否具有修改权限,如果有可直接在弹出中修改,修改后会直接通过邮箱或短信通知
|
|
|
- 用户教材:可查看该用户所创建的所有教材,含未提交的,组件传入参数
|
|
|
- ```
|
|
|
+ ```js
|
|
|
submitTextBook = {
|
|
|
status:['102','103','200','201','300','400'],
|
|
|
btns:{
|
|
@@ -341,7 +954,7 @@ graph TB
|
|
|
```
|
|
|
- 调用组件
|
|
|
- app-textbook
|
|
|
- ```
|
|
|
+ ```html
|
|
|
<app-textbook
|
|
|
[filterObj]="submitTextBook"
|
|
|
[uid]="user?.id"
|
|
@@ -364,10 +977,10 @@ graph TB
|
|
|
- `updateUserJson`:更新用户数据
|
|
|
- `moduleChange`:判断编辑数据变化
|
|
|
- `updateCanDeActivate`:保存提示
|
|
|
-- 申报单位管理:app-page-role
|
|
|
+- ###### 申报单位管理:app-page-role
|
|
|
- 功能说明
|
|
|
- 通过权限判断获取单位部门`getDepart`,存储nodes节点,部分代码
|
|
|
- ```
|
|
|
+ ```js
|
|
|
nodes.push({
|
|
|
title: item.get('name'),
|
|
|
key: item.id,
|
|
@@ -398,7 +1011,6 @@ graph TB
|
|
|
- `showProfile`:变更用户部门
|
|
|
- `accountComplete`:添加账号
|
|
|
- `updateProfile`:保存更新部门
|
|
|
-
|
|
|
##### 工作联系人:中央部门所属高校联系人、部省合建高校联系人、出版单位联系人、省属高校流程管理员
|
|
|
- 路由模块:`NavProContactRoutingModule`
|
|
|
- 组件
|
|
@@ -419,7 +1031,7 @@ graph TB
|
|
|
- 功能说明
|
|
|
- 批量查看已提交至国家级管理员教材、教材文件上传管理
|
|
|
- 通过`textbook?.export()`调用`app-textbook`组件直接下载汇总表
|
|
|
- ```
|
|
|
+ ```html
|
|
|
<app-textbook
|
|
|
hidden
|
|
|
#textbook
|
|
@@ -432,7 +1044,7 @@ graph TB
|
|
|
- app-textbook
|
|
|
- 主要参数说明
|
|
|
- `beforeFilterObj`:待审核参数
|
|
|
- ```
|
|
|
+ ```js
|
|
|
beforeFilterObj: any = {
|
|
|
showMore: true, //显示更多字段
|
|
|
isCheck: true,
|
|
@@ -444,7 +1056,7 @@ graph TB
|
|
|
};
|
|
|
```
|
|
|
- `afterFilterObj`:已加入推荐
|
|
|
- ```
|
|
|
+ ```js
|
|
|
afterFilterObj: any = {
|
|
|
showMore: true, //显示更多字段
|
|
|
isCheck: true,
|
|
@@ -473,7 +1085,7 @@ graph TB
|
|
|
- 调用组件
|
|
|
- app-process-create
|
|
|
- app-textbook
|
|
|
- ```
|
|
|
+ ```html
|
|
|
<div class="title">待评审教材列表</div>
|
|
|
<app-textbook
|
|
|
[filterObj]="beforeFilterObj"
|
|
@@ -487,7 +1099,7 @@ graph TB
|
|
|
[eduProcess]="eduProcess"
|
|
|
></app-textbook>
|
|
|
```
|
|
|
- ```
|
|
|
+ ```js
|
|
|
//待审核
|
|
|
beforeFilterObj: any = {
|
|
|
showMore: true, //显示更多字段
|
|
@@ -525,7 +1137,7 @@ graph TB
|
|
|
- 评审组:设置教材可评审的评审人员,教材与评审组关系:n:1
|
|
|
- 调用组件
|
|
|
- app-comp-upload
|
|
|
- ```
|
|
|
+ ```html
|
|
|
//上传教材评审文件,在评审端评审时可在弹出的打分中看到该文件
|
|
|
<app-comp-upload
|
|
|
[type]="'pdf'"
|
|
@@ -534,7 +1146,7 @@ graph TB
|
|
|
></app-comp-upload>
|
|
|
```
|
|
|
- app-review-details
|
|
|
- ```
|
|
|
+ ```html
|
|
|
<app-review-details
|
|
|
[listOfFilter]="listOfFilter"
|
|
|
[filterObj]="filterObj"
|
|
@@ -553,19 +1165,217 @@ graph TB
|
|
|
- 所有设置均有回显类名class="dep-right"元素显示,也会在当前类class="dep-comp"显示选中样式
|
|
|
- 教材评审明细显示已打分的各个评审专家分数
|
|
|
- 调用组件
|
|
|
+ - app-review-details
|
|
|
+ ```html
|
|
|
+ <app-review-details [filterObj]="reviewFilterObj"></app-review-details>
|
|
|
+ ```
|
|
|
+ - app-textbook
|
|
|
+ ``` html
|
|
|
+ //setOfCheckedTextbookAll传入已选择的id
|
|
|
+ //updateCheck是组件选中后确认的回调方法,通过@ViewChild获取组件元素服务,直接调用组件方法赋值给页面
|
|
|
+ <app-textbook
|
|
|
+ [hidden]="radio == 'all'"
|
|
|
+ [filterObj]="filterObj"
|
|
|
+ [eduProcess]="eduProcess"
|
|
|
+ [setOfCheckedId]="setOfCheckedTextbookAll"
|
|
|
+ (updateCheck)="updateCheck()"
|
|
|
+ #textbook
|
|
|
+ >
|
|
|
+ ```
|
|
|
+ - 主要参数说明
|
|
|
+ - `eduProcess`:申报流程
|
|
|
+ - `expertGroup`:评审组对象
|
|
|
+ - `checkProfileListLeng`:已选择评审专家人数
|
|
|
+ - `reviewFilterObj`:传入评审组件显示列表参数
|
|
|
+ - 主要函数方法
|
|
|
+ - `refresh`:初始化评审组,回显、赋值可编辑信息
|
|
|
+ - `getTextName`:获取展示已选择教材
|
|
|
+ - `getExpertGroup`:获取所有已被其他评审组选择过教材
|
|
|
+ - `getProfile`:获取评委专家
|
|
|
+ - `updateAllChecked`:选中专家改变事件
|
|
|
+ - `onSave`:保存评审设置,评审教材、评审专家
|
|
|
+- 本社教材源文件:app-collect-file
|
|
|
+ - 功能说明
|
|
|
+ - 本路由权限只有出版社部门节点下的联系人有权限进入,在app-comp-manage初始化组件中做逻辑menu权限判断
|
|
|
+ - comp-manage.component.ts相关代码
|
|
|
+ ```js
|
|
|
+ if (this.tbookSer.profile.identity == '工作联系人' && this.tbookSer.profile.user?.department?.branch == '出版单位') {
|
|
|
+ this.optionsMap['工作联系人'][0].child.push({
|
|
|
+ name: '本社教材源文件',
|
|
|
+ path: '/nav-province-contact/manage/collect',
|
|
|
+ id: '1-3',
|
|
|
+ });
|
|
|
+ }
|
|
|
+ ```
|
|
|
+ - 根据教材分册所选出版社,editionUnit字段是否等于当前出版社单位筛选条件;查询对应教材是否在上传期间条件:EduTextbook.eduProcess.status流程状态需要是已提交至国家级管理员
|
|
|
+ - 因为单本教材可能涉及到多个分册,每个分册可能不同出版单位,我们在教材获取下来后在分册中做了本次教材校验,且在上传中只能对应选中本出版单位本册可操作、查看,以下部分代码,通过判断渲染可编辑权限教材
|
|
|
+ ```html
|
|
|
+ @for (panel of currentTextbook?.get('childrens'); track panel) { @if
|
|
|
+ (panel?.get('editionUnit') == tbookSer.profile.user?.department?.name) {
|
|
|
+ <nz-collapse-panel
|
|
|
+ #p
|
|
|
+ [nzHeader]="title"
|
|
|
+ [nzActive]="false"
|
|
|
+ nzExpandedIcon="caret-right"
|
|
|
+ style="
|
|
|
+ background: #f7f7f7;
|
|
|
+ border-radius: 4px;
|
|
|
+ margin-bottom: 24px;
|
|
|
+ border: 0px;
|
|
|
+ "
|
|
|
+ >
|
|
|
+ <ng-template #title>
|
|
|
+ <span class="panel-title">{{
|
|
|
+ "分册" + ($index + 1) + "-" + currentTextbook?.get("title")
|
|
|
+ }}</span>
|
|
|
+ </ng-template>
|
|
|
+ <div class="">
|
|
|
+ <app-upload-collect
|
|
|
+ #children
|
|
|
+ [eduTextbookVolume]="panel"
|
|
|
+ ></app-upload-collect>
|
|
|
+ </div>
|
|
|
+ <ng-template #expandedIcon let-active>
|
|
|
+ {{ active }}
|
|
|
+ <span
|
|
|
+ nz-icon
|
|
|
+ nzType="caret-right"
|
|
|
+ class="ant-collapse-arrow"
|
|
|
+ [nzRotate]="p.nzActive ? 90 : -90"
|
|
|
+ ></span>
|
|
|
+ </ng-template>
|
|
|
+ </nz-collapse-panel>
|
|
|
+ } }
|
|
|
+ ```
|
|
|
+ - 管理员可点击列表编辑打开弹出后,进行教材上传
|
|
|
+ - 调用组件
|
|
|
+ - app-upload-collect
|
|
|
- 主要参数说明
|
|
|
- - app-textbook
|
|
|
- ```
|
|
|
- <app-textbook
|
|
|
- [hidden]="radio == 'all'"
|
|
|
- [filterObj]="filterObj"
|
|
|
- [eduProcess]="eduProcess"
|
|
|
- [setOfCheckedId]="setOfCheckedTextbookAll"
|
|
|
- (updateCheck)="updateCheck()"
|
|
|
- #textbook
|
|
|
- >
|
|
|
- ```
|
|
|
- - app-review-details
|
|
|
- ```
|
|
|
- <app-review-details [filterObj]="reviewFilterObj"></app-review-details>
|
|
|
+ - `textbookList`:教材列表
|
|
|
+ - `statusMap`:任务状态,映射关系:{教材id:{状态,状态色、可操作按钮}}
|
|
|
+ - 主要函数方法
|
|
|
+ - `fromatFiled`:格式化拓展表字段
|
|
|
+ - `getTextbook`:获取教材
|
|
|
+ - `getEduProcess`:获取流程
|
|
|
+ - `onEditModal`:上传教材打开上传弹窗
|
|
|
+ - `saveCollect`:保存上传教材
|
|
|
+ - `saveEduTextbookVolume`:保存事件推送上传教材
|
|
|
+- 用户列表:app-page-user 功能同国家级管理员[用户列表](#用户列表app-page-user)
|
|
|
+- 申报单位管理: app-page-role 功能同国家级管理员[申报单位管理](#申报单位管理app-page-roler)
|
|
|
+##### 高校联系人
|
|
|
+- 路由模块:`NavProSchoolRoutingModule`
|
|
|
+- 全部教材:app-page-textbook
|
|
|
+ - 功能说明
|
|
|
+ - 高校联系人只有省级教育行政部门、有关部门(单位)教育司(局)单位下级省局单位下高校有登录权限,当教师属于该单位下时,默认提交到高校联系人,由高校联系人审核后提交至工作联系人
|
|
|
+ - 在本页高校联系人可查看对应高校及以下单位的所有教师教材,含未提交
|
|
|
+ - 待提交教材可点击提交至工作联系人,代评审教材为未被专家评审或未提交报送的教材
|
|
|
+ - 调用组件
|
|
|
+ - app-textbook
|
|
|
+ - 主要参数说明
|
|
|
+ - `draftFilterObj`:获取草稿传参子组件调教
|
|
|
+ - `beforeFilterObj`:获取待提交教材子组件调教
|
|
|
+ - `afterFilterObj`:获取待评审教材子组件调教
|
|
|
+ - 主要函数方法
|
|
|
+ - `getProcess`:获取流程
|
|
|
+- 用户列表:app-page-user 功能同国家级管理员[用户列表](#用户列表app-page-user)
|
|
|
+- 申报单位管理: app-page-role 功能同国家级管理员[申报单位管理](#申报单位管理app-page-roler)
|
|
|
+- 个人空间:app-space 功能同教师[个人空间](#个人空间app-space)
|
|
|
+- 回收站:app-recycle 功能同教师[回收站](#回收站app-recycle)
|
|
|
+##### 教材评审专家
|
|
|
+- 路由模块:`NavReviewRoutingModule`
|
|
|
+- 教材打分:app-approve
|
|
|
+ - 功能说明
|
|
|
+ - 根据评审组件获取该评审专家对应可打分评审的教材,首先需先确定该流程下的评审活动已开启,是否在评审期间以活动时间为准,以下为权限及获取打分教材部分代码
|
|
|
+ ```js
|
|
|
+ //判断是否在获取期间
|
|
|
+ get isStart(): boolean {
|
|
|
+ return (
|
|
|
+ !this.activity?.get('startDate') ||
|
|
|
+ this.activity?.get('startDate') > new Date()
|
|
|
+ );
|
|
|
+ }
|
|
|
+ ```
|
|
|
+ ```html
|
|
|
+ <!-- 获取教材列表组件 -->
|
|
|
+ <app-textbook
|
|
|
+ (markScore)="onMarkScore($event)"
|
|
|
+ [filterObj]="beforeFilterObj"
|
|
|
+ [scoreMap]="scoreMap"
|
|
|
+ #textbook
|
|
|
+ ></app-textbook>
|
|
|
+ ```
|
|
|
+ ```js
|
|
|
+ //待评分
|
|
|
+ beforeFilterObj: any = {
|
|
|
+ showMore: true, //显示更多字段
|
|
|
+ isCheck: true,
|
|
|
+ status: ['200'],
|
|
|
+ contained: [],
|
|
|
+ btns: {
|
|
|
+ eduReivew: true,
|
|
|
+ mark: true,
|
|
|
+ },
|
|
|
+ };
|
|
|
+ //已评审
|
|
|
+ afterFilterObj: any = {
|
|
|
+ showMore: true, //显示更多字段
|
|
|
+ isCheck: false,
|
|
|
+ status: ['200','201','300','400'],
|
|
|
+ contained: [],
|
|
|
+ btns: {
|
|
|
+ eduReivew: true,
|
|
|
+ },
|
|
|
+ };
|
|
|
+ ```
|
|
|
+ - 点击打分可在可允许打分条件下弹窗,若已过或未开始评审时间,则打分弹窗会被阻止;评审专家可在打分弹窗中打分,可先保存`saveScore('save')`或提交`saveScore('submit')`
|
|
|
+ - 调用组件
|
|
|
+ - app-textbook
|
|
|
+ - 主要参数说明
|
|
|
+ - `eduProcess`:流程
|
|
|
+ - `editTextbook`:评分教材
|
|
|
+ - `eduReview`:评审记录
|
|
|
+ - `scoreMap`:教材评审状态
|
|
|
+ - 主要函数方法
|
|
|
+ - `authCompute`:校验是否在评审期间
|
|
|
+ - `isStart`:校验评审是否开始
|
|
|
+ - `isEnd`:校验评审是否结束
|
|
|
+ - `getEduReview`:获取评审记录
|
|
|
+ - `getExpertGroup`:获取评审组相关教材,评审专家可对应对各评审组,需把所有评审组中教材获取后传递给渲染组件获取可评审教材
|
|
|
+ ```js
|
|
|
+ //部分代码逻辑
|
|
|
+ r.forEach((item) => {
|
|
|
+ item.get('textbookList')?.forEach((obj: any) => {
|
|
|
+ this.beforeFilterObj.contained.push(obj.id || obj.objectId);
|
|
|
+ });
|
|
|
+ });
|
|
|
```
|
|
|
+ - `getActivity`:获取评审活动
|
|
|
+ - `onMarkScore`:打开评审弹窗
|
|
|
+ - `saveScore`:提交打分
|
|
|
+##### 其他公共模块
|
|
|
+- 教材详情:app-textbook-details
|
|
|
+ - 功能说明
|
|
|
+ - 展示教材所有基础信息,含附件
|
|
|
+ - 联系人或国家级管理员身份可查看评审分数
|
|
|
+ - 主要参数说明
|
|
|
+ - `textBook`:教材对象
|
|
|
+ - 主要函数方法
|
|
|
+ - `getExpertGroup`:获取评审组
|
|
|
+ - `getEduReview`:获取本教程评分
|
|
|
+- 补充上传教材作者诚信承诺:app-upload-pdf
|
|
|
+ - 功能说明
|
|
|
+ - 创建时未上传作者签名文件等,可链接本页面填写添加补全
|
|
|
+ - 主要参数说明
|
|
|
+ - `authorSignPDF`:上传签名页
|
|
|
+ - `unitMaterial`:申报单位承诺意见
|
|
|
+ - 主要函数方法
|
|
|
+ - `saveEduTextbook`:获取教材签名文件是否上传
|
|
|
+ - `upload`:上传文件回调
|
|
|
+### 项目公共服务类services
|
|
|
+- auth.guard.ts:路由守卫
|
|
|
+- auth.service.ts:用户身份服务
|
|
|
+- compute.ts:科学计算
|
|
|
+- majors.map.ts:教材所属专业类map(6位)
|
|
|
+- majors4.map.ts:教材所属专业类map(4位)
|
|
|
+- shell.ts:定制化导出脚本
|
|
|
+- textbook.ts:教材common服务
|