用AI生成了一个多商户商城系统,大家看看代码水平怎么样?

programmer 程式師 程序员
Post Reply
expl
test ranks
Posts: 674
Joined: 2023-03-02T05:46:06+00:00

用AI生成了一个多商户商城系统,大家看看代码水平怎么样?

Post by expl »

用AI生成了一个多商户商城系统,大家看看代码水平怎么样?

在线商城系统框架(使用原生PHP和PostgreSQL)以下是一个简化版的在线商城系统框架,使用原生PHP(不使用PDO)和PostgreSQL的pg_*函数实现数据库操作。我会提供:数据库设计:PostgreSQL表结构。
关键PHP脚本:包括用户系统、管理员权限管理、多商户和分店管理、对账分账逻辑。
说明:这是一个基础框架,实际生产环境需要添加安全措施(如SQL注入防护,使用pg_escape_string)、错误处理、会话管理等。系统假设运行在Apache/Nginx + PHP环境中,PostgreSQL数据库已安装。

假设环境PostgreSQL连接信息:主机localhost,数据库mall_db,用户postgres,密码password(请替换为实际值)。
PHP版本:7.x 或更高,支持pg_*扩展(需启用extension=pgsql)。
系统结构:使用简单的文件组织,如index.php为入口,db.php为数据库连接,user.php、admin.php、merchant.php、account.php为模块。

1. 数据库设计(PostgreSQL Schema)首先,在PostgreSQL中执行以下SQL创建表。使用pgAdmin或psql工具。

Code: Select all

-- 创建数据库(如果不存在)
CREATE DATABASE mall_db;

-- 连接到mall_db

-- 用户表(用户系统)
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,  -- 使用密码哈希存储
    email VARCHAR(100) UNIQUE NOT NULL,
    role_id INT NOT NULL,  -- 引用roles表
    group_id INT,  -- 用户分组,可选
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 角色表(权限系统)
CREATE TABLE roles (
    id SERIAL PRIMARY KEY,
    role_name VARCHAR(50) UNIQUE NOT NULL,  -- 如 'admin', 'merchant', 'customer'
    permissions TEXT NOT NULL  -- JSON或逗号分隔的权限,如 'manage_users,view_orders'
);

-- 用户分组表(管理员配置分组)
CREATE TABLE user_groups (
    id SERIAL PRIMARY KEY,
    group_name VARCHAR(50) UNIQUE NOT NULL,
    description TEXT
);

-- 商户表(多商户支持)
CREATE TABLE merchants (
    id SERIAL PRIMARY KEY,
    user_id INT REFERENCES users(id) ON DELETE CASCADE,  -- 关联用户
    merchant_name VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 分店表(每个商户无限分店)
CREATE TABLE stores (
    id SERIAL PRIMARY KEY,
    merchant_id INT REFERENCES merchants(id) ON DELETE CASCADE,
    store_name VARCHAR(100) NOT NULL,
    address TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 订单表(用于对账分账)
CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    user_id INT REFERENCES users(id),  -- 买家
    store_id INT REFERENCES stores(id),  -- 分店
    total_amount DECIMAL(10,2) NOT NULL,
    platform_fee DECIMAL(10,2) DEFAULT 0,  -- 平台抽成
    merchant_amount DECIMAL(10,2) DEFAULT 0,  -- 商户分账
    store_amount DECIMAL(10,2) DEFAULT 0,  -- 分店分账(如果分店独立)
    status VARCHAR(20) DEFAULT 'pending',  -- pending, paid, shipped 等
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 对账记录表(平台、商户、分店对账)
CREATE TABLE accounts (
    id SERIAL PRIMARY KEY,
    order_id INT REFERENCES orders(id),
    type VARCHAR(20) NOT NULL,  -- 'platform', 'merchant', 'store'
    amount DECIMAL(10,2) NOT NULL,
    settled BOOLEAN DEFAULT FALSE,  -- 是否已结算
    settled_at TIMESTAMP
);

-- 初始化一些数据
INSERT INTO roles (role_name, permissions) VALUES ('admin', 'manage_users,manage_permissions,manage_groups');
INSERT INTO roles (role_name, permissions) VALUES ('merchant', 'manage_stores,view_orders');
INSERT INTO roles (role_name, permissions) VALUES ('customer', 'place_orders,view_profile');


2. 数据库连接文件(db.php)
所有脚本都会包含这个文件来连接数据库。

Code: Select all

<?php
// db.php - 原生PostgreSQL连接
$host = 'localhost';
$dbname = 'mall_db';
$user = 'postgres';
$password = 'password';

$conn = pg_connect("host=$host dbname=$dbname user=$user password=$password");

if (!$conn) {
    die("Connection failed: " . pg_last_error());
}

// 辅助函数:执行查询并防注入(使用pg_escape_string)
function query($sql, $params = []) {
    global $conn;
    $escaped_params = array_map(function($param) use ($conn) { return pg_escape_string($conn, $param); }, $params);
    $sql = vsprintf(str_replace('?', '%s', $sql), $escaped_params);
    $result = pg_query($conn, $sql);
    if (!$result) {
        die("Query failed: " . pg_last_error($conn));
    }
    return $result;
}
?>



3. 用户系统(user.php)
包括注册、登录、个人信息查看。密码使用password_hash存储。

Code: Select all

<?php
// user.php - 用户系统
include 'db.php';

// 注册用户
function register_user($username, $password, $email, $role_id, $group_id = null) {
    $hash = password_hash($password, PASSWORD_DEFAULT);
    $sql = "INSERT INTO users (username, password_hash, email, role_id, group_id) VALUES (?, ?, ?, ?, ?)";
    query($sql, [$username, $hash, $email, $role_id, $group_id]);
    return pg_affected_rows(pg_get_result($conn)) > 0;
}

// 登录用户
function login_user($username, $password) {
    $sql = "SELECT id, password_hash, role_id FROM users WHERE username = ?";
    $result = query($sql, [$username]);
    $user = pg_fetch_assoc($result);
    if ($user && password_verify($password, $user['password_hash'])) {
        session_start();
        $_SESSION['user_id'] = $user['id'];
        $_SESSION['role_id'] = $user['role_id'];
        return true;
    }
    return false;
}

// 示例使用
// register_user('testuser', 'pass123', 'test@email.com', 3, 1);  // 3 为 customer role
// login_user('testuser', 'pass123');
?>


4. 管理员配置用户权限和分组(admin.php)
管理员可以管理角色权限和用户分组。

Code: Select all

<?php
// admin.php - 管理员功能
include 'db.php';
session_start();

// 检查是否管理员
function is_admin() {
    return isset($_SESSION['role_id']) && $_SESSION['role_id'] == 1;  // 假设1为admin role
}

// 配置用户权限(更新角色权限)
function update_role_permissions($role_id, $permissions) {
    if (!is_admin()) die("Access denied");
    $perms = implode(',', $permissions);  // 数组转字符串
    $sql = "UPDATE roles SET permissions = ? WHERE id = ?";
    query($sql, [$perms, $role_id]);
}

// 创建用户分组
function create_group($group_name, $description) {
    if (!is_admin()) die("Access denied");
    $sql = "INSERT INTO user_groups (group_name, description) VALUES (?, ?)";
    query($sql, [$group_name, $description]);
}

// 分配用户到分组
function assign_user_to_group($user_id, $group_id) {
    if (!is_admin()) die("Access denied");
    $sql = "UPDATE users SET group_id = ? WHERE id = ?";
    query($sql, [$group_id, $user_id]);
}

// 示例
// update_role_permissions(2, ['manage_stores', 'view_orders']);  // 更新merchant角色
// create_group('VIP Customers', 'High-value users');
// assign_user_to_group(1, 1);
?>


5. 多商户和分店管理(merchant.php)
商户可以创建无限分店。

Code: Select all

<?php
// merchant.php - 多商户和分店
include 'db.php';
session_start();

// 检查是否商户
function is_merchant() {
    return isset($_SESSION['role_id']) && $_SESSION['role_id'] == 2;  // 假设2为merchant role
}

// 创建商户(关联用户)
function create_merchant($user_id, $merchant_name) {
    if (!is_merchant()) die("Access denied");
    $sql = "INSERT INTO merchants (user_id, merchant_name) VALUES (?, ?)";
    query($sql, [$user_id, $merchant_name]);
}

// 创建分店(无限个)
function create_store($merchant_id, $store_name, $address) {
    if (!is_merchant()) die("Access denied");
    // 检查商户所有权(实际需验证)
    $sql = "INSERT INTO stores (merchant_id, store_name, address) VALUES (?, ?, ?)";
    query($sql, [$merchant_id, $store_name, $address]);
}

// 获取商户的分店列表
function get_stores($merchant_id) {
    $sql = "SELECT * FROM stores WHERE merchant_id = ?";
    $result = query($sql, [$merchant_id]);
    return pg_fetch_all($result);
}

// 示例
// create_merchant(2, 'MyShop');
// create_store(1, 'Branch1', 'Address1');
// create_store(1, 'Branch2', 'Address2');  // 无限分店
?>



6. 对账和分账(account.php)
支持平台、商户、分店之间的对账和分账。
假设平台抽成10%,商户和分店平分剩余。

Code: Select all

<?php
// account.php - 对账分账
include 'db.php';

// 创建订单并计算分账
function create_order($user_id, $store_id, $total_amount) {
    $platform_fee = $total_amount * 0.10;  // 平台10%抽成
    $remaining = $total_amount - $platform_fee;
    $merchant_amount = $remaining * 0.50;  // 商户50%
    $store_amount = $remaining * 0.50;  // 分店50%

    $sql = "INSERT INTO orders (user_id, store_id, total_amount, platform_fee, merchant_amount, store_amount) VALUES (?, ?, ?, ?, ?, ?)";
    query($sql, [$user_id, $store_id, $total_amount, $platform_fee, $merchant_amount, $store_amount]);
    $order_id = pg_fetch_result(query("SELECT currval('orders_id_seq')"), 0, 0);

    // 记录对账
    record_account($order_id, 'platform', $platform_fee);
    record_account($order_id, 'merchant', $merchant_amount);
    record_account($order_id, 'store', $store_amount);

    return $order_id;
}

// 记录对账
function record_account($order_id, $type, $amount) {
    $sql = "INSERT INTO accounts (order_id, type, amount) VALUES (?, ?, ?)";
    query($sql, [$order_id, $type, $amount]);
}

// 结算对账(标记为已结算)
function settle_account($account_id) {
    $sql = "UPDATE accounts SET settled = TRUE, settled_at = CURRENT_TIMESTAMP WHERE id = ?";
    query($sql, [$account_id]);
}

// 获取对账报告(例如平台总收入)
function get_platform_report() {
    $sql = "SELECT SUM(amount) AS total FROM accounts WHERE type = 'platform' AND settled = FALSE";
    $result = query($sql);
    return pg_fetch_assoc($result)['total'];
}

// 示例
// create_order(1, 1, 100.00);  // 创建订单,分账计算
// settle_account(1);  // 结算
?>



7. 系统入口示例(index.php)
一个简单的入口脚本,整合以上模块。

Code: Select all

<?php
// index.php - 系统入口
include 'user.php';
include 'admin.php';
include 'merchant.php';
include 'account.php';

// 示例流程:登录 -> 创建商户 -> 创建分店 -> 下订单 -> 对账
login_user('admin', 'adminpass');
create_merchant(2, 'ShopX');
create_store(1, 'StoreA', 'AddrA');
$order_id = create_order(3, 1, 200.00);
echo "Order created: $order_id\n";
echo "Platform report: " . get_platform_report();
?>



注意事项安全:
实际中需添加更多防护,如CSRF、XSS。密码哈希已使用,但输入需始终转义。
扩展:添加商品表、购物车等功能类似以上模式。
测试:在本地环境运行,调试pg_*函数错误。
完整性:这是一个框架,实际商城需前端(HTML/JS)、支付集成(如Stripe,但需原生实现)。
如果需要特定部分扩展,请提供更多细节。
Post Reply

Return to “programmer 程式師 程序员”