-- 充值订单表
php
CREATE TABLE IF NOT EXISTS `xh_member_recharge` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`memberId` int(11) NOT NULL COMMENT '用户ID',
`amount` decimal(12,2) NOT NULL COMMENT '充值金额',
`pay_type` varchar(20) NOT NULL COMMENT '支付方式(alipay/wechat/llpay/bank)',
`order_no` varchar(50) NOT NULL COMMENT '订单号',
`trade_no` varchar(100) DEFAULT '' COMMENT '第三方交易号',
`status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0=待支付,1=已支付,2=失败',
`pay_time` datetime DEFAULT NULL COMMENT '支付时间',
`createTime` datetime NOT NULL,
`ip` varchar(50) DEFAULT '' COMMENT '客户端IP',
PRIMARY KEY (`id`),
UNIQUE KEY `order_no` (`order_no`),
KEY `memberId` (`memberId`),
KEY `status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会员充值订单';
-- 可选:API请求日志表(用于调试和限流)
CREATE TABLE IF NOT EXISTS `xh_api_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`memberId` int(11) DEFAULT NULL COMMENT '用户ID(如果已登录)',
`uri` varchar(200) NOT NULL COMMENT '请求URI',
`method` varchar(10) NOT NULL COMMENT 'HTTP方法',
`params` text COMMENT '请求参数(JSON)',
`ip` varchar(50) DEFAULT '' COMMENT '客户端IP',
`user_agent` varchar(500) DEFAULT '' COMMENT 'User Agent',
`response_time` decimal(10,3) DEFAULT NULL COMMENT '响应时间(毫秒)',
`createTime` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `memberId` (`memberId`),
KEY `uri` (`uri`(100)),
KEY `createTime` (`createTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='API请求日志';

r
<view class="section" v-if="stockData">
<view class="data-grid-4x4">
<view class="d-cell">
<text class="d-label">最高</text>
<text class="d-value" :class="stockData.high > stockData.yest_close ? 'color-up' : ''">{{ fmtMoney(stockData.high) }}</text>
</view>
<view class="d-cell">
<text class="d-label">今开</text>
<text class="d-value">{{ fmtMoney(stockData.open) }}</text>
</view>
<view class="d-cell">
<text class="d-label">涨停</text>
<text class="d-value color-up">{{ fmtMoney(stockData.limit_up) }}</text>
</view>
<view class="d-cell">
<text class="d-label">成交量</text>
<text class="d-value">{{ fmtVol(stockData.vol) }}手</text>
</view>
<view class="d-cell">
<text class="d-label">最低</text>
<text class="d-value" :class="stockData.low < stockData.yest_close ? 'color-down' : ''">{{ fmtMoney(stockData.low) }}</text>
</view>
<view class="d-cell">
<text class="d-label">昨收</text>
<text class="d-value">{{ fmtMoney(stockData.yest_close) }}</text>
</view>
<view class="d-cell">
<text class="d-label">跌停</text>
<text class="d-value color-down">{{ fmtMoney(stockData.limit_down) }}</text>
</view>
<view class="d-cell">
<text class="d-label">成交额</text>
<text class="d-value">{{ fmtAmt(stockData.amount) }}</text>
</view>
<view class="d-cell">
<text class="d-label">换手率</text>
<text class="d-value">{{ stockData.turnover_rate }}%</text>
</view>
<view class="d-cell">
<text class="d-label">振幅</text>
<text class="d-value">{{ stockData.amplitude }}%</text>
</view>
<view class="d-cell">
<text class="d-label">量比</text>
<text class="d-value">{{ stockData.volume_ratio }}</text>
</view>
<view class="d-cell">
<text class="d-label">总市值</text>
<text class="d-value">{{ fmtMv(stockData.total_mv) }}</text>
</view>
<view class="d-cell">
<text class="d-label">市盈率(动)</text>
<text class="d-value">{{ stockData.pe_dynamic }}</text>
</view>
<view class="d-cell">
<text class="d-label">市净率</text>
<text class="d-value">{{ stockData.pb }}</text>
</view>
<view class="d-cell">
<text class="d-label">52周最高</text>
<text class="d-value color-up">{{ fmtMoney(stockData.week_52_high) }}</text>
</view>
<view class="d-cell">
<text class="d-label">52周最低</text>
<text class="d-value color-down">{{ fmtMoney(stockData.week_52_low) }}</text>
</view>
</view>
</view>


K线图接口:
根因:东财 push2his.eastmoney.com 的 K线接口对服务器 IP 段做了限制(无论 IPv4/IPv6 都返回空响应),但 push2.eastmoney.com 的实时行情接口正常。
修复方案:将 _getEmKLineData 改为双数据源:
周期数据源域名日K/周K/月K对接的是 腾讯财经 web.ifzq.gtimg.cn
5分/15分/30分/60分对接的是 新浪财经 money.finance.sina.com.cn
返回格式({code:"0", data:{time,open,close,high,low,vol,amount}})

K线图使用的是HQChart框架
php
function setWhiteStyle() {
var whiteStyle = HQChart.Chart.HQChartStyle.GetStyleConfig(HQChart.Chart.STYLE_TYPE_ID.LIGHT_ID)
HQChart.Chart.JSChart.SetStyle(whiteStyle)
var el = document.getElementById('klineChart')
if (el) el.style.backgroundColor = whiteStyle.BGColor
}
初始化方式 HQChart.Chart.JSChart.Init(el)
库引入 import HQChart from 'hqchart'(npm包)
架构 逻辑层 Options API + renderjs 视图层
通信 prop/change:prop 双向通信模式
数据获取 renderjs 层直接用 fetch(DOM环境)
K线↔分时切换 先销毁旧类型图表 → 清除DOM → 创建新类型
窗口指标 MA + VOL + MACD(3窗口)
Tooltip KLineTooltip / MinuteTooltip(手机端)

html
<template>
<view class="page-watchlist">
<view class="top-bar">
<text class="page-title">自选</text>
<text class="edit-btn" v-if="watchlist.length" @click="editing = !editing">
{{ editing ? '完成' : '编辑' }}
</text>
</view>
<!-- 加载中 -->
<view class="loading-wrap" v-if="loading && !watchlist.length">
<text class="loading-text">加载中...</text>
</view>
<!-- 自选列表 -->
<view class="section" v-else-if="watchlist.length">
<view
class="watch-item"
v-for="(item, idx) in watchlist"
:key="item.code"
@click="goDetail(item)"
>
<view class="watch-info">
<text class="watch-name">{{ item.name || '--' }}</text>
<text class="watch-code">{{ item.code }}</text>
</view>
<view class="watch-quote" v-if="watchlistQuotes[item.code]">
<text class="quote-price" :class="getColorClass(watchlistQuotes[item.code].diffRate)">
{{ fmtMoney(watchlistQuotes[item.code].price) }}
</text>
<view class="quote-change-row" :class="getColorClass(watchlistQuotes[item.code].diffRate)">
<text class="quote-diff-money">
{{ formatDiffMoney(watchlistQuotes[item.code].diffMoney) }}
</text>
<text class="quote-diff-rate">
{{ formatPercent(watchlistQuotes[item.code].diffRate) }}
</text>
</view>
</view>
<view class="watch-quote" v-else>
<text class="quote-price" style="color:#999">--</text>
</view>
<text class="delete-btn" v-if="editing" @click.stop="removeItem(item)">✕</text>
</view>
</view>
<!-- 空状态 -->
<empty-state v-else text="暂无自选股票">
<button class="btn-search" @click="goSearch">去搜索添加</button>
</empty-state>
</view>
</template>


大盘指数
html
<view class="section">
<view class="section-title">大盘指数</view>
<scroll-view scroll-x class="index-scroll" v-if="indices.length">
<view class="index-cards">
<view class="index-card" v-for="item in indices" :key="item.code" @click="goDetail(item.code)">
<text class="idx-name">{{ item.name }}</text>
<text class="idx-price" :class="getColorClass(item.pct_chg || item.diff_rate)">
{{ formatPrice(item.price) }}
</text>
<view class="idx-change" :class="getColorClass(item.pct_chg || item.diff_rate)">
<text class="idx-diff">{{ formatDiffMoney(item.change || item.diff_money) }}</text>
<text class="idx-pct">{{ formatPercent(item.pct_chg || item.diff_rate) }}</text>
</view>
</view>
</view>
</scroll-view>
<empty-state v-else text="加载中..." />
</view>
关键逻辑说明:
- 实时计算:函数基于最新的市场行情和持仓数据,实时计算账户净值、浮动盈亏等关键指标。
- 风险度计算 :通过
风险度 = (总负债 + 持仓市值) / 账户净值公式量化账户风险水平。 - 多层风控 :
- 警戒线检查:当保证金比例低于预设警戒线时,触发预警机制,通知用户追加保证金。
- 平仓线检查:当保证金比例低于平仓线时,自动触发平仓流程,保护资金方安全。
- 可扩展性 :实际系统中可在此基础上添加更多风控维度,如:
- 单票集中度限制
- 行业风险暴露控制
- 波动率调整的风险系数
- 基于历史回测的动态风险阈值
这个简化示例展示了风控引擎的核心逻辑,实际生产系统需要结合高性能计算、分布式架构和实时数据流处理,确保在毫秒级完成全账户风险扫描。
3.3 极速稳定的交易体验
- 多券商接入:支持对接主流券商,提供稳定的交易通道。
- 模拟交易:提供虚拟资金盘,供新手练习,降低入门门槛。
- 条件单/止损止盈:支持预设价格触发交易,帮助投资者严格执行策略。
- 行情数据:集成Level-2高速行情,分时、K线、盘口数据一应俱全。
3.4 透明高效的清算与对账
- 日终自动清算:每日结算利息、管理费,生成清晰对账单。
- 资金流水可溯:每一笔充值、提现、交易、费用都有据可查。
- 财务报表:自动生成运营方所需的各类财务报表,便于决策。
3.5 强大的运营后台
- 数据驾驶舱:关键运营数据(用户数、交易量、资金流水、盈亏情况)可视化呈现。
- 灵活配置:杠杆比例、费率、活动规则等均可通过后台动态调整。
- 客户服务:集成工单系统,方便处理用户咨询与投诉。
四、技术架构选型与开发要点
开发一个高可用的配资系统,技术选型至关重要。
前端技术栈推荐:
- Web端:Vue 3 / React + TypeScript + Element Plus / Ant Design
- 移动端:Uni-app / React Native 或原生开发(iOS & Android),实现一套代码多端发布。
后端技术栈推荐:
- 核心后端:架构便于解耦与扩容。
- 数据库:MySQL(业务数据)+ Redis(缓存、会话)+ MongoDB(日志、行情数据)。
- 消息队列:RabbitMQ / Kafka,用于处理订单、风控等异步高并发场景。
- 行情与交易:编写高性能网关,直接对接交易所或券商API。
安全与运维:
- 网络安全:全站HTTPS,敏感信息加密传输,防SQL注入、XSS攻击。
- 资金安全:与银行或第三方支付机构合作,实现资金托管,杜绝资金池。
- 部署与监控:使用Docker容器化部署,配合K8s进行集群管理。集成Prometheus + Grafana进行系统监控。