Bladeren bron

知识库实体

yourname 8 maanden geleden
bovenliggende
commit
36052c4240

+ 8 - 0
src/server/data-source.ts

@@ -16,6 +16,12 @@ import { SilverUserProfile } from "./modules/silver-users/silver-user-profile.en
 import { SilverPoint } from "./modules/silver-users/silver-point.entity"
 import { SilverPoint } from "./modules/silver-users/silver-point.entity"
 import { SilverPointTransaction } from "./modules/silver-users/silver-point-transaction.entity"
 import { SilverPointTransaction } from "./modules/silver-users/silver-point-transaction.entity"
 import { SilverTimeBank } from "./modules/silver-users/silver-time-bank.entity"
 import { SilverTimeBank } from "./modules/silver-users/silver-time-bank.entity"
+import { SilverKnowledge } from "./modules/silver-users/silver-knowledge.entity"
+import { SilverKnowledgeCategory } from "./modules/silver-users/silver-knowledge-category.entity"
+import { SilverKnowledgeTag } from "./modules/silver-users/silver-knowledge-tag.entity"
+import { SilverKnowledgeTagRelation } from "./modules/silver-users/silver-knowledge-tag-relation.entity"
+import { SilverKnowledgeStats } from "./modules/silver-users/silver-knowledge-stats.entity"
+import { SilverKnowledgeInteraction } from "./modules/silver-users/silver-knowledge-interaction.entity"
 
 
 export const AppDataSource = new DataSource({
 export const AppDataSource = new DataSource({
   type: "mysql",
   type: "mysql",
@@ -27,6 +33,8 @@ export const AppDataSource = new DataSource({
   entities: [
   entities: [
     User, Role, File, Company, Job, Application, Favorite, ViewRecord, CompanyImage,
     User, Role, File, Company, Job, Application, Favorite, ViewRecord, CompanyImage,
     SilverUserProfile, SilverPoint, SilverPointTransaction, SilverTimeBank,
     SilverUserProfile, SilverPoint, SilverPointTransaction, SilverTimeBank,
+    SilverKnowledge, SilverKnowledgeCategory, SilverKnowledgeTag,
+    SilverKnowledgeTagRelation, SilverKnowledgeStats, SilverKnowledgeInteraction,
   ],
   ],
   migrations: [],
   migrations: [],
   synchronize: process.env.DB_SYNCHRONIZE !== "false",
   synchronize: process.env.DB_SYNCHRONIZE !== "false",

+ 89 - 0
src/server/migrations/2025072001-create-silver-knowledge-tables.sql

@@ -0,0 +1,89 @@
+-- 银龄智库实体数据库迁移脚本
+-- 创建时间: 2025-07-20
+-- 描述: 创建银龄智库相关的完整表结构
+
+-- 1. 创建知识库分类表
+CREATE TABLE `silver_knowledge_categories` (
+  `id` int unsigned NOT NULL AUTO_INCREMENT,
+  `name` varchar(100) NOT NULL COMMENT '分类名称',
+  `description` text COMMENT '分类描述',
+  `parent_id` int unsigned DEFAULT NULL COMMENT '父分类ID',
+  `sort_order` int NOT NULL DEFAULT 0 COMMENT '排序顺序',
+  `is_active` tinyint NOT NULL DEFAULT 1 COMMENT '是否启用 0:禁用 1:启用',
+  `icon` varchar(100) DEFAULT NULL COMMENT '分类图标',
+  `knowledge_count` int unsigned NOT NULL DEFAULT 0 COMMENT '知识数量',
+  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+  `created_by` int DEFAULT NULL,
+  `updated_by` int DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  KEY `idx_parent_id` (`parent_id`),
+  KEY `idx_active` (`is_active`),
+  KEY `idx_sort_order` (`sort_order`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识库分类表';
+
+-- 2. 创建知识库标签表
+CREATE TABLE `silver_knowledge_tags` (
+  `id` int unsigned NOT NULL AUTO_INCREMENT,
+  `name` varchar(50) NOT NULL COMMENT '标签名称',
+  `color` varchar(7) NOT NULL DEFAULT '#1890ff' COMMENT '标签颜色',
+  `usage_count` int unsigned NOT NULL DEFAULT 0 COMMENT '使用次数',
+  `is_active` tinyint NOT NULL DEFAULT 1 COMMENT '是否启用 0:禁用 1:启用',
+  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+  `created_by` int DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `uk_name` (`name`),
+  KEY `idx_active` (`is_active`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识库标签表';
+
+-- 3. 创建知识-标签关联表
+CREATE TABLE `silver_knowledge_tag_relations` (
+  `id` int unsigned NOT NULL AUTO_INCREMENT,
+  `knowledge_id` int unsigned NOT NULL COMMENT '知识ID',
+  `tag_id` int unsigned NOT NULL COMMENT '标签ID',
+  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `uk_knowledge_tag` (`knowledge_id`, `tag_id`),
+  KEY `idx_tag_id` (`tag_id`),
+  KEY `idx_knowledge_id` (`knowledge_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识-标签关联表';
+
+-- 4. 创建知识库统计表
+CREATE TABLE `silver_knowledge_stats` (
+  `id` int unsigned NOT NULL AUTO_INCREMENT,
+  `user_id` int unsigned NOT NULL COMMENT '用户ID',
+  `total_knowledges` int unsigned NOT NULL DEFAULT 0 COMMENT '总知识数量',
+  `total_shares` int unsigned NOT NULL DEFAULT 0 COMMENT '总分享数量',
+  `total_downloads` int unsigned NOT NULL DEFAULT 0 COMMENT '总下载数量',
+  `total_likes` int unsigned NOT NULL DEFAULT 0 COMMENT '总点赞数量',
+  `total_comments` int unsigned NOT NULL DEFAULT 0 COMMENT '总评论数量',
+  `total_favorites` int unsigned NOT NULL DEFAULT 0 COMMENT '总收藏数量',
+  `total_reads` int unsigned NOT NULL DEFAULT 0 COMMENT '总阅读数量',
+  `weekly_downloads` int unsigned NOT NULL DEFAULT 0 COMMENT '本周下载数量',
+  `weekly_reads` int unsigned NOT NULL DEFAULT 0 COMMENT '本周阅读数量',
+  `weekly_favorites` int unsigned NOT NULL DEFAULT 0 COMMENT '本周收藏数量',
+  `ranking_score` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '排名分数',
+  `download_rank` int unsigned NOT NULL DEFAULT 0 COMMENT '下载排名',
+  `read_rank` int unsigned NOT NULL DEFAULT 0 COMMENT '阅读排名',
+  `favorite_rank` int unsigned NOT NULL DEFAULT 0 COMMENT '收藏排名',
+  `last_calculated` timestamp NULL DEFAULT NULL COMMENT '最后计算时间',
+  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `uk_user_id` (`user_id`),
+  KEY `idx_ranking_score` (`ranking_score`),
+  KEY `idx_download_rank` (`download_rank`),
+  KEY `idx_read_rank` (`read_rank`),
+  KEY `idx_favorite_rank` (`favorite_rank`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识库用户统计表';
+
+-- 5. 更新用户档案表,增加知识库相关字段
+ALTER TABLE `silver_user_profiles` 
+ADD COLUMN `knowledge_share_count` int unsigned NOT NULL DEFAULT 0 COMMENT '知识分享总数' AFTER `knowledge_contributions`,
+ADD COLUMN `knowledge_download_count` int unsigned NOT NULL DEFAULT 0 COMMENT '知识下载总数' AFTER `knowledge_share_count`,
+ADD COLUMN `knowledge_like_count` int unsigned NOT NULL DEFAULT 0 COMMENT '获得点赞总数' AFTER `knowledge_download_count`,
+ADD COLUMN `knowledge_read_count` int unsigned NOT NULL DEFAULT 0 COMMENT '知识阅读总数' AFTER `knowledge_like_count`,
+ADD COLUMN `knowledge_favorite_count` int unsigned NOT NULL DEFAULT 0 COMMENT '收藏知识总数' AFTER `knowledge_read_count`,
+ADD COLUMN `knowledge_comment_count` int unsigned NOT NULL DEFAULT 0 COMMENT '获得评论总数' AFTER `knowledge_favorite_count`,
+ADD COLUMN `knowledge_ranking` int unsigned NOT NULL DEFAULT 0 COMMENT '知识排名' AFTER `knowledge_comment_count`,

+ 110 - 0
src/server/modules/silver-users/silver-knowledge-category.entity.ts

@@ -0,0 +1,110 @@
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
+import { z } from '@hono/zod-openapi';
+
+@Entity('silver_knowledge_categories')
+export class SilverKnowledgeCategory {
+  @PrimaryGeneratedColumn({ unsigned: true })
+  id!: number;
+
+  @Column({ name: 'name', type: 'varchar', length: 100 })
+  name!: string;
+
+  @Column({ name: 'description', type: 'text', nullable: true })
+  description!: string | null;
+
+  @Column({ name: 'parent_id', type: 'int', unsigned: true, nullable: true })
+  parentId!: number | null;
+
+  @Column({ name: 'sort_order', type: 'int', default: 0 })
+  sortOrder!: number;
+
+  @Column({ name: 'is_active', type: 'tinyint', default: 1 })
+  isActive!: number;
+
+  @Column({ name: 'icon', type: 'varchar', length: 100, nullable: true })
+  icon!: string | null;
+
+  @Column({ name: 'knowledge_count', type: 'int', unsigned: true, default: 0 })
+  knowledgeCount!: number;
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt!: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt!: Date;
+
+  @Column({ name: 'created_by', type: 'int', nullable: true })
+  createdBy!: number | null;
+
+  @Column({ name: 'updated_by', type: 'int', nullable: true })
+  updatedBy!: number | null;
+}
+
+// Zod Schema定义
+export const SilverKnowledgeCategorySchema = z.object({
+  id: z.number().int().positive().openapi({
+    description: '分类ID',
+    example: 1
+  }),
+  name: z.string().max(100).openapi({
+    description: '分类名称',
+    example: '健康养生'
+  }),
+  description: z.string().nullable().openapi({
+    description: '分类描述',
+    example: '包含健康养生相关的知识和经验分享'
+  }),
+  parentId: z.number().int().positive().optional().nullable().openapi({
+    description: '父分类ID',
+    example: null
+  }),
+  sortOrder: z.number().int().default(0).openapi({
+    description: '排序顺序',
+    example: 1
+  }),
+  isActive: z.coerce.number().int().min(0).max(1).default(1).openapi({
+    description: '是否启用 0:禁用 1:启用',
+    example: 1
+  }),
+  icon: z.string().max(100).nullable().openapi({
+    description: '分类图标',
+    example: 'health-icon'
+  }),
+  knowledgeCount: z.number().int().min(0).default(0).openapi({
+    description: '知识数量',
+    example: 50
+  }),
+  createdAt: z.date().openapi({
+    description: '创建时间',
+    example: '2024-01-01T00:00:00Z'
+  }),
+  updatedAt: z.date().openapi({
+    description: '更新时间',
+    example: '2024-01-01T00:00:00Z'
+  })
+});
+
+export const CreateSilverKnowledgeCategoryDto = z.object({
+  name: z.string().max(100).openapi({
+    description: '分类名称',
+    example: '健康养生'
+  }),
+  description: z.string().optional().openapi({
+    description: '分类描述',
+    example: '包含健康养生相关的知识和经验分享'
+  }),
+  parentId: z.number().int().positive().optional().openapi({
+    description: '父分类ID',
+    example: null
+  }),
+  sortOrder: z.number().int().optional().openapi({
+    description: '排序顺序',
+    example: 1
+  }),
+  icon: z.string().max(100).optional().openapi({
+    description: '分类图标',
+    example: 'health-icon'
+  })
+});
+
+export const UpdateSilverKnowledgeCategoryDto = CreateSilverKnowledgeCategoryDto.partial();

+ 89 - 0
src/server/modules/silver-users/silver-knowledge-interaction.entity.ts

@@ -0,0 +1,89 @@
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm';
+import { z } from '@hono/zod-openapi';
+
+export enum InteractionType {
+  VIEW = 1,       // 阅读
+  DOWNLOAD = 2,   // 下载
+  LIKE = 3,       // 点赞
+  COMMENT = 4,    // 评论
+  FAVORITE = 5,   // 收藏
+  SHARE = 6       // 分享
+}
+
+@Entity('silver_knowledge_interactions')
+export class SilverKnowledgeInteraction {
+  @PrimaryGeneratedColumn({ unsigned: true })
+  id!: number;
+
+  @Column({ name: 'user_id', type: 'int', unsigned: true })
+  userId!: number;
+
+  @Column({ name: 'knowledge_id', type: 'int', unsigned: true })
+  knowledgeId!: number;
+
+  @Column({ name: 'type', type: 'tinyint', unsigned: true })
+  type!: InteractionType;
+
+  @Column({ name: 'content', type: 'text', nullable: true })
+  content!: string | null; // 评论内容等
+
+  @Column({ name: 'ip_address', type: 'varchar', length: 45, nullable: true })
+  ipAddress!: string | null;
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt!: Date;
+}
+
+// Zod Schema定义
+export const SilverKnowledgeInteractionSchema = z.object({
+  id: z.number().int().positive().openapi({
+    description: '交互ID',
+    example: 1
+  }),
+  userId: z.number().int().positive().openapi({
+    description: '用户ID',
+    example: 1
+  }),
+  knowledgeId: z.number().int().positive().openapi({
+    description: '知识ID',
+    example: 1
+  }),
+  type: z.coerce.number().int().min(1).max(6).openapi({
+    description: '交互类型 1:阅读 2:下载 3:点赞 4:评论 5:收藏 6:分享',
+    example: 1
+  }),
+  content: z.string().optional().nullable().openapi({
+    description: '评论内容',
+    example: '这篇文章很有用,谢谢分享!'
+  }),
+  ipAddress: z.string().max(45).optional().nullable().openapi({
+    description: 'IP地址',
+    example: '192.168.1.100'
+  }),
+  createdAt: z.date().openapi({
+    description: '创建时间',
+    example: '2024-01-01T00:00:00Z'
+  })
+});
+
+export const CreateSilverKnowledgeInteractionDto = z.object({
+  knowledgeId: z.coerce.number().int().positive().openapi({
+    description: '知识ID',
+    example: 1
+  }),
+  type: z.coerce.number().int().min(1).max(6).openapi({
+    description: '交互类型',
+    example: 1
+  }),
+  content: z.string().optional().openapi({
+    description: '评论内容',
+    example: '这篇文章很有用,谢谢分享!'
+  })
+});
+
+export const UpdateSilverKnowledgeInteractionDto = z.object({
+  content: z.string().optional().openapi({
+    description: '评论内容',
+    example: '这篇文章很有用,谢谢分享!'
+  })
+});

+ 199 - 0
src/server/modules/silver-users/silver-knowledge-stats.entity.ts

@@ -0,0 +1,199 @@
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
+import { z } from '@hono/zod-openapi';
+
+@Entity('silver_knowledge_stats')
+export class SilverKnowledgeStats {
+  @PrimaryGeneratedColumn({ unsigned: true })
+  id!: number;
+
+  @Column({ name: 'user_id', type: 'int', unsigned: true })
+  userId!: number;
+
+  // 总体统计
+  @Column({ name: 'total_knowledges', type: 'int', unsigned: true, default: 0 })
+  totalKnowledges!: number;
+
+  @Column({ name: 'total_shares', type: 'int', unsigned: true, default: 0 })
+  totalShares!: number;
+
+  @Column({ name: 'total_downloads', type: 'int', unsigned: true, default: 0 })
+  totalDownloads!: number;
+
+  @Column({ name: 'total_likes', type: 'int', unsigned: true, default: 0 })
+  totalLikes!: number;
+
+  @Column({ name: 'total_comments', type: 'int', unsigned: true, default: 0 })
+  totalComments!: number;
+
+  @Column({ name: 'total_favorites', type: 'int', unsigned: true, default: 0 })
+  totalFavorites!: number;
+
+  @Column({ name: 'total_reads', type: 'int', unsigned: true, default: 0 })
+  totalReads!: number;
+
+  // 周期统计
+  @Column({ name: 'weekly_downloads', type: 'int', unsigned: true, default: 0 })
+  weeklyDownloads!: number;
+
+  @Column({ name: 'weekly_reads', type: 'int', unsigned: true, default: 0 })
+  weeklyReads!: number;
+
+  @Column({ name: 'weekly_favorites', type: 'int', unsigned: true, default: 0 })
+  weeklyFavorites!: number;
+
+  // 排名相关
+  @Column({ name: 'ranking_score', type: 'decimal', precision: 10, scale: 2, default: 0 })
+  rankingScore!: number;
+
+  @Column({ name: 'download_rank', type: 'int', unsigned: true, default: 0 })
+  downloadRank!: number;
+
+  @Column({ name: 'read_rank', type: 'int', unsigned: true, default: 0 })
+  readRank!: number;
+
+  @Column({ name: 'favorite_rank', type: 'int', unsigned: true, default: 0 })
+  favoriteRank!: number;
+
+  @Column({ name: 'last_calculated', type: 'timestamp', nullable: true })
+  lastCalculated!: Date | null;
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt!: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt!: Date;
+}
+
+// Zod Schema定义
+export const SilverKnowledgeStatsSchema = z.object({
+  id: z.number().int().positive().openapi({
+    description: '统计ID',
+    example: 1
+  }),
+  userId: z.number().int().positive().openapi({
+    description: '用户ID',
+    example: 1
+  }),
+  totalKnowledges: z.number().int().min(0).default(0).openapi({
+    description: '总知识数量',
+    example: 25
+  }),
+  totalShares: z.number().int().min(0).default(0).openapi({
+    description: '总分享数量',
+    example: 150
+  }),
+  totalDownloads: z.number().int().min(0).default(0).openapi({
+    description: '总下载数量',
+    example: 1200
+  }),
+  totalLikes: z.number().int().min(0).default(0).openapi({
+    description: '总点赞数量',
+    example: 850
+  }),
+  totalComments: z.number().int().min(0).default(0).openapi({
+    description: '总评论数量',
+    example: 320
+  }),
+  totalFavorites: z.number().int().min(0).default(0).openapi({
+    description: '总收藏数量',
+    example: 650
+  }),
+  totalReads: z.number().int().min(0).default(0).openapi({
+    description: '总阅读数量',
+    example: 5000
+  }),
+  weeklyDownloads: z.number().int().min(0).default(0).openapi({
+    description: '本周下载数量',
+    example: 45
+  }),
+  weeklyReads: z.number().int().min(0).default(0).openapi({
+    description: '本周阅读数量',
+    example: 200
+  }),
+  weeklyFavorites: z.number().int().min(0).default(0).openapi({
+    description: '本周收藏数量',
+    example: 30
+  }),
+  rankingScore: z.coerce.number().min(0).default(0).openapi({
+    description: '排名分数',
+    example: 85.5
+  }),
+  downloadRank: z.number().int().min(0).default(0).openapi({
+    description: '下载排名',
+    example: 15
+  }),
+  readRank: z.number().int().min(0).default(0).openapi({
+    description: '阅读排名',
+    example: 8
+  }),
+  favoriteRank: z.number().int().min(0).default(0).openapi({
+    description: '收藏排名',
+    example: 12
+  }),
+  lastCalculated: z.date().nullable().openapi({
+    description: '最后计算时间',
+    example: '2024-01-01T00:00:00Z'
+  }),
+  createdAt: z.date().openapi({
+    description: '创建时间',
+    example: '2024-01-01T00:00:00Z'
+  }),
+  updatedAt: z.date().openapi({
+    description: '更新时间',
+    example: '2024-01-01T00:00:00Z'
+  })
+});
+
+export const CreateSilverKnowledgeStatsDto = z.object({
+  userId: z.coerce.number().int().positive().openapi({
+    description: '用户ID',
+    example: 1
+  })
+});
+
+export const UpdateSilverKnowledgeStatsDto = z.object({
+  totalKnowledges: z.number().int().min(0).optional().openapi({
+    description: '总知识数量',
+    example: 25
+  }),
+  totalShares: z.number().int().min(0).optional().openapi({
+    description: '总分享数量',
+    example: 150
+  }),
+  totalDownloads: z.number().int().min(0).optional().openapi({
+    description: '总下载数量',
+    example: 1200
+  }),
+  totalLikes: z.number().int().min(0).optional().openapi({
+    description: '总点赞数量',
+    example: 850
+  }),
+  totalComments: z.number().int().min(0).optional().openapi({
+    description: '总评论数量',
+    example: 320
+  }),
+  totalFavorites: z.number().int().min(0).optional().openapi({
+    description: '总收藏数量',
+    example: 650
+  }),
+  totalReads: z.number().int().min(0).optional().openapi({
+    description: '总阅读数量',
+    example: 5000
+  }),
+  rankingScore: z.coerce.number().min(0).optional().openapi({
+    description: '排名分数',
+    example: 85.5
+  }),
+  downloadRank: z.number().int().min(0).optional().openapi({
+    description: '下载排名',
+    example: 15
+  }),
+  readRank: z.number().int().min(0).optional().openapi({
+    description: '阅读排名',
+    example: 8
+  }),
+  favoriteRank: z.number().int().min(0).optional().openapi({
+    description: '收藏排名',
+    example: 12
+  })
+});

+ 48 - 0
src/server/modules/silver-users/silver-knowledge-tag-relation.entity.ts

@@ -0,0 +1,48 @@
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm';
+import { z } from '@hono/zod-openapi';
+
+@Entity('silver_knowledge_tag_relations')
+export class SilverKnowledgeTagRelation {
+  @PrimaryGeneratedColumn({ unsigned: true })
+  id!: number;
+
+  @Column({ name: 'knowledge_id', type: 'int', unsigned: true })
+  knowledgeId!: number;
+
+  @Column({ name: 'tag_id', type: 'int', unsigned: true })
+  tagId!: number;
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt!: Date;
+}
+
+// Zod Schema定义
+export const SilverKnowledgeTagRelationSchema = z.object({
+  id: z.number().int().positive().openapi({
+    description: '关联ID',
+    example: 1
+  }),
+  knowledgeId: z.number().int().positive().openapi({
+    description: '知识ID',
+    example: 1
+  }),
+  tagId: z.number().int().positive().openapi({
+    description: '标签ID',
+    example: 1
+  }),
+  createdAt: z.date().openapi({
+    description: '创建时间',
+    example: '2024-01-01T00:00:00Z'
+  })
+});
+
+export const CreateSilverKnowledgeTagRelationDto = z.object({
+  knowledgeId: z.coerce.number().int().positive().openapi({
+    description: '知识ID',
+    example: 1
+  }),
+  tagId: z.coerce.number().int().positive().openapi({
+    description: '标签ID',
+    example: 1
+  })
+});

+ 74 - 0
src/server/modules/silver-users/silver-knowledge-tag.entity.ts

@@ -0,0 +1,74 @@
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
+import { z } from '@hono/zod-openapi';
+
+@Entity('silver_knowledge_tags')
+export class SilverKnowledgeTag {
+  @PrimaryGeneratedColumn({ unsigned: true })
+  id!: number;
+
+  @Column({ name: 'name', type: 'varchar', length: 50 })
+  name!: string;
+
+  @Column({ name: 'color', type: 'varchar', length: 7, default: '#1890ff' })
+  color!: string;
+
+  @Column({ name: 'usage_count', type: 'int', unsigned: true, default: 0 })
+  usageCount!: number;
+
+  @Column({ name: 'is_active', type: 'tinyint', default: 1 })
+  isActive!: number;
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt!: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt!: Date;
+
+  @Column({ name: 'created_by', type: 'int', nullable: true })
+  createdBy!: number | null;
+}
+
+// Zod Schema定义
+export const SilverKnowledgeTagSchema = z.object({
+  id: z.number().int().positive().openapi({
+    description: '标签ID',
+    example: 1
+  }),
+  name: z.string().max(50).openapi({
+    description: '标签名称',
+    example: '健康养生'
+  }),
+  color: z.string().max(7).default('#1890ff').openapi({
+    description: '标签颜色',
+    example: '#1890ff'
+  }),
+  usageCount: z.number().int().min(0).default(0).openapi({
+    description: '使用次数',
+    example: 25
+  }),
+  isActive: z.coerce.number().int().min(0).max(1).default(1).openapi({
+    description: '是否启用 0:禁用 1:启用',
+    example: 1
+  }),
+  createdAt: z.date().openapi({
+    description: '创建时间',
+    example: '2024-01-01T00:00:00Z'
+  }),
+  updatedAt: z.date().openapi({
+    description: '更新时间',
+    example: '2024-01-01T00:00:00Z'
+  })
+});
+
+export const CreateSilverKnowledgeTagDto = z.object({
+  name: z.string().max(50).openapi({
+    description: '标签名称',
+    example: '健康养生'
+  }),
+  color: z.string().max(7).optional().openapi({
+    description: '标签颜色',
+    example: '#1890ff'
+  })
+});
+
+export const UpdateSilverKnowledgeTagDto = CreateSilverKnowledgeTagDto.partial();

+ 356 - 0
src/server/modules/silver-users/silver-knowledge.entity.ts

@@ -0,0 +1,356 @@
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
+import { z } from '@hono/zod-openapi';
+
+export enum KnowledgeType {
+  ARTICLE = 1,      // 文章
+  VIDEO = 2,        // 视频
+  DOCUMENT = 3,     // 文档
+  COURSE = 4,       // 课程
+  EXPERIENCE = 5,   // 经验分享
+  CASE = 6,         // 案例分享
+  RESEARCH = 7      // 研究报告
+}
+
+export enum KnowledgeStatus {
+  DRAFT = 0,        // 草稿
+  PUBLISHED = 1,    // 已发布
+  HIDDEN = 2,       // 已隐藏
+  DELETED = 3,      // 已删除
+  REVIEWING = 4     // 审核中
+}
+
+@Entity('silver_knowledges')
+export class SilverKnowledge {
+  @PrimaryGeneratedColumn({ unsigned: true })
+  id!: number;
+
+  @Column({ name: 'user_id', type: 'int', unsigned: true })
+  userId!: number;
+
+  @Column({ name: 'category_id', type: 'int', unsigned: true, nullable: true })
+  categoryId!: number | null;
+
+  @Column({ name: 'title', type: 'varchar', length: 255 })
+  title!: string;
+
+  @Column({ name: 'content', type: 'text' })
+  content!: string;
+
+  @Column({ name: 'summary', type: 'text', nullable: true })
+  summary!: string | null;
+
+  @Column({ name: 'type', type: 'tinyint', unsigned: true })
+  type!: KnowledgeType;
+
+  @Column({ name: 'tags', type: 'text', nullable: true })
+  tags!: string | null; // JSON array of tags
+
+  @Column({ name: 'cover_image', type: 'varchar', length: 500, nullable: true })
+  coverImage!: string | null;
+
+  @Column({ name: 'attachments', type: 'text', nullable: true })
+  attachments!: string | null; // JSON array of attachment URLs
+
+  @Column({ name: 'status', type: 'tinyint', default: KnowledgeStatus.DRAFT })
+  status!: KnowledgeStatus;
+
+  // 统计字段 - 单个知识统计
+  @Column({ name: 'view_count', type: 'int', unsigned: true, default: 0 })
+  viewCount!: number;
+
+  @Column({ name: 'download_count', type: 'int', unsigned: true, default: 0 })
+  downloadCount!: number;
+
+  @Column({ name: 'like_count', type: 'int', unsigned: true, default: 0 })
+  likeCount!: number;
+
+  @Column({ name: 'comment_count', type: 'int', unsigned: true, default: 0 })
+  commentCount!: number;
+
+  @Column({ name: 'favorite_count', type: 'int', unsigned: true, default: 0 })
+  favoriteCount!: number;
+
+  @Column({ name: 'share_count', type: 'int', unsigned: true, default: 0 })
+  shareCount!: number;
+
+  @Column({ name: 'read_count', type: 'int', unsigned: true, default: 0 })
+  readCount!: number; // 更准确的阅读统计
+
+  // 推荐和排序
+  @Column({ name: 'is_featured', type: 'tinyint', default: 0 })
+  isFeatured!: number;
+
+  @Column({ name: 'featured_at', type: 'timestamp', nullable: true })
+  featuredAt!: Date | null;
+
+  @Column({ name: 'sort_order', type: 'int', default: 0 })
+  sortOrder!: number;
+
+  // 元数据
+  @Column({ name: 'keywords', type: 'text', nullable: true })
+  keywords!: string | null; // 用于搜索优化的关键词
+
+  @Column({ name: 'source', type: 'varchar', length: 255, nullable: true })
+  source!: string | null; // 知识来源
+
+  @Column({ name: 'author', type: 'varchar', length: 100, nullable: true })
+  author!: string | null; // 原作者
+
+  @Column({ name: 'duration', type: 'int', unsigned: true, nullable: true })
+  duration!: number | null; // 视频时长(秒)或阅读时长(分钟)
+
+  // 时间戳
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt!: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt!: Date;
+
+  @Column({ name: 'published_at', type: 'timestamp', nullable: true })
+  publishedAt!: Date | null;
+
+  // 用户跟踪
+  @Column({ name: 'created_by', type: 'int', nullable: true })
+  createdBy!: number | null;
+
+  @Column({ name: 'updated_by', type: 'int', nullable: true })
+  updatedBy!: number | null;
+}
+
+// Zod Schema定义
+export const SilverKnowledgeSchema = z.object({
+  id: z.number().int().positive().openapi({
+    description: '知识ID',
+    example: 1
+  }),
+  userId: z.number().int().positive().openapi({
+    description: '发布用户ID',
+    example: 1
+  }),
+  categoryId: z.number().int().positive().optional().nullable().openapi({
+    description: '分类ID',
+    example: 5
+  }),
+  title: z.string().max(255).openapi({
+    description: '知识标题',
+    example: '老年人健康饮食指南'
+  }),
+  content: z.string().openapi({
+    description: '知识内容',
+    example: '老年人健康饮食需要注意以下几点...'
+  }),
+  summary: z.string().optional().openapi({
+    description: '知识摘要',
+    example: '本指南详细介绍了老年人健康饮食的科学方法...'
+  }),
+  type: z.coerce.number().int().min(1).max(7).openapi({
+    description: '知识类型 1:文章 2:视频 3:文档 4:课程 5:经验分享 6:案例分享 7:研究报告',
+    example: 1
+  }),
+  tags: z.string().optional().nullable().openapi({
+    description: '标签(JSON数组)',
+    example: '["健康养生", "老年人", "饮食"]'
+  }),
+  coverImage: z.string().max(500).url().optional().nullable().openapi({
+    description: '封面图片URL',
+    example: 'https://example.com/cover.jpg'
+  }),
+  attachments: z.string().optional().nullable().openapi({
+    description: '附件URL(JSON数组)',
+    example: '["https://example.com/attach1.pdf"]'
+  }),
+  status: z.coerce.number().int().min(0).max(4).default(0).openapi({
+    description: '状态 0:草稿 1:已发布 2:已隐藏 3:已删除 4:审核中',
+    example: 1
+  }),
+  viewCount: z.number().int().min(0).default(0).openapi({
+    description: '浏览次数',
+    example: 1234
+  }),
+  downloadCount: z.number().int().min(0).default(0).openapi({
+    description: '下载次数',
+    example: 567
+  }),
+  likeCount: z.number().int().min(0).default(0).openapi({
+    description: '点赞次数',
+    example: 234
+  }),
+  commentCount: z.number().int().min(0).default(0).openapi({
+    description: '评论次数',
+    example: 89
+  }),
+  favoriteCount: z.number().int().min(0).default(0).openapi({
+    description: '收藏次数',
+    example: 156
+  }),
+  shareCount: z.number().int().min(0).default(0).openapi({
+    description: '分享次数',
+    example: 78
+  }),
+  readCount: z.number().int().min(0).default(0).openapi({
+    description: '阅读次数',
+    example: 2345
+  }),
+  isFeatured: z.coerce.number().int().min(0).max(1).default(0).openapi({
+    description: '是否推荐 0:否 1:是',
+    example: 1
+  }),
+  featuredAt: z.date().optional().nullable().openapi({
+    description: '推荐时间',
+    example: '2024-01-01T00:00:00Z'
+  }),
+  sortOrder: z.number().int().default(0).openapi({
+    description: '排序顺序',
+    example: 1
+  }),
+  keywords: z.string().optional().nullable().openapi({
+    description: '搜索关键词',
+    example: '健康,养生,老年人'
+  }),
+  source: z.string().max(255).optional().nullable().openapi({
+    description: '知识来源',
+    example: '中国老年学会'
+  }),
+  author: z.string().max(100).optional().nullable().openapi({
+    description: '原作者',
+    example: '张医生'
+  }),
+  duration: z.number().int().positive().optional().nullable().openapi({
+    description: '时长(秒/分钟)',
+    example: 15
+  }),
+  createdAt: z.date().openapi({
+    description: '创建时间',
+    example: '2024-01-01T00:00:00Z'
+  }),
+  updatedAt: z.date().openapi({
+    description: '更新时间',
+    example: '2024-01-01T00:00:00Z'
+  }),
+  publishedAt: z.date().optional().nullable().openapi({
+    description: '发布时间',
+    example: '2024-01-01T00:00:00Z'
+  })
+});
+
+export const CreateSilverKnowledgeDto = z.object({
+  userId: z.coerce.number().int().positive().openapi({
+    description: '发布用户ID',
+    example: 1
+  }),
+  categoryId: z.number().int().positive().optional().openapi({
+    description: '分类ID',
+    example: 5
+  }),
+  title: z.string().max(255).openapi({
+    description: '知识标题',
+    example: '老年人健康饮食指南'
+  }),
+  content: z.string().openapi({
+    description: '知识内容',
+    example: '老年人健康饮食需要注意以下几点...'
+  }),
+  summary: z.string().optional().openapi({
+    description: '知识摘要',
+    example: '本指南详细介绍了老年人健康饮食的科学方法...'
+  }),
+  type: z.coerce.number().int().min(1).max(7).openapi({
+    description: '知识类型',
+    example: 1
+  }),
+  tags: z.string().optional().openapi({
+    description: '标签(JSON数组)',
+    example: '["健康养生", "老年人", "饮食"]'
+  }),
+  coverImage: z.string().max(500).url().optional().openapi({
+    description: '封面图片URL',
+    example: 'https://example.com/cover.jpg'
+  }),
+  attachments: z.string().optional().openapi({
+    description: '附件URL(JSON数组)',
+    example: '["https://example.com/attach1.pdf"]'
+  }),
+  keywords: z.string().optional().openapi({
+    description: '搜索关键词',
+    example: '健康,养生,老年人'
+  }),
+  source: z.string().max(255).optional().openapi({
+    description: '知识来源',
+    example: '中国老年学会'
+  }),
+  author: z.string().max(100).optional().openapi({
+    description: '原作者',
+    example: '张医生'
+  }),
+  duration: z.number().int().positive().optional().openapi({
+    description: '时长(秒/分钟)',
+    example: 15
+  })
+});
+
+export const UpdateSilverKnowledgeDto = z.object({
+  categoryId: z.number().int().positive().optional().openapi({
+    description: '分类ID',
+    example: 5
+  }),
+  title: z.string().max(255).optional().openapi({
+    description: '知识标题',
+    example: '老年人健康饮食指南'
+  }),
+  content: z.string().optional().openapi({
+    description: '知识内容',
+    example: '老年人健康饮食需要注意以下几点...'
+  }),
+  summary: z.string().optional().openapi({
+    description: '知识摘要',
+    example: '本指南详细介绍了老年人健康饮食的科学方法...'
+  }),
+  type: z.coerce.number().int().min(1).max(7).optional().openapi({
+    description: '知识类型',
+    example: 1
+  }),
+  tags: z.string().optional().openapi({
+    description: '标签(JSON数组)',
+    example: '["健康养生", "老年人", "饮食"]'
+  }),
+  coverImage: z.string().max(500).url().optional().openapi({
+    description: '封面图片URL',
+    example: 'https://example.com/cover.jpg'
+  }),
+  attachments: z.string().optional().openapi({
+    description: '附件URL(JSON数组)',
+    example: '["https://example.com/attach1.pdf"]'
+  }),
+  status: z.coerce.number().int().min(0).max(4).optional().openapi({
+    description: '状态',
+    example: 1
+  }),
+  keywords: z.string().optional().openapi({
+    description: '搜索关键词',
+    example: '健康,养生,老年人'
+  }),
+  source: z.string().max(255).optional().openapi({
+    description: '知识来源',
+    example: '中国老年学会'
+  }),
+  author: z.string().max(100).optional().openapi({
+    description: '原作者',
+    example: '张医生'
+  }),
+  duration: z.number().int().positive().optional().openapi({
+    description: '时长(秒/分钟)',
+    example: 15
+  }),
+  isFeatured: z.coerce.number().int().min(0).max(1).optional().openapi({
+    description: '是否推荐',
+    example: 1
+  }),
+  featuredAt: z.date().optional().nullable().openapi({
+    description: '推荐时间',
+    example: '2024-01-01T00:00:00Z'
+  }),
+  sortOrder: z.number().int().optional().openapi({
+    description: '排序顺序',
+    example: 1
+  })
+});

+ 25 - 0
src/server/modules/silver-users/silver-user-profile.entity.ts

@@ -91,6 +91,31 @@ export class SilverUserProfile {
   @Column({ name: 'knowledge_contributions', type: 'int', unsigned: true, default: 0 })
   @Column({ name: 'knowledge_contributions', type: 'int', unsigned: true, default: 0 })
   knowledgeContributions!: number;
   knowledgeContributions!: number;
 
 
+  // 知识库统计字段
+  @Column({ name: 'knowledge_share_count', type: 'int', unsigned: true, default: 0 })
+  knowledgeShareCount!: number;
+
+  @Column({ name: 'knowledge_download_count', type: 'int', unsigned: true, default: 0 })
+  knowledgeDownloadCount!: number;
+
+  @Column({ name: 'knowledge_like_count', type: 'int', unsigned: true, default: 0 })
+  knowledgeLikeCount!: number;
+
+  @Column({ name: 'knowledge_read_count', type: 'int', unsigned: true, default: 0 })
+  knowledgeReadCount!: number;
+
+  @Column({ name: 'knowledge_favorite_count', type: 'int', unsigned: true, default: 0 })
+  knowledgeFavoriteCount!: number;
+
+  @Column({ name: 'knowledge_comment_count', type: 'int', unsigned: true, default: 0 })
+  knowledgeCommentCount!: number;
+
+  @Column({ name: 'knowledge_ranking', type: 'int', unsigned: true, default: 0 })
+  knowledgeRanking!: number;
+
+  @Column({ name: 'knowledge_ranking_score', type: 'decimal', precision: 10, scale: 2, default: 0 })
+  knowledgeRankingScore!: number;
+
   @CreateDateColumn({ name: 'created_at' })
   @CreateDateColumn({ name: 'created_at' })
   createdAt!: Date;
   createdAt!: Date;
 
 

+ 277 - 0
银龄智库实体完善方案.md

@@ -0,0 +1,277 @@
+# 银龄智库实体完善方案
+
+## 📋 需求对比分析
+
+### 当前缺失功能
+根据需求分析,现有银龄智库实体需要补充以下功能:
+
+| 需求类别 | 当前状态 | 缺失内容 |
+|----------|----------|----------|
+| **总体统计** | ❌ 缺失 | 知识库总数量、分享、下载、点赞、评论、收藏、阅读统计 |
+| **知识分类** | ❌ 缺失 | 知识库分类、关键字标签系统 |
+| **单个知识统计** | ⚠️ 部分 | 缺少分享数量统计 |
+| **人员排名** | ❌ 缺失 | 按下载次数、阅读次数、收藏次数的排名支持 |
+
+## 🔧 实体完善方案
+
+### 1. 知识库分类实体 (SilverKnowledgeCategory)
+
+```typescript
+// 文件: src/server/modules/silver-users/silver-knowledge-category.entity.ts
+@Entity('silver_knowledge_categories')
+export class SilverKnowledgeCategory {
+  @PrimaryGeneratedColumn({ unsigned: true })
+  id!: number;
+
+  @Column({ name: 'name', type: 'varchar', length: 100 })
+  name!: string;
+
+  @Column({ name: 'description', type: 'text', nullable: true })
+  description!: string | null;
+
+  @Column({ name: 'parent_id', type: 'int', unsigned: true, nullable: true })
+  parentId!: number | null;
+
+  @Column({ name: 'sort_order', type: 'int', default: 0 })
+  sortOrder!: number;
+
+  @Column({ name: 'is_active', type: 'tinyint', default: 1 })
+  isActive!: number;
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt!: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt!: Date;
+}
+```
+
+### 2. 知识库标签实体 (SilverKnowledgeTag)
+
+```typescript
+// 文件: src/server/modules/silver-users/silver-knowledge-tag.entity.ts
+@Entity('silver_knowledge_tags')
+export class SilverKnowledgeTag {
+  @PrimaryGeneratedColumn({ unsigned: true })
+  id!: number;
+
+  @Column({ name: 'name', type: 'varchar', length: 50 })
+  name!: string;
+
+  @Column({ name: 'color', type: 'varchar', length: 7, default: '#1890ff' })
+  color!: string;
+
+  @Column({ name: 'usage_count', type: 'int', unsigned: true, default: 0 })
+  usageCount!: number;
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt!: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt!: Date;
+}
+```
+
+### 3. 知识-标签关联实体 (SilverKnowledgeTagRelation)
+
+```typescript
+// 文件: src/server/modules/silver-users/silver-knowledge-tag-relation.entity.ts
+@Entity('silver_knowledge_tag_relations')
+export class SilverKnowledgeTagRelation {
+  @PrimaryGeneratedColumn({ unsigned: true })
+  id!: number;
+
+  @Column({ name: 'knowledge_id', type: 'int', unsigned: true })
+  knowledgeId!: number;
+
+  @Column({ name: 'tag_id', type: 'int', unsigned: true })
+  tagId!: number;
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt!: Date;
+}
+```
+
+### 4. 更新知识库主体实体 (SilverKnowledge)
+
+#### 4.1 新增字段
+```typescript
+// 在现有SilverKnowledge实体中添加以下字段:
+export class SilverKnowledge {
+  // ... 现有字段 ...
+  
+  @Column({ name: 'category_id', type: 'int', unsigned: true, nullable: true })
+  categoryId!: number | null;
+
+  @Column({ name: 'share_count', type: 'int', unsigned: true, default: 0 })
+  shareCount!: number;
+
+  @Column({ name: 'read_count', type: 'int', unsigned: true, default: 0 })
+  readCount!: number; // 更准确的阅读统计
+
+  @Column({ name: 'is_featured', type: 'tinyint', default: 0 })
+  isFeatured!: number;
+
+  @Column({ name: 'featured_at', type: 'timestamp', nullable: true })
+  featuredAt!: Date | null;
+}
+```
+
+### 5. 知识库统计实体 (SilverKnowledgeStats)
+
+```typescript
+// 文件: src/server/modules/silver-users/silver-knowledge-stats.entity.ts
+@Entity('silver_knowledge_stats')
+export class SilverKnowledgeStats {
+  @PrimaryGeneratedColumn({ unsigned: true })
+  id!: number;
+
+  @Column({ name: 'user_id', type: 'int', unsigned: true })
+  userId!: number;
+
+  @Column({ name: 'total_knowledges', type: 'int', unsigned: true, default: 0 })
+  totalKnowledges!: number;
+
+  @Column({ name: 'total_shares', type: 'int', unsigned: true, default: 0 })
+  totalShares!: number;
+
+  @Column({ name: 'total_downloads', type: 'int', unsigned: true, default: 0 })
+  totalDownloads!: number;
+
+  @Column({ name: 'total_likes', type: 'int', unsigned: true, default: 0 })
+  totalLikes!: number;
+
+  @Column({ name: 'total_comments', type: 'int', unsigned: true, default: 0 })
+  totalComments!: number;
+
+  @Column({ name: 'total_favorites', type: 'int', unsigned: true, default: 0 })
+  totalFavorites!: number;
+
+  @Column({ name: 'total_reads', type: 'int', unsigned: one, default: 0 })
+  totalReads!: number;
+
+  @Column({ name: 'weekly_downloads', type: 'int', unsigned: true, default: 0 })
+  weeklyDownloads!: number;
+
+  @Column({ name: 'weekly_reads', type: 'int', unsigned: true, default: 0 })
+  weeklyReads!: number;
+
+  @Column({ name: 'weekly_favorites', type: 'int', unsigned: true, default: 0 })
+  weeklyFavorites!: number;
+
+  @Column({ name: 'ranking_score', type: 'decimal', precision: 10, scale: 2, default: 0 })
+  rankingScore!: number;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt!: Date;
+}
+```
+
+### 6. 更新用户档案实体 (SilverUserProfile)
+
+#### 6.1 新增知识库相关统计字段
+```typescript
+// 在现有SilverUserProfile实体中添加:
+export class SilverUserProfile {
+  // ... 现有字段 ...
+
+  @Column({ name: 'knowledge_share_count', type: 'int', unsigned: true, default: 0 })
+  knowledgeShareCount!: number;
+
+  @Column({ name: 'knowledge_download_count', type: 'int', unsigned: true, default: 0 })
+  knowledgeDownloadCount!: number;
+
+  @Column({ name: 'knowledge_like_count', type: 'int', unsigned: true, default: 0 })
+  knowledgeLikeCount!: number;
+
+  @Column({ name: 'knowledge_read_count', type: 'int', unsigned: true, default: 0 })
+  knowledgeReadCount!: number;
+
+  @Column({ name: 'knowledge_ranking', type: 'int', unsigned: true, default: 0 })
+  knowledgeRanking!: number;
+
+  @Column({ name: 'knowledge_ranking_score', type: 'decimal', precision: 10, scale: 2, default: 0 })
+  knowledgeRankingScore!: number;
+}
+```
+
+## 📊 数据库索引优化
+
+为提升查询性能,需要添加以下索引:
+
+```sql
+-- 知识库相关索引
+CREATE INDEX idx_silver_knowledge_category ON silver_knowledges(category_id);
+CREATE INDEX idx_silver_knowledge_user ON silver_knowledges(user_id);
+CREATE INDEX idx_silver_knowledge_status ON silver_knowledges(status);
+CREATE INDEX idx_silver_knowledge_created ON silver_knowledges(created_at);
+
+-- 交互记录索引
+CREATE INDEX idx_knowledge_interaction_user ON silver_knowledge_interactions(user_id);
+CREATE INDEX idx_knowledge_interaction_knowledge ON silver_knowledge_interactions(knowledge_id);
+CREATE INDEX idx_knowledge_interaction_type ON silver_knowledge_interactions(type);
+
+-- 统计数据索引
+CREATE INDEX idx_knowledge_stats_user ON silver_knowledge_stats(user_id);
+CREATE INDEX idx_knowledge_stats_ranking ON silver_knowledge_stats(ranking_score DESC);
+
+-- 标签系统索引
+CREATE INDEX idx_knowledge_tags_name ON silver_knowledge_tags(name);
+CREATE INDEX idx_tag_relations_knowledge ON silver_knowledge_tag_relations(knowledge_id);
+```
+
+## 🔄 更新数据源注册
+
+在 `src/server/data-source.ts` 中添加新实体:
+
+```typescript
+import { SilverKnowledgeCategory } from "./modules/silver-users/silver-knowledge-category.entity"
+import { SilverKnowledgeTag } from "./modules/silver-users/silver-knowledge-tag.entity"
+import { SilverKnowledgeTagRelation } from "./modules/silver-users/silver-knowledge-tag-relation.entity"
+import { SilverKnowledgeStats } from "./modules/silver-users/silver-knowledge-stats.entity"
+
+// 在entities数组中添加
+entities: [
+  // ...现有实体
+  SilverKnowledgeCategory,
+  SilverKnowledgeTag,
+  SilverKnowledgeTagRelation,
+  SilverKnowledgeStats
+]
+```
+
+## 📈 排名算法实现
+
+知识库贡献人员排名算法:
+
+```typescript
+// 计算排名分数 (综合考虑下载、阅读、收藏)
+calculateRankingScore(knowledge: SilverKnowledgeStats): number {
+  const weight = {
+    downloads: 0.4,
+    reads: 0.3,
+    favorites: 0.3
+  };
+  
+  return (
+    knowledge.totalDownloads * weight.downloads +
+    knowledge.totalReads * weight.reads +
+    knowledge.totalFavorites * weight.favorites
+  );
+}
+```
+
+## 🎯 实施优先级
+
+1. **高优先级**: 知识库主体实体字段完善
+2. **中优先级**: 知识库统计实体创建
+3. **低优先级**: 分类和标签系统优化
+
+## ✅ 验收标准
+
+- [ ] 所有实体文件创建完成
+- [ ] 数据源注册更新完成
+- [ ] 数据库迁移脚本创建
+- [ ] 通用CRUD路由配置完成
+- [ ] 前端API集成测试通过
+- [ ] 排名算法验证通过