dujiaoka-发卡平台
dujiaoka 是一个开源的自动发卡平台,支持多种支付方式,具有商品管理、订单处理、自动发货等功能。它可以帮助个人或小型企业快速搭建自己的数字商品销售平台,是电商创业的理想选择。
主要特性
🛒 商品管理
- 商品分类: 支持多级商品分类管理
- 库存管理: 实时库存监控和预警
- 价格设置: 支持多种价格策略和优惠券
- 商品展示: 美观的商品展示页面
💳 支付系统
- 多支付方式: 支持支付宝、微信、PayPal等
- 支付接口: 集成主流支付平台API
- 订单管理: 完整的订单生命周期管理
- 退款处理: 支持自动和手动退款
🚚 自动发货
- 卡密管理: 支持批量导入和管理卡密
- 自动发货: 支付成功后自动发送商品
- 发货通知: 邮件、短信等多种通知方式
- 发货记录: 完整的发货历史记录
🔧 管理功能
- 用户管理: 用户注册、登录、权限管理
- 数据统计: 销售数据统计和分析
- 系统设置: 灵活的系统和主题配置
- API接口: 提供RESTful API接口
项目地址
dujiaoka - Github dujiaoka - 官网安装配置
1. 环境要求
# 系统要求
- PHP >= 7.4
- MySQL >= 5.7
- Nginx/Apache
- Redis (可选)
# PHP扩展要求
- PDO PHP Extension
- OpenSSL PHP Extension
- Mbstring PHP Extension
- Tokenizer PHP Extension
- XML PHP Extension
- Ctype PHP Extension
- JSON PHP Extension
- BCMath PHP Extension
2. 安装步骤
# 1. 克隆项目
git clone https://github.com/assimon/dujiaoka.git
cd dujiaoka
# 2. 安装依赖
composer install
# 3. 复制配置文件
cp .env.example .env
# 4. 生成应用密钥
php artisan key:generate
# 5. 配置数据库
php artisan migrate
# 6. 导入基础数据
php artisan db:seed
# 7. 设置目录权限
chmod -R 755 storage/
chmod -R 755 bootstrap/cache/
3. Docker部署
# docker-compose.yml
version: '3'
services:
dujiaoka:
image: dujiaoka/dujiaoka:latest
container_name: dujiaoka
ports:
- "80:80"
environment:
- DB_HOST=mysql
- DB_DATABASE=dujiaoka
- DB_USERNAME=root
- DB_PASSWORD=password
volumes:
- ./storage:/var/www/html/storage
- ./public:/var/www/html/public
depends_on:
- mysql
- redis
mysql:
image: mysql:5.7
container_name: dujiaoka-mysql
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=dujiaoka
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:alpine
container_name: dujiaoka-redis
volumes:
mysql_data:
基础配置
1. 环境配置
# .env 配置文件
APP_NAME=Dujiaoka
APP_ENV=production
APP_KEY=base64:your-app-key
APP_DEBUG=false
APP_URL=https://your-domain.com
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=dujiaoka
DB_USERNAME=root
DB_PASSWORD=password
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=your-email@gmail.com
MAIL_PASSWORD=your-password
MAIL_ENCRYPTION=tls
2. 支付配置
// 支付宝配置
'ali' => [
'app_id' => env('ALI_APP_ID'),
'private_key' => env('ALI_PRIVATE_KEY'),
'public_key' => env('ALI_PUBLIC_KEY'),
'notify_url' => env('ALI_NOTIFY_URL'),
'return_url' => env('ALI_RETURN_URL'),
],
// 微信支付配置
'wechat' => [
'app_id' => env('WECHAT_APP_ID'),
'mch_id' => env('WECHAT_MCH_ID'),
'key' => env('WECHAT_KEY'),
'notify_url' => env('WECHAT_NOTIFY_URL'),
],
// PayPal配置
'paypal' => [
'client_id' => env('PAYPAL_CLIENT_ID'),
'client_secret' => env('PAYPAL_CLIENT_SECRET'),
'mode' => env('PAYPAL_MODE', 'sandbox'),
],
3. 邮件配置
// 邮件模板配置
'email' => [
'order_success' => [
'subject' => '订单支付成功通知',
'template' => 'emails.order_success',
],
'order_delivered' => [
'subject' => '商品发货通知',
'template' => 'emails.order_delivered',
],
'order_refund' => [
'subject' => '订单退款通知',
'template' => 'emails.order_refund',
],
],
高级功能
1. 商品管理
// 商品模型示例
class Product extends Model
{
protected $fillable = [
'name', 'description', 'price', 'stock',
'category_id', 'status', 'sort'
];
public function category()
{
return $this->belongsTo(Category::class);
}
public function cards()
{
return $this->hasMany(Card::class);
}
public function getStockAttribute($value)
{
return $this->cards()->where('status', 'unused')->count();
}
}
2. 订单处理
// 订单处理服务
class OrderService
{
public function createOrder($data)
{
DB::transaction(function () use ($data) {
// 创建订单
$order = Order::create([
'order_no' => $this->generateOrderNo(),
'user_id' => auth()->id(),
'product_id' => $data['product_id'],
'quantity' => $data['quantity'],
'total_amount' => $data['total_amount'],
'payment_method' => $data['payment_method'],
]);
// 锁定库存
$this->lockStock($order->product_id, $order->quantity);
return $order;
});
}
public function processPayment($orderId, $paymentData)
{
$order = Order::findOrFail($orderId);
// 验证支付
if ($this->verifyPayment($paymentData)) {
$order->update(['status' => 'paid']);
// 自动发货
$this->autoDeliver($order);
}
}
}
3. 自动发货
// 自动发货服务
class DeliveryService
{
public function autoDeliver($order)
{
$cards = Card::where('product_id', $order->product_id)
->where('status', 'unused')
->limit($order->quantity)
->get();
if ($cards->count() < $order->quantity) {
throw new Exception('库存不足');
}
foreach ($cards as $card) {
$card->update([
'status' => 'used',
'order_id' => $order->id,
'used_at' => now(),
]);
}
// 发送发货通知
$this->sendDeliveryNotification($order, $cards);
}
private function sendDeliveryNotification($order, $cards)
{
$data = [
'order' => $order,
'cards' => $cards,
];
Mail::send('emails.order_delivered', $data, function ($message) use ($order) {
$message->to($order->user->email)
->subject('商品发货通知');
});
}
}
使用场景
1. 数字商品销售
# 数字商品销售
适用商品:
- 游戏充值卡
- 软件激活码
- 会员账号
- 教程资料
- 虚拟货币
功能:
- 自动发货
- 库存管理
- 订单跟踪
- 售后服务
2. 在线教育
# 在线教育平台
适用场景:
- 课程销售
- 学习资料
- 考试题库
- 培训服务
功能:
- 课程管理
- 学习进度
- 证书发放
- 学习社区
3. 企业服务
# 企业服务
适用场景:
- SaaS服务
- API接口
- 技术支持
- 咨询服务
功能:
- 服务订阅
- 使用统计
- 账单管理
- 客户支持
性能优化
1. 缓存策略
// Redis缓存配置
'cache' => [
'default' => 'redis',
'stores' => [
'redis' => [
'driver' => 'redis',
'connection' => 'cache',
'lock_connection' => 'default',
],
],
],
// 缓存使用示例
class ProductService
{
public function getProduct($id)
{
return Cache::remember("product:{$id}", 3600, function () use ($id) {
return Product::with('category')->find($id);
});
}
public function getProducts($categoryId = null)
{
$key = $categoryId ? "products:category:{$categoryId}" : 'products:all';
return Cache::remember($key, 1800, function () use ($categoryId) {
$query = Product::with('category')->where('status', 'active');
if ($categoryId) {
$query->where('category_id', $categoryId);
}
return $query->orderBy('sort')->get();
});
}
}
2. 队列处理
// 队列配置
'queue' => [
'default' => 'redis',
'connections' => [
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
],
],
],
// 队列任务示例
class ProcessPaymentJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $order;
public function __construct($order)
{
$this->order = $order;
}
public function handle()
{
// 处理支付逻辑
$paymentService = new PaymentService();
$paymentService->process($this->order);
}
}
3. 数据库优化
-- 数据库索引优化
CREATE INDEX idx_orders_user_id ON orders(user_id);
CREATE INDEX idx_orders_status ON orders(status);
CREATE INDEX idx_orders_created_at ON orders(created_at);
CREATE INDEX idx_cards_product_id ON cards(product_id);
CREATE INDEX idx_cards_status ON cards(status);
-- 查询优化示例
class OrderRepository
{
public function getUserOrders($userId, $page = 1, $perPage = 20)
{
return Order::with(['product', 'cards'])
->where('user_id', $userId)
->orderBy('created_at', 'desc')
->paginate($perPage);
}
public function getPendingOrders()
{
return Order::with('product')
->where('status', 'pending')
->where('created_at', '>=', now()->subHours(24))
->get();
}
}
常见问题
Q: 如何添加新的支付方式?
A: 在支付配置中添加新的支付接口,实现相应的支付验证和回调处理逻辑。
Q: 如何处理库存不足的情况?
A: 实现库存预警机制,当库存低于设定阈值时自动发送通知,并暂停商品销售。
Q: 如何优化自动发货速度?
A: 使用队列处理发货任务,优化数据库查询,使用缓存减少重复计算。
Q: 如何实现多商户功能?
A: 在用户表中添加商户标识,在商品和订单中关联商户信息,实现商户权限管理。
总结
dujiaoka 是一个功能完善的自动发卡平台,具有以下优势:
- ✅ 完全免费开源
- ✅ 功能完善
- ✅ 易于部署
- ✅ 扩展性强
- ✅ 安全可靠
- ✅ 性能优异
dujiaoka 特别适合需要搭建数字商品销售平台的个人和企业。
使用dujiaoka时请确保遵守相关法律法规,合理使用支付接口,注意数据安全。