schema.sql 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. -- Lingyue Zhibao Database Schema
  2. -- PostgreSQL
  3. -- =============================================
  4. -- Graph Core Tables
  5. -- =============================================
  6. -- Node Types
  7. CREATE TABLE IF NOT EXISTS node_types (
  8. id SERIAL PRIMARY KEY,
  9. type_code VARCHAR(50) NOT NULL UNIQUE,
  10. type_name VARCHAR(100) NOT NULL,
  11. description TEXT,
  12. icon VARCHAR(50),
  13. color VARCHAR(20),
  14. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  15. );
  16. -- Edge Types
  17. CREATE TABLE IF NOT EXISTS edge_types (
  18. id SERIAL PRIMARY KEY,
  19. type_code VARCHAR(50) NOT NULL UNIQUE,
  20. type_name VARCHAR(100) NOT NULL,
  21. from_node_type VARCHAR(50),
  22. to_node_type VARCHAR(50),
  23. description TEXT,
  24. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  25. );
  26. -- Nodes
  27. CREATE TABLE IF NOT EXISTS nodes (
  28. id BIGSERIAL PRIMARY KEY,
  29. node_type VARCHAR(50) NOT NULL,
  30. node_key VARCHAR(255),
  31. name VARCHAR(255),
  32. status VARCHAR(20) DEFAULT 'active',
  33. created_by BIGINT,
  34. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  35. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  36. );
  37. CREATE INDEX idx_nodes_type ON nodes(node_type);
  38. CREATE INDEX idx_nodes_key ON nodes(node_key);
  39. -- Edges
  40. CREATE TABLE IF NOT EXISTS edges (
  41. id BIGSERIAL PRIMARY KEY,
  42. edge_type VARCHAR(50) NOT NULL,
  43. from_node_id BIGINT NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,
  44. to_node_id BIGINT NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,
  45. sort_order INTEGER DEFAULT 0,
  46. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  47. );
  48. CREATE INDEX idx_edges_from ON edges(from_node_id);
  49. CREATE INDEX idx_edges_to ON edges(to_node_id);
  50. CREATE INDEX idx_edges_type ON edges(edge_type);
  51. -- Node Properties
  52. CREATE TABLE IF NOT EXISTS node_properties (
  53. id BIGSERIAL PRIMARY KEY,
  54. node_id BIGINT NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,
  55. prop_key VARCHAR(100) NOT NULL,
  56. prop_value TEXT,
  57. prop_json JSONB,
  58. prop_number NUMERIC(20, 6),
  59. prop_date TIMESTAMP,
  60. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  61. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  62. UNIQUE(node_id, prop_key)
  63. );
  64. CREATE INDEX idx_node_props_node ON node_properties(node_id);
  65. CREATE INDEX idx_node_props_key ON node_properties(prop_key);
  66. -- Edge Properties
  67. CREATE TABLE IF NOT EXISTS edge_properties (
  68. id BIGSERIAL PRIMARY KEY,
  69. edge_id BIGINT NOT NULL REFERENCES edges(id) ON DELETE CASCADE,
  70. prop_key VARCHAR(100) NOT NULL,
  71. prop_value TEXT,
  72. prop_json JSONB,
  73. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  74. UNIQUE(edge_id, prop_key)
  75. );
  76. CREATE INDEX idx_edge_props_edge ON edge_properties(edge_id);
  77. -- =============================================
  78. -- Auth Tables
  79. -- =============================================
  80. -- Users
  81. CREATE TABLE IF NOT EXISTS sys_users (
  82. id BIGSERIAL PRIMARY KEY,
  83. node_id BIGINT REFERENCES nodes(id),
  84. username VARCHAR(50) NOT NULL UNIQUE,
  85. password_hash VARCHAR(255) NOT NULL,
  86. salt VARCHAR(50),
  87. email VARCHAR(100),
  88. phone VARCHAR(20),
  89. avatar VARCHAR(255),
  90. real_name VARCHAR(50),
  91. department VARCHAR(100),
  92. position VARCHAR(100),
  93. status VARCHAR(20) DEFAULT 'active',
  94. last_login_at TIMESTAMP,
  95. last_login_ip VARCHAR(50),
  96. login_count INTEGER DEFAULT 0,
  97. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  98. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  99. );
  100. -- Roles
  101. CREATE TABLE IF NOT EXISTS sys_roles (
  102. id SERIAL PRIMARY KEY,
  103. role_code VARCHAR(50) NOT NULL UNIQUE,
  104. role_name VARCHAR(100) NOT NULL,
  105. description TEXT,
  106. sort_order INTEGER DEFAULT 0,
  107. status VARCHAR(20) DEFAULT 'active',
  108. created_by BIGINT,
  109. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  110. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  111. );
  112. -- Permissions
  113. CREATE TABLE IF NOT EXISTS sys_permissions (
  114. id SERIAL PRIMARY KEY,
  115. perm_code VARCHAR(100) NOT NULL UNIQUE,
  116. perm_name VARCHAR(100) NOT NULL,
  117. perm_type VARCHAR(20),
  118. parent_id INTEGER,
  119. path VARCHAR(255),
  120. icon VARCHAR(50),
  121. component VARCHAR(255),
  122. sort_order INTEGER DEFAULT 0,
  123. status VARCHAR(20) DEFAULT 'active',
  124. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  125. );
  126. -- User Roles
  127. CREATE TABLE IF NOT EXISTS sys_user_roles (
  128. id SERIAL PRIMARY KEY,
  129. user_id BIGINT NOT NULL REFERENCES sys_users(id) ON DELETE CASCADE,
  130. role_id INTEGER NOT NULL REFERENCES sys_roles(id) ON DELETE CASCADE,
  131. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  132. UNIQUE(user_id, role_id)
  133. );
  134. -- Role Permissions
  135. CREATE TABLE IF NOT EXISTS sys_role_permissions (
  136. id SERIAL PRIMARY KEY,
  137. role_id INTEGER NOT NULL REFERENCES sys_roles(id) ON DELETE CASCADE,
  138. permission_id INTEGER NOT NULL REFERENCES sys_permissions(id) ON DELETE CASCADE,
  139. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  140. UNIQUE(role_id, permission_id)
  141. );
  142. -- Sessions
  143. CREATE TABLE IF NOT EXISTS sys_sessions (
  144. id BIGSERIAL PRIMARY KEY,
  145. user_id BIGINT NOT NULL REFERENCES sys_users(id) ON DELETE CASCADE,
  146. session_token VARCHAR(255) NOT NULL UNIQUE,
  147. refresh_token VARCHAR(255),
  148. device_type VARCHAR(50),
  149. device_info VARCHAR(255),
  150. ip_address VARCHAR(50),
  151. user_agent TEXT,
  152. expires_at TIMESTAMP,
  153. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  154. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  155. );
  156. CREATE INDEX idx_sessions_user ON sys_sessions(user_id);
  157. CREATE INDEX idx_sessions_token ON sys_sessions(session_token);
  158. -- Config
  159. CREATE TABLE IF NOT EXISTS sys_configs (
  160. id SERIAL PRIMARY KEY,
  161. config_key VARCHAR(100) NOT NULL UNIQUE,
  162. config_value TEXT,
  163. config_type VARCHAR(20),
  164. description TEXT,
  165. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  166. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  167. );
  168. -- Dict Types
  169. CREATE TABLE IF NOT EXISTS sys_dict_types (
  170. id SERIAL PRIMARY KEY,
  171. dict_code VARCHAR(50) NOT NULL UNIQUE,
  172. dict_name VARCHAR(100) NOT NULL,
  173. description TEXT,
  174. status VARCHAR(20) DEFAULT 'active',
  175. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  176. );
  177. -- Dict Items
  178. CREATE TABLE IF NOT EXISTS sys_dict_items (
  179. id SERIAL PRIMARY KEY,
  180. dict_type_id INTEGER NOT NULL REFERENCES sys_dict_types(id) ON DELETE CASCADE,
  181. item_value VARCHAR(100) NOT NULL,
  182. item_label VARCHAR(100) NOT NULL,
  183. sort_order INTEGER DEFAULT 0,
  184. status VARCHAR(20) DEFAULT 'active',
  185. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  186. );
  187. -- Login Logs
  188. CREATE TABLE IF NOT EXISTS sys_login_logs (
  189. id BIGSERIAL PRIMARY KEY,
  190. user_id BIGINT,
  191. username VARCHAR(50),
  192. login_type VARCHAR(20),
  193. ip_address VARCHAR(50),
  194. user_agent TEXT,
  195. status VARCHAR(20),
  196. message TEXT,
  197. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  198. );
  199. -- Operation Logs
  200. CREATE TABLE IF NOT EXISTS sys_operation_logs (
  201. id BIGSERIAL PRIMARY KEY,
  202. user_id BIGINT,
  203. username VARCHAR(50),
  204. operation VARCHAR(100),
  205. method VARCHAR(200),
  206. params TEXT,
  207. result TEXT,
  208. ip_address VARCHAR(50),
  209. duration INTEGER,
  210. status VARCHAR(20),
  211. error_msg TEXT,
  212. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  213. );
  214. -- =============================================
  215. -- File Tables
  216. -- =============================================
  217. CREATE TABLE IF NOT EXISTS sys_files (
  218. id BIGSERIAL PRIMARY KEY,
  219. file_key VARCHAR(100) NOT NULL UNIQUE,
  220. original_name VARCHAR(255) NOT NULL,
  221. storage_name VARCHAR(255),
  222. storage_path VARCHAR(500),
  223. file_type VARCHAR(50),
  224. file_size BIGINT,
  225. md5_hash VARCHAR(32),
  226. storage_type VARCHAR(20) DEFAULT 'local',
  227. bucket VARCHAR(100),
  228. url VARCHAR(500),
  229. thumbnail_url VARCHAR(500),
  230. uploaded_by BIGINT,
  231. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  232. );
  233. CREATE INDEX idx_files_key ON sys_files(file_key);
  234. -- =============================================
  235. -- Task Tables
  236. -- =============================================
  237. CREATE TABLE IF NOT EXISTS sys_tasks (
  238. id BIGSERIAL PRIMARY KEY,
  239. task_type VARCHAR(50) NOT NULL,
  240. task_key VARCHAR(100),
  241. payload TEXT,
  242. status VARCHAR(20) DEFAULT 'pending',
  243. priority INTEGER DEFAULT 0,
  244. retry_count INTEGER DEFAULT 0,
  245. max_retries INTEGER DEFAULT 3,
  246. result TEXT,
  247. error_msg TEXT,
  248. started_at TIMESTAMP,
  249. finished_at TIMESTAMP,
  250. created_by BIGINT,
  251. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  252. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  253. );
  254. CREATE INDEX idx_tasks_status ON sys_tasks(status);
  255. CREATE INDEX idx_tasks_type ON sys_tasks(task_type);
  256. -- =============================================
  257. -- Initial Data
  258. -- =============================================
  259. -- Node Types
  260. INSERT INTO node_types (type_code, type_name, description) VALUES
  261. ('project', '项目', '评审项目'),
  262. ('element', '要素', '报告要素'),
  263. ('value', '值', '要素值'),
  264. ('attachment', '附件', '项目附件'),
  265. ('rule', '规则', '自动化规则'),
  266. ('user', '用户', '系统用户')
  267. ON CONFLICT (type_code) DO NOTHING;
  268. -- Edge Types
  269. INSERT INTO edge_types (type_code, type_name, from_node_type, to_node_type) VALUES
  270. ('has_element', '包含要素', 'project', 'element'),
  271. ('has_value', '包含值', 'project', 'value'),
  272. ('has_attachment', '包含附件', 'project', 'attachment'),
  273. ('has_rule', '包含规则', 'project', 'rule'),
  274. ('element_value', '要素值', 'element', 'value'),
  275. ('rule_input', '规则输入', 'rule', 'attachment'),
  276. ('rule_output', '规则输出', 'rule', 'element')
  277. ON CONFLICT (type_code) DO NOTHING;
  278. -- Default Admin User (password: admin123)
  279. INSERT INTO sys_users (username, password_hash, salt, real_name, status) VALUES
  280. ('admin', '8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918', '', '管理员', 'active')
  281. ON CONFLICT (username) DO NOTHING;
  282. -- Default Roles
  283. INSERT INTO sys_roles (role_code, role_name, description) VALUES
  284. ('admin', '管理员', '系统管理员'),
  285. ('user', '普通用户', '普通用户')
  286. ON CONFLICT (role_code) DO NOTHING;