1、新增用户验证UserAuth中的set、addAllowField,用于设置扩展属性;

2、完善用户等级功能,新增user_level表,具有level标识图片,并相应新增后台菜单;
pull/81/head
raorf 2018-11-10 10:37:28 +08:00
parent 06f503526c
commit 4135f48547
13 changed files with 397 additions and 8 deletions

View File

@ -621,5 +621,48 @@ INSERT INTO `fa_user_rule` (`id`,`pid`,`icon`,`name`,`title`,`condition`,`remark
(18,17,'user/log/index','View','',0,1516015012,1537758859,3,'normal','fa fa-circle-o','','file'); (18,17,'user/log/index','View','',0,1516015012,1537758859,3,'normal','fa fa-circle-o','','file');
COMMIT; COMMIT;
#
# 增加用户等级表
#
DROP TABLE IF EXISTS `fa_user_level`;
CREATE TABLE `fa_user_level` (
`level_id` smallint(4) unsigned NOT NULL AUTO_INCREMENT COMMENT '表id',
`level_name` varchar(30) DEFAULT NULL COMMENT '头衔名称',
`amount` decimal(10,2) DEFAULT NULL COMMENT '必要积分',
`discount` smallint(4) DEFAULT '0' COMMENT '折扣',
`describe` varchar(200) DEFAULT NULL COMMENT '头街描述',
`level_img` varchar(150) DEFAULT NULL COMMENT '标识图片',
PRIMARY KEY (`level_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='会员等级';
#
# 增加用户等级数据
#
BEGIN;
INSERT INTO `fa_user_level` VALUES
(1,'天降玄铁',0.00,100,'若如初相见,若如初相恋','uploads/user/level/20181110/57edd6ae5d8b8.png'),
(2,'百炼成钢',100,95,'','uploads/user/level/20181110/57edd6d446b75.png'),
(3,'倔强青铜',500,90,'','uploads/user/level/20181110/57edd6efc8757.png'),
(4,'秩序白银',1000,85,'','uploads/user/level/20181110/57edd70cbd0f5.png'),
(5,'荣耀黄金',5000,80,'',NULL),
(6,'尊贵铂金',10000,75,'',NULL),
(7,'永恒钻石',50000,65,'',NULL),
(8,'至尊星耀',100000,60,'',NULL),
(9,'最强王者',1000000,50,'',NULL);
COMMIT;
#
# 增加后台菜单“用户等级”
#
BEGIN;
INSERT INTO `fa_auth_rule` (`id`,`type`,`pid`,`name`,`title`,`icon`,`condition`,`remark`,`ismenu`,`createtime`,`updatetime`,`weigh`,`status`) VALUES
(161,'file',66,'user/level','会员等级','fa fa-circle-o','','',1,1541814848,1541814848,0,'normal'),
(162,'file',161,'user/level/index','查看','fa fa-circle-o','','',0,1541814848,1541814848,0,'normal'),
(163,'file',161,'user/level/add','添加','fa fa-circle-o','','',0,1541814848,1541814848,0,'normal'),
(164,'file',161,'user/level/edit','编辑','fa fa-circle-o','','',0,1541814848,1541814848,0,'normal'),
(165,'file',161,'user/level/del','删除','fa fa-circle-o','','',0,1541814848,1541814848,0,'normal'),
(166,'file',161,'user/level/multi','批量更新','fa fa-circle-o','','',0,1541814848,1541814848,0,'normal');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1; SET FOREIGN_KEY_CHECKS = 1;

View File

@ -0,0 +1,35 @@
<?php
namespace app\admin\controller\user;
use app\common\controller\Backend;
/**
* 会员等级
*
* @icon fa fa-circle-o
*/
class Level extends Backend
{
/**
* Level模型对象
* @var \app\common\model\user\Level
*/
protected $model = null;
public function _initialize()
{
parent::_initialize();
$this->model = new \app\common\model\user\Level;
}
/**
* 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
* 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
* 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
*/
}

View File

@ -0,0 +1,48 @@
<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Level_name')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-level_name" class="form-control" name="row[level_name]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Amount')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-amount" class="form-control" step="0.01" name="row[amount]" type="number">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Discount')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-discount" class="form-control" name="row[discount]" type="number" value="0">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Describe')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-describe" class="form-control" name="row[describe]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Level_img')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="input-group">
<input id="c-level_img" class="form-control" size="50" name="row[level_img]" type="text" value="">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="plupload-image" class="btn btn-danger plupload" data-input-id="c-level_img" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="false" data-preview-id="p-level_image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-level_img" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right"></span>
</div>
<ul class="row list-inline plupload-preview" id="p-level_image"></ul>
</div>
</div>
<div class="form-group layer-footer">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">
<button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
<button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
</div>
</div>
</form>

View File

@ -0,0 +1,48 @@
<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Level_name')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-level_name" class="form-control" name="row[level_name]" type="text" value="{$row.level_name}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Amount')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-amount" class="form-control" step="0.01" name="row[amount]" type="number" value="{$row.amount}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Discount')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-discount" class="form-control" name="row[discount]" type="number" value="{$row.discount}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Describe')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-describe" class="form-control" name="row[describe]" type="text" value="{$row.describe}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Level_img')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="input-group">
<input id="c-level_img" class="form-control" size="50" name="row[level_img]" type="text" value="{$row.level_img}">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="plupload-image" class="btn btn-danger plupload" data-input-id="c-level_img" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="false" data-preview-id="p-level_image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-level_img" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right"></span>
</div>
<ul class="row list-inline plupload-preview" id="p-level_image"></ul>
</div>
</div>
<div class="form-group layer-footer">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">
<button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
<button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
</div>
</div>
</form>

View File

@ -0,0 +1,33 @@
<div class="panel panel-default panel-intro">
{:build_heading()}
<div class="panel-body">
<div id="myTabContent" class="tab-content">
<div class="tab-pane fade active in" id="one">
<div class="widget-body no-padding">
<div id="toolbar" class="toolbar">
<a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
<a href="javascript:;" class="btn btn-success btn-add {:$auth->check('user/level/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
<a href="javascript:;" class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('user/level/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>
<a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('user/level/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
<a href="javascript:;" class="btn btn-danger btn-import {:$auth->check('user/level/import')?'':'hide'}" title="{:__('Import')}" id="btn-import-file" data-url="ajax/upload" data-mimetype="csv,xls,xlsx" data-multiple="false"><i class="fa fa-upload"></i> {:__('Import')}</a>
<div class="dropdown btn-group {:$auth->check('user/level/multi')?'':'hide'}">
<a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
<ul class="dropdown-menu text-left" role="menu">
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
</ul>
</div>
</div>
<table id="table" class="table table-striped table-bordered table-hover table-nowrap"
data-operate-edit="{:$auth->check('user/level/edit')}"
data-operate-del="{:$auth->check('user/level/del')}"
width="100%">
</table>
</div>
</div>
</div>
</div>
</div>

View File

@ -351,8 +351,8 @@ class UserAuth
$user->logintime = $time; $user->logintime = $time;
$user->save(); $user->save();
//查询用户信息之后, 查询用户的登记昵称 //查询用户信息之后, 查询用户的积分等级
$levelId = $user['level']; $levelId = $user['level'];
$levelName = Db::name("user_level")->where("level_id", $levelId)->column("level_name"); $levelName = Db::name("user_level")->where("level_id", $levelId)->column("level_name");
$user['level_name'] = $levelName; $user['level_name'] = $levelName;
@ -472,7 +472,7 @@ class UserAuth
} }
/** /**
* 设置允许输出的字段 * 重新设置允许输出的字段
* @param array $fields * @param array $fields
*/ */
public function setAllowFields($fields) public function setAllowFields($fields)
@ -480,6 +480,15 @@ class UserAuth
$this->allowFields = $fields; $this->allowFields = $fields;
} }
/**
* 追加设置允许输出的字段
* @param array $fields
*/
public function addAllowFields($fields)
{
$this->allowFields .= $fields;
}
/** /**
* 删除一个指定会员 * 删除一个指定会员
* @param int $user_id 会员ID * @param int $user_id 会员ID
@ -772,19 +781,64 @@ class UserAuth
return $this->menus; return $this->menus;
} }
/**
* 设置user扩展属性 name 为数组则为批量设置
* @access public
* @param string|array $name 配置参数名(支持二级配置 . 号分割)
* @param mixed $value 配置值
* @param string $range 作用域
* @return mixed
*/
public static function set($name, $value = null, $range = '')
{
$range = $range ?: self::$range;
if (!isset(self::$_user[$range])) self::$_user[$range] = [];
// 字符串则表示单个配置设置
if (is_string($name)) {
if (!strpos($name, '.')) {
self::$_user[$range][strtolower($name)] = $value;
} else {
// 二维数组
$name = explode('.', $name, 2);
self::$_user[$range][strtolower($name[0])][$name[1]] = $value;
}
return $value;
}
// 数组则表示批量设置
if (is_array($name)) {
if (!empty($value)) {
self::$_user[$range][$value] = isset(self::$_user[$range][$value]) ?
array_merge(self::$_user[$range][$value], $name) :
$name;
return self::$_user[$range][$value];
}
return self::$_user[$range] = array_merge(
self::$_user[$range], array_change_key_case($name)
);
}
// 为空直接返回已有配置
return self::$_user[$range];
}
/** /**
* 获取等级 * 获取等级
* @return array * @return array
public function getRank() */
public function getLevel()
{ {
if ($this->_logined){//登录才能获取等级 if ($this->_logined){//登录才能获取等级
$rank = $this->_user->level; $rank = $this->_user->level;
if (!$rank) { if (!$rank) {
return false; return false;
} }
return UserRanks::get( $rank); return \think\Db::name('user_level')->where('level_id',$rank)->column('level_id,level_name,level_img');
} }
} }
*/
} }

View File

@ -102,7 +102,8 @@ class User Extends Model
*/ */
public static function nextlevel($score = 0) public static function nextlevel($score = 0)
{ {
$lv = array(1 => 0, 2 => 30, 3 => 100, 4 => 500, 5 => 1000, 6 => 2000, 7 => 3000, 8 => 5000, 9 => 8000, 10 => 10000); //$lv = array(1 => 0, 2 => 30, 3 => 100, 4 => 500, 5 => 1000, 6 => 2000, 7 => 3000, 8 => 5000, 9 => 8000, 10 => 10000);
$lv = \think\Db::name('user_ranks')->column('level_id,amount');
$level = 1; $level = 1;
foreach ($lv as $key => $value) foreach ($lv as $key => $value)
{ {

View File

@ -0,0 +1,33 @@
<?php
namespace app\common\model\user;
use think\Model;
class Level extends Model
{
// 表名
protected $name = 'user_level';
// 自动写入时间戳字段
protected $autoWriteTimestamp = false;
// 定义时间戳字段名
protected $createTime = false;
protected $updateTime = false;
// 追加属性
protected $append = [
];
}

View File

@ -0,0 +1,27 @@
<?php
namespace app\common\validate\user;
use think\Validate;
class Level extends Validate
{
/**
* 验证规则
*/
protected $rule = [
];
/**
* 提示消息
*/
protected $message = [
];
/**
* 验证场景
*/
protected $scene = [
'add' => [],
'edit' => [],
];
}

View File

@ -0,0 +1,10 @@
<?php
return [
'Level_id' => '表id',
'Level_name' => '头衔名称',
'Amount' => '必要积分',
'Discount' => '折扣',
'Describe' => '头街描述',
'Level_img' => '标识图片'
];

View File

@ -15,6 +15,7 @@ class Profile extends Userend
{ {
//设置过滤方法 //设置过滤方法
$this->request->filter(['strip_tags']); $this->request->filter(['strip_tags']);
$this->assign('level',$this->auth->getLevel());
return $this->view->fetch('user/profile'); return $this->view->fetch('user/profile');
} }

View File

@ -44,7 +44,9 @@
<div class="profile-avatar-text img-circle">{:__('Click to edit')}</div> <div class="profile-avatar-text img-circle">{:__('Click to edit')}</div>
<button id="plupload-avatar" class="plupload" data-mimetype="png,jpg,jpeg,gif" data-input-id="c-avatar"><i class="fa fa-upload"></i> {:__('Upload')}</button> <button id="plupload-avatar" class="plupload" data-mimetype="png,jpg,jpeg,gif" data-input-id="c-avatar"><i class="fa fa-upload"></i> {:__('Upload')}</button>
</div> </div>
<h3 class="profile-username text-center">{$user.username}</h3> <h3 class="profile-username text-center">{$user.username}
<img width="20" height="20" src="__CDN__{$level[$user['level']]['level_img']}" title="{$level[$user['level']]['level_name']}"/>
</h3>
<div class="form-group"> <div class="form-group">
<label class="control-label">{:__('Nickname')}:</label> <label class="control-label">{:__('Nickname')}:</label>
<input type="text" class="form-control" id="nickname" name="nickname" value="{$user.nickname}" data-rule="required" placeholder=""> <input type="text" class="form-control" id="nickname" name="nickname" value="{$user.nickname}" data-rule="required" placeholder="">

View File

@ -0,0 +1,54 @@
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
var Controller = {
index: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
index_url: 'user/level/index',
add_url: 'user/level/add',
edit_url: 'user/level/edit',
del_url: 'user/level/del',
multi_url: 'user/level/multi',
table: 'user_level',
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: $.fn.bootstrapTable.defaults.extend.index_url,
pk: 'level_id',
sortName: 'level_id',
columns: [
[
{checkbox: true},
{field: 'level_id', title: __('Level_id')},
{field: 'level_img', title: __('level_img'), operate: false, formatter: Table.api.formatter.image},
{field: 'level_name', title: __('Level_name')},
{field: 'amount', title: __('Amount'), operate:'BETWEEN'},
{field: 'discount', title: __('Discount')},
{field: 'describe', title: __('Describe')},
{field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
add: function () {
Controller.api.bindevent();
},
edit: function () {
Controller.api.bindevent();
},
api: {
bindevent: function () {
Form.api.bindevent($("form[role=form]"));
}
}
};
return Controller;
});