diff --git a/src/main/java/com/example/building/config/DatabaseInitRunner.java b/src/main/java/com/example/building/config/DatabaseInitRunner.java deleted file mode 100644 index 58e0d85..0000000 --- a/src/main/java/com/example/building/config/DatabaseInitRunner.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.example.building.config; - -import com.example.building.mapper.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.core.io.ClassPathResource; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Component; - -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.stream.Collectors; - -/** - * 数据库初始化组件 - * 启动时自动执行 SQL 脚本建表 - */ -@Component -public class DatabaseInitRunner implements CommandLineRunner { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Override - public void run(String... args) throws Exception { - try { - // 检查表是否存在 - Integer count = jdbcTemplate.queryForObject( - "SELECT COUNT(*) FROM information_schema.tables WHERE table_name = 'users'", - Integer.class - ); - - if (count == null || count == 0) { - System.out.println("=== 初始化数据库表结构 ==="); - executeSqlScript("sql/init.sql"); - System.out.println("=== 数据库初始化完成 ==="); - } - } catch (Exception e) { - System.out.println("数据库初始化跳过: " + e.getMessage()); - } - } - - private void executeSqlScript(String scriptPath) { - try { - ClassPathResource resource = new ClassPathResource(scriptPath); - String sql = new BufferedReader( - new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8) - ).lines().collect(Collectors.joining("\n")); - - // 按分号分割执行 - String[] statements = sql.split(";"); - for (String stmt : statements) { - String trimmed = stmt.trim(); - if (!trimmed.isEmpty() && !trimmed.startsWith("--")) { - try { - jdbcTemplate.execute(trimmed); - } catch (Exception e) { - // 忽略单个语句错误(如主键重复) - System.out.println("执行SQL跳过: " + e.getMessage()); - } - } - } - } catch (Exception e) { - System.err.println("执行SQL脚本失败: " + e.getMessage()); - } - } -} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 473db16..9a316a0 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -11,6 +11,15 @@ spring: url: jdbc:postgresql://${SPRING_DATASOURCE_HOST:localhost}:${SPRING_DATASOURCE_PORT:5432}/${SPRING_DATASOURCE_DB:building_materials} username: ${SPRING_DATASOURCE_USERNAME:postgres} password: ${SPRING_DATASOURCE_PASSWORD:postgres} + hikari: + initialization-fail-timeout: 60000 + + # 自动执行建表SQL + sql: + init: + mode: always + schema-locations: classpath:sql/init.sql + continue-on-error: true # Redis配置 - 环境变量注入 redis: @@ -37,7 +46,6 @@ mybatis-plus: logic-delete-field: status logic-delete-value: 0 logic-not-delete-value: 1 - # 自动建表 mapper-locations: classpath*:/mapper/**/*.xml type-aliases-package: com.example.building.entity diff --git a/sql/init.sql b/src/main/resources/sql/init.sql similarity index 70% rename from sql/init.sql rename to src/main/resources/sql/init.sql index f274047..1075114 100644 --- a/sql/init.sql +++ b/src/main/resources/sql/init.sql @@ -2,7 +2,7 @@ -- 创建数据库: create database building_materials; -- 用户表 -CREATE TABLE users ( +CREATE TABLE IF NOT EXISTS users ( user_id VARCHAR(36) PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, phone VARCHAR(20), @@ -10,14 +10,14 @@ CREATE TABLE users ( wechat_openid VARCHAR(128), wechat_unionid VARCHAR(128), alipay_openid VARCHAR(128), - role VARCHAR(20) NOT NULL DEFAULT 'sales', -- admin, sales, customer - status INTEGER NOT NULL DEFAULT 1, -- 0:禁用, 1:启用 + role VARCHAR(20) NOT NULL DEFAULT 'sales', + status INTEGER NOT NULL DEFAULT 1, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); -- 客户表 -CREATE TABLE customers ( +CREATE TABLE IF NOT EXISTS customers ( customer_id VARCHAR(36) PRIMARY KEY, name VARCHAR(100) NOT NULL, phone VARCHAR(20), @@ -34,19 +34,19 @@ CREATE TABLE customers ( ); -- 商品分类表 -CREATE TABLE categories ( +CREATE TABLE IF NOT EXISTS categories ( category_id VARCHAR(36) PRIMARY KEY, name VARCHAR(50) NOT NULL, parent_id VARCHAR(36), sort_order INTEGER DEFAULT 0, icon VARCHAR(255), - status INTEGER DEFAULT 1, -- 0:禁用, 1:启用 + status INTEGER DEFAULT 1, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); -- 商品表 -CREATE TABLE products ( +CREATE TABLE IF NOT EXISTS products ( product_id VARCHAR(36) PRIMARY KEY, category_id VARCHAR(36), name VARCHAR(100) NOT NULL, @@ -58,26 +58,26 @@ CREATE TABLE products ( barcode VARCHAR(50), stock_alert INTEGER DEFAULT 10, description TEXT, - status INTEGER DEFAULT 1, -- 0:下架, 1:上架 + status INTEGER DEFAULT 1, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (category_id) REFERENCES categories(category_id) ); -- 订单表 -CREATE TABLE orders ( +CREATE TABLE IF NOT EXISTS orders ( order_id VARCHAR(36) PRIMARY KEY, order_no VARCHAR(32) NOT NULL UNIQUE, customer_id VARCHAR(36), customer_name VARCHAR(100), customer_phone VARCHAR(20), customer_wechat VARCHAR(128), - total_amount DECIMAL(12,2) NOT NULL, -- 原价 - discount_amount DECIMAL(12,2) DEFAULT 0, -- 优惠金额 - actual_amount DECIMAL(12,2) NOT NULL, -- 实付金额 - discount_rate DECIMAL(5,2) DEFAULT 100, -- 折扣率 - status INTEGER NOT NULL DEFAULT 1, -- 1:已完成, 2:待付款, 3:已取消 - payment_method VARCHAR(20), -- cash, wechat, alipay + total_amount DECIMAL(12,2) NOT NULL, + discount_amount DECIMAL(12,2) DEFAULT 0, + actual_amount DECIMAL(12,2) NOT NULL, + discount_rate DECIMAL(5,2) DEFAULT 100, + status INTEGER NOT NULL DEFAULT 1, + payment_method VARCHAR(20), remark TEXT, operator_id VARCHAR(36), operator_name VARCHAR(50), @@ -87,7 +87,7 @@ CREATE TABLE orders ( ); -- 订单明细表 -CREATE TABLE order_items ( +CREATE TABLE IF NOT EXISTS order_items ( item_id VARCHAR(36) PRIMARY KEY, order_id VARCHAR(36) NOT NULL, product_id VARCHAR(36) NOT NULL, @@ -103,26 +103,26 @@ CREATE TABLE order_items ( ); -- 库存表 -CREATE TABLE stock ( +CREATE TABLE IF NOT EXISTS stock ( stock_id VARCHAR(36) PRIMARY KEY, product_id VARCHAR(36) NOT NULL UNIQUE, warehouse_id VARCHAR(36), quantity INTEGER NOT NULL DEFAULT 0, - locked_quantity INTEGER DEFAULT 0, -- 锁定数量(待发货) + locked_quantity INTEGER DEFAULT 0, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (product_id) REFERENCES products(product_id) ); -- 库存流水表 -CREATE TABLE stock_flow ( +CREATE TABLE IF NOT EXISTS stock_flow ( flow_id VARCHAR(36) PRIMARY KEY, product_id VARCHAR(36) NOT NULL, - type INTEGER NOT NULL, -- 1:入库, 2:出库, 3:调整 + type INTEGER NOT NULL, quantity INTEGER NOT NULL, before_quantity INTEGER, after_quantity INTEGER, - related_id VARCHAR(36), -- 关联单据ID - related_type VARCHAR(20), -- order, manual + related_id VARCHAR(36), + related_type VARCHAR(20), operator_id VARCHAR(36), remark TEXT, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, @@ -130,7 +130,7 @@ CREATE TABLE stock_flow ( ); -- 系统配置表 -CREATE TABLE system_config ( +CREATE TABLE IF NOT EXISTS system_config ( config_id VARCHAR(36) PRIMARY KEY, config_key VARCHAR(50) NOT NULL UNIQUE, config_value TEXT, @@ -138,12 +138,3 @@ CREATE TABLE system_config ( created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); - --- 初始化管理员账号 (密码: admin123) -INSERT INTO users (user_id, username, phone, password, role, status) -VALUES ('admin-001', 'admin', '13800138000', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EH', 'admin', 1); - --- 初始化系统配置 -INSERT INTO system_config (config_id, config_key, config_value, remark) VALUES -('config-001', 'order_view_days', '180', '顾客可查看订单天数'), -('config-002', 'default_discount_rate', '100', '默认折扣率');