提交 c49d70c2 编写于 作者: ModStart's avatar ModStart

develop

上级 1b54dac9
......@@ -41,6 +41,7 @@ return [
'enable' => true,
'config' => [
'groupEnable' => true,
'vipEnable' => true,
],
],
'Cms' => [
......
......@@ -64,16 +64,16 @@ class CatController extends Controller
$builder->text('seoTitle', 'SEO标题')->listable(false);
$builder->text('seoDescription', 'SEO描述')->listable(false);
$builder->textarea('seoKeywords', 'SEO关键词')->listable(false);
// $builder->switch('visitMemberGroupEnable', '启用用户分组访问')->listable(false)
// ->when('=', true, function ($builder) {
// /** @var HasFields $builder */
// $builder->checkbox('visitMemberGroups', '允许访问的分组')->optionModel('member_group', 'id', 'title')->listable(false);
// });
// $builder->switch('visitMemberVipEnable', '启用用户VIP访问')->listable(false)
// ->when('=', true, function ($builder) {
// /** @var HasFields $builder */
// $builder->checkbox('visitMemberVips', '允许访问的VIP')->optionModel('member_vip_set', 'id', 'title')->listable(false);
// });
$builder->switch('visitMemberGroupEnable', '用户分组限制')->listable(false)
->when('=', true, function ($builder) {
/** @var HasFields $builder */
$builder->checkbox('visitMemberGroups', '允许访问的分组')->optionModel('member_group', 'id', 'title')->listable(false);
});
$builder->switch('visitMemberVipEnable', '用户VIP限制')->listable(false)
->when('=', true, function ($builder) {
/** @var HasFields $builder */
$builder->checkbox('visitMemberVips', '允许访问的VIP')->optionModel('member_vip_set', 'id', 'title')->listable(false);
});
$builder->display('created_at', L('Created At'))->listable(false);
$builder->display('updated_at', L('Updated At'))->listable(false);
})
......
......@@ -2,6 +2,7 @@
use Module\Cms\Util\CmsCatUtil;
use Module\Cms\Util\CmsContentUtil;
use Module\Member\Auth\MemberUser;
/**
* Class MCms
......@@ -141,4 +142,25 @@ class MCms
{
return CmsContentUtil::prevOne($catId, $recordId);
}
/**
* @param $cat array 栏目
* @return bool
*
* @Util 判断是否可以访问栏目内容
*/
public static function canAccessCatContent($cat)
{
if ($cat['visitMemberGroupEnable']) {
if (!MemberUser::isGroup($cat['visitMemberGroups'])) {
return false;
}
}
if ($cat['visitMemberVipEnable']) {
if (!MemberUser::isVip($cat['visitMemberVips'])) {
return false;
}
}
return true;
}
}
\ No newline at end of file
......@@ -36,8 +36,10 @@
<img style="max-width:100%;" src="{{\ModStart\Core\Assets\AssetsUtil::fix($record['cover'])}}" />
</div>
</div>
<div class="content ub-html" style="padding:1rem;font-size:0.8rem;">
{!! \ModStart\Core\Util\HtmlUtil::replaceImageSrcToLazyLoad($record['_data']['content'],'data-src',true) !!}
<div class="content">
<div class="ub-html" style="padding:1rem;font-size:0.8rem;">
{!! \ModStart\Core\Util\HtmlUtil::replaceImageSrcToLazyLoad($record['_data']['content'],'data-src',true) !!}
</div>
</div>
</div>
</div>
......
......@@ -40,9 +40,16 @@
<i class="iconfont icon-time"></i>
{{($record['postTime'])}}
</div>
<div class="content ub-html" style="font-size:0.8rem;">
{!! \ModStart\Core\Util\HtmlUtil::replaceImageSrcToLazyLoad($record['_data']['content'],'data-src',true) !!}
</div>
@if(!\MCms::canAccessCatContent($cat))
<div class="ub-alert ub-alert-danger">
<i class="iconfont icon-warning"></i>
您没有权限访问该栏目
</div>
@else
<div class="content ub-html" style="font-size:0.8rem;">
{!! \ModStart\Core\Util\HtmlUtil::replaceImageSrcToLazyLoad($record['_data']['content'],'data-src',true) !!}
</div>
@endif
</div>
</div>
......
......@@ -37,7 +37,6 @@ class DetailController extends ModuleBaseController
$viewData['model'] = $data['model'];
// return $viewData;
return $this->view('cms.detail.' . CmsTemplateUtil::toBladeView($view), $viewData);
}
}
......@@ -28,6 +28,7 @@ use Module\Member\Type\MemberStatus;
use Module\Member\Util\MemberGroupUtil;
use Module\Member\Util\MemberMessageUtil;
use Module\Member\Util\MemberUtil;
use Module\Member\Util\MemberVipUtil;
class MemberController extends Controller
{
......@@ -59,17 +60,23 @@ class MemberController extends Controller
if (ModuleManager::getModuleConfigBoolean('Member', 'groupEnable', false)) {
$builder->radio('groupId', '分组')->options(MemberGroupUtil::mapIdTitle())->required();
}
$builder->display('created_at', '创建时间');
if (ModuleManager::getModuleConfigBoolean('Member', 'vipEnable', false)) {
$builder->radio('groupId', 'VIP')->options(MemberVipUtil::mapTitle())->required();
}
$builder->display('created_at', '注册时间');
})
->gridFilter(function (GridFilter $filter) {
$filter->eq('id', L('ID'));
$filter->like('username', '用户名');
$filter->like('email', '邮箱');
$filter->like('phone', '手机');
$filter->eq('status', '状态')->select(MemberStatus::class);
if (ModuleManager::getModuleConfigBoolean('Member', 'groupEnable', false)) {
$filter->eq('groupId', '分组')->select(MemberGroupUtil::mapIdTitle());
}
$filter->like('username', '用户名');
$filter->like('email', '邮箱');
$filter->like('phone', '手机');
if (ModuleManager::getModuleConfigBoolean('Member', 'vipEnable', false)) {
$filter->eq('vipId', 'VIP')->select(MemberVipUtil::mapTitle());
}
})
->hookSaved(function (Form $form) {
/** @var \stdClass $item */
......
......@@ -25,7 +25,7 @@ class MemberVipSetController extends Controller
$builder->id('id', 'ID')->addable(true)->editable(true);
$builder->text('title', '名称');
$builder->text('flag', '英文标识');
$builder->switch('isDefault', '默认')->help('会员是否默认为该等级');
$builder->switch('isDefault', '默认')->optionsYesNo()->help('会员是否默认为该等级');
$builder->currency('price', '价格');
$builder->number('vipDays', '天数');
$builder->richHtml('content', '说明');
......
......@@ -5,6 +5,8 @@ namespace Module\Member\Auth;
use Illuminate\Support\Facades\Session;
use Module\Member\Util\MemberGroupUtil;
use Module\Member\Util\MemberVipUtil;
class MemberUser
{
......@@ -38,6 +40,37 @@ class MemberUser
return !self::isLogin();
}
public static function isGroup($groupIds)
{
if (self::isNotLogin()) {
return false;
}
if (!is_array($groupIds)) {
$groupIds = [intval($groupIds)];
}
$groupId = intval(self::get('groupId', 0));
if ($groupId == 0) {
$groupId = MemberGroupUtil::defaultGroupId();
}
return in_array($groupId, $groupIds);
}
public static function isVip($vipIds)
{
if (self::isNotLogin()) {
return false;
}
if (!is_array($vipIds)) {
$vipIds = [intval($vipIds)];
}
$vip = MemberVipUtil::getMemberVip(self::user());
$vipId = 0;
if (!empty($vip)) {
$vipId = $vip['id'];
}
return in_array($vipId, $vipIds);
}
public static function get($key = null, $default = null)
{
$user = self::user();
......
......@@ -9,14 +9,11 @@ use ModStart\Admin\Widget\DashboardItemA;
use ModStart\Core\Dao\ModelUtil;
use ModStart\Core\Util\ColorUtil;
use ModStart\Layout\Row;
use ModStart\Module\ModuleClassLoader;
use ModStart\Module\ModuleManager;
use ModStart\Support\Manager\FieldManager;
use Module\Member\Config\MemberHomeIcon;
use Module\Member\Config\MemberMenu;
use Module\Member\Listener\MemberVipPayListener;
use Module\Member\Provider\VerifySmsTemplateProvider;
use Module\Member\Widget\Field\MemberImage;
use Module\Vendor\Admin\Config\AdminWidgetDashboard;
use Module\Vendor\Admin\Config\AdminWidgetLink;
use Module\Vendor\Provider\SmsTemplate\SmsTemplateProvider;
......@@ -118,7 +115,6 @@ class ModuleServiceProvider extends ServiceProvider
});
$events->subscribe(MemberVipPayListener::class);
AdminMenu::register(function () {
return [
[
......
- 新增:用户VIP为空时,默认初始化VIP等级
<?php
use Illuminate\Database\Migrations\Migration;
class MemberMemberVipInit extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
if (\ModStart\Core\Dao\ModelUtil::count('member_vip_set') <= 0) {
\ModStart\Core\Dao\ModelUtil::insertAll('member_vip_set', [
[
'id' => 1,
'flag' => 'default',
'title' => '普通会员',
'price' => '0.00',
'vipDays' => 0,
'isDefault' => true,
'content' => '<p>普通会员说明</p>',
],
[
'id' => 2,
'flag' => 'vip1',
'title' => 'VIP黄金会员',
'price' => '9.99',
'vipDays' => 30,
'isDefault' => false,
'content' => '<p>VIP黄金会员说明</p>',
],
[
'id' => 3,
'flag' => 'vip2',
'title' => 'VIP钻石会员',
'price' => '99.99',
'vipDays' => 365,
'isDefault' => false,
'content' => '<p>VIP钻石会员说明</p>',
],
]);
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
}
}
......@@ -22,6 +22,22 @@ class MemberGroupUtil
});
}
public static function defaultGroup()
{
foreach (self::all() as $group) {
if ($group['isDefault']) {
return $group;
}
}
return null;
}
public static function defaultGroupId()
{
$group = self::defaultGroup();
return $group ? $group['id'] : 0;
}
// public static function update($id, $data)
// {
// ModelUtil::update('member_group', $id, $data);
......
......@@ -16,7 +16,7 @@ class MemberVipController extends ModuleBaseController implements MemberLoginChe
public function __construct()
{
BizException::throwsIf('缺少统一结算服务模块', !ModuleManager::isModuleEnabled('PayCenter'));
BizException::throwsIf('缺少 PayCenter 模块', !ModuleManager::isModuleEnabled('PayCenter'));
$this->api = app(\Module\Member\Api\Controller\MemberVipController::class);
}
......
- 优化:邮件模板跟随系统主题色调整
- 优化:无登录签名校验操作增强
\ No newline at end of file
<?php
namespace Module\Vendor\Middleware;
use ModStart\Core\Exception\BizException;
use ModStart\Core\Input\InputPackage;
use ModStart\Core\Input\Request;
use ModStart\Core\Util\TimeUtil;
use Module\Vendor\Util\NoneLoginOperateUtil;
class NoneLoginOperateAuthMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, \Closure $next)
{
$appKey = config('env.APP_KEY');
BizException::throwsIfEmpty('APP_KEY为空', $appKey);
$input = InputPackage::buildFromInput();
$timestamp = $input->getInteger('timestamp');
BizException::throwsIf('已超时效(操作时间显示为24小时内,timestamp=' . time() . ')', !($timestamp <= time() && $timestamp > time() - TimeUtil::PERIOD_DAY));
$nonce = $input->getTrimString('nonce');
$sign = $input->getTrimString('sign');
BizException::throwsIfEmpty('nonce为空', $nonce);
BizException::throwsIfEmpty('sign为空', $sign);
$signCalc = NoneLoginOperateUtil::sign(Request::path(), $nonce, $timestamp, $input->getTrimString('param'));
BizException::throwsIf('sign错误', $sign != $signCalc);
return $next($request);
}
}
\ No newline at end of file
......@@ -4,6 +4,8 @@
namespace Module\Vendor\Provider\Notifier;
use Module\Vendor\Util\NoneLoginOperateUtil;
class NotifierProvider
{
/**
......@@ -32,4 +34,17 @@ class NotifierProvider
$instance->notify($biz, $title, $content, $param);
}
}
public static function notifyProcess($biz, $title, $content, $processUrl)
{
self::notify($biz, $title, $content, [
'processUrl' => $processUrl,
]);
}
public static function notifyNoneLoginOperateProcessUrl($biz, $title, $content, $processUrlPath, $processUrlParam = [])
{
$processUrl = NoneLoginOperateUtil::generateUrl($processUrlPath, $processUrlParam);
self::notifyProcess($biz, $title, $content, $processUrl);
}
}
<?php
namespace Module\Vendor\Util;
use ModStart\Core\Exception\BizException;
use ModStart\Core\Input\Request;
use ModStart\Core\Util\RandomUtil;
class NoneLoginOperateUtil
{
public static function generateUrl($url, $param = [])
{
$urlParam = [];
$urlParam['timestamp'] = time();
$urlParam['nonce'] = RandomUtil::string(10);
$urlParam['param'] = json_encode($param);
$urlParam['sign'] = self::sign($url, $urlParam['nonce'], $urlParam['timestamp'], $urlParam['param']);
return Request::domainUrl() . modstart_web_url($url, $urlParam);
}
public static function sign($url, $nonce, $timestamp, $param)
{
$appKey = config('env.APP_KEY');
BizException::throwsIfEmpty('APP_KEY为空', $appKey);
return md5($url . ':' . $appKey . ':' . $nonce . ':' . $timestamp . ':' . $param);
}
}
\ No newline at end of file
......@@ -5,17 +5,17 @@
<title>[{{modstart_config('siteName')}}] @yield('pageTitle')</title>
<style type="text/css">
*{padding:0;margin:0;font-family:"Segoe UI","Lucida Grande",Helvetica,Arial,"Microsoft YaHei",FreeSans,Arimo,"Droid Sans","wenquanyi micro hei","Hiragino Sans GB","Hiragino Sans GB W3",sans-serif;color:#666;box-sizing:border-box;}
body{font-size:13px;background:#F8F8F8;margin:20px 0;}
#wrap{margin:0 auto;max-width:800px;padding:10px;border-radius:10px;}
#head,#content,#foot{background:#FFF;border-radius:5px;}
#head{background:#EEE;height:50px;padding:5px 10px;}
#head .logo{line-height:40px;color:#333;font-size:20px;text-decoration:none;}
body{font-size:13px;background:#F8F8F8;}
#wrap{margin:0 auto;max-width:800px;padding:0;border:1px solid #EEE;}
#head,#content,#foot{background:#FFF;}
#head{background:{{modstart_config('sitePrimaryColor','#333')}};height:50px;padding:5px 10px;}
#head .logo{line-height:40px;color:#FFF;font-size:20px;text-decoration:none;}
#content{padding:30px 10px;}
#content p{line-height:2em;}
#signature{padding:10px;color:#999;}
#foot{text-align:center;line-height:50px;border-top:1px solid #EEE;color:#999;}
.ub-email-table {border-collapse: collapse;width:100%;border-radius:5px;}
.ub-email-table td{border: 1px solid #ddd;padding:5px;border-radius:5px;}
.ub-email-table {border-collapse: collapse;width:100%;}
.ub-email-table td{border: 1px solid #ddd;padding:5px;}
.ub-email-table tr:nth-child(even){background-color: #f2f2f2;}
</style>
</head>
......@@ -32,7 +32,7 @@
@show
</div>
<div id="foot">
{{modstart_config('siteName')}} &copy; {{modstart_config('siteDomain')}} 版权所有
{{modstart_config('siteName')}} &copy; {{modstart_config('siteDomain')}}
</div>
@show
</div>
......
......@@ -27,3 +27,8 @@
line-height: 12px;
vertical-align: top;
}
.layui-layer-tips i.layui-layer-TipsG {
border-left-color: #333 !important;
border-right-color: transparent !important;
}
\ No newline at end of file
......@@ -36,11 +36,12 @@ class Html extends AbstractField
}
$rules = $this->rules();
$requiredRuleHtml = str_contains($rules, 'required') ? '<span class="ub-text-danger ub-text-bold">*</span>' : '';
$label = $this->label ? $this->label . ':' : '';
return <<<EOT
<div class="line">
<div class="label">
{$requiredRuleHtml}
{$this->label}:
{$label}
</div>
<div class="field">
$this->html
......
......@@ -2,6 +2,8 @@
namespace ModStart\Grid\Filter;
use Illuminate\Support\Facades\View;
use ModStart\Core\Exception\BizException;
use ModStart\Core\Util\IdUtil;
use ModStart\Grid\Filter;
use ModStart\Grid\Filter\Field\Text;
......@@ -180,7 +182,7 @@ abstract class AbstractFilter
$fieldClass = explode('\\', get_class($this->field));
$view = 'modstart::core.grid.filter.'
. lcfirst(end($class)) . '-' . lcfirst(end($fieldClass));
return view($view, $this->variables());
return View::make($view, $this->variables())->render();
}
public function __call($name, $arguments)
......
......@@ -3,8 +3,6 @@
namespace ModStart\Grid\Filter;
use ModStart\Core\Dao\ModelUtil;
use ModStart\Core\Type\BaseType;
use ModStart\Grid\Filter\Field\Radio;
class Eq extends AbstractFilter
{
......@@ -19,6 +17,14 @@ class Eq extends AbstractFilter
return $this;
}
public function selectArray($options, $idName = 'id', $titleName = 'title')
{
$options = array_build($options, function ($k, $v) use ($idName, $titleName) {
return [$v[$idName], $v[$titleName]];
});
return $this->select($options);
}
public function selectModel($table, $keyName = 'id', $labelName = 'name', $where = [])
{
return $this->select(ModelUtil::valueMap($table, $keyName, $labelName, $where));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册