浏览代码

'update:简历pdf文件的读取和上传'

abstract001 1 年之前
父节点
当前提交
49c1814c4a
共有 27 个文件被更改,包括 465 次插入198 次删除
  1. 1 1
      .idea/inspectionProfiles/Project_Default.xml
  2. 4 0
      app-angular/.gitignore
  3. 2 1
      app-angular/angular.json
  4. 12 0
      app-angular/capacitor.config.ts
  5. 3 0
      app-angular/package.json
  6. 14 0
      app-angular/resources/xml/network_security_config.xml
  7. 5 2
      app-angular/src/modules/comps/comps.module.ts
  8. 20 0
      app-angular/src/modules/comps/resume-modal/resume-modal.component.html
  9. 58 0
      app-angular/src/modules/comps/resume-modal/resume-modal.component.scss
  10. 21 0
      app-angular/src/modules/comps/resume-modal/resume-modal.component.spec.ts
  11. 11 0
      app-angular/src/modules/comps/resume-modal/resume-modal.component.ts
  12. 2 0
      app-angular/src/modules/dark-light/theme.service.ts
  13. 5 4
      app-angular/src/modules/home/home-routing.module.ts
  14. 0 1
      app-angular/src/modules/home/home.module.ts
  15. 24 23
      app-angular/src/modules/home/mock-interviews/mock-interviews.component.html
  16. 14 5
      app-angular/src/modules/home/mock-interviews/mock-interviews.component.scss
  17. 1 0
      app-angular/src/modules/home/mock-interviews/mock-interviews.component.ts
  18. 1 1
      app-angular/src/modules/home/myresume/myresume.component.html
  19. 3 3
      app-angular/src/modules/home/myresume/myresume.component.ts
  20. 15 4
      app-angular/src/modules/home/resume-build/resume-build.component.html
  21. 10 7
      app-angular/src/modules/home/resume-build/resume-build.component.scss
  22. 5 28
      app-angular/src/modules/home/resume-build/resume-build.component.ts
  23. 1 0
      app-angular/src/styles.scss
  24. 12 0
      app-angular/src/theme/grobal.scss
  25. 0 11
      app-angular/src/theme/variables.css
  26. 53 13
      app-node/interview-parse/PDFToText.js
  27. 168 94
      app-node/parse-js-sdk/showcase.js

+ 1 - 1
.idea/inspectionProfiles/Project_Default.xml

@@ -3,7 +3,7 @@
     <option name="myName" value="Project Default" />
     <inspection_tool class="DuplicatedCode" enabled="true" level="WEAK WARNING" enabled_by_default="true">
       <Languages>
-        <language minSize="63" name="TypeScript" />
+        <language minSize="90" name="TypeScript" />
       </Languages>
     </inspection_tool>
   </profile>

+ 4 - 0
app-angular/.gitignore

@@ -40,3 +40,7 @@ testem.log
 # System files
 .DS_Store
 Thumbs.db
+
+
+/www
+/android

+ 2 - 1
app-angular/angular.json

@@ -17,7 +17,8 @@
         "build": {
           "builder": "@angular-devkit/build-angular:browser",
           "options": {
-            "outputPath": "dist/eve-project",
+            "outputPath": "www",
+
             "index": "src/index.html",
             "main": "src/main.ts",
             "polyfills": [

+ 12 - 0
app-angular/capacitor.config.ts

@@ -0,0 +1,12 @@
+import { CapacitorConfig } from '@capacitor/cli';
+
+const config: CapacitorConfig = {
+  appId: 'com.example.app',
+  appName: 'eve-project',
+  webDir: 'www',
+  server: {
+    androidScheme: 'https'
+  }
+};
+
+export default config;

+ 3 - 0
app-angular/package.json

@@ -20,6 +20,8 @@
     "@angular/router": "^16.2.0",
     "@ant-design/icons-angular": "^16.0.0",
     "@babylonjs/core": "^6.27.1",
+    "@capacitor/android": "^5.5.1",
+    "@capacitor/core": "^5.5.1",
     "@ionic/angular": "^7.4.1",
     "@types/parse": "^3.0.5",
     "bootstrap": "^5.2.3",
@@ -44,6 +46,7 @@
     "@angular-devkit/build-angular": "^16.2.3",
     "@angular/cli": "~16.2.3",
     "@angular/compiler-cli": "^16.2.0",
+    "@capacitor/cli": "^5.5.1",
     "@ionic/angular-toolkit": "latest",
     "@types/amap-js-api": "^1.4.14",
     "@types/jasmine": "~4.3.0",

+ 14 - 0
app-angular/resources/xml/network_security_config.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<network-security-config>
+  <domain-config cleartextTrafficPermitted="true">
+    <domain includeSubdomains="true">nova-cloud.obs.cn-south-1.myhuaweicloud.com</domain>
+    <domain includeSubdomains="true">localhost</domain>
+    <domain includeSubdomains="true">*.fmode.cn</domain>
+    <domain includeSubdomains="true">fmode.cn</domain>
+    <domain includeSubdomains="true">server.fmode.cn</domain>
+    <domain includeSubdomains="true">upload-z2.qiniup.com</domain>
+    <domain includeSubdomains="true">*.qiniup.com</domain>
+    <domain includeSubdomains="true">webapi.amap.com</domain>
+    <domain includeSubdomains="true">*.amap.com</domain>
+  </domain-config>
+</network-security-config>

+ 5 - 2
app-angular/src/modules/comps/comps.module.ts

@@ -4,14 +4,17 @@ import { CommonModule } from '@angular/common';
 import { CompsRoutingModule } from './comps-routing.module';
 import { CompModalComponent } from './comp-modal/comp-modal.component';
 import {NzModalModule} from "ng-zorro-antd/modal";
+import { ResumeModalComponent } from './resume-modal/resume-modal.component';
 
 
 @NgModule({
   declarations: [
-    CompModalComponent
+    CompModalComponent,
+    ResumeModalComponent
   ],
   exports: [
-    CompModalComponent
+    CompModalComponent,
+    ResumeModalComponent
   ],
   imports: [
     CommonModule,

+ 20 - 0
app-angular/src/modules/comps/resume-modal/resume-modal.component.html

@@ -0,0 +1,20 @@
+<div class="container">
+  <div class="left-section">
+    <div class="profile">
+      <img src="assets/images/suit-company-comp/1.png" alt="Profile Image" class="profile-image">
+    </div>
+    <div class="name" *ngFor="let item of essentialData">{{item.name}}</div>
+    <div class="age" *ngFor="let item of essentialData">{{item.age}}</div>
+    <div class="phone" *ngFor="let item of essentialData">{{item.phone}}</div>
+    <div class="email" *ngFor="let item of essentialData">{{item.email}}</div>
+    <div class="skills">
+      <span *ngFor="let item of essentialData">{{ item.skills }}</span>
+    </div>
+  </div>
+  <div class="right-section">
+    <div class="section" *ngFor="let item of items">
+      <div class="section-title" *ngIf="item.switchValue">{{item.text}}</div>
+      <div class="section-content" *ngIf="item.info&&item.switchValue">{{ item.info }}</div>
+    </div>
+  </div>
+</div>

+ 58 - 0
app-angular/src/modules/comps/resume-modal/resume-modal.component.scss

@@ -0,0 +1,58 @@
+.container {
+  display: flex;
+}
+
+.left-section {
+  flex: 1;
+  padding: 20px;
+  background-color: #f0f0f0;
+  border-radius: 10px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+.profile {
+  width: 100px;
+  height: 100px;
+  border-radius: 50%;
+  background-color: #ccc;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.profile-image {
+  width: 99px;
+  height: 99px;
+  border-radius: 50%;
+  object-fit: cover;
+}
+
+.name {
+  margin-top: 10px;
+  font-weight: bold;
+}
+
+.skills {
+  margin-top: 10px;
+}
+
+.right-section {
+  flex: 2;
+  padding: 20px;
+}
+
+.section {
+  margin-bottom: 20px;
+}
+
+.section-title {
+  font-weight: bold;
+}
+
+.section-content {
+  margin-top: 10px;
+  border-top: 1px solid #ccc;
+  padding-top: 10px;
+}

+ 21 - 0
app-angular/src/modules/comps/resume-modal/resume-modal.component.spec.ts

@@ -0,0 +1,21 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ResumeModalComponent } from './resume-modal.component';
+
+describe('ResumeModalComponent', () => {
+  let component: ResumeModalComponent;
+  let fixture: ComponentFixture<ResumeModalComponent>;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      declarations: [ResumeModalComponent]
+    });
+    fixture = TestBed.createComponent(ResumeModalComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 11 - 0
app-angular/src/modules/comps/resume-modal/resume-modal.component.ts

@@ -0,0 +1,11 @@
+import {Component, Input} from '@angular/core';
+
+@Component({
+  selector: 'app-resume-modal',
+  templateUrl: './resume-modal.component.html',
+  styleUrls: ['./resume-modal.component.scss']
+})
+export class ResumeModalComponent {
+  @Input() items: any;
+  @Input() essentialData: any;
+}

+ 2 - 0
app-angular/src/modules/dark-light/theme.service.ts

@@ -14,9 +14,11 @@ export class ThemeService {
     const element = document.querySelector('.inner-content');
     const suitCompany = document.querySelector('.container');
     const suitBox = document.querySelectorAll('.ant-card');
+    const recommended = document.querySelector('app-recommended-templates');
 
     element?.classList.toggle('dark-theme', !isDark);
     suitCompany?.classList.toggle('dark-theme', !isDark);
+    recommended?.classList.toggle('recommended', !isDark)
     suitBox.forEach(element => {
       element?.classList.toggle('suit-box', !isDark);
     });

+ 5 - 4
app-angular/src/modules/home/home-routing.module.ts

@@ -43,6 +43,10 @@ const routes: Routes = [
         path: 'minterviews/:tabIndex', component: MockInterviewsComponent,
         canActivate: [AuthGuard],
       },
+      {
+        path: 'resumeBuild/:resumeId', component: ResumeBuildComponent,
+        canActivate: [AuthGuard],
+      },
       {
         path: 'expersquare', component: ExperienceSquareComponent,
         canActivate: [AuthGuard],
@@ -66,10 +70,7 @@ const routes: Routes = [
         path: 'interviewHistory', component: InterviewHistoryComponent,
         canActivate: [AuthGuard],
       },
-      {
-        path: 'resumeBuild/:resumeId', component: ResumeBuildComponent,
-        canActivate: [AuthGuard],
-      },
+
     ]
   }
 ];

+ 0 - 1
app-angular/src/modules/home/home.module.ts

@@ -58,7 +58,6 @@ import {NzSwitchModule} from "ng-zorro-antd/switch";
 import {NzCollapseModule} from "ng-zorro-antd/collapse";
 
 
-
 @NgModule({
   declarations: [
     SuitCompaniesCompComponent,

+ 24 - 23
app-angular/src/modules/home/mock-interviews/mock-interviews.component.html

@@ -20,7 +20,7 @@
 <!--    </ion-item>-->
 <!--  </div>-->
 <!--</div>-->
-<div *ngIf="!isSmallScreen">
+<div *ngIf="!isSmallScreen" class="small-screen">
   <nz-tabset [nzTabPosition]="'left'" [nzSelectedIndex]="selectedIndex" nzValue="small">
     <nz-tab [nzTitle]="'选择页面'">
       <!-- 选择页面的内容 -->
@@ -68,6 +68,7 @@
     </nz-tab>
   </nz-tabset>
 </div>
+
 <!-- 当页面宽度小于720px时显示的HTML代码 -->
 <div *ngIf="isSmallScreen" class="small-cascader">
   <!-- 这里放置小屏幕下的HTML代码 -->
@@ -82,35 +83,35 @@
     [nzExpandTrigger]="'hover'"
   ></nz-cascader>
   <button nz-button nzType="primary" [nzLoading]="isLoadingTwo" (click)="loadTwo()">请选择你的模式</button>
-</div>
-<div *ngIf="isSmallScreen">
-  <div class="chat-container">
-    <div class="chat-window" #chatWindow>
-      <div class="chat-label">聊天记录</div>
-      <div class="chat-messages">
-        <div *ngFor="let message of messagesListUser" class="message"
-             [ngClass]="{'left': getReceived(message.role), 'right': getReceived(message.role)}">
-          <div class="avatar" [ngClass]="{'left': getReceived(message.role), 'right':getReceived(message.role)}">
-            <img [src]="getAvatar(message.role)" alt="Avatar"/>
+
+  <div *ngIf="isSmallScreen">
+    <div class="chat-container">
+      <div class="chat-window" #chatWindow>
+        <div class="chat-label">聊天记录</div>
+        <div class="chat-messages">
+          <div *ngFor="let message of messagesListUser" class="message"
+               [ngClass]="{'left': getReceived(message.role), 'right': getReceived(message.role)}">
+            <div class="avatar" [ngClass]="{'left': getReceived(message.role), 'right':getReceived(message.role)}">
+              <img [src]="getAvatar(message.role)" alt="Avatar"/>
+            </div>
+            <div class="content">{{ message.content }}</div>
           </div>
-          <div class="content">{{ message.content }}</div>
         </div>
       </div>
-    </div>
-    <div class="input-container">
+      <div class="input-container">
         <textarea [nzSize]="'large'" nz-input [(ngModel)]="inputText" placeholder="请输入消息"
                   (keydown)="handleKeyDown($event)"></textarea>
-      <button nz-button nzType="primary" (click)="handleButton()" [disabled]="smalllCreateReport">发送</button>
-      <nz-modal [(nzVisible)]="isVisible" nzTitle="The first Modal" (nzOnCancel)="handleCancel()"
-                (nzOnOk)="handleOk()">
-        <ng-container *nzModalContent>
-          <p>{{errorMessage}}</p>
-        </ng-container>
-      </nz-modal>
+        <button nz-button nzType="primary" (click)="handleButton()" [disabled]="createReport">发送</button>
+        <nz-modal [(nzVisible)]="isVisible" nzTitle="The first Modal" (nzOnCancel)="handleCancel()"
+                  (nzOnOk)="handleOk()">
+          <ng-container *nzModalContent>
+            <p>{{errorMessage}}</p>
+          </ng-container>
+        </nz-modal>
+      </div>
     </div>
   </div>
-</div>
-
 
+</div>
 
 

+ 14 - 5
app-angular/src/modules/home/mock-interviews/mock-interviews.component.scss

@@ -1,11 +1,10 @@
+
 .chat-container {
   display: flex;
   flex-direction: column;
   height: calc(100vh - 120px); /* 使用Viewport单位,减去头部导航栏的高度 */
-
   .chat-window {
     flex-grow: 1;
-    overflow-y: auto;
     border: 1px solid #ccc;
     padding: 10px;
   }
@@ -118,8 +117,18 @@
 }
 
 //小版本联级
-@media screen and (max-width: 400px) {
-  .chat-container {
-    max-height: calc(100vh - 200px);
+@media screen and (max-height: 700px) {
+  .small-cascader {
+    display: flex;
+    flex-direction: column;
+    overflow: auto;
+    max-height: 80vh;
+    width: 100%;
   }
+
+  //.chat-container {
+  //  max-height: 700px;
+  //  overflow: scroll;
+  //}
+
 }

+ 1 - 0
app-angular/src/modules/home/mock-interviews/mock-interviews.component.ts

@@ -685,6 +685,7 @@ export class MockInterviewsComponent implements OnInit {
   isLoadingTwo: boolean = false
 
   loadTwo(): void {
+    this.isLoadingTwo = true;
     setTimeout(() => {
       this.isLoadingTwo = false;
       this.smalllCreateReport = false;

+ 1 - 1
app-angular/src/modules/home/myresume/myresume.component.html

@@ -55,7 +55,7 @@
             <!-- 这里是每个图片的内容 -->
             <nz-checkbox nz-checkbox [(ngModel)]="image.checked" (ngModelChange)="updateSingleChecked()"></nz-checkbox>
             <div class="image-details">
-              <a [routerLink]="['/home/resumeBuild', image.id]">
+              <a [routerLink]="['/home/resumeBuild', image.id]" [queryParams]="{ resumeId: image.id }">
                 <img src="{{ image.url }}" alt="{{ image.title }}"/>
               </a>
               <div>

+ 3 - 3
app-angular/src/modules/home/myresume/myresume.component.ts

@@ -57,17 +57,17 @@ export class MyresumeComponent {
 
   images: any[] = [
     {
-      id: '1',
+      id: 1,
       url: 'assets/images/page-mine/myAvatar.png',
       title: 'Image 1',
       checked: false
     }, {
-      id: '1',
+      id: 2,
       url: 'assets/images/page-mine/myAvatar.png',
       title: 'Image 1',
       checked: false
     }, {
-      id: '1',
+      id: 3,
       url: 'assets/images/page-mine/myAvatar.png',
       title: 'Image 1',
       checked: false

+ 15 - 4
app-angular/src/modules/home/resume-build/resume-build.component.html

@@ -31,12 +31,23 @@
     <div class="info_area">
       <div class="middle">
         <nz-collapse nzAccordion>
-          <nz-collapse-panel *ngFor="let panel of panels" [nzHeader]="panel.name" [nzActive]="panel.active">
-
-          </nz-collapse-panel>
+          <ng-container *ngFor="let panel of items">
+            <nz-collapse-panel *ngIf="panel.switchValue" [nzHeader]="panel.text" (click)="showModal(panel)"
+                               [nzActive]="true">
+            </nz-collapse-panel>
+            <nz-modal [(nzVisible)]="isVisible" nzTitle="重命名" (nzOnCancel)="handleCancel()"
+                      (nzOnOk)="handleOk()" (keydown.enter)="handleOk()">
+              <ng-container *nzModalContent>
+                模块名称: <input nz-input placeholder="Basic usage" [(ngModel)]="modalValue"/>
+              </ng-container>
+            </nz-modal>
+          </ng-container>
         </nz-collapse>
       </div>
-      <div class="right">Right</div>
+
+      <div class="right">
+        <app-resume-modal [essentialData]="essentialData" [items]="items"></app-resume-modal>
+      </div>
     </div>
   </div>
 </div>

+ 10 - 7
app-angular/src/modules/home/resume-build/resume-build.component.scss

@@ -1,13 +1,11 @@
 .container {
   display: flex;
   flex-direction: column;
-  max-height: 1000px;
-  height: 100vh;
-  overflow-y: auto;
+  min-height: 1000px;
+  min-width: 2000px;
   @media (max-width: 400px) {
     overflow-y: scroll;
     height: 100%;
-
   }
 
   header {
@@ -17,7 +15,6 @@
   }
 
   .content {
-    flex: 1;
     display: flex;
     flex-direction: row;
 
@@ -51,7 +48,6 @@
     }
 
     .info_area {
-      max-width: 1500px;
       display: flex;
       flex-direction: row;
       flex: 9;
@@ -59,13 +55,17 @@
 
 
       .right {
-        flex: 1;
+        max-height: 1000px;
+        overflow-y: auto;
+        flex: 2;
         background-color: #999999;
         border-radius: 10px;
         margin-left: 10px;
       }
 
       .middle {
+        max-height: 750px;
+        overflow-y: auto;
         flex: 1;
         background-color: #cccccc;
         border-radius: 10px;
@@ -78,6 +78,9 @@
 }
 
 @media only screen and (max-width: 1300px) {
+  .container {
+    min-width: 100%;
+  }
   .container .content .info_area {
     flex-direction: column;
 

文件差异内容过多而无法显示
+ 5 - 28
app-angular/src/modules/home/resume-build/resume-build.component.ts


+ 1 - 0
app-angular/src/styles.scss

@@ -12,3 +12,4 @@
 /* Importing Datepicker SCSS file. */
 @import "node_modules/ngx-bootstrap/datepicker/bs-datepicker";
 @import "theme/variables.css";
+@import "theme/grobal.scss";

+ 12 - 0
app-angular/src/theme/grobal.scss

@@ -0,0 +1,12 @@
+.dark-theme {
+  background-color: #AEB7C9FF;
+  color: #aeb7c9;
+  /* 其他黑暗模式下的样式规则 */
+}
+
+.suit-box {
+  background-color: #333333;
+  color: whitesmoke;
+  border: #333333;
+}
+

+ 0 - 11
app-angular/src/theme/variables.css

@@ -5,15 +5,4 @@
 /* To quickly generate your own theme, check out the color generator */
 /* http://ionicframework.com/docs/theming/color-generator */
 
-.dark-theme {
-  background-color: #333;
-  color: #fff;
-  /* 其他黑暗模式下的样式规则 */
-}
-
-.suit-box {
-  background-color: #333333;
-  color: whitesmoke;
-  border: #333333;
-}
 

+ 53 - 13
app-node/interview-parse/PDFToText.js

@@ -3,6 +3,7 @@ const multer = require("multer");
 const pdf = require("pdf-parse");
 const fs = require('fs');
 
+
 const app = express();
 app.use(express.json());
 app.use(express.urlencoded({extended: true}));
@@ -27,23 +28,62 @@ const options = {
     return new pdfjsDataRangeTransport();
   }
 };
+
+function extractTextFromPDF(pdfUrl) {
+  return new Promise((resolve, reject) => {
+    // 读取PDF文件
+    const dataBuffer = fs.readFileSync(pdfUrl);
+
+    // 提取文本
+    pdf(dataBuffer).then(data => {
+      const numPages = data.numpages;
+      const extractedText = [];
+
+      // 遍历每一页
+      for (let i = 1; i <= numPages; i++) {
+        const page = data.pages[i - 1];
+
+        // 获取当前页的文本内容
+        let pageText = page.text;
+
+        // 排除页眉和页脚的文本
+        const header = '页眉的文本';
+        const footer = '页脚的文本';
+        const regex = new RegExp(`(${header}|${footer})`, 'g');
+        pageText = pageText.replace(regex, '');
+
+        extractedText.push(pageText);
+      }
+
+      resolve(extractedText.join(' '));
+    }).catch(error => {
+      reject(error);
+    });
+  });
+}
+
 const upload = multer({storage: storage});
 let hasPrinted = false;
 app.post("/upload", upload.single("file"), (req, res) => {
-  try {
-    const filePath = req.file.path;
-    let dataBuffer = fs.readFileSync(filePath);
-    pdf(dataBuffer, options).then(function (data) {
-      if (!hasPrinted) {
-        console.log(data.text);
-        hasPrinted = true
-      }
-    });
-  } catch (error) {
-    res.status(500).json({error: error.message});
-  }
-  hasPrinted = false
+  const filePath = req.file.path;
+  extractTextFromPDF(filePath).then(text => {
+    console.log(text);
+  }).catch(error => {
+    console.error(error);
+  });
 });
+//   let dataBuffer = fs.readFileSync(filePath);
+//   pdf(dataBuffer, options).then(function (data) {
+//     if (!hasPrinted) {
+//       console.log(data.text);
+//       hasPrinted = true
+//     }
+//   });
+// } catch (error) {
+//   res.status(500).json({error: error.message});
+// }
+// hasPrinted = false
+// });
 
 app.listen(3000, () => {
   console.log("Server started on port 3000");

+ 168 - 94
app-node/parse-js-sdk/showcase.js

@@ -14,6 +14,8 @@ async function main() {
   let date = new Date();
   let LjPostType = Parse.Object.extend("LjPostsType")
   let InterviewData = Parse.Object.extend("LjUserInterviewData")
+  let LjUserResumeData = Parse.Object.extend("LjUserResumeData");
+
   // let LjCompany = Parse.Object.extend("LjCompany");
   // let LjInstitution = Parse.Object.extend("LjInstitution")
   //
@@ -28,104 +30,176 @@ async function main() {
   // let Ins4 = new LjInstitution();
   var userPointer = new Parse.User();
   userPointer.id = 'trYOEuj10s';
-
-  let question = [
-    {
-      "type": "技术能力方面",
-      "question": "1. 请问在后端开发中,您最常使用的编程语言是什么,为什么选择这个语言?"
-    },
-    {
-      "type": "技术能力方面",
-      "question": "2. 请列举一些您在后端开发中常用的数据库,并简要说明它们的特点和适用场景。"
-    },
-    {
-      "type": "技术能力方面",
-      "question": "3. 在后端开发中,您如何处理高并发的请求和数据处理?"
-    },
-    {
-      "type": "团队协作方面",
-      "question": "1. 在您过去的工作经验中,您是如何与其他团队成员协作的?请分享一个具体的例子。"
-    },
-    {
-      "type": "团队协作方面",
-      "question": "2. 当您与其他团队成员在技术方案上产生分歧时,您是如何解决这种冲突的?"
-    },
-    {
-      "type": "团队协作方面",
-      "question": "3. 在您的团队中,您如何促进团队成员之间的沟通和合作?"
-    },
-    {
-      "type": "职业规划方面",
-      "question": "1. 请问您对于个人职业发展有什么规划和目标?"
-    },
-    {
-      "type": "职业规划方面",
-      "question": "2. 在您过去的工作中,您是如何不断学习和提升自己的技术能力的?"
-    },
-    {
-      "type": "职业规划方面",
-      "question": "3. 如果您加入我们的团队,您希望在未来的几年内取得怎样的职业成长和发展?"
-    }
-  ];
-  let answer = [
-    "12回答完毕",
-    "12回答完毕",
-    "12回答完毕",
-    "12回答完毕",
-    "12回答完毕",
-    "12回答完毕",
-    "12回答完毕",
-    "12回答完毕"
-  ];
-  let userList = [
-    {
-      "role": "assistant",
-      "content": "哈喽我的您的面试官,请点击发送,我们将准备开始面试"
-    },
-    {
-      "role": "user",
-      "content": "开始面试"
-    },
-    {
-      "role": "assistant",
-      "content": "1. 请问在后端开发中,您最常使用的编程语言是什么,为什么选择这个语言?"
-    },
-    {
-      "role": "user",
-      "content": "哈哈回答完毕"
-    },
-    {
-      "role": "assistant",
-      "content": "2. 请列举一些您在后端开发中常用的数据库,并简要说明它们的特点和适用场景。"
-    }
-  ]
-  let aiList = [
-    {
-      "role": "assistant",
-      "content": "哈喽我的您的面试官,请点击发送,我们将准备开始面试"
-    },
-    {
-      "role": "user",
-      "content": "您需要扮演一名华为公司的技术总监刘,并主持一场,后端开发岗位招聘的第二轮技术面试。\n当前招聘前端开发工程师,需要熟悉HTML,JS,CSS基础,会Angular前端框架的优先,具有nodejs使用经验的优先。\n您是比较负责且严谨的面试官,提问内容是面向高级后端工程师的难度。\n接下来,请您根据面试岗位招聘要求,分别从技术能力、团队协作、职业规划三个方面各想出三个面试问题。\n请严格按照下列格式来生成问题,而且您只需要严格按照下列格式生成问题即可,我之后会给您我的回答,强调一点,你生成的回答不需要任何的修饰,只需要按照下列格式来生成响应的问题即可技术能力方面:1.2.3.团队协作方面:1.2.3.职业规划方面:1.2.3."
-    },
-    {
-      "role": "assistant",
-      "content": "技术能力方面:\n1. 请问在后端开发中,您最常使用的编程语言是什么,为什么选择这个语言?\n2. 请列举一些您在后端开发中常用的数据库,并简要说明它们的特点和适用场景。\n3. 在后端开发中,您如何处理高并发的请求和数据处理?\n\n团队协作方面:\n1. 在您过去的工作经验中,您是如何与其他团队成员协作的?请分享一个具体的例子。\n2. 当您与其他团队成员在技术方案上产生分歧时,您是如何解决这种冲突的?\n3. 在您的团队中,您如何促进团队成员之间的沟通和合作?\n\n职业规划方面:\n1. 请问您对于个人职业发展有什么规划和目标?\n2. 在您过去的工作中,您是如何不断学习和提升自己的技术能力的?\n3. 如果您加入我们的团队,您希望在未来的几年内取得怎样的职业成长和发展?"
-    }
-  ]
   for (let i = 1; i <= 10; i++) {
-    let info = new InterviewData();
+    let info = new LjUserResumeData();
     info.set({
-      "interviewResult": 0,
-      "question": question,
-      "answer": answer,
-      "userList": userList,
-      "aiList": aiList,
-      "user": userPointer,
-      "number": 9,
-    })
+      "name": "罗松磊",
+      "age": "22",
+      "education": "本科:北京大学" +
+         "研究生:南加州",
+      "address": "江西省南昌市",
+      "phone": "1929999999",
+      "email": "131@qq.com",
+      "projectExperience": "01/2014 - 至 今 Windows phone 8 平台《全民都是英雄》 游戏开发 | 项目主要负责人 | C# .Net \n" +
+         " 项目介绍:《全民都是英雄》是集卡牌、战斗与一体的创新即时制游戏。\n" +
+         " 主要职责:前期游戏数据收集整理。设计主要算法。完成游戏的主要编程任务。\n" +
+         "项目所属人:师文轩 联系电话:186 2288 3791\n" +
+         "01/2014 - 02/2014 Windows phone 8 平台《撸阿撸》卡牌类游戏开发 | 客户端开发主要成员 | C# .Net \n" +
+         " 项目介绍:《撸阿撸》是一款卡牌类的多人在线角色扮演类游戏。盈利方式主要为游戏内增\n" +
+         "值服务。在上线一周内,中英文版用户数分别过万。现已实现几十万盈利。\n" +
+         " 主要职责:完成新手引导、奖励和爵位、公告发布、存档等模块的独立编写。\n" +
+         "项目所属人:师文轩 联系电话:186 2288 3791\n" +
+         "10/2013 - 12/2013 英语题库管理系统 | 项目负责人 | java MySQL \n" +
+         " 项目介绍:实现功能:试题备份还原,教师管理,试题导入,试卷按特定要求自动生成,试\n" +
+         "卷 word 导出,试卷标准打印等。项目规模约为一万行代码。 \n" +
+         " 主要职责:针对题库管理系统制定项目计划、需求分析、概要设计、详细设计、测试计划、\n" +
+         "用户手册,完成主要算法、主要交互界面设计和绝大部分代码编写。\n" +
+         "指导老师:韩 智 电子邮箱:hanzhi@nankai.edu.cn\n" +
+         "10/2013 - 12/2013 餐馆订餐系统 | 项目负责人 | java MySQL \n" +
+         "项目介绍:实现功能:餐馆工作人员分层管理,订餐,结算,销售总结等。 \n" +
+         " 主要职责:完成主要算法、主要交互界面设计和全部代码编写。\n" +
+         "指导老师:李兴娟 电子邮箱:lxjuan@nankai.edu.cn\n" +
+         "04/2012 - 04/2013 南开大学百项工程 | 项目组长 | C 语言 MFC \n" +
+         "项目介绍:设计并实现了一个面向用户的基于特征点的破碎纸币拼接系统。允许用户从摄像\n" +
+         "头输入纸币碎片,最后向用户返回纸币的拼接方法。\n" +
+         "主要职责:系统输入程序、部分内部处理及算法实现模块的编写。协调程序完成进度。\n" +
+         "该系统验证和实现的核心算法在期刊类型为 EI 的 ICMIE 上发表了题为 An adaptive \n" +
+         "SIFT-based paper currency fragments identification scheme 的论文。且本项目获得南\n" +
+         "开大学本科生创新科研计划项目南开大学优秀奖及软件学院一等奖。 \n" +
+         "指导老师:李 岳 电子邮箱:liyue80@nakai.edu.cn\n" +
+         "09/2011 - 12/2011 超市销售管理系统 | 项目负责人 | java MySOL \n" +
+         " 项目介绍:主要功能:员工管理,销售管理,销售结算,业绩统计等。\n" +
+         " 主要职责:完成主要算法、主要交互界面设计和全部代码编写。\n" +
+         "指导老师:殷爱茹 电子邮箱:yinar@naikai.edu.cn\n" +
+         "09/2011 - 12/2011 视频 p2p 断点续传播放 | 项目负责人 | java \n" +
+         "项目介绍:主要功能:局域网内好友添加与查找(支持模糊检索)、视频分享、视频断点续\n" +
+         "传,视频播放等。\n" +
+         "主要职责:独立完成代码的编写,可视化的设计及项目展示说明09/2011 - 12/2011 简易多功能计算器 | 项目负责人 | java \n" +
+         "项目介绍:主要功能:简单全输入字符串解析并计算,不同进制间计算及相互转化,计算结\n" +
+         "果汉字化,界面个性化\n" +
+         "主要职责:完成主要算法、主要交互界面设计和全部代码编写。 \n" +
+         "09/2011 - 12/2011 Unix 平台下 MiniShell | 项目负责人 | C 语言 \n" +
+         "项目介绍:主要功能:容错性较强的输入模块,通过系统调用处理相关操作:cp,mv,,rm,cd\n" +
+         "等常用命令及重定向等基本功能。\n" +
+         "主要职责:完成主要算法、主要交互界面设计和全部代码编写。\n" +
+         "10/2011 - 06/2012 RSA 加密与解密编程 | 项目负责人 | java \n" +
+         "项目介绍:完成大数据为基础的 RSA 加密解密。\n" +
+         "主要职责:独立完成代码撰写、可视化设计及项目展示。\n" +
+         "09/2010 –12/2010 小型单机象棋程序 | 项目负责人 | C 语言 和 MFC \n" +
+         "项目介绍:主要功能:人机象棋对战,难度调节等。\n" +
+         "主要职责:独立完成大部分代码的编写。\n" +
+         "其他小型项目: \n" +
+         "09/2010 - 至 今 汇编贪吃蛇游戏,文件断点续传(C 语言版,java 语言版), Unix 下文件系统的部分功能等。",
+      "activities": "12/2013 - 至 今 天津享源科技有限公司实习生 \n" +
+         "主要负责客户端的设计、数据收集处理与代码编写等工作。\n" +
+         "09/2011 - 01/2013 南开大学花郎跆拳道协会 | 会长 \n" +
+         "在任期内将协会由 30 左右发展到 150 人以上的大型社团并发展为“南开大学十佳社团”。\n" +
+         "开创性举办“南开大学第一届体育节”。荣获南开大学十佳社团负责人,两次优秀社团负责\n" +
+         "人,最具潜力会长等荣誉。\n" +
+         "09/2011 - 06/2012 南开大学散打课 | 助教 \n" +
+         "负责每周散打教学和动作演示工作。散打课为南开大学 A 类课程。\n" +
+         "09/2011 - 12/2012 自考生南开大学和天津大学二学位招生南开区代理 | 项目负责人 \n" +
+         "自行组建 8 人团队,主要工作:组建团队,筛选学校,设计宣传方案,在特定学\n" +
+         " 校宣传与招生等。创下所有团队中单月招生人数最多记录。\n" +
+         "02/2011 - 06/2011 南开大学床上用品销售 | 主要负责人 \n" +
+         "自行组建 6 人团队,主要工作:联系卖家订货,在南开大学本部和校区进行宣传销售。 \n" +
+         "其他 全国人口普查志愿者,校内电脑医生志愿者等",
+      "awards": "09/2012 - 06/2013 南开大学本科生创新科研计划项目优秀奖,南开大学软件学院本科生创新科研项目一等奖; \n" +
+         "02/2011 - 06/2012 南开大学十佳社团负责人,最具潜力会长; \n" +
+         "09/2011 - 12/2011 南开大学优秀社团负责人,南开大学运动会乙组铁饼一等奖; \n" +
+         "02/2011 - 06/2011 匡济助学金(5/100),国家二等助学金,南开大学优秀社团负责人; \n" +
+         "09/2010 - 12/2010 张舜尧助新金(2/100)",
+      "skills": "电脑: 熟练 Java,C#,MySQL;熟悉 C,C++,Unix/Linux 等。\n" +
+         "语言: CET-6 (553),听说读写能力良好",
+      "user": userPointer
+    });
     await info.save()
   }
+  // let question = [
+  //   {
+  //     "type": "技术能力方面",
+  //     "question": "1. 请问在后端开发中,您最常使用的编程语言是什么,为什么选择这个语言?"
+  //   },
+  //   {
+  //     "type": "技术能力方面",
+  //     "question": "2. 请列举一些您在后端开发中常用的数据库,并简要说明它们的特点和适用场景。"
+  //   },
+  //   {
+  //     "type": "技术能力方面",
+  //     "question": "3. 在后端开发中,您如何处理高并发的请求和数据处理?"
+  //   },
+  //   {
+  //     "type": "团队协作方面",
+  //     "question": "1. 在您过去的工作经验中,您是如何与其他团队成员协作的?请分享一个具体的例子。"
+  //   },
+  //   {
+  //     "type": "团队协作方面",
+  //     "question": "2. 当您与其他团队成员在技术方案上产生分歧时,您是如何解决这种冲突的?"
+  //   },
+  //   {
+  //     "type": "团队协作方面",
+  //     "question": "3. 在您的团队中,您如何促进团队成员之间的沟通和合作?"
+  //   },
+  //   {
+  //     "type": "职业规划方面",
+  //     "question": "1. 请问您对于个人职业发展有什么规划和目标?"
+  //   },
+  //   {
+  //     "type": "职业规划方面",
+  //     "question": "2. 在您过去的工作中,您是如何不断学习和提升自己的技术能力的?"
+  //   },
+  //   {
+  //     "type": "职业规划方面",
+  //     "question": "3. 如果您加入我们的团队,您希望在未来的几年内取得怎样的职业成长和发展?"
+  //   }
+  // ];
+  // let answer = [
+  //   "12回答完毕",
+  //   "12回答完毕",
+  //   "12回答完毕",
+  //   "12回答完毕",
+  //   "12回答完毕",
+  //   "12回答完毕",
+  //   "12回答完毕",
+  //   "12回答完毕"
+  // ];
+  // let userList = [
+  //   {
+  //     "role": "assistant",
+  //     "content": "哈喽我的您的面试官,请点击发送,我们将准备开始面试"
+  //   },
+  //   {
+  //     "role": "user",
+  //     "content": "开始面试"
+  //   },
+  //   {
+  //     "role": "assistant",
+  //     "content": "1. 请问在后端开发中,您最常使用的编程语言是什么,为什么选择这个语言?"
+  //   },
+  //   {
+  //     "role": "user",
+  //     "content": "哈哈回答完毕"
+  //   },
+  //   {
+  //     "role": "assistant",
+  //     "content": "2. 请列举一些您在后端开发中常用的数据库,并简要说明它们的特点和适用场景。"
+  //   }
+  // ]
+  // let aiList = [
+  //   {
+  //     "role": "assistant",
+  //     "content": "哈喽我的您的面试官,请点击发送,我们将准备开始面试"
+  //   },
+  //   {
+  //     "role": "user",
+  //     "content": "您需要扮演一名华为公司的技术总监刘,并主持一场,后端开发岗位招聘的第二轮技术面试。\n当前招聘前端开发工程师,需要熟悉HTML,JS,CSS基础,会Angular前端框架的优先,具有nodejs使用经验的优先。\n您是比较负责且严谨的面试官,提问内容是面向高级后端工程师的难度。\n接下来,请您根据面试岗位招聘要求,分别从技术能力、团队协作、职业规划三个方面各想出三个面试问题。\n请严格按照下列格式来生成问题,而且您只需要严格按照下列格式生成问题即可,我之后会给您我的回答,强调一点,你生成的回答不需要任何的修饰,只需要按照下列格式来生成响应的问题即可技术能力方面:1.2.3.团队协作方面:1.2.3.职业规划方面:1.2.3."
+  //   },
+  //   {
+  //     "role": "assistant",
+  //     "content": "技术能力方面:\n1. 请问在后端开发中,您最常使用的编程语言是什么,为什么选择这个语言?\n2. 请列举一些您在后端开发中常用的数据库,并简要说明它们的特点和适用场景。\n3. 在后端开发中,您如何处理高并发的请求和数据处理?\n\n团队协作方面:\n1. 在您过去的工作经验中,您是如何与其他团队成员协作的?请分享一个具体的例子。\n2. 当您与其他团队成员在技术方案上产生分歧时,您是如何解决这种冲突的?\n3. 在您的团队中,您如何促进团队成员之间的沟通和合作?\n\n职业规划方面:\n1. 请问您对于个人职业发展有什么规划和目标?\n2. 在您过去的工作中,您是如何不断学习和提升自己的技术能力的?\n3. 如果您加入我们的团队,您希望在未来的几年内取得怎样的职业成长和发展?"
+  //   }
+  // ]
+
   // for (let i = 1; i <= 10; i++) {
   //   let company4 = new LjPostType();
   //   // let s = i.toString().padStart(3, '0')

部分文件因为文件数量过多而无法显示