PHP+ VUE3机构级股票分仓管理交易系统源码可出

一、系统概述

本系统是一套**机构级股票分仓管理交易系统**,面向"机构量化分仓、资管交易、多级代理风控、聚合券商通道交易"业务场景,100% 适配 A 股全品类交易规则(T+1 交易、涨跌停限制、板块权限、新股限售、两融规则)。

系统核心能力:**多券商多证券账户聚合报单、智能拆单分配、交易员分仓管控、代理分级管理、智能跟单、精细化风控、多层级佣金结算、持仓移仓、异常风控预警**。

业务闭环:多实盘证券账户聚合 → 交易员子账户分仓 → 智能分配报单 → 全程风控拦截 → 佣金差价盈利。

二、系统组成与总体架构

系统由 **4 个部分组成 + 1 套 K 线图库资源**:

| 组成 | 技术栈 | 说明 | 默认端口 |

|------|--------|------|----------|

| `backend/` | PHP 8 + ThinkPHP 8 + MySQL | API 后端服务(后台管理 + 交易员客户端接口) | 8080 |

| `admin-web/` | Vue 3 + Vite + Element Plus | 后台管理端(运营/风控/结算) | 5173 |

| `client/` | Vue 3 + Tauri (Rust) | 交易员桌面客户端(行情 + 交易终端) | 5180(Vite)/ 1420(Tauri dev) |

| `Kline/` | umychart(银河/uFUN 金融图表库) | K 线图库原始资源,映射到 `client/public/kline/` | - |

| `database/` | MySQL DDL/Seed | `schema.sql` 建表脚本 + `seed.sql` 初始数据 | - |

2.1 整体架构分层

┌─────────────────────────────────────────────────────────┐

│ 客户端层 │

│ ├─ 桌面端 client(Vue3 + Tauri + Rust) 交易员使用 │

│ └─ 管理端 admin-web(Vue3 + Element Plus)管理员使用 │

├─────────────────────────────────────────────────────────┤

│ 接口层 backend(ThinkPHP 8) │

│ ├─ HTTP 接口:后台管理 / 交易查询 / 参数配置 │

│ └─ 长轮询推送:行情 / 成交回报 / 风控预警(push_event) │

├─────────────────────────────────────────────────────────┤

│ 业务层(服务层) │

│ ├─ 多账户聚合报单(SplitService) │

│ ├─ 下单编排(OrderService) │

│ ├─ 风控闭环(RiskService) │

│ ├─ 佣金结算 / 移仓 / 策略跟单 / 行情数据 │

│ └─ 券商网关适配(gateway/:Mock / juejin / qmt / ptrade)│

├─────────────────────────────────────────────────────────┤

│ 数据层 MySQL(InnoDB 行锁,表前缀为空) │

│ └─ 交易流水 / 资金变动 / 报单记录 / 风控日志全事务化 │

└─────────────────────────────────────────────────────────┘

2.2 技术要点
  • **后端**:控制器 → 服务层 → `think\facade\Db` 直查(项目未使用 Model 层)

  • **实时推送**:基于 `push_event` 事件日志 + HTTP 长轮询(`GET /api/trader/push-events?since_id=0`,客户端 3 秒轮询),未使用 WebSocket

  • **券商通道**:统一网关接口 `BrokerGatewayInterface`,工厂模式按通道类型创建网关;当前落地为 `MockGateway` 模拟券商(模拟委托/成交/废单回报),预留掘金(juejin)、QMT(xtquant/qmt)、PTrade 适配位

  • **行情数据**:腾讯实时行情 + 东方财富分钟 K 线(公开 HTTP 数据源,按请求触发)

  • **桌面端加密**:Rust 端定义 `pre_trade_check`(报单前置校验)、`split_order`(智能拆单)两个 Tauri command 并注册

三、目录结构总览

GPfencang/

├── backend/ # ThinkPHP 8 后端

│ ├── app/

│ │ ├── controller/

│ │ │ ├── admin/ # 后台管理端控制器(17 个)

│ │ │ └── trader/ # 交易员客户端控制器(5 个)

│ │ ├── service/ # 业务服务层

│ │ │ ├── gateway/ # 券商网关适配(Mock/juejin/qmt/ptrade)

│ │ │ ├── OrderService.php # 下单编排

│ │ │ ├── SplitService.php # 智能拆单

│ │ │ ├── RiskService.php # 风控闭环

│ │ │ ├── MarketDataService.php # 行情数据

│ │ │ ├── PushService.php # 长轮询推送

│ │ │ ├── TaskSchedulerService.php# 定时任务

│ │ │ └── TradingCalendarService.php # 交易日历

│ │ ├── middleware/ # AdminAuth / TraderAuth / Cors

│ │ ├── command/TaskRun.php # php think task:run 定时任务命令

│ │ ├── tasks.php # 定时任务注册表

│ │ └── listener/TaskBootstrap.php # 启动加载任务

│ ├── route/app.php # 全部 API 路由

│ ├── config/ # 框架配置(database.php 等)

│ ├── public/ # 入口 index.php

│ ├── .env # 数据库/JWT 配置

│ └── think # ThinkPHP CLI 入口

├── admin-web/ # 后台管理端(Vue3 + Vite + Element Plus)

│ └── src/

│ ├── views/ # 15 个功能页面 + 登录页

│ ├── router/index.js # 路由表

│ ├── api/ # 接口封装(/admin/xxx)

│ ├── stores/user.js # Pinia 用户状态

│ └── layouts/AdminLayout.vue # 主布局

├── client/ # 交易员桌面客户端(Vue3 + Tauri)

│ ├── src/

│ │ ├── views/ # login / trade(交易终端)/ personal(个人中心)

│ │ ├── components/KLineChart.vue # K线组件(复用 umychart)

│ │ ├── utils/push.js # 长轮询推送

│ │ └── layouts/MainLayout.vue # 主布局

│ └── src-tauri/ # Rust 后端(lib.rs 定义 Tauri commands)

├── Kline/ # umychart K线图库资源(klineFs.html 演示页)

├── database/

│ ├── schema.sql # 建库建表脚本(约 41 张表/视图)

│ └── seed.sql # 初始数据

├── start_all.bat # 一键启动(后端 + 客户端)

├── start_backend.bat # 启动后端

└── stop_all.bat # 一键停止相关进程

四、功能模块说明
4.1 后台管理端(admin-web,共 15 个功能模块)

| 模块 | 路由 | 功能说明 |

|------|------|----------|

| 首页统计 | `/dashboard` | 大盘数据看板:账户数、证券通道数、当日成交、平台资金/持仓/盈亏、风控预警数、佣金收益 |

| 证券账户 | `/securities` | 实盘证券账户多账户体系:批量新增/编辑/启停/删除,含下单模式、券商通道、资金账号、沪/深股东代码、费率、板块持仓比例限制 |

| 通道分组 | `/channel` | 证券通道分组(报单规则):优先级规则、循环报单开关、绑定证券账户、网关状态监控/测试 |

| 交易记录 | `/trade` | 委托/成交查询、多账户下单、撤单、CSV 导出、证券账户原始委托/成交对账 |

| 风控管理 | `/risk` | 风控组/规则配置、持仓比例组、报警中心(安全度监控)、禁开仓/解禁、一键/批量平仓 |

| 交易账户 | `/trader` | 交易员子账户:增删改、资金杠杆(劣后/优先/预警线/平仓线)、出入金、持仓/资金流水、账户分析、状态管控(禁止开仓等) |

| 移仓管理 | `/transfer` | 持仓跨实盘账户迁移:出/入仓账户、标的指定、手动执行、移仓日志 |

| 佣金结算 | `/commission` | 佣金组费率模板、平台维度/用户维度佣金统计(佣金差价 = 平台净收益) |

| 策略管理 | `/strategy` | 策略发布/审核/下架、策略申请审核、跟随列表、参数设置 |

| 跟单管理 | `/copytrade` | 智能跟单记录:跟单用户/标的/倍数/类型/状态,启停/编辑/删除 |

| 代理管理 | `/agent` | 代理层级、上下级关系、下属用户数、返佣数据、返佣比例配置 |

| 异常数据 | `/exception` | 异常统一归集:交易/报单/通道/风控/对账/移仓异常,检索/处理/导出 |

| 系统设置 | `/system` | 管理员/角色/RBAC 权限/登录日志/全局配置(如"是否展示手续费"开关) |

| 定时任务 | `/task` | 任务列表查看、手动触发执行 |

| 交易日历 | `/calendar` | 交易日判断、节假日设置 |

4.2 交易员桌面客户端(client)

| 页面 | 功能说明 |

|------|----------|

| 登录页 `/login` | 交易账号登录 |

| 交易终端 `/trade` | 行情 + 交易一体化:股票信息、自选列表、指数行情、K 线(分时/五日/多周期)、五档盘口、AI 个股技术面分析;买入/卖出下单(交易时段限制、数量/资金校验);底部标签(持仓/委托/撤单)、右侧标签(持仓/撤单/成交/查询:资金股份、当日委托、当日成交、资金流水) |

| 个人中心 `/personal` | 资金流水、佣金明细、跟单配置、策略权限 |

客户端特性:自动适配后台"手续费展示开关"、下单前置校验(涨跌幅/新股/ST/持仓比例限制)、实时接收风控预警与禁止交易权限推送、多通道报单/拆单用户无感。

五、核心业务逻辑
5.1 多账户聚合报单(SplitService)
  1. 订单进入 → `OrderService::place()` 编排

  2. **事前风控拦截**(`RiskService::preCheck`):涨跌幅、新股、ST 股、持仓比例、资金校验

  3. **智能拆单**(`SplitService`):按通道分组优先级降序贪心拆分 → 单账户可用资金 = min(实际可用余额, 板块比例限制折算可用余额) → 同优先级最小笔数随机分配 → 两融标的优先匹配融资融券账户 → 开启循环报单时按优先级循环轮询

  4. 所有绑定账户合计资金不足 → 整笔废单

  5. 网关报单 → 委托 + 子报单 + 成交落库 → 资金冻结/结算 → 持仓更新 → **事后风控扫描**(`RiskService::postCheck`)

5.2 精细化风控闭环(RiskService)

三级风控体系:**事前参数限制、事中实时拦截、事后预警强平**

  • 单票亏损提醒(默认 20%)

  • 总资产预警线提醒 / 平仓线全自动强平

  • 历史最大回撤提醒/强平(默认 10%)、当日最大回撤强平(默认 6%)

  • 余额不足延迟报单(默认 5 分钟重试)

  • 板块涨跌幅限买:北交所 ±28%、科创/创业板 ±19%、沪深 A 股 ±9.5%

  • 新股限买(默认上市 30 天内禁买)、ST 股限买(S/ST/*ST/S*ST/SST)

  • 持仓比例组:按资金范围限制单票/各板块最大持仓占比

  • 报警中心安全度 = 客户自由资金 / 持仓市值,支持一键/批量平仓、禁开仓、解禁

5.3 多层级佣金结算

结算链路:**券商报单成本 − 用户交易收费 = 平台佣金差价收益**,区分平台维度(`commission_statistics`)与用户维度(`user_commission_statistics`)双向统计,支持差异化佣金组(`commission_group` + `commission_group_rate`)。

5.4 移仓业务

跨实盘账户无损迁移持仓:出仓账户 → 入仓账户,同步成本、市值、可用数量,全程记录 `transfer_log` 移仓日志,移仓后双向对账保证数据一致。

5.5 策略与跟单

策略发布 → 交易员申请 → 后台审核 → 分配账户权限 → 绑定使用范围;交易员可配置智能跟单(跟单总开关、目标交易账号、跟单类型仅跟委托/委托+撤单/全成或撤单/成交即跟单、跟单倍数)。

六、数据库设计
  • 数据库名:`fencang`(MySQL,字符集 `utf8mb4`,InnoDB,表前缀**空**)

  • 建表脚本:`database/schema.sql`(约 41 张表/视图)

  • 初始数据:`database/seed.sql`

  • 金额字段 `decimal(20,4)`,比例/费率 `decimal(10,4)`,主键 `bigint unsigned`,软删除 `deleted_at`

核心数据表:

| 分组 | 表 |

|------|-----|

| 系统/后台 | `sys_config`、`admin_user`、`admin_role`、`admin_permission`、`admin_role_permission`、`admin_login_log` |

| 证券/通道/移仓 | `broker`、`securities_account`、`channel_group`、`channel_group_account`、`transfer_task`、`transfer_log`、`exception_log` |

| 交易/资金 | `order`、`trade`、`securities_order`、`securities_trade`、`trader`、`trader_fund_flow`、`trader_position`、`securities_position` |

| 策略/跟单 | `strategy`、`strategy_application`、`strategy_follow`、`strategy_param`、`copy_trade` |

| 佣金 | `commission_group`、`commission_group_rate`、`commission_statistics`、`user_commission_statistics` |

| 风控 | `risk_group`、`risk_rule`、`position_ratio_group`、`position_ratio_rule`、`risk_alarm`、`risk_alert` |

| 代理/推送 | `agent`、`push_event` |

| 视图 | `v_daily_trade_stat` |

七、API 接口概览

后端路由统一前缀 `/api`,分为两大分组:

7.1 后台管理端 `GET/POST /api/admin/*`

公开接口:`POST /api/admin/login`(管理员登录)

鉴权接口(`AdminAuth` 中间件,请求头携带管理员 Token):

| 分组 | 主要接口 |

|------|----------|

| 认证 | `me`、`logout` |

| 看板 | `dashboard` |

| 证券账户 | `securities-account`(CRUD + `batch-status`) |

| 通道分组 | `channel-group`(CRUD + `gateway-status`、`test-gateway`) |

| 交易 | `order/place`、`order/cancel`、`order`、`order/trades`、`order/export`、`order/securities-orders`、`order/securities-trades` |

| 风控 | `risk/group`、`risk/alarm`、`risk/scan`、`risk/forbid/:trader_id`、`risk/unblock/:trader_id`、`risk/liquidate`、`risk/batch-liquidate` |

| 交易账户 | `trader`(CRUD + `fund-flow`、`position`、`analysis`、`fund`) |

| 代理 | `agent`(CRUD + `statistics`、`all`) |

| 移仓 | `transfer`(CRUD + `:id/execute`、`:id/logs`) |

| 持仓 | `position/summary`、`position/compare` |

| 佣金 | `commission/group`、`commission/platform`、`commission/user` |

| 策略 | `strategy`(CRUD + `:id/application`、`application/:id/audit`、`:id/follow`、`param`) |

| 跟单 | `copytrade`(CRUD + `:id/toggle`) |

| 异常 | `exception`(CRUD + `batch-handle`、`export`) |

| 系统 | `system/admin`、`system/role`、`system/permission`、`system/login-log`、`system/config` |

| 任务 | `tasks`、`tasks/run` |

| 日历 | `trading-calendar`(`today`、`set-holiday`) |

7.2 交易员客户端 `GET/POST /api/trader/*`

公开接口:`login`、`config`、`trading-time`

鉴权接口(`TraderAuth` 中间件,Token 缓存 `trader_token_`):

| 接口 | 说明 |

|------|------|

| `logout` / `me` | 登出 / 当前用户 |

| `assets` | 账户资产 |

| `place` / `cancel` | 下单 / 撤单 |

| `orders` / `positions` | 委托列表 / 持仓 |

| `fund-flow` / `commission` | 资金流水 / 佣金明细 |

| `copy-config` | 跟单配置 |

| `strategies` | 可用策略 |

| `ai-analysis` | AI 个股技术面分析(MA/MACD/RSI/KDJ/BOLL 指标评分) |

| `push-events` | 长轮询推送(行情/成交/风控预警) |

| `quote` / `quotes` / `kline` / `minute-kline` | 行情 / 批量行情 / 日K线 / 分钟K线 |

7.3 鉴权与安全
  • 管理员登录:`POST /api/admin/login`,返回 Token(JWT,密钥/过期时间在 `.env` 配置,默认 7200 秒)

  • 前后端 Token 通过 axios 拦截器注入请求头

  • 后端对报单/资金/移仓/风控等敏感操作二次校验,敏感操作留存日志

八、部署与启动
8.1 环境要求

| 依赖 | 版本要求 |

|------|----------|

| PHP | 8.0+(推荐 8.1/8.2),需加入 PATH |

| MySQL | 5.7+ / 8.x,数据库 `fencang` |

| Composer | 依赖 `backend/vendor`(缺失时 `composer.phar` 自动安装) |

| Node.js | 18+(admin-web 与 client 构建/运行 Vite) |

| Rust | 仅打包 client 桌面端时需要(`npm run tauri build`) |

8.2 数据库初始化

-- 使用 MySQL 执行(先建库,再建表,最后导入初始数据)

CREATE DATABASE IF NOT EXISTS `fencang` DEFAULT CHARACTER SET utf8mb4;

SOURCE database/schema.sql; -- 建表

SOURCE database/seed.sql; -- 初始数据

```

数据库连接在 `backend/.env` 配置:

```ini

DB_HOST = 127.0.0.1

DB_NAME = fencang

DB_USER = root

DB_PASS = Fencang@2026

DB_PORT = 3306

```

8.3 定时任务

通过 CLI 命令触发,需配置系统 cron(Windows 可用"任务计划程序"):

```bash

查看任务列表

php think task:run --list

执行单个任务

php think task:run --task=dailySettlement

执行全部任务

php think task:run --task=all

```

已注册任务(`app/tasks.php`):

| 任务 | 说明 |

|------|------|

| `dailySettlement` | 每日资金结算快照 |

| `commissionCalc` | 佣金统计 |

| `riskRefresh` | 风控数据刷新 / 安全度计算 |

| `autoCancel` | 超时委托自动撤单(30 分钟) |

| `dataCleanup` | 数据清理(30 天过期日志) |

| `positionSync` | 持仓同步(占位,待对接真实券商) |

cron 示例(工作日 16:30 结算):`30 16 * * 1-5 php /path/to/backend/think task:run --task=dailySettlement`

8.4 后台任务页

管理后台「定时任务」页面(`/task`)可查看任务列表并手动触发执行。

九、K 线图库说明
  • `Kline/` 目录为 **umychart**(银河/uFUN 专业金融图表库)原始资源:`klineFs.html` 为独立演示页(用于单独调试 K 线行情图,含 K 线主图、右侧盘口、指标编辑器),`NetworkFilter.js` 为模拟行情数据源,`jscommon/` 为全部库脚本

  • 客户端通过 `/kline/jscommon` 路径动态加载该图库绘制 K 线(`client/src/components/KLineChart.vue`),并注册自定义指标(FROMOPEN、TICKCOUNT、MONEY 等)

  • `Kline` 目录内容映射到 `client/public/kline/` 作为静态资源

十、常见问题

| 问题 | 处理方式 |

|------|----------|

| 后端端口被占用 | `start_backend.bat` 会自动检测并提示结束占用进程;也可手动 `netstat -ano \| findstr :8080` 定位后结束 |

| 管理后台 API 报 502 | 检查 `admin-web/vite.config.js` 代理 `target` 是否为 `http://127.0.0.1:8080`(后端实际端口),修改后重启 Vite |

| 客户端连不上后端 | 打包环境访问 `http://127.0.0.1:8080/api\`,需确保后端已启动;开发环境走 Vite 代理 |

| 数据库连接失败 | 确认 MySQL 已启动、`backend/.env` 账号密码正确、已执行 `database/schema.sql` 建库 |

| 启动报 vendor 缺失 | 在 `backend` 目录执行 `php ..\composer.phar install` |

| 未找到 client.exe | 在 `client` 目录执行 `npm run tauri build` 打包后再启动 |

十一、版本与演进说明

当前实现以**可运行闭环**为目标:

  • 券商通道为 **Mock 模拟实现**(模拟委托/成交/废单回报),接入真实券商时在 `app/service/gateway/` 下实现 `BrokerGatewayInterface` 并注册到 `GatewayFactory`

  • 实时推送采用 **长轮询**(push_event 事件表),代码注释已预留替换为 Swoole/Workerman WebSocket 的演进方向

  • 行情数据来自腾讯/东方财富公开 HTTP 接口,生产环境可替换为付费行情源

  • Rust 端 `pre_trade_check` / `split_order` 命令已注册,前端当前在 JS 层实现校验,后续可切换为 Rust 校验

相关推荐
爱奥尼欧1 小时前
10.C++ string 实现详解
java·开发语言·c++
骇客野人1 小时前
Java分布式任务调度方案(完整落地指南)
java·开发语言·分布式
JacksonMx1 小时前
Spring @Async 坑点 + 改造方案
java·开发语言
你怎么知道我是队长1 小时前
IPv6 地址完全解析:从结构到实战
开发语言·php
Dovis(誓平步青云)1 小时前
牛奶不能减成负数:冰箱库存的筛选、去重与不可变更新
android·java·开发语言
OPEN-F2 小时前
Python进阶教程:算法与数据结构入门
开发语言·python
薛定猫AI2 小时前
【技术干货】Claude Code多模型代理与反馈闭环:Python实现可验证的AI编程工作流
开发语言·python·ai编程
XR1234567882 小时前
工厂车间无线网络怎么选?AGV 与复杂环境是分水岭
开发语言·php
zq_63892 小时前
利用 MATLAB 调用 STK Object Model COM 显示雷达受干扰前后探测范围的变化
开发语言·matlab