简介:这是一套面向金融行业开发者与技术团队的股票基金类投资理财系统二开源码,适用于公募、私募等合规金融场景的快速原型搭建与定制化开发。资源基于ThinkPHP框架构建,包含完整前后台架构,支持域名分离部署与数据库配置灵活适配,适合具备PHP+MySQL基础的中高级开发者进行二次开发与业务逻辑扩展。压缩包共1653个文件,主体为354个PHP后端逻辑文件、580个JS前端交互脚本、255个PNG图标及UI资源、145个HTML页面模板,辅以CSS/SCSS样式、SQL初始化脚本及文档类文件(md、txt、license等),整体体积43.87MB,结构清晰、模块划分明确。目前已有44人学习下载,资源内含可直接运行的后台管理入口(/admin)、前台展示模板及全局域名替换指引,同时预览文件显示包含Bootstrap、Font Awesome、EditorMD等主流前端组件,便于快速集成与界面优化。
1. 这不是又一个“理财网站模板”,而是一套可落地的金融业务中台源码体系
很多团队拿到所谓“投资理财源码”后,第一反应是改个LOGO、换套CSS就上线——结果用户注册失败、基金净值同步中断、私募产品无法上架。这套二开投资理财股票基金源码支持公募私募源码.zip的核心价值,恰恰在于它默认就按双域隔离架构设计:前台面向C端投资者展示产品、行情与交易入口;后台专为持牌机构(公募/私募管理人)提供合规运营能力,包括产品准入审核、份额登记、净值录入、风险揭示文件管理等关键模块。它不依赖SaaS平台黑盒逻辑,所有数据库表结构、API路由、权限校验点全部开放,PHP7.2+MySQL5.6环境可直接部署,但真正决定能否跑通的,是两处必须手动干预的硬性约束:一是前后台域名必须物理隔离(不能共用子域名),二是后台数据库配置与前台数据源必须严格区分——这正是当前90%二开失败案例的根源。适合已有金融牌照或正在申请牌照的团队,用于快速搭建自有品牌投教平台、私募直销门户或基金代销中间层。
2. 双域部署实操:从解压到伪静态生效的完整链路
2.1 后台部署:创建独立域名并完成基础配置
提示:后台域名必须与前台域名完全独立(如
admin.yourfund.com与www.yourfund.com),禁止使用www.yourfund.com/admin路径方式部署,否则权限校验和CSRF防护将失效。
首先创建后台专属域名(以admin.fundcorp.cn为例),在Web服务器(Nginx/Apache)中为其配置独立站点。上传源码压缩包后,在服务器端执行解压:
unzip "二开投资理财股票基金源码支持公募私募源码.zip" -d /var/www/admin.fundcorp.cn/进入后台目录,定位数据库配置文件路径:/var/www/admin.fundcorp.cn/后台/config/database.php。该文件采用ThinkPHP 5.1标准格式,需修改以下4个关键参数:
| 参数名 | 示例值 | 说明 |
|---|---|---|
hostname | 127.0.0.1 | 数据库IP,生产环境建议使用内网地址而非localhost |
database | fund_admin_db | 必须新建独立数据库,不可与前台共用 |
username | fund_admin_user | 建议创建专用账号,仅授予该库SELECT/INSERT/UPDATE权限 |
password | StrongPassw0rd!2024 | 密码需含大小写字母+数字+特殊字符,长度≥10位 |
修改完成后,检查public目录是否为Web服务根目录。若使用Nginx,需在server块中显式指定:
root /var/www/admin.fundcorp.cn/后台/public; index index.php;伪静态规则必须启用ThinkPHP内置方案,Nginx配置段如下:
location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?s=/$1 last; } }Apache用户则需确保.htaccess文件存在于public目录且mod_rewrite已启用。
2.2 前台部署:替换硬编码域名并验证路由映射
前台部署需另起一个域名(如www.fundcorp.cn),解压源码至对应目录:
unzip "二开投资理财股票基金源码支持公募私募源码.zip" -d /var/www/www.fundcorp.cn/关键动作是全局替换所有www.ohltk.com字符串。该域名在源码中出现于3类位置:
- 前端AJAX请求URL(如
js/common.js中的apiUrl: "https://www.ohltk.com/api/v1/...") - 后台管理链接跳转(如
templates/index.html中的<a href="https://www.ohltk.com/admin">) - 静态资源CDN路径(如
style.css中的background: url(https://www.ohltk.com/static/img/logo.png))
执行精准替换命令(Linux/macOS):
grep -rl "www.ohltk.com" /var/www/www.fundcorp.cn/ | xargs sed -i 's/www\.ohltk\.com/admin\.fundcorp\.cn/g'注意:
sed -i在macOS下需加空参数sed -i '',否则报错;替换后务必检查public/static/js/下JS文件是否残留未替换的URL。
前台Web根目录同样设为public,Nginx配置中启用ThinkPHP伪静态(同后台配置)。启动服务后访问http://www.fundcorp.cn,若首页正常加载且控制台无404请求,则前台路由映射成功。
2.3 数据库初始化与表结构验证
源码未包含SQL导入脚本,所有表结构均通过ThinkPHP Migration机制生成。需在后台目录执行命令行迁移:
cd /var/www/admin.fundcorp.cn/后台 php think migrate:run该命令会自动创建17张核心表,重点验证以下3张表是否存在且字段完整:
| 表名 | 关键字段 | 用途说明 |
|---|---|---|
fund_product | id,code,name,type(0=公募/1=私募),status(0=草稿/1=上架) | 产品主表,type字段直接控制前端展示策略 |
fund_nav | product_id,nav_date,nav_value,acc_nav | 净值表,nav_date为DATE类型,非DATETIME |
user_account | uid,balance,frozen_balance,currency(CNY/USD) | 账户余额表,frozen_balance用于交易冻结资金 |
若迁移失败,常见原因为MySQL 5.6默认严格模式(STRICT_TRANS_TABLES)导致TEXT字段缺失DEFAULT值。临时关闭方法:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'STRICT_TRANS_TABLES',''));3. 公募与私募产品差异化配置实现原理
3.1 产品类型标识与前端渲染逻辑分离
源码中公募与私募产品的分流并非靠不同控制器,而是通过fund_product.type字段值触发条件渲染。查看前台模板public/templates/product_list.html,关键代码段如下:
<!-- 产品卡片 --> <div class="product-card"><input type="hidden" name="type" value="0" id="product-type"> <!-- 页面JS根据用户角色动态修改value --> <script> // 检查当前登录用户所属机构类型 if (user.org_type === 'private') { $('#product-type').val(1); // 强制设为私募 $('.field-est-nav').hide(); // 隐藏公募专属字段 } </script>该逻辑位于public/static/js/admin/product.js第87行。若需允许同一后台管理两类产品,需注释掉上述JS判断,并在数据库auth_rule表中为管理员角色添加product/type=1权限节点。
3.3 私募合格投资者认证流程嵌入点
私募产品购买前必须完成合格投资者认证,源码在public/templates/product_detail.html中预留了钩子:
<!-- 认证状态检查 --> <div id="investor-cert-check"> {if condition="!$cert_status"} <a href="{:url('cert/index')}" class="btn btn-primary">立即完成合格投资者认证</a> {else/} <button class="btn btn-success" onclick="buyProduct({$vo.id})">认购该产品</button> {/if} </div>cert/index对应控制器app\controller\Cert.php,其核心逻辑在checkQualification()方法中:
- 查询
user_qualification表中uid对应记录 - 验证
cert_date是否在3年内且cert_status=1 - 若未认证,跳转至
cert/apply页面填写资产证明(支持PDF上传)
该流程符合《私募投资基金监督管理暂行办法》第十二条要求,但需注意:上传的PDF文件存储路径为public/uploads/cert/,生产环境必须配置独立OSS存储并关闭该目录的PHP执行权限。
4. 二开关键路径:从行情对接到风控规则引擎嵌入
4.1 股票/基金行情数据接入改造点
源码默认行情数据来自模拟接口http://mock-api.fundcorp.cn/market,实际对接需修改app\common\service\MarketService.php。关键方法getStockQuote($code)返回结构如下:
return [ 'code' => $code, 'name' => '贵州茅台', 'price' => 1723.50, 'change_percent' => 1.25, 'volume' => 245800, 'time' => date('Y-m-d H:i:s') ];若对接Wind或聚宽API,需重写此方法。以聚宽Python SDK为例,需在服务器安装jqdatasdk:
pip install jqdatasdk然后在PHP中调用Python脚本(需开启shell_exec):
// app\common\service\MarketService.php public function getStockQuote($code) { $result = shell_exec("python3 /data/scripts/jq_quote.py {$code}"); return json_decode($result, true); }对应Python脚本/data/scripts/jq_quote.py内容:
import sys, jqdatasdk as jq from jqdatasdk import * # 生产环境需替换为真实账号 auth('13800138000', 'password123') code = sys.argv[1] quote = get_price(code, count=1, end_date=None, frequency='1m', fields=['open','close','high','low','volume']) print(quote.to_json(orient='records'))提示:聚宽API返回的是DataFrame,需用
to_json转为JSON字符串供PHP解析;高频调用需加入time.sleep(0.1)防限流。
4.2 风控规则引擎嵌入:基于策略模式的可插拔设计
源码风控逻辑集中在app\common\policy\RiskPolicy.php,采用策略模式实现规则热插拔。现有3个策略类:
| 策略类名 | 触发场景 | 配置方式 |
|---|---|---|
MaxLossPolicy | 单日亏损超5%时禁止交易 | 在config/risk.php中设置'max_loss_rate' => 5 |
AssetMatchPolicy | 私募产品仅向认证资产≥300万用户展示 | 读取user_qualification.asset_value字段 |
BlacklistPolicy | 实时拦截黑名单股票代码 | 从risk_blacklist表加载内存缓存 |
新增自定义策略(如“行业集中度风控”)步骤:
- 创建类
app\common\policy\IndustryConcentrationPolicy.php - 实现
check($params)方法,接收['portfolio' => [...], 'threshold' => 30] - 在
RiskPolicy::getPolicyList()中追加策略类名 - 配置文件
config/risk.php添加'industry_concentration' => 30
调用方无需修改,RiskPolicy::executeAll()自动遍历所有启用策略。
4.3 二开安全边界:哪些文件绝对禁止修改
以下文件属于框架核心,修改将导致功能断裂:
| 文件路径 | 禁止原因 | 替代方案 |
|---|---|---|
thinkphp/library/think/App.php | 控制器调度逻辑,修改后路由失效 | 所有业务逻辑写在app\controller\下 |
runtime/目录全路径 | ThinkPHP运行时缓存,删除后自动重建 | 清理缓存用php think clear命令 |
public/static/css/index.*.css | Webpack打包生成的哈希文件,直接修改无效 | 修改源文件src/css/index.less后重新build |
特别注意:bootstrap.css和animate.css属于前端UI库,若需定制动画效果,应修改src/less/animate.less并重新编译,而非直接编辑压缩后的CSS。
5. 生产环境必调参数与私募合规性验证技巧
5.1 MySQL关键参数调优表(适配私募高频净值更新)
私募产品每日需录入多只产品净值,fund_nav表写入压力大。在my.cnf中调整以下参数:
| 参数 | 推荐值 | 作用说明 |
|---|---|---|
innodb_buffer_pool_size | 物理内存的70% | 加速NAV表索引读取,避免磁盘IO瓶颈 |
innodb_log_file_size | 512M | 提升事务提交吞吐量,减少log file too small警告 |
max_connections | 500 | 应对后台批量导入时的并发连接需求 |
query_cache_type | 0 | 关闭查询缓存,避免净值更新后缓存脏数据 |
验证方法:执行SHOW VARIABLES LIKE 'innodb_buffer_pool_size';确认生效。
5.2 私募产品页面合规性自检清单
监管要求私募页面必须明示风险,源码已内置检查项,但需人工验证:
| 检查项 | 位置 | 验证方式 |
|---|---|---|
| 风险揭示书强制弹窗 | public/templates/product_detail.html第127行 | 访问私募产品页,确认弹窗出现且关闭按钮为灰色不可点 |
| 合格投资者承诺勾选框 | public/templates/cert/apply.html | 提交认证时未勾选则表单禁提交 |
| 产品备案编号展示 | fund_product表record_no字段 | 后台录入时填写,前台模板{if $vo.record_no}备案号:{$vo.record_no}{/if} |
提示:
record_no字段在数据库中为VARCHAR(64),需匹配中基协备案号格式(如SPAA123456789),前端未做正则校验,需在后台控制器ProductController.php的save()方法中增加:
if ($data['type'] == 1 && !preg_match('/^SP[A-Z]{2}\d{9}$/', $data['record_no'])) { $this->error('私募备案号格式错误,应为SP+2位大写字母+9位数字'); }5.3 快速验证二开成果的3条终端命令
部署完成后,用以下命令10秒内验证核心链路:
# 1. 检查后台数据库连接(返回1表示成功) mysql -ufund_admin_user -pStrongPassw0rd!2024 -e "SELECT 1;" fund_admin_db # 2. 验证前台API是否响应(返回HTTP 200且含"products"字段) curl -I http://www.fundcorp.cn/api/v1/products | grep "200 OK" # 3. 确认私募产品在数据库中已标记类型 mysql -ufund_admin_user -pStrongPassw0rd!2024 -D fund_admin_db -e "SELECT code,name,type FROM fund_product WHERE type=1 LIMIT 1;"若第3条命令返回空结果,说明后台未录入私募产品,需登录/admin→ 【产品管理】→ 【新增产品】并选择“私募”类型保存。
本文还有配套的精品资源,点击获取