更新数据测试模块

This commit is contained in:
Anyon 2021-01-08 13:06:13 +08:00
parent e9f169a1a5
commit c8734a7efb
28 changed files with 231 additions and 204 deletions

View File

@ -2,7 +2,6 @@
namespace app\data\controller; namespace app\data\controller;
use app\data\service\MessageService;
use think\admin\Controller; use think\admin\Controller;
/** /**
@ -26,23 +25,6 @@ class Config extends Controller
$this->__sysconf('wxapp'); $this->__sysconf('wxapp');
} }
/**
* 短信接口配置
* @auth true
* @menu true
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function message()
{
if ($this->request->isGet()) {
$this->title = '短信接口配置';
$this->result = MessageService::instance()->balance();
}
$this->__sysconf('message');
}
/** /**
* 关于我们描述 * 关于我们描述
* @auth true * @auth true

View File

@ -97,8 +97,9 @@ class NewsItem extends Controller
$data['code'] = CodeExtend::uniqidNumber(14, 'A'); $data['code'] = CodeExtend::uniqidNumber(14, 'A');
} }
if ($this->request->isGet()) { if ($this->request->isGet()) {
$query = $this->app->db->name('DataNewsMark')->where(['deleted' => 0, 'status' => 1]); $map = ['deleted' => 0, 'status' => 1];
$this->mark = $query->order('sort desc,id desc')->select()->toArray(); $query = $this->app->db->name('DataNewsMark')->where($map);
$this->marks = $query->order('sort desc,id desc')->select()->toArray();
$data['mark'] = str2arr($data['mark'] ?? ''); $data['mark'] = str2arr($data['mark'] ?? '');
} else { } else {
$data['mark'] = arr2str($data['mark'] ?? []); $data['mark'] = arr2str($data['mark'] ?? []);

View File

@ -20,7 +20,6 @@ class NewsMark extends Controller
/** /**
* 文章标签管理 * 文章标签管理
* @auth true * @auth true
* @menu true
* @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException * @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException * @throws \think\db\exception\ModelNotFoundException

View File

@ -80,18 +80,15 @@ class Payment extends Controller
if ($this->request->isGet()) { if ($this->request->isGet()) {
$this->payments = []; $this->payments = [];
foreach ($this->types as $k => $vo) { foreach ($this->types as $k => $vo) {
[$allow, $group] = [[], ucfirst(strstr($k, '_', true))]; $allow = [];
foreach ($vo['bind'] as $api) if (isset(UserService::TYPES[$api])) { foreach ($vo['bind'] as $api) if (isset(UserService::TYPES[$api])) {
$allow[$api] = UserService::TYPES[$api]['name']; $allow[$api] = UserService::TYPES[$api]['name'];
} }
$vo['allow'] = join('、', $allow); $this->payments[$k] = array_merge($vo, ['allow' => join('、', $allow)]);
$this->payments[$group][$k] = $vo;
} }
$data['content'] = json_decode($data['content'] ?? '[]', true) ?: []; $data['content'] = json_decode($data['content'] ?? '[]', true) ?: [];
} else { } else {
if (empty($data['type'])) { if (empty($data['type'])) $this->error('请选择支付通道并配置支付参数!');
$this->error('请选择支付通道并配置支付参数!');
}
$data['content'] = json_encode($this->request->post() ?: [], JSON_UNESCAPED_UNICODE); $data['content'] = json_encode($this->request->post() ?: [], JSON_UNESCAPED_UNICODE);
} }
} }

View File

@ -20,7 +20,6 @@ class ShopGoodsMark extends Controller
/** /**
* 商品标签管理 * 商品标签管理
* @auth true * @auth true
* @menu true
* @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException * @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException * @throws \think\db\exception\ModelNotFoundException
@ -28,7 +27,9 @@ class ShopGoodsMark extends Controller
public function index() public function index()
{ {
$this->title = '商品标签管理'; $this->title = '商品标签管理';
$this->_query($this->table)->order('sort desc,id desc')->page(); $query = $this->_query($this->table);
$query->like('name')->dateBetween('create_at');
$query->equal('status')->order('sort desc,id desc')->page();
} }
/** /**

View File

@ -2,6 +2,7 @@
namespace app\data\controller; namespace app\data\controller;
use app\data\service\MessageService;
use think\admin\Controller; use think\admin\Controller;
/** /**
@ -33,6 +34,27 @@ class UserMessage extends Controller
$query->dateBetween('create_at')->order('id desc')->page(); $query->dateBetween('create_at')->order('id desc')->page();
} }
/**
* 短信接口配置
* @auth true
* @menu true
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function config()
{
if ($this->request->isGet()) {
$this->title = '短信接口配置';
$this->result = MessageService::instance()->balance();
$this->fetch();
} else {
$data = $this->request->post();
foreach ($data as $k => $v) sysconf($k, $v);
$this->success('配置保存成功!');
}
}
/** /**
* 删除短信记录 * 删除短信记录
* @auth true * @auth true

View File

@ -13,7 +13,8 @@ use think\Response;
* @package app\data\controller\api * @package app\data\controller\api
* @example 域名请修改为自己的地址,放到网页代码合适位置 * @example 域名请修改为自己的地址,放到网页代码合适位置
* <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script> * <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
* <script src="https://v6.thinkadmin.top/data/api.wechat/jssdk?mode=1"></script> * <script src="https://your.domain.com/data/api.wechat/oauth?mode=1"></script>
*
* 授权模式支持两种模块,参数 mode=0 时为静默授权mode=1 时为完整授权 * 授权模式支持两种模块,参数 mode=0 时为静默授权mode=1 时为完整授权
* 注意:回跳地址默认从 Header 中的 http_referer 获取,也可以传 source 参数 * 注意:回跳地址默认从 Header 中的 http_referer 获取,也可以传 source 参数
*/ */
@ -32,45 +33,22 @@ class Wechat extends Controller
*/ */
private $field; private $field;
/**
* 粉丝OPNEID
* @var string
*/
private $openid;
/**
* 网页授权配置
* @var array
*/
private $config;
/**
* 微信粉丝数据
* @var array
*/
private $fansInfo;
/**
* 前端用户数据
* @var array
*/
private $userInfo;
/** /**
* 控制器初始化 * 控制器初始化
* @return $this
*/ */
protected function initialize() protected function initialize(): Wechat
{ {
if (empty(UserService::TYPES[$this->type]['auth'])) { if (empty(UserService::TYPES[$this->type]['auth'])) {
$this->error("接口类型[{$this->type}]没有定义规则"); $this->error("接口类型[{$this->type}]没有定义规则");
} else { } else {
$this->field = UserService::TYPES[$this->type]['auth']; $this->field = UserService::TYPES[$this->type]['auth'];
} }
return $this;
} }
/** /**
* 加载对应JSSDK数据 * 获取 JSSDK 签名
* @return \think\Response
* @throws \WeChat\Exceptions\InvalidResponseException * @throws \WeChat\Exceptions\InvalidResponseException
* @throws \WeChat\Exceptions\LocalCacheException * @throws \WeChat\Exceptions\LocalCacheException
* @throws \think\Exception * @throws \think\Exception
@ -78,79 +56,39 @@ class Wechat extends Controller
* @throws \think\db\exception\DbException * @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException * @throws \think\db\exception\ModelNotFoundException
*/ */
public function jssdk(): Response public function jssdk()
{ {
$wechat = WechatService::instance(); $url = input('source') ?: $this->request->server('http_referer');
$source = $this->request->server('http_referer', $this->request->get('source', '')); $this->success('获取签名参数', WechatService::instance()->getWebJssdkSign($url));
}
/**
* 加载网页授权数据
* @return \think\Response
* @throws \think\Exception
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function oauth(): Response
{
[$script, $wechat] = [[], WechatService::instance()];
$source = input('source') ?: $this->request->server('http_referer');
$result = $wechat->getWebOauthInfo($source ?: $this->request->url(true), input('mode', 1), false); $result = $wechat->getWebOauthInfo($source ?: $this->request->url(true), input('mode', 1), false);
if (empty($result['openid'])) { if (empty($result['openid'])) {
$content = 'alert("Wechat WebOauth failed.")'; $script[] = 'alert("Wechat WebOauth failed.")';
} else { } else {
$this->openid = $result['openid']; $data = $result['fansinfo'] ?? [];
$this->fansInfo = $result['fansinfo'] ?? [];
$this->config = $wechat->getWebJssdkSign($source);
// 用户注册并登录生成接口令牌
$data = $this->fansInfo;
$data['openid2'] = $data['openid']; $data['openid2'] = $data['openid'];
$data['base_sex'] = ['未知', '男', '女'][$data['sex']] ?? '未知'; $data['base_sex'] = ['未知', '男', '女'][$data['sex']] ?? '未知';
if (isset($data['headimgurl'])) $data['headimg'] = $data['headimgurl']; if (isset($data['headimgurl'])) $data['headimg'] = $data['headimgurl'];
$map = isset($data['unionid']) ? ['unionid' => $data['unionid']] : [$this->field => $this->openid]; $map = isset($data['unionid']) ? ['unionid' => $data['unionid']] : [$this->field => $result['openid']];
$this->userInfo = UserService::instance()->set($map, array_merge($map, $data), $this->type, true); $result['userinfo'] = UserService::instance()->set($map, array_merge($map, $data), $this->type, true);
$content = $this->_buildContent(); $script[] = "window.WeChatOpenid='{$result['openid']}'";
$script[] = 'window.WeChatFansInfo=' . json_encode($result['fansinfo'], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
$script[] = 'window.WeChatUserInfo=' . json_encode($result['userinfo'], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
} }
return Response::create($content)->contentType('application/x-javascript'); $script[] = '';
return Response::create(join(";\n", $script))->contentType('application/x-javascript');
} }
/**
* 页面授权 jssdk 测试
* @return string
*/
public function jssdkTest(): string
{
$src = sysuri('data/api.wechat/jssdk', [], false, true) . '?mode=1';
return <<<EOL
<html lang="zh">
<header>
<title>页面授权测试</title>
<script src="//res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script src="{$src}"></script>
</header>
<body>
<script>document.write(JSON.stringify(wx||{}));</script>
</body>
</html>
EOL;
}
/**
* 生成JOSN数据
* @param mixed $data
* @return false|string
*/
private function _jsonEncode($data)
{
return json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}
/**
* 生成授权内容
* @return string
*/
private function _buildContent(): string
{
return <<<EOF
if (typeof wx === 'object') {
wx.openid="{$this->openid}";
wx.config({$this->_jsonEncode($this->config)});
wx.fansinfo={$this->_jsonEncode($this->fansInfo)};
wx.userinfo={$this->_jsonEncode($this->userInfo)};
wx.ready(function(){
wx.hideOptionMenu();
wx.hideAllNonBaseMenuItem();
});
}
EOF;
}
} }

View File

@ -117,15 +117,16 @@ class Center extends Auth
{ {
$data = $this->_vali(['from.require' => '邀请人不能为空']); $data = $this->_vali(['from.require' => '邀请人不能为空']);
if ($data['from'] == $this->uuid) { if ($data['from'] == $this->uuid) {
$this->error('邀请人不能是自己', UserService::instance()->total($this->uuid)); $this->error('邀请人不能是自己', UserService::instance()->total($this->uuid));
} }
$from = $this->app->db->name($this->table)->where(['id' => $data['from']])->find(); $from = $this->app->db->name($this->table)->where(['id' => $data['from']])->find();
if (empty($from)) $this->error('邀请人状态异常', UserService::instance()->get($this->type, $this->uuid)); if (empty($from)) $this->error('邀请人状态异常', UserService::instance()->get($this->type, $this->uuid));
if ($this->user['from'] > 0) $this->error('您已经绑定了邀请人', UserService::instance()->total($this->uuid)); if ($this->user['from'] > 0) $this->error('已绑定了邀请人', UserService::instance()->total($this->uuid));
$data['path'] = rtrim($from['path'] ?: '-', '-') . '-' . $from['id'] . '-';
if ($this->app->db->name($this->table)->where(['id' => $this->uuid])->update($data) !== false) { if ($this->app->db->name($this->table)->where(['id' => $this->uuid])->update($data) !== false) {
$this->success('绑定邀请人成功', UserService::instance()->total($this->uuid)); $this->success('绑定邀请人成功', UserService::instance()->total($this->uuid));
} else { } else {
$this->error('绑定邀请人失败', UserService::instance()->total($this->uuid)); $this->error('绑定邀请人失败', UserService::instance()->total($this->uuid));
} }
} }

View File

@ -2,9 +2,6 @@
{block name="content"} {block name="content"}
<div class="think-box-shadow"> <div class="think-box-shadow">
<p class=" margin-bottom-15">
演示接口文档:<a target="_blank" href="http://www.docway.net/project/1WkI0ZyQ7M1/share/1Wld0z7b1zE">http://www.docway.net/project/1WkI0ZyQ7M1/share/1Wld0z7b1zE</a>
</p>
<form onsubmit="return false;" data-auto="true" action="{$request->url()}" method="post" class='layui-form layui-card' autocomplete="off"> <form onsubmit="return false;" data-auto="true" action="{$request->url()}" method="post" class='layui-form layui-card' autocomplete="off">
<div class="layui-card-body padding-30"> <div class="layui-card-body padding-30">
<textarea class="layui-hide" name="content">{$data.content|default=''}</textarea> <textarea class="layui-hide" name="content">{$data.content|default=''}</textarea>

View File

@ -7,7 +7,7 @@
<span class="color-green font-w7 label-required-prev">文章标签</span> <span class="color-green font-w7 label-required-prev">文章标签</span>
<span class="color-desc margin-left-5">Mark Name</span> <span class="color-desc margin-left-5">Mark Name</span>
<div class="markbox layui-textarea"> <div class="markbox layui-textarea">
{foreach $mark as $tag}{if isset($vo.mark) && is_array($vo.mark) && in_array($tag.name, $vo.mark)} {foreach $marks as $tag}{if isset($vo.mark) && is_array($vo.mark) && in_array($tag.name, $vo.mark)}
<label class="think-checkbox notselect"><input checked type="checkbox" name="mark[]" value="{$tag.name}" lay-ignore> {$tag.name}</label> <label class="think-checkbox notselect"><input checked type="checkbox" name="mark[]" value="{$tag.name}" lay-ignore> {$tag.name}</label>
{else} {else}
<label class="think-checkbox notselect"><input type="checkbox" name="mark[]" value="{$tag.name}" lay-ignore> {$tag.name}</label> <label class="think-checkbox notselect"><input type="checkbox" name="mark[]" value="{$tag.name}" lay-ignore> {$tag.name}</label>

View File

@ -1,8 +1,12 @@
{extend name="../../admin/view/main"} {extend name="../../admin/view/main"}
{block name="button"} {block name="button"}
<!--{if auth("news_mark/index")}-->
<button data-iframe='{:url("news_mark/index")}' data-width="900px" data-title="标签管理" class='layui-btn layui-btn-sm layui-btn-primary'>标签管理</button>
<!--{/if}-->
<!--{if auth("add")}--> <!--{if auth("add")}-->
<button data-open='{:url("add")}' data-title="添加文章内容" class='layui-btn layui-btn-sm layui-btn-primary'>添加文章</button> <button data-open='{:url("add")}' class='layui-btn layui-btn-sm layui-btn-primary'>添加文章</button>
<!--{/if}--> <!--{/if}-->
<!--{if auth("remove")}--> <!--{if auth("remove")}-->
@ -12,9 +16,6 @@
{block name='content'} {block name='content'}
<div class="think-box-shadow table-block"> <div class="think-box-shadow table-block">
<p class=" margin-bottom-15">
演示接口文档:<a target="_blank" href="http://www.docway.net/project/1WkI0ZyQ7M1/share/1Wld0z7b1zE">http://www.docway.net/project/1WkI0ZyQ7M1/share/1Wld0z7b1zE</a>
</p>
{include file='news_item/index_search'} {include file='news_item/index_search'}
<table class="layui-table margin-top-10" lay-skin="line"> <table class="layui-table margin-top-10" lay-skin="line">
{notempty name='list'} {notempty name='list'}

View File

@ -4,7 +4,7 @@
<span class="color-green font-w7">标签名称</span> <span class="color-green font-w7">标签名称</span>
<span class="color-desc margin-left-5">Mark Name</span> <span class="color-desc margin-left-5">Mark Name</span>
<input class="layui-input" required placeholder="请输入标签名称" name="name" value="{$vo.name|default=''}"/> <input class="layui-input" required placeholder="请输入标签名称" name="name" value="{$vo.name|default=''}"/>
<span class="help-block"><b>必填,</b>请填写分类名称(如:系统管理)建议字符不要太长一般4-6个汉字</span> <span class="help-block"><b>必填,</b>请填写标签名称建议字符不要太长一般4-6个汉字</span>
</label> </label>
<div class="layui-form-item relative block"> <div class="layui-form-item relative block">

View File

@ -1,20 +1,7 @@
{extend name="../../admin/view/main"} {extend name="../../admin/view/full"}
{block name="button"}
<!--{if auth("add")}-->
<button data-modal='{:url("add")}' data-title="添加标签" class='layui-btn layui-btn-sm layui-btn-primary'>添加标签</button>
<!--{/if}-->
<!--{if auth("remove")}-->
<button data-action='{:url("remove")}' data-rule="id#{key}" data-confirm="确定要删除这些标签吗?" class='layui-btn layui-btn-sm layui-btn-primary'>删除标签</button>
<!--{/if}-->
{/block}
{block name='content'} {block name='content'}
<div class="think-box-shadow table-block"> <div class="iframe-pagination">
<p class=" margin-bottom-15">
演示接口文档:<a target="_blank" href="http://www.docway.net/project/1WkI0ZyQ7M1/share/1Wld0z7b1zE">http://www.docway.net/project/1WkI0ZyQ7M1/share/1Wld0z7b1zE</a>
</p>
{include file='news_mark/index_search'} {include file='news_mark/index_search'}
<table class="layui-table margin-top-10" lay-skin="line"> <table class="layui-table margin-top-10" lay-skin="line">
{notempty name='list'} {notempty name='list'}
@ -47,7 +34,7 @@
<td class="text-left nowrap">{$vo.create_at|format_datetime}</td> <td class="text-left nowrap">{$vo.create_at|format_datetime}</td>
<td class='text-left nowrap'> <td class='text-left nowrap'>
{if auth("edit")} {if auth("edit")}
<a data-dbclick class="layui-btn layui-btn-sm" data-title="编辑标签" data-modal="{:url('edit')}?id={$vo.id}"> </a> <a data-dbclick class="layui-btn layui-btn-sm" data-width="500px" data-title="编辑标签" data-modal="{:url('edit')}?id={$vo.id}"> </a>
{/if} {/if}
{if auth("state") and $vo.status eq 1} {if auth("state") and $vo.status eq 1}
<a class="layui-btn layui-btn-sm layui-btn-warm" data-action="{:url('state')}" data-value="id#{$vo.id};status#0"> </a> <a class="layui-btn layui-btn-sm layui-btn-warm" data-action="{:url('state')}" data-value="id#{$vo.id};status#0"> </a>
@ -64,5 +51,10 @@
</tbody> </tbody>
</table> </table>
{empty name='list'}<span class="notdata">没有记录哦</span>{else}{$pagehtml|raw|default=''}{/empty} {empty name='list'}<span class="notdata">没有记录哦</span>{else}{$pagehtml|raw|default=''}{/empty}
<div class="absolute" style="bottom:5px;right:10px">
<!--{if auth("add")}-->
<button type="button" data-width="500px" data-modal='{:url("add")}' data-title="添加标签" class='layui-btn layui-btn-sm'>添加标签</button>
<!--{/if}-->
</div>
</div> </div>
{/block} {/block}

View File

@ -12,7 +12,8 @@
<label class="layui-form-label">使用状态</label> <label class="layui-form-label">使用状态</label>
<div class="layui-input-inline"> <div class="layui-input-inline">
<select class="layui-select" name="status"> <select class="layui-select" name="status">
{foreach [''=>'-- 全部 --','0'=>'已禁用的记录','1'=>'已激活的记录'] as $k=>$v} <option value=''>-- 全部 --</option>
{foreach ['已禁用的记录','已激活的记录'] as $k=>$v}
{if $k.'' eq input('status')} {if $k.'' eq input('status')}
<option selected value="{$k}">{$v}</option> <option selected value="{$k}">{$v}</option>
{else} {else}

View File

@ -15,18 +15,12 @@
<span class="color-green font-w7 label-required-prev">支付方式</span> <span class="color-green font-w7 label-required-prev">支付方式</span>
<span class="color-desc margin-left-5">Payment Channel</span> <span class="color-desc margin-left-5">Payment Channel</span>
<label class="block full-width"> <label class="block full-width">
{empty name='vo.type'}{php}$vo['type'] = 'wechat_xcx';{/php}{/empty}
<select name="type" class="layui-select" lay-search lay-filter="payment-type"> <select name="type" class="layui-select" lay-search lay-filter="payment-type">
<option value="">-- 请选择 --</option> {foreach $payments as $k=>$v}{if isset($vo.type) and $vo.type eq $k}
{foreach $payments as $kk => $vv} <option selected value="{$k}">{$v.name} ( {$v.allow} )</option>
<optgroup label="{$kk}"> {else}
{foreach $vv as $k => $v}{if $vo.type eq $k} <option value="{$k}">{$v.name} ( {$v.allow} )</option>
<option selected value="{$k}">{$v.name} ( {$v.allow} )</option> {/if}{/foreach}
{else}
<option value="{$k}">{$v.name} ( {$v.allow} )</option>
{/if}{/foreach}
</optgroup>
{/foreach}
</select> </select>
</label> </label>
</div> </div>
@ -60,8 +54,10 @@
{block name='script'} {block name='script'}
<script> <script>
(function () { (function () {
layui.form.render(); layui.form.render();
apply({value: '{$vo.type}'});
apply({value: $('select[name=type]').val()});
layui.form.on('select(payment-type)', apply); layui.form.on('select(payment-type)', apply);
function apply(data) { function apply(data) {
@ -75,6 +71,7 @@
$('[data-payment-type]').addClass('layui-hide'); $('[data-payment-type]').addClass('layui-hide');
} }
} }
})(); })();
</script> </script>
{/block} {/block}

View File

@ -12,9 +12,6 @@
{block name='content'} {block name='content'}
<div class="think-box-shadow"> <div class="think-box-shadow">
<p class=" margin-bottom-15">
演示接口文档:<a target="_blank" href="http://www.docway.net/project/1WkI0ZyQ7M1/share/1Wld0z7b1zE">http://www.docway.net/project/1WkI0ZyQ7M1/share/1Wld0z7b1zE</a>
</p>
{include file='payment/index_search'} {include file='payment/index_search'}
<table class="layui-table margin-top-10" lay-skin="line"> <table class="layui-table margin-top-10" lay-skin="line">
{notempty name='list'} {notempty name='list'}

View File

@ -4,6 +4,7 @@
{include file='shop_goods/formstyle'} {include file='shop_goods/formstyle'}
<form onsubmit="return false;" id="GoodsForm" data-auto="true" method="post" class='layui-form layui-card table-block' autocomplete="off"> <form onsubmit="return false;" id="GoodsForm" data-auto="true" method="post" class='layui-form layui-card table-block' autocomplete="off">
<div class="layui-card-body padding-40 padding-bottom-20"> <div class="layui-card-body padding-40 padding-bottom-20">
{notempty name='marks'}
<div class="layui-form-item relative block"> <div class="layui-form-item relative block">
<span class="color-green font-w7 label-required-prev">商品标签</span> <span class="color-green font-w7 label-required-prev">商品标签</span>
<span class="color-desc margin-left-5">Mark Name</span> <span class="color-desc margin-left-5">Mark Name</span>
@ -15,6 +16,9 @@
{/if}{/foreach} {/if}{/foreach}
</div> </div>
</div> </div>
{/notempty}
{notempty name='cates'}
<label class="layui-form-item block relative"> <label class="layui-form-item block relative">
<span class="color-green font-w7 label-required-prev">所属分类</span> <span class="color-green font-w7 label-required-prev">所属分类</span>
<span class="color-desc margin-left-5">Category Name</span> <span class="color-desc margin-left-5">Category Name</span>
@ -26,11 +30,14 @@
{/if}{/foreach} {/if}{/foreach}
</select> </select>
</label> </label>
{/notempty}
<label class="layui-form-item block relative"> <label class="layui-form-item block relative">
<span class="color-green font-w7">商品名称</span> <span class="color-green font-w7">商品名称</span>
<span class="color-desc margin-left-5">Goods Name</span> <span class="color-desc margin-left-5">Goods Name</span>
<input name="name" required class="layui-input" placeholder="请输入商品名称" value="{$vo.name|default=''}"> <input name="name" required class="layui-input" placeholder="请输入商品名称" value="{$vo.name|default=''}">
</label> </label>
<label class="layui-form-item block relative"> <label class="layui-form-item block relative">
<span class="color-green font-w7 label-required-prev">邮费模板</span> <span class="color-green font-w7 label-required-prev">邮费模板</span>
<span class="color-desc margin-left-5">Truck Template</span> <span class="color-desc margin-left-5">Truck Template</span>
@ -43,6 +50,7 @@
{/if}{/foreach} {/if}{/foreach}
</select> </select>
</label> </label>
<div class="layui-form-item"> <div class="layui-form-item">
<span class="color-green font-w7 label-required-prev">商品图片及轮播展示图片</span> <span class="color-green font-w7 label-required-prev">商品图片及轮播展示图片</span>
<table class="layui-table"> <table class="layui-table">
@ -64,6 +72,7 @@
</thead> </thead>
</table> </table>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<span class="color-green font-w7 label-required-prev">商品规格及商品SKU绑定<span class="color-red font-s12">(规格填写后不允许再次修改)</span></span> <span class="color-green font-w7 label-required-prev">商品规格及商品SKU绑定<span class="color-red font-s12">(规格填写后不允许再次修改)</span></span>
<div ng-repeat="x in specs track by $index" style="display:none" class="margin-bottom-10" ng-class="{true:'layui-show'}[mode==='add'&&specs.length>0]"> <div ng-repeat="x in specs track by $index" style="display:none" class="margin-bottom-10" ng-class="{true:'layui-show'}[mode==='add'&&specs.length>0]">
@ -98,7 +107,7 @@
<th width="10%" class="text-center nowrap">销售价格 <a ng-click="batchSet('selling',2)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th> <th width="10%" class="text-center nowrap">销售价格 <a ng-click="batchSet('selling',2)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th>
<th width="10%" class="text-center nowrap">虚拟销量 <a ng-click="batchSet('virtual',0)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th> <th width="10%" class="text-center nowrap">虚拟销量 <a ng-click="batchSet('virtual',0)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th>
<th width="10%" class="text-center nowrap">快递计件 <a ng-click="batchSet('express',0)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th> <th width="10%" class="text-center nowrap">快递计件 <a ng-click="batchSet('express',0)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th>
<th width="8%" class="text-center nowrap">销售状态</th> <th width="08%" class="text-center nowrap">销售状态</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -141,17 +150,21 @@
<textarea class="layui-textarea" name="data_items">{{items}}</textarea> <textarea class="layui-textarea" name="data_items">{{items}}</textarea>
</label> </label>
</div> </div>
<label class="layui-form-item block"> <label class="layui-form-item block">
<span class="font-w7 color-green">商品简介描述</span> <span class="font-w7 color-green">商品简介描述</span>
<textarea class="layui-textarea" placeholder="请输入商品简介描述" name="remark">{$vo.remark|default=''|raw}</textarea> <textarea class="layui-textarea" placeholder="请输入商品简介描述" name="remark">{$vo.remark|default=''|raw}</textarea>
</label> </label>
<div class="layui-form-item block"> <div class="layui-form-item block">
<span class="label-required-prev font-w7 color-green">商品富文本详情</span> <span class="label-required-prev font-w7 color-green">商品富文本详情</span>
<textarea name="content">{$vo.content|default=''|raw}</textarea> <textarea name="content">{$vo.content|default=''|raw}</textarea>
</div> </div>
<div class="hr-line-dashed margin-top-40"></div> <div class="hr-line-dashed margin-top-40"></div>
{notempty name='vo.code'}<input type="hidden" name="code" value="{$vo.code}">{/notempty}
<div class="layui-form-item text-center"> <div class="layui-form-item text-center">
{notempty name='vo.code'}<input type="hidden" name="code" value="{$vo.code}">{/notempty}
<button class="layui-btn layui-btn-danger" ng-click="pageBack()" type="button">取消编辑</button> <button class="layui-btn layui-btn-danger" ng-click="pageBack()" type="button">取消编辑</button>
<button class="layui-btn" type="submit">保存商品</button> <button class="layui-btn" type="submit">保存商品</button>
</div> </div>

View File

@ -1,6 +1,10 @@
{extend name="../../admin/view/main"} {extend name="../../admin/view/main"}
{block name="button"} {block name="button"}
<!--{if auth("shop_goods_mark/index")}-->
<button data-iframe='{:url("shop_goods_mark/index")}' data-width="900px" data-title="标签管理" class='layui-btn layui-btn-sm layui-btn-primary'>标签管理</button>
<!--{/if}-->
<!--{if auth("add")}--> <!--{if auth("add")}-->
<button data-open='{:url("add")}' class='layui-btn layui-btn-sm layui-btn-primary'>添加商品</button> <button data-open='{:url("add")}' class='layui-btn layui-btn-sm layui-btn-primary'>添加商品</button>
<!--{/if}--> <!--{/if}-->
@ -37,8 +41,8 @@
<th class='list-table-sort-td'> <th class='list-table-sort-td'>
<button type="button" data-reload class="layui-btn layui-btn-xs"> </button> <button type="button" data-reload class="layui-btn layui-btn-xs"> </button>
</th> </th>
<th class='text-left nowrap'>商品名称</th> <th class='text-left nowrap'>商品信息</th>
<th class='text-left nowrap'>商品标签</th> <th></th>
<th></th> <th></th>
<th></th> <th></th>
</tr> </tr>
@ -69,18 +73,22 @@
</td> </td>
<td class='nowrap'> <td class='nowrap'>
销售状态:{eq name='vo.status' value='0'}<span class="layui-badge">已下架</span>{else}<span class="layui-badge layui-bg-green">销售中</span>{/eq}<br> 销售状态:{eq name='vo.status' value='0'}<span class="layui-badge">已下架</span>{else}<span class="layui-badge layui-bg-green">销售中</span>{/eq}<br>
<!--{notempty name='clist'}-->
所属分类:{$vo.cate.name|default='-'}<br> 所属分类:{$vo.cate.name|default='-'}<br>
<!--{/notempty}-->
</td> </td>
<td class='nowrap sub-span-blue'> <td class='nowrap sub-span-blue'>
<div class="margin-bottom-5">剩余库存 <span>{$vo.stock_total-$vo.stock_sales}</span> ( 已销售 <span>{$vo.stock_sales}</span> )</div> <div class="margin-bottom-5">剩余库存 <span>{$vo.stock_total-$vo.stock_sales}</span> ( 已销售 <span>{$vo.stock_sales}</span> )</div>
{if auth('copy')} <!--{if auth('copy')}-->
<a class="layui-btn layui-btn-xs layui-btn-normal" data-open='{:url("copy")}?code={$vo.code}'> </a> <a class="layui-btn layui-btn-xs layui-btn-normal" data-open='{:url("copy")}?code={$vo.code}'> </a>
{/if} <!--{/if}-->
<!--{if auth("edit")}--> <!--{if auth("edit")}-->
<a class="layui-btn layui-btn-xs" data-open='{:url("edit")}?code={$vo.code}'> </a> <a class="layui-btn layui-btn-xs" data-open='{:url("edit")}?code={$vo.code}'> </a>
<!--{else}--> <!--{else}-->
<a data-tips-text="您没有编辑商品的权限哦!" class="layui-btn layui-btn-xs layui-btn-primary layui-disabled"> </a> <a data-tips-text="您没有编辑商品的权限哦!" class="layui-btn layui-btn-xs layui-btn-primary layui-disabled"> </a>
<!--{/if}--> <!--{/if}-->
{if isset($type) and $type eq 'index'} {if isset($type) and $type eq 'index'}
{if isset($vo.status) and $vo.status eq 1} {if isset($vo.status) and $vo.status eq 1}
<!--{if auth("state")}--> <!--{if auth("state")}-->

View File

@ -7,12 +7,15 @@
<input name="code" value="{:input('code','')}" placeholder="请输入商品编号" class="layui-input"> <input name="code" value="{:input('code','')}" placeholder="请输入商品编号" class="layui-input">
</label> </label>
</div> </div>
<div class="layui-form-item layui-inline"> <div class="layui-form-item layui-inline">
<label class="layui-form-label">商品名称</label> <label class="layui-form-label">商品名称</label>
<label class="layui-input-inline"> <label class="layui-input-inline">
<input name="name" value="{:input('name','')}" placeholder="请输入商品名称" class="layui-input"> <input name="name" value="{:input('name','')}" placeholder="请输入商品名称" class="layui-input">
</label> </label>
</div> </div>
{notempty name='marks'}
<div class="layui-form-item layui-inline"> <div class="layui-form-item layui-inline">
<label class="layui-form-label">商品标签</label> <label class="layui-form-label">商品标签</label>
<label class="layui-input-inline"> <label class="layui-input-inline">
@ -26,6 +29,9 @@
</select> </select>
</label> </label>
</div> </div>
{/notempty}
{notempty name='clist'}
<div class="layui-form-item layui-inline"> <div class="layui-form-item layui-inline">
<label class="layui-form-label">商品分类</label> <label class="layui-form-label">商品分类</label>
<label class="layui-input-inline"> <label class="layui-input-inline">
@ -39,11 +45,14 @@
</select> </select>
</label> </label>
</div> </div>
{/notempty}
<div class="layui-form-item layui-inline"> <div class="layui-form-item layui-inline">
<label class="layui-form-label">销售状态</label> <label class="layui-form-label">销售状态</label>
<label class="layui-input-inline"> <label class="layui-input-inline">
<select class="layui-select" name="status"> <select class="layui-select" name="status">
{foreach [''=>'- 全部状态 -','1'=>'销售中商品','0'=>'已下架商品'] as $k=>$v} <option value=''>-- 全部状态 --</option>
{foreach ['已下架的商品','销售中的商品'] as $k=>$v}
{if input('status','-') eq $k.''} {if input('status','-') eq $k.''}
<option selected value="{$k}">{$v}</option> <option selected value="{$k}">{$v}</option>
{else} {else}

View File

@ -2,13 +2,12 @@
{block name="content"} {block name="content"}
<div class="iframe-pagination"> <div class="iframe-pagination">
{include file='shop_goods/index_search'} {include file='shop_goods/select_search'}
<table class="layui-table margin-top-10" lay-skin="line"> <table class="layui-table margin-top-10" lay-skin="line">
{notempty name='list'} {notempty name='list'}
<thead> <thead>
<tr> <tr>
<th>商品信息</th> <th>商品信息</th>
<th>分类标签</th>
<th>商品状态</th> <th>商品状态</th>
<th></th> <th></th>
</tr> </tr>
@ -26,10 +25,6 @@
商品名称:{$vo.name|default='--'}<br> 商品名称:{$vo.name|default='--'}<br>
</div> </div>
</td> </td>
<td class='nowrap'>
所属分类:{$vo.cate.name|default=''}<br>
{notempty name='vo.mark'}{foreach $vo.mark as $mark}<span class="margin-right-5 layui-badge layui-bg-cyan">{$mark}</span>{/foreach}{/notempty}
</td>
<td class='nowrap sub-span-blue'> <td class='nowrap sub-span-blue'>
销售状态:{if $vo.status eq 0}<b class="color-red">已下架</b>{else}<b class="color-green">销售中</b>{/if}<br> 销售状态:{if $vo.status eq 0}<b class="color-red">已下架</b>{else}<b class="color-green">销售中</b>{/if}<br>
剩余库存 <span>{$vo.stock_total-$vo.stock_sales}</span> ( 已销售 <span>{$vo.stock_sales}</span> )<br> 剩余库存 <span>{$vo.stock_total-$vo.stock_sales}</span> ( 已销售 <span>{$vo.stock_sales}</span> )<br>

View File

@ -0,0 +1,36 @@
<fieldset>
<legend>条件搜索</legend>
<form class="layui-form layui-form-pane form-search" action="{:request()->url()}" onsubmit="return false" method="get" autocomplete="off">
<div class="layui-form-item layui-inline">
<label class="layui-form-label">商品编号</label>
<label class="layui-input-inline">
<input name="code" value="{:input('code','')}" placeholder="请输入商品编号" class="layui-input">
</label>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">商品名称</label>
<label class="layui-input-inline">
<input name="name" value="{:input('name','')}" placeholder="请输入商品名称" class="layui-input">
</label>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">销售状态</label>
<label class="layui-input-inline">
<select class="layui-select" name="status">
<option value=''>-- 全部状态 --</option>
{foreach ['已下架的商品','销售中的商品'] as $k=>$v}
{if input('status','-') eq $k.''}
<option selected value="{$k}">{$v}</option>
{else}
<option value="{$k}">{$v}</option>
{/if}{/foreach}
</select>
</label>
</div>
<div class="layui-form-item layui-inline">
<button class="layui-btn layui-btn-primary"><i class="layui-icon">&#xe615;</i> 搜 索</button>
</div>
</form>
</fieldset>

View File

@ -3,19 +3,22 @@
<label class="layui-form-item relative block"> <label class="layui-form-item relative block">
<span class="color-green font-w7">标签名称</span> <span class="color-green font-w7">标签名称</span>
<span class="color-desc margin-left-5">Mark Name</span> <span class="color-desc margin-left-5">Mark Name</span>
<input class="layui-input" required placeholder="请输入标签名称" name="name" value="{$vo.name|default=''}"> <input class="layui-input" required placeholder="请输入标签名称" name="name" value="{$vo.name|default=''}"/>
<span class="help-block"><b>必填,</b>请填写分类名称(如:系统管理)建议字符不要太长一般4-6个汉字</span> <span class="help-block"><b>必填,</b>请填写标签名称建议字符不要太长一般4-6个汉字</span>
</label> </label>
<div class="layui-form-item relative block"> <div class="layui-form-item relative block">
<span class="color-green font-w7">标签描述</span> <span class="color-green font-w7">标签描述</span>
<span class="color-desc margin-left-5">Mark Remark</span> <span class="color-desc margin-left-5">Mark Remark</span>
<label class="relative block"> <label class="relative block">
<textarea class="layui-textarea" placeholder="请输入标签描述" name="remark">{$vo.remark|default=''}</textarea> <textarea class="layui-textarea" placeholder="请输入文档描述" name="desc">{$vo.desc|default=''}</textarea>
</label> </label>
</div> </div>
</div> </div>
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
{notempty name='vo.id'}<input type='hidden' value='{$vo.id}' name='id'>{/notempty} {notempty name='vo.id'}<input type='hidden' value='{$vo.id}' name='id'>{/notempty}
<div class="layui-form-item text-center"> <div class="layui-form-item text-center">
<button class="layui-btn" type='submit'>保存数据</button> <button class="layui-btn" type='submit'>保存数据</button>
<button class="layui-btn layui-btn-danger" type='button' data-confirm="确定要取消编辑吗?" data-close>取消编辑</button> <button class="layui-btn layui-btn-danger" type='button' data-confirm="确定要取消编辑吗?" data-close>取消编辑</button>

View File

@ -1,16 +1,8 @@
{extend name="../../admin/view/main"} {extend name="../../admin/view/full"}
{block name="button"}
<!--{if auth("add")}-->
<button data-modal='{:url("add")}' data-title="添加标签" class='layui-btn layui-btn-sm layui-btn-primary'>添加标签</button>
<!--{/if}-->
<!--{if auth("remove")}-->
<button data-action='{:url("remove")}' data-rule="id#{key}" data-confirm="确定要删除这些标签吗?" class='layui-btn layui-btn-sm layui-btn-primary'>删除标签</button>
<!--{/if}-->
{/block}
{block name='content'} {block name='content'}
<div class="think-box-shadow"> <div class="iframe-pagination">
{include file='shop_goods_mark/index_search'}
<table class="layui-table margin-top-10" lay-skin="line"> <table class="layui-table margin-top-10" lay-skin="line">
{notempty name='list'} {notempty name='list'}
<thead> <thead>
@ -43,7 +35,7 @@
<td class='text-left nowrap'> <td class='text-left nowrap'>
<!--{if auth("edit")}--> <!--{if auth("edit")}-->
<a data-dbclick class="layui-btn layui-btn-sm" data-title="编辑标签" data-modal="{:url('edit')}?id={$vo.id}"> </a> <a data-dbclick class="layui-btn layui-btn-sm" data-width="500px" data-title="编辑标签" data-modal="{:url('edit')}?id={$vo.id}"> </a>
<!--{/if}--> <!--{/if}-->
<!--{if auth("state") and $vo.status eq 1}--> <!--{if auth("state") and $vo.status eq 1}-->
@ -64,5 +56,11 @@
</tbody> </tbody>
</table> </table>
{empty name='list'}<span class="notdata">没有记录哦</span>{else}{$pagehtml|raw|default=''}{/empty} {empty name='list'}<span class="notdata">没有记录哦</span>{else}{$pagehtml|raw|default=''}{/empty}
<div class="absolute" style="bottom:5px;right:10px">
<!--{if auth("add")}-->
<button type="button" data-width="500px" data-modal='{:url("add")}' data-title="添加标签" class='layui-btn layui-btn-sm'>添加标签</button>
<!--{/if}-->
</div>
</div> </div>
{/block} {/block}

View File

@ -0,0 +1,39 @@
<fieldset>
<legend>条件搜索</legend>
<form class="layui-form layui-form-pane form-search" action="{:request()->url()}" onsubmit="return false" method="get" autocomplete="off">
<div class="layui-form-item layui-inline">
<label class="layui-form-label">标签名称</label>
<label class="layui-input-inline">
<input name="name" value="{:input('name','')}" placeholder="请输入标签名称" class="layui-input">
</label>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">使用状态</label>
<div class="layui-input-inline">
<select class="layui-select" name="status">
<option value=''>-- 全部 --</option>
{foreach ['已禁用的记录','已激活的记录'] as $k=>$v}
{if $k.'' eq input('status')}
<option selected value="{$k}">{$v}</option>
{else}
<option value="{$k}">{$v}</option>
{/if}{/foreach}
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">创建时间</label>
<label class="layui-input-inline">
<input data-date-range name="create_at" value="{:input('create_at','')}" placeholder="请选择创建时间" class="layui-input">
</label>
</div>
<div class="layui-form-item layui-inline">
<button class="layui-btn layui-btn-primary"><i class="layui-icon">&#xe615;</i> 搜 索</button>
</div>
</form>
</fieldset>
<script>window.form.render()</script>

View File

@ -14,9 +14,7 @@
<thead> <thead>
<tr> <tr>
<th class='list-table-check-td think-checkbox'> <th class='list-table-check-td think-checkbox'>
<label> <label><input data-auto-none data-check-target='.list-check-box' type='checkbox'></label>
<input data-auto-none data-check-target='.list-check-box' type='checkbox'>
</label>
</th> </th>
<th class='text-left nowrap'>目标手机</th> <th class='text-left nowrap'>目标手机</th>
<th class='text-left nowrap'>短信内容</th> <th class='text-left nowrap'>短信内容</th>
@ -30,9 +28,7 @@
{foreach $list as $key=>$vo} {foreach $list as $key=>$vo}
<tr> <tr>
<td class='list-table-check-td think-checkbox'> <td class='list-table-check-td think-checkbox'>
<label> <label><input class="list-check-box" value='{$vo.id}' type='checkbox'></label>
<input class="list-check-box" value='{$vo.id}' type='checkbox'>
</label>
</td> </td>
<td>{$vo.phone|default=''}</td> <td>{$vo.phone|default=''}</td>
<td>{$vo.content|default=''}</td> <td>{$vo.content|default=''}</td>

View File

@ -1,18 +1,20 @@
<fieldset> <fieldset>
<legend>条件搜索</legend> <legend>条件搜索</legend>
<form class="layui-form layui-form-pane form-search" action="{:request()->url()}" onsubmit="return false" method="get" autocomplete="off"> <form class="layui-form layui-form-pane form-search" action="{$request->url()}" onsubmit="return false" method="get" autocomplete="off">
<div class="layui-form-item layui-inline"> <div class="layui-form-item layui-inline">
<label class="layui-form-label">目标手机</label> <label class="layui-form-label">目标手机</label>
<label class="layui-input-inline"> <label class="layui-input-inline">
<input name="phone" value="{:input('phone')}" placeholder="请输入目标手机" class="layui-input"> <input name="phone" value="{:input('phone')}" placeholder="请输入目标手机" class="layui-input">
</label> </label>
</div> </div>
<div class="layui-form-item layui-inline"> <div class="layui-form-item layui-inline">
<label class="layui-form-label">短信内容</label> <label class="layui-form-label">短信内容</label>
<label class="layui-input-inline"> <label class="layui-input-inline">
<input name="content" value="{:input('content')}" placeholder="请输入短信内容" class="layui-input"> <input name="content" value="{:input('content')}" placeholder="请输入短信内容" class="layui-input">
</label> </label>
</div> </div>
<div class="layui-form-item layui-inline"> <div class="layui-form-item layui-inline">
<label class="layui-form-label">发送状态</label> <label class="layui-form-label">发送状态</label>
<div class="layui-input-inline"> <div class="layui-input-inline">
@ -27,12 +29,14 @@
</select> </select>
</div> </div>
</div> </div>
<div class="layui-form-item layui-inline"> <div class="layui-form-item layui-inline">
<label class="layui-form-label">发送时间</label> <label class="layui-form-label">发送时间</label>
<div class="layui-input-inline"> <div class="layui-input-inline">
<input data-date-range name="create_at" value="{:input('create_at','')}" placeholder="请选择发送时间" class="layui-input"> <input data-date-range name="create_at" value="{:input('create_at','')}" placeholder="请选择发送时间" class="layui-input">
</div> </div>
</div> </div>
<div class="layui-form-item layui-inline"> <div class="layui-form-item layui-inline">
<button class="layui-btn layui-btn-primary"><i class="layui-icon">&#xe615;</i> 搜 索</button> <button class="layui-btn layui-btn-primary"><i class="layui-icon">&#xe615;</i> 搜 索</button>
</div> </div>

2
vendor/services.php vendored
View File

@ -1,5 +1,5 @@
<?php <?php
// This file is automatically generated at:2021-01-04 11:04:38 // This file is automatically generated at:2021-01-08 13:03:11
declare (strict_types = 1); declare (strict_types = 1);
return array ( return array (
0 => 'think\\admin\\Library', 0 => 'think\\admin\\Library',