From f842cb422e1a602211f416affe140b4cfee0d962 Mon Sep 17 00:00:00 2001 From: gongfuxiang <2499232802@qq.com> Date: Thu, 14 Feb 2019 23:06:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=94=A8=E6=88=B7=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E8=B5=A0=E9=80=81=E7=A7=AF=E5=88=86=E5=BA=94=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/index/controller/Buy.php | 2 +- application/index/controller/Cart.php | 2 +- application/index/controller/Common.php | 6 +- application/index/controller/Goods.php | 2 +- application/index/controller/Message.php | 2 +- application/index/controller/Order.php | 2 +- application/index/controller/Personal.php | 2 +- application/index/controller/Safety.php | 2 +- application/index/controller/User.php | 6 +- application/index/controller/Useraddress.php | 2 +- application/index/controller/Userfavor.php | 2 +- .../index/controller/Usergoodsbrowse.php | 2 +- application/index/controller/Userintegral.php | 2 +- .../plugins/commontopmaxpicture/Hook.php | 4 +- application/plugins/commontopnotice/Hook.php | 4 +- .../plugins/usercentertopnotice/Hook.php | 4 +- .../plugins/userlogingiveintegral/Admin.php | 90 ++++++++++++ .../plugins/userlogingiveintegral/Hook.php | 137 ++++++++++++++++++ .../plugins/userlogingiveintegral/config.json | 24 +++ .../view/commontopnotice/admin/saveinfo.html | 2 +- .../usercentertopnotice/admin/saveinfo.html | 2 +- .../userlogingiveintegral/admin/index.html | 55 +++++++ .../userlogingiveintegral/admin/saveinfo.html | 49 +++++++ application/service/PluginsAdminService.php | 76 +++++----- application/service/UserService.php | 17 ++- application/tags.php | 4 + config/shopxo.php | 2 +- config/shopxo.sql | 29 ++-- .../css/userlogingiveintegral/admin.css | 23 +++ .../2019/02/14/1550151082834629.png | Bin 0 -> 9084 bytes 30 files changed, 481 insertions(+), 75 deletions(-) create mode 100644 application/plugins/userlogingiveintegral/Admin.php create mode 100644 application/plugins/userlogingiveintegral/Hook.php create mode 100644 application/plugins/userlogingiveintegral/config.json create mode 100644 application/plugins/view/userlogingiveintegral/admin/index.html create mode 100644 application/plugins/view/userlogingiveintegral/admin/saveinfo.html create mode 100644 public/static/plugins/css/userlogingiveintegral/admin.css create mode 100644 public/static/upload/images/plugins_userlogingiveintegral/2019/02/14/1550151082834629.png diff --git a/application/index/controller/Buy.php b/application/index/controller/Buy.php index 315a59387..53d0fe9d1 100755 --- a/application/index/controller/Buy.php +++ b/application/index/controller/Buy.php @@ -37,7 +37,7 @@ class Buy extends Common parent::__construct(); // 是否登录 - $this->Is_Login(); + $this->IsLogin(); } /** diff --git a/application/index/controller/Cart.php b/application/index/controller/Cart.php index 3e7f15f8f..b41f45aad 100755 --- a/application/index/controller/Cart.php +++ b/application/index/controller/Cart.php @@ -34,7 +34,7 @@ class Cart extends Common parent::__construct(); // 是否登录 - $this->Is_Login(); + $this->IsLogin(); } /** diff --git a/application/index/controller/Common.php b/application/index/controller/Common.php index 609995ce0..67f226c7f 100755 --- a/application/index/controller/Common.php +++ b/application/index/controller/Common.php @@ -81,7 +81,7 @@ class Common extends Controller private function CommonPluginsInit() { // 公共顶部钩子 - $this->assign('plugins_common_top_data', Hook::listen('plugins_common_top')); + $this->assign('plugins_common_top_data', Hook::listen('plugins_common_top', ['hook_name'=>'plugins_common_top', 'is_control'=>false])); } /** @@ -105,13 +105,13 @@ class Common extends Controller } /** - * [Is_Login 登录校验] + * [IsLogin 登录校验] * @author Devil * @blog http://gong.gg/ * @version 0.0.1 * @datetime 2017-03-09T11:43:48+0800 */ - protected function Is_Login() + protected function IsLogin() { if(session('user') == null) { diff --git a/application/index/controller/Goods.php b/application/index/controller/Goods.php index 0b76ebea2..ae0e422ba 100755 --- a/application/index/controller/Goods.php +++ b/application/index/controller/Goods.php @@ -120,7 +120,7 @@ class Goods extends Common public function Favor() { // 是否登录 - $this->Is_Login(); + $this->IsLogin(); // 开始处理 $params = input('post.'); diff --git a/application/index/controller/Message.php b/application/index/controller/Message.php index d9936998d..563dc37e4 100755 --- a/application/index/controller/Message.php +++ b/application/index/controller/Message.php @@ -34,7 +34,7 @@ class Message extends Common parent::__construct(); // 是否登录 - $this->Is_Login(); + $this->IsLogin(); } /** diff --git a/application/index/controller/Order.php b/application/index/controller/Order.php index 119a4ca5c..87cff4073 100755 --- a/application/index/controller/Order.php +++ b/application/index/controller/Order.php @@ -35,7 +35,7 @@ class Order extends Common parent::__construct(); // 是否登录 - $this->Is_Login(); + $this->IsLogin(); } /** diff --git a/application/index/controller/Personal.php b/application/index/controller/Personal.php index 6ca941880..1a08db9ce 100755 --- a/application/index/controller/Personal.php +++ b/application/index/controller/Personal.php @@ -34,7 +34,7 @@ class Personal extends Common parent::__construct(); // 是否登录 - $this->Is_Login(); + $this->IsLogin(); } /** diff --git a/application/index/controller/Safety.php b/application/index/controller/Safety.php index b92328ea2..c42c3ea7b 100755 --- a/application/index/controller/Safety.php +++ b/application/index/controller/Safety.php @@ -34,7 +34,7 @@ class Safety extends Common parent::__construct(); // 是否登录 - $this->Is_Login(); + $this->IsLogin(); } /** diff --git a/application/index/controller/User.php b/application/index/controller/User.php index 49329d22d..eed755732 100755 --- a/application/index/controller/User.php +++ b/application/index/controller/User.php @@ -74,7 +74,7 @@ class User extends Common public function Index() { // 登录校验 - $this->Is_Login(); + $this->IsLogin(); // 订单总数 $where = ['user_id'=>$this->user['id'], 'is_delete_time'=>0, 'user_is_delete_time'=>0]; @@ -137,7 +137,7 @@ class User extends Common $this->assign('goods_browse_list', $data['data']); // 用户中心顶部钩子 - $this->assign('plugins_user_center_top_data', Hook::listen('plugins_user_center_top')); + $this->assign('plugins_user_center_top_data', Hook::listen('plugins_user_center_top', ['hook_name'=>'plugins_user_center_top', 'is_control'=>false])); return $this->fetch(); } @@ -434,7 +434,7 @@ class User extends Common } // 登录校验 - $this->Is_Login(); + $this->IsLogin(); $params = $_POST; $params['user'] = $this->user; diff --git a/application/index/controller/Useraddress.php b/application/index/controller/Useraddress.php index 19995c2d6..acbe24784 100755 --- a/application/index/controller/Useraddress.php +++ b/application/index/controller/Useraddress.php @@ -34,7 +34,7 @@ class UserAddress extends Common parent::__construct(); // 是否登录 - $this->Is_Login(); + $this->IsLogin(); } /** diff --git a/application/index/controller/Userfavor.php b/application/index/controller/Userfavor.php index 707e2e701..8835e8b8b 100755 --- a/application/index/controller/Userfavor.php +++ b/application/index/controller/Userfavor.php @@ -34,7 +34,7 @@ class UserFavor extends Common parent::__construct(); // 是否登录 - $this->Is_Login(); + $this->IsLogin(); } /** diff --git a/application/index/controller/Usergoodsbrowse.php b/application/index/controller/Usergoodsbrowse.php index 02556d913..5e0922422 100755 --- a/application/index/controller/Usergoodsbrowse.php +++ b/application/index/controller/Usergoodsbrowse.php @@ -34,7 +34,7 @@ class UserGoodsBrowse extends Common parent::__construct(); // 是否登录 - $this->Is_Login(); + $this->IsLogin(); } /** diff --git a/application/index/controller/Userintegral.php b/application/index/controller/Userintegral.php index 1e4808e4f..071a2bf2a 100755 --- a/application/index/controller/Userintegral.php +++ b/application/index/controller/Userintegral.php @@ -34,7 +34,7 @@ class UserIntegral extends Common parent::_initialize(); // 是否登录 - $this->Is_Login(); + $this->IsLogin(); } /** diff --git a/application/plugins/commontopmaxpicture/Hook.php b/application/plugins/commontopmaxpicture/Hook.php index e711e86c3..3b787fdf5 100755 --- a/application/plugins/commontopmaxpicture/Hook.php +++ b/application/plugins/commontopmaxpicture/Hook.php @@ -32,9 +32,9 @@ class Hook public function run($params = []) { // 是否控制器钩子 - if(isset($params['is_control']) && $params['is_control'] === true) + if(isset($params['is_control']) && $params['is_control'] === true && !empty($params['hook_name'])) { - return []; + return DataReturn('无需处理', 0); // 默认返回视图 } else { diff --git a/application/plugins/commontopnotice/Hook.php b/application/plugins/commontopnotice/Hook.php index af2a64f51..fb933f5c8 100755 --- a/application/plugins/commontopnotice/Hook.php +++ b/application/plugins/commontopnotice/Hook.php @@ -32,9 +32,9 @@ class Hook public function run($params = []) { // 是否控制器钩子 - if(isset($params['is_control']) && $params['is_control'] === true) + if(isset($params['is_control']) && $params['is_control'] === true && !empty($params['hook_name'])) { - return []; + return DataReturn('无需处理', 0); // 默认返回视图 } else { diff --git a/application/plugins/usercentertopnotice/Hook.php b/application/plugins/usercentertopnotice/Hook.php index e188a2e5b..c87a8288c 100755 --- a/application/plugins/usercentertopnotice/Hook.php +++ b/application/plugins/usercentertopnotice/Hook.php @@ -32,9 +32,9 @@ class Hook public function run($params = []) { // 是否控制器钩子 - if(isset($params['is_control']) && $params['is_control'] === true) + if(isset($params['is_control']) && $params['is_control'] === true && !empty($params['hook_name'])) { - return []; + return DataReturn('无需处理', 0); // 默认返回视图 } else { diff --git a/application/plugins/userlogingiveintegral/Admin.php b/application/plugins/userlogingiveintegral/Admin.php new file mode 100644 index 000000000..47ddf4b67 --- /dev/null +++ b/application/plugins/userlogingiveintegral/Admin.php @@ -0,0 +1,90 @@ + $ret['data'], + ]; + return DataReturn('处理成功', 0, $data); + } else { + return $ret; + } + } + + /** + * 编辑页面 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @datetime 2019-02-07T08:21:54+0800 + * @param [array] $params [输入参数] + */ + public function saveinfo($params = []) + { + $ret = PluginsService::PluginsData('userlogingiveintegral'); + if($ret['code'] == 0) + { + // 是否 + $is_whether_list = [ + 0 => array('id' => 0, 'name' => '否'), + 1 => array('id' => 1, 'name' => '是', 'checked' => true), + ]; + + // 数组组装 + $data = [ + 'is_whether_list' => $is_whether_list, + 'data' => $ret['data'], + ]; + return DataReturn('处理成功', 0, $data); + } else { + return $ret; + } + } + + /** + * 数据保存 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @datetime 2019-02-07T08:21:54+0800 + * @param [array] $params [输入参数] + */ + public function save($params = []) + { + return PluginsService::PluginsDataSave(['plugins'=>'userlogingiveintegral', 'data'=>$params]); + } +} +?> \ No newline at end of file diff --git a/application/plugins/userlogingiveintegral/Hook.php b/application/plugins/userlogingiveintegral/Hook.php new file mode 100644 index 000000000..083f59bee --- /dev/null +++ b/application/plugins/userlogingiveintegral/Hook.php @@ -0,0 +1,137 @@ +LoginGiveIntegral($params); + break; + + default : + $ret = DataReturn('无需处理', 0); + } + return $ret; + } else { + return DataReturn('钩子传入参数有误', -600); + } + + // 默认返回视图 + } else { + return ''; + } + } + + /** + * 赠送积分 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @datetime 2019-02-14T22:19:08+0800 + * @param [array] $params [参数] + */ + private function LoginGiveIntegral($params) + { + // 获取应用数据 + $ret = PluginsService::PluginsData('userlogingiveintegral'); + if($ret['code'] == 0) + { + // 限制时间是否已结束 + if(!empty($ret['data']['time_start'])) + { + // 是否已开始 + if(strtotime($ret['data']['time_start']) > time()) + { + return DataReturn('不在限制时间范围、无需处理', 0); + } + } + if(!empty($ret['data']['time_end'])) + { + // 是否已结束 + if(strtotime($ret['data']['time_end']) < time()) + { + return DataReturn('不在限制时间范围、无需处理', 0); + } + } + + // 是否日一次限制 + if(isset($ret['data']['is_day_once']) && $ret['data']['is_day_once'] == 1) + { + $where = [ + ['user_id', '=', $params['user']['id']], + ['add_time', '>=', strtotime(date('Y-m-d 00:00:00'))], + ['type', '=', 1], + ['msg', '=', '登录赠送积分'], + ]; + $log = Db::name('UserIntegralLog')->where($where)->find(); + if(!empty($log)) + { + return DataReturn('今日已赠送、无需处理', 0); + } + } + + // 获取用户积分 + $give_integral = empty($ret['data']['give_integral']) ? 0 : intval($ret['data']['give_integral']); + if(!empty($give_integral)) + { + // 用户积分添加 + $user_integral = Db::name('User')->where(['id'=>$params['user']['id']])->value('integral'); + if(!Db::name('User')->where(['id'=>$params['user']['id']])->setInc('integral', $give_integral)) + { + return DataReturn('登录赠送积分失败', -10); + } + + // 积分日志 + IntegralService::UserIntegralLogAdd($params['user']['id'], $user_integral, $user_integral+$give_integral, '登录赠送积分', 1); + + // 更新用户登录缓存数据 + UserService::UserLoginRecord($params['user']['id']); + + return DataReturn('登录赠送积分成功', 0); + } else { + return DataReturn('登录赠送积分应用配置有误', -600); + } + } else { + return $ret; + } + } +} +?> \ No newline at end of file diff --git a/application/plugins/userlogingiveintegral/config.json b/application/plugins/userlogingiveintegral/config.json new file mode 100644 index 000000000..557783541 --- /dev/null +++ b/application/plugins/userlogingiveintegral/config.json @@ -0,0 +1,24 @@ +{ + "base":{ + "plugins":"userlogingiveintegral", + "name":"登录赠送积分", + "logo":"\/static\/upload\/images\/plugins_userlogingiveintegral\/2019\/02\/14\/1550151082834629.png", + "author":"Devil", + "author_url":"https:\/\/shopxo.net\/", + "version":"1.0.0", + "desc":"用户登录后赠送积分", + "apply_terminal":[ + "pc", + "h5" + ], + "apply_version":[ + "1.3.0" + ], + "is_home":false + }, + "hook":{ + "plugins_user_login_end":[ + "app\\plugins\\userlogingiveintegral\\Hook" + ] + } +} \ No newline at end of file diff --git a/application/plugins/view/commontopnotice/admin/saveinfo.html b/application/plugins/view/commontopnotice/admin/saveinfo.html index fd4c0a84c..0e2d98b01 100755 --- a/application/plugins/view/commontopnotice/admin/saveinfo.html +++ b/application/plugins/view/commontopnotice/admin/saveinfo.html @@ -12,7 +12,7 @@
- +
diff --git a/application/plugins/view/usercentertopnotice/admin/saveinfo.html b/application/plugins/view/usercentertopnotice/admin/saveinfo.html index 00de24882..8d64872ae 100755 --- a/application/plugins/view/usercentertopnotice/admin/saveinfo.html +++ b/application/plugins/view/usercentertopnotice/admin/saveinfo.html @@ -12,7 +12,7 @@
- +
diff --git a/application/plugins/view/userlogingiveintegral/admin/index.html b/application/plugins/view/userlogingiveintegral/admin/index.html new file mode 100644 index 000000000..13a14bdd1 --- /dev/null +++ b/application/plugins/view/userlogingiveintegral/admin/index.html @@ -0,0 +1,55 @@ +{{include file="public/header" /}} + + +
+
+ + 登录赠送积分 + 返回 + + +
+
+ +
+ {{if !empty($data['give_integral'])}} + {{$data.give_integral}} + {{else /}} + 0 + {{/if}} + 积分 +
+
+
+ +
+ {{if isset($data['is_day_once']) and $data['is_day_once'] eq 1}} + 是 + {{else /}} + 否 + {{/if}} +
+
+
+ +
+ {{if !empty($data['time_start']) and !empty($data['time_end'])}} + {{$data.time_start}} ~ {{$data.time_end}} + {{elseif !empty($data['time_start']) and empty($data['time_end'])}} + {{$data.time_start}} ~ 长期有效 + {{elseif empty($data['time_start']) and !empty($data['time_end'])}} + 立即生效 ~ {{$data.time_end}} + {{else /}} + 无限制 + {{/if}} +
+
+ 编辑 +
+
+
+ + + +{{include file="public/footer" /}} + \ No newline at end of file diff --git a/application/plugins/view/userlogingiveintegral/admin/saveinfo.html b/application/plugins/view/userlogingiveintegral/admin/saveinfo.html new file mode 100644 index 000000000..c2a2be691 --- /dev/null +++ b/application/plugins/view/userlogingiveintegral/admin/saveinfo.html @@ -0,0 +1,49 @@ +{{include file="public/header" /}} + + +
+
+ +
+ + 登录赠送积分 + 返回 + + +
+ + +
+ +
+ +
+ {{foreach $is_whether_list as $v}} + + {{/foreach}} +
+
+ +
+ +
+ + ~ + +
+
+ +
+ +
+
+ +
+
+ + + +{{include file="public/footer" /}} + \ No newline at end of file diff --git a/application/service/PluginsAdminService.php b/application/service/PluginsAdminService.php index 74e5c813c..be47a4c63 100644 --- a/application/service/PluginsAdminService.php +++ b/application/service/PluginsAdminService.php @@ -461,13 +461,10 @@ class PluginsAdminService } // 应用主文件生成 - if(empty($params['id'])) + $ret = self::PluginsApplicationCreated($params, $app_dir); + if($ret['code'] != 0) { - $ret = self::PluginsApplicationCreated($params, $app_dir); - if($ret['code'] != 0) - { - return $ret; - } + return $ret; } return DataReturn(empty($params['id']) ? '创建成功' : '更新成功', 0); @@ -530,9 +527,14 @@ class Hook public function run(\$params = []) { // 是否控制器钩子 - if(isset(\$params['is_control']) && \$params['is_control'] === true) + // is_control 当前为控制器业务处理 + // hook_name 钩子名称 + if(isset(\$params['is_control']) && \$params['is_control'] === true && !empty(\$params['hook_name'])) { - return []; + // 参数一 描述 + // 参数二 0 为处理成功, 负数为失败 + // 参数三 返回数据 + return DataReturn('返回描述', 0); // 默认返回视图 } else { @@ -641,40 +643,42 @@ h1 { color: #4CAF50; } php; - // 创建文件 - if(@file_put_contents($app_dir.DS.'Admin.php', $admin) === false) - { - return DataReturn('应用文件创建失败[admin]', -11); - } - if(@file_put_contents($app_dir.DS.'Hook.php', $hook) === false) - { - return DataReturn('应用文件创建失败[hook]', -11); - } - if(@file_put_contents($app_dir.DS.'Hook.php', $hook) === false) - { - return DataReturn('应用文件创建失败[admin-view]', -11); - } - - // 应用后台视图目录不存在则创建 - $app_view_admin_dir = APP_PATH.'plugins'.DS.'view'.DS.trim($params['plugins']).DS.'admin'; - if(\base\FileUtil::CreateDir($app_view_admin_dir) !== true) - { - return DataReturn('应用视图目录创建失败[admin]', -10); - } - if(@file_put_contents($app_view_admin_dir.DS.'index.html', $admin_view) === false) - { - return DataReturn('应用视图文件创建失败[admin-view]', -11); - } - - // css创建 + // 静态文件目录 $app_static_css_dir = ROOT.'public'.DS.'static'.DS.'plugins'.DS.'css'.DS.trim($params['plugins']); if(\base\FileUtil::CreateDir($app_static_css_dir) !== true) { return DataReturn('应用静态目录创建失败[css]', -10); } - if(@file_put_contents($app_static_css_dir.DS.'admin.css', $admin_css) === false) + + // 编辑模式下不生成后端文件 + if(empty($params['id'])) { - return DataReturn('应用静态文件创建失败[admin-css]', -11); + // 创建文件 + if(@file_put_contents($app_dir.DS.'Admin.php', $admin) === false) + { + return DataReturn('应用文件创建失败[admin]', -11); + } + if(@file_put_contents($app_dir.DS.'Hook.php', $hook) === false) + { + return DataReturn('应用文件创建失败[hook]', -11); + } + + // 应用后台视图目录不存在则创建 + $app_view_admin_dir = APP_PATH.'plugins'.DS.'view'.DS.trim($params['plugins']).DS.'admin'; + if(\base\FileUtil::CreateDir($app_view_admin_dir) !== true) + { + return DataReturn('应用视图目录创建失败[admin]', -10); + } + if(@file_put_contents($app_view_admin_dir.DS.'index.html', $admin_view) === false) + { + return DataReturn('应用视图文件创建失败[admin-view]', -11); + } + + // css创建 + if(@file_put_contents($app_static_css_dir.DS.'admin.css', $admin_css) === false) + { + return DataReturn('应用静态文件创建失败[admin-css]', -11); + } } diff --git a/application/service/UserService.php b/application/service/UserService.php index 3b561d2ba..55e1de3fc 100755 --- a/application/service/UserService.php +++ b/application/service/UserService.php @@ -11,6 +11,7 @@ namespace app\service; use think\Db; +use think\facade\Hook; use app\service\RegionService; /** @@ -793,7 +794,7 @@ class UserService // 获取用户账户信息 $where = array('mobile|email' => $params['accounts'], 'is_delete_time'=>0); - $user = Db::name('User')->field(array('id', 'pwd', 'salt', 'status'))->where($where)->find(); + $user = Db::name('User')->field('id,pwd,salt,status')->where($where)->find(); if(empty($user)) { return DataReturn('帐号不存在', -3); @@ -810,6 +811,13 @@ class UserService return DataReturn('密码错误', -4); } + // 用户登录前钩子 + $ret = Hook::listen('plugins_user_login_begin', ['hook_name'=>'plugins_user_login_begin', 'is_control'=>true, 'params'=>$params, 'user'=>$user]); + if(isset($ret['code']) && $ret['code'] != 0) + { + return $ret; + } + // 更新用户密码 $salt = GetNumberCode(6); $data = array( @@ -822,6 +830,13 @@ class UserService // 登录记录 if(self::UserLoginRecord($user['id'])) { + // 用户登录后钩子 + $ret = Hook::listen('plugins_user_login_end', ['hook_name'=>'plugins_user_login_end', 'is_control'=>true, 'params'=>$params, 'user'=>$user]); + if(isset($ret['code']) && $ret['code'] != 0) + { + return $ret; + } + return DataReturn('登录成功', 0); } } diff --git a/application/tags.php b/application/tags.php index fd97c4ffa..123936f82 100755 --- a/application/tags.php +++ b/application/tags.php @@ -41,5 +41,9 @@ return array ( array ( 0 => 'app\\plugins\\usercentertopnotice\\Hook', ), + 'plugins_user_login_end' => + array ( + 0 => 'app\\plugins\\userlogingiveintegral\\Hook', + ), ); ?> \ No newline at end of file diff --git a/config/shopxo.php b/config/shopxo.php index d37e4d1da..715cf1062 100644 --- a/config/shopxo.php +++ b/config/shopxo.php @@ -15,7 +15,7 @@ return [ // 开发模式 - 'is_develop' => false, + 'is_develop' => true, // 默认编码 'default_charset' => 'utf-8', diff --git a/config/shopxo.sql b/config/shopxo.sql index 8a58c3782..0157e4b99 100644 --- a/config/shopxo.sql +++ b/config/shopxo.sql @@ -1,20 +1,18 @@ /* - Navicat Premium Data Transfer + Navicat MySQL Data Transfer Source Server : 本机 - Source Server Type : MySQL - Source Server Version : 50722 + Source Server Version : 50716 Source Host : localhost - Source Database : shopxo_test + Source Database : shopxo_ttt - Target Server Type : MySQL - Target Server Version : 50722 + Target Server Version : 50716 File Encoding : utf-8 - Date: 02/14/2019 11:31:38 AM + Date: 02/14/2019 23:05:39 PM */ -SET NAMES utf8mb4; +SET NAMES utf8; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- @@ -588,7 +586,14 @@ CREATE TABLE `s_message` ( `add_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '添加时间', PRIMARY KEY (`id`), KEY `user_id` (`user_id`) -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='消息'; +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='消息'; + +-- ---------------------------- +-- Records of `s_message` +-- ---------------------------- +BEGIN; +INSERT INTO `s_message` VALUES ('4', '90', '积分变动', '登录赠送积分积分增加3', '0', '0', '0', '1', '0', '0', '1550155205'), ('5', '90', '积分变动', '登录赠送积分积分增加3', '0', '0', '0', '1', '0', '0', '1550155448'), ('6', '90', '积分变动', '登录赠送积分积分增加3', '0', '0', '0', '1', '0', '0', '1550155950'), ('7', '90', '积分变动', '登录赠送积分积分增加3', '0', '0', '0', '1', '0', '0', '1550156005'), ('8', '90', '积分变动', '登录赠送积分积分增加3', '0', '0', '0', '1', '0', '0', '1550156016'), ('9', '90', '积分变动', '登录赠送积分积分增加5', '0', '0', '0', '1', '0', '0', '1550156516'); +COMMIT; -- ---------------------------- -- Table structure for `s_navigation` @@ -818,13 +823,13 @@ CREATE TABLE `s_plugins` ( PRIMARY KEY (`id`), UNIQUE KEY `plugins` (`plugins`), KEY `is_enable` (`is_enable`) -) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='应用'; +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='应用'; -- ---------------------------- -- Records of `s_plugins` -- ---------------------------- BEGIN; -INSERT INTO `s_plugins` VALUES ('1', 'commontopmaxpicture', '{\"images\":\"http:\\/\\/tp5-dev.com\\/static\\/upload\\/images\\/plugins_commontopmaxpicture\\/2019\\/02\\/09\\/1549671733978860.jpg\",\"bg_color\":\"#ce0000\",\"url\":\"https:\\/\\/shopxo.net\",\"is_new_window_open\":\"1\",\"is_overall\":\"1\",\"time_start\":\"\",\"time_end\":\"\",\"pluginsname\":\"commontopmaxpicture\",\"pluginscontrol\":\"admin\",\"pluginsaction\":\"save\"}', '1', '0', '1550049324'), ('2', 'commontopnotice', '{\"content\":\"\\u6b22\\u8fce\\u6765\\u5230ShopXO\\u4f01\\u4e1a\\u7ea7B2C\\u5f00\\u6e90\\u7535\\u5546\\u7cfb\\u7edf\\u3001\\u6f14\\u793a\\u7ad9\\u70b9\\u8bf7\\u52ff\\u53d1\\u8d77\\u652f\\u4ed8\\u3001\\u4ee5\\u514d\\u7ed9\\u60a8\\u5e26\\u6765\\u4e0d\\u5fc5\\u8981\\u7684\\u8d22\\u4ea7\\u635f\\u5931\\u3002\",\"is_overall\":\"1\",\"time_start\":\"\",\"time_end\":\"\",\"pluginsname\":\"commontopnotice\",\"pluginscontrol\":\"admin\",\"pluginsaction\":\"save\"}', '1', '0', '1550049314'), ('3', 'usercentertopnotice', '{\"content\":\"\\u7528\\u6237\\u4e2d\\u5fc3\\u516c\\u544a\\u6587\\u5b57\\uff0c\\u540e\\u53f0\\u914d\\u7f6e\\u4fee\\u6539\\u3002\",\"time_start\":\"\",\"time_end\":\"\",\"pluginsname\":\"usercentertopnotice\",\"pluginscontrol\":\"admin\",\"pluginsaction\":\"save\"}', '1', '0', '1550049323'); +INSERT INTO `s_plugins` VALUES ('1', 'commontopmaxpicture', '{\"images\":\"http:\\/\\/tp5-dev.com\\/static\\/upload\\/images\\/plugins_commontopmaxpicture\\/2019\\/02\\/09\\/1549671733978860.jpg\",\"bg_color\":\"#ce0000\",\"url\":\"https:\\/\\/shopxo.net\",\"is_new_window_open\":\"1\",\"is_overall\":\"1\",\"time_start\":\"\",\"time_end\":\"\",\"pluginsname\":\"commontopmaxpicture\",\"pluginscontrol\":\"admin\",\"pluginsaction\":\"save\"}', '1', '0', '1550049324'), ('2', 'commontopnotice', '{\"content\":\"\\u6b22\\u8fce\\u6765\\u5230ShopXO\\u4f01\\u4e1a\\u7ea7B2C\\u5f00\\u6e90\\u7535\\u5546\\u7cfb\\u7edf\\u3001\\u6f14\\u793a\\u7ad9\\u70b9\\u8bf7\\u52ff\\u53d1\\u8d77\\u652f\\u4ed8\\u3001\\u4ee5\\u514d\\u7ed9\\u60a8\\u5e26\\u6765\\u4e0d\\u5fc5\\u8981\\u7684\\u8d22\\u4ea7\\u635f\\u5931\\u3002\",\"is_overall\":\"1\",\"time_start\":\"\",\"time_end\":\"\",\"pluginsname\":\"commontopnotice\",\"pluginscontrol\":\"admin\",\"pluginsaction\":\"save\"}', '1', '0', '1550049314'), ('3', 'usercentertopnotice', '{\"content\":\"\\u7528\\u6237\\u4e2d\\u5fc3\\u516c\\u544a\",\"time_start\":\"\",\"time_end\":\"\",\"pluginsname\":\"usercentertopnotice\",\"pluginscontrol\":\"admin\",\"pluginsaction\":\"save\"}', '1', '0', '1550152363'), ('14', 'userlogingiveintegral', '{\"give_integral\":\"5\",\"is_day_once\":\"1\",\"time_start\":\"\",\"time_end\":\"\",\"pluginsname\":\"userlogingiveintegral\",\"pluginscontrol\":\"admin\",\"pluginsaction\":\"save\"}', '1', '1550151175', '1550156513'); COMMIT; -- ---------------------------- @@ -1075,7 +1080,7 @@ CREATE TABLE `s_user` ( -- Records of `s_user` -- ---------------------------- BEGIN; -INSERT INTO `s_user` VALUES ('77', '2088502175420842-', '', '', '0', '255773', '70da5937905ce1d1a8c6a8a4ab5c72b3', '', '龚哥哥', '13250814883', 'fuxiang.gong@qq.com', '2', 'https://tfs.alipayobjects.com/images/partner/T10d8lXm4dXXXXXXXX', '上海', '上海市', '1540915200', '', '967', '0', '0', '0', '0', '1545099005'), ('90', '2088502175420842', '', '', '0', '437481', '89e01b6059ab8151c32a1c6358a2f1cf', '', '魔鬼', '17602128368', '', '2', '', '上海', '上海市', '666201600', '', '0', '0', '0', '0', '1539167253', '1550048957'); +INSERT INTO `s_user` VALUES ('77', '2088502175420842-', '', '', '0', '255773', '70da5937905ce1d1a8c6a8a4ab5c72b3', '', '龚哥哥', '13250814883', 'fuxiang.gong@qq.com', '2', 'https://tfs.alipayobjects.com/images/partner/T10d8lXm4dXXXXXXXX', '上海', '上海市', '1540915200', '', '967', '0', '0', '0', '0', '1545099005'), ('90', '2088502175420842', '', '', '0', '548064', '3428ab57b8303e93c2d0190c1c99ddf0', '', '魔鬼', '17602128368', '', '2', '', '上海', '上海市', '666201600', '', '20', '0', '0', '0', '1539167253', '1550156516'); COMMIT; -- ---------------------------- diff --git a/public/static/plugins/css/userlogingiveintegral/admin.css b/public/static/plugins/css/userlogingiveintegral/admin.css new file mode 100644 index 000000000..4808a28ac --- /dev/null +++ b/public/static/plugins/css/userlogingiveintegral/admin.css @@ -0,0 +1,23 @@ +/** + * 首页 + */ +.userlogingiveintegral-content .items { + margin: 10px 0 20px 0; + border-bottom: 1px dashed #f1f1f1; + padding-bottom: 20px; +} +.userlogingiveintegral-content .edit-submit { + margin-bottom: 20px; +} + +/** + * 编辑页面 + */ +.form-date input { + width: 30% !important; + display: -webkit-inline-box !important; +} + +.form-date span { + vertical-align: middle; +} \ No newline at end of file diff --git a/public/static/upload/images/plugins_userlogingiveintegral/2019/02/14/1550151082834629.png b/public/static/upload/images/plugins_userlogingiveintegral/2019/02/14/1550151082834629.png new file mode 100644 index 0000000000000000000000000000000000000000..99fe444e5ff3fff47392cd8fc6c8ef4337db5760 GIT binary patch literal 9084 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 z