mirror of https://gitee.com/karson/fastadmin.git
1、新增用户验证UserAuth中的set、addAllowField,用于设置扩展属性;
2、完善用户等级功能,新增user_level表,具有level标识图片,并相应新增后台菜单;pull/81/head
parent
06f503526c
commit
4135f48547
|
|
@ -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');
|
||||
|
||||
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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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中对应的方法复制到当前控制器,然后进行修改
|
||||
*/
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -351,8 +351,8 @@ class UserAuth
|
|||
$user->logintime = $time;
|
||||
|
||||
$user->save();
|
||||
|
||||
//查询用户信息之后, 查询用户的登记昵称
|
||||
|
||||
//查询用户信息之后, 查询用户的积分等级
|
||||
$levelId = $user['level'];
|
||||
$levelName = Db::name("user_level")->where("level_id", $levelId)->column("level_name");
|
||||
$user['level_name'] = $levelName;
|
||||
|
|
@ -472,7 +472,7 @@ class UserAuth
|
|||
}
|
||||
|
||||
/**
|
||||
* 设置允许输出的字段
|
||||
* 重新设置允许输出的字段
|
||||
* @param array $fields
|
||||
*/
|
||||
public function setAllowFields($fields)
|
||||
|
|
@ -480,6 +480,15 @@ class UserAuth
|
|||
$this->allowFields = $fields;
|
||||
}
|
||||
|
||||
/**
|
||||
* 追加设置允许输出的字段
|
||||
* @param array $fields
|
||||
*/
|
||||
public function addAllowFields($fields)
|
||||
{
|
||||
$this->allowFields .= $fields;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除一个指定会员
|
||||
* @param int $user_id 会员ID
|
||||
|
|
@ -772,19 +781,64 @@ class UserAuth
|
|||
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
|
||||
public function getRank()
|
||||
*/
|
||||
public function getLevel()
|
||||
{
|
||||
if ($this->_logined){//登录才能获取等级
|
||||
$rank = $this->_user->level;
|
||||
if (!$rank) {
|
||||
return false;
|
||||
}
|
||||
return UserRanks::get( $rank);
|
||||
return \think\Db::name('user_level')->where('level_id',$rank)->column('level_id,level_name,level_img');
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -102,7 +102,8 @@ class User Extends Model
|
|||
*/
|
||||
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;
|
||||
foreach ($lv as $key => $value)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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 = [
|
||||
|
||||
];
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -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' => [],
|
||||
];
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'Level_id' => '表id',
|
||||
'Level_name' => '头衔名称',
|
||||
'Amount' => '必要积分',
|
||||
'Discount' => '折扣',
|
||||
'Describe' => '头街描述',
|
||||
'Level_img' => '标识图片'
|
||||
];
|
||||
|
|
@ -15,6 +15,7 @@ class Profile extends Userend
|
|||
{
|
||||
//设置过滤方法
|
||||
$this->request->filter(['strip_tags']);
|
||||
$this->assign('level',$this->auth->getLevel());
|
||||
return $this->view->fetch('user/profile');
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
<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>
|
||||
</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">
|
||||
<label class="control-label">{:__('Nickname')}:</label>
|
||||
<input type="text" class="form-control" id="nickname" name="nickname" value="{$user.nickname}" data-rule="required" placeholder="">
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
});
|
||||
Loading…
Reference in New Issue