warrior 8 months ago
parent
commit
8735e62554

+ 1 - 1
projects/textbook/src/app/app.component.ts

@@ -15,7 +15,7 @@ export class AppComponent {
     this.initParseService();
   }
   initParseService(){
-    Parse.initialize("edu-parse");
+    Parse.initialize("edu-textbook");
     (Parse as any).serverURL = ("http://localhost:61337/parse");
     localStorage.setItem('company','Nc5qrhudIa')
   }

+ 13 - 8
projects/textbook/src/app/app.routes.ts

@@ -1,6 +1,7 @@
-import { Routes } from '@angular/router';
-// import { AuthGuard } from '../services/auth.guard';
+import { Routes,mapToCanActivate } from '@angular/router';
+import { AuthGuard } from '../services/auth.guard';
 import { CompUserComponent } from './comp-user/comp-user.component';
+import { ProfileComponent } from '../modules/user/profile/profile.component'
 
 export const routes: Routes = [
   { path: '',loadComponent:()=>import('../modules/textbook/page-home/page-home.component').then(m=>m.PageHomeComponent) }, // 默认跳转到 ''
@@ -9,34 +10,38 @@ export const routes: Routes = [
     component: CompUserComponent,
     loadChildren:()=> import('../modules/login/modules.routes').then((mod) => mod.LoginRoutingModule),
   },
+  {
+    path: 'profile', // 用户登录/注册
+    component: ProfileComponent,
+  },
   {
     path: 'nav-admin', //国家级管理员管理平台
-    // canActivate: [AuthGuard],
+    canActivate: mapToCanActivate([AuthGuard]),
     loadChildren: () =>import('../modules/nav-admin/modules.routes').then((mod) => mod.NavAdminRoutingModule),
   },
   {
     path: 'nav-province-submit',//省级教育行政部门
-    // canActivate: [AuthGuard],
+    canActivate: mapToCanActivate([AuthGuard]),
     loadChildren: () =>import('../modules/nav-province-submit/modules.routes').then((mod) => mod.NavProRoutingModule),
   },
   {
     path: 'nav-province-contact',//中央部门所属高校联系人、部省合建高校联系人、出版单位联系人、省属高校流程管理员
-    // canActivate: [AuthGuard],
+    canActivate: mapToCanActivate([AuthGuard]),
     loadChildren: () =>import('../modules/nav-province-contact/modules.routes').then((mod) => mod.NavProContactRoutingModule),
   },
   {
     path: 'nav-province-school-contact', //省属高校联系人
-    // canActivate: [AuthGuard],
+    canActivate: mapToCanActivate([AuthGuard]),
     loadChildren: () =>import('../modules/nav-province-school-contact/modules.routes').then((mod) => mod.NavProSchoolRoutingModule),
   },
   {
     path: 'nav-review', //教材评审组成员
-    // canActivate: [AuthGuard],
+    canActivate: mapToCanActivate([AuthGuard]),
     loadChildren: () =>import('../modules/nav-review/modules.routes').then((mod) => mod.NavReviewRoutingModule),
   },
   {
     path: 'nav-author', //作者 / 教师 / 主编
-    // canActivate: [AuthGuard],
+    canActivate: mapToCanActivate([AuthGuard]),
     loadChildren: () =>import('../modules/nav-author/modules.routes').then((mod) => mod.NavAuthorRoutingModule),
   },
 ];

+ 1 - 1
projects/textbook/src/app/comp-nav/comp-nav.component.html

@@ -1,5 +1,5 @@
 <div class="bar">
-  <nz-avatar nzIcon="user" style="background-color:#87d068;"></nz-avatar>
+  <nz-avatar (click)="goUrl('/profile')" nzIcon="user" style="background-color:#87d068;"></nz-avatar>
   <div class="title">{{tbookSer.profile?.name}}</div>
   <div class="space"></div>
   <div class="user">

+ 11 - 2
projects/textbook/src/app/comp-nav/comp-nav.component.ts

@@ -3,7 +3,7 @@ import { NzAvatarModule } from 'ng-zorro-antd/avatar';
 import { textbookServer } from "../../services/textbook";
 import { MatButtonModule } from '@angular/material/button';
 import { MatIconModule } from '@angular/material/icon';
-import { RouterModule } from '@angular/router';
+import { RouterModule,Router } from '@angular/router';
 
 @Component({
   selector: 'app-comp-nav',
@@ -19,9 +19,18 @@ import { RouterModule } from '@angular/router';
 export class CompNavComponent implements OnInit {
 
   constructor(
+    public router: Router,
     public tbookSer: textbookServer
   ) {}
 
   ngOnInit() {}
-
+    
+  goUrl(path: string) {
+    this.router.navigate([
+      path,
+      {
+        // type: this.currentProfile.type,
+      },
+    ]);
+  }
 }

+ 1 - 1
projects/textbook/src/app/comp-user/comp-user.component.html

@@ -1,6 +1,6 @@
 <div class="page">
   <div class="login-content">
-    <h2>本科国家级规划教材遴选报送系统</h2>
+    <div class="title">本科国家级规划教材遴选报送系统</div>
     <router-outlet></router-outlet>
   </div>
 </div>

+ 3 - 1
projects/textbook/src/app/comp-user/comp-user.component.scss

@@ -10,7 +10,9 @@
   background: url('../../../public//img/banner-lab.png') no-repeat;
   background-size: 100% 100%;
 }
-
+.title{
+  font-size: 1.5rem !important;
+}
 .login-content{
   position: absolute;
   transform:translateY(-50%);

+ 3 - 0
projects/textbook/src/modules/nav-author/apply/apply.component.html

@@ -0,0 +1,3 @@
+<p>
+  apply works!
+</p>

+ 0 - 0
projects/textbook/src/modules/nav-author/apply/apply.component.scss


+ 28 - 0
projects/textbook/src/modules/nav-author/apply/apply.component.spec.ts

@@ -0,0 +1,28 @@
+/* tslint:disable:no-unused-variable */
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { By } from '@angular/platform-browser';
+import { DebugElement } from '@angular/core';
+
+import { ApplyComponent } from './apply.component';
+
+describe('ApplyComponent', () => {
+  let component: ApplyComponent;
+  let fixture: ComponentFixture<ApplyComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ ApplyComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(ApplyComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 19 - 0
projects/textbook/src/modules/nav-author/apply/apply.component.ts

@@ -0,0 +1,19 @@
+import { Component, OnInit } from '@angular/core';
+import { CommonCompModule } from '../../../services/common.modules'
+import { Router } from '@angular/router';
+
+@Component({
+  selector: 'app-apply',
+  imports: [CommonCompModule],
+  standalone: true,
+  templateUrl: './apply.component.html',
+  styleUrls: ['./apply.component.scss']
+})
+export class ApplyComponent implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {
+  }
+
+}

+ 24 - 16
projects/textbook/src/modules/nav-author/modules.routes.ts

@@ -2,29 +2,37 @@ import { NgModule } from "@angular/core";
 import { RouterModule, Routes } from "@angular/router";
 import { PageHomeComponent } from './page-home/page-home.component';
 import { PageTextbookComponent } from "./page-textbook/page-textbook.component";
+import { ApplyComponent } from "./apply/apply.component";
+import { ProfileComponent } from '../user/profile/profile.component'
 const routes: Routes = [
   {
-    path: 'home',
-    component: PageHomeComponent,
-    children:[
-      // {
-      //   path: "",
-      //   redirectTo: "pay",
-      //   pathMatch: "full",
-      // },
-    ]
-  },
-  {
-    path: 'textbook',
+    path: 'manage',
     component: PageHomeComponent,
     children:[
       {
-        path: "list",
-        component:PageTextbookComponent
-        // loadComponent(import("./page-textbook/page-textbook.component").then(m=>m.PageTextbookComponent))
+        path: 'textbook',
+        component: PageHomeComponent,
+        children:[
+          {
+            path: "apply",
+            component:ApplyComponent
+          },
+          {
+            path: "list",
+            component:PageTextbookComponent
+          },
+          {
+            path: "recycle",
+            component:PageTextbookComponent
+          },
+        ]
       },
     ]
-  }
+  },
+  {
+    path: 'profile',
+    component: ProfileComponent,
+  },
 ];
 @NgModule({
   imports: [RouterModule.forChild(routes)],

+ 21 - 7
projects/textbook/src/modules/nav-author/page-home/page-home.component.ts

@@ -13,28 +13,42 @@ import { CommonCompModule } from '../../../services/common.modules'
 export class PageHomeComponent  implements OnInit {
 
   options:Array<any> = [
+    // {
+    //   name:'教材管理',
+    //   id:'5',
+    //   child:[
+    //     {
+    //       name:'教材列表',
+    //       id:'1-1',
+    //       path:"/nav-author/textbook/list"
+    //     }
+    //   ]
+    // },
     {
-      name:'教材管理',
+      name:'个人空间',
       id:'1',
       child:[
         {
-          name:'教材列表',
+          name:'创建教材',
           id:'1-1',
           path:"/nav-author/textbook/list"
-        }
+        },
+        {
+          name:'教材列表',
+          id:'1-2',
+          path:"/nav-author/manage/textbook/list"
+        },
       ]
     },
-    {
-      name:'个人空间',
-      id:'1',
-    },
     {
       name:'回收站',
       id:'2',
+      path:'/nav-author/apply'
     },
     {
       name:'个人信息',
       id:'3',
+      path:"/nav-author/profile"
     },
   ]
   active:string = localStorage.getItem('active') || this.options[0].id

+ 8 - 1
projects/textbook/src/modules/nav-author/page-textbook/page-textbook.component.html

@@ -1 +1,8 @@
-<comp-table-list #list *ngIf="className && fieldsArray" [className]="className" [fieldsArray]="fieldsArray" [queryParams]="queryParams"></comp-table-list>
+<comp-table-list
+  #list
+  [schema]="EduTextbook"
+  *ngIf="className && fieldsArray"
+  [className]="className"
+  [fieldsArray]="fieldsArray"
+  [queryParams]="queryParams"
+></comp-table-list>

+ 34 - 0
projects/textbook/src/modules/user/profile/profile.component.html

@@ -0,0 +1,34 @@
+<app-comp-nav></app-comp-nav>
+<nz-page-header
+  class="site-page-header"
+  (nzBack)="onBack()"
+  nzBackIcon
+  nzTitle="个人中心"
+  nzSubtitle="认证身份/编辑信息"
+></nz-page-header>
+<div class="page">
+  <div class="row">
+    <div class="lable">用户名:</div>
+    <div class="value"><input nz-input placeholder="用户名不可更改" [(ngModel)]="editUser.username" [disabled]="true"  type="text" /></div>
+  </div>
+  <div class="row">
+    <div class="lable">头像:</div>
+    <div class="value"><nz-avatar nzIcon="user" style="background-color:#87d068;"></nz-avatar></div>
+  </div>
+  <div class="row">
+    <div class="lable">手机号:</div>
+    <div class="value"><input nz-input placeholder="绑定手机号" [(ngModel)]="editUser.mobile" [disabled]="true" type="text" /></div>
+  </div>
+  <div class="row">
+    <div class="lable">姓名:</div>
+    <div class="value">{{editUser.name}}</div>
+  </div>
+  <div class="row">
+    <div class="lable">邮箱:</div>
+    <div class="value">{{editUser.email}}</div>
+  </div>
+  <div class="row">
+    <div class="lable">身份认证:</div>
+    <div class="value"><button nz-button nzType="primary">身份认证</button></div>
+  </div>
+</div>

+ 20 - 0
projects/textbook/src/modules/user/profile/profile.component.scss

@@ -0,0 +1,20 @@
+.page{
+  width: 800px;
+  margin: 20px auto;
+  box-shadow: rgba(100, 100, 111, 0.2) 0px 7px 29px 0px;
+  padding: 20px;
+  border-radius: 10px;
+  .row{
+    display: flex;
+    align-items: flex-end;
+    margin-bottom: 10px;
+    .lable{
+      width: 100px;
+      text-align: right;
+      margin-right: 10px;
+    }
+    .value{
+      color: #999;
+    }
+  }
+}

+ 24 - 0
projects/textbook/src/modules/user/profile/profile.component.spec.ts

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

+ 46 - 0
projects/textbook/src/modules/user/profile/profile.component.ts

@@ -0,0 +1,46 @@
+import { Component, OnInit } from '@angular/core';
+import { FormsModule } from '@angular/forms';
+import { CompNavComponent } from '../../../app/comp-nav/comp-nav.component';
+import { NzPageHeaderModule } from 'ng-zorro-antd/page-header';
+import { Router } from '@angular/router';
+import { NzInputModule } from 'ng-zorro-antd/input';
+import { NzAvatarModule } from 'ng-zorro-antd/avatar';
+import { NzButtonModule } from 'ng-zorro-antd/button';
+import Parse from 'parse';
+
+@Component({
+  selector: 'app-profile',
+  templateUrl: './profile.component.html',
+  standalone: true,
+  imports: [
+    CompNavComponent,
+    NzPageHeaderModule,
+    NzInputModule,
+    NzAvatarModule,
+    FormsModule,
+    NzButtonModule
+  ],
+  styleUrls: ['./profile.component.scss'],
+})
+export class ProfileComponent implements OnInit {
+  user: Parse.User = Parse.User.current()!;
+
+  editUser: object | any = this.user.toJSON();
+  profileList:Array<Parse.Object> = []
+
+  constructor(private router: Router) {}
+
+  ngOnInit() {
+    console.log(this.editUser);
+    this.getProfile()
+  }
+  async getProfile(){
+    let query = new Parse.Query('Profile')
+    query.equalTo('user', this.user.id)
+    let r = await query.find()
+    this.profileList = r
+  }
+  onBack(): void {
+    history.back();
+  }
+}

+ 11 - 1
projects/textbook/src/schemas/EduTextbook.ts

@@ -3,7 +3,7 @@ import Parse from "parse";
 
 export const EduTextbook = {
     className:"EduTextbook",
-    include:["owner"],
+    include:["user"],
     buttons:[
         // 行内操作
         {
@@ -21,6 +21,16 @@ export const EduTextbook = {
                 }
             }
         },
+        {
+            name:"编辑",
+            place:"item",
+            show:(options:{object:Parse.Object})=>{
+                return true
+            },
+            // handle:(options:{clusterServ:ClusterService,dialog:MatDialog,object:Parse.Object})=>{
+            //     options?.clusterServ?.openMinerDialog(options?.dialog,options?.object)
+            // }
+        },
     ],
     fieldsArray:[
         {key:"title",name:"教材名称",type:"String",isHeader:true},

+ 0 - 40
projects/textbook/src/services/auth.guard.js

@@ -1,40 +0,0 @@
-// import { Injectable } from "@angular/core";
-// import {
-//   CanActivate,
-//   ActivatedRouteSnapshot,
-//   RouterStateSnapshot,
-// } from "@angular/router";
-// import { Observable } from "rxjs";
-// import { Router } from "@angular/router";
-// import { AuthServr } from "./auth.service";
-// import Parse from "parse";
-
-// @Injectable({
-//   providedIn: "root",
-// })
-// export class AuthGuard implements CanActivate {
-//   LoginPage = "/user/login";
-
-//   constructor(public authService: AuthServr, public router: Router) {}
-
-//   canActivate(
-//     next: ActivatedRouteSnapshot,
-//     state: RouterStateSnapshot
-//   ): Observable<boolean> | Promise<boolean> | boolean {
-//     // 当前路由url
-//     let url: string = state.url;
-//     return this.checkLogin(url);
-//   }
-//   checkLogin(url: string): boolean {
-//     // 如果已登录,直接跳转当前路由 跳出该函数
-//     let currentUser = Parse.User.current();
-//     if (currentUser && currentUser.id) {
-//       return true;
-//     }
-//     // 否则重定向到login页面
-//     this.authService.redirectUrl = url;
-//     this.router.navigate([this.LoginPage]);
-//     return false;
-//   }
-// }
-// export { CanActivate };

+ 40 - 0
projects/textbook/src/services/auth.guard.ts

@@ -0,0 +1,40 @@
+import { Injectable } from "@angular/core";
+import {
+  CanActivate,
+  ActivatedRouteSnapshot,
+  RouterStateSnapshot,
+} from "@angular/router";
+import { Observable } from "rxjs";
+import { Router } from "@angular/router";
+import { AuthServr } from "./auth.service";
+import Parse from "parse";
+
+@Injectable({
+  providedIn: "root",
+})
+export class AuthGuard implements CanActivate {
+  LoginPage = "/user/login";
+
+  constructor(public authService: AuthServr, public router: Router) {}
+
+  canActivate(
+    next: ActivatedRouteSnapshot,
+    state: RouterStateSnapshot
+  ): Observable<boolean> | Promise<boolean> | boolean {
+    // 当前路由url
+    let url: string = state.url;
+    return this.checkLogin(url);
+  }
+  checkLogin(url: string): boolean {
+    // 如果已登录,直接跳转当前路由 跳出该函数
+    let currentUser = Parse.User.current();
+    if (currentUser && currentUser.id) {
+      return true;
+    }
+    // 否则重定向到login页面
+    this.authService.redirectUrl = url;
+    this.router.navigate([this.LoginPage]);
+    return false;
+  }
+}
+export { CanActivate };