文件
yjyf/server/application/admin/view/wechat/menu/index.html
linda 376ce7b5c9 feat(api): 全链路后端 + 数据库设计 + E2E 测试(65 项断言全通过)
数据库:
- db/schema_phase1.sql  16 张业务表(类目/服务/地址/师傅/订单/流水/取证/报价/评价/券/钱包/提现/结算/消息)
- db/seed_phase1.sql    15 类目 + 32 服务项目 + 新人券(幂等)

后端 API (application/api/controller):
- Base/Auth/Home/Address/Order/Master/Review
- app/common/library/OrderStatus  11 状态机 + 流转矩阵
- application/api/common.php  PHP 8.5 兼容垫片(E_DEPRECATED 不再升级为异常)

测试:
- tests/e2e_flow.js  用户下单→支付→师傅抢单→履约→验收→结算→评价 全链路 65 项断言
- 含异常用例:越权/重复操作/非法状态流转/2h 未联系自动回流
2026-10-28 15:45:51 +08:00

189 行
8.5 KiB
HTML
可执行文件

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<link href="__CDN__/assets/addons/wechat/css/menu.css?v={$site['version']}" rel="stylesheet"/>
<style>
.form-item dl dt {
width: 120px;
}
.form-item dl dd {
margin-left: 120px;
}
.form-item dl dd input {
font-size: 12px;
}
</style>
<style data-render="darktheme">
body.darktheme .mobile-menu-preview {
border-color: #222;
}
body.darktheme .weixin-content, body.darktheme .no-weixin-content {
background-color: #262626;
border: 1px solid #262626;
}
body.darktheme #menu-content {
background-color: #2d2d2d;
border: 1px solid #404040;
}
body.darktheme .keytitle {
background-color: #222;
}
body.darktheme .mobile-menu-preview .menu-list {
filter: invert(1) hue-rotate(180deg);
}
</style>
<div class="panel panel-default panel-intro">
{:build_heading()}
<div class="panel-body">
<div id="myTabContent" class="tab-content">
<div class="tab-pane fade active in" id="one">
<div class="widget-body no-padding">
<div class="weixin-menu-setting clearfix">
<div class="mobile-menu-preview">
<div class="mobile-head-title">{$site.name|htmlentities}</div>
<ul class="menu-list" id="menu-list">
</ul>
</div>
<div class="weixin-body">
<div class="weixin-content" style="display:none">
<div class="item-info">
<form id="form-item" class="form-item" novalidate data-value="">
<div class="item-head">
<h4 id="current-item-name">添加子菜单</h4>
<div class="item-delete"><a href="javascript:;" id="item_delete">删除菜单</a></div>
</div>
<div style="margin-top: 20px;" id="item-body">
</div>
</form>
</div>
</div>
<div class="no-weixin-content">
点击左侧菜单进行编辑操作
</div>
</div>
</div>
<div class="text-center" style="position:relative;">
<div class="text-danger" style="width:317px;position:absolute;left:0;top:0;">
<i class="fa fa-lightbulb-o"></i> <small>可直接拖动菜单排序</small>
</div>
<div style="padding-left:337px;">
<a href="javascript:;" id="menuRemote" class="btn btn-success"><i class="fa fa-cloud-download"></i> 加载服务端菜单</a>
<a href="javascript:;" id="menuSyn" class="btn btn-danger"><i class="fa fa-check"></i> 保存并发布</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script type="text/html" id="menutpl">
<%for(var i=0; i< menu.length; i++){%>
<%var first=menu[i];%>
<li id="menu-<%=i%>" class="menu-item" data-type="<%=first['type']%>" data-key="<%=first['key']%>" data-name="<%=first['name']%>" data-url="<%=first['url']%>" data-appid="<%=first['appid']%>" data-pagepath="<%=first['pagepath']%>">
<a href="javascript:;" class="menu-link">
<i class="icon-menu-dot"></i> <i class="weixin-icon sort-gray"></i> <span class="title"><%=first['name']%></span>
</a>
<div class="sub-menu-box" style="display:none;">
<ul class="sub-menu-list">
<%if(typeof first['sub_button']!='undefined'){%>
<%for(var j=0; j< first['sub_button'].length; j++){%>
<%var second=first['sub_button'][j];%>
<li id="sub-menu-<%=j%>" class="sub-menu-item" data-type="<%=second['type']%>" data-key="<%=second['key']%>" data-name="<%=second['name']%>" data-url="<%=second['url']%>" data-appid="<%=second['appid']%>" data-pagepath="<%=second['pagepath']%>"><a href="javascript:;"> <i class="weixin-icon sort-gray"></i><span class="sub-title"><%=second['name']%></span></a></li>
<%}%>
<%}%>
<li class="add-sub-item <%if(typeof first['sub_button']!='undefined' && first['sub_button'].length>=5){%>hidden<%}%>"><a href="javascript:;" title="添加子菜单"><span class=" "><i class="weixin-icon add-gray"></i></span></a></li>
</ul>
<i class="arrow arrow-out"></i> <i class="arrow arrow-in"></i>
</div>
</li>
<%}%>
<li class="add-item extra" id="add-item">
<a href="javascript:;" class="menu-link" title="添加菜单"><i class="weixin-icon add-gray"></i></a>
</li>
</script>
<script type="text/html" id="itemtpl">
<dl>
<dt id="current-item-option"><span class="is-sub-item <%=first?'hidden':''%>">子</span>菜单标题:</dt>
<dd>
<div class="input-box"><input id="item_title" name="name" class="form-control" type="text" value="<%=name%>"></div>
</dd>
</dl>
<%if(!hasChild){%>
<dl class="is-item">
<dt id="current-item-type"><span class="is-sub-item <%=first?'hidden':''%>">子</span>菜单内容:</dt>
<dd>
<%for(var i=0;i< typeList.length; i++){%>
<input id="type<%=i%>" type="radio" name="type" value="<%=typeList[i]['name']%>" <%=typeList[i]['name']==type?'checked':''%> /><label for="type<%=i%>"><span class="lbl_content"><%=typeList[i]['title']%></span></label>
<%}%>
</dd>
</dl>
<div id="menu-content" class="is-item">
<%if(type=='view'){%>
<div class="viewbox is-view">
<p class="menu-content-tips">点击该<span class="is-sub-item <%=first?'hidden':''%>">子</span>菜单会跳到以下链接</p>
<dl>
<dt>页面地址:</dt>
<dd>
<div class="input-box"><input type="text" name="url" class="form-control" value="<%=url%>"></div>
</dd>
</dl>
</div>
<%}%>
<%if(type!='view'&&type!='miniprogram'){%>
<div class="clickbox is-click">
<input type="hidden" name="key" id="key" value="<%=key%>"/>
<span class="create-click">
<%if(keytitle){%>
<div class="keytitle">资源名:<%=keytitle%></div>
<%}%>
<a href="{:url('wechat.response/select')}" id="select-resources"><i class="weixin-icon big-add-gray"></i><strong>选择现有资源</strong></a>
</span>
<span class="create-click">
<a href="{:url('wechat.response/add')}" id="add-resources"><i class="weixin-icon big-add-gray"></i><strong>添加新资源</strong></a>
</span>
</div>
<%}%>
<%if(type=='miniprogram'){%>
<div class="viewbox is-miniprogram">
<p class="menu-content-tips">点击该<span class="is-sub-item <%=first?'':'hidden'%>">子</span>菜单会跳到以下小程序</p>
<dl>
<dt>小程序ID:</dt>
<dd>
<div class="input-box"><input type="text" id="appid" name="appid" class="form-control" placeholder="在小程序后台获取" value="<%=appid%>"></div>
</dd>
</dl>
<dl>
<dt>小程序页面路径:</dt>
<dd>
<div class="input-box"><input type="text" id="pagepath" name="pagepath" class="form-control" placeholder="小程序页面路径" value="<%=pagepath%>"></div>
</dd>
</dl>
<dl>
<dt>页面地址:</dt>
<dd>
<div class="input-box"><input type="text" name="url" class="form-control" placeholder="页面地址,当不支持小程序时会跳转此页面" value="<%=url%>"></div>
</dd>
</dl>
</div>
<%}%>
</div>
<%}%>
</script>
<!--@formatter:off-->
<script type="text/javascript">
var menu = {:json_encode($menu, JSON_UNESCAPED_UNICODE)};
var responselist = {:json_encode($responselist, JSON_UNESCAPED_UNICODE)};
</script>
<!--@formatter:on-->