Browse Source

feat:update back-end databse code

0235645 2 days ago
parent
commit
0e4311a427

+ 9 - 0
back-end/.env

@@ -0,0 +1,9 @@
+# PostgreSQL 配置
+DB_USER=user_HZJ7TG
+DB_HOST=110.42.109.119
+DB_NAME=cloth
+DB_PASSWORD=password_kJJM8P
+DB_PORT=5455
+
+# 应用配置
+PORT=3000

+ 14 - 1
back-end/src/config/index.ts

@@ -7,8 +7,21 @@ export const config = {
   db: {
     user: process.env.DB_USER || 'postgres',
     host: process.env.DB_HOST || 'localhost',
-    database: process.env.DB_NAME || 'my_db',
+    database: process.env.DB_NAME || 'cloth_design',
     password: process.env.DB_PASSWORD || 'secret',
     port: parseInt(process.env.DB_PORT || '5432'),
   }
+};
+
+// 验证环境变量
+export const validateEnv = () => {
+  const requiredVars = ['DB_USER', 'DB_HOST', 'DB_NAME', 'DB_PASSWORD'];
+  
+  requiredVars.forEach(varName => {
+    if (!process.env[varName]) {
+      throw new Error(`Missing required environment variable: ${varName}`);
+    }
+  });
+  
+  console.log('Environment variables validated successfully');
 };

+ 42 - 3
back-end/src/database/index.ts

@@ -1,6 +1,5 @@
 import { Pool } from 'pg';
 import { config } from '../config';
-import { createUsersTable, getAllUsers, createUser } from './users.repository'; // 添加这行导入
 
 // 创建连接池
 const pool = new Pool({
@@ -37,5 +36,45 @@ pool.on('error', (err: Error) => {
   console.error('Unexpected database error', err);
 });
 
-// 导出所有需要的函数
-export { createUsersTable, getAllUsers, createUser }; // 添加这行导出
+// 初始化数据库 - 检查并创建 cloth 表
+export const initializeDatabase = async () => {
+  try {
+    // 检查 cloth 表是否存在
+    const tableExists = await query(
+      `SELECT EXISTS (
+        SELECT FROM information_schema.tables 
+        WHERE table_schema = 'public' 
+        AND table_name = 'cloth'
+      )`
+    );
+    
+    if (!tableExists.rows[0].exists) {
+      console.log('Creating cloth table...');
+      await query(`
+        CREATE TABLE cloth (
+          id SERIAL PRIMARY KEY,
+          name VARCHAR(100) NOT NULL,
+          description TEXT,
+          price DECIMAL(10,2) NOT NULL,
+          size VARCHAR(10)[],
+          colors VARCHAR(20)[],
+          material VARCHAR(50),
+          created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+          updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+        )
+      `);
+      console.log('Cloth table created successfully');
+    } else {
+      console.log('Cloth table already exists');
+    }
+    
+    // 测试数据库连接
+    const dbStatus = await testDbConnection();
+    console.log('Database connection successful:', dbStatus);
+    
+  } catch (error) {
+    const err = error as Error;
+    console.error('Database initialization failed:', err.message);
+    throw err;
+  }
+};

+ 22 - 4
back-end/src/main.ts

@@ -1,10 +1,28 @@
 import { createServer } from 'http';
 import app from './app';
-import { config } from './config';
+import { config, validateEnv } from './config';
+import { initializeDatabase } from './database';
 
 const port = config.port || 3000;
 const server = createServer(app);
 
-server.listen(port, () => {
-  console.log(`Server running on http://localhost:${port}`);
-});
+async function startServer() {
+  try {
+    // 验证环境变量
+    validateEnv();
+    
+    // 初始化数据库
+    await initializeDatabase();
+    
+    // 启动服务器
+    server.listen(port, () => {
+      console.log(`Server running on http://localhost:${port}`);
+    });
+    
+  } catch (error) {
+    console.error('Failed to start server:', error);
+    process.exit(1);
+  }
+}
+
+startServer();

+ 36 - 0
back-end/src/routes/cloth.route.ts

@@ -0,0 +1,36 @@
+import { Router } from 'express';
+import { query } from '../database';
+
+const router = Router();
+
+// 获取所有服装
+router.get('/', async (req, res) => {
+  try {
+    const result = await query('SELECT * FROM cloth');
+    res.json(result.rows);
+  } catch (error) {
+    const err = error as Error;
+    res.status(500).json({ error: err.message });
+  }
+});
+
+// 添加新服装
+router.post('/', async (req, res) => {
+  try {
+    const { name, description, price, size, colors, material } = req.body;
+    
+    const result = await query(
+      `INSERT INTO cloth (name, description, price, size, colors, material) 
+       VALUES ($1, $2, $3, $4, $5, $6) 
+       RETURNING *`,
+      [name, description, price, size, colors, material]
+    );
+    
+    res.status(201).json(result.rows[0]);
+  } catch (error) {
+    const err = error as Error;
+    res.status(400).json({ error: err.message });
+  }
+});
+
+export default router;

+ 2 - 10
back-end/src/routes/health.route.ts

@@ -1,5 +1,5 @@
 import { Router } from 'express';
-import { testDbConnection, createUsersTable } from '../database'; // 现在从 index 导入
+import { testDbConnection } from '../database'; // 只导入 testDbConnection
 
 const router = Router();
 
@@ -19,14 +19,6 @@ router.get('/health', async (req, res) => {
   }
 });
 
-router.get('/create-table', async (req, res) => {
-  try {
-    const result = await createUsersTable();
-    res.json(result);
-  } catch (error) {
-    const err = error as Error;
-    res.status(500).json({ error: err.message });
-  }
-});
+// 移除 create-table 路由,因为我们在 initializeDatabase 中处理了表创建
 
 export default router;

+ 2 - 2
back-end/src/routes/index.ts

@@ -1,10 +1,10 @@
 import { Router } from 'express';
 import healthRouter from './health.route';
-import usersRouter from './users.route';
+import clothRouter from './cloth.route'; 
 
 const router = Router();
 
 router.use('/health', healthRouter);
-router.use('/users', usersRouter);
+router.use('/clothes', clothRouter); 
 
 export default router;

+ 0 - 30
back-end/src/routes/users.route.ts

@@ -1,30 +0,0 @@
-import { Router } from 'express';
-import { getAllUsers, createUser } from '../database'; // 现在从 index 导入
-import { User } from '../types/user.type';
-
-const router = Router();
-
-// 获取所有用户
-router.get('/', async (req, res) => {
-  try {
-    const users = await getAllUsers();
-    res.json(users);
-  } catch (error) {
-    const err = error as Error;
-    res.status(500).json({ error: err.message });
-  }
-});
-
-// 创建用户
-router.post('/', async (req, res) => {
-  try {
-    const newUser: Omit<User, 'id'> = req.body;
-    const createdUser = await createUser(newUser);
-    res.status(201).json(createdUser);
-  } catch (error) {
-    const err = error as Error;
-    res.status(400).json({ error: err.message });
-  }
-});
-
-export default router;