migrate.sql 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. -- ============================================
  2. -- AI LiaoWang Web App 数据库迁移脚本
  3. -- 数据库: PostgreSQL
  4. -- 生成时间: 2026-05-18
  5. -- 说明: 包含所有表的完整建表语句,含 SSO 新增字段
  6. -- ============================================
  7. -- 1. 用户表 (User) — 已新增 SSO 字段
  8. CREATE TABLE IF NOT EXISTS "user" (
  9. id SERIAL PRIMARY KEY,
  10. username VARCHAR(64) NOT NULL,
  11. password_hash VARCHAR(256),
  12. sso_sub VARCHAR(256) UNIQUE,
  13. real_name VARCHAR(100),
  14. roles TEXT,
  15. email VARCHAR(120),
  16. phone VARCHAR(30),
  17. avatar_url VARCHAR(500)
  18. );
  19. CREATE INDEX IF NOT EXISTS ix_user_username ON "user" (username);
  20. -- 插入默认管理员账号 (密码: admin)
  21. INSERT INTO "user" (username, password_hash, sso_sub, real_name, roles)
  22. SELECT 'admin',
  23. 'scrypt:32768:8:1$A9gQwDOkl3PLfi5f$fd967bd171fe965bbb1530b036a5003d83ee61b6463dc273479538584ce39c2e778be3e2e8d17b26b8890df31724eda49edb5cd91096ee3a7093c64a135b519e',
  24. NULL, '管理员', '["super_admin"]'
  25. WHERE NOT EXISTS (SELECT 1 FROM "user" WHERE username = 'admin');
  26. -- 2. 爬虫源表 (SpiderSource)
  27. CREATE TABLE IF NOT EXISTS spider_source (
  28. id SERIAL PRIMARY KEY,
  29. name VARCHAR(100) NOT NULL UNIQUE,
  30. code_identifier VARCHAR(100) NOT NULL UNIQUE,
  31. description TEXT,
  32. status VARCHAR(20) DEFAULT 'active',
  33. created_at TIMESTAMP DEFAULT NOW(),
  34. type VARCHAR(20) DEFAULT 'script',
  35. url VARCHAR(500),
  36. method VARCHAR(10) DEFAULT 'GET',
  37. headers TEXT,
  38. params TEXT,
  39. search_param_key VARCHAR(50) DEFAULT 'q',
  40. selectors TEXT,
  41. has_pagination BOOLEAN DEFAULT FALSE,
  42. pagination_param VARCHAR(50),
  43. pagination_step INTEGER DEFAULT 10,
  44. pagination_start INTEGER DEFAULT 0
  45. );
  46. -- 3. 采集任务表 (SpiderTask)
  47. CREATE TABLE IF NOT EXISTS collection_task (
  48. id SERIAL PRIMARY KEY,
  49. keyword VARCHAR(100) NOT NULL,
  50. spider_source_id INTEGER NOT NULL REFERENCES spider_source(id),
  51. pages INTEGER DEFAULT 1,
  52. status VARCHAR(20) DEFAULT 'pending',
  53. created_at TIMESTAMP DEFAULT NOW(),
  54. finished_at TIMESTAMP
  55. );
  56. -- 4. 采集结果表 (SpiderResult)
  57. CREATE TABLE IF NOT EXISTS spider_result (
  58. id SERIAL PRIMARY KEY,
  59. task_id INTEGER REFERENCES collection_task(id),
  60. title VARCHAR(500),
  61. abstract TEXT,
  62. source VARCHAR(200),
  63. cover VARCHAR(500),
  64. link VARCHAR(500),
  65. published_at VARCHAR(50),
  66. has_deep_collection BOOLEAN DEFAULT FALSE,
  67. created_at TIMESTAMP DEFAULT NOW()
  68. );
  69. -- 5. 深度采集表 (DeepCollection)
  70. CREATE TABLE IF NOT EXISTS deep_collection (
  71. id SERIAL PRIMARY KEY,
  72. title VARCHAR(500),
  73. url VARCHAR(500) NOT NULL UNIQUE,
  74. content TEXT,
  75. summary TEXT,
  76. status VARCHAR(20) DEFAULT 'pending',
  77. progress INTEGER DEFAULT 0,
  78. progress_msg VARCHAR(200) DEFAULT '',
  79. error_msg TEXT,
  80. created_at TIMESTAMP DEFAULT NOW(),
  81. updated_at TIMESTAMP DEFAULT NOW()
  82. );
  83. -- 6. AI 模型表 (AIModel)
  84. CREATE TABLE IF NOT EXISTS ai_model (
  85. id SERIAL PRIMARY KEY,
  86. name VARCHAR(100) NOT NULL,
  87. provider VARCHAR(50) DEFAULT 'openai',
  88. api_base VARCHAR(500) NOT NULL,
  89. api_key VARCHAR(500) NOT NULL,
  90. model_name VARCHAR(200) NOT NULL,
  91. system_prompt TEXT,
  92. is_active BOOLEAN DEFAULT TRUE,
  93. total_tokens BIGINT DEFAULT 0,
  94. created_at TIMESTAMP DEFAULT NOW(),
  95. updated_at TIMESTAMP DEFAULT NOW()
  96. );
  97. -- 7. Token 使用日志表 (TokenUsageLog)
  98. CREATE TABLE IF NOT EXISTS token_usage_log (
  99. id SERIAL PRIMARY KEY,
  100. model_id INTEGER REFERENCES ai_model(id),
  101. prompt_tokens INTEGER DEFAULT 0,
  102. completion_tokens INTEGER DEFAULT 0,
  103. total_tokens INTEGER DEFAULT 0,
  104. request_type VARCHAR(50) DEFAULT 'test',
  105. created_at TIMESTAMP DEFAULT NOW()
  106. );
  107. -- 8. AI 对话表 (AIConversation)
  108. CREATE TABLE IF NOT EXISTS ai_conversation (
  109. id SERIAL PRIMARY KEY,
  110. title VARCHAR(200) DEFAULT 'New Chat',
  111. user_id INTEGER REFERENCES "user"(id),
  112. created_at TIMESTAMP DEFAULT NOW(),
  113. updated_at TIMESTAMP DEFAULT NOW()
  114. );
  115. -- 9. AI 消息表 (AIMessage)
  116. CREATE TABLE IF NOT EXISTS ai_message (
  117. id SERIAL PRIMARY KEY,
  118. conversation_id INTEGER NOT NULL REFERENCES ai_conversation(id) ON DELETE CASCADE,
  119. role VARCHAR(20) NOT NULL,
  120. content TEXT,
  121. meta_data TEXT,
  122. created_at TIMESTAMP DEFAULT NOW()
  123. );