Phase1 后端核心:
- 新增 fsgx_v1.sql 迁移脚本(is_queue_goods/frozen_points/available_points/no_assess)
- SystemConfigServices 返佣设置扩展(周期人数/分档比例/范围/时机)
- StoreOrderCreateServices 周期循环佣金计算
- StoreOrderTakeServices 佣金发放后同步冻结积分
- StoreProductServices/StoreProduct 保存 is_queue_goods
Phase2 后端接口:
- GET /api/hjf/brokerage/progress 佣金周期进度
- GET /api/hjf/assets/overview 资产总览
- HjfPointsServices 每日 frozen_points 0.4‰ 释放定时任务
- PUT /adminapi/hjf/member/{uid}/no_assess 不考核接口
- GET /adminapi/hjf/points/release_log 积分日志接口
Phase3 前端清理:
- hjfCustom.js 路由精简(仅保留 points/log)
- hjfQueue.js/hjfMember.js API 清理/重定向至 CRMEB 原生接口
- pages.json 公排→推荐佣金/佣金记录/佣金规则
Phase4-5 前端改造:
- queue/status.vue 推荐佣金进度页整体重写
- 商品详情/订单确认/支付结果页文案与逻辑改造
- 个人中心/资产页/引导页/规则页文案改造
- HjfQueueProgress/HjfRefundNotice/HjfAssetCard 组件改造
- 推广中心嵌入佣金进度摘要
- hjfMockData.js 全量更新(公排字段→佣金字段)
Phase6 Admin 增强:
- 用户列表新增 frozen_points/available_points 列及不考核操作按钮
- hjfPoints.js USE_MOCK=false 对接真实积分日志接口
Phase7 配置文档:
- docs/fsgx-phase7-config-checklist.md 后台配置与全链路验收清单
Made-with: Cursor
50 lines
4.2 KiB
HTML
50 lines
4.2 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||
<title>
|
||
<%= htmlWebpackPlugin.options.title %>
|
||
</title>
|
||
<!-- Open Graph data -->
|
||
<!-- <meta property="og:title" content="Title Here" /> -->
|
||
<!-- <meta property="og:url" content="http://www.example.com/" /> -->
|
||
<!-- <meta property="og:image" content="http://example.com/image.jpg" /> -->
|
||
<!-- <meta property="og:description" content="Description Here" /> -->
|
||
<script>
|
||
window.wx = null;
|
||
//uniapp默认的wx重置
|
||
</script>
|
||
<script>
|
||
/* uni H5 polyfill: 在 UniApp 运行时初始化前提供功能性桥接,防止连接超时 */
|
||
;(function(){
|
||
var p={};
|
||
p.request=function(o){o=o||{};var x=new XMLHttpRequest(),m=(o.method||'GET').toUpperCase(),u=o.url||'';if(o.data&&(m==='GET'||m==='HEAD')){var q=Object.keys(o.data).map(function(k){return encodeURIComponent(k)+'='+encodeURIComponent(o.data[k]);}).join('&');if(q)u+=(u.indexOf('?')>=0?'&':'?')+q;}try{x.open(m,u,true);}catch(e){o.fail&&o.fail({errMsg:'request:fail '+e.message});return;}var h=o.header||o.headers||{};Object.keys(h).forEach(function(k){try{x.setRequestHeader(k,h[k]);}catch(e){}});x.onreadystatechange=function(){if(x.readyState!==4)return;var s=x.status,d;try{d=JSON.parse(x.responseText);}catch(e){d=x.responseText;}var r={statusCode:s,data:d,header:{}};if(s>=200&&s<400){o.success&&o.success(r);}else{o.fail&&o.fail({errMsg:'request:fail '+s});}o.complete&&o.complete(r);};x.onerror=function(){var e={errMsg:'request:fail network error'};o.fail&&o.fail(e);o.complete&&o.complete(e);};var b=null;if(o.data&&m!=='GET'&&m!=='HEAD'){b=typeof o.data==='string'?o.data:JSON.stringify(o.data);}try{x.send(b);}catch(e){o.fail&&o.fail({errMsg:'request:fail '+e.message});}};
|
||
p.getStorageSync=function(k){try{var v=localStorage.getItem(k);if(v===null)return undefined;try{return JSON.parse(v);}catch(e){return v;}}catch(e){return undefined;}};
|
||
p.setStorageSync=function(k,d){try{localStorage.setItem(k,typeof d==='object'?JSON.stringify(d):String(d));}catch(e){}};
|
||
p.removeStorageSync=function(k){try{localStorage.removeItem(k);}catch(e){}};
|
||
p.getWindowInfo=function(){return{windowWidth:window.innerWidth||375,windowHeight:window.innerHeight||667,screenWidth:window.screen?window.screen.width:375,screenHeight:window.screen?window.screen.height:667,statusBarHeight:0,safeAreaInsets:{top:0,bottom:0,left:0,right:0}};};
|
||
p.getEnterOptionsSync=function(){var q={};try{var s=location.search.slice(1);if(s)s.split('&').forEach(function(pair){var kv=pair.split('=');if(kv[0])q[decodeURIComponent(kv[0])]=decodeURIComponent(kv[1]||'');});}catch(e){}return{query:q,path:location.pathname};};
|
||
/* 用代理拦截 window.uni 的赋值,把真实实现合并进去 */
|
||
var _u={};
|
||
Object.keys(p).forEach(function(k){_u[k]=p[k];});
|
||
function merge(src){if(!src||typeof src!=='object')return;Object.keys(src).forEach(function(k){if(!p[k])_u[k]=src[k];/* 对我们有 polyfill 的 key,只接受真正的实现(非存根)*/});/* 把原型方法也合并进来 */try{var pr=Object.getPrototypeOf(src);if(pr&&pr!==Object.prototype)Object.getOwnPropertyNames(pr).forEach(function(k){if(k!=='constructor'&&!_u[k])try{_u[k]=pr[k].bind(src);}catch(e){}});}catch(e){}}
|
||
try{Object.defineProperty(window,'uni',{get:function(){return _u;},set:function(v){merge(v);},configurable:true,enumerable:true});}catch(e){window.uni=_u;}
|
||
})();
|
||
</script>
|
||
<script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
|
||
<script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"></script>
|
||
<script>
|
||
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
|
||
document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')
|
||
</script>
|
||
<link rel="stylesheet" href="<%= BASE_URL %>static/index.<%= VUE_APP_INDEX_CSS_HASH %>.css" />
|
||
</head>
|
||
<body>
|
||
<noscript>
|
||
<strong>Please enable JavaScript to continue.</strong>
|
||
</noscript>
|
||
<div id="app"></div>
|
||
<!-- built files will be auto injected -->
|
||
</body>
|
||
</html> |