增加物料分类的功能部分代码
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
public/static/json/2/treeTable/demo-1.json
|
||||
public/test.html
|
||||
186
app/admin/controller/PdmParttype.php
Normal file
186
app/admin/controller/PdmParttype.php
Normal file
@@ -0,0 +1,186 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\AdminController;
|
||||
use app\admin\service\AdminRuleService;
|
||||
use Webman\Http\Request;
|
||||
use app\admin\model\PdmParttype as PdmParttypeModel;
|
||||
use support\Response;
|
||||
/**
|
||||
* pdm_parttype
|
||||
* 分类目录
|
||||
* <!---->
|
||||
* Class PdmParttype
|
||||
* @package app\admin\controller
|
||||
*/
|
||||
class PdmParttype extends AdminController
|
||||
{
|
||||
/**
|
||||
* PdmParttype模型对象
|
||||
* @var \app\admin\model\PdmParttype
|
||||
*/
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->model = new PdmParttypeModel;
|
||||
}
|
||||
|
||||
/**
|
||||
* 默认生成的方法为index/add/edit/del/status 五个方法
|
||||
* 当创建CURD的时候,DIY的函数体和模板为空,请自行编写代码
|
||||
*/
|
||||
|
||||
/**
|
||||
* 获取资源列表
|
||||
* return Response
|
||||
*/
|
||||
public function index(): Response
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
list($count, $list) = PdmParttype::dataList(request()->all());
|
||||
$rules = list_to_tree($list,'id','pid','children',0);
|
||||
|
||||
|
||||
return $this->success('获取成功', '/',$rules, $count);
|
||||
}
|
||||
|
||||
return view('/pdm_parttype/index');
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取资源列表
|
||||
* @param array $params
|
||||
* @return array
|
||||
* @throws DataNotFoundException
|
||||
* @throws DbException
|
||||
* @throws ModelNotFoundException
|
||||
*/
|
||||
public static function dataList(array $params): array
|
||||
{
|
||||
$where = array();
|
||||
if (!empty($params['parttypetitle'])) {
|
||||
$where[] = ['parttypetitle','like','%'.$params['parttypetitle'].'%'];
|
||||
}
|
||||
if (!empty($params['parttypevalue'])) {
|
||||
$where[] = ['parttypevalue','like','%'.$params['parttypevalue'].'%'];
|
||||
}
|
||||
$model = new PdmParttypeModel();
|
||||
$count = $model->where($where)->count();
|
||||
$list = $model->where($where)->order('sort asc')->select()->toArray();
|
||||
foreach ($list as $key => $value) {
|
||||
$list[$key]['parttypetitle'] = __($value['parttypetitle']);
|
||||
}
|
||||
// $users = array();
|
||||
$users = $model->usernames();
|
||||
|
||||
// throw new \Exception(json_encode($users));
|
||||
foreach ($list as $key => $value) {
|
||||
foreach ($users as $keyuser => $valueuser) {
|
||||
// if ($users[$keyuser]['id'] == $list[$key]['id']){
|
||||
// // $list[$key]['createrid'] = __($users[$keyuser]['nickname']);
|
||||
// $list[$key]['createrid'] = __($users[$keyuser]['name']);
|
||||
// break;
|
||||
// }
|
||||
if ($value['createrid'] == $valueuser['id']) {
|
||||
// $list[$key]['createrid'] = __($valueuser['name']);
|
||||
$list[$key]['createrid'] = __($valueuser['nickname']);
|
||||
break;
|
||||
}else{
|
||||
$list[$key]['createrid'] =$list[$key]['createrid'].'|'. __('未知用户');
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return [$count, $list];
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 添加节点数据
|
||||
* @return Response
|
||||
*/
|
||||
public function add(): Response
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$post = \request()->post();
|
||||
// validate(\app\common\validate\system\AdminRules::class . '.add')->check($post);
|
||||
$userid = get_admin_id();
|
||||
$post['createrid'] = $userid ;
|
||||
// if(empty($userid)){
|
||||
// $post['createrid'] = 'empty';
|
||||
// }else{
|
||||
// $post['createrid'] = 'noneempty' ;
|
||||
// }
|
||||
if ($this->model->create($post)) {
|
||||
return $this->success('添加分类成功!');
|
||||
}
|
||||
}
|
||||
|
||||
$data = $this->getTableFields();
|
||||
$data['pid'] = input('pid', 0);
|
||||
$data['auth'] = 1;
|
||||
$data['type'] = 1;
|
||||
|
||||
list($count, $list) = PdmParttype::dataList(request()->all());
|
||||
return view('/pdm_parttype/add', [
|
||||
'data' => $data,
|
||||
'rules' => json_encode( list_to_tree($list), JSON_UNESCAPED_UNICODE),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑节点数据
|
||||
* @return Response
|
||||
* @throws DbException
|
||||
* @throws DataNotFoundException
|
||||
* @throws ModelNotFoundException
|
||||
*/
|
||||
public function edit(): Response
|
||||
{
|
||||
$id = input('id', 0);
|
||||
$data = $this->model->find($id);
|
||||
if (request()->isPost()) {
|
||||
$post = \request()->post();
|
||||
// validate(\app\common\validate\system\AdminRules::class . '.edit')->check($post);
|
||||
if ($this->model->update($post)) {
|
||||
return $this->success('更新分类成功!');
|
||||
}
|
||||
}
|
||||
|
||||
list($count, $list) = PdmParttype::dataList(request()->all());
|
||||
return view('/pdm_parttype/add', [
|
||||
'data' => $data,
|
||||
'rules' => json_encode( list_to_tree($list), JSON_UNESCAPED_UNICODE),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除节点数据
|
||||
* @return Response
|
||||
* @throws DbException
|
||||
*/
|
||||
public function del(): Response
|
||||
{
|
||||
$id = input('id');
|
||||
if (!empty($id)) {
|
||||
// 查询子节点
|
||||
if ($this->model->where('pid',$id)->count()) {
|
||||
return $this->error('当前菜单存在子菜单!');
|
||||
}
|
||||
|
||||
// 删除单个
|
||||
if ($this->model::destroy($id)) {
|
||||
return $this->success('删除菜单成功!');
|
||||
}
|
||||
}
|
||||
|
||||
return $this->error('删除失败,请检查您的参数!');
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
46
app/admin/model/PdmParttype.php
Normal file
46
app/admin/model/PdmParttype.php
Normal file
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace app\admin\model;
|
||||
|
||||
use think\Model;
|
||||
use think\model\concern\SoftDelete;
|
||||
|
||||
/**
|
||||
* pdm_parttype
|
||||
* <!---->
|
||||
* 分类目录
|
||||
* Class PdmParttype
|
||||
* @package app\admin\model
|
||||
*/
|
||||
class PdmParttype extends Model
|
||||
{
|
||||
|
||||
use SoftDelete;
|
||||
|
||||
// 定义时间戳字段名
|
||||
protected $createTime = 'create_time';
|
||||
protected $updateTime = 'update_time';
|
||||
protected $deleteTime = 'delete_time';
|
||||
|
||||
|
||||
/**
|
||||
* 定义 sa_user 关联模型
|
||||
* @localKey id
|
||||
* @bind name,nickname
|
||||
*/
|
||||
public function user()
|
||||
{
|
||||
return $this->hasOne(\app\common\model\system\User::Class,'createrid','id')->bind(['nickname']);
|
||||
}
|
||||
|
||||
public function usernames()
|
||||
{
|
||||
// return \app\common\model\system\User::select()->toArray();
|
||||
return \app\common\model\system\Admin::select()->toArray();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
36
app/admin/validate/PdmParttype.php
Normal file
36
app/admin/validate/PdmParttype.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace app\admin\validate;
|
||||
|
||||
use think\Validate;
|
||||
/**
|
||||
* <!---->
|
||||
* PdmParttype 验证器
|
||||
* Class PdmParttype
|
||||
* @package app\admin\validate
|
||||
*/
|
||||
class PdmParttype extends Validate
|
||||
{
|
||||
/**
|
||||
* 验证规则
|
||||
*/
|
||||
protected $rule = [
|
||||
];
|
||||
|
||||
|
||||
/**
|
||||
* 提示消息
|
||||
*/
|
||||
protected $message = [
|
||||
];
|
||||
|
||||
|
||||
/**
|
||||
* 验证场景
|
||||
*/
|
||||
protected $scene = [
|
||||
'add' => [],
|
||||
'edit' => [],
|
||||
];
|
||||
|
||||
}
|
||||
124
app/admin/view/pdm_parttype/add.html
Normal file
124
app/admin/view/pdm_parttype/add.html
Normal file
@@ -0,0 +1,124 @@
|
||||
<include file="/public/header" />
|
||||
<!-- // 重定位style -->
|
||||
<!---->
|
||||
<link href="__STATICADMIN__css/content.css" rel="stylesheet" type="text/css" />
|
||||
<div class="layui-fluid">
|
||||
<form class="layui-form layui-card" >
|
||||
|
||||
<div class="layui-card-body">
|
||||
<gt name="$data.id" value="0">
|
||||
<input type="text" name="id" value="{$data.id}" hidden="">
|
||||
<else/>
|
||||
<input type="text" name="id" value="" hidden="">
|
||||
</gt>
|
||||
<div class="layui-form-item" >
|
||||
<label class="layui-form-label">上级分类</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="treeNode" name="pid" lay-filter="treeNode" data-pid="{$data.pid|default=0}"></div>
|
||||
</div>
|
||||
<label class="layui-form-label">{:__('排序号')}</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="sort" placeholder="{:__('默认自动生成')}" type="number" value="{$data.sort}" class="layui-input"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item" >
|
||||
<label class="layui-form-label"><font color="red">* </font>Title/分类</label>
|
||||
<div class="layui-input-block"><input class="layui-input" name="parttypetitle" placeholder="请输入" required="1" lay-verify=""value="{$data.parttypetitle}" ></div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item" >
|
||||
<label class="layui-form-label"><font color="red">* </font>分类描述</label>
|
||||
<div class="layui-input-block"><input class="layui-input" name="parttypevalue" placeholder="请输入" required="1" lay-verify=""value="{$data.parttypevalue}" ></div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item" >
|
||||
<label class="layui-form-label">注释</label>
|
||||
<div class="layui-input-block"> <textarea id="content" lay-editor class="layui-hide" name="content" type="layui-textarea" >{$data.content}</textarea></div>
|
||||
</div>
|
||||
|
||||
<div class="layui-footer layui-form-footer">
|
||||
<button class="layui-btn layui-btn-primary" type="button" sa-event="closeDialog">{:__('取消')}</button>
|
||||
<button class="layui-btn" type="button" lay-filter="submitIframe" lay-submit>{:__('提交')}</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<include file="/public/static" />
|
||||
<include file="/public/footer" />
|
||||
|
||||
<script>
|
||||
layui.use(['jquery', 'iconPicker','form'],function() {
|
||||
let $ = layui.jquery;
|
||||
let show = layui.show;
|
||||
let form = layui.form;
|
||||
let iconPicker = layui.iconPicker;
|
||||
let data = {$rules|raw};
|
||||
|
||||
// 提交参数
|
||||
form.on("submit(submit)",function(data){
|
||||
$.post("{:Url('/PdmParttype/')}"+app_Config.action,data.field,function(res){
|
||||
if(res.code === 200){
|
||||
show.msg(res.msg);
|
||||
parent.layui.table.reloadData('lay-tableList');
|
||||
parent.layer.closeAll();
|
||||
// 调用接口更新菜单
|
||||
top.layui.admin.reloadLayout();
|
||||
}else{
|
||||
show.error(res.msg);
|
||||
}
|
||||
});
|
||||
return false;
|
||||
})
|
||||
|
||||
xmSelect.render({
|
||||
el: '#treeNode',
|
||||
tips: '请选择上级菜单',
|
||||
name: 'pid',
|
||||
height: '260px',
|
||||
data: data,
|
||||
radio: true,
|
||||
clickClose: true,
|
||||
initValue:[$('#treeNode').data('pid')],
|
||||
prop: {
|
||||
value: 'id',
|
||||
name:'parttypetitle'
|
||||
},
|
||||
tree: {
|
||||
show: true,
|
||||
strict: false,
|
||||
showLine: false,
|
||||
clickExpand: false,
|
||||
},
|
||||
model: {
|
||||
icon: 'hidden',
|
||||
label: {
|
||||
type: 'text'
|
||||
}
|
||||
},
|
||||
theme: {
|
||||
color: '#1890FF'
|
||||
}
|
||||
})
|
||||
|
||||
iconPicker.render({
|
||||
elem: '#iconPicker',
|
||||
type: 'fontClass',
|
||||
search: true,
|
||||
cellWidth: "19%",
|
||||
page: true,
|
||||
limit: 12,
|
||||
// 点击回调
|
||||
click: function(data) { // 点击回调
|
||||
$('#iconPicker').val(data.icon);
|
||||
},
|
||||
success: function(d) { // 渲染成功后的回调
|
||||
}
|
||||
});
|
||||
|
||||
$('.router').bind('input change',function(data){
|
||||
let router = $('.router').val();
|
||||
router = router.substring(1);
|
||||
$('.alias').val(router.replaceAll('/',':'));
|
||||
})
|
||||
})
|
||||
</script>
|
||||
196
app/admin/view/pdm_parttype/index.html
Normal file
196
app/admin/view/pdm_parttype/index.html
Normal file
@@ -0,0 +1,196 @@
|
||||
<include file="/public/header" />
|
||||
<!---->
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-card">
|
||||
<!-- // 默认操作按钮 -->
|
||||
<div class="layui-card-header layadmin-card-header-auto ">
|
||||
<div class="layui-form">
|
||||
<!-- // 自定义搜索参数 -->
|
||||
<div id="laytable-search" class="layui-form-item" >
|
||||
<div class="layui-inline">
|
||||
<div class="layui-form-label">{:__('ID')}</div>
|
||||
<div class="layui-input-inline ">
|
||||
<input name="id" class="layui-input" type="text" placeholder="{:__('ID')}"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-inline">
|
||||
<div class="layui-form-label">{:__('父ID')}</div>
|
||||
<div class="layui-input-inline ">
|
||||
<input name="pid" class="layui-input" type="text" placeholder="{:__('父ID')}"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-inline">
|
||||
<div class="layui-form-label">{:__('排序')}</div>
|
||||
<div class="layui-input-inline ">
|
||||
<input name="sort" class="layui-input" type="text" placeholder="{:__('排序')}"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-inline">
|
||||
<div class="layui-form-label">{:__('描述')}</div>
|
||||
<div class="layui-input-inline ">
|
||||
<input name="parttypevalue" class="layui-input" type="text" placeholder="{:__('描述')}"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-inline">
|
||||
<div class="layui-form-label">{:__('用户')}</div>
|
||||
<div class="layui-input-inline ">
|
||||
<input name="createrid" class="layui-input" type="text" placeholder="{:__('用户')}"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-inline">
|
||||
<div class="layui-form-label">{:__('注释')}</div>
|
||||
<div class="layui-input-inline ">
|
||||
<input name="content" class="layui-input" type="text" placeholder="{:__('注释')}"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-inline">
|
||||
<div class="layui-form-label">{:__('更新时间')}</div>
|
||||
<div class="layui-input-inline ">
|
||||
<input name="update_time" lay-datetime data-range="true" data-type="date" data-dateformat="yyyy/MM/dd" class="layui-input" type="text" placeholder="{:__('更新时间')}"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-inline">
|
||||
<div class="layui-form-label">{:__('创建时间')}</div>
|
||||
<div class="layui-input-inline ">
|
||||
<input name="create_time" lay-datetime data-range="true" data-type="date" data-dateformat="yyyy/MM/dd" class="layui-input" type="text" placeholder="{:__('创建时间')}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<div class="layui-form-label">{:__('Parttype')}</div>
|
||||
<div class="layui-input-inline ">
|
||||
<input name="parttypetitle" class="layui-input" type="text" placeholder="{:__('Parttype')}"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline" >
|
||||
<!-- // 默认搜索 -->
|
||||
<button class="layui-btn icon-btn" lay-filter="formSearch" lay-submit><i class="layui-icon layui-icon-search"></i>{:__('搜索')}</button>
|
||||
<!--formBegin-->
|
||||
<button class="layui-btn icon-btn" lay-open="" data-title="{:__('添加')}" data-area="1100px,750px" data-maxmin="true" data-url="{:url('/PdmParttype/add')}" >
|
||||
<i class="layui-icon layui-icon-add-1"></i>{:__('添加')}
|
||||
</button>
|
||||
<button class="layui-btn layui-btn-primary icon-btn" id="expandAll" ><i class="layui-icon layui-icon-templeate-1"></i>{:__('展开全部')}</button>
|
||||
<button class="layui-btn layui-btn-danger icon-btn" id="foldAll" ><i class="layui-icon layui-icon-add-1"></i>{:__('折叠全部')}</button>
|
||||
<!--formEnd-->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- // 创建数据实例 -->
|
||||
<table id="lay-tableList" lay-filter="lay-tableList"></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- // 列表状态栏 -->
|
||||
<script type="text/html" id="columnStatus">
|
||||
<input type="checkbox" lay-filter="switchStatus" data-url="{:url('/PdmParttype/status')}" value="{{d.id}}" lay-skin="switch" {{d.status==1?'checked':''}} />
|
||||
</script>
|
||||
|
||||
<!-- // 列表工具栏 -->
|
||||
<script type="text/html" id="tableBar">
|
||||
<!--formBegin-->
|
||||
<a class="layui-table-text" lay-open data-title="{:__('添加菜单')}" data-url="{:url('/PdmParttype/add')}?pid={{d.id}}"
|
||||
data-area="1100px,750px" >{:__('添加')}</a>
|
||||
<div class="layui-divider layui-divider-vertical"></div>
|
||||
<a class="layui-table-text" data-title="{:__('编辑')}" data-area="1100px,750px" data-maxmin="true"
|
||||
data-url="{:url('/PdmParttype/edit')}?id={{d.id}}" lay-event="edit" >{:__('编辑')}</a>
|
||||
<div class="layui-divider layui-divider-vertical"></div>
|
||||
|
||||
<!--formEnd-->
|
||||
<a class="layui-table-text" data-url="{:url('/PdmParttype/del')}?id={{d.id}}" lay-event="del" >{:__('删除')}</a>
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
<script type="text/html" id="tableButton"></script>
|
||||
|
||||
<include file="/public/footer" />
|
||||
<script>
|
||||
layui.use(['form','treeTable'], function () {
|
||||
|
||||
let $ = layui.jquery;
|
||||
let form = layui.form;
|
||||
let treeTable = layui.treeTable;
|
||||
let tableURL = "{:url('/PdmParttype/index')}";
|
||||
|
||||
// 渲染初始化表格
|
||||
let renderTable = function (tableURL) {
|
||||
treeTable.render({
|
||||
id: 'lay-tableList',
|
||||
elem: '#lay-tableList',
|
||||
url: tableURL,
|
||||
toolbar: '#tableButton',
|
||||
defaultToolbar: ['filter', 'exports', 'print','search'],
|
||||
cellMinWidth: 160,
|
||||
page: true,
|
||||
limit: 18,
|
||||
tree: {
|
||||
customName: {
|
||||
pid: 'pid',
|
||||
icon: 'icon1',
|
||||
},
|
||||
view: {
|
||||
iconClose: '', // 关闭时候的图标
|
||||
iconOpen: '', // 打开时候的图标
|
||||
iconLeaf: '', // 叶子节点的图标
|
||||
}
|
||||
},
|
||||
cols: [[
|
||||
//{type: 'checkbox', width: 50},
|
||||
{type: 'numbers'},
|
||||
//{field: 'id', align: 'center',sort: true,width: 80, title: 'ID'},
|
||||
//{field:'parttypetitle',title:'{:__("Title")}'},
|
||||
{field: 'name', title: '{:__("Parttype")}',templet: function(d) {
|
||||
return d.parttypetitle;
|
||||
},},
|
||||
{field:'parttypevalue',title:'{:__("描述")}'},
|
||||
{field:'createrid',title:'{:__("创建者")}',templet: function(d) {
|
||||
return d.createrid ;
|
||||
},},
|
||||
{field:'sort',title:'{:__("排序")}'},
|
||||
{field:'content',title:'{:__("注释")}'},
|
||||
{align: 'center', toolbar: '#tableBar', width:220, fixed: 'right', title: '{:__("操作")}'},
|
||||
]]
|
||||
});
|
||||
}
|
||||
|
||||
// 监听搜索 serialize
|
||||
form.on('submit(treeSearch)',function(data) {
|
||||
|
||||
let whereURL = '',
|
||||
field = data.field;
|
||||
for (let key in field ) {
|
||||
whereURL += key + '=' + field[key];
|
||||
whereURL += '&';
|
||||
}
|
||||
|
||||
// 拼接字符串
|
||||
whereURL = whereURL.replace(/(.*)&/,'$1 ');
|
||||
whereURL = tableURL + '?' + whereURL;
|
||||
renderTable(whereURL);
|
||||
})
|
||||
|
||||
// 展开所有
|
||||
$('#expandAll').click(function(){
|
||||
treeTable.expandAll('lay-tableList', true);
|
||||
})
|
||||
|
||||
// 折叠所有
|
||||
$('#foldAll').click(function () {
|
||||
treeTable.expandAll('lay-tableList',false);
|
||||
});
|
||||
|
||||
// 执行初始化
|
||||
renderTable(tableURL);
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
@@ -4,6 +4,6 @@ return [
|
||||
[plugin\easyflow\Easyflow::class, 'appInit'],
|
||||
],
|
||||
'testhook'=> [
|
||||
[\plugin\demo\Demo::class, 'testhook'],
|
||||
[plugin\demo\Demo::class, 'testhook'],
|
||||
],
|
||||
];
|
||||
@@ -1 +0,0 @@
|
||||
// 前端JS文件
|
||||
@@ -1 +0,0 @@
|
||||
// 后端JS文件
|
||||
Reference in New Issue
Block a user