warrior hai 5 meses
pai
achega
d0c26af72a

+ 4 - 0
projects/textbook/src/app/app.routes.ts

@@ -70,5 +70,9 @@ export const routes: Routes = [
     path: 'test/upload', // 私有上传测试
     canActivate: mapToCanActivate([superAuthGuard]),
     loadComponent:()=> import('../app/comp-upload/example-upload/example-upload.component').then((mod) => mod.ExampleUploadComponent),
+  },
+  {
+    path: 'external', // 外链请求评审
+    loadChildren:()=> import('../modules/review-verify/modules.routes').then((mod) => mod.ReviewRoutingModule),
   }
 ];

+ 59 - 0
projects/textbook/src/modules/review-verify/auth.guard.ts

@@ -0,0 +1,59 @@
+import { Injectable } from '@angular/core';
+import {
+  CanActivate,
+  ActivatedRouteSnapshot,
+  RouterStateSnapshot,
+} from '@angular/router';
+import { Observable } from 'rxjs';
+import { Router } from '@angular/router';
+import { textbookServer } from '../../services/textbook';
+@Injectable({
+  providedIn: 'root',
+})
+export class AuthGuard implements CanActivate {
+  LoginPage = '/user/login';
+  constructor(private tbookSer: textbookServer, private router: Router) {}
+  canActivate(
+    next: ActivatedRouteSnapshot,
+    state: RouterStateSnapshot
+  ): Observable<boolean> | Promise<boolean> | boolean {
+    return this.checkLogin();
+  }
+  async checkLogin(): Promise<boolean> {
+    const currentUrl = window.location.href;
+    return await new Promise((resolve) => {
+      fetch(
+        'https://audit.hep.com.cn/common-shenhe-api/api/public/index/search/bookPath_cache_check',
+        {
+          method: 'POST',
+          headers: {
+            'Content-Type': 'application/json',
+          },
+          body: JSON.stringify({ path: currentUrl }), // 传递当前URL
+        }
+      )
+        .then((response) => response.json())
+        .then((data) => {
+          console.log(data.data);
+          if (data.data.rs == 0) {
+            // window.location.href =
+            //   'https://audit.hep.com.cn/admin/401?noGoBack=0';
+            this.router.navigate([this.LoginPage]);
+            resolve(false);
+          } else {
+            
+            resolve(true);
+          }
+        })
+        .catch((error) => {
+          console.error('Error:', error); // 处理错误
+        });
+    });
+    // if (this.tbookSer.profile.identity == '国家级管理员') {
+    //   return true;
+    // }
+    // this.router.navigate([this.LoginPage]);
+    // return false;
+  }
+}
+export { CanActivate };

+ 30 - 0
projects/textbook/src/modules/review-verify/modules.routes.ts

@@ -0,0 +1,30 @@
+import { NgModule } from '@angular/core';
+import { mapToCanActivate, RouterModule, Routes } from '@angular/router';
+import { TextbookDetailsComponent } from './textbook-details/textbook-details.component';
+import { AuthGuard } from './auth.guard';
+const routes: Routes = [
+  {
+    path: '',
+    redirectTo:'review/detail',
+    pathMatch: "full",
+  },
+  {
+    path: 'review',
+    canActivate: mapToCanActivate([AuthGuard]),
+    children: [
+      {
+        path: 'detail/:id', //创建教材
+        component: TextbookDetailsComponent,
+      },
+      {
+        path: 'files/:id', //创建教材
+        component: TextbookDetailsComponent,
+      },
+    ],
+  }
+];
+@NgModule({
+  imports: [RouterModule.forChild(routes)],
+  exports: [RouterModule],
+})
+export class ReviewRoutingModule {}

+ 641 - 0
projects/textbook/src/modules/review-verify/textbook-details/textbook-details.component.html

@@ -0,0 +1,641 @@
+<div class="preview">
+  <div class="site-page-header">
+    <nz-page-header
+      nzTitle="教材详情 - {{ textBook?.title }}"
+      nzSubtitle=""
+      style="padding: 0"
+    >
+    </nz-page-header>
+    <nz-tabset [(nzSelectedIndex)]="active">
+      <nz-tab nzTitle="教材申报书及附件"></nz-tab>
+      <nz-tab nzTitle="教材文件"> </nz-tab>
+    </nz-tabset>
+  </div>
+
+  @if(active == 0) {
+  <ng-container *ngTemplateOutlet="Basics"></ng-container>
+  } @else if (active == 1) {
+  <div class="content"></div>
+  }
+
+  <ng-template #Basics>
+    <div class="content">
+      <div nz-row>
+        <div nz-col nzSpan="18">
+          <div id="anchor1" class="occupy" style="height: 100px"></div>
+          <div class="templ1" #templ1 style="width: 500px">
+            <div class="title">教材基本信息</div>
+            <div class="base-content">
+              <div class="row">
+                <div class="label">申报教材名称</div>
+                <div class="value">{{ textBook?.title }}</div>
+              </div>
+              <div class="row">
+                <div class="label">教材所属学科专业类</div>
+                <div class="value">
+                  {{ textBook?.discipline?.code }}
+                  {{ textBook?.discipline?.name }}
+                </div>
+              </div>
+              <div class="row">
+                <div class="label">教材应用对象及所属学科专业类</div>
+                <div class="value">
+                  {{ textBook?.majorPoniter?.code }}
+                  {{ textBook?.majorPoniter?.name }}
+                </div>
+              </div>
+              <div class="row">
+                <div class="label">是否为重点立项教材</div>
+                <div class="value">
+                  {{ textBook?.approval }}
+                  @if (textBook?.approval&&textBook?.approval!='否') {
+                  <a (click)="openFile(textBook?.approvedImgUrl)">
+                    <span nz-icon nzType="file" nzTheme="outline"></span>
+                    教材获批截图
+                  </a>
+                  }
+                </div>
+              </div>
+              <div class="row">
+                <div class="label">申报类型</div>
+                <div class="value">
+                  {{ textBook?.type }}
+                  {{
+                    textBook?.type == "全册" ? textBook?.typeNumber + "册" : ""
+                  }}
+                </div>
+              </div>
+
+              <nz-collapse>
+                @for (volume of eduTextbookVolumeList; track $index) {
+                <nz-collapse-panel
+                  [nzHeader]="$index + 1 + '册'"
+                  [nzActive]="'true'"
+                >
+                  <div class="row">
+                    <div class="label">第一主编(作者)</div>
+                    <div class="value">{{ volume?.author }}</div>
+                  </div>
+                  <div class="row">
+                    <div class="label">第一主编(作者)单位</div>
+                    <div class="value">{{ volume?.unit }}</div>
+                  </div>
+
+                  <div class="row">
+                    <div class="label">教材主要语种类型</div>
+                    <div class="value">{{ volume?.lang }}</div>
+                  </div>
+                  <div class="row">
+                    <div class="label">国际标准书号</div>
+                    <div class="value">{{ volume?.ISBN }}</div>
+                  </div>
+                  <div class="row">
+                    <div class="label">其他主编姓名</div>
+                    <div class="value">{{ volume?.authors || "-" }}</div>
+                  </div>
+                  <div class="row">
+                    <div class="label">其他编者姓名</div>
+                    <div class="value">{{ volume?.editor || "-" }}</div>
+                  </div>
+
+                  <div class="row">
+                    <div class="label">出版单位</div>
+                    <div class="value">{{ volume?.editionUnit }}</div>
+                  </div>
+                  <div class="row">
+                    <div class="label">初版时间</div>
+                    <div class="value">
+                      {{ volume?.editionFirst?.iso | date : "yyyy-MM" }}
+                    </div>
+                  </div>
+                  <div class="row">
+                    <div class="label">载体形式</div>
+                    <div class="value">{{ volume?.carrierShape }}</div>
+                  </div>
+                  <div class="row">
+                    <div class="label">本版出版时间及版次</div>
+                    <div class="value">
+                      {{ volume?.editionDate?.iso | date : "yyyy-MM" }}/{{
+                        volume?.editionNumber
+                      }}
+                    </div>
+                  </div>
+                  <div class="row">
+                    <div class="label">最新印次时间及印次</div>
+                    <div class="value">
+                      {{ volume?.printDate?.iso | date : "yyyy-MM" }}/{{
+                        volume?.printNumber
+                      }}
+                    </div>
+                  </div>
+                  <div class="row">
+                    <div class="label">初版以来合计印数</div>
+                    <div class="value">{{ volume?.printSum }}万册</div>
+                  </div>
+                  <div class="row">
+                    <div class="label">初版以来是否曾列为重点项目</div>
+                    <div class="value">
+                      @for (item of volume?.importantProject; track $index) {
+                      <p>
+                        {{ item }}
+                        {{
+                          item == "其他省部级及以上项目"
+                            ? "-" + volume?.importantProjectOther
+                            : ""
+                        }}
+                      </p>
+                      } @if (!(volume?.importantProject?.length > 0)) {
+                      <p>否</p>
+                      }
+                    </div>
+                  </div>
+                </nz-collapse-panel>
+                }
+              </nz-collapse>
+            </div>
+          </div>
+          <div id="anchor2" class="occupy" style="height: 60px"></div>
+          <div class="templ">
+            <div class="title">教材适用情况</div>
+            <div class="base-content">
+              <div class="row">
+                <div class="label">适用专业代码(六位)及名称</div>
+                <div class="value">
+                  {{ textBook?.major?.code }} {{ textBook?.major?.name }}
+                </div>
+              </div>
+              <div class="row">
+                <div class="label">适用课程</div>
+                <div class="value">{{ textBook?.lessons }}</div>
+              </div>
+              <div class="row">
+                <div class="label">课程学时</div>
+                <div class="value">{{ textBook?.period }}</div>
+              </div>
+              <div class="row">
+                <div class="label">适用课程性质</div>
+                <div class="value">
+                  @for (tag of textBook?.characteristic; track tag) { @if
+                  (tag.checked){
+                  <nz-tag>{{ tag.label }}</nz-tag>
+                  } }
+                </div>
+              </div>
+            </div>
+          </div>
+          <div id="anchor3" class="occupy" style="height: 60px"></div>
+          <div class="templ">
+            <div id="anchor3_1" class="occupy" style="height: 60px"></div>
+            <div class="title">作者信息</div>
+
+            <nz-collapse>
+              @for (volume of eduTextbookVolumeList; track $index) {
+              <nz-collapse-panel
+                [nzHeader]="$index + 1 + '册'"
+                [nzActive]="'true'"
+              >
+                <div class="text mar10">
+                  作者(含主编,不超过 6 人,教材中明确出现姓名)
+                </div>
+                <div class="base-content">
+                  <nz-table
+                    #basicTable
+                    [nzShowPagination]="false"
+                    [nzData]="volume?.authorList"
+                    [nzScroll]="{
+                      x: (templ1.style.width || '1000') + 'px',
+                      y: '240px'
+                    }"
+                  >
+                    <thead>
+                      <tr>
+                        <th nzEllipsis nzWidth="120px" nzLeft>姓名</th>
+                        <th nzEllipsis nzWidth="120px">单位</th>
+                        <th nzEllipsis nzWidth="120px">出生年月</th>
+                        <th nzEllipsis nzWidth="120px">国籍</th>
+                        <th nzEllipsis nzWidth="120px">职务</th>
+                        <th nzEllipsis nzWidth="120px">职称</th>
+                        <th nzEllipsis nzWidth="120px">手机号码</th>
+                        <th nzEllipsis nzWidth="120px">电子邮箱</th>
+                        <th nzEllipsis nzWidth="120px">分工</th>
+                        <!-- <th nzEllipsis nzWidth="120px">签名</th> -->
+                        <!-- <th nzEllipsis nzWidth="120px">政治审查表</th> -->
+                      </tr>
+                    </thead>
+                    <tbody>
+                      @for (data of volume?.authorList; track data.mobile;let
+                      index = $index) {
+                      <tr>
+                        <td nzEllipsis nzLeft>
+                          {{ data.name }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.unit }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.birth?.iso | date : "yyyy-MM" }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.nationality }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.job }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.title }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.mobile }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.email }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.work }}
+                        </td>
+                      </tr>
+                      }
+                    </tbody>
+                  </nz-table>
+                </div>
+
+                <div id="anchor3_2" class="occupy" style="height: 60px"></div>
+                <div class="text mar10">第一主编(作者)情况</div>
+                <div class="base-content">
+                  <div class="text-tips">1.相关教学经历</div>
+                  <div class="note">
+                    {{ volume?.authorDetails }}
+                  </div>
+                  <div class="text-tips">
+                    2.相关科学研究项目、成果或论文专著(限5项)
+                  </div>
+                  <nz-table
+                    #basicTable
+                    [nzShowPagination]="false"
+                    [nzData]="volume?.achievementOptions"
+                    [nzScroll]="{
+                      x: (templ1.style.width || '1000') + 'px',
+                      y: '240px'
+                    }"
+                    nzTableLayout="fixed"
+                  >
+                    <thead>
+                      <tr>
+                        <th nzWidth="80px" nzLeft nzAlign="right">序号</th>
+                        <th nzWidth="160px" nzEllipsis>名称</th>
+                        <th nzWidth="160px">来源/出版单位</th>
+                        <th nzWidth="80px">时间</th>
+                      </tr>
+                    </thead>
+                    <tbody>
+                      @for (data of volume?.achievementOptions; track
+                      data.name;let index = $index) {
+                      <tr>
+                        <td nzEllipsis nzLeft nzAlign="right">
+                          {{ index + 1 }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.name }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.unit }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.date?.iso | date : "yyyy-MM" }}
+                        </td>
+                      </tr>
+                      }
+                    </tbody>
+                  </nz-table>
+                </div>
+              </nz-collapse-panel>
+              }
+            </nz-collapse>
+          </div>
+          <div id="anchor4" class="occupy" style="height: 60px"></div>
+          <div class="templ">
+            <div class="title">申报教材建设历程</div>
+
+            <div class="base-content">
+              <nz-collapse>
+                @for (volume of eduTextbookVolumeList; track $index) {
+                <nz-collapse-panel
+                  [nzHeader]="$index + 1 + '册'"
+                  [nzActive]="'true'"
+                >
+                  <nz-table
+                    #basicTable
+                    [nzShowPagination]="false"
+                    [nzData]="volume?.courses"
+                    [nzScroll]="{
+                      x: (templ1.style.width || '1000') + 'px',
+                      y: '240px'
+                    }"
+                  >
+                    <thead>
+                      <tr>
+                        <th nzWidth="80px" nzLeft nzAlign="right">版次</th>
+                        <th nzWidth="120px">出版时间</th>
+                        <th nzWidth="100px">字数</th>
+                        <th nzWidth="100px">重印次数</th>
+                        <th nzWidth="100px">本版总印数</th>
+                        <th nzWidth="200px">获奖励情况</th>
+                      </tr>
+                    </thead>
+                    <tbody>
+                      @for (data of volume?.courses; track data;let index =
+                      $index) {
+                      <tr>
+                        <td nzEllipsis nzLeft nzAlign="right">
+                          {{ index + 1 }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.date?.iso | date : "yyyy-MM" }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.wordage }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.num }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.sumNum }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.accolade }}
+                        </td>
+                      </tr>
+                      }
+                    </tbody>
+                  </nz-table>
+                </nz-collapse-panel>
+                }
+              </nz-collapse>
+            </div>
+          </div>
+          <div
+            id="anchor4"
+            id="anchor5"
+            class="occupy"
+            style="height: 60px"
+          ></div>
+          <div class="templ">
+            <div class="title">申报教材特色及创新</div>
+            <div class="base-content">
+              <div class="note">
+                {{ textBook?.innovateExplain }}
+              </div>
+            </div>
+          </div>
+          <div
+            id="anchor4"
+            id="anchor6"
+            class="occupy"
+            style="height: 60px"
+          ></div>
+          <div class="templ">
+            <div class="title">申报教材应用情况及社会影响力</div>
+            <div class="base-content">
+              <div class="note">
+                {{ textBook?.influence }}
+              </div>
+            </div>
+          </div>
+          <div
+            id="anchor4"
+            id="anchor9"
+            class="occupy"
+            style="height: 60px"
+          ></div>
+          <div class="templ">
+            <div class="title">教材作者诚信承诺</div>
+            <div class="base-content">
+              <div class="row">
+                <div class="label">教材作者诚信承诺</div>
+                <div class="value">
+                  <span style="color: #3e49b3">{{ textBook?.accept }}</span>
+                </div>
+              </div>
+              <!-- <div class="text-tips">教材作者诚信承诺</div>
+            <div class="note">
+              {{ textBook?.accept }}
+            </div> -->
+              <!-- <div class="text-tips">2.申报单位承诺意见</div>
+            <div class="note">
+              {{textBook?.unitMaterial?.text}}
+            </div> -->
+              <div class="row">
+                <div class="label">作者诚信承诺签名页</div>
+                <div class="value">
+                  @if (textBook?.authorSignPDF?.url) {
+                  <a (click)="openFile(textBook?.authorSignPDF?.url)">{{
+                    textBook?.authorSignPDF?.name || "签名页文件"
+                  }}</a>
+                  }
+                </div>
+              </div>
+            </div>
+          </div>
+          <div class="templ">
+            <div class="title">申报单位承诺意见</div>
+            <div class="base-content">
+              <div class="row">
+                <div class="label">申报单位承诺意见材料</div>
+                <div class="value">
+                  @if (textBook?.unitMaterial?.url) {
+                  <a (click)="openFile(textBook?.unitMaterial?.url)">{{
+                    textBook?.unitMaterial?.name || "申报单位承诺意见材料文件"
+                  }}</a>
+                  }
+                </div>
+              </div>
+            </div>
+          </div>
+
+          <div
+            id="anchor4"
+            id="anchor7"
+            class="occupy"
+            style="height: 60px"
+          ></div>
+          <div class="templ">
+            <div class="title">附件材料</div>
+            <div class="base-content">
+              <nz-collapse>
+                @for (volume of eduTextbookVolumeList; track $index) {
+                <nz-collapse-panel
+                  [nzHeader]="$index + 1 + '册'"
+                  [nzActive]="'true'"
+                >
+                  <nz-table
+                    style="margin-bottom: 20px"
+                    #basicTable
+                    [nzShowPagination]="false"
+                    [nzData]="volume?.authorList"
+                    [nzScroll]="{
+                      x: (templ1.style.width || '1000') + 'px',
+                      y: '240px'
+                    }"
+                  >
+                    <thead>
+                      <tr>
+                        <th nzEllipsis nzWidth="120px" nzLeft>姓名</th>
+                        <th nzEllipsis nzWidth="120px" nzLeft>政治审查表</th>
+                        <th nzEllipsis nzWidth="120px">单位</th>
+                        <th nzEllipsis nzWidth="120px">出生年月</th>
+                        <th nzEllipsis nzWidth="120px">国籍</th>
+                        <th nzEllipsis nzWidth="120px">职务</th>
+                        <th nzEllipsis nzWidth="120px">职称</th>
+                        <th nzEllipsis nzWidth="120px">手机号码</th>
+                        <th nzEllipsis nzWidth="120px">电子邮箱</th>
+                        <th nzEllipsis nzWidth="120px">分工</th>
+                        <!-- <th nzEllipsis nzWidth="120px">签名</th> -->
+                      </tr>
+                    </thead>
+                    <tbody>
+                      @for (data of volume?.authorList; track data.mobile;let
+                      index = $index) {
+                      <tr>
+                        <td nzEllipsis nzLeft>
+                          {{ data.name }}
+                        </td>
+                        <td nzEllipsis nzLeft>
+                          <a (click)="openFile(data?.examine)">政治审查表</a>
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.unit }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.birth?.iso | date : "yyyy-MM" }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.nationality }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.job }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.title }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.mobile }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.email }}
+                        </td>
+                        <td nzEllipsis>
+                          {{ data.work }}
+                        </td>
+                        <!-- <td nzEllipsis>
+                    <a (click)="openFile(data?.signature)">签名文件</a>
+                  </td> -->
+                      </tr>
+                      }
+                    </tbody>
+                  </nz-table>
+                  @if (volume?.otherEditor) {
+                  <a (click)="openFile(volume.otherEditor)"
+                    >其他编者政治审查意见</a
+                  >
+                  }
+                </nz-collapse-panel>
+                }
+              </nz-collapse>
+
+              <div class="row" style="margin-top: 10px">
+                <div class="label">图书编校质量自查结果记录表</div>
+                <div class="value">
+                  <a (click)="openFile(textBook?.selfResults?.url)">{{
+                    textBook?.selfResults?.name
+                  }}</a>
+                </div>
+              </div>
+              <div class="row">
+                <div class="label">专家审查意见表</div>
+                <div class="value">
+                  <a (click)="openFile(textBook?.expertOpinion?.url)">{{
+                    textBook?.expertOpinion?.name
+                  }}</a>
+                </div>
+              </div>
+              <div class="row">
+                <div class="label">教材使用情况证明材料</div>
+                <div class="value">
+                  <a (click)="openFile(textBook?.evidence?.url)">{{
+                    textBook?.evidence?.name
+                  }}</a>
+                </div>
+              </div>
+              <div class="row">
+                <div class="label">版权页截图</div>
+                <div class="value">
+                  @if (textBook?.copyrightImgUrl) {
+                  <a (click)="openFile(textBook?.copyrightImgUrl)">截图文件</a>
+                  }
+                </div>
+              </div>
+              <div class="row">
+                <div class="label">中国版本图书馆 CIP 查询截图</div>
+                <div class="value">
+                  @if (textBook?.CIPImgUrl) {
+                  <a (click)="openFile(textBook?.CIPImgUrl)">查询截图</a>
+                  }
+                </div>
+              </div>
+              <div class="row">
+                <div class="label">CIP 相关证明截图</div>
+                <div class="value">
+                  @for (item of textBook?.cipProveFile; track item.name) {
+                  <a (click)="openFile(item.url)" style="margin-right: 10px">{{
+                    item.name
+                  }}</a>
+                  <br />
+                  }
+                </div>
+              </div>
+
+              <div class="row">
+                <div class="label">其他材料</div>
+                <div class="value">
+                  @for (item of textBook?.moreMaterial; track item.name) {
+                  <a (click)="openFile(item.url)" style="margin-right: 10px">{{
+                    item.name
+                  }}</a>
+                  <br />
+                  }
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <div nz-col nzSpan="6">
+          <div style="position: fixed">
+            <ul class="herf">
+              <li class="lv1" (click)="herfLink('anchor1')">教材基本信息</li>
+              <li class="lv1" (click)="herfLink('anchor2')">教材适用情况</li>
+              <li class="lv1" (click)="herfLink('anchor3')">作者信息</li>
+              <li class="lv2" (click)="herfLink('anchor3_1')">作者</li>
+              <li class="lv2" (click)="herfLink('anchor3_2')">
+                第一主编(作者)情况
+              </li>
+              <li class="lv1" (click)="herfLink('anchor4')">
+                申报教材建设历程
+              </li>
+              <li class="lv1" (click)="herfLink('anchor5')">
+                申报教材特色及创新
+              </li>
+              <li class="lv1" (click)="herfLink('anchor6')">
+                申报教材应用情况及社会影响力
+              </li>
+              <li class="lv1" (click)="herfLink('anchor9')">
+                申报单位承诺意见
+              </li>
+              <li class="lv1" (click)="herfLink('anchor7')">附件材料清单</li>
+            </ul>
+          </div>
+        </div>
+      </div>
+    </div>
+  </ng-template>
+</div>

+ 152 - 0
projects/textbook/src/modules/review-verify/textbook-details/textbook-details.component.scss

@@ -0,0 +1,152 @@
+.preview{
+  height: 100%;
+  overflow-y: scroll;
+  padding: 0 0 10px;
+  flex: 1;
+  background-color: #fff;
+  border-radius: 10px;
+  position: relative;
+  max-width: 1200px;
+  margin: 0 auto;
+  background: #f5f5f5;
+}
+.site-page-header {
+  position: sticky;
+  top: 0;
+  z-index: 9;
+  padding: 24px 24px 10px;
+  background-color: white;
+  font-family: PingFang SC;
+  background: #f5f5f5;
+  .steps {
+    max-width: 1000px;
+    margin: 10px 0;
+  }
+  .back {
+    font-family: PingFang SC;
+    font-size: 14px;
+    font-weight: 400;
+    line-height: 22px;
+    text-align: left;
+    cursor: pointer;
+  }
+}
+.content {
+  font-family: PingFang SC;
+  padding: 10px 24px;
+  .title {
+    font-family: PingFang SC;
+    font-size: 20px;
+    font-weight: 500;
+    line-height: 28px;
+    text-align: left;
+    margin-bottom: 20px;
+  }
+  .templ {
+    margin-top: 40px;
+    .text {
+      font-family: PingFang SC;
+      font-size: 16px;
+      font-weight: 500;
+      line-height: 22px;
+      text-align: left;
+    }
+  }
+  .base-content {
+    .row {
+      display: flex;
+      margin-bottom: 18px;
+      .label {
+        width: 220px;
+        font-family: PingFang SC;
+        font-size: 14px;
+        font-weight: 400;
+        line-height: 20px;
+        text-align: left;
+        color: #231c1f99;
+      }
+      .value {
+        margin-left: 20px;
+        flex: 1;
+        font-family: PingFang SC;
+        font-size: 14px;
+        font-weight: 400;
+        line-height: 20px;
+        text-align: left;
+      }
+    }
+    .text-tips {
+      font-family: PingFang SC;
+      font-size: 14px;
+      font-weight: 400;
+      line-height: 20px;
+      text-align: left;
+      color: #231c1f99;
+      margin: 10px 0;
+    }
+    .note{
+      font-family: PingFang SC;
+      font-size: 14px;
+      font-weight: 400;
+      line-height: 20px;
+      text-align: left;
+      color: #231C1F;
+      margin: 10px 0;
+      white-space: pre-wrap;
+    }
+  }
+}
+.mar10{
+  margin: 20px 0;
+}
+.footer{
+  display: flex;
+  margin: 10px auto;
+  align-items: center;
+  justify-content: space-evenly;
+  // width: 200px;
+  justify-content: end;
+  padding-right: 100px;
+}
+
+.herf{
+  font-size: 14px;
+  color: rgb(77, 76, 76);
+  .lv1,.lv2{
+    cursor: pointer;
+  }
+  .lv2{
+    margin-left: 20px;
+  }
+  li{
+    list-style: none;
+    margin: 8px 0;
+  }
+  li:hover{
+    color: #1890ff;
+  }
+}
+
+
+::ng-deep .ant-page-header-heading-title {
+  white-space: normal;
+}
+
+::ng-deep .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn {
+  color: #c6233f;
+}
+
+::ng-deep .ant-tabs-ink-bar {
+  background: #c6233f;
+}
+
+::ng-deep .ant-tabs-tab:hover {
+  color: #e97488;
+}
+
+::ng-deep .ant-tabs-tab-btn:active {
+  color: #e97488;
+}
+::ng-deep .ant-page-header {
+  padding: 0 !important;
+}

+ 24 - 0
projects/textbook/src/modules/review-verify/textbook-details/textbook-details.component.spec.ts

@@ -0,0 +1,24 @@
+import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { TextbookDetailsComponent } from './textbook-details.component';
+
+describe('TextbookDetailsComponent', () => {
+  let component: TextbookDetailsComponent;
+  let fixture: ComponentFixture<TextbookDetailsComponent>;
+
+  beforeEach(waitForAsync(() => {
+    TestBed.configureTestingModule({
+      declarations: [ TextbookDetailsComponent ],
+      imports: [IonicModule.forRoot()]
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(TextbookDetailsComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  }));
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 76 - 0
projects/textbook/src/modules/review-verify/textbook-details/textbook-details.component.ts

@@ -0,0 +1,76 @@
+import { Component, OnInit, ViewChild } from '@angular/core';
+import { CommonCompModule } from '../../../services/common.modules';
+import { Router, ActivatedRoute } from '@angular/router';
+import { ReactiveFormsModule } from '@angular/forms';
+import { NzAnchorModule } from 'ng-zorro-antd/anchor';
+import { DatePipe } from '@angular/common';
+import Parse from 'parse';
+import { NzCollapseModule } from 'ng-zorro-antd/collapse';
+import { CommonModule } from '@angular/common';
+import { NzTabsModule } from 'ng-zorro-antd/tabs';
+import { NzTableModule } from 'ng-zorro-antd/table';
+
+@Component({
+  selector: 'app-textbook-details',
+  imports: [
+    CommonCompModule,
+    ReactiveFormsModule,
+    NzAnchorModule,
+    DatePipe,
+    NzCollapseModule,
+    CommonModule,
+    NzTabsModule,
+    NzTableModule,
+  ],
+  standalone: true,
+  templateUrl: './textbook-details.component.html',
+  styleUrls: ['./textbook-details.component.scss'],
+  providers: [DatePipe],
+})
+export class TextbookDetailsComponent implements OnInit {
+  @ViewChild('templ1') templ1: any;
+  user?: Parse.Object;
+  textBook: object | any = {};
+  /**扩展表记录 */
+  eduTextbookVolumeList: Array<any> = [];
+  active:number = 0
+  /** 册数*/
+  typeNumber: any;
+  /** 申报类型*/
+  type: any;
+
+  constructor(
+    private router: Router,
+    private activeRoute: ActivatedRoute
+  ) {}
+
+  ngOnInit() {
+    this.activeRoute.paramMap.subscribe(async (params) => {
+      this.user = Parse.User.current();
+      let id = params.get('id');
+      console.log(id);
+      if (id) {
+        let query = new Parse.Query('EduTextbook');
+        query.equalTo('objectId', id);
+        query.include('childrens');
+        let r = await query.first();
+        this.textBook = r?.toJSON();
+        console.log(this.textBook);
+        this.eduTextbookVolumeList = this.textBook?.childrens;
+      }
+    });
+  }
+
+  openFile(url: string) {
+    console.log(url);
+    window.open(url);
+  }
+  /**锚点 */
+  herfLink(domId: string) {
+    console.log(domId);
+    let topEle = document.getElementById(domId);
+    if (topEle) {
+      topEle.scrollIntoView({ behavior: 'smooth' });
+    }
+  }
+}