Jelajahi Sumber

✨ feat(silver-jobs): 完善职位相关实体关系映射

- 为applications添加user和job关联关系
- 为companies添加jobs和companyImages关联关系
- 为company-images添加company关联关系
- 为favorites添加user和job关联关系
- 为jobs添加company、applications、favorites和viewRecords关联关系
- 为views添加user和job关联关系

✨ feat(silver-users): 完善用户知识相关实体关系映射

- 为knowledge-categories添加silverKnowledges关联关系
- 为knowledge-interactions添加user和knowledge关联关系
- 为knowledges添加user、category、silverKnowledgeTagRelations和silverKnowledgeInteractions关联关系
- 为knowledge-tags添加silverKnowledgeTagRelations关联关系
- 为knowledge-tag-relations添加knowledge和tag关联关系

✨ feat(user): 完善用户相关实体关系映射

- 为time-banks添加user关联关系
- 为user-preferences添加user关联关系
- 为silver-user-profile添加user关联关系
- 在user实体中添加全部关联关系定义

✨ feat(api): 添加实体关系查询支持

- 为jobs相关API添加relations配置
- 为companies相关API添加relations配置
- 为knowledge相关API添加relations配置
- 为user-preferences API添加relations配置
yourname 8 bulan lalu
induk
melakukan
4fd6316453
26 mengubah file dengan 199 tambahan dan 19 penghapusan
  1. 1 0
      src/server/api/silver-jobs/applications/index.ts
  2. 1 0
      src/server/api/silver-jobs/companies/index.ts
  3. 1 0
      src/server/api/silver-jobs/company-images/index.ts
  4. 1 0
      src/server/api/silver-jobs/favorites/index.ts
  5. 1 0
      src/server/api/silver-jobs/jobs/index.ts
  6. 1 0
      src/server/api/silver-jobs/views/index.ts
  7. 1 0
      src/server/api/silver-users/knowledge-categories/index.ts
  8. 1 0
      src/server/api/silver-users/knowledge-interactions/index.ts
  9. 1 0
      src/server/api/silver-users/knowledges/index.ts
  10. 1 0
      src/server/api/silver-users/time-banks/index.ts
  11. 1 0
      src/server/api/user-preferences/index.ts
  12. 11 1
      src/server/modules/silver-jobs/application.entity.ts
  13. 6 1
      src/server/modules/silver-jobs/company-image.entity.ts
  14. 8 0
      src/server/modules/silver-jobs/company.entity.ts
  15. 11 1
      src/server/modules/silver-jobs/favorite.entity.ts
  16. 19 1
      src/server/modules/silver-jobs/job.entity.ts
  17. 11 1
      src/server/modules/silver-jobs/view-record.entity.ts
  18. 7 3
      src/server/modules/silver-users/silver-knowledge-category.entity.ts
  19. 11 1
      src/server/modules/silver-users/silver-knowledge-interaction.entity.ts
  20. 11 1
      src/server/modules/silver-users/silver-knowledge-tag-relation.entity.ts
  21. 5 1
      src/server/modules/silver-users/silver-knowledge-tag.entity.ts
  22. 34 1
      src/server/modules/silver-users/silver-knowledge.entity.ts
  23. 6 1
      src/server/modules/silver-users/silver-time-bank.entity.ts
  24. 6 1
      src/server/modules/silver-users/silver-user-profile.entity.ts
  25. 10 5
      src/server/modules/silver-users/user-preference.entity.ts
  26. 32 0
      src/server/modules/users/user.entity.ts

+ 1 - 0
src/server/api/silver-jobs/applications/index.ts

@@ -9,6 +9,7 @@ const applicationRoutes = createCrudRoutes({
   getSchema: ApplicationSchema,
   listSchema: ApplicationSchema,
   searchFields: ['status', 'remark'],
+  relations: ['user', 'job', 'job.company'],
   middleware: [authMiddleware],
   userTracking: {
     createdByField: 'createdBy',

+ 1 - 0
src/server/api/silver-jobs/companies/index.ts

@@ -9,6 +9,7 @@ const companyRoutes = createCrudRoutes({
   getSchema: CompanySchema,
   listSchema: CompanySchema,
   searchFields: ['name', 'shortName', 'industryCategory', 'companyType'],
+  relations: ['jobs', 'companyImages'],
   middleware: [authMiddleware],
   userTracking: {
     createdByField: 'createdBy',

+ 1 - 0
src/server/api/silver-jobs/company-images/index.ts

@@ -9,6 +9,7 @@ const companyImageRoutes = createCrudRoutes({
   getSchema: CompanyImageSchema,
   listSchema: CompanyImageSchema,
   searchFields: ['companyId', 'isPrimary'],
+  relations: ['company'],
   middleware: [authMiddleware],
   userTracking: {
     createdByField: 'createdBy',

+ 1 - 0
src/server/api/silver-jobs/favorites/index.ts

@@ -9,6 +9,7 @@ const favoriteRoutes = createCrudRoutes({
   getSchema: FavoriteSchema,
   listSchema: FavoriteSchema,
   searchFields: ['jobId', 'userId'],
+  relations: ['user', 'job', 'job.company'],
   middleware: [authMiddleware],
   userTracking: {
     createdByField: 'createdBy',

+ 1 - 0
src/server/api/silver-jobs/jobs/index.ts

@@ -9,6 +9,7 @@ const jobRoutes = createCrudRoutes({
   getSchema: JobSchema,
   listSchema: JobSchema,
   searchFields: ['title', 'salary', 'educationRequired', 'experienceRequired', 'workLocation'],
+  relations: ['company', 'applications', 'favorites', 'viewRecords'],
   middleware: [authMiddleware],
   userTracking: {
     createdByField: 'createdBy',

+ 1 - 0
src/server/api/silver-jobs/views/index.ts

@@ -9,6 +9,7 @@ const viewRoutes = createCrudRoutes({
   getSchema: ViewRecordSchema,
   listSchema: ViewRecordSchema,
   searchFields: ['jobId', 'userId'],
+  relations: ['user', 'job', 'job.company'],
   middleware: [authMiddleware],
   userTracking: {
     createdByField: 'createdBy',

+ 1 - 0
src/server/api/silver-users/knowledge-categories/index.ts

@@ -14,6 +14,7 @@ const categoryRoutes = createCrudRoutes({
   getSchema: SilverKnowledgeCategorySchema,
   listSchema: SilverKnowledgeCategorySchema,
   searchFields: ['name', 'description'],
+  relations: ['silverKnowledges'],
   middleware: [authMiddleware],
   userTracking: {
     createdByField: 'createdBy',

+ 1 - 0
src/server/api/silver-users/knowledge-interactions/index.ts

@@ -14,6 +14,7 @@ const interactionRoutes = createCrudRoutes({
   getSchema: SilverKnowledgeInteractionSchema,
   listSchema: SilverKnowledgeInteractionSchema,
   searchFields: ['content'],
+  relations: ['user', 'knowledge'],
   middleware: [authMiddleware],
   userTracking: {
     createdByField: 'userId'

+ 1 - 0
src/server/api/silver-users/knowledges/index.ts

@@ -14,6 +14,7 @@ const knowledgeRoutes = createCrudRoutes({
   getSchema: SilverKnowledgeSchema,
   listSchema: SilverKnowledgeSchema,
   searchFields: ['title', 'content', 'summary', 'keywords'],
+  relations: ['user', 'category', 'silverKnowledgeTagRelations.tag', 'silverKnowledgeInteractions.user'],
   middleware: [authMiddleware],
   userTracking: {
     createdByField: 'createdBy',

+ 1 - 0
src/server/api/silver-users/time-banks/index.ts

@@ -9,6 +9,7 @@ const silverTimeBankRoutes = createCrudRoutes({
   getSchema: SilverTimeBankSchema,
   listSchema: SilverTimeBankSchema,
   searchFields: ['organization', 'position', 'description'],
+  relations: ['user'],
   middleware: [authMiddleware],
   userTracking: {
     createdByField: 'createdBy',

+ 1 - 0
src/server/api/user-preferences/index.ts

@@ -9,6 +9,7 @@ const userPreferenceRoutes = createCrudRoutes({
   updateSchema: UpdateUserPreferenceDto,
   getSchema: UserPreferenceSchema,
   listSchema: UserPreferenceSchema,
+  relations: ['user'],
   middleware: [authMiddleware],
   userTracking: {
     createdByField: 'createdBy',

+ 11 - 1
src/server/modules/silver-jobs/application.entity.ts

@@ -1,4 +1,6 @@
-import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn } from 'typeorm';
+import { UserEntity } from '../users/user.entity';
+import { Job } from './job.entity';
 import { z } from '@hono/zod-openapi';
 
 export enum ApplicationStatus {
@@ -78,9 +80,17 @@ export class Application {
   @Column({ name: 'job_id', type: 'int', unsigned: true })
   jobId!: number;
 
+  @ManyToOne(() => Job, job => job.applications)
+  @JoinColumn({ name: 'job_id' })
+  job!: Job;
+
   @Column({ name: 'user_id', type: 'int', unsigned: true })
   userId!: number;
 
+  @ManyToOne(() => UserEntity, user => user.applications)
+  @JoinColumn({ name: 'user_id' })
+  user!: UserEntity;
+
   @Column({ name: 'status', type: 'tinyint', default: ApplicationStatus.PENDING })
   status!: ApplicationStatus;
 

+ 6 - 1
src/server/modules/silver-jobs/company-image.entity.ts

@@ -1,4 +1,5 @@
-import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm';
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, ManyToOne, JoinColumn } from 'typeorm';
+import { Company } from './company.entity';
 import { z } from '@hono/zod-openapi';
 
 export const CompanyImageSchema = z.object({
@@ -51,6 +52,10 @@ export class CompanyImage {
   @Column({ name: 'company_id', type: 'int', unsigned: true })
   companyId!: number;
 
+  @ManyToOne(() => Company, company => company.companyImages)
+  @JoinColumn({ name: 'company_id' })
+  company!: Company;
+
   @Column({ name: 'image_url', type: 'varchar', length: 500 })
   imageUrl!: string;
 

+ 8 - 0
src/server/modules/silver-jobs/company.entity.ts

@@ -1,4 +1,6 @@
 import { Entity, PrimaryGeneratedColumn, Column, OneToMany, CreateDateColumn, UpdateDateColumn } from 'typeorm';
+import { Job } from './job.entity';
+import { CompanyImage } from './company-image.entity';
 import { z } from '@hono/zod-openapi';
 
 export const CompanySchema = z.object({
@@ -162,4 +164,10 @@ export class Company {
 
   @UpdateDateColumn({ name: 'updated_at' })
   updatedAt!: Date;
+
+  @OneToMany(() => Job, job => job.company)
+  jobs!: Job[];
+
+  @OneToMany(() => CompanyImage, image => image.company)
+  companyImages!: CompanyImage[];
 }

+ 11 - 1
src/server/modules/silver-jobs/favorite.entity.ts

@@ -1,4 +1,6 @@
-import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm';
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, ManyToOne, JoinColumn } from 'typeorm';
+import { UserEntity } from '../users/user.entity';
+import { Job } from './job.entity';
 import { z } from '@hono/zod-openapi';
 
 export const FavoriteSchema = z.object({
@@ -39,9 +41,17 @@ export class Favorite {
   @Column({ name: 'job_id', type: 'int', unsigned: true })
   jobId!: number;
 
+  @ManyToOne(() => Job, job => job.favorites)
+  @JoinColumn({ name: 'job_id' })
+  job!: Job;
+
   @Column({ name: 'user_id', type: 'int', unsigned: true })
   userId!: number;
 
+  @ManyToOne(() => UserEntity, user => user.favorites)
+  @JoinColumn({ name: 'user_id' })
+  user!: UserEntity;
+
   @CreateDateColumn({ name: 'created_at' })
   createdAt!: Date;
 }

+ 19 - 1
src/server/modules/silver-jobs/job.entity.ts

@@ -1,4 +1,9 @@
-import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn, OneToMany } from 'typeorm';
+import { Company } from './company.entity';
+import { UserEntity } from '../users/user.entity';
+import { Application } from './application.entity';
+import { Favorite } from './favorite.entity';
+import { ViewRecord } from './view-record.entity';
 import { z } from '@hono/zod-openapi';
 
 export enum JobStatus {
@@ -145,6 +150,10 @@ export class Job {
   @Column({ name: 'company_id', type: 'int', unsigned: true })
   companyId!: number;
 
+  @ManyToOne(() => Company, company => company.jobs)
+  @JoinColumn({ name: 'company_id' })
+  company!: Company;
+
   @Column({ name: 'title', type: 'varchar', length: 100 })
   title!: string;
 
@@ -192,4 +201,13 @@ export class Job {
 
   @UpdateDateColumn({ name: 'updated_at' })
   updatedAt!: Date;
+
+  @OneToMany(() => Application, application => application.job)
+  applications!: Application[];
+
+  @OneToMany(() => Favorite, favorite => favorite.job)
+  favorites!: Favorite[];
+
+  @OneToMany(() => ViewRecord, viewRecord => viewRecord.job)
+  viewRecords!: ViewRecord[];
 }

+ 11 - 1
src/server/modules/silver-jobs/view-record.entity.ts

@@ -1,4 +1,6 @@
-import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm';
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, ManyToOne, JoinColumn } from 'typeorm';
+import { UserEntity } from '../users/user.entity';
+import { Job } from './job.entity';
 import { z } from '@hono/zod-openapi';
 
 export const ViewRecordSchema = z.object({
@@ -39,9 +41,17 @@ export class ViewRecord {
   @Column({ name: 'job_id', type: 'int', unsigned: true })
   jobId!: number;
 
+  @ManyToOne(() => Job, job => job.viewRecords)
+  @JoinColumn({ name: 'job_id' })
+  job!: Job;
+
   @Column({ name: 'user_id', type: 'int', unsigned: true })
   userId!: number;
 
+  @ManyToOne(() => UserEntity, user => user.viewRecords)
+  @JoinColumn({ name: 'user_id' })
+  user!: UserEntity;
+
   @CreateDateColumn({ name: 'created_at' })
   createdAt!: Date;
 }

+ 7 - 3
src/server/modules/silver-users/silver-knowledge-category.entity.ts

@@ -1,4 +1,5 @@
-import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, OneToMany } from 'typeorm';
+import { SilverKnowledge } from './silver-knowledge.entity';
 import { z } from '@hono/zod-openapi';
 
 @Entity('silver_knowledge_categories')
@@ -27,6 +28,9 @@ export class SilverKnowledgeCategory {
   @Column({ name: 'knowledge_count', type: 'int', unsigned: true, default: 0 })
   knowledgeCount!: number;
 
+  @OneToMany(() => SilverKnowledge, knowledge => knowledge.category)
+  silverKnowledges!: SilverKnowledge[];
+
   @CreateDateColumn({ name: 'created_at' })
   createdAt!: Date;
 
@@ -93,9 +97,9 @@ export const CreateSilverKnowledgeCategoryDto = z.object({
     description: '分类描述',
     example: '包含健康养生相关的知识和经验分享'
   }),
-  parentId: z.number().int().positive().optional().openapi({
+  parentId: z.number().int().positive().optional().nullable().openapi({
     description: '父分类ID',
-    example: null
+    example: undefined
   }),
   sortOrder: z.number().int().optional().openapi({
     description: '排序顺序',

+ 11 - 1
src/server/modules/silver-users/silver-knowledge-interaction.entity.ts

@@ -1,4 +1,6 @@
-import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm';
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, ManyToOne, JoinColumn } from 'typeorm';
+import { UserEntity } from '../users/user.entity';
+import { SilverKnowledge } from './silver-knowledge.entity';
 import { z } from '@hono/zod-openapi';
 
 export enum InteractionType {
@@ -18,9 +20,17 @@ export class SilverKnowledgeInteraction {
   @Column({ name: 'user_id', type: 'int', unsigned: true })
   userId!: number;
 
+  @ManyToOne(() => UserEntity, user => user.silverKnowledgeInteractions)
+  @JoinColumn({ name: 'user_id' })
+  user!: UserEntity;
+
   @Column({ name: 'knowledge_id', type: 'int', unsigned: true })
   knowledgeId!: number;
 
+  @ManyToOne(() => SilverKnowledge, knowledge => knowledge.silverKnowledgeInteractions)
+  @JoinColumn({ name: 'knowledge_id' })
+  knowledge!: SilverKnowledge;
+
   @Column({ name: 'type', type: 'tinyint', unsigned: true })
   type!: InteractionType;
 

+ 11 - 1
src/server/modules/silver-users/silver-knowledge-tag-relation.entity.ts

@@ -1,4 +1,6 @@
-import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm';
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, ManyToOne, JoinColumn } from 'typeorm';
+import { SilverKnowledge } from './silver-knowledge.entity';
+import { SilverKnowledgeTag } from './silver-knowledge-tag.entity';
 import { z } from '@hono/zod-openapi';
 
 @Entity('silver_knowledge_tag_relations')
@@ -9,9 +11,17 @@ export class SilverKnowledgeTagRelation {
   @Column({ name: 'knowledge_id', type: 'int', unsigned: true })
   knowledgeId!: number;
 
+  @ManyToOne(() => SilverKnowledge, knowledge => knowledge.silverKnowledgeTagRelations)
+  @JoinColumn({ name: 'knowledge_id' })
+  knowledge!: SilverKnowledge;
+
   @Column({ name: 'tag_id', type: 'int', unsigned: true })
   tagId!: number;
 
+  @ManyToOne(() => SilverKnowledgeTag, tag => tag.silverKnowledgeTagRelations)
+  @JoinColumn({ name: 'tag_id' })
+  tag!: SilverKnowledgeTag;
+
   @CreateDateColumn({ name: 'created_at' })
   createdAt!: Date;
 }

+ 5 - 1
src/server/modules/silver-users/silver-knowledge-tag.entity.ts

@@ -1,4 +1,5 @@
-import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, OneToMany } from 'typeorm';
+import { SilverKnowledgeTagRelation } from './silver-knowledge-tag-relation.entity';
 import { z } from '@hono/zod-openapi';
 
 @Entity('silver_knowledge_tags')
@@ -26,6 +27,9 @@ export class SilverKnowledgeTag {
 
   @Column({ name: 'created_by', type: 'int', nullable: true })
   createdBy!: number | null;
+
+  @OneToMany(() => SilverKnowledgeTagRelation, tagRelation => tagRelation.tag)
+  silverKnowledgeTagRelations!: SilverKnowledgeTagRelation[];
 }
 
 // Zod Schema定义

+ 34 - 1
src/server/modules/silver-users/silver-knowledge.entity.ts

@@ -1,4 +1,8 @@
-import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn, OneToMany } from 'typeorm';
+import { UserEntity } from '../users/user.entity';
+import { SilverKnowledgeCategory } from './silver-knowledge-category.entity';
+import { SilverKnowledgeInteraction } from './silver-knowledge-interaction.entity';
+import { SilverKnowledgeTagRelation } from './silver-knowledge-tag-relation.entity';
 import { z } from '@hono/zod-openapi';
 
 export enum KnowledgeType {
@@ -27,9 +31,17 @@ export class SilverKnowledge {
   @Column({ name: 'user_id', type: 'int', unsigned: true })
   userId!: number;
 
+  @ManyToOne(() => UserEntity, user => user.silverKnowledges)
+  @JoinColumn({ name: 'user_id' })
+  user!: UserEntity;
+
   @Column({ name: 'category_id', type: 'int', unsigned: true, nullable: true })
   categoryId!: number | null;
 
+  @ManyToOne(() => SilverKnowledgeCategory, category => category.silverKnowledges)
+  @JoinColumn({ name: 'category_id' })
+  category!: SilverKnowledgeCategory | null;
+
   @Column({ name: 'title', type: 'varchar', length: 255 })
   title!: string;
 
@@ -115,6 +127,12 @@ export class SilverKnowledge {
 
   @Column({ name: 'updated_by', type: 'int', nullable: true })
   updatedBy!: number | null;
+
+  @OneToMany(() => SilverKnowledgeInteraction, interaction => interaction.knowledge)
+  silverKnowledgeInteractions!: SilverKnowledgeInteraction[];
+
+  @OneToMany(() => SilverKnowledgeTagRelation, tagRelation => tagRelation.knowledge)
+  silverKnowledgeTagRelations!: SilverKnowledgeTagRelation[];
 }
 
 // Zod Schema定义
@@ -127,10 +145,25 @@ export const SilverKnowledgeSchema = z.object({
     description: '发布用户ID',
     example: 1
   }),
+  user: UserSchema.optional().openapi({
+    description: '发布用户',
+    example: {
+      id: 1,
+      username: 'user123',
+      nickname: '张三'
+    }
+  }),
   categoryId: z.number().int().positive().optional().nullable().openapi({
     description: '分类ID',
     example: 5
   }),
+  category: SilverKnowledgeCategorySchema.optional().nullable().openapi({
+    description: '知识分类',
+    example: {
+      id: 5,
+      name: '健康养生'
+    }
+  }),
   title: z.string().max(255).openapi({
     description: '知识标题',
     example: '老年人健康饮食指南'

+ 6 - 1
src/server/modules/silver-users/silver-time-bank.entity.ts

@@ -1,4 +1,5 @@
-import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn } from 'typeorm';
+import { UserEntity } from '../users/user.entity';
 import { z } from '@hono/zod-openapi';
 
 export enum WorkType {
@@ -17,6 +18,10 @@ export class SilverTimeBank {
   @Column({ name: 'user_id', type: 'int', unsigned: true })
   userId!: number;
 
+  @ManyToOne(() => UserEntity, user => user.silverTimeBanks)
+  @JoinColumn({ name: 'user_id' })
+  user!: UserEntity;
+
   @Column({ name: 'work_type', type: 'tinyint', unsigned: true })
   workType!: WorkType;
 

+ 6 - 1
src/server/modules/silver-users/silver-user-profile.entity.ts

@@ -1,4 +1,5 @@
-import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn } from 'typeorm';
+import { UserEntity } from '../users/user.entity';
 
 export enum Gender {
   MALE = 1,
@@ -27,6 +28,10 @@ export class SilverUserProfile {
   @Column({ name: 'user_id', type: 'int', unsigned: true })
   userId!: number;
 
+  @ManyToOne(() => UserEntity, user => user.silverUserProfile)
+  @JoinColumn({ name: 'user_id' })
+  user!: UserEntity;
+
   // 基本信息
   @Column({ name: 'real_name', type: 'varchar', length: 50 })
   realName!: string;

+ 10 - 5
src/server/modules/silver-users/user-preference.entity.ts

@@ -1,4 +1,5 @@
-import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn } from 'typeorm';
+import { UserEntity } from '../users/user.entity';
 import { z } from '@hono/zod-openapi';
 
 export enum FontSizeType {
@@ -16,10 +17,14 @@ export class UserPreference {
   @Column({ name: 'user_id', type: 'int', unsigned: true, unique: true })
   userId!: number;
 
-  @Column({ 
-    name: 'font_size', 
-    type: 'tinyint', 
-    unsigned: true, 
+  @ManyToOne(() => UserEntity, user => user.userPreference)
+  @JoinColumn({ name: 'user_id' })
+  user!: UserEntity;
+
+  @Column({
+    name: 'font_size',
+    type: 'tinyint',
+    unsigned: true,
     default: FontSizeType.MEDIUM,
     comment: '移动端字体大小 0:小 1:中 2:大 3:超大'
   })

+ 32 - 0
src/server/modules/users/user.entity.ts

@@ -1,5 +1,13 @@
 import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable, CreateDateColumn, UpdateDateColumn, OneToMany } from 'typeorm';
 import { Role, RoleSchema } from './role.entity';
+import { SilverUserProfile } from '../silver-users/silver-user-profile.entity';
+import { UserPreference } from '../silver-users/user-preference.entity';
+import { SilverTimeBank } from '../silver-users/silver-time-bank.entity';
+import { SilverKnowledge } from '../silver-users/silver-knowledge.entity';
+import { SilverKnowledgeInteraction } from '../silver-users/silver-knowledge-interaction.entity';
+import { Application } from '../silver-jobs/application.entity';
+import { Favorite } from '../silver-jobs/favorite.entity';
+import { ViewRecord } from '../silver-jobs/view-record.entity';
 import { z } from '@hono/zod-openapi';
 import { DeleteStatus, DisabledStatus } from '@/share/types';
 
@@ -39,6 +47,30 @@ export class UserEntity {
   @JoinTable()
   roles!: Role[];
 
+  @OneToMany(() => SilverUserProfile, profile => profile.user)
+  silverUserProfile!: SilverUserProfile;
+
+  @OneToMany(() => UserPreference, preference => preference.user)
+  userPreference!: UserPreference;
+
+  @OneToMany(() => SilverTimeBank, timeBank => timeBank.user)
+  silverTimeBanks!: SilverTimeBank[];
+
+  @OneToMany(() => SilverKnowledge, knowledge => knowledge.user)
+  silverKnowledges!: SilverKnowledge[];
+
+  @OneToMany(() => SilverKnowledgeInteraction, interaction => interaction.user)
+  silverKnowledgeInteractions!: SilverKnowledgeInteraction[];
+
+  @OneToMany(() => Application, application => application.user)
+  applications!: Application[];
+
+  @OneToMany(() => Favorite, favorite => favorite.user)
+  favorites!: Favorite[];
+
+  @OneToMany(() => ViewRecord, viewRecord => viewRecord.user)
+  viewRecords!: ViewRecord[];
+
   @CreateDateColumn({ name: 'created_at', type: 'timestamp' })
   createdAt!: Date;