Переглянути джерело

Merge branch 'master' of http://39.98.153.250:9080/bowintek/GHSCPartyBuild

pengjing 8 місяців тому
батько
коміт
5bf1dd6e04
39 змінених файлів з 1240 додано та 82 видалено
  1. 3 2
      parth5/parth5/src/app/api/file/index.ts
  2. 36 0
      parth5/parth5/src/app/api/propagandawork/dzzfc/index.ts
  3. 7 0
      parth5/parth5/src/app/app.scss
  4. 4 2
      parth5/parth5/src/app/comm/modal/bimage/bimage.component.ts
  5. 1 1
      parth5/parth5/src/app/comm/modal/imglist/imglist.component.ts
  6. 18 0
      parth5/parth5/src/app/routes/propagandawork/dzzfc.ts
  7. 17 15
      parth5/parth5/src/app/views/pages/examtest/examtest.component.html
  8. 12 3
      parth5/parth5/src/app/views/pages/examtest/examtest.component.scss
  9. 11 3
      parth5/parth5/src/app/views/pages/examtest/show/card/card.component.html
  10. 5 0
      parth5/parth5/src/app/views/pages/examtest/show/card/card.component.scss
  11. 4 2
      parth5/parth5/src/app/views/pages/examtest/show/card/card.component.ts
  12. 22 0
      parth5/parth5/src/app/views/pages/examtest/show/result/result.component.html
  13. 15 0
      parth5/parth5/src/app/views/pages/examtest/show/result/result.component.scss
  14. 70 0
      parth5/parth5/src/app/views/pages/examtest/show/result/result.component.ts
  15. 25 23
      parth5/parth5/src/app/views/pages/examtest/show/show.component.html
  16. 3 0
      parth5/parth5/src/app/views/pages/examtest/show/show.component.scss
  17. 35 2
      parth5/parth5/src/app/views/pages/examtest/show/show.component.ts
  18. 49 0
      parth5/parth5/src/app/views/pages/propagandawork/dzzfc/detail/detail.component.html
  19. 38 0
      parth5/parth5/src/app/views/pages/propagandawork/dzzfc/detail/detail.component.scss
  20. 107 0
      parth5/parth5/src/app/views/pages/propagandawork/dzzfc/detail/detail.component.ts
  21. 71 0
      parth5/parth5/src/app/views/pages/propagandawork/dzzfc/edit/edit.component.html
  22. 31 0
      parth5/parth5/src/app/views/pages/propagandawork/dzzfc/edit/edit.component.scss
  23. 138 0
      parth5/parth5/src/app/views/pages/propagandawork/dzzfc/edit/edit.component.ts
  24. 53 0
      parth5/parth5/src/app/views/pages/propagandawork/dzzfc/list.component.html
  25. 42 0
      parth5/parth5/src/app/views/pages/propagandawork/dzzfc/list.component.scss
  26. 146 0
      parth5/parth5/src/app/views/pages/propagandawork/dzzfc/list.component.ts
  27. 2 0
      parth5/parth5/src/app/views/tapp/tab-main/tab-main.route.ts
  28. 9 1
      parth5/parth5/src/app/views/tapp/tabs/tabs.module.ts
  29. 103 0
      src/main/java/com/ghsc/partybuild/controller/app/AppDzzfcController.java
  30. 2 2
      src/main/java/com/ghsc/partybuild/controller/app/AppFileController.java
  31. 0 2
      src/main/java/com/ghsc/partybuild/mapper/PartyCQuery.java
  32. 17 2
      src/main/java/com/ghsc/partybuild/service/FileService.java
  33. 48 4
      src/main/java/com/ghsc/partybuild/service/impl/FileServiceImpl.java
  34. 3 3
      src/main/java/com/ghsc/partybuild/service/impl/PartyUserServiceImpl.java
  35. 2 1
      src/main/resources/application.yml
  36. 2 2
      src/main/resources/mapping/IntegratedQueryCQuery.xml
  37. 1 1
      src/main/resources/mapping/PartyCQuery.xml
  38. 11 11
      src/main/resources/mapping/PartyUserCQuery.xml
  39. 77 0
      src/main/resources/static/doc/template/党建知识题目模板.txt

+ 3 - 2
parth5/parth5/src/app/api/file/index.ts

@@ -36,9 +36,10 @@ export class FileApi {
     });
   }
 
-  getImageBase64(fileId: string) {
+  getImageBase64(id: string, type: string) {
     return this.configService.HttpGetRomote('/appApi/file/getImageBase64', {
-      fileId: fileId
+      id: id,
+      type : type
     });
   }
 

+ 36 - 0
parth5/parth5/src/app/api/propagandawork/dzzfc/index.ts

@@ -0,0 +1,36 @@
+import {ConfigService, RequsetData} from "../../../service/config.service";
+import {Injectable} from "@angular/core";
+import {Observable} from "rxjs";
+import {UserService} from "../../../service/user.service";
+
+export interface reqParams {
+  pageindex: number,
+  pagesize: number,
+  dzzdm: string,
+  ztmc: string,
+  fcType: number
+}
+
+@Injectable({providedIn: 'root'})
+export class DzzfcApi {
+  constructor(private configService: ConfigService, private userService: UserService) {
+  }
+
+  getList(params: reqParams): Observable<RequsetData> {
+    return this.configService.HttpGetRomote('/appApi/publicity/dzzfc/getList', params);
+  }
+
+  delete(id: string): Observable<RequsetData> {
+    return this.configService.HttpGetRomote('/appApi/publicity/dzzfc/delete', {id: id });
+  }
+
+  getData(id: string) {
+    return this.configService.HttpGetRomote('/appApi/publicity/dzzfc/get', {id: id});
+  }
+
+  save(data: any): Observable<RequsetData> {
+    return this.configService.HttpPostRomote('/appApi/publicity/dzzfc/save', data);
+  }
+
+}
+

+ 7 - 0
parth5/parth5/src/app/app.scss

@@ -524,3 +524,10 @@ ion-list {
     left: 0;
   }
 }
+.testresult-modal {
+  .modal-wrapper {
+    height: 45% !important;
+    width: 80% !important;
+    border-radius: 8px;
+  }
+}

+ 4 - 2
parth5/parth5/src/app/comm/modal/bimage/bimage.component.ts

@@ -15,9 +15,11 @@ export class BimageComponent implements OnInit {
   photoSwipe: PhotoSwipeComponent;
 
   @Input() fileid: string = '';
+  @Input() type: string = '';
 
   imgModel: any = {
-    fileid: ''
+    fileid: '',
+    type: '1',
   };
 
   constructor(private fileApi: FileApi, private sanitizer: DomSanitizer, private alertModal: AlertModal) {
@@ -28,7 +30,7 @@ export class BimageComponent implements OnInit {
   }
 
   getImgBase64() {
-    this.fileApi.getImageBase64(this.fileid).subscribe((data: RequsetData) => {
+    this.fileApi.getImageBase64(this.fileid, this.type).subscribe((data: RequsetData) => {
       if (data.success && data.item != null) {
         this.imgModel.base64 = "data:image/png;base64," + data.item.base64;
         this.imgModel.height = data.item.height;

+ 1 - 1
parth5/parth5/src/app/comm/modal/imglist/imglist.component.ts

@@ -61,7 +61,7 @@ export class ImglistComponent implements OnInit {
 
   getImgBase64() {
     this.imgList.filter(e => !e.base64).forEach(img => {
-      this.fileApi.getImageBase64(img.fileid).subscribe((data: RequsetData) => {
+      this.fileApi.getImageBase64(img.fileid, "1").subscribe((data: RequsetData) => {
         if (data.success && data.item != null) {
           img.base64 = "data:image/png;base64," + data.item.base64;
           img.height = data.item.height;

+ 18 - 0
parth5/parth5/src/app/routes/propagandawork/dzzfc.ts

@@ -0,0 +1,18 @@
+import {Routes} from "@angular/router";
+import {
+  DzzfcListComponent
+} from "../../views/pages/propagandawork/dzzfc/list.component";
+import {
+  DzzfcEditComponent
+} from "../../views/pages/propagandawork/dzzfc/edit/edit.component";
+import {
+  DzzfcDetailComponent
+} from "../../views/pages/propagandawork/dzzfc/detail/detail.component";
+
+const routes: Routes = [
+  {path: 'propagandawork/dzzfc', component: DzzfcListComponent},
+  {path: 'propagandawork/dzzfc/edit', component: DzzfcEditComponent},
+  {path: 'propagandawork/dzzfc/detail', component: DzzfcDetailComponent},
+];
+
+export default routes;

+ 17 - 15
parth5/parth5/src/app/views/pages/examtest/examtest.component.html

@@ -18,31 +18,31 @@
           <ion-icon name="grid-outline"></ion-icon>
         </div>
       </ion-item>
-      <ion-item button detail="true" detail-icon="close-outline"  *ngFor="let qt of selectLibaryList;" (click)="remove(qt,false)">
+      <ion-item class="select-libary" detail="true" detail-icon="close-outline" *ngFor="let qt of selectLibaryList;"
+                (click)="remove(qt,false)">
         <ion-label>
           <h3> {{ qt.name }}</h3>
         </ion-label>
       </ion-item>
-    <!--  <span *ngFor="let qt of selectLibaryList;" style="text-wrap: nowrap;">
-                <ion-col size="2">  {{ qt.name }}
-                  <ion-icon name="close-outline" (click)="remove(qt,false)"></ion-icon></ion-col>
-      </span>-->
       <ion-item mode="md">
         <ion-label>选择题型
           <span class="danger">*</span>
         </ion-label>
       </ion-item>
-      <span *ngFor="let qt of questionTypeList;" style="text-wrap: nowrap;">
-            <ion-col size="1">
-              <ion-checkbox color="danger" labelPlacement="end"
-                            (click)="qt.checked=!qt.checked"></ion-checkbox></ion-col>
-            <ion-col size="2">  {{ qt.name }}</ion-col>
-      </span>
+      <div style="display: flex;justify-content: space-evenly">
+        <ng-container *ngFor="let qt of questionTypeList;">
+        <span>
+          <ion-checkbox color="danger" labelPlacement="end"
+                        (click)="qt.checked=!qt.checked"></ion-checkbox>
+          {{ qt.name }}
+        </span>
+        </ng-container>
+      </div>
       <ion-item mode="md">
         <ion-label>题目数量
           <span class="danger">*</span>
         </ion-label>
-        <ion-input type="number" [(ngModel)]="questionnumber" name ="questionnumber" required></ion-input>
+        <ion-input type="number" [(ngModel)]="questionnumber" name="questionnumber" required></ion-input>
       </ion-item>
       <div style="display:flex;align-items: center;margin-top: 10px">
         <ion-icon name="alert-outline" size="small"></ion-icon>
@@ -84,10 +84,12 @@
       </ion-item>
       <div style="margin-left: 10px;">
         <ion-label>已选题库:</ion-label>
-        <span *ngFor="let qt of bakLibaryList;" style="text-wrap: nowrap;">
-                <ion-col size="2">  {{ qt.name }}
-                  <ion-icon name="close-outline" (click)="remove(qt,true)"></ion-icon></ion-col>
+        <div style="display: flex;flex-flow: wrap;">
+        <span *ngFor="let qt of bakLibaryList;" class="item-subtitle-type" style="text-wrap: nowrap;">
+               {{ qt.name }}
+                  <ion-icon name="close-outline" (click)="remove(qt,true)"></ion-icon>
           </span>
+        </div>
       </div>
     </ion-list>
   </ion-content>

+ 12 - 3
parth5/parth5/src/app/views/pages/examtest/examtest.component.scss

@@ -40,6 +40,15 @@
     border-bottom-left-radius: 8px;
   }
 }
-
-
-
+.item-subtitle-type {
+  border: 1px solid #da2c36;
+  color: #da2c36;
+  background-color: white;
+  border-radius: 3px;
+  padding: 1px 5px 0px 5px;
+  margin: 5px;
+}
+.select-libary{
+  border: 1px solid #efeaea;    --min-height: 25px;
+  margin: 10px;--inner-padding-bottom:0px;--inner-padding-top:0px
+}

+ 11 - 3
parth5/parth5/src/app/views/pages/examtest/show/card/card.component.html

@@ -1,10 +1,15 @@
-<ion-header color="danger" style="text-align: center">
-  共{{ doneQuestionNumber + unNumber }}道题
+<ion-header class="header-theme2" id="main-content">
+  <ion-toolbar>
+    <ion-title>
+      共{{ doneQuestionNumber + unNumber }}道题
+    </ion-title>
+  </ion-toolbar>
 </ion-header>
 <ion-content>
   <ion-list>
     <div class="card-body">
       <div class="card-total">
+        客观题:
         <div>
           <ion-icon name="ellipse-outline" style="color: deepskyblue;vertical-align: middle;"></ion-icon>
           正确{{ rightNumber }}道
@@ -23,7 +28,10 @@
         <div class="question-num">
           <div *ngFor="let ques of it.question"
                (click)="selectQuestion(ques)"
-               [ngClass]="{'rightColor':ques.isRight,'unColor':ques.isRight==null,'errColor':ques.isRight==false}">
+               [ngClass]="{'rightColor':ques.isRight
+               ,'unColor':ques.isAnswer==null
+               ,'errColor':ques.isRight==false
+               ,'answerColor':ques.isAnswer&&ques.isRight==null}">
             {{ ques.order }}</div>
         </div>
       </div>

+ 5 - 0
parth5/parth5/src/app/views/pages/examtest/show/card/card.component.scss

@@ -4,6 +4,8 @@
 .card-total{
   display: flex;
   flex-wrap: nowrap;
+  border-bottom: 1px solid #5e5c5c52;
+  padding-bottom: 10px;
 
   div{
     margin-right: 10px;
@@ -40,3 +42,6 @@
 .errColor{
   border: 2px solid red !important;
 }
+.answerColor{
+  border: 2px solid #00ff00 !important;
+}

+ 4 - 2
parth5/parth5/src/app/views/pages/examtest/show/card/card.component.ts

@@ -24,8 +24,6 @@ export class CardComponent implements OnInit {
   ngOnInit() {
     this.autoReaderPaper().then(() => {
       this.getDoneNum();
-      this.unNumber = this.testQuestionList.length - this.doneQuestionNumber;
-      this.errNumber = this.testQuestionList.length - this.unNumber - this.rightNumber;
 
       this.getQuestionTypeList().then(()=>{
         this.questionTypeList = this.questionTypeList.sort((a, b) => a.diplayOrder - b.diplayOrder);
@@ -64,6 +62,10 @@ export class CardComponent implements OnInit {
           this.rightNumber = data.item.filter(function (x) {
             return x.isRight;
           }).length;
+          this.errNumber = data.item.filter(function (x) {
+            return x.isRight==false;
+          }).length;
+          this.unNumber =this.testQuestionList.length - data.item.filter(x => x.isAnswer).length;
         }
         resolve();
       });

+ 22 - 0
parth5/parth5/src/app/views/pages/examtest/show/result/result.component.html

@@ -0,0 +1,22 @@
+<ion-header class="header-theme2" id="main-content">
+  <ion-toolbar>
+    <ion-title>
+      练习结果
+    </ion-title>
+  </ion-toolbar>
+</ion-header>
+<ion-content>
+  <div class="card" style="margin-top: 10px;padding-bottom: 20px;">
+    <div class="result-body">
+      <div class="result-title">你已结束本次个人练习 </div>
+      <div class="result-correctrate">客观题的正确率:{{rightRate}}% </div>
+      <div class="result-questionnum">客观题正确题数:{{rightNumber}}题 </div>
+      <div class="result-questionnum">客观题错误题数:{{errNumber}}题 </div>
+      <div class="result-questionnum">客观题总题数:{{subjectiveCount}}题</div>
+      <div>
+        <ion-button size="small" slot="end" *ngIf="rightRate<100" (click)="dismiss(1);">查看错题</ion-button>
+        <ion-button size="small" slot="end" color="warning" (click)="dismiss(2)">结束考试</ion-button>
+      </div>
+    </div>
+  </div>
+</ion-content>

+ 15 - 0
parth5/parth5/src/app/views/pages/examtest/show/result/result.component.scss

@@ -0,0 +1,15 @@
+.result-body{
+  display: flex;
+  flex-flow: column;
+  align-content: center;
+  justify-items: center;
+  font-size: 15px;
+  text-align: center;
+}
+.result-body >div{
+  padding: 10px 0px;
+}
+.result-body >.result-title{
+  font-size: 18px;
+  font-weight: bold;
+}

+ 70 - 0
parth5/parth5/src/app/views/pages/examtest/show/result/result.component.ts

@@ -0,0 +1,70 @@
+import {Component, Input, OnInit} from '@angular/core';
+import {ConfigService, RequsetData} from "../../../../../service/config.service";
+import {ModalController} from "@ionic/angular";
+
+@Component({
+  selector: 'app-result',
+  templateUrl: './result.component.html',
+  styleUrls: ['./result.component.scss'],
+})
+export class ResultComponent implements OnInit {
+
+  @Input()
+  testQuestionList = [];
+  rightNumber = 0;
+  doneQuestionNumber = 0;
+  unNumber = 0;
+  errNumber = 0;
+  rightRate = 0;
+  subjectiveCount = 0;
+
+  constructor(private configService: ConfigService, public modalController: ModalController) {
+  }
+
+  ngOnInit() {
+    this.autoReaderPaper().then(() => {
+      this.getDoneNum();
+
+      this.subjectiveCount = this.testQuestionList.filter(function (type) {
+        return type.OBJECTIVE_TYPE == 2
+      }).length;
+      this.rightRate = this.rightNumber>0?Math.round(this.rightNumber / (this.rightNumber + this.errNumber) * 100):0;
+    })
+  }
+
+  //阅卷
+  autoReaderPaper() {
+    let pm = new Promise((resolve, reject) => {
+      this.configService.HttpPostRomote('/api/examtest/autoReaderPaper', {userQuestionList: this.testQuestionList,}).subscribe((data: RequsetData) => {
+        if (data.success) {
+          this.testQuestionList = data.item;
+          this.rightNumber = data.item.filter(function (x) {
+            return x.isRight;
+          }).length;
+          this.errNumber = data.item.filter(function (x) {
+            return x.isRight == false;
+          }).length;
+          this.unNumber = this.testQuestionList.length - data.item.filter(x => x.isAnswer).length;
+        }
+        resolve();
+      });
+    });
+    return pm;
+  }
+
+  getDoneNum() {
+    this.doneQuestionNumber = this.testQuestionList.filter(function (ques) {
+      return (ques.useranswer != null && ques.useranswer != "") || ques.ANSWERS.filter(function (ans) {
+        return ans.useranswer != null && ans.useranswer != ""
+      }).length > 0;
+    }).length;
+  }
+
+  dismiss(action) {
+    this.modalController.dismiss({
+      'dismissed': true,
+      'action': action,
+      'testQuestionList': this.testQuestionList
+    });
+  }
+}

+ 25 - 23
parth5/parth5/src/app/views/pages/examtest/show/show.component.html

@@ -13,9 +13,6 @@
       <div [ngSwitch]="ques.NAME">
         <div *ngSwitchCase="'单选题'">
           <span class="ion-text-wrap">{{ ques.order }}.({{ ques.NAME }}){{ ques.CONTENT }}</span>
-          <div style="width: 100%;text-align: right;color:red;" (click)="ques.showAnswer=true">
-            <ion-icon name="checkbox-outline" size="large"></ion-icon>
-          </div>
           <div [class]="{'isright-answer':ans.ISRIGHT&&ques.showAnswer}"
                *ngFor="let ans of ques.ANSWERS;let $index = index">
             <input name="rd_p_{{ques.row_num}}_{{$index}}" type="radio" [(ngModel)]="ques.useranswer"
@@ -26,25 +23,24 @@
           </div>
         </div>
         <div *ngSwitchCase="'填空题'">
-          <div style="width: 100%;text-align: right;color:red;" (click)="ques.showAnswer=true">
-            <ion-icon name="checkbox-outline" size="large"></ion-icon>
-          </div>
           <div class="input-container">
             {{ ques.order }}.({{ ques.NAME }})
             <ng-container *ngFor="let word of ques.CONTENT.split('___'); let j = index">
               {{ word }}
               <!-- 如果当前是句子中的最后一个词前的下划线,则不添加输入框 -->
               <ng-container *ngIf="j < ques.CONTENT.split('___').length - 1">
-                <ion-input [(ngModel)]="ques.ANSWERS[j].useranswer" placeholder="请输入" (ngModelChange)="answer(ques)"></ion-input>
+                <ion-input [(ngModel)]="ques.ANSWERS[j].useranswer" placeholder="请输入"
+                           (ngModelChange)="answer(ques)"></ion-input>
               </ng-container>
             </ng-container>
           </div>
         </div>
         <div *ngSwitchCase="'判断题'">
-          <span class="ion-text-wrap">{{ ques.order}}.({{ ques.NAME }}){{ ques.CONTENT }}</span>
+          <span class="ion-text-wrap">{{ ques.order }}.({{ ques.NAME }}){{ ques.CONTENT }}</span>
           <div [class]="{'isright-answer':ans.ISRIGHT&&ques.showAnswer}"
                *ngFor="let ans of ques.ANSWERS;let $index = index">
-            <input name="rd_p_{{ques.row_num}}_{{$index}}" type="radio" [(ngModel)]="ques.useranswer" (ngModelChange)="answer(ques)"
+            <input name="rd_p_{{ques.row_num}}_{{$index}}" type="radio" [(ngModel)]="ques.useranswer"
+                   (ngModelChange)="answer(ques)"
                    value="{{ans.PROVID_ANSWER_ID}}"
                    class="with-gap" id="rd_p_{{ques.row_num}}_{{$index}}"/>
             <label for="rd_p_{{ques.row_num}}_{{$index}}">{{ options($index) }}、{{ ans.ANSWER_NAME }}</label>
@@ -61,12 +57,10 @@
         </div>
         <div *ngSwitchCase="'多选题'">
           <span class="ion-text-wrap">{{ ques.order }}.({{ ques.NAME }}){{ ques.CONTENT }}</span>
-          <div style="width: 100%;text-align: right;color:red;" (click)="ques.showAnswer=true">
-            <ion-icon name="checkbox-outline" size="large"></ion-icon>
-          </div>
           <div [class]="{'isright-answer':ans.ISRIGHT&&ques.showAnswer}"
                *ngFor="let ans of ques.ANSWERS;let $index = index">
-            <input name="ckb_{{ques.row_num}}_{{$index}}" type="checkbox" [(ngModel)]="ans.useranswer" (ngModelChange)="answer(ques)"
+            <input name="ckb_{{ques.row_num}}_{{$index}}" type="checkbox" [(ngModel)]="ans.useranswer"
+                   (ngModelChange)="answer(ques)"
                    value="{{ans.PROVID_ANSWER_ID}}"
                    class="with-gap" id="ckb_{{ques.row_num}}_{{$index}}"/>
             <label for="ckb_{{ques.row_num}}_{{$index}}">{{ options($index) }}、{{ ans.ANSWER_NAME }}</label>
@@ -81,15 +75,23 @@
 </ion-content>
 <ion-footer>
   <ion-toolbar style="display: flex;align-items: center">
-    <ion-icon (click)="presentModal()" name="reorder-four-outline" style="color: red;vertical-align: middle;"
-              size="large"
-              aria-label="Favorite"></ion-icon>
-    <span>已答{{ answerCount }}/{{ questionCount }}</span>
-    <ion-button size="small" slot="end" *ngIf="order>1" (click)="order=order-1;changeView();">
-      上一题
-    </ion-button>
-    <ion-button size="small" slot="end" *ngIf="questionCount>order" (click)="order=order+1;changeView();">
-      下一题
-    </ion-button>
+    <ng-container *ngIf="!showErrorQuestion">
+      <ion-icon (click)="presentModal()" name="reorder-four-outline" style="color: red;vertical-align: middle;"
+                size="large"
+                aria-label="Favorite"></ion-icon>
+      <span>已答{{ answerCount }}/{{ questionCount }}</span>
+      <ion-icon slot="end" name="checkbox-outline" size="large" (click)="showAnswer()"></ion-icon>
+      <ion-button size="small" slot="end" *ngIf="order>1" (click)="order=order-1;changeView();">
+        上一题
+      </ion-button>
+      <ion-button size="small" slot="end" *ngIf="questionCount>order" (click)="order=order+1;changeView();">
+        下一题
+      </ion-button>
+      <ion-button size="small" slot="end" color="warning" (click)="resultModal()">结束练习</ion-button>
+    </ng-container>
+    <ng-container *ngIf="showErrorQuestion">
+      <ion-icon slot="end" name="checkbox-outline" size="large" (click)="showAnswer()"></ion-icon>
+      <ion-button size="small" slot="end" color="warning" (click)="close()">退出练习</ion-button>
+    </ng-container>
   </ion-toolbar>
 </ion-footer>

+ 3 - 0
parth5/parth5/src/app/views/pages/examtest/show/show.component.scss

@@ -4,6 +4,9 @@
 
 .question-body {
   margin: 10px;
+  div{
+    margin-top: 10px;
+  }
 }
 
 .question-body ion-input {

+ 35 - 2
parth5/parth5/src/app/views/pages/examtest/show/show.component.ts

@@ -3,6 +3,7 @@ import {ConfigService, RequsetData} from "../../../../service/config.service";
 import {AlertController, ModalController, MenuController} from "@ionic/angular";
 import {ActivatedRoute, Router} from "@angular/router";
 import {CardComponent} from "./card/card.component";
+import {ResultComponent} from "./result/result.component";
 
 @Component({
   selector: 'app-show',
@@ -18,6 +19,7 @@ export class ShowComponent implements OnInit {
   curQuestionList = [];
   questionCount = 0;
   answerCount = 0;
+  showErrorQuestion =false;
 
 
   constructor(private modalController: ModalController, public alertController: AlertController, private menu: MenuController, private router: Router, private configService: ConfigService, private routeInfo: ActivatedRoute) {
@@ -72,8 +74,17 @@ export class ShowComponent implements OnInit {
     this.answerCount = this.testQuestionList.filter(x => x.isAnswer).length;
   }
 
-  async presentModal() {
+  showAnswer() {
+    this.curQuestionList.forEach(x => x.showAnswer = true);
+  }
+  close(){
+    this.router.navigate(['../'], {
+      relativeTo: this.routeInfo,
+      queryParams: {id: 'id', random: Math.random()}
+    });
+  }
 
+  async presentModal() {
     const modal = await this.modalController.create({
       component: CardComponent,
       cssClass: 'examtest-modal',
@@ -85,9 +96,31 @@ export class ShowComponent implements OnInit {
 
     const {data} = await modal.onWillDismiss();
 
-    if (data.dismissed) {
+    if (data!=undefined&&data.dismissed) {
       this.order = data.order;
       this.changeView();
     }
   }
+
+  async resultModal() {
+    const modal = await this.modalController.create({
+      component: ResultComponent,
+      cssClass: 'testresult-modal',
+      componentProps: {
+        'testQuestionList': this.testQuestionList
+      }
+    });
+    await modal.present();
+
+    const {data} = await modal.onWillDismiss();
+
+    if (data!=undefined&&data.dismissed) {
+      if (data.action == 1) {
+        this.showErrorQuestion=true;
+        this.curQuestionList = data.testQuestionList.filter(x => x.OBJECTIVE_TYPE == 2 && x.isRight == false);
+      } else {
+        this.close();
+      }
+    }
+  }
 }

+ 49 - 0
parth5/parth5/src/app/views/pages/propagandawork/dzzfc/detail/detail.component.html

@@ -0,0 +1,49 @@
+<ion-header class="header-theme2">
+  <ion-toolbar>
+    <ion-label class="title-center">宣传阵地信息详情</ion-label>
+    <ion-buttons slot="start">
+      <ion-back-button icon="ios-back2" mode="md"></ion-back-button>
+    </ion-buttons>
+  </ion-toolbar>
+</ion-header>
+<ion-content>
+  <form class="form-table">
+    <ion-item>
+      <ion-label>主题名称</ion-label>
+      <ion-text>{{dataModel.ztmc}}</ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>所属党组织</ion-label>
+      <ion-text>{{dataModel.dzzmc}}</ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>类别</ion-label>
+      <ion-text>{{dataModel.fctypename}}</ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>时间</ion-label>
+      <ion-text>{{dataModel.sj}}</ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>链接</ion-label>
+      <ion-text>{{dataModel.lj}}</ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>简介</ion-label>
+      <ion-text>{{dataModel.jj}}</ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>内容</ion-label>
+      <ion-text>{{dataModel.nr}}</ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>宣传备注</ion-label>
+      <ion-text>{{dataModel.remark}}</ion-text>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>图片</ion-label>
+    </ion-item>
+    <app-imglist [(imgOption)]="imgOption" [(imgList)]="imgList"></app-imglist>
+  </form>
+</ion-content>
+<app-photo-swipe></app-photo-swipe>

+ 38 - 0
parth5/parth5/src/app/views/pages/propagandawork/dzzfc/detail/detail.component.scss

@@ -0,0 +1,38 @@
+ion-content{
+  z-index: 11;
+}
+
+ion-item {
+  --inner-border-width: 0px 0px 1px 0px;
+  margin-right: 10px;
+}
+
+.detail-open::part(detail-icon){
+  transform: rotate(90deg);
+  transition: transform 0.2s ease-out;
+}
+
+.detail-close::part(detail-icon){
+  transform: rotate(0deg);
+  transition: transform 0.2s ease-out;
+}
+
+ion-item{
+  img{
+    margin-right: 10px;
+    border-radius: 8px;
+    width: 80px;
+    height: 50px;
+  }
+  .item-img{
+    object-fit: cover;
+  }
+}
+
+.item-detail{
+  margin: 0px !important;
+}
+
+.border-none{
+  --inner-border-width: 0px !important;
+}

+ 107 - 0
parth5/parth5/src/app/views/pages/propagandawork/dzzfc/detail/detail.component.ts

@@ -0,0 +1,107 @@
+import {Component, OnInit, ViewChild} from '@angular/core';
+import {DatePipe} from "@angular/common";
+import {ActivatedRoute, Router} from "@angular/router";
+import {AlertController, LoadingController, ModalController} from "@ionic/angular";
+import {PhotoSwipeComponent} from "../../../../../comm/modal/photo-swipe/photo-swipe.component";
+import {ConfigService, RequsetData} from "../../../../../service/config.service";
+import {UserService} from "../../../../../service/user.service";
+import {PositionApi} from "../../../../../api/propagandawork/position";
+import {AlertModal} from "../../../../../comm/modal/alert";
+import {PanelApi} from "../../../../../api/propagandawork/position/panel";
+import {DzzfcApi} from "../../../../../api/propagandawork/dzzfc";
+import {DictionaryApi} from "../../../../../api/system/dictionary";
+import * as moment from "moment";
+
+@Component({
+  selector: 'app-detail',
+  templateUrl: './detail.component.html',
+  styleUrls: ['./detail.component.scss'],
+})
+export class DzzfcDetailComponent implements OnInit {
+
+  @ViewChild(PhotoSwipeComponent)
+  photoSwipe: PhotoSwipeComponent;
+
+  dataModel: any = {};
+  detailOpen: boolean = false;
+  webServerHost: string = '';
+  imgOption: any = {
+    fileRefid: '',
+    fileName: '',
+    fileType: 4,
+    isMulti: true,
+    readonly: true
+  };
+  imgList = [];
+
+  constructor(private datePipe: DatePipe, private router: Router, private routeInfo: ActivatedRoute, private configService: ConfigService, private userService: UserService, public alertController: AlertController,
+              public modalController: ModalController, public loadingController: LoadingController
+    , private dzzfcApi: DzzfcApi, private alertModal: AlertModal, private dictionaryApi: DictionaryApi) {
+
+  }
+
+  ngOnInit() {
+    this.routeInfo.queryParams.subscribe(params => {
+      this.dataModel.id = params['id'];
+      this.imgOption.fileRefid = params['id'];
+      this.getData();
+    });
+
+    this.configService.GetConfig().subscribe((config) => {
+      this.webServerHost = config.webServerHost;
+    });
+  }
+
+  getData() {
+    this.dzzfcApi.getData(this.dataModel.id).subscribe((data: RequsetData) => {
+      if (data.success) {
+        this.dataModel = data.item;
+        this.imgOption.fileRefid = this.dataModel.id;
+      }
+    });
+  }
+
+  showBigImage(id) {
+    try {
+      var items = [];
+      let url = this.webServerHost + "/appApi/home/showImg/" + id;
+      let img = this.getImageWidth(url) || {width: 500, height: 300};
+      items.push({
+        src: url,
+        w: img.width || 500,
+        h: img.height || 300
+      })
+
+      this.photoSwipe.open(items, {
+        index: 0,
+        tapToClose: true
+      }, "pswp" + (Math.random() * 100000).toFixed(0).toString());
+    } catch (e) {
+      this.alertModal.alert("图片查看异常:" + e);
+    }
+  }
+
+  getImageWidth(url) {
+    let obj = {width: 0, height: 0}
+    try {
+      var img = new Image();
+      img.src = url;
+      // 如果图片被缓存,则直接返回缓存数据
+      if (img.complete) {
+        obj.width = img.width;
+        obj.height = img.height;
+        return obj
+      } else {
+        img.onload = function () {
+          obj.width = img.width;
+          obj.height = img.height;
+          return obj
+        }
+      }
+    } catch (e) {
+      this.alertModal.alert("图片高宽获取异常:" + e);
+      return obj;
+    }
+  }
+
+}

+ 71 - 0
parth5/parth5/src/app/views/pages/propagandawork/dzzfc/edit/edit.component.html

@@ -0,0 +1,71 @@
+<ion-header class="header-theme2">
+  <ion-toolbar>
+    <ion-label class="title-center">{{title}}党组织生活</ion-label>
+    <ion-buttons slot="start">
+      <ion-back-button icon="ios-back2" defaultHref="/tapp/tabs/tabMain/propagandawork/dzzfc" text="" mode="md"></ion-back-button>
+    </ion-buttons>
+  </ion-toolbar>
+</ion-header>
+<ion-content>
+  <form #dataForm="ngForm" class="form-table">
+    <ion-item detail mode="md">
+      <ion-label>所属党组织<span class="danger">*</span></ion-label>
+      <app-partyselect [(dzzdm)]="dataModel.dzzdm" [(dzzmc)]="dataModel.dzzmc"></app-partyselect>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>主题名称<span class="danger">*</span></ion-label>
+      <ion-input #ztmc="ngModel" name="ztmc" id="ztmc" [(ngModel)]="dataModel.ztmc"
+                 placeholder="请输入主题名称" required></ion-input>
+    </ion-item>
+    <ion-item detail mode="md">
+      <ion-label>类别<span class="danger">*</span></ion-label>
+      <ion-select #fcType="ngModel" name="fcType"
+                  id="fcType"
+                  [(ngModel)]="dataModel.fcType" okText="确定" cancelText="取消" placeholder="请选择"
+                  interface="action-sheet" required>
+        <ion-select-option *ngFor="let item of fcTypeList"
+                           [value]="item.dickey">{{item.dicvalue}}</ion-select-option>
+      </ion-select>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>时间<span class="danger">*</span></ion-label>
+      <ion-datetime #sj="ngModel" displayFormat="YYYY-MM-DD" pickerFormat="YYYY MM DD"
+                    name="sj" id="sj"
+                    cancelText="取消" doneText="选择" placeholder="请选择时间"
+                    [(ngModel)]="dataModel.sj"
+                    required></ion-datetime>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>链接</ion-label>
+      <ion-input #lj="ngModel" name="lj" id="lj" [(ngModel)]="dataModel.lj"
+                 placeholder="请输链接"></ion-input>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>简介</ion-label>
+      <ion-textarea readonly="false" placeholder="请填写简介" name="jj"
+                    [(ngModel)]="dataModel.jj"></ion-textarea>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>内容</ion-label>
+      <ion-textarea readonly="false" placeholder="请填写内容" name="nr"
+                    [(ngModel)]="dataModel.nr"></ion-textarea>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>备注</ion-label>
+      <ion-textarea readonly="false" placeholder="请填写备注" name="remark"
+                    [(ngModel)]="dataModel.remark"></ion-textarea>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>上传图片</ion-label>
+    </ion-item>
+    <app-imglist [(imgOption)]="imgOption" [(imgList)]="imgList"></app-imglist>
+    <div class="footer-btn">
+      <ion-button slot="end" color="danger" mode="ios"
+                  (click)="save()" [disabled]="!dataForm.form.valid">
+        提交
+      </ion-button>
+    </div>
+  </form>
+</ion-content>
+<app-photo-swipe></app-photo-swipe>
+

+ 31 - 0
parth5/parth5/src/app/views/pages/propagandawork/dzzfc/edit/edit.component.scss

@@ -0,0 +1,31 @@
+ion-content{
+  z-index: 11;
+}
+
+ion-select::part(icon) {
+  display: none;
+}
+
+app-partyselect{
+  width: 75%;
+}
+
+.detail-open::part(detail-icon){
+  transform: rotate(90deg);
+  transition: transform 0.2s ease-out;
+}
+
+.detail-close::part(detail-icon){
+  transform: rotate(0deg);
+  transition: transform 0.2s ease-out;
+}
+
+.item-img{
+  width: 80px;
+  height: 50px;
+  padding-right: 10px;
+}
+
+.item-detail{
+  margin: 0px !important;
+}

+ 138 - 0
parth5/parth5/src/app/views/pages/propagandawork/dzzfc/edit/edit.component.ts

@@ -0,0 +1,138 @@
+import {Component, OnInit, ViewChild} from '@angular/core';
+import {DatePipe} from "@angular/common";
+import {ActivatedRoute, Router} from "@angular/router";
+import {ConfigService, RequsetData} from "../../../../../service/config.service";
+import {UserService} from "../../../../../service/user.service";
+import {AlertController, LoadingController, ModalController} from "@ionic/angular";
+import * as moment from 'moment';
+import {PhotoSwipeComponent} from "../../../../../comm/modal/photo-swipe/photo-swipe.component";
+import {DzzfcApi} from "../../../../../api/propagandawork/dzzfc";
+import {AlertModal} from "../../../../../comm/modal/alert";
+import {DictionaryApi} from "../../../../../api/system/dictionary";
+
+@Component({
+  selector: 'app-edit',
+  templateUrl: './edit.component.html',
+  styleUrls: ['./edit.component.scss'],
+})
+export class DzzfcEditComponent implements OnInit {
+
+  @ViewChild(PhotoSwipeComponent)
+  photoSwipe: PhotoSwipeComponent;
+
+  op: number = 0;
+  title: string = "新增";
+  dataModel: any = {};
+  fcTypeList: any = [];
+  detailOpen: boolean = false;
+  webServerHost: string = '';
+  imgOption: any = {
+    fileRefid: '',
+    fileName: '',
+    fileType: 4,
+    isMulti: true,
+    readonly: false
+  };
+  imgList = [];
+
+  constructor(private datePipe: DatePipe, private router: Router, private routeInfo: ActivatedRoute, private configService: ConfigService, private userService: UserService, public alertController: AlertController,
+              public modalController: ModalController, public loadingController: LoadingController
+    , private dzzfcApi: DzzfcApi, private alertModal: AlertModal, private dictionaryApi: DictionaryApi) {
+
+  }
+
+  ngOnInit() {
+    this.routeInfo.queryParams.subscribe(params => {
+      this.dataModel.id = params['id'];
+      this.imgOption.fileRefid = params['id'];
+      this.op = parseInt(params['op']);
+      this.title = this.op == 0 ? "新增" : "编辑";
+      this.getDictionList();
+      this.getData();
+    });
+
+    this.configService.GetConfig().subscribe((config) => {
+      this.webServerHost = config.webServerHost;
+    });
+  }
+
+  getData() {
+    this.dzzfcApi.getData(this.dataModel.id).subscribe((data: RequsetData) => {
+      if (data.success) {
+        this.dataModel = data.item;
+        this.imgOption.fileRefid = this.dataModel.id;
+      }
+    });
+  }
+
+  getDictionList() {
+    this.dictionaryApi.getDictionaryList('fcType').subscribe((data: RequsetData) => {
+      if (data.success) {
+        this.fcTypeList = data.item;
+      }
+    });
+  }
+
+  save() {
+    this.alertModal.loading("提交中...").then((loading) => {
+      this.dataModel.sj = moment(this.dataModel.sj).format("YYYY-MM-DD");
+      this.dzzfcApi.save(this.dataModel).subscribe((data: RequsetData) => {
+        loading.dismiss();
+        if (data.success) {
+          this.back();
+        }
+        this.alertModal.alert(data.msg);
+      }, () => {
+        loading.dismiss();
+      });
+    });
+  }
+
+  back() {
+    this.router.navigate(['../../dzzfc'], {relativeTo: this.routeInfo, queryParams: {random: Math.random()}});
+  }
+
+  showBigImage(id) {
+    try {
+      var items = [];
+      let url = this.webServerHost + "/appApi/home/showImg/" + id;
+      let img = this.getImageWidth(url) || {width: 500, height: 300};
+      items.push({
+        src: url,
+        w: img.width || 500,
+        h: img.height || 300
+      })
+
+      this.photoSwipe.open(items, {
+        index: 0,
+        tapToClose: true
+      }, "pswp" + (Math.random() * 100000).toFixed(0).toString());
+    } catch (e) {
+      this.alertModal.alert("图片查看异常:" + e);
+    }
+  }
+
+  getImageWidth(url) {
+    let obj = {width: 0, height: 0}
+    try {
+      var img = new Image();
+      img.src = url;
+      // 如果图片被缓存,则直接返回缓存数据
+      if (img.complete) {
+        obj.width = img.width;
+        obj.height = img.height;
+        return obj
+      } else {
+        img.onload = function () {
+          obj.width = img.width;
+          obj.height = img.height;
+          return obj
+        }
+      }
+    } catch (e) {
+      this.alertModal.alert("图片高宽获取异常:" + e);
+      return obj;
+    }
+  }
+
+}

+ 53 - 0
parth5/parth5/src/app/views/pages/propagandawork/dzzfc/list.component.html

@@ -0,0 +1,53 @@
+<ion-header>
+  <ion-toolbar>
+    <ion-label>党组织风采</ion-label>
+    <ion-buttons slot="start">
+<!--      <ion-back-button icon="ios-back" mode="md"></ion-back-button>-->
+      <ion-back-button icon="ios-back2" defaultHref="/tapp/tabs/tabMain" text="" mode="md"></ion-back-button>
+    </ion-buttons>
+    <ion-searchbar slot="end" mode="ios" enterkeyhint="search" placeholder="搜索主题名称" showCancelButton="never"
+                   (ionChange)="searchChange($event)"></ion-searchbar>
+  </ion-toolbar>
+  <app-partysearch [(dzzdm)]="searchParams.dzzdm" (dzzdmChange)="reload()"></app-partysearch>
+  <ion-item class="item-filter">
+    <div slot="end" (click)="search()">
+      <span>条件筛选</span>
+      <ion-icon name="dj-search"></ion-icon>
+    </div>
+  </ion-item>
+</ion-header>
+<ion-content>
+  <ion-list>
+    <ion-item-sliding *ngFor="let item of dataList">
+      <ion-item detail  [routerLink]="['./edit']" [queryParams]="{id: item.id,op:1}">
+        <div class="item-img">
+          <app-bimage [(fileid)]="item.id"></app-bimage>
+        </div>
+        <ion-label>
+          <h2>{{item.ztmc}}<span class="dues-month">{{item.sj}}</span></h2>
+          <p>{{item.dzzmc}}</p>
+        </ion-label>
+      </ion-item>
+
+      <ion-item-options side="end">
+        <ion-item-option (click)="delete(item.id)">删除</ion-item-option>
+      </ion-item-options>
+    </ion-item-sliding>
+  </ion-list>
+  <ion-infinite-scroll threshold="100px" (ionInfinite)="scroll($event)">
+    <ion-infinite-scroll-content
+      loadingSpinner="bubbles"
+      loadingText="{{total>searchParams.pageindex*searchParams.pagesize?'正在加载...':'暂无更多'}}">
+    </ion-infinite-scroll-content>
+  </ion-infinite-scroll>
+  <ion-fab vertical="bottom" horizontal="center" slot="fixed" class="fab-add">
+    <ion-fab-button>
+      <ion-text class="btn-add" (click)="add()">
+        <img src="../../../../../assets/icon/btnadd.png" style="width: 30px;height:30px;">
+        <span class="btn-add-text">新增</span>
+      </ion-text>
+    </ion-fab-button>
+  </ion-fab>
+</ion-content>
+
+

+ 42 - 0
parth5/parth5/src/app/views/pages/propagandawork/dzzfc/list.component.scss

@@ -0,0 +1,42 @@
+ion-label {
+  margin: 3px !important;
+  padding: 0px;
+  white-space: normal !important;
+}
+.dues-month{
+  color: #998989;
+  font-size: 12px;
+  border-radius: 4px;
+  background-color: #F3F3F3;
+  padding: 0px 4px;
+  margin-left: 20px;
+}
+
+.dues-money{
+  color: #DE4F3F;
+}
+
+ion-select {
+  color: #5E4545;
+
+  --placeholder-color: #5E4545;
+
+  --placeholder-opacity: 1;
+}
+ion-select::part(icon) {
+  color: #5E4545;
+  opacity: 1;
+}
+ion-header {
+  ion-item {
+    --inner-border-width:  0px;
+    --border-width:0px;
+  }
+}
+
+.item-img{
+  width: 80px;
+  height: 50px;
+  padding-right: 10px;
+}
+

+ 146 - 0
parth5/parth5/src/app/views/pages/propagandawork/dzzfc/list.component.ts

@@ -0,0 +1,146 @@
+import {Component, OnInit, ViewChild} from '@angular/core';
+import {AlertController, IonInfiniteScroll, LoadingController, ModalController, NavController} from "@ionic/angular";
+import {ActivatedRoute, Router} from "@angular/router";
+import {ConfigService, RequsetData} from "../../../../service/config.service";
+import {UserService} from "../../../../service/user.service";
+import {SearchComponent} from "../../../../comm/modal/search/search.component";
+import {DzzfcApi, reqParams} from "../../../../api/propagandawork/dzzfc";
+import {AlertModal} from "../../../../comm/modal/alert";
+
+@Component({
+  selector: 'app-dzzfc-list',
+  templateUrl: './list.component.html',
+  styleUrls: ['./list.component.scss'],
+})
+export class DzzfcListComponent implements OnInit {
+
+  @ViewChild(IonInfiniteScroll, {static: true}) infiniteScroll: IonInfiniteScroll;
+
+  webServerHost: string = '';
+  userInfo: any = {};
+  dataList: any[] = [];
+  searchParams: reqParams = {
+    pageindex: 1,
+    pagesize: 15,
+    dzzdm: '',
+    ztmc: '',
+    fcType: null
+  };
+  total: number = 15;
+  fieldList: any[] = [{label: '主题名称', name: 'ztmc', type: 'text', value: '', placeholder: '输入主题名称'},
+    {
+      label: '类别',
+      name: 'fcType',
+      type: 'select',
+      value: '',
+      dicParams: {
+        getUrl: 'getDictionaryList',
+        dicTypeKey: 'fcType',
+        textField: 'dicvalue',
+        valueField: 'dickey',
+        ismulti: false
+      }
+    }
+  ];
+
+  constructor(private router: Router, private routeInfo: ActivatedRoute, private configService: ConfigService, private userService: UserService, public modalController: ModalController, private navCtrl: NavController
+    , private dzzfcApi: DzzfcApi, private alertModal: AlertModal) {
+  }
+
+  ngOnInit() {
+    this.userInfo = this.userService.GetUser();
+    this.routeInfo.queryParams.subscribe(params => {
+      this.searchParams.dzzdm = this.searchParams.dzzdm || this.userService.GetUser().dataDzzdm;
+      this.reload();
+    });
+    this.configService.GetConfig().subscribe((config) => {
+      this.webServerHost = config.webServerHost;
+    });
+  }
+
+  getList() {
+    this.dzzfcApi.getList(this.searchParams).subscribe((data: RequsetData) => {
+      if (data.success) {
+        this.dataList = this.dataList.concat(data.item.list);
+        this.total = data.item.total;
+      }
+    });
+  }
+
+  reload() {
+    this.dataList = [];
+    this.searchParams.pageindex = 1;
+    this.total = 15;
+    this.getList();
+  }
+
+  scroll(event) {
+    setTimeout(() => {
+      event.target.complete();
+      if (this.total > this.searchParams.pageindex * this.searchParams.pagesize) {
+        this.searchParams.pageindex += 1;
+        this.getList();
+      }
+    }, 500);
+  }
+
+  yearChange(e) {
+    this.reload();
+  }
+
+  searchChange(event) {
+    this.fieldList[0].value = event.detail.value;
+    this.searchParams.ztmc = event.detail.value;
+    this.reload();
+  }
+
+  async search() {
+    const modal = await this.modalController.create({
+      component: SearchComponent,
+      componentProps: {
+        'fieldList': this.fieldList
+      },
+      cssClass: 'search-modal'
+    });
+
+    await modal.present();
+
+    const {data} = await modal.onWillDismiss();
+    if (data && data.success) {
+      this.searchParams.ztmc = data.params.ztmc;
+      this.searchParams.fcType = data.params.fcType;
+      this.reload();
+    }
+  }
+
+  detail(item) {
+    this.router.navigate(['./detail'], {
+      relativeTo: this.routeInfo,
+      queryParams: {random: Math.random(),id: item.id}
+    });
+  }
+
+  add() {
+    this.router.navigate(['./edit'], {
+      relativeTo: this.routeInfo,
+      queryParams: {random: Math.random(), op: 0}
+    });
+  }
+
+  delete(id) {
+    this.alertModal.confirm("确认删除?", () => {
+      this.alertModal.loading("正在删除").then((loading) => {
+        this.dzzfcApi.delete(id).subscribe((fdata: RequsetData) => {
+          loading.dismiss();
+          if (fdata.success) {
+            this.reload();
+          }
+          this.alertModal.alert(fdata.msg);
+        }, () => {
+          loading.dismiss();
+        });
+      });
+    });
+  }
+
+}

+ 2 - 0
parth5/parth5/src/app/views/tapp/tab-main/tab-main.route.ts

@@ -5,6 +5,7 @@ import partyUserRoutes from "../../../routes/partyUser";
 import shykRoutes from "../../../routes/shyk";
 import partyDuesRoutes from "../../../routes/partyDues";
 import positionRoutes from "../../../routes/propagandawork/position";
+import dzzfcRoutes from "../../../routes/propagandawork/dzzfc";
 import examRoutes from "../../../routes/exam";
 
 export const routes: Routes = [
@@ -17,5 +18,6 @@ export const routes: Routes = [
   ...shykRoutes,
   ...partyDuesRoutes,
   ...positionRoutes,
+  ...dzzfcRoutes,
   ...examRoutes
 ];

+ 9 - 1
parth5/parth5/src/app/views/tapp/tabs/tabs.module.ts

@@ -58,8 +58,12 @@ import {routes as MainRoutes} from "../tab-main/tab-main.route";
 import {routes as StudyRoutes} from "../tab-study/tab-study.route";
 import {routes as UserRoutes} from "../tab-user/tab-user.route";
 import {CardComponent} from "../../pages/examtest/show/card/card.component";
+import {ResultComponent} from "../../pages/examtest/show/result/result.component";
 
 import { ExamtestComponent} from "../../pages/examtest/examtest.component";
+import {DzzfcListComponent} from "../../pages/propagandawork/dzzfc/list.component";
+import {DzzfcEditComponent} from "../../pages/propagandawork/dzzfc/edit/edit.component";
+import {DzzfcDetailComponent} from "../../pages/propagandawork/dzzfc/detail/detail.component";
 import {ShowComponent as ExamtestShowComponent} from "../../pages/examtest/show/show.component";
 
 const pageComponents = [
@@ -90,7 +94,11 @@ const pageComponents = [
   PartyUserRewardComponent,
   ExamtestComponent,
   ExamtestShowComponent,
-  CardComponent
+  CardComponent,
+  ResultComponent,
+  DzzfcListComponent,
+  DzzfcEditComponent,
+  DzzfcDetailComponent
 ];
 
 const pubComponents = [

+ 103 - 0
src/main/java/com/ghsc/partybuild/controller/app/AppDzzfcController.java

@@ -0,0 +1,103 @@
+package com.ghsc.partybuild.controller.app;
+
+import com.ghsc.partybuild.controller.jsonmodel.RequsetData;
+import com.ghsc.partybuild.service.UserService;
+import com.ghsc.partybuild.service.impl.PubDzzfcService;
+import com.ghsc.partybuild.util.DateUtils;
+import com.ghsc.partybuild.vo.publicity.PubDzzfcVo;
+import com.github.pagehelper.PageInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+@Slf4j
+@RestController
+@RequestMapping(value = "/appApi/publicity/dzzfc")
+public class AppDzzfcController {
+    @Autowired
+    private PubDzzfcService pubDzzfcService;
+    @Autowired
+    private UserService userService;
+    @Autowired
+    private DateUtils dateUtils;
+
+    @ResponseBody
+    @GetMapping("/getList")
+    public RequsetData<PageInfo<PubDzzfcVo>> getList(int pageindex, int pagesize, @RequestParam(required = false) String dzzdm,
+                                                     @RequestParam(required = false) String ztmc, @RequestParam(required = false) String fcType) {
+
+        RequsetData<PageInfo<PubDzzfcVo>> result = new RequsetData<>();
+        result.setItem(pubDzzfcService.getList(pageindex, pagesize, null, dzzdm, ztmc, fcType));
+        return result;
+    }
+
+    @ResponseBody
+    @GetMapping("/get")
+    public RequsetData<PubDzzfcVo> get(@RequestParam(required = false) String id) {
+        RequsetData<PubDzzfcVo> res = new RequsetData<>();
+
+        PubDzzfcVo model = pubDzzfcService.getPubDzzfcById(id);
+        if (model == null) {
+            model = new PubDzzfcVo();
+            model.setId(UUID.randomUUID().toString());
+        }
+
+        res.setItem(model);
+        return res;
+    }
+
+    @ResponseBody
+    @PostMapping("/save")
+    public RequsetData<String> save(@RequestBody PubDzzfcVo data) {
+        RequsetData<String> result = new RequsetData<String>();
+        int count = 0;
+        String message = "";
+
+        try {
+            count = pubDzzfcService.save(data, userService.getLoginUser().getUserid());
+        } catch (Exception e) {
+            e.printStackTrace();
+            message = e.toString();
+        }
+
+        if (count > 0) {
+            result.setSuccess(true);
+            result.setMsg("保存成功!");
+        } else {
+            result.setSuccess(false);
+            result.setMsg("保存失败!" + message);
+        }
+        return result;
+    }
+
+    @ResponseBody
+    @GetMapping("/delete")
+    public RequsetData<Integer> delete(@RequestParam String id) {
+        RequsetData<Integer> result = new RequsetData<>();
+        int count = 0;
+        String message = "";
+
+        try {
+            List<String> idList = new ArrayList<>();
+            idList.add(id);
+            count = pubDzzfcService.delete(idList);
+        } catch (Exception e) {
+            e.printStackTrace();
+            message = e.toString();
+        }
+
+        if (count > 0) {
+            result.setItem(count);
+            result.setSuccess(true);
+            result.setMsg("删除成功!");
+        } else {
+            result.setSuccess(false);
+            result.setMsg("删除失败!" + message);
+        }
+        return result;
+    }
+}

+ 2 - 2
src/main/java/com/ghsc/partybuild/controller/app/AppFileController.java

@@ -119,8 +119,8 @@ public class AppFileController {
     }
 
     @GetMapping("getImageBase64")
-    public RequsetData<ImageBase64Vo> getImageBase64(@RequestParam("fileId") String fileId) throws IOException {
-        return RespGenerstor.success(fileService.getImageBase64(fileId));
+    public RequsetData<ImageBase64Vo> getImageBase64(@RequestParam("id") String id, @RequestParam("type") String type) throws IOException {
+        return RespGenerstor.success(fileService.getImageBase64(id, type));
     }
 
     @PostMapping("uploadBase64")

+ 0 - 2
src/main/java/com/ghsc/partybuild/mapper/PartyCQuery.java

@@ -93,10 +93,8 @@ public interface PartyCQuery {
     /**
      * 党组织树
      * @param parentCode
-     * @param isshowxz
      * @param dzzdm
      * @param onlyshow_dw
-     * @param zzfbType
      * @param showdxz
      * @return
      */

+ 17 - 2
src/main/java/com/ghsc/partybuild/service/FileService.java

@@ -13,6 +13,7 @@ import org.apache.commons.net.ftp.FTPClient;
 
 import com.github.pagehelper.PageInfo;
 import com.ghsc.partybuild.model.CfFile;
+import org.bouncycastle.jcajce.provider.drbg.DRBG;
 
 /**
  *
@@ -52,13 +53,21 @@ public interface FileService {
     String SaveFile(String file, String fileName, String fileRefID, String uid, Integer fileType);
 
     /**
-     * down
+     * down 根据fileId查询
      * @param fileId
      * @param os
      * @return
      */
     CfFile downFtpFile(String fileId, OutputStream os);
 
+    /**
+     * down 根据fileRefID查询 创建时间升序返回第一条数据
+     * @param fileRefID
+     * @param os
+     * @return
+     */
+    CfFile downFtpFile2(String fileRefID, OutputStream os);
+
     /**
      * 查询cf_file表附件
      * @param fileRefID
@@ -97,7 +106,13 @@ public interface FileService {
 
     String getFileBase64(String fileId) throws IOException;
 
-    ImageBase64Vo getImageBase64(String fileId) throws IOException;
+    /**
+     * 返回图片信息
+     * @param id
+     * @param type 1:fileId;2fileRefId
+     * @return
+     * */
+    ImageBase64Vo getImageBase64(String id, String type) throws IOException;
 
     Integer uploadBase64(List<UploadFileBase64Vo> fileList, String userId) throws IOException;
 

+ 48 - 4
src/main/java/com/ghsc/partybuild/service/impl/FileServiceImpl.java

@@ -259,8 +259,48 @@ public class FileServiceImpl implements FileService {
     }
 
     @Override
-    public CfFile downFtpFile(String fileId, OutputStream os) {
-        CfFile file = cfFileMapper.selectByPrimaryKey(fileId);
+    public CfFile downFtpFile(String id, OutputStream os) {
+        CfFile file = cfFileMapper.selectByPrimaryKey(id);
+
+        try {
+            FTPClient ftpClient = new FTPClient();
+            ftpHelper.connectToServer(ftpClient);
+            ftpClient.enterLocalPassiveMode();
+            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
+
+            ftpClient.retrieveFile(file.getFileurl(), os);
+            /*
+            FTPFile[] files = ftpClient.listFiles(file.getFileurl());
+
+            if(files.length>0){
+
+                String filePath=GetParentPath(file.getFileurl());
+
+                ftpClient.changeWorkingDirectory(filePath);
+
+
+            }*/
+
+            ftpHelper.closeConnect(ftpClient);
+
+        } catch (Exception ex) {
+            logger.error("downFtpFile,下载文件失败!", ex);
+            file = null;
+        }
+
+        return file;
+    }
+
+    @Override
+    public CfFile downFtpFile2(String id, OutputStream os) {
+        CfFileExample emp = new CfFileExample();
+        emp.or().andFilerefidEqualTo(id);
+        emp.setOrderByClause("createtime");
+        CfFile file = cfFileMapper.selectByExample(emp).stream().findFirst().orElse(null);
+
+        if(file == null){
+            return null;
+        }
 
         try {
             FTPClient ftpClient = new FTPClient();
@@ -451,13 +491,17 @@ public class FileServiceImpl implements FileService {
     }
 
     @Override
-    public ImageBase64Vo getImageBase64(String fileId) throws IOException {
+    public ImageBase64Vo getImageBase64(String id, String type) throws IOException {
         ImageBase64Vo result = new ImageBase64Vo();
 
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
 
         try {
-            this.downFtpFile(fileId, bos);
+            if("1".equals(type)){
+                this.downFtpFile(id, bos);
+            }else {
+                this.downFtpFile2(id, bos);
+            }
 
             byte[] bytes = bos.toByteArray();
 

+ 3 - 3
src/main/java/com/ghsc/partybuild/service/impl/PartyUserServiceImpl.java

@@ -560,12 +560,12 @@ public class PartyUserServiceImpl implements PartyUserService {
 
         PageHelper.startPage(pageNum, pageSize);
 
-        boolean isLead = true;
+        /*boolean isLead = true;
         //包括领导人信息为空就不是相对接口
         if (curUserId != null) {
             isLead = appConfig.leadUids.contains(curUserId);
-        }
-        List<HashMap<String, Object>> list = partyUserCquery.selectPartyUserListForSearch(dzzdm, dzzmc, xm, csrq_begin, csrq_end, rdsj_begin, rdsj_end, zzsj_begin, zzsj_end, jg, dnzw, xzzw, jszw, xl, xb, gwzt, zzmm, mz, pxpy_year, pxpy_level, pxpy_type, sfzyxq, isLead, age_begin, age_end);
+        }*/
+        List<HashMap<String, Object>> list = partyUserCquery.selectPartyUserListForSearch(dzzdm, dzzmc, xm, csrq_begin, csrq_end, rdsj_begin, rdsj_end, zzsj_begin, zzsj_end, jg, dnzw, xzzw, jszw, xl, xb, gwzt, zzmm, mz, pxpy_year, pxpy_level, pxpy_type, sfzyxq, null, age_begin, age_end);
         PageInfo<HashMap<String, Object>> result = new PageInfo(list);
         return result;
 

+ 2 - 1
src/main/resources/application.yml

@@ -118,7 +118,8 @@ appconfig:
   app-fromSys: dangjian
   #模拟登陆密码
   auto-pwd: 123456
-  lead-uids: '2121217762,2121402851'
+  #模拟登陆密码
+  lead-uids: '127687'
   #特殊菜单过滤 a,a|b,b,c
   menu-dwids: '001091209135'
   safe-ext: '.jpg,.png,.gif,.zip,.rar,.7z,.xls,.xlsx,.doc,.docx,.pdf,.ppt,.pptx,.jpeg,.txt,.mp4,.avi'

+ 2 - 2
src/main/resources/mapping/IntegratedQueryCQuery.xml

@@ -11,11 +11,11 @@
         from ZZ_ZZQKXX dep
         inner join ZZ_ZZQKXXFB depinfo on dep.DZZDM=depinfo.DZZDM
         inner join ZZZD_ZZLBDMNEW deptype on depinfo.ZZLB=deptype.BM
-        inner join ZZZD_JCZZFL depcate on depinfo.JCZZFL=depcate.BM
+        inner join ZZZD_JCZZFLNEW depcate on depinfo.JCZZFL=depcate.BM
         left join ZZ_BZJCXX ses on dep.DZZDM=ses.DZZDM and depinfo.LDJTJC=ses.LDJTJC
         where 1=1
         <if test="dzzmc != null and dzzmc != ''">
-            and dep.DZZMC like concat('%',#{dzzdm},'%')
+            and dep.DZZMC like concat('%',#{dzzmc},'%')
         </if>
         <if test="dzzdm != null and dzzdm != ''">
             and dep.DZZDM like concat('%',#{dzzdm},'%')

+ 1 - 1
src/main/resources/mapping/PartyCQuery.xml

@@ -260,7 +260,7 @@
         ) c on p.dzzdm=SUBSTR(c.DZZDM,1,LENGTH(c.DZZDM)-3)
         left join ZZ_DZZFBQK fbType on p.DZZDM = fbType.DZZDM
         where 1=1
-        and p.DZZDM like ''||#{parentCode}||'%'
+        and p.DZZDM like concat('',#{parentCode},'%')
         and length(p.DZZDM)=(length(#{parentCode})+3)
         <if test="dzzdm != null and dzzdm != ''">
             and p.DZZDM = #{dzzdm}

+ 11 - 11
src/main/resources/mapping/PartyUserCQuery.xml

@@ -54,7 +54,7 @@
             and us.ZWJB = #{zwjb}
         </if>
         <if test="sqrdrq_begin != null and sqrdrq_begin != ''">
-            and dj.JRZGZZRQ >= #{sqrdrq_begin}
+            and dj.JRZGZZRQ <![CDATA[ >= ]]> #{sqrdrq_begin}
         </if>
         <if test="sqrdrq_end != null and sqrdrq_end != ''">
             and dj.JRZGZZRQ <![CDATA[ <= ]]> #{sqrdrq_end}
@@ -307,7 +307,7 @@
             and us.zwjb = #{zwjb}
         </if>
         <if test="sqrdrq_begin != null and sqrdrq_begin != ''">
-            and us.sqrdrq >= #{sqrdrq_begin}
+            and us.sqrdrq <![CDATA[ >= ]]> #{sqrdrq_begin}
         </if>
         <if test="sqrdrq_end != null and sqrdrq_end != ''">
             and us.sqrdrq <![CDATA[ <= ]]> #{sqrdrq_end}
@@ -350,7 +350,7 @@
             and us.xm like concat('%',#{xm},'%')
         </if>
         <if test="zlzbrq_begin != null and zlzbrq_begin != ''">
-            and r.zlzbrq >= #{zlzbrq_begin}
+            and r.zlzbrq <![CDATA[ >= ]]> #{zlzbrq_begin}
         </if>
         <if test="zlzbrq_end != null and zlzbrq_end != ''">
             and r.zlzbrq <![CDATA[ <= ]]> #{zlzbrq_end}
@@ -501,7 +501,7 @@
         left join ZZ_DJXX dj on us.RYBM=dj.RYBM
         left join vw_partyduty uszw on us.rybm=uszw.rybm -- 党内职务名称
         left join (
-        select USERID from DJ_JLCFXX j where j.YXKSRQ <![CDATA[ <= ]]> CURDATE() and j.YXJSRQ>=CURDATE() group
+        select USERID from DJ_JLCFXX j where j.YXKSRQ <![CDATA[ <= ]]> CURDATE() and j.YXJSRQ <![CDATA[ >= ]]> CURDATE() group
         by USERID
         ) jlcf on us.RYBM=jlcf.USERID
         where 1=1
@@ -515,7 +515,7 @@
             and us.xm like concat('%',#{xm},'%')
         </if>
         <if test="csrq_begin != null and csrq_begin != ''">
-            and us.csrq >= #{csrq_begin}
+            and us.csrq <![CDATA[ >= ]]> #{csrq_begin}
         </if>
         <if test="csrq_end != null and csrq_end != ''">
             and us.csrq <![CDATA[ <= ]]> #{csrq_end}
@@ -527,13 +527,13 @@
             and usfb.NL <![CDATA[ <= ]]> #{age_end}
         </if>
         <if test="rdsj_begin != null and rdsj_begin != ''">
-            and dj.jrzgzzrq >= #{rdsj_begin}
+            and dj.jrzgzzrq <![CDATA[ >= ]]> #{rdsj_begin}
         </if>
         <if test="rdsj_end != null and rdsj_end != ''">
             and dj.jrzgzzrq <![CDATA[ <= ]]> #{rdsj_end}
         </if>
         <if test="zzsj_begin != null and zzsj_begin != ''">
-            and dj.zzrq >= #{zzsj_begin}
+            and dj.zzrq <![CDATA[ >= ]]> #{zzsj_begin}
         </if>
         <if test="zzsj_end != null and zzsj_end != ''">
             and dj.zzrq <![CDATA[ <= ]]> #{zzsj_end}
@@ -618,9 +618,9 @@
             </if>
             )
         </if>
-        <if test="!islead">
-            and usfb.leadtype != 1
-        </if>
+<!--        <if test="!islead">-->
+<!--            and usfb.leadtype != 1-->
+<!--        </if>-->
         <if test="sfzyxq != null">
             <if test="sfzyxq == 1">
                 and jlcf.USERID is not null
@@ -825,7 +825,7 @@
                           where us.RYZT in ('2', '3') and cast(substr(zd.JRZGZZRQ, 1, 6) as signed) <![CDATA[ <= ]]> #{yearMonth}
                                 and (fb.ISARCHIVE is null
                                          or fb.ISARCHIVE = 0
-                                         or (fb.ISARCHIVE = 1 and cast(substr(DATE_FORMAT(fb.archiveDate, '%Y%m%d'), 1, 6) as signed) >= #{yearMonth}))
+                                         or (fb.ISARCHIVE = 1 and cast(substr(DATE_FORMAT(fb.archiveDate, '%Y%m%d'), 1, 6) as signed) <![CDATA[ >= ]]> #{yearMonth}))
                       ) um
                           left join us_party_month upm on um.userCode=upm.userCode and upm.yearMonth=#{yearMonth}
         where upm.userCode is null

+ 77 - 0
src/main/resources/static/doc/template/党建知识题目模板.txt

@@ -0,0 +1,77 @@
+//模板说明
+//凡是用//开头的行都是注释行,不会作为试题内容导入到题库中
+//每个试题间用空行隔开,作为格式用的符号如":","."是不分差距半角全角的,半角全角都有效
+
+//试题的开头行是题干,前面不能有注释行并列在上面,否则试题都无效
+
+//题干、题型、答案、题目解析是一个试题的必须项
+
+//在题干末尾须要备注提报单位名称
+
+//可用的题型有:单选、多选、判断、填空、简答
+
+//题目的难度有:难、中、易
+
+//填空题的空位处用三个"_",即"___"来表示,另外有多少个填空就有多少个答案,每个答案必须用“;”隔开,否则失效。
+
+//下面是一个最完整的例子,务必参考例子格式进行编写,否则无效。
+
+
+党内法规体系中,最高层次的法规是___?【出题:广州站】
+A.准则
+B.条例
+C.党章
+D.规定
+答案:C
+题型:单选
+题目难度:中
+题目解析:《中国共产党党内法规制定条例》第一章:“党章是最根本的党内法规,是制定其他党内法规的基础和依据。”
+
+党的十八大报告提出的建设“三型”马克思主义执政党是___?【出题:广州站】
+A.学习型、服务型、完善型
+B.学习型、完善型、创新型
+C.学习型、服务型、创新型
+D.学习型、完善型、创新型
+答案:C
+题型:单选
+题目难度:中
+题目解析:党的十八大报告提出,全党要增强紧迫感和责任感,牢牢把握加强党的执政能力建设、先进性和纯洁性建设这条主线,坚持解放思想、改革创新,坚持党要管党、从严治党,全面加强党的思想建设、组织建设、作风建设、反腐倡廉建设、制度建设,增强自我净化、自我完善、自我革新、自我提高能力,建设学习型、服务型、创新型的马克思主义执政党,确保党始终成为中国特色社会主义事业的坚强领导核心。
+
+
+党员违反国家法律法规,违反企事业单位或者其他社会组织规章制度受到其他纪律处分,应当追究党纪责任的,党组织在对有关方面___进行核实后,依照《中国共产党纪律处分条例》规定给予党纪处分或者组织处理。【出题:广州站】
+A.认定的事实
+B.认定的性质
+C.认定的情节
+D.认定的细节
+E.认定的梗概
+答案:A,B,C
+题型:多选
+题目难度:中
+题目解析:《中国共产党纪律处分条例》第四章第三十三条规定:“党员违反国家法律法规,违反企事业单位或者其他社会组织的规章制度受到其他纪律处分,应当追究党纪责任的,党组织在对有关方面认定的事实、性质和情节进行核实后,依照规定给予党纪处分或者组织处理。
+
+预备党员预备期满后,党组织经过考察认为其不履行党员义务,不具备党员条件的,应当取消预备党员资格。【出题:广州站】
+答案:正确
+题型:判断
+题目难度:中
+题目解析:《中国共产党发展党员工作细则》第五章第三十二条规定:“预备党员预备期满,党支部应当及时讨论其能否转为正式党员。认真履行党员义务、具备党员条件的,应当按期转为正式党员;需要继续考察和教育的,可以延长一次预备期,延长时间不能少于半年,最长不超过一年;不履行党员义务、不具备党员条件的,应当取消其预备党员资格。”
+
+
+党章总纲指出:___是我们党执政兴国的第一要务。【出题:广州站】
+答案:发展
+题型:填空
+题目难度:中
+题目解析:《中国共产党章程》总纲指出,发展是我们党执政兴国的第一要务。
+
+对违纪后下落不明的党员,下落不明时间超过___个月的,党组织应当按照党章规定对其予以___。【出题:广州站】
+答案:六;除名
+题型:填空
+题目难度:中
+题目解析:《中国共产党纪律处分条例》第五章第三十五条规定:“对违纪后下落不明的党员,应当区别情况作出处理: (一)对有严重违纪行为,应当给予开除党籍处分的,党组织应当作出决定,开除其党籍;(二)除前项规定的情况外,下落不明时间超过六个月的,党组织应当按照党章规定对其予以除名。”
+
+请写出入党誓词?【出题:广州站】
+答案:我志愿加入中国共产党,拥护党的纲领,遵守党的章程,履行党员义务,执行党的决定,严守党的纪律,保守党的秘密,对党忠诚,积极工作,为共产主义奋斗终身,随时准备为党和人民牺牲一切,永不叛党。
+题型:简答
+题目难度:中
+题目解析:《中国共产党章程》第一章第六条:“预备党员必须面向党旗进行入党宣誓。誓词如下:我志愿加入中国共产党,拥护党的纲领,遵守党的章程,履行党员义务,执行党的决定,严守党的纪律,保守党的秘密,对党忠诚,积极工作,为共产主义奋斗终身,随时准备为党和人民牺牲一切,永不叛党。”
+
+