前端消息,积分列表优化

feat/task1-c-wallet
devil 2020-06-29 23:00:56 +08:00
parent 249aa2276a
commit 1bca42d70a
39 changed files with 1176 additions and 575 deletions

View File

@ -259,7 +259,9 @@ class Common extends Controller
if(!empty($data))
{
// 调用表格处理
$ret = (new FormHandleModule())->Run($data['module'], $data['action'], $this->data_request);
$params = $this->data_request;
$params['system_admin'] = $this->admin;
$ret = (new FormHandleModule())->Run($data['module'], $data['action'], $params);
if($ret['code'] == 0)
{
$this->form_table = $ret['data']['table'];

View File

@ -81,10 +81,11 @@ class IntegralLog extends Common
/**
* 详情
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2019-08-05T08:21:54+0800
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-06-29
* @desc description
*/
public function Detail()
{

View File

@ -23,7 +23,9 @@ use think\Db;
class Message
{
// 基础条件
public $condition_base = [];
public $condition_base = [
['is_delete_time', '=', 0],
];
/**
* 入口

View File

@ -3,11 +3,11 @@
<!-- content start -->
<div class="account-pages">
<div class="wrapper-page">
<div class="text-center">
<span class="logo fw-70">ShopXO</span>
<div class="am-text-center">
<span class="logo">ShopXO</span>
</div>
<div class="m-t-40 card-box admin-login">
<div class="panel-body">
<div class="am-margin-top-lg admin-login">
<div class="am-padding-sm">
<form class="am-form form-validation" action="{{:MyUrl('admin/admin/login')}}" method="POST" request-type="ajax-url" request-value="{{:MyUrl('admin/index/index')}}">
<div class="am-g">
<div class="am-form-group am-form-group-refreshing">
@ -20,7 +20,7 @@
<button type="submit" class="am-btn am-btn-primary am-radius btn-loading-example am-btn-sm am-btn-block" data-am-loading="{loadingText:'登录中...'}">登录</button>
</div>
<div class="am-form-group am-form-group-refreshing">
<div class="am-form-group am-form-group-refreshing am-text-left am-margin-bottom-0">
<a href="javascript:;" class="text-muted" data-am-popover="{theme: 'danger sm', content: '请联系管理员重置密码', trigger: 'hover focus'}">忘记密码?</a>
</div>
</div>
@ -31,6 +31,13 @@
</div>
<!-- content end -->
<!-- 随机背景图片 -->
<div class="bg-slides">
{{for start="1" end="11"}}
<div class="bg-slides-item" style="background-image:url('{{$attachment_host}}/static/admin/default/images/login/{{$i}}.jpg');{{if $i neq 1}}display:none;{{/if}}"></div>
{{/for}}
</div>
<!-- 插件扩展数据 start -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true}}
<div class="plugins-tag">

View File

@ -458,7 +458,7 @@
}
}
{{/php}}
<!-- footer start -->
{{include file="public/footer" /}}
<!-- footer end -->

View File

@ -295,6 +295,12 @@ class Common extends Controller
$this->assign('controller_name', $controller_name);
$this->assign('action_name', $action_name);
// 分页信息
$this->page = max(1, isset($this->data_request['page']) ? intval($this->data_request['page']) : 1);
$this->page_size = MyC('admin_page_number', 10, true);
$this->assign('page', $this->page);
$this->assign('page_size', $this->page_size);
// 控制器静态文件状态css,js
$module_css = $module_name.DS.$default_theme.DS.'css'.DS.$controller_name;
$module_css .= file_exists(ROOT_PATH.'static'.DS.$module_css.'.'.$action_name.'.css') ? '.'.$action_name.'.css' : '.css';
@ -387,7 +393,9 @@ class Common extends Controller
if(!empty($data))
{
// 调用表格处理
$ret = (new FormHandleModule())->Run($data['module'], $data['action'], $this->data_request);
$params = $this->data_request;
$params['system_user'] = $this->user;
$ret = (new FormHandleModule())->Run($data['module'], $data['action'], $params);
if($ret['code'] == 0)
{
$this->form_table = $ret['data']['table'];

View File

@ -48,58 +48,68 @@ class Message extends Common
*/
public function Index()
{
// 参数
$params = input();
$params['user'] = $this->user;
// 消息更新未已读
MessageService::MessageRead($params);
// 总数
$total = MessageService::MessageTotal($this->form_where);
// 分页
$number = 10;
// 条件
$where = MessageService::MessageListWhere($params);
// 获取总数
$total = MessageService::MessageTotal($where);
// 分页
$page_params = array(
'number' => $number,
'total' => $total,
'where' => $params,
'page' => isset($params['page']) ? intval($params['page']) : 1,
'url' => MyUrl('index/message/index'),
);
$page_params = [
'number' => $this->page_size,
'total' => $total,
'where' => $this->data_request,
'page' => $this->page,
'url' => MyUrl('index/message/index'),
];
$page = new \base\Page($page_params);
$this->assign('page_html', $page->GetPageHtml());
// 获取列表
$data_params = array(
'm' => $page->GetPageStarNumber(),
'n' => $number,
'where' => $where,
);
$data = MessageService::MessageList($data_params);
$this->assign('data_list', $data['data']);
// 业务类型
$this->assign('common_business_type_list', lang('common_business_type_list'));
// 消息类型
$this->assign('common_message_type_list', lang('common_message_type_list'));
// 是否已读
$this->assign('common_is_read_list', lang('common_is_read_list'));
$data_params = [
'where' => $this->form_where,
'm' => $page->GetPageStarNumber(),
'n' => $this->page_size,
];
$ret = MessageService::MessageList($data_params);
// 浏览器名称
$this->assign('home_seo_site_title', SeoService::BrowserSeoTitle('我的消息', 1));
// 参数
$this->assign('params', $params);
// 基础参数赋值
$this->assign('params', $this->data_request);
$this->assign('page_html', $page->GetPageHtml());
$this->assign('data_list', $ret['data']);
return $this->fetch();
}
/**
* 详情
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-06-29
* @desc description
*/
public function Detail()
{
if(!empty($this->data_request['id']))
{
// 条件
$where = [
['id', '=', intval($this->data_request['id'])],
];
// 获取列表
$data_params = [
'm' => 0,
'n' => 1,
'where' => $where,
];
$ret = MessageService::MessageList($data_params);
$data = (empty($ret['data']) || empty($ret['data'][0])) ? [] : $ret['data'][0];
$this->assign('data', $data);
}
$this->assign('is_header', 0);
$this->assign('is_footer', 0);
return $this->fetch();
}
}
?>

View File

@ -48,49 +48,68 @@ class UserIntegral extends Common
*/
public function Index()
{
// 参数
$params = input();
$params['user'] = $this->user;
// 总数
$total = IntegralService::IntegralLogTotal($this->form_where);
// 分页
$number = 10;
// 条件
$where = IntegralService::UserIntegralLogListWhere($params);
// 获取总数
$total = IntegralService::IntegralLogTotal($where);
// 分页
$page_params = array(
'number' => $number,
'total' => $total,
'where' => $params,
'page' => isset($params['page']) ? intval($params['page']) : 1,
'url' => MyUrl('index/userintegral/index'),
);
$page_params = [
'number' => $this->page_size,
'total' => $total,
'where' => $this->data_request,
'page' => $this->page,
'url' => MyUrl('admin/userintegral/index'),
];
$page = new \base\Page($page_params);
$this->assign('page_html', $page->GetPageHtml());
// 获取列表
$data_params = array(
'm' => $page->GetPageStarNumber(),
'n' => $number,
'where' => $where,
);
$data = IntegralService::IntegralLogList($data_params);
$this->assign('data_list', $data['data']);
// 操作类型
$this->assign('common_integral_log_type_list', lang('common_integral_log_type_list'));
$data_params = [
'where' => $this->form_where,
'm' => $page->GetPageStarNumber(),
'n' => $this->page_size,
];
$ret = IntegralService::IntegralLogList($data_params);
// 浏览器名称
$this->assign('home_seo_site_title', SeoService::BrowserSeoTitle('我的积分', 1));
// 参数
$this->assign('params', $params);
// 基础参数赋值
$this->assign('params', $this->data_request);
$this->assign('page_html', $page->GetPageHtml());
$this->assign('data_list', $ret['data']);
return $this->fetch();
}
/**
* 详情
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-06-29
* @desc description
*/
public function Detail()
{
if(!empty($this->data_request['id']))
{
// 条件
$where = [
['id', '=', intval($this->data_request['id'])],
];
// 获取列表
$data_params = [
'm' => 0,
'n' => 1,
'where' => $where,
];
$ret = IntegralService::IntegralLogList($data_params);
$data = (empty($ret['data']) || empty($ret['data'][0])) ? [] : $ret['data'][0];
$this->assign('data', $data);
}
$this->assign('is_header', 0);
$this->assign('is_footer', 0);
return $this->fetch();
}
}
?>

View File

@ -0,0 +1,148 @@
<?php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
// | Copyright (c) 2011~2019 http://shopxo.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace app\index\form;
use think\Db;
/**
* 用户消息动态表格
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-06-29
* @desc description
*/
class Message
{
// 基础条件
public $condition_base = [
['user_is_delete_time', '=', 0],
];
/**
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-06-29
* @desc description
* @param [array] $params [输入参数]
*/
public function __construct($params = [])
{
// 用户信息
if(!empty($params['system_user']))
{
$this->condition_base[] = ['user_id', '=', $params['system_user']['id']];
}
}
/**
* 入口
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-06-29
* @desc description
* @param [array] $params [输入参数]
*/
public function Run($params = [])
{
return [
// 基础配置
'base' => [
'key_field' => 'id',
'is_search' => 1,
'search_url' => MyUrl('index/message/index'),
],
// 表单配置
'form' => [
[
'label' => '消息类型',
'view_type' => 'field',
'view_key' => 'type_text',
'search_config' => [
'form_type' => 'select',
'form_name' => 'type',
'where_type' => 'in',
'data' => lang('common_message_type_list'),
'data_key' => 'id',
'data_name' => 'name',
'is_multiple' => 1,
],
],
[
'label' => '业务类型',
'view_type' => 'field',
'view_key' => 'business_type_text',
'search_config' => [
'form_type' => 'select',
'form_name' => 'business_type',
'where_type' => 'in',
'data' => lang('common_business_type_list'),
'data_key' => 'id',
'data_name' => 'name',
'is_multiple' => 1,
],
],
[
'label' => '标题',
'view_type' => 'field',
'view_key' => 'title',
'search_config' => [
'form_type' => 'input',
'where_type' => 'like',
],
],
[
'label' => '详情',
'view_type' => 'field',
'view_key' => 'detail',
'grid_size' => 'lg',
'search_config' => [
'form_type' => 'input',
'where_type' => 'like',
],
],
[
'label' => '状态',
'view_type' => 'field',
'view_key' => 'is_read_text',
'search_config' => [
'form_type' => 'select',
'form_name' => 'is_read',
'where_type' => 'in',
'data' => lang('common_is_read_list'),
'data_key' => 'id',
'data_name' => 'name',
'is_multiple' => 1,
],
],
[
'label' => '时间',
'view_type' => 'field',
'view_key' => 'add_time_time',
'search_config' => [
'form_type' => 'datetime',
'form_name' => 'add_time',
],
],
[
'label' => '操作',
'view_type' => 'operate',
'view_key' => 'message/module/operate',
'align' => 'center',
'fixed' => 'right',
],
],
];
}
}
?>

View File

@ -0,0 +1,133 @@
<?php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
// | Copyright (c) 2011~2019 http://shopxo.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace app\index\form;
use think\Db;
/**
* 用户积分动态表格
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-06-28
* @desc description
*/
class Userintegral
{
// 基础条件
public $condition_base = [];
/**
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-06-29
* @desc description
* @param [array] $params [输入参数]
*/
public function __construct($params = [])
{
// 用户信息
if(!empty($params['system_user']))
{
$this->condition_base[] = ['user_id', '=', $params['system_user']['id']];
}
}
/**
* 入口
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-06-28
* @desc description
* @param [array] $params [输入参数]
*/
public function Run($params = [])
{
return [
// 基础配置
'base' => [
'key_field' => 'id',
'is_search' => 1,
'search_url' => MyUrl('index/userintegral/index'),
],
// 表单配置
'form' => [
[
'label' => '操作类型',
'view_type' => 'field',
'view_key' => 'type_text',
'search_config' => [
'form_type' => 'select',
'form_name' => 'type',
'where_type' => 'in',
'data' => lang('common_integral_log_type_list'),
'data_key' => 'id',
'data_name' => 'name',
'is_multiple' => 1,
],
],
[
'label' => '操作积分',
'view_type' => 'field',
'view_key' => 'operation_integral',
'search_config' => [
'form_type' => 'section',
],
],
[
'label' => '原始积分',
'view_type' => 'field',
'view_key' => 'original_integral',
'search_config' => [
'form_type' => 'section',
],
],
[
'label' => '最新积分',
'view_type' => 'field',
'view_key' => 'new_integral',
'search_config' => [
'form_type' => 'section',
],
],
[
'label' => '描述',
'view_type' => 'field',
'view_key' => 'msg',
'grid_size' => 'sm',
'search_config' => [
'form_type' => 'input',
'where_type' => 'like',
],
],
[
'label' => '时间',
'view_type' => 'field',
'view_key' => 'add_time_time',
'search_config' => [
'form_type' => 'datetime',
'form_name' => 'add_time',
],
],
[
'label' => '操作',
'view_type' => 'operate',
'view_key' => 'userintegral/module/operate',
'align' => 'center',
'fixed' => 'right',
],
],
];
}
}
?>

View File

@ -0,0 +1,2 @@
<!-- 继承公共的 form -->
{{extend name="public/module/detail" /}}

View File

@ -1,170 +1,2 @@
{{include file="public/header" /}}
<!-- header top nav -->
{{include file="public/header_top_nav" /}}
<!-- search -->
{{include file="public/nav_search" /}}
<!-- header nav -->
{{include file="public/header_nav" /}}
<!-- goods category -->
{{include file="public/goods_category" /}}
<!-- content -->
<div class="am-container user-main">
<!-- user menu start -->
{{include file="public/user_menu" /}}
<!-- user menu end -->
<!-- content start -->
<div class="user-content">
<div class="user-content-body">
<form class="am-form form-validation form-search" method="post" action="{{:MyUrl('index/message/index')}}" request-type="form">
<div class="thin">
<div class="am-input-group am-input-group-sm am-fl so">
<input type="text" autocomplete="off" name="keywords" class="am-radius" placeholder="其实搜索很简单 ^_^" value="{{if !empty($params.keywords)}}{{$params.keywords}}{{/if}}" />
<span class="am-input-group-btn">
<button class="am-btn am-btn-default am-radius" type="submit" data-am-loading="{spinner:'circle-o-notch', loadingText:'搜索中...'}">搜索</button>
</span>
</div>
<label class="am-fl thin_sub more-submit">
更多筛选条件
{{if isset($params['is_more']) and $params['is_more'] eq 1}}
<input type="checkbox" name="is_more" value="1" id="is_more" checked />
<i class="am-icon-angle-up"></i>
{{else /}}
<input type="checkbox" name="is_more" value="1" id="is_more" />
<i class="am-icon-angle-down"></i>
{{/if}}
</label>
</div>
<table class="so-list more-where {{if !isset($params['is_more'])}}none{{/if}}">
<tbody>
<tr>
<td>
<span>类型:</span>
<select name="type" class="chosen-select" data-placeholder="消息类型...">
<option value="-1">消息类型...</option>
{{if !empty($common_message_type_list)}}
{{foreach $common_message_type_list as $v}}
<option value="{{$v.id}}" {{if isset($params['type']) and $params['type'] eq $v['id']}}selected{{/if}}>{{$v.name}}</option>
{{/foreach}}
{{/if}}
</select>
</td>
<td>
<span>业务:</span>
<select name="business_type" class="chosen-select" data-placeholder="业务类型...">
<option value="-1">业务类型...</option>
{{if !empty($common_business_type_list)}}
{{foreach $common_business_type_list as $v}}
<option value="{{$v.id}}" {{if isset($params['business_type']) and $params['business_type'] eq $v['id']}}selected{{/if}}>{{$v.name}}</option>
{{/foreach}}
{{/if}}
</select>
</td>
</tr>
<tr>
<td>
<span>状态:</span>
<select name="is_read" class="chosen-select" data-placeholder="消息状态...">
<option value="-1">消息状态...</option>
{{if !empty($common_is_read_list)}}
{{foreach $common_is_read_list as $v}}
<option value="{{$v.id}}" {{if isset($params['is_read']) and $params['is_read'] eq $v['id']}}selected{{/if}}>{{$v.name}}</option>
{{/foreach}}
{{/if}}
</select>
</td>
<td>
<button type="submit" class="am-btn am-btn-primary am-radius am-btn-xs btn-loading-example" data-am-loading="{spinner:'circle-o-notch', loadingText:'搜索中...'}">搜索</button>
<a href="{{:MyUrl('index/message/index')}}" class="am-btn am-btn-warning am-radius am-btn-sm reset-submit">清除条件</a>
</td>
</tr>
</tbody>
</table>
</form>
<!-- 列表 -->
<div class="data-list am-margin-top-sm">
<table class="am-table am-table-striped">
<thead>
<tr>
<th class="am-hide-sm-only">标题</th>
<th class="am-hide-sm-only">类型</th>
<th class="am-hide-sm-only">业务</th>
<th>详情</th>
<th class="am-hide-sm-only">状态</th>
<th class="am-hide-md-down">时间</th>
<th>更多</th>
</tr>
</thead>
<tbody>
{{if !empty($data_list)}}
{{foreach $data_list as $v}}
<tr>
<td class="am-hide-sm-only">{{$v.title}}</td>
<td class="am-hide-sm-only">{{$v.type_text}}</td>
<td class="am-hide-sm-only">{{$v.business_type_text}}</td>
<td>{{$v.detail}}</td>
<td class="am-hide-sm-only">{{$v.is_read_text}}</td>
<td class="am-hide-md-down">{{$v.add_time_time}}</td>
<td>
<span class="am-icon-caret-down c-p" data-am-modal="{target: '#my-popup{{$v.id}}'}"> 查看更多</span>
<div class="am-popup am-radius" id="my-popup{{$v.id}}">
<div class="am-popup-inner">
<div class="am-popup-hd">
<h4 class="am-popup-title">详情内容</h4>
<span data-am-modal-close
class="am-close">&times;</span>
</div>
<div class="am-popup-bd">
<dl class="dl-content">
<dt>标题</dt>
<dd>{{$v.title}}</dd>
<dt>类型</dt>
<dd>{{$v.type_text}}</dd>
<dt>业务</dt>
<dd>{{$v.business_type_text}}</dd>
<dt>详情</dt>
<dd>{{$v.detail}}</dd>
<dt>状态</dt>
<dd>{{$v.is_read_text}}</dd>
<dt>时间</dt>
<dd>{{$v.add_time_time}}</dd>
</dl>
</div>
</div>
</div>
</td>
</tr>
{{/foreach}}
{{/if}}
</tbody>
</table>
{{if empty($data_list)}}
<div class="table-no"><i class="am-icon-warning"></i> 没有相关数据</div>
{{/if}}
</div>
<!-- 分页 -->
{{if !empty($data_list)}}
{{$page_html|raw}}
{{/if}}
</div>
</div>
<!-- content end -->
</div>
<!-- footer start -->
{{include file="public/footer" /}}
<!-- footer end -->
<!-- 继承公共的 form -->
{{extend name="public/module/form" /}}

View File

@ -0,0 +1,5 @@
<!-- 操作栏 -->
<button type="button" class="am-btn am-btn-default am-btn-xs am-radius am-btn-block submit-popup" data-url="{{:MyUrl('index/message/detail', ['id'=>$module_data['id']])}}">
<i class="am-icon-eye"></i>
<span>详情</span>
</button>

View File

@ -0,0 +1,164 @@
{{include file="public/header" /}}
<!-- content top hook -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true and (!isset($is_footer) or $is_footer eq 1)}}
<div class="plugins-tag">
<span>{{$hook_name_detail_top}}</span>
</div>
{{/if}}
{{php}}
$hook_data = Hook::listen($hook_name_detail_top, ['hook_name'=>$hook_name_detail_top, 'is_backend'=>true]);
if(!empty($hook_data) && is_array($hook_data))
{
foreach($hook_data as $hook)
{
if(is_string($hook) || is_int($hook))
{
echo htmlspecialchars_decode($hook);
}
}
}
{{/php}}
<!-- content start -->
<div class="am-padding-sm">
<!-- content inside top hook -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true and (!isset($is_footer) or $is_footer eq 1)}}
<div class="plugins-tag">
<span>{{$hook_name_detail_inside_top}}</span>
</div>
{{/if}}
{{php}}
$hook_data = Hook::listen($hook_name_detail_inside_top, ['hook_name'=>$hook_name_detail_inside_top, 'is_backend'=>true]);
if(!empty($hook_data) && is_array($hook_data))
{
foreach($hook_data as $hook)
{
if(is_string($hook) || is_int($hook))
{
echo htmlspecialchars_decode($hook);
}
}
}
{{/php}}
<!-- data -->
{{if !empty($data)}}
{{block name="detail_data"}}
{{if !empty($form_table) and !empty($form_table['form']) and is_array($form_table['form'])}}
{{if !empty($form_table['base']) and !empty($form_table['base']['detail_title'])}}
<div class="am-panel am-panel-default">
<div class="am-panel-hd">{{$form_table.base.detail_title}}</div>
<div class="am-panel-bd">
{{/if}}
<dl class="dl-content">
{{foreach $form_table.form as $t}}
{{if isset($t['label']) and isset($t['view_type']) and in_array($t['view_type'], ['field', 'module', 'status']) and (!isset($t['is_detail']) or $t['is_detail'] eq 1)}}
<dt><strong>{{$t.label}}</strong></dt>
<dd>
{{switch $t.view_type}}
{{case field}}
<!-- 如果字段为数组则处理多个字段拼接数据 -->
{{if is_array($t['view_key'])}}
{{foreach $t['view_key'] as $fk=>$fv}}
{{if isset($data[$fv])}}
{{$data[$fv]}}
<!-- 多个字段拼接数据的的拼接字符 -->
{{if isset($t['view_key_join']) and $fk lt count($t['view_key'])-1}}
{{$t.view_key_join|raw}}
{{/if}}
{{/if}}
{{/foreach}}
{{else /}}
<!-- 非数组则直接取值 -->
{{if isset($data[$t['view_key']])}}
<!-- 是否指定数据转换 -->
{{if !empty($t['view_data']) and is_array($t['view_data']) and isset($t['view_data'][$data[$t['view_key']]])}}
{{$t['view_data'][$data[$t['view_key']]]}}
<!-- 直接展示数据 -->
{{else /}}
{{$data[$t['view_key']]|raw}}
{{/if}}
{{/if}}
{{/if}}
{{/case}}
{{case module}}
<!-- 从模块加载自定义模块数据 -->
{{:ModuleInclude($t['view_key'], $data, ['form_request_type'=>'detail'])}}
{{/case}}
{{case status}}
<!-- 数据状态操作按钮组件 -->
{{if !empty($t['key_field']) and !empty($t['post_url'])}}
<a href="javascript:;"
class="am-icon-btn am-icon-check submit-state {{if $data[$t['view_key']] eq 1}}am-success{{else /}}am-default{{/if}}"
data-url="{{$t.post_url}}"
data-id="{{if isset($data[$t['key_field']])}}{{$data[$t['key_field']]}}{{/if}}"
data-state="{{$data[$t['view_key']]}}"
data-field="{{$t.view_key}}"
data-is-update-status="{{if isset($t['is_form_su'])}}{{$t.is_form_su}}{{else /}}0{{/if}}"
></a>
{{/if}}
{{/case}}
{{/switch}}
</dd>
{{/if}}
{{/foreach}}
</dl>
{{if !empty($form_table['base']) and !empty($form_table['base']['detail_title'])}}
</div>
</div>
{{/if}}
{{/if}}
{{/block}}
{{else /}}
{{block name="detail_not_data"}}
<div class="table-no"><i class="am-icon-warning"></i> 没有相关数据</div>
{{/block}}
{{/if}}
<!-- content inside top hook -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true and (!isset($is_footer) or $is_footer eq 1)}}
<div class="plugins-tag">
<span>{{$hook_name_detail_inside_bottom}}</span>
</div>
{{/if}}
{{php}}
$hook_data = Hook::listen($hook_name_detail_inside_bottom, ['hook_name'=>$hook_name_detail_inside_bottom, 'is_backend'=>true]);
if(!empty($hook_data) && is_array($hook_data))
{
foreach($hook_data as $hook)
{
if(is_string($hook) || is_int($hook))
{
echo htmlspecialchars_decode($hook);
}
}
}
{{/php}}
</div>
<!-- content end -->
<!-- content bottom hook -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true and (!isset($is_footer) or $is_footer eq 1)}}
<div class="plugins-tag">
<span>{{$hook_name_detail_bottom}}</span>
</div>
{{/if}}
{{php}}
$hook_data = Hook::listen($hook_name_detail_bottom, ['hook_name'=>$hook_name_detail_bottom, 'is_backend'=>true]);
if(!empty($hook_data) && is_array($hook_data))
{
foreach($hook_data as $hook)
{
if(is_string($hook) || is_int($hook))
{
echo htmlspecialchars_decode($hook);
}
}
}
{{/php}}
<!-- footer start -->
{{include file="public/footer" /}}
<!-- footer end -->

View File

@ -0,0 +1,488 @@
{{include file="public/header" /}}
<!-- header top nav -->
{{include file="public/header_top_nav" /}}
<!-- search -->
{{include file="public/nav_search" /}}
<!-- header nav -->
{{include file="public/header_nav" /}}
<!-- goods category -->
{{include file="public/goods_category" /}}
<!-- content -->
<div class="am-container user-main">
<!-- user menu start -->
{{include file="public/user_menu" /}}
<!-- user menu end -->
<!-- content start -->
<div class="user-content">
<div class="user-content-body">
<!-- content top hook -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true and (!isset($is_footer) or $is_footer eq 1)}}
<div class="plugins-tag">
<span>{{$hook_name_content_top}}</span>
</div>
{{/if}}
{{php}}
$hook_data = Hook::listen($hook_name_content_top, ['hook_name'=>$hook_name_content_top, 'is_backend'=>true]);
if(!empty($hook_data) && is_array($hook_data))
{
foreach($hook_data as $hook)
{
if(is_string($hook) || is_int($hook))
{
echo htmlspecialchars_decode($hook);
}
}
}
{{/php}}
<!-- content start -->
<div class="form-table-content">
<!-- content inside top hook -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true and (!isset($is_footer) or $is_footer eq 1)}}
<div class="plugins-tag">
<span>{{$hook_name_content_inside_top}}</span>
</div>
{{/if}}
{{php}}
$hook_data = Hook::listen($hook_name_content_inside_top, ['hook_name'=>$hook_name_content_inside_top, 'is_backend'=>true]);
if(!empty($hook_data) && is_array($hook_data))
{
foreach($hook_data as $hook)
{
if(is_string($hook) || is_int($hook))
{
echo htmlspecialchars_decode($hook);
}
}
}
{{/php}}
<!-- form -->
{{if !empty($form_table) and !empty($form_table['base']) and !empty($form_table['form']) and is_array($form_table['base']) and is_array($form_table['form'])}}
<form class="form-validation-search" method="post" action="{{if isset($form_table['base']['is_search']) and $form_table['base']['is_search'] eq 1 and !empty($form_table['base']['search_url'])}}{{$form_table.base.search_url}}{{/if}}" request-type="jump" request-value="{{if isset($form_table['base']['is_search']) and $form_table['base']['is_search'] eq 1 and !empty($form_table['base']['search_url'])}}{{$form_table.base.search_url}}{{/if}}">
<!-- nav start -->
<div class="am-g form-table-navigation">
{{block name="form_navigation"}}{{/block}}
</div>
<!-- nav end -->
<!-- top operate start -->
<div class="am-g form-table-operate-top">
{{block name="form_operate_top"}}
<!-- 公共操作 -->
<!-- 是否开启删除操作 -->
{{if isset($form_table['base']['is_delete']) and $form_table['base']['is_delete'] eq 1}}
<button
type="button"
class="am-btn am-btn-danger am-radius am-btn-xs am-icon-trash-o form-table-operate-top-delete-submit"
data-url="{{if isset($form_table['base']['delete_url'])}}{{$form_table.base.delete_url}}{{/if}}"
data-form="{{if isset($form_table['base']['delete_form'])}}{{$form_table.base.delete_form}}{{/if}}"
data-key="{{if isset($form_table['base']['delete_key'])}}{{$form_table.base.delete_key}}{{/if}}"
data-confirm-title="{{if isset($form_table['base']['confirm_title'])}}{{$form_table.base.confirm_title}}{{/if}}"
data-confirm-msg="{{if isset($form_table['base']['confirm_msg'])}}{{$form_table.base.confirm_msg}}{{/if}}"
data-timeout="{{if isset($form_table['base']['timeout'])}}{{$form_table.base.timeout}}{{/if}}"
> 删除</button>
{{/if}}
<!-- 钩子 -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true and (!isset($is_footer) or $is_footer eq 1)}}
<div class="plugins-tag">
<span>plugins_view_admin_goods_top_operate</span>
</div>
{{/if}}
{{php}}
$hook_name = 'plugins_view_admin_goods_top_operate';
$hook_data = Hook::listen($hook_name, ['hook_name'=>$hook_name, 'is_backend'=>true]);
if(!empty($hook_data) && is_array($hook_data))
{
foreach($hook_data as $hook)
{
if(is_string($hook) || is_int($hook))
{
echo htmlspecialchars_decode($hook);
}
}
}
{{/php}}
<!-- 是否开启搜索操作 公共搜索操作放在最后面 -->
{{if isset($form_table['base']['is_search']) and $form_table['base']['is_search'] eq 1}}
<a href="{{if isset($form_table['base']['search_url'])}}{{$form_table.base.search_url}}{{/if}}" class="am-btn am-btn-warning am-radius am-btn-sm am-icon-filter"> 重置</a>
<button type="submit" class="am-btn am-btn-primary am-radius am-btn-xs btn-loading-example am-icon-search" data-am-loading="{loadingText:' 搜索中...'}"> 搜索</button>
{{/if}}
{{/block}}
</div>
<!-- top operate end -->
<!-- list start -->
<div class="am-scrollable-horizontal am-table-scrollable-horizontal am-margin-top-sm">
<table class="am-table am-table-striped am-table-hover am-table-bordered am-text-nowrap form-table-data-list">
<thead>
<tr>
{{foreach $form_table['form'] as $t}}
{{if !isset($t['is_list']) or $t['is_list'] eq 1}}
<!-- 1. 上下居中 -->
<!-- 2. 格子大小 -->
<!-- 3. 内容位置居(左|中|右) -->
<!-- 4. 格子是否固定left|right 左|右) -->
<th class="
{{if !isset($t['is_middle']) or $t['is_middle'] eq 1}}am-text-middle {{/if}}
{{if !empty($t['grid_size'])}}am-grid-{{$t.grid_size}} {{/if}}
{{if !empty($t['align'])}}am-text-{{$t.align}} {{/if}}
{{if !empty($t['fixed'])}}am-grid-fixed-{{$t.fixed}} {{/if}}
{{if !empty($t['view_type']) and $t['view_type'] eq 'operate'}}am-operate-grid {{/if}}
"
style="
{{if !empty($t['width'])}}
min-width: {{$t.width}}px;
{{/if}}
"
>
{{switch $t.view_type}}
{{case checkbox}}
<button type="button" class="am-btn am-btn-secondary am-radius am-btn-xs form-table-operate-checkbox-submit" data-value="{{if isset($t['is_checked']) and $t['is_checked'] eq 1}}1{{else /}}0{{/if}}" data-checked-text="{{$t.checked_text}}" data-not-checked-text="{{$t.not_checked_text}}" {{if empty($data_list)}}disabled{{/if}}>{{if isset($t['is_checked']) and $t['is_checked'] eq 1}}{{$t.checked_text}}{{else /}}{{$t.not_checked_text}}{{/if}}</button>
{{/case}}
{{default /}}
{{if isset($t['label'])}}{{$t.label}}{{/if}}
{{/switch}}
</th>
{{/if}}
{{/foreach}}
</tr>
<!-- search -->
{{if isset($form_table['base']['is_search']) and $form_table['base']['is_search'] eq 1}}
<tr class="form-table-search">
{{foreach $form_table['form'] as $k=>$t}}
{{if !isset($t['is_list']) or $t['is_list'] eq 1}}
<td class="
{{if !isset($t['is_middle']) or $t['is_middle'] eq 1}}am-text-middle {{/if}}
{{if !empty($t['grid_size'])}}am-grid-{{$t.grid_size}} {{/if}}
{{if !empty($t['align'])}}am-text-{{$t.align}} {{/if}}
{{if !empty($t['fixed'])}}am-grid-fixed-{{$t.fixed}} {{/if}}
{{if !empty($t['view_type']) and $t['view_type'] eq 'operate'}}am-operate-grid {{/if}}
"
style="
{{if !empty($t['width'])}}
min-width: {{$t.width}}px;
{{/if}}
"
>
{{if !empty($t['search_config']) and !empty($t['search_config']['form_type']) and !empty($t['search_config']['form_name'])}}
{{switch $t.search_config.form_type}}
{{case input}}
<!-- 输入 -->
<input type="text" class="am-form-field am-radius" autocomplete="off" name="{{$t.form_key}}" value="{{if !empty($form_params) and isset($form_params[$t['form_key']])}}{{$form_params[$t['form_key']]}}{{/if}}" placeholder="{{if isset($t['search_config']['placeholder'])}}{{$t.search_config.placeholder}}{{/if}}" />
{{/case}}
{{case select}}
<!-- 选择 -->
<select name="{{$t.form_key}}" class="chosen-select am-text-left" data-placeholder="{{if isset($t['search_config']['placeholder'])}}{{$t.search_config.placeholder}}{{/if}}" {{if isset($t['search_config']['is_multiple']) and $t['search_config']['is_multiple'] eq 1}}multiple{{/if}}>
{{if isset($t['search_config']['is_seat_select']) and $t['search_config']['is_seat_select'] eq 1 and (!isset($t['search_config']['is_multiple']) or $t['search_config']['is_multiple'] neq 1)}}
<option value="{{if isset($t['search_config']['seat_select_value'])}}{{$t.search_config.seat_select_value}}{{/if}}">
{{if empty($t['search_config']['seat_select_text'])}}{{if empty($t['search_config']['placeholder'])}}请选择{{if !empty($t['label'])}}{{$t.label}}{{/if}}{{else /}}{{$t.search_config.placeholder}}{{/if}}{{else /}}{{$t.search_config.seat_select_text}}{{/if}}
</option>
{{/if}}
{{if !empty($t['search_config']['data']) and is_array($t['search_config']['data'])}}
{{foreach $t['search_config']['data'] as $v}}
<option value="{{if isset($t['search_config']['data_key']) and isset($v[$t['search_config']['data_key']])}}{{$v[$t['search_config']['data_key']]}}{{/if}}" {{if !empty($form_params) and isset($form_params[$t['form_key']]) and is_array($form_params[$t['form_key']]) and isset($t['search_config']['data_key']) and in_array($v[$t['search_config']['data_key']], $form_params[$t['form_key']])}}selected{{/if}}>
{{if isset($t['search_config']['data_name']) and isset($v[$t['search_config']['data_name']])}}
{{$v[$t['search_config']['data_name']]}}
{{/if}}
</option>
{{/foreach}}
{{/if}}
</select>
{{/case}}
{{case section}}
<!-- 区间 -->
<div class="form-table-search-section">
<input type="number" class="am-form-field am-radius am-inline-block" autocomplete="off" name="{{$t.form_key}}_min" value="{{if !empty($form_params) and isset($form_params[$t['form_key'].'_min'])}}{{$form_params[$t['form_key'].'_min']}}{{/if}}" {{if isset($t['search_config']['is_point']) and $t['search_config']['is_point'] eq 1}}step="0.01"{{/if}} min="0" placeholder="{{if isset($t['search_config']['placeholder_min'])}}{{$t.search_config.placeholder_min}}{{/if}}" />
<span>-</span>
<input type="number" class="am-form-field am-radius am-inline-block" autocomplete="off" name="{{$t.form_key}}_max" value="{{if !empty($form_params) and isset($form_params[$t['form_key'].'_max'])}}{{$form_params[$t['form_key'].'_max']}}{{/if}}" {{if isset($t['search_config']['is_point']) and $t['search_config']['is_point'] eq 1}}step="0.01"{{/if}} min="0" placeholder="{{if isset($t['search_config']['placeholder_max'])}}{{$t.search_config.placeholder_max}}{{/if}}" />
</div>
{{/case}}
{{case datetime}}
<div class="form-table-search-section form-table-search-time">
<input type="text" autocomplete="off" class="am-form-field am-input-sm am-radius am-inline-block Wdate" id="form-table-search-time-start-{{$t.form_key}}" name="{{$t.form_key}}_start" value="{{if !empty($form_params) and isset($form_params[$t['form_key'].'_start'])}}{{$form_params[$t['form_key'].'_start']}}{{/if}}" placeholder="{{if isset($t['search_config']['placeholder_start'])}}{{$t.search_config.placeholder_start}}{{/if}}" value="" onclick="WdatePicker({firstDayOfWeek:1,dateFmt:'yyyy-MM-dd H:mm:ss',maxDate:'#F{$dp.$D(\'form-table-search-time-end-{{$t.form_key}}\');}'})" autocomplete="off" />
<span>-</span>
<input type="text" autocomplete="off" class="am-form-field am-input-sm am-radius am-inline-block Wdate" id="form-table-search-time-end-{{$t.form_key}}" name="{{$t.form_key}}_end" value="{{if !empty($form_params) and isset($form_params[$t['form_key'].'_end'])}}{{$form_params[$t['form_key'].'_end']}}{{/if}}" placeholder="{{if isset($t['search_config']['placeholder_end'])}}{{$t.search_config.placeholder_end}}{{/if}}" value="" onclick="WdatePicker({firstDayOfWeek:1,dateFmt:'yyyy-MM-dd H:mm:ss',minDate:'#F{$dp.$D(\'form-table-search-time-start-{{$t.form_key}}\');}'})" autocomplete="off" />
</div>
{{/case}}
{{case date}}
<div class="form-table-search-section form-table-search-time">
<input type="text" autocomplete="off" class="am-form-field am-input-sm am-radius am-inline-block Wdate" id="form-table-search-time-start-{{$t.form_key}}" name="{{$t.form_key}}_start" value="{{if !empty($form_params) and isset($form_params[$t['form_key'].'_start'])}}{{$form_params[$t['form_key'].'_start']}}{{/if}}" placeholder="{{if isset($t['search_config']['placeholder_start'])}}{{$t.search_config.placeholder_start}}{{/if}}" value="" onclick="WdatePicker({firstDayOfWeek:1,dateFmt:'yyyy-MM-dd',maxDate:'#F{$dp.$D(\'form-table-search-time-end-{{$t.form_key}}\',{d:-1});}'})" autocomplete="off" />
<span>-</span>
<input type="text" autocomplete="off" class="am-form-field am-input-sm am-radius am-inline-block Wdate" id="form-table-search-time-end-{{$t.form_key}}" name="{{$t.form_key}}_end" value="{{if !empty($form_params) and isset($form_params[$t['form_key'].'_end'])}}{{$form_params[$t['form_key'].'_end']}}{{/if}}" placeholder="{{if isset($t['search_config']['placeholder_end'])}}{{$t.search_config.placeholder_end}}{{/if}}" value="" onclick="WdatePicker({firstDayOfWeek:1,dateFmt:'yyyy-MM-dd',minDate:'#F{$dp.$D(\'form-table-search-time-start-{{$t.form_key}}\',{d:+1});}'})" autocomplete="off" />
</div>
{{/case}}
{{case module}}
<!-- 从模块加载自定义模块数据 -->
{{if !empty($t['search_config']['template'])}}
{{if isset($t['search_config']['data'])}}
{{:ModuleInclude($t['search_config']['template'], ['data'=>$t['search_config']['data'], 'form_name_key'=>$t['form_key'], 'params'=>isset($form_params) ? $form_params : []])}}
{{else /}}
{{:ModuleInclude($t['search_config']['template'], ['data'=>[], 'form_name_key'=>$t['form_key'], 'params'=>isset($form_params) ? $form_params : []])}}
{{/if}}
{{/if}}
{{/case}}
{{/switch}}
{{/if}}
</td>
{{/if}}
{{/foreach}}
</tr>
{{/if}}
</thead>
<tbody>
{{if !empty($data_list) and !empty($form_table['base']['key_field'])}}
<!-- 处理数据数量小于默认数量 -->
{{for start="0" end="count($data_list)"}}
<!-- 1. tr 主键id名称 -->
<!-- 2. 是否黄色选中class -->
<tr
{{if isset($data_list[$i][$form_table['base']['key_field']])}}
id="data-list-{{$data_list[$i][$form_table['base']['key_field']]}}"
{{/if}}
{{if !empty($form_table['base']['status_field']) and isset($data_list[$i][$form_table['base']['status_field']]) and $data_list[$i][$form_table['base']['status_field']] eq 0}}
class="am-active"
{{/if}}
>
{{foreach $form_table['form'] as $t}}
{{if !isset($t['is_list']) or $t['is_list'] eq 1}}
<!-- 1. 上下居中 -->
<!-- 2. 格子大小 -->
<!-- 3. 内容位置居(左|中|右) -->
<!-- 4. 格子是否固定left|right 左|右) -->
<!-- 5. 是否操作列 -->
<td class="am-nowrap-initial
{{if !isset($t['is_middle']) or $t['is_middle'] eq 1}}am-text-middle {{/if}}
{{if !empty($t['grid_size'])}}am-grid-{{$t.grid_size}} {{/if}}
{{if !empty($t['align'])}}am-text-{{$t.align}} {{/if}}
{{if !empty($t['fixed'])}}am-grid-fixed-{{$t.fixed}} {{/if}}
{{if !empty($t['view_type']) and $t['view_type'] eq 'operate'}}am-operate-grid {{/if}}
"
style="
{{if !empty($t['width'])}}
min-width: {{$t.width}}px;
{{/if}}
"
>
{{if isset($data_list[$i]) and !empty($t['view_type']) and !empty($t['view_key'])}}
<!-- 数据匹配 -->
{{switch $t.view_type}}
{{case field}}
<!-- 前后固定拼接的值 前面 -->
{{if isset($t['view_join_first'])}}
<span>{{$t.view_join_first}}</span>
{{/if}}
<!-- 如果字段为数组则处理多个字段拼接数据 -->
{{if is_array($t['view_key'])}}
{{foreach $t['view_key'] as $fk=>$fv}}
{{if isset($data_list[$i][$fv])}}
{{$data_list[$i][$fv]}}
<!-- 多个字段拼接数据的的拼接字符 -->
{{if isset($t['view_key_join']) and $fk lt count($t['view_key'])-1}}
{{$t.view_key_join|raw}}
{{/if}}
{{/if}}
{{/foreach}}
{{else /}}
<!-- 非数组则直接取值 -->
{{if isset($data_list[$i][$t['view_key']])}}
<!-- 是否指定数据转换 -->
{{if !empty($t['view_data']) and is_array($t['view_data']) and isset($t['view_data'][$data_list[$i][$t['view_key']]])}}
{{$t['view_data'][$data_list[$i][$t['view_key']]]}}
<!-- 直接展示数据 -->
{{else /}}
{{$data_list[$i][$t['view_key']]|raw}}
{{/if}}
{{/if}}
{{/if}}
<!-- 前后固定拼接的值 后面 -->
{{if isset($t['view_join_last'])}}
<span>{{$t.view_join_last}}</span>
{{/if}}
{{/case}}
{{case module}}
<!-- 从模块加载自定义模块数据 -->
{{:ModuleInclude($t['view_key'], $data_list[$i], isset($params) ? $params : [])}}
{{/case}}
{{case status}}
<!-- 数据状态操作按钮组件 -->
{{if !empty($t['key_field']) and !empty($t['post_url'])}}
<a href="javascript:;"
class="am-icon-btn am-icon-check submit-state {{if $data_list[$i][$t['view_key']] eq 1}}am-success{{else /}}am-default{{/if}}"
data-url="{{$t.post_url}}"
data-id="{{if isset($data_list[$i][$t['key_field']])}}{{$data_list[$i][$t['key_field']]}}{{/if}}"
data-state="{{$data_list[$i][$t['view_key']]}}"
data-field="{{$t.view_key}}"
data-is-update-status="{{if isset($t['is_form_su'])}}{{$t.is_form_su}}{{else /}}0{{/if}}"
></a>
{{/if}}
{{/case}}
{{case operate}}
<!-- 是否操作列 -->
<!-- 模块数据 -->
{{:ModuleInclude($t['view_key'], $data_list[$i])}}
<!-- 列表操作钩子 -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true and (!isset($is_footer) or $is_footer eq 1)}}
<div class="plugins-tag">
<span>{{$hook_name_form_list_operate}}</span>
</div>
{{/if}}
{{php}}
$hook_data = Hook::listen($hook_name_form_list_operate, [
'hook_name' => $hook_name_form_list_operate,
'is_backend' => true,
'id' => isset($data_list[$i][$form_table['base']['key_field']]) ? $data_list[$i][$form_table['base']['key_field']] : 0,
'data' => $data_list[$i],
]);
if(!empty($hook_data) && is_array($hook_data))
{
foreach($hook_data as $hook)
{
if(is_string($hook) || is_int($hook))
{
echo htmlspecialchars_decode($hook);
}
}
}
{{/php}}
{{/case}}
{{case checkbox}}
{{if isset($data_list[$i][$form_table['base']['key_field']])}}
<!-- 是否配置指定数据不显示控件 -->
{{if empty($t['not_show_data']) or empty($t['not_show_key']) or !in_array($data_list[$i][$form_table['base']['key_field']], $t['not_show_data'])}}
<div class="form-table-operate-checkbox">
<label class="am-checkbox am-secondary am-checkbox-inline">
<input type="checkbox" name="{{$t.view_key}}" value="{{$data_list[$i][$form_table['base']['key_field']]}}" {{if isset($t['is_checked']) and $t['is_checked'] eq 1}}checked{{/if}} data-am-ucheck />
</label>
</div>
{{/if}}
{{/if}}
{{/case}}
{{case radio}}
{{if isset($data_list[$i][$form_table['base']['key_field']])}}
<div class="form-table-operate-radio">
<label class="am-radio am-secondary am-radio-inline">
<input type="radio" name="{{$t.view_key}}" value="{{$data_list[$i][$form_table['base']['key_field']]}}" {{if isset($t['is_checked']) and $t['is_checked'] eq 1}}checked{{/if}} data-am-ucheck />
</label>
</div>
{{/if}}
{{/case}}
{{/switch}}
{{/if}}
</td>
{{/if}}
{{/foreach}}
</tr>
{{/for}}
{{/if}}
</tbody>
</table>
{{if empty($data_list)}}
<div class="table-no"><i class="am-icon-warning"></i> 没有相关数据</div>
{{/if}}
</div>
<!-- list end -->
<!-- bottom operate start -->
<div class="am-g am-margin-top-sm form-table-operate-bottom">
{{block name="form_operate_bottom"}}
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true and (!isset($is_footer) or $is_footer eq 1)}}
<div class="plugins-tag">
<span>{{$hook_name_form_bottom_operate}}</span>
</div>
{{/if}}
{{php}}
$hook_data = Hook::listen($hook_name_form_bottom_operate, ['hook_name'=>$hook_name_form_bottom_operate, 'is_backend'=>true]);
if(!empty($hook_data) && is_array($hook_data))
{
foreach($hook_data as $hook)
{
if(is_string($hook) || is_int($hook))
{
echo htmlspecialchars_decode($hook);
}
}
}
{{/php}}
{{/block}}
</div>
<!-- bottom operate end -->
</form>
{{else /}}
<div class="table-no"><i class="am-icon-warning"></i> {{if empty($form_error)}}动态表格配置有误{{else /}}{{$form_error}}{{/if}}</div>
{{/if}}
<!-- page start -->
{{block name="form_page"}}
{{if !empty($data_list) and isset($page_html)}}
{{$page_html|raw}}
{{/if}}
{{/block}}
<!-- page end -->
<!-- extend start -->
{{block name="form_extend"}}{{/block}}
<!-- extend end -->
<!-- content inside top hook -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true and (!isset($is_footer) or $is_footer eq 1)}}
<div class="plugins-tag">
<span>{{$hook_name_content_inside_bottom}}</span>
</div>
{{/if}}
{{php}}
$hook_data = Hook::listen($hook_name_content_inside_bottom, ['hook_name'=>$hook_name_content_inside_bottom, 'is_backend'=>true]);
if(!empty($hook_data) && is_array($hook_data))
{
foreach($hook_data as $hook)
{
if(is_string($hook) || is_int($hook))
{
echo htmlspecialchars_decode($hook);
}
}
}
{{/php}}
</div>
<!-- content end -->
<!-- content bottom hook -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true and (!isset($is_footer) or $is_footer eq 1)}}
<div class="plugins-tag">
<span>{{$hook_name_content_bottom}}</span>
</div>
{{/if}}
{{php}}
$hook_data = Hook::listen($hook_name_content_bottom, ['hook_name'=>$hook_name_content_bottom, 'is_backend'=>true]);
if(!empty($hook_data) && is_array($hook_data))
{
foreach($hook_data as $hook)
{
if(is_string($hook) || is_int($hook))
{
echo htmlspecialchars_decode($hook);
}
}
}
{{/php}}
</div>
</div>
<!-- content end -->
</div>
<!-- footer start -->
{{include file="public/footer" /}}
<!-- footer end -->

View File

@ -0,0 +1,2 @@
<!-- 继承公共的 form -->
{{extend name="public/module/detail" /}}

View File

@ -1,156 +1,20 @@
{{include file="public/header" /}}
<!-- 继承公共的 form -->
{{extend name="public/module/form" /}}
<!-- header top nav -->
{{include file="public/header_top_nav" /}}
<!-- search -->
{{include file="public/nav_search" /}}
<!-- header nav -->
{{include file="public/header_nav" /}}
<!-- goods category -->
{{include file="public/goods_category" /}}
<!-- content -->
<div class="am-container user-main">
<!-- user menu start -->
{{include file="public/user_menu" /}}
<!-- user menu end -->
<!-- content start -->
<div class="user-content">
<div class="user-content-body">
<div class="am-alert am-alert-secondary" data-am-alert>
<div class="available">
<span>正常可用</span>
<span class="panel-value">{{$user.integral}}</span>
<em>积分</em>
<span class="panel-tips">可以正常使用的积分</span>
</div>
<div class="locking">
<span>当前锁定</span>
<span class="panel-value">{{$user.locking_integral}}</span>
<em>积分</em>
<span class="panel-tips">一般积分交易中,交易并未完成、锁定相应的积分</span>
</div>
</div>
<form class="am-form form-validation form-search" method="post" action="{{:MyUrl('index/userintegral/index')}}" request-type="form">
<div class="thin">
<div class="am-input-group am-input-group-sm am-fl so">
<input type="text" autocomplete="off" name="keywords" class="am-radius" placeholder="其实搜索很简单 ^_^" value="{{if !empty($params.keywords)}}{{$params.keywords}}{{/if}}" />
<span class="am-input-group-btn">
<button class="am-btn am-btn-default am-radius" type="submit" data-am-loading="{spinner:'circle-o-notch', loadingText:'搜索中...'}">搜索</button>
</span>
</div>
<label class="am-fl thin_sub more-submit">
更多筛选条件
{{if isset($params['is_more']) and $params['is_more'] eq 1}}
<input type="checkbox" name="is_more" value="1" id="is_more" checked />
<i class="am-icon-angle-up"></i>
{{else /}}
<input type="checkbox" name="is_more" value="1" id="is_more" />
<i class="am-icon-angle-down"></i>
{{/if}}
</label>
</div>
<table class="so-list more-where {{if !isset($params['is_more'])}}none{{/if}}">
<tbody>
<tr>
<td>
<span>类型:</span>
<select name="type" class="chosen-select" data-placeholder="操作类型...">
<option value="-1">操作类型...</option>
{{if !empty($common_integral_log_type_list)}}
{{foreach $common_integral_log_type_list as $v}}
<option value="{{$v.id}}" {{if isset($params['type']) and $params['type'] eq $v['id']}}selected{{/if}}>{{$v.name}}</option>
{{/foreach}}
{{/if}}
</select>
</td>
<td>
<button type="submit" class="am-btn am-btn-primary am-radius am-btn-xs btn-loading-example" data-am-loading="{spinner:'circle-o-notch', loadingText:'搜索中...'}">搜索</button>
<a href="{{:MyUrl('index/userintegral/index')}}" class="am-btn am-btn-warning am-radius am-btn-sm reset-submit">清除条件</a>
</td>
</tr>
</tbody>
</table>
</form>
<!-- 列表 -->
<div class="data-list am-margin-top-sm">
<table class="am-table am-table-striped">
<thead>
<tr>
<th>操作类型</th>
<th class="am-hide-sm-only">描述</th>
<th>原始积分</th>
<th>最新积分</th>
<th class="am-hide-md-down">时间</th>
<th>更多</th>
</tr>
</thead>
<tbody>
{{if !empty($data_list)}}
{{foreach $data_list as $v}}
<tr>
<td>{{$v.type_text}}</td>
<td class="am-hide-sm-only">{{$v.msg}}</td>
<td>{{$v.original_integral}}</td>
<td>{{$v.new_integral}}</td>
<td class="am-hide-md-down">{{$v.add_time_time}}</td>
<td>
<span class="am-icon-caret-down c-p" data-am-modal="{target: '#my-popup{{$v.id}}'}"> 查看更多</span>
<div class="am-popup am-radius" id="my-popup{{$v.id}}">
<div class="am-popup-inner">
<div class="am-popup-hd">
<h4 class="am-popup-title">详情内容</h4>
<span data-am-modal-close
class="am-close">&times;</span>
</div>
<div class="am-popup-bd">
<dl class="dl-content">
<dt>操作类型</dt>
<dd>{{$v.type_text}}</dd>
<dt>描述</dt>
<dd>{{$v.msg}}</dd>
<dt>原始积分</dt>
<dd>{{$v.original_integral}}</dd>
<dt>最新积分</dt>
<dd>{{$v.new_integral}}</dd>
<dt>时间</dt>
<dd>{{$v.add_time_time}}</dd>
</dl>
</div>
</div>
</div>
</td>
</tr>
{{/foreach}}
{{/if}}
</tbody>
</table>
{{if empty($data_list)}}
<div class="table-no"><i class="am-icon-warning"></i> 没有相关数据</div>
{{/if}}
</div>
<!-- 分页 -->
{{if !empty($data_list)}}
{{$page_html|raw}}
{{/if}}
<!-- 顶部导航内容 -->
{{block name="form_navigation"}}
<div class="am-alert am-alert-secondary" data-am-alert>
<div class="available">
<span>正常可用</span>
<span class="panel-value">{{$user.integral}}</span>
<em>积分</em>
<span class="panel-tips">可以正常使用的积分</span>
</div>
<div class="locking">
<span>当前锁定</span>
<span class="panel-value">{{$user.locking_integral}}</span>
<em>积分</em>
<span class="panel-tips">一般积分交易中,交易并未完成、锁定相应的积分</span>
</div>
</div>
<!-- content end -->
</div>
<!-- footer start -->
{{include file="public/footer" /}}
<!-- footer end -->
{{/block}}

View File

@ -0,0 +1,5 @@
<!-- 操作栏 -->
<button type="button" class="am-btn am-btn-default am-btn-xs am-radius am-btn-block submit-popup" data-url="{{:MyUrl('index/userintegral/detail', ['id'=>$module_data['id']])}}">
<i class="am-icon-eye"></i>
<span>详情</span>
</button>

View File

@ -57,7 +57,7 @@ class FormHandleModule
}
// 指定方法检测
$this->module_obj = new $module();
$this->module_obj = new $module($this->out_params);
if(!method_exists($this->module_obj, $action))
{
// 默认方法检测

View File

@ -5,6 +5,7 @@
1. 所有条件、列表、新增、编辑、删除 新增钩子(公共 form 表单封装)
2. 积分支持按照订单商品总额比例发放,发生售后收回积分
3. 微信小程序好物推荐和直播组件支持配置组件版本号
4. 后台管理登录页面新增随机背景
web端

View File

@ -1,17 +0,0 @@
{
"appid": "16634987",
"developType": "normal",
"host": "baiduboxapp",
"preview": {
"packageId": 347753
},
"setting": {
"urlCheck": false
},
"swan": {
"baiduboxapp": {
"extensionJsVersion": "1.5.3",
"swanJsVersion": "3.105.9"
}
}
}

View File

@ -1,49 +0,0 @@
{
"projectid": "1109990622_test",
"setting": {
"urlCheck": false,
"es6": true,
"postcss": true,
"minified": true,
"newFeature": true,
"autoAudits": false,
"remoteDebugLogEnable": false,
"uploadWithSourceMap": true,
"nodeModules": true,
"uglifyFileName": true
},
"compileType": "miniprogram",
"createTime": 1572536544924,
"accessTime": 1572536544924,
"packOptions": {
"ignore": []
},
"debugOptions": {
"hidedInDevtools": []
},
"qqappid": "1109990622",
"projectname": "test",
"scripts": {
"beforeCompile": "",
"beforePreview": "",
"beforeUpload": ""
},
"condition": {
"search": {
"current": -1,
"list": []
},
"conversation": {
"current": -1,
"list": []
},
"game": {
"currentL": -1,
"list": []
},
"miniprogram": {
"current": -1,
"list": []
}
}
}

View File

@ -1,11 +0,0 @@
{
"setting": {
"urlCheck": false,
"es6": true,
"postcss": true,
"minified": true,
"newFeature": true
},
"appid": "tt65341389fa1e87f3",
"projectname": "gongfuxiang的小程序"
}

View File

@ -1,53 +0,0 @@
{
"description": "项目配置文件",
"packOptions": {
"ignore": []
},
"setting": {
"urlCheck": false,
"es6": true,
"postcss": true,
"minified": true,
"newFeature": true,
"autoAudits": false
},
"compileType": "miniprogram",
"libVersion": "2.4.3",
"appid": "wx0a2012ebad94beff",
"projectname": "shopxo",
"debugOptions": {
"hidedInDevtools": []
},
"scripts": {},
"simulatorType": "wechat",
"simulatorPluginLibVersion": {},
"condition": {
"search": {
"current": -1,
"list": []
},
"conversation": {
"current": -1,
"list": []
},
"plugin": {
"current": -1,
"list": []
},
"game": {
"list": []
},
"miniprogram": {
"current": 0,
"list": [
{
"id": 0,
"name": "goods详情",
"pathName": "pages/goods-detail/goods-detail",
"query": "goods_id=7&referrer=100",
"scene": 1001
}
]
}
}
}

File diff suppressed because one or more lines are too long

View File

@ -187,9 +187,6 @@ a:focus {outline:0;text-decoration:none;}
/* ============= Extras============= *//* Table type box */
.table-box {display:table;height:100%;width:100%;}
.table-box .table-detail {display:table-cell;vertical-align:middle;}
/* Card Box */
.card-box {padding:20px;box-shadow:0 0px 8px 0 rgba(0,0,0,0.06),0 1px 0px 0 rgba(0,0,0,0.02);-webkit-border-radius:5px;border-radius:5px;-moz-border-radius:5px;background-clip:padding-box;margin-bottom:20px;background-color:#ffffff;}
.card-box .card-drop {color:#98a6ad;font-size:20px;line-height:1px;padding:0px 5px;display:inline-block;}
/* Grid page */
.grid-structure .grid-container {background-color:#f4f8fb;margin-bottom:10px;padding:10px 20px;}
/* Demo only */

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 677 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

View File

@ -0,0 +1,23 @@
$(function()
{
// 登录页面背景切换
var count = $('.bg-slides-item').length;
if(count > 0)
{
var temp_old = 0;
var temp_new = 1;
var fade_time = 1000;
var interval_time = 6000;
setInterval(function()
{
$('.bg-slides-item').eq(temp_old).fadeOut(fade_time);
$('.bg-slides-item').eq(temp_new).fadeIn(fade_time);
temp_old = temp_new;
temp_new++;
if(temp_new > count-1)
{
temp_new = 0;
}
}, interval_time);
}
});

View File

@ -1628,8 +1628,7 @@ function TableContainerInit()
if(right == undefined)
{
var left = $(this).offset().left;
var width = $(this).width();
var right = parent_width-left-width-parent_left-4;
right = parent_width-left-width+parent_left;
if(right < 0)
{
right = 0;

View File

@ -22,8 +22,8 @@ button { outline: none; }
*, body, .am-btn { font-size: 12px; }
.am-form select, .am-form textarea, .am-form input[type="text"], .am-form input[type="password"], .am-form input[type="datetime"], .am-form input[type="datetime-local"], .am-form input[type="date"], .am-form input[type="month"], .am-form input[type="time"], .am-form input[type="week"], .am-form input[type="number"], .am-form input[type="email"], .am-form input[type="url"], .am-form input[type="search"], .am-form input[type="tel"], .am-form input[type="color"], .am-form-field {
font-size: 12px;
.am-form select,.am-form textarea,.am-form input[type="text"],.am-form input[type="password"],.am-form input[type="datetime"],.am-form input[type="datetime-local"],.am-form input[type="date"],.am-form input[type="month"],.am-form input[type="time"],.am-form input[type="week"],.am-form input[type="number"],.am-form input[type="email"],.am-form input[type="url"],.am-form input[type="search"],.am-form input[type="tel"],.am-form input[type="color"],.am-form-field {
font-size: 12px !important;
}
.am-input-group-sm > .am-input-group-btn > .am-btn,
.am-input-group-sm > .am-form-field,
@ -793,7 +793,7 @@ img.common-user-icon {
/**
*
*/
.user-menu {position:fixed;z-index:10;bottom:70px;right:10px;}
.user-menu {position:fixed;z-index:1020;bottom:70px;right:10px; -webkit-box-shadow: 0 0 15px rgba(0, 0, 0, 0.5); -moz-box-shadow: 0 0 15px rgba(0, 0, 0, 0.5); box-shadow: 0 0 15px rgba(0, 0, 0, 0.5);}
.user-sidebar {width:145px;min-height:100%;float:left;}
.user-sidebar .am-active {z-index:1600;}
.user-sidebar .am-active a, .user-sidebar-list li a:hover {background:#fff1f5; text-decoration: none; color: #d2364c; }