1. 前端个人中心新增真实姓名输入与实名状态展示,支持微信提现核验 2. 后端Auth接口新增真实姓名修改与手机号冲突校验逻辑 3. 后台新增用户详情综合看板,展示佣金、提现、分销等全量数据 4. 优化微信转账逻辑,支持paying状态重试时查询微信单号避免重复创建 5. 新增数据库ALTER脚本同步transfer_status字段结构 6. 新增部署与数据库变更工具脚本,支持线上线下环境同步
212 行
13 KiB
HTML
212 行
13 KiB
HTML
<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
|
|
|
|
<!-- 用户基本信息卡片(只读展示) -->
|
|
<div class="panel panel-default" style="margin-bottom: 18px; border-left: 4px solid #18bc9c; background-color: #fcfdfd;">
|
|
<div class="panel-body" style="padding: 12px 18px;">
|
|
<div style="display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 10px;">
|
|
<div style="display: flex; align-items: center;">
|
|
<img src="{$userInfo.avatar|default='/assets/img/avatar.png'}" style="width: 46px; height: 46px; border-radius: 50%; border: 1px solid #d2d6de; object-fit: cover; margin-right: 12px;">
|
|
<div>
|
|
<div style="font-size: 15px; font-weight: 600; color: #2c3e50;">
|
|
{$userInfo.nickname|default='未设置昵称'}
|
|
<span class="label label-info" style="font-size: 11px; margin-left: 4px;">UID: {$row.user_id}</span>
|
|
</div>
|
|
<div style="font-size: 12px; color: #7f8c8d; margin-top: 3px;">
|
|
<i class="fa fa-phone"></i> {$userInfo.mobile|default='未绑定手机'}
|
|
<span style="margin: 0 8px;">|</span>
|
|
<i class="fa fa-clock-o"></i> 注册于:{if condition="!empty($userInfo.createtime)"}{$userInfo.createtime|datetime}{else /}-{/if}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div style="text-align: right;">
|
|
<span style="font-size: 12px; color: #7f8c8d;">账户钱包余额</span>
|
|
<div style="font-size: 18px; font-weight: bold; color: #e67e22;">¥{$userInfo.money|default='0.00'}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 用户身份与微信实名板块 -->
|
|
<div class="box box-solid box-default" style="border: 1px solid #e7ecf1; box-shadow: 0 1px 3px rgba(0,0,0,0.05); margin-bottom: 15px;">
|
|
<div class="box-header with-border" style="background-color: #f7fafc; padding: 10px 15px;">
|
|
<h3 class="box-title" style="font-size: 14px; font-weight: 600; color: #34495e;">
|
|
<i class="fa fa-id-card text-success"></i> 身份与微信实名(佣金提现核验)
|
|
</h3>
|
|
</div>
|
|
<div class="box-body" style="padding-top: 15px;">
|
|
|
|
<div class="form-group">
|
|
<label class="control-label col-xs-12 col-sm-2">用户身份:</label>
|
|
<div class="col-xs-12 col-sm-8">
|
|
<div class="radio">
|
|
<label>
|
|
<input type="radio" name="row[user_type]" value="1" {if condition="$row.user_type != 2"}checked{/if}>
|
|
<span class="label label-primary"><i class="fa fa-user"></i> 个人用户</span>
|
|
</label>
|
|
<label style="margin-left: 20px;">
|
|
<input type="radio" name="row[user_type]" value="2" {if condition="$row.user_type == 2"}checked{/if}>
|
|
<span class="label label-warning"><i class="fa fa-building"></i> 认证商家</span>
|
|
</label>
|
|
</div>
|
|
<span class="help-block"><i class="fa fa-info-circle"></i> 认证商家拥有专属商户主页及特定发布特权。</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label class="control-label col-xs-12 col-sm-2"><span class="text-danger">*</span> 真实姓名:</label>
|
|
<div class="col-xs-12 col-sm-8">
|
|
<input id="c-realname" class="form-control" name="row[realname]" type="text" value="{$row.realname|default=''|htmlentities}" placeholder="请输入收款人真实姓名(如:张三)">
|
|
<div style="margin-top: 6px; font-size: 12px; color: #8a6d3b; background-color: #fcf8e3; padding: 6px 10px; border-radius: 4px; border: 1px solid #faebcc;">
|
|
<i class="fa fa-shield"></i> <strong>提现说明</strong>:分销佣金提现经微信「商家转账到零钱」接口打款时,微信会强校验此姓名与微信支付实名是否完全一致。
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label class="control-label col-xs-12 col-sm-2">实名状态:</label>
|
|
<div class="col-xs-12 col-sm-8">
|
|
<div class="radio">
|
|
<label>
|
|
<input type="radio" name="row[realname_status]" value="0" {if condition="empty($row.realname_status)"}checked{/if}>
|
|
<span class="text-muted"><i class="fa fa-times-circle"></i> 未实名</span>
|
|
</label>
|
|
<label style="margin-left: 20px;">
|
|
<input type="radio" name="row[realname_status]" value="1" {if condition="!empty($row.realname_status)"}checked{/if}>
|
|
<span class="text-success" style="font-weight: 600;"><i class="fa fa-check-circle"></i> 已实名认证</span>
|
|
</label>
|
|
</div>
|
|
<span class="help-block text-muted">用户首次在小程序提现时填写姓名会自动认证;管理员在此修改也会同步生效。</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label class="control-label col-xs-12 col-sm-2">微信 OpenID:</label>
|
|
<div class="col-xs-12 col-sm-8">
|
|
<input id="c-openid" class="form-control" name="row[openid]" type="text" value="{$row.openid|default=''|htmlentities}" placeholder="微信小程序用户唯一标识">
|
|
<span class="help-block text-muted">微信小程序用户标识,商家转账直接转入此微信绑定零钱账户。</span>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 会员权益与配额板块 -->
|
|
<div class="box box-solid box-default" style="border: 1px solid #e7ecf1; box-shadow: 0 1px 3px rgba(0,0,0,0.05); margin-bottom: 15px;">
|
|
<div class="box-header with-border" style="background-color: #f7fafc; padding: 10px 15px;">
|
|
<h3 class="box-title" style="font-size: 14px; font-weight: 600; color: #34495e;">
|
|
<i class="fa fa-diamond text-warning"></i> 会员特权与配额配置
|
|
</h3>
|
|
</div>
|
|
<div class="box-body" style="padding-top: 15px;">
|
|
|
|
<div class="form-group">
|
|
<label class="control-label col-xs-12 col-sm-2">是否会员:</label>
|
|
<div class="col-xs-12 col-sm-8">
|
|
<div class="radio">
|
|
<label>
|
|
<input type="radio" name="row[is_member]" value="0" {if condition="empty($row.is_member)"}checked{/if}>
|
|
<span>否</span>
|
|
</label>
|
|
<label style="margin-left: 20px;">
|
|
<input type="radio" name="row[is_member]" value="1" {if condition="!empty($row.is_member)"}checked{/if}>
|
|
<span class="text-warning font-bold"><i class="fa fa-star"></i> 会员</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label class="control-label col-xs-12 col-sm-2">会员等级:</label>
|
|
<div class="col-xs-12 col-sm-8">
|
|
<input id="c-member_level" class="form-control" name="row[member_level]" type="text" value="{$row.member_level|default=''|htmlentities}" placeholder="例如:月卡会员 / 年卡会员 / VIP商家">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label class="control-label col-xs-12 col-sm-2">会员到期时间:</label>
|
|
<div class="col-xs-12 col-sm-8">
|
|
<input id="c-member_expiretime" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[member_expiretime]" type="text" value="{if condition="!empty($row.member_expiretime)"}{$row.member_expiretime|datetime}{/if}" placeholder="留空表示无到期时间限制">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label class="control-label col-xs-12 col-sm-2">剩余发布条数:</label>
|
|
<div class="col-xs-12 col-sm-8">
|
|
<input id="c-post_quota_left" class="form-control" name="row[post_quota_left]" type="number" min="0" value="{$row.post_quota_left|default=0}">
|
|
<span class="help-block text-muted">会员套餐赠送或后台特别分配的免费发帖额度。</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label class="control-label col-xs-12 col-sm-2">发布额度有效期:</label>
|
|
<div class="col-xs-12 col-sm-8">
|
|
<input id="c-post_quota_expire" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[post_quota_expire]" type="text" value="{if condition="!empty($row.post_quota_expire)"}{$row.post_quota_expire|datetime}{/if}" placeholder="到期后额外发布额度清零">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label class="control-label col-xs-12 col-sm-2">每日查电话额度:</label>
|
|
<div class="col-xs-12 col-sm-8">
|
|
<div class="row">
|
|
<div class="col-xs-6">
|
|
<div class="input-group">
|
|
<span class="input-group-addon">每日配额</span>
|
|
<input id="c-free_view_quota" class="form-control" name="row[free_view_quota]" type="number" min="0" value="{$row.free_view_quota|default=20}">
|
|
<span class="input-group-addon">次</span>
|
|
</div>
|
|
</div>
|
|
<div class="col-xs-6">
|
|
<div class="input-group">
|
|
<span class="input-group-addon">今日已用</span>
|
|
<input id="c-free_view_used" class="form-control" name="row[free_view_used]" type="number" min="0" value="{$row.free_view_used|default=0}">
|
|
<span class="input-group-addon">次</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 推广与分销绑定板块 -->
|
|
<div class="box box-solid box-default" style="border: 1px solid #e7ecf1; box-shadow: 0 1px 3px rgba(0,0,0,0.05); margin-bottom: 15px;">
|
|
<div class="box-header with-border" style="background-color: #f7fafc; padding: 10px 15px;">
|
|
<h3 class="box-title" style="font-size: 14px; font-weight: 600; color: #34495e;">
|
|
<i class="fa fa-sitemap text-primary"></i> 推广邀请与上下级关系
|
|
</h3>
|
|
</div>
|
|
<div class="box-body" style="padding-top: 15px;">
|
|
|
|
<div class="form-group">
|
|
<label class="control-label col-xs-12 col-sm-2">邀请码:</label>
|
|
<div class="col-xs-12 col-sm-8">
|
|
<input id="c-invite_code" data-rule="required" class="form-control" name="row[invite_code]" type="text" value="{$row.invite_code|htmlentities}">
|
|
<span class="help-block text-muted">该用户专属的分销邀请码,新用户扫码或绑定此码即可成为其下线。</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label class="control-label col-xs-12 col-sm-2">上级邀请人:</label>
|
|
<div class="col-xs-12 col-sm-8">
|
|
<input id="c-inviter_id" min="0" data-source="user/user/index" data-field="nickname" class="form-control selectpage" name="row[inviter_id]" type="text" value="{$row.inviter_id|htmlentities}" placeholder="不填写表示无邀请人">
|
|
{if condition="!empty($inviterInfo)"}
|
|
<span class="help-block text-info">
|
|
<i class="fa fa-user"></i> 当前上级:<strong>{$inviterInfo.nickname|default='-'}</strong> (手机号: {$inviterInfo.mobile|default='-'})
|
|
</span>
|
|
{/if}
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group layer-footer">
|
|
<label class="control-label col-xs-12 col-sm-2"></label>
|
|
<div class="col-xs-12 col-sm-8">
|
|
<button type="submit" class="btn btn-primary btn-embossed disabled"><i class="fa fa-check"></i> {:__('OK')}</button>
|
|
<button type="reset" class="btn btn-default btn-embossed"><i class="fa fa-reply"></i> {:__('Reset')}</button>
|
|
</div>
|
|
</div>
|
|
</form>
|