在线商城系统框架(使用原生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,但需原生实现)。
如果需要特定部分扩展,请提供更多细节。