Browse Source

任务管理

master
wanghongjun 1 year ago
parent
commit
2eb24ed30d
  1. 103
      app/admin/controller/liveroom/Task.php
  2. 15
      app/admin/controller/user/Api.php
  3. 21
      app/admin/controller/user/Ipuser.php
  4. 2
      app/admin/model/LiveRoom.php
  5. 2
      app/admin/model/Task.php
  6. 10
      app/admin/model/User.php
  7. 31
      app/admin/validate/TaskValidate.php
  8. 87
      app/admin/view/liveroom/task/add.html
  9. 87
      app/admin/view/liveroom/task/edit.html
  10. 11
      app/admin/view/liveroom/task/index.html
  11. 15
      app/common.php
  12. 113
      public/static/admin/js/liveroom/task.js

103
app/admin/controller/liveroom/Task.php

@ -2,9 +2,13 @@
namespace app\admin\controller\liveroom;
use app\admin\model\LiveRoom;
use app\admin\model\User;
use app\admin\validate\TaskValidate;
use app\common\controller\AdminController;
use think\App;
use app\admin\model\Task as TaskModel;
use think\exception\ValidateException;
class Task extends AdminController
{
@ -15,5 +19,104 @@ class Task extends AdminController
$this->model = new TaskModel();
}
public function index()
{
if ($this->request->isAjax()) {
if (input('selectFields')) {
return $this->selectList();
}
list($page, $limit, $where) = $this->buildTableParames();
$count = $this->model
->where($where)
->count();
$list = $this->model
->withoutField('update_time, delete_time')
->where($where)
->page($page, $limit)
->order('id')
->select()
->each(function ($item) {
$item['status_str'] = TaskModel::$statusArr[$item['status']] ?? '-';
$item['add_uid'] = User::getUserValue($item['add_uid']);
$item['assign_uid'] = User::getUserValue($item['assign_uid']);
$item['deduction_ratio'] = $item['deduction_ratio'] * 1;
return $item;
});
$data = [
'code' => 0,
'msg' => '',
'count' => $count,
'data' => $list
];
return json($data);
}
$this->assign('status_json', json_encode(TaskModel::$statusArr));
return $this->fetch();
}
/**
* @NodeAnotation(title="添加")
*/
public function add()
{
if ($this->request->isPost()) {
$post = $this->request->post();
try {
validate(TaskValidate::class)->scene('add')->check($post);
$save = $this->model->save($post);
} catch (ValidateException $e) {
$this->error($e->getMessage());
} catch (\Exception $e) {
$this->error('保存失败');
}
$save ? $this->success('保存成功') : $this->error('保存失败');
}
return $this->fetch();
}
/**
* @NodeAnotation(title="编辑")
*/
public function edit($id)
{
$row = $this->model->find($id);
empty($row) && $this->error('数据不存在');
if ($this->request->isPost()) {
$post = $this->request->post();
try {
validate(TaskValidate::class)->scene('add')->check($post);
$save = $row->save($post);
} catch (ValidateException $e) {
$this->error($e->getMessage());
} catch (\Exception $e) {
$this->error('保存失败');
}
$save ? $this->success('保存成功') : $this->error('保存失败');
}
$row['room_id'] = LiveRoom::where('id', $row['live_room_id'])->value('room_id') ?? '';
$row['add_uname'] = User::getUserValue($row['add_uid']);
$row['assign_uname'] = User::getUserValue($row['assign_uid']);
$row['deduction_ratio'] = $row['deduction_ratio'] * 1;
$this->assign('row', $row);
return $this->fetch();
}
/**
* @NodeAnotation(title="删除")
*/
public function delete($id)
{
$this->checkPostRequest();
$row = $this->model->whereIn('id', $id)->select();
$row->isEmpty() && $this->error('数据不存在');
try {
$save = false;
foreach ($row as $value) {
$save = $this->model->where('id', $value['id'])->useSoftDelete('delete_time', time())->delete();
}
} catch (\Exception $e) {
$this->error('删除失败');
}
$save ? $this->success('删除成功') : $this->error('删除失败');
}
}

15
app/admin/controller/user/Api.php

@ -3,6 +3,7 @@
namespace app\admin\controller\user;
use app\admin\model\Ip as IpModel;
use app\admin\model\LiveRoom;
use app\admin\model\User;
use app\common\controller\AdminController;
use think\App;
@ -10,6 +11,7 @@ use think\response\Json;
class Api extends AdminController
{
protected $data = ['code' => 0, 'msg' => ''];
public function __construct(App $app)
{
@ -19,14 +21,19 @@ class Api extends AdminController
public function getUserPageList(): Json
{
$userList = User::getPageList($this->request->get());
$data = ['code' => 0, 'msg' => ''];
return json(array_merge($data, $userList));
return json(array_merge($this->data, $userList));
}
public function getIpPageList(): Json
{
$ipList = IpModel::getPageList($this->request->get());
$data = ['code' => 0, 'msg' => ''];
return json(array_merge($data, $ipList));
return json(array_merge($this->data, $ipList));
}
public function getLiveRoomPageList(): Json
{
$list = LiveRoom::getPageList($this->request->get());
array_del_key($list['data'], ['id', 'room_id']);
return json(array_merge($this->data, $list));
}
}

21
app/admin/controller/user/Ipuser.php

@ -17,6 +17,26 @@ class Ipuser extends AdminController
$this->model = new IpUserModel();
}
protected function indexWhere(&$where)
{
if ($where) {
foreach ($where as $key => $w) {
if ($w[0] == 'username') {
$uid = User::where('nick_name', $w[1], $w[2])->column('uid');
$where[$key] = ['uid', 'in', $uid ?: [0]];
}
if ($w[0] == 'ip') {
$uid = IpModel::where('ip', $w[1], $w[2])->column('id');
$where[$key] = ['ip_id', 'in', $uid ?: [0]];
}
if ($w[0] == 'ip_status') {
$uid = IpModel::where('status', $w[1], $w[2])->column('id');
$where[$key] = ['ip_id', 'in', $uid ?: [0]];
}
}
}
}
public function index()
{
if ($this->request->isAjax()) {
@ -24,6 +44,7 @@ class Ipuser extends AdminController
return $this->selectList();
}
list($page, $limit, $where) = $this->buildTableParames();
$this->indexWhere($where);
$count = $this->model
->where($where)
->count();

2
app/admin/model/LiveRoom.php

@ -21,7 +21,7 @@ class LiveRoom extends TimeModel
$field = 'id, room_id, anchor_information, link, create_time';
$order = 'id desc';
$count = self::where($where)->count();
$list = self::where($where)->field($field)->order($order)->page($page, $limit)->select();
$list = self::where($where)->field($field)->order($order)->page($page, $limit)->select()->toArray();
return ['data' => $list, 'count' => $count];
}
}

2
app/admin/model/Task.php

@ -11,6 +11,8 @@ class Task extends TimeModel
protected $defaultSoftDelete = '0';
public static $statusArr = ['停止', '待开始', '进行中', '已完成', '驳回'];
public static function getPageList($param = []): array
{
$page = $param['page'] ?? 1;

10
app/admin/model/User.php

@ -29,4 +29,14 @@ class User extends TimeModel
$list = self::where($where)->field($field)->order($order)->page($page, $limit)->select();
return ['data' => $list, 'count' => $count];
}
/**
* 返回用户字段信息
* @param $uid
* @param string $field
* @return mixed|string
*/
public static function getUserValue($uid, string $field = 'nick_name') {
return (new self)->where('uid', $uid)->value($field) ?? '-';
}
}

31
app/admin/validate/TaskValidate.php

@ -0,0 +1,31 @@
<?php
namespace app\admin\validate;
use think\Validate;
class TaskValidate extends Validate
{
protected $rule= [
'id|编号' => 'require|number',
'uuid|任务编号' => 'require|alphaNum|max:50',
'integral|积分' => 'require|number',
'live_room_id|直播间编号' => 'require|number',
'duration|时长' => 'require|number',
'deduction_ratio|扣减比例' => 'require|float',
'add_uid|创建用户' => 'require|number',
'assign_uid|指派用户' => 'require|number',
'title|任务名称' => 'require',
'content|任务描述' => 'require',
];
protected $message = [];
protected $scene= [
'add' => ['uuid', 'integral', 'live_room_id', 'duration', 'deduction_ratio', 'add_uid', 'assign_uid', 'title', 'content'],
'edit' => ['id', 'uuid', 'integral', 'live_room_id', 'duration', 'deduction_ratio', 'add_uid', 'assign_uid', 'title', 'content']
];
}

87
app/admin/view/liveroom/task/add.html

@ -0,0 +1,87 @@
<div class="layuimini-container">
<form id="app-form" class="layui-form layuimini-form">
<div class="layui-form-item">
<label class="layui-form-label required">任务编号</label>
<div class="layui-input-block">
<input type="text" name="uuid" class="layui-input" lay-verify="required" lay-reqtext="请输入任务编号" placeholder="请输入任务编号" value="">
<tip>填写任务编号。</tip>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">任务名称</label>
<div class="layui-input-block">
<input type="text" name="title" class="layui-input" lay-verify="required" lay-reqtext="请输入任务名称" placeholder="请输入任务名称" value="">
<tip>填写任务名称。</tip>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">直播间ID</label>
<div class="layui-input-block">
<input type="text" id="room_id" class="layui-input" readonly lay-verify="required" lay-reqtext="请输入直播间ID" placeholder="请输入直播间ID" value="">
<input type="hidden" name="live_room_id" id="live_room_id" value="">
<tip>填写直播间ID。</tip>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">创建用户</label>
<div class="layui-input-block">
<input type="text" id="add_uname" class="layui-input" readonly lay-verify="required" lay-reqtext="请输入创建用户" placeholder="请输入创建用户" value="">
<input type="hidden" name="add_uid" id="add_uid" value="">
<tip>填写扣减比例。</tip>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">指派用户</label>
<div class="layui-input-block">
<input type="text" id="assign_uname" class="layui-input" readonly lay-verify="required" lay-reqtext="请输入指派用户" placeholder="请输入指派用户" value="">
<input type="hidden" name="assign_uid" id="assign_uid" value="">
<tip>填写扣减比例。</tip>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">积分</label>
<div class="layui-input-block">
<input type="text" name="integral" class="layui-input" lay-verify="required" lay-reqtext="请输入积分" placeholder="请输入积分" value="">
<tip>填写积分。</tip>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">任务描述</label>
<div class="layui-input-block">
<textarea name="content" lay-verify="required" lay-reqtext="请输入任务描述" placeholder="请输入任务描述" class="layui-textarea"></textarea>
<tip>填写任务描述。</tip>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">时长(h)</label>
<div class="layui-input-block">
<input type="text" name="duration" class="layui-input" lay-verify="required" lay-reqtext="请输入时长" placeholder="请输入时长" value="">
<tip>填写时长。</tip>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">扣减比例(%)</label>
<div class="layui-input-block">
<input type="text" name="deduction_ratio" class="layui-input" lay-verify="required" lay-reqtext="请输入扣减比例" placeholder="请输入扣减比例" value="">
<tip>填写扣减比例。</tip>
</div>
</div>
<div class="hr-line"></div>
<div class="layui-form-item text-center">
<button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit>确认</button>
<button type="reset" class="layui-btn layui-btn-primary layui-btn-sm">重置</button>
</div>
</form>
</div>

87
app/admin/view/liveroom/task/edit.html

@ -0,0 +1,87 @@
<div class="layuimini-container">
<form id="app-form" class="layui-form layuimini-form">
<div class="layui-form-item">
<label class="layui-form-label required">任务编号</label>
<div class="layui-input-block">
<input type="text" name="uuid" class="layui-input" lay-verify="required" lay-reqtext="请输入任务编号" placeholder="请输入任务编号" value="{$row.uuid|default=''}">
<tip>填写任务编号。</tip>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">任务名称</label>
<div class="layui-input-block">
<input type="text" name="title" class="layui-input" lay-verify="required" lay-reqtext="请输入任务名称" placeholder="请输入任务名称" value="{$row.title|default=''}">
<tip>填写任务名称。</tip>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">直播间ID</label>
<div class="layui-input-block">
<input type="text" id="room_id" class="layui-input" readonly lay-verify="required" lay-reqtext="请输入直播间ID" placeholder="请输入直播间ID" value="{$row.room_id|default=''}">
<input type="hidden" name="live_room_id" id="live_room_id" value="{$row.live_room_id|default=''}">
<tip>填写直播间ID。</tip>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">创建用户</label>
<div class="layui-input-block">
<input type="text" id="add_uname" class="layui-input" readonly lay-verify="required" lay-reqtext="请输入创建用户" placeholder="请输入创建用户" value="{$row.add_uname|default=''}">
<input type="hidden" name="add_uid" id="add_uid" value="{$row.add_uid|default=''}">
<tip>填写扣减比例。</tip>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">指派用户</label>
<div class="layui-input-block">
<input type="text" id="assign_uname" class="layui-input" readonly lay-verify="required" lay-reqtext="请输入指派用户" placeholder="请输入指派用户" value="{$row.assign_uname|default=''}">
<input type="hidden" name="assign_uid" id="assign_uid" value="{$row.assign_uid|default=''}">
<tip>填写扣减比例。</tip>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">积分</label>
<div class="layui-input-block">
<input type="text" name="integral" class="layui-input" lay-verify="required" lay-reqtext="请输入积分" placeholder="请输入积分" value="{$row.integral|default=''}">
<tip>填写积分。</tip>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">任务描述</label>
<div class="layui-input-block">
<textarea name="content" lay-verify="required" lay-reqtext="请输入任务描述" placeholder="请输入任务描述" class="layui-textarea">{$row.content|default=''}</textarea>
<tip>填写任务描述。</tip>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">时长(h)</label>
<div class="layui-input-block">
<input type="text" name="duration" class="layui-input" lay-verify="required" lay-reqtext="请输入时长" placeholder="请输入时长" value="{$row.duration|default=''}">
<tip>填写时长。</tip>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">扣减比例(%)</label>
<div class="layui-input-block">
<input type="text" name="deduction_ratio" class="layui-input" lay-verify="required" lay-reqtext="请输入扣减比例" placeholder="请输入扣减比例" value="{$row.deduction_ratio|default=''}">
<tip>填写扣减比例。</tip>
</div>
</div>
<div class="hr-line"></div>
<div class="layui-form-item text-center">
<button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit>确认</button>
<button type="reset" class="layui-btn layui-btn-primary layui-btn-sm">重置</button>
</div>
</form>
</div>

11
app/admin/view/liveroom/task/index.html

@ -0,0 +1,11 @@
<div class="layuimini-container">
<div class="layuimini-main">
<table id="currentTable" class="layui-table layui-hide"
data-auth-add="{:auth('liveroom.task/add')}"
data-auth-edit="{:auth('liveroom.task/edit')}"
data-auth-delete="{:auth('liveroom.task/delete')}"
lay-filter="currentTable">
</table>
<input type="hidden" id="status_json" value="{$status_json}">
</div>
</div>

15
app/common.php

@ -184,4 +184,17 @@ function get_guid_v4(bool $trim = true): string
substr($charid, 16, 4) . $hyphen .
substr($charid, 20, 12) .
$rbrace;
}
}
if (!function_exists('array_del_key')) {
function array_del_key(&$data, array $del_key) {
foreach ($data as $key => $value) {
foreach ($value as $field => $v) {
if (!in_array($field, $del_key)) {
unset($data[$key][$field]);
}
}
}
}
}

113
public/static/admin/js/liveroom/task.js

@ -0,0 +1,113 @@
define(["jquery", "easy-admin", "tableSelect"], function ($, ea) {
let tableSelect = layui.tableSelect;
let init = {
table_elem: '#currentTable',
table_render_id: 'currentTableRenderId',
index_url: 'liveroom.task/index',
add_url: 'liveroom.task/add',
edit_url: 'liveroom.task/edit',
delete_url: 'liveroom.task/delete',
user_list_url: 'user.api/getUserPageList',
live_room_list_url: 'user.api/getLiveRoomPageList',
};
let TaskController = {
index: function () {
let status_json = $("#status_json").val();
let status_select = JSON.parse(status_json);
ea.table.render({
init: init,
toolbar: [
'refresh',
'add',
'delete'
],
cols: [[
{type: "checkbox"},
{field: 'id', width: 80, title: '编号'},
{field: 'uuid', minWidth: 80, title: '任务编号'},
{field: 'title', minWidth: 80, title: '任务名称'},
{field: 'live_room_id', width: 100, title: '直播间ID'},
{field: 'integral', width: 80, title: '积分'},
{field: 'deduction_ratio', width: 110, title: '扣减比例', templet: function (d) {
return d.deduction_ratio + '%';
}},
{field: 'duration', width: 80, title: '时长', templet: function (d) {
return d.duration + 'h';
}},
{field: 'add_uid', width: 110, title: '创建用户'},
{field: 'assign_uid', width: 110, title: '指派用户'},
{field: 'status', title: '状态', width: 100, search: 'select', selectList: status_select, templet: function (d) {
let html_arr = ['disabled', 'primary', '', 'normal', 'warm', 'danger'];
return '<button type="button" class="layui-btn layui-btn-'+html_arr[d.status]+' layui-btn-xs">' + d.status_str + '</button>';
}},
{field: 'create_time', minWidth: 80, title: '创建时间', search: 'range'},
{
width: 250,
title: '操作',
templet: ea.table.tool,
operat: [
'edit',
'delete'
]
}
]],
});
ea.listen();
},
add: function () {
getSelect();
ea.listen();
},
edit: function () {
getSelect();
ea.listen();
}
};
function getSelect() {
getLiveRoomSelect();
getUserSelect();
getUserSelect('assign_uname', 'assign_uid');
}
function getLiveRoomSelect() {
let cos = [{ type: 'radio' }, { field: 'id', title: 'ID' }, { field: 'room_id', title: '直播间编号' }]
getTableSelect('room_id', 'live_room_id', init.live_room_list_url, cos, 'id', 'room_id');
}
function getUserSelect(elemKey = 'add_uname', valueKey = 'add_uid') {
let cos = [{ type: 'radio' }, { field: 'uid', title: 'ID' }, { field: 'nick_name', title: '用户名' }]
getTableSelect(elemKey, valueKey, init.user_list_url, cos, 'uid', 'nick_name');
}
function getTableSelect(elemKey, valueKey, url, cols = [], checkedKey = 'id', dataKey = 'id') {
tableSelect.render({
elem: '#' + elemKey, //定义输入框input对象
checkedKey: checkedKey, //表格的唯一建值,非常重要,影响到选中状态 必填
searchKey: 'keyword', //搜索输入框的name值 默认keyword
searchPlaceholder: '关键词搜索', //搜索输入框的提示文字 默认关键词搜索
table: { //定义表格参数,与LAYUI的TABLE模块一致,只是无需再定义表格elem
url: ea.url(url),
cols: [cols]
},
done: function (elem, data) {
let elemArr = []
let valueArr = []
layui.each(data.data, function (index, item) {
valueArr.push(item[checkedKey])
elemArr.push(item[dataKey])
})
$("#"+valueKey).val(valueArr.join(','))
$("#"+elemKey).val(elemArr.join(','))
}
})
}
return TaskController;
});
Loading…
Cancel
Save