first commit
This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\crud\command;
|
||||
|
||||
use think\console\Command;
|
||||
use think\console\Input;
|
||||
use think\console\input\Option;
|
||||
use think\console\Output;
|
||||
|
||||
class Crud extends Command
|
||||
{
|
||||
protected function configure()
|
||||
{
|
||||
$this->setName('auto crud')
|
||||
->addOption('name', 'a', Option::VALUE_OPTIONAL, 'the name', null)
|
||||
->addOption('module', 'm', Option::VALUE_OPTIONAL, 'the module name', null)
|
||||
->addOption('table', 't', Option::VALUE_OPTIONAL, 'the table name', null)
|
||||
->addOption('controller', 'c', Option::VALUE_OPTIONAL, 'the controller name', null)
|
||||
->addOption('types', 'y', Option::VALUE_OPTIONAL, 'the types name', null)
|
||||
->setDescription('auto make crud file');
|
||||
}
|
||||
|
||||
protected function execute(Input $input, Output $output)
|
||||
{
|
||||
$name = $input->getOption('name');
|
||||
if (!$name) {
|
||||
$output->error("请输入 -na 名称");
|
||||
exit;
|
||||
}
|
||||
|
||||
$module = $input->getOption('module');
|
||||
if (!$module) {
|
||||
$output->error("请输入 -m 模块名");
|
||||
exit;
|
||||
}
|
||||
|
||||
$table = $input->getOption('table');
|
||||
if (!$table) {
|
||||
$output->error("请输入 -t 表名");
|
||||
exit;
|
||||
}
|
||||
|
||||
$controller = $input->getOption('controller');
|
||||
if (!$controller) {
|
||||
$output->error("请输入 -c 控制器名");
|
||||
exit;
|
||||
}
|
||||
|
||||
$types = $input->getOption('types');
|
||||
if (!$types) {
|
||||
$types = 1;
|
||||
}
|
||||
|
||||
$this->make($name,$module,$table,$controller,$types);
|
||||
|
||||
$output->info($name . "crud make success");
|
||||
}
|
||||
|
||||
public function make($name,$module,$model,$controller,$types)
|
||||
{
|
||||
!defined('DS') && define('DS', DIRECTORY_SEPARATOR);
|
||||
// 使用DS常量和rtrim确保路径格式正确
|
||||
$crud_dir = rtrim(CMS_ROOT, DS) . DS . 'crud' . DS;
|
||||
|
||||
// 统一使用DS常量拼接路径
|
||||
$dirs = ['view', 'controller', 'model', 'validate'];
|
||||
foreach($dirs as $dir) {
|
||||
$targetDir = $crud_dir . $dir;
|
||||
if (!is_dir($targetDir)) {
|
||||
mkdir($targetDir, 0755, true);
|
||||
}
|
||||
}
|
||||
|
||||
$Bmodel = ucfirst(camelize($model));
|
||||
$Bcontroller = ucfirst(camelize($controller));
|
||||
|
||||
// 修正路径定义,统一使用DS分隔符
|
||||
$crud = [
|
||||
['name'=>'add','path'=>'view' . DS . $controller,'filename'=>'add.html'],
|
||||
['name'=>'list','path'=>'view' . DS . $controller,'filename'=>'datalist.html'],
|
||||
['name'=>'view','path'=>'view' . DS . $controller,'filename'=>'view.html'],
|
||||
['name'=>'controller','path'=>'controller','filename'=>$Bcontroller.'.php'],
|
||||
['name'=>'model','path'=>'model','filename'=>$Bmodel.'.php'],
|
||||
['name'=>'validate','path'=>'validate','filename'=>$Bcontroller.'Validate.php'],
|
||||
];
|
||||
|
||||
foreach($crud as $k => $v){
|
||||
$tpl = dirname(__DIR__) . DS . 'tpl' . DS . $types . DS . $v['name'] . '.tpl';
|
||||
|
||||
$tplContent = file_get_contents($tpl);
|
||||
$tplContent = str_replace('<module>', $module, $tplContent);
|
||||
$tplContent = str_replace('<controller>', $controller, $tplContent);
|
||||
$tplContent = str_replace('<Bcontroller>', $Bcontroller, $tplContent);
|
||||
$tplContent = str_replace('<model>', $model, $tplContent);
|
||||
$tplContent = str_replace('<Bmodel>', $Bmodel, $tplContent);
|
||||
$tplContent = str_replace('<name>', $name, $tplContent);
|
||||
|
||||
$targetPath = $crud_dir . $v['path'];
|
||||
if (!is_dir($targetPath)) {
|
||||
mkdir($targetPath, 0755, true);
|
||||
}
|
||||
|
||||
// 修正文件保存路径
|
||||
$filePath = $targetPath . DS . $v['filename'];
|
||||
file_put_contents($filePath, $tplContent);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\crud\controller;
|
||||
|
||||
use app\api\BaseController;
|
||||
use think\facade\Console;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Crud extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view();
|
||||
}
|
||||
|
||||
//一键crud
|
||||
public function crud()
|
||||
{
|
||||
$uid = $this->uid;
|
||||
if($uid!=1){
|
||||
return to_assign(1,'只有系统超级管理员才有权限使用一键crud功能!');
|
||||
}
|
||||
$param = get_params();
|
||||
$a = '-a'.$param['name'];
|
||||
$m = '-m'.$param['module'];
|
||||
$t = '-t'.$param['table'];
|
||||
$c = '-c'.$param['controller'];
|
||||
$y = '-y'.$param['types'];
|
||||
try {
|
||||
$output = Console::call('crud', [$a,$m,$t,$c,$y]);
|
||||
//return $output->fetch();
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-2"><name></h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray"><name>名称<font>*</font></td>
|
||||
<td><input type="text" name="title" placeholder="请输入<name>名称" lay-verify="required" lay-reqText="请输入<name>名称" class="layui-input" value="{$detail.title|default=''}"></td>
|
||||
<td class="layui-td-gray">父级分类<font>*</font></td>
|
||||
<td>
|
||||
{empty name="$detail"}
|
||||
<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
|
||||
<option value="0">作为顶级分类</option>
|
||||
{volist name=":set_recursion(get_base_data('<model>'))" id="v"}
|
||||
<option value="{$v.id}">{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
{else/}
|
||||
<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
|
||||
<option value="0">作为顶级分类</option>
|
||||
{volist name=":set_recursion(get_base_data('<model>'))" id="v"}
|
||||
<option value="{$v.id}" {eq name="$detail.pid" value="$v.id" }selected="" {/eq}>{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
{/empty}
|
||||
</td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td><input type="text" name="sort" placeholder="请输入排序,数字" class="layui-input" value="{$detail.sort|default=''}"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray"><name>描述</td>
|
||||
<td colspan="5"><textarea name="desc" placeholder="请输入<name>描述,可空" class="layui-textarea">{$detail.desc|default=''}</textarea></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<input type="hidden" name="id" value="{$detail.id|default=0}"/>
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
var moduleInit = ['tool'];
|
||||
|
||||
function gouguInit() {
|
||||
var form = layui.form, tool = layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
setTimeout(function () {
|
||||
parent.location.reload();
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/<module>/<controller>/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,175 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\<module>\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\<module>\model\<Bmodel> as <Bmodel>Model;
|
||||
use app\<module>\validate\<Bcontroller>Validate;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class <Bcontroller> extends BaseController
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
protected $model;
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(); // 调用父类构造函数
|
||||
$this->model = new <Bmodel>Model();
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据列表
|
||||
*/
|
||||
public function datalist()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$list = $this->model->where('delete_time',0)->order('sort asc')->select();
|
||||
return to_assign(0, '', $list);
|
||||
}
|
||||
else{
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 子分类
|
||||
* $id
|
||||
* $is_self=1包含自己
|
||||
*/
|
||||
public function sonlist($id = 0, $is_self = 1)
|
||||
{
|
||||
$cates = $this->model->where('delete_time',0)->order('sort asc')->select()->toArray();
|
||||
$cates_list = get_data_node($cates, $id);
|
||||
$cates_array = array_column($cates_list, 'id');
|
||||
if ($is_self == 1) {
|
||||
//包括自己在内
|
||||
$cates_array[] = $id;
|
||||
}
|
||||
return $cates_array;
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加/编辑
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(<Bcontroller>Validate::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$cate_array = $this->sonlist($param['id']);
|
||||
if (in_array($param['pid'], $cate_array)) {
|
||||
return to_assign(1, '上级分类不能是该分类本身或其子分类');
|
||||
}
|
||||
$this->model->edit($param);
|
||||
} else {
|
||||
try {
|
||||
validate(<Bcontroller>Validate::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$this->model->add($param);
|
||||
}
|
||||
}else{
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$pid = isset($param['pid']) ? $param['pid'] : 0;
|
||||
if ($id>0) {
|
||||
$detail = $this->model->getById($id);
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
View::assign('pid', $pid);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查看
|
||||
*/
|
||||
public function view($id)
|
||||
{
|
||||
$detail = $this->model->getById($id);
|
||||
if (!empty($detail)) {
|
||||
View::assign('detail', $detail);
|
||||
return view();
|
||||
}
|
||||
else{
|
||||
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$type = isset($param['type']) ? $param['type'] : 0;
|
||||
$count_cate = $this->model->where(["pid"=>$id,"delete_time"=>0])->count();
|
||||
if ($count_cate > 0) {
|
||||
return to_assign(1, "该分类下还有子分类,无法删除");
|
||||
}
|
||||
$count_list = 0;
|
||||
if ($count_list > 0) {
|
||||
return to_assign(1, "该分类下还有内容,无法删除");
|
||||
}
|
||||
$this->model->delById($id,$type);
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置
|
||||
*/
|
||||
public function set()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
if($param['status'] == 0){
|
||||
$count_cate = $this->model->where(["pid"=>$param['id'],"delete_time"=>0])->count();
|
||||
if ($count_cate > 0) {
|
||||
return to_assign(1, "该分类下还有子分类,无法禁用");
|
||||
}
|
||||
$count_list = 0;
|
||||
if ($count_list > 0) {
|
||||
return to_assign(1, "该分类下还有内容,无法禁用");
|
||||
}
|
||||
$this->model->strict(false)->field('id,status')->update($param);
|
||||
add_log('disable', $param['id'], $param);
|
||||
}
|
||||
else if($param['status'] == 1){
|
||||
$res = $this->model->strict(false)->field('id,status')->update($param);
|
||||
add_log('recovery', $param['id'], $param);
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
|
||||
<div class="p-page">
|
||||
<div class="gg-form-bar border-t border-x" style="padding-bottom:12px">
|
||||
<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/<module>/<controller>/add">+ 添加<name></button>
|
||||
</div>
|
||||
<table class="layui-hide" id="table_<model>" lay-filter="table_<model>"></table>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var treeTable = layui.treeTable, tool = layui.tool;
|
||||
|
||||
layui.pageTable = treeTable.render({
|
||||
elem: "#table_<model>"
|
||||
,title: '<name>列表'
|
||||
,url: "/<module>/<controller>/datalist"
|
||||
,tree: {
|
||||
customName: {name:'title'},
|
||||
view: {showIcon:false},
|
||||
data: {},
|
||||
async: {},
|
||||
callback: {}
|
||||
}
|
||||
,done:function(){
|
||||
treeTable.expandAll('table_<model>', true); // 打开全部节点
|
||||
}
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field: 'sort', title: '排序',align:'center', width:80}
|
||||
,{field:'title', width:240, title: '分类名称'}
|
||||
,{field:'pid', title: '父级ID', width:80, align:'center'}
|
||||
,{field:'desc', title: '描述', }
|
||||
,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
|
||||
var html1='<span class="green">正常</span>';
|
||||
var html2='<span class="yellow">禁用</span>';
|
||||
if(d.status==1){
|
||||
return html1;
|
||||
}
|
||||
else{
|
||||
return html2;
|
||||
}
|
||||
}}
|
||||
,{width:192,title: '操作', align:'center',ignoreExport:true,templet: function(d){
|
||||
var html='';
|
||||
var btn='<button class="layui-btn layui-btn-xs" lay-event="add">添加子分类</button>';
|
||||
var btn1='<button class="layui-btn layui-bg-blue layui-btn-xs" lay-event="edit">编辑</button>';
|
||||
var btn2='<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="disable">禁用</a>';
|
||||
var btn3='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
|
||||
var btn4='<button class="layui-btn layui-bg-red layui-btn-xs" lay-event="del">删除</button>';
|
||||
if(d.status==1){
|
||||
html = '<div class="layui-btn-group">'+btn+btn1+btn2+btn4+'</div>';
|
||||
}
|
||||
else{
|
||||
html = '<div class="layui-btn-group">'+btn+btn1+btn3+btn4+'</div>';
|
||||
}
|
||||
return html;
|
||||
}
|
||||
}
|
||||
]]
|
||||
,page:false
|
||||
});
|
||||
|
||||
//操作按钮
|
||||
treeTable.on('tool(table_<model>)', function (obj) {
|
||||
if (obj.event === 'add') {
|
||||
tool.side("/<module>/<controller>/add?pid="+obj.data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'edit') {
|
||||
tool.side("/<module>/<controller>/add?id="+obj.data.id);
|
||||
return;
|
||||
}
|
||||
if(obj.event === 'disable'){
|
||||
layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
}
|
||||
tool.post("/<module>/<controller>/set", {id:obj.data.id,status: 0}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
if(obj.event === 'open'){
|
||||
layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
}
|
||||
tool.post("/<module>/<controller>/set", {id:obj.data.id,status:1}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定要删除吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
tool.delete("/<module>/<controller>/del", { id: obj.data.id }, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,115 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\<module>\model;
|
||||
use think\model;
|
||||
use think\facade\Db;
|
||||
class <Bmodel> extends Model
|
||||
{
|
||||
/**
|
||||
* 获取分页列表
|
||||
* @param $where
|
||||
* @param $param
|
||||
*/
|
||||
public function datalist($param=[],$where=[],$whereOr=[])
|
||||
{
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$order = empty($param['order']) ? 'id desc' : $param['order'];
|
||||
try {
|
||||
$list = self::where($where)
|
||||
->where(function ($query) use($whereOr) {
|
||||
if (!empty($whereOr)){
|
||||
$query->whereOr($whereOr);
|
||||
}
|
||||
})
|
||||
->order($order)->paginate(['list_rows'=> $rows]);
|
||||
return $list;
|
||||
} catch(\Exception $e) {
|
||||
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据
|
||||
* @param $param
|
||||
*/
|
||||
public function add($param)
|
||||
{
|
||||
$insertId = 0;
|
||||
try {
|
||||
$param['create_time'] = time();
|
||||
$insertId = self::strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $insertId, $param);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$insertId]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑信息
|
||||
* @param $param
|
||||
*/
|
||||
public function edit($param)
|
||||
{
|
||||
try {
|
||||
$param['update_time'] = time();
|
||||
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id获取信息
|
||||
* @param $id
|
||||
*/
|
||||
public function getById($id)
|
||||
{
|
||||
$info = self::find($id);
|
||||
return $info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除信息
|
||||
* @param $id
|
||||
* @param $type
|
||||
* @return array
|
||||
*/
|
||||
public function delById($id,$type=0)
|
||||
{
|
||||
if($type==0){
|
||||
//逻辑删除
|
||||
try {
|
||||
$param['delete_time'] = time();
|
||||
self::where('id', $id)->update(['delete_time'=>time()]);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
else{
|
||||
//物理删除
|
||||
try {
|
||||
self::destroy($id);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\<module>\validate;
|
||||
use think\Validate;
|
||||
use think\facade\Db;
|
||||
|
||||
class <Bcontroller>Validate extends Validate
|
||||
{
|
||||
// 自定义验证规则
|
||||
protected function checkOne($value,$rule,$data=[])
|
||||
{
|
||||
$id = isset($data['id'])?$data['id']:0;
|
||||
$count = Db::name('<Bmodel>')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
|
||||
return $count == 0 ? true : false;
|
||||
}
|
||||
|
||||
protected $rule = [
|
||||
'title' => 'require|checkOne',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '名称不能为空',
|
||||
'title.checkOne' => '同样的名称已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
'edit' => ['title', 'id'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<h3 class="pb-2"><name>详情</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray"><name>名称</td>
|
||||
<td>{$detail.title|default=''}"></td>
|
||||
<td class="layui-td-gray">父级分类</td>
|
||||
<td>
|
||||
{volist name=":set_recursion(get_<model>())" id="v"}
|
||||
{eq name="$detail.pid" value="$v.id" }{$v.title}{/eq}
|
||||
{/volist}
|
||||
</td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td>{$detail.sort|default=0}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray"><name>描述</td>
|
||||
<td colspan="5">{$detail.desc|default=''}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
@@ -0,0 +1,45 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-2"><name></h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray"><name>名称<font>*</font></td>
|
||||
<td><input type="text" class="layui-input" name="title" placeholder="请输入<name>名称" lay-verify="required" lay-reqText="请输入<name>名称" value="{$detail.title|default=''}"></td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td><input type="text" name="sort" placeholder="请输入排序,数字" class="layui-input" value="{$detail.sort|default=''}"></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<input type="hidden" name="id" value="{$detail.id|default=0}"/>
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
var moduleInit = ['tool'];
|
||||
|
||||
function gouguInit() {
|
||||
var form = layui.form, tool = layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/<module>/<controller>/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,141 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\<module>\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\<module>\model\<Bmodel> as <Bmodel>Model;
|
||||
use app\<module>\validate\<Bcontroller>Validate;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class <Bcontroller> extends BaseController
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
protected $model;
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(); // 调用父类构造函数
|
||||
$this->model = new <Bmodel>Model();
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据列表
|
||||
*/
|
||||
public function datalist()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$list = $this->model->where('delete_time',0)->order('sort asc')->select();
|
||||
return to_assign(0, '', $list);
|
||||
}
|
||||
else{
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加/编辑
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(<Bcontroller>Validate::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$this->model->edit($param);
|
||||
} else {
|
||||
try {
|
||||
validate(<Bcontroller>Validate::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$this->model->add($param);
|
||||
}
|
||||
}else{
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if ($id>0) {
|
||||
$detail = $this->model->getById($id);
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查看
|
||||
*/
|
||||
public function view($id)
|
||||
{
|
||||
$detail = $this->model->getById($id);
|
||||
if (!empty($detail)) {
|
||||
View::assign('detail', $detail);
|
||||
return view();
|
||||
}
|
||||
else{
|
||||
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$type = isset($param['type']) ? $param['type'] : 0;
|
||||
$this->model->delById($id,$type);
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置
|
||||
*/
|
||||
public function set()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$res = $this->model->strict(false)->field('id,status')->update($param);
|
||||
if ($res) {
|
||||
if($param['status'] == 0){
|
||||
add_log('disable', $param['id'], $param);
|
||||
}
|
||||
else if($param['status'] == 1){
|
||||
add_log('recovery', $param['id'], $param);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
else{
|
||||
return to_assign(0, '操作失败');
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
|
||||
<div class="p-page">
|
||||
<table class="layui-hide" id="table_<model>" lay-filter="table_<model>"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-group">
|
||||
<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加<name></button>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var table = layui.table, tool = layui.tool;
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: "#table_<model>"
|
||||
,title: '<name>列表'
|
||||
,toolbar: '#toolbarDemo'
|
||||
,url: "/<module>/<controller>/datalist"
|
||||
,page: false
|
||||
,limit: 999
|
||||
,cellMinWidth: 80
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field:'title',title: '类型名称'}
|
||||
,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
|
||||
var html1='<span class="green">正常</span>';
|
||||
var html2='<span class="yellow">禁用</span>';
|
||||
if(d.status==1){
|
||||
return html1;
|
||||
}
|
||||
else{
|
||||
return html2;
|
||||
}
|
||||
}}
|
||||
,{width:100,title: '操作', align:'center',ignoreExport:true,templet: function(d){
|
||||
var html='';
|
||||
var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
|
||||
var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
|
||||
var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
|
||||
if(d.status==1){
|
||||
html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
|
||||
}
|
||||
else{
|
||||
html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
|
||||
}
|
||||
return html;
|
||||
}}
|
||||
]]
|
||||
});
|
||||
|
||||
table.on('tool(table_<model>)',function (obj) {
|
||||
if(obj.event === 'edit'){
|
||||
add_cate(obj.data.id,obj.data.title);
|
||||
}
|
||||
if(obj.event === 'disable'){
|
||||
layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
}
|
||||
tool.post("/<module>/<controller>/set", {id:obj.data.id,status: 0}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
if(obj.event === 'open'){
|
||||
layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
}
|
||||
tool.post("/<module>/<controller>/set", {id:obj.data.id,status:1}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click','.add-new',function(){
|
||||
add_cate(0,'');
|
||||
});
|
||||
|
||||
function add_cate(id,val){
|
||||
var title = '新增类型';
|
||||
if(id>0){
|
||||
title = '编辑类型';
|
||||
}
|
||||
layer.prompt({
|
||||
title: title,
|
||||
value: val,
|
||||
yes: function(index, layero) {
|
||||
// 获取文本框输入的值
|
||||
var value = layero.find(".layui-layer-input").val();
|
||||
if (value) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
}
|
||||
tool.post("/<module>/<controller>/add", {id: id,title: value}, callback);
|
||||
layer.close(index);
|
||||
} else {
|
||||
layer.msg('请填写类型名称');
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,114 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\<module>\model;
|
||||
use think\model;
|
||||
use think\facade\Db;
|
||||
class <Bmodel> extends Model
|
||||
{
|
||||
/**
|
||||
* 获取分页列表
|
||||
* @param $where
|
||||
* @param $param
|
||||
*/
|
||||
public function datalist($param=[],$where=[],$whereOr=[])
|
||||
{
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$order = empty($param['order']) ? 'id desc' : $param['order'];
|
||||
try {
|
||||
$list = self::where($where)
|
||||
->where(function ($query) use($whereOr) {
|
||||
if (!empty($whereOr)){
|
||||
$query->whereOr($whereOr);
|
||||
}
|
||||
})->order($order)->paginate(['list_rows'=> $rows]);
|
||||
return $list;
|
||||
} catch(\Exception $e) {
|
||||
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据
|
||||
* @param $param
|
||||
*/
|
||||
public function add($param)
|
||||
{
|
||||
$insertId = 0;
|
||||
try {
|
||||
$param['create_time'] = time();
|
||||
$insertId = self::strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $insertId, $param);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$insertId]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑信息
|
||||
* @param $param
|
||||
*/
|
||||
public function edit($param)
|
||||
{
|
||||
try {
|
||||
$param['update_time'] = time();
|
||||
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id获取信息
|
||||
* @param $id
|
||||
*/
|
||||
public function getById($id)
|
||||
{
|
||||
$info = self::find($id);
|
||||
return $info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除信息
|
||||
* @param $id
|
||||
* @param $type
|
||||
* @return array
|
||||
*/
|
||||
public function delById($id,$type=0)
|
||||
{
|
||||
if($type==0){
|
||||
//逻辑删除
|
||||
try {
|
||||
$param['delete_time'] = time();
|
||||
self::where('id', $id)->update(['delete_time'=>time()]);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
else{
|
||||
//物理删除
|
||||
try {
|
||||
self::destroy($id);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\<module>\validate;
|
||||
use think\Validate;
|
||||
use think\facade\Db;
|
||||
|
||||
class <Bcontroller>Validate extends Validate
|
||||
{
|
||||
// 自定义验证规则
|
||||
protected function checkOne($value,$rule,$data=[])
|
||||
{
|
||||
$id = isset($data['id'])?$data['id']:0;
|
||||
$count = Db::name('<Bmodel>')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
|
||||
return $count == 0 ? true : false;
|
||||
}
|
||||
|
||||
protected $rule = [
|
||||
'title' => 'require|checkOne',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '名称不能为空',
|
||||
'title.checkOne' => '同样的名称已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
'edit' => ['title', 'id'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<h3 class="pb-2"><name>详情</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray"><name>名称</td>
|
||||
<td>{$detail.title|default=''}"></td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td>{$detail.sort|default=0}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
@@ -0,0 +1,49 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-2"><name></h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray"><name>名称<font>*</font></td>
|
||||
<td><input type="text" name="title" class="layui-input" placeholder="请输入<name>名称" lay-verify="required" lay-reqText="请输入<name>名称" value="{$detail.title|default=''}"></td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td><input type="text" name="sort" placeholder="请输入排序,数字" class="layui-input" value="{$detail.sort|default=''}"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray"><name>描述</td>
|
||||
<td colspan="3"><textarea name="desc" placeholder="请输入<name>描述,可空" class="layui-textarea">{$detail.desc|default=''}</textarea></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<input type="hidden" name="id" value="{$detail.id|default=0}"/>
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
var moduleInit = ['tool'];
|
||||
|
||||
function gouguInit() {
|
||||
var form = layui.form, tool = layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/<module>/<controller>/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,122 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\<module>\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\<module>\model\<Bmodel> as <Bmodel>Model;
|
||||
use app\<module>\validate\<Bcontroller>Validate;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class <Bcontroller> extends BaseController
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
protected $model;
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(); // 调用父类构造函数
|
||||
$this->model = new <Bmodel>Model();
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据列表
|
||||
*/
|
||||
public function datalist()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$where=[];
|
||||
$whereOr=[];
|
||||
$where[]=['delete_time','=',0];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$list = $this->model->datalist($param,$where,$whereOr);
|
||||
return table_assign(0, '', $list);
|
||||
}
|
||||
else{
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加/编辑
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(<Bcontroller>Validate::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$this->model->edit($param);
|
||||
} else {
|
||||
try {
|
||||
validate(<Bcontroller>Validate::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['admin_id'] = $this->uid;
|
||||
$this->model->add($param);
|
||||
}
|
||||
}else{
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if ($id>0) {
|
||||
$detail = $this->model->getById($id);
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查看
|
||||
*/
|
||||
public function view($id)
|
||||
{
|
||||
$detail = $this->model->getById($id);
|
||||
if (!empty($detail)) {
|
||||
View::assign('detail', $detail);
|
||||
return view();
|
||||
}
|
||||
else{
|
||||
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$this->model->delById($id);
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
|
||||
<div class="p-page">
|
||||
<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
|
||||
<div class="layui-input-inline" style="width:300px">
|
||||
<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:150px">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
|
||||
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
|
||||
</div>
|
||||
</form>
|
||||
<table class="layui-hide" id="table_<model>" lay-filter="table_<model>"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-group">
|
||||
<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/<module>/<controller>/add">+ 添加<name></button>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','tablePlus'];
|
||||
function gouguInit() {
|
||||
var table = layui.tablePlus, tool = layui.tool;
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: "#table_<model>"
|
||||
,title: '<name>列表'
|
||||
,toolbar: "#toolbarDemo"
|
||||
,url: "/<module>/<controller>/datalist"
|
||||
,page: true
|
||||
,limit: 20
|
||||
,cellMinWidth: 80
|
||||
,height: 'full-113'
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field:'title',title: '名称'}
|
||||
,{field:'admin_name',title: '创建人',width:90,align:'center'}
|
||||
,{field:'create_time', title: '创建时间',width:150,align:'center'}
|
||||
,{width:120,fixed:'right',title: '操作', align:'center',ignoreExport:true,templet: function(d){
|
||||
var html='';
|
||||
var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
|
||||
var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
|
||||
var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
|
||||
html = '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
|
||||
return html;
|
||||
}}
|
||||
]]
|
||||
});
|
||||
|
||||
table.on('tool(table_<model>)',function (obj) {
|
||||
var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
|
||||
var data = obj.data;
|
||||
if (obj.event === 'view') {
|
||||
tool.side("/<module>/<controller>/view?id="+data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'edit') {
|
||||
tool.side("/<module>/<controller>/add?id="+data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
tool.delete("/<module>/<controller>/del", { id: data.id }, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
return;
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,121 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\<module>\model;
|
||||
use think\model;
|
||||
use think\facade\Db;
|
||||
class <Bmodel> extends Model
|
||||
{
|
||||
/**
|
||||
* 获取分页列表
|
||||
* @param $where
|
||||
* @param $param
|
||||
*/
|
||||
public function datalist($param=[],$where=[],$whereOr=[])
|
||||
{
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$order = empty($param['order']) ? 'id desc' : $param['order'];
|
||||
try {
|
||||
$list = self::where($where)
|
||||
->where(function ($query) use($whereOr) {
|
||||
if (!empty($whereOr)){
|
||||
$query->whereOr($whereOr);
|
||||
}
|
||||
})
|
||||
->order($order)
|
||||
->paginate(['list_rows'=> $rows])
|
||||
->each(function ($item, $key){
|
||||
//$item['admin_name'] = Db::name('Admin')->where('id',$item['admin_id'])->value('name');
|
||||
//$item['create_time'] = to_date($item['create_time']);
|
||||
});
|
||||
return $list;
|
||||
} catch(\Exception $e) {
|
||||
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据
|
||||
* @param $param
|
||||
*/
|
||||
public function add($param)
|
||||
{
|
||||
$insertId = 0;
|
||||
try {
|
||||
$param['create_time'] = time();
|
||||
$insertId = self::strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $insertId, $param);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$insertId]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑信息
|
||||
* @param $param
|
||||
*/
|
||||
public function edit($param)
|
||||
{
|
||||
try {
|
||||
$param['update_time'] = time();
|
||||
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id获取信息
|
||||
* @param $id
|
||||
*/
|
||||
public function getById($id)
|
||||
{
|
||||
$info = self::find($id);
|
||||
//$info['file_array'] = Db::name('File')->where([['id','in',$info['file_ids']]])->select()->toArray();
|
||||
return $info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除信息
|
||||
* @param $id
|
||||
* @param $type
|
||||
* @return array
|
||||
*/
|
||||
public function delById($id,$type=0)
|
||||
{
|
||||
if($type==0){
|
||||
//逻辑删除
|
||||
try {
|
||||
$param['delete_time'] = time();
|
||||
self::where('id', $id)->update(['delete_time'=>time()]);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
else{
|
||||
//物理删除
|
||||
try {
|
||||
self::destroy($id);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\<module>\validate;
|
||||
use think\Validate;
|
||||
use think\facade\Db;
|
||||
|
||||
class <Bcontroller>Validate extends Validate
|
||||
{
|
||||
// 自定义验证规则
|
||||
protected function checkOne($value,$rule,$data=[])
|
||||
{
|
||||
$id = isset($data['id'])?$data['id']:0;
|
||||
$count = Db::name('<Bmodel>')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
|
||||
return $count == 0 ? true : false;
|
||||
}
|
||||
|
||||
protected $rule = [
|
||||
'title' => 'require|checkOne',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '名称不能为空',
|
||||
'title.checkOne' => '同样的名称已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
'edit' => ['title', 'id'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<h3 class="pb-2"><name>详情</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray"><name>名称</td>
|
||||
<td>{$detail.title|default=''}</td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td>{$detail.sort|default=0}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray"><name>描述</td>
|
||||
<td colspan="3">{$detail.desc|default=''}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
var moduleInit = ['tool'];
|
||||
|
||||
function gouguInit() {
|
||||
var tool = layui.tool;
|
||||
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,66 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-3">一键CRUD信息</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray" style="background-color:#FEF7ED">使用说明</td>
|
||||
<td colspan="5" style="background-color:#FEF7ED">勾股OA系统自带的一键CRUD功能没教程,这个功能是我们内部为了提高日常开发效率开发的简单工具,本来不打算放出来的,但是想想也没啥秘密,就干脆不屏蔽了的。
|
||||
<br>有开发能力的人就用起来,没开发能力的当着该功能不存在就行,不影响系统的使用的。如果需要教学的,请加微信号【hdm588】付费咨询或教学。</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">中文名称</td>
|
||||
<td><input type="text" name="name" lay-verify="required" autocomplete="off" placeholder="请输入中文名称" lay-reqText="请输入中文名称"class="layui-input" value=""></td>
|
||||
<td class="layui-td-gray">模板类型</td>
|
||||
<td colspan="3">
|
||||
<input type="radio" name="types" value="1" title="常规分类" checked>
|
||||
<input type="radio" name="types" value="2" title="简单分类" >
|
||||
<input type="radio" name="types" value="3" title="常规模块" >
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">模块名称</td>
|
||||
<td><input type="text" name="module" lay-verify="required" autocomplete="off" placeholder="请输入模块名称,小写" lay-reqText="请输入模块名称"class="layui-input" value=""></td>
|
||||
<td class="layui-td-gray-2">控制器名称</td>
|
||||
<td><input type="text" name="controller" lay-verify="required" autocomplete="off" placeholder="请输入控制器名称,小写" lay-reqText="请输入控制器名称"class="layui-input" value=""></td>
|
||||
<td class="layui-td-gray-2">数据表名称</td>
|
||||
<td><input type="text" name="table" lay-verify="required" autocomplete="off" placeholder="请输入数据表名称,小写,可_隔开" lay-reqText="请输入数据表名称"class="layui-input" value=""></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">一键CRUD生成代码</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool;
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
console.log(e);
|
||||
if (e == '') {
|
||||
layer.msg('crud生成成功');
|
||||
}
|
||||
else{
|
||||
if(e.code==1){
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
else{
|
||||
layer.msg('代码已生成,如需重新生成,请删除后再重试');
|
||||
}
|
||||
}
|
||||
}
|
||||
tool.post("/crud/crud/crud", data.field, callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
{/block}
|
||||
Reference in New Issue
Block a user