Commit f7bce4d9 authored by wangtao's avatar wangtao

增加后台文章管理

parent 8e245f63
......@@ -10,13 +10,13 @@
namespace app\admin\controller;
use app\model\system\SystemDict as Dict;
use app\model\system\SystemMenus as Menus;
use app\model\system\SystemCategory as Category;
use app\model\ArticleCategoryModel;
use think\App;
use think\facade\Db;
use app\model\ArticleModel;
use tool\Tree;
use app\admin\validate\ArticleValidate;
/**
* 后台主控制器
*/
......@@ -34,49 +34,89 @@ class Article extends AdminBase
}
//文章列表
public function index(string $do='')
public function index(string $do = '')
{
$limit = 10;
if ($do == 'json') {
$post = input();
$post['page'] = isset($post['page']) ? $post['page'] : 1;
$post['limit'] = isset($post['limit']) ? $post['limit'] : $limit;
$map[] = ['is_del', '=', 0];
$list = $this->article->where($map)->page($post['page'], $post['limit'])->select()->append(['cate_name','adminname'])->toArray();
if (isset($post['kw']) && !empty($post['kw'])) {
$map[] = ['title', 'like', '%' . $post['kw'] . '%'];
}
if (isset($post['cate_id']) && !empty($post['cate_id'])) {
$map[] = ['cate_id', '=', $post['cate_id']];
}
$list = $this->article->where($map)->append(['cate_name', 'adminname'])->paginate($post['limit']);
return $this->returnMsg('',0,$list);
return $this->returnMsg($list);
}
$category = Db::name('article_category')->field('*,pid as parentid')->order('sort desc')->select()->toArray();
$category = ArticleCategoryModel::field('*,pid as parentid')->order('sort desc')->select()->toArray();
$this->assign('category', json_encode($category));
$this->assign('limit', $limit);
return $this->fetch('', '', false);
}
//快速编辑
public function editup()
{
$post = input();
$this->article->update([$post['af'] => $post['av']], [['id', '=', $post['id']]]);
return $this->returnMsg('修改成功');
}
//编辑新增文章
public function edit()
{
$post = input();
if ($this->request->isPost()) {
if($this->request->isPost()){
$check = (new ArticleValidate())->goCheck();
if ($check !== true) {
return $check;
}
$post = input();
print_r($post);exit;
try {
$post['admin_id'] = session(VT_MANAGER)['userid'];
$post['createtime'] = time();
$post['updatetime'] = time();
if ($post['id'] > 0) {
$msg = '更新成功';
$this->article->update($post, ['id' => $post['id']]);
} else {
unset($post['id']);
$msg = '添加成功';
$this->article->save($post);
}
$category = Db::name('article_category')->order('sort desc')->select()->toArray();
$tree = new Tree();
$tree->icon = ['  │ ', '  ├─ ', '  └─ '];
$tree->nbsp = '  ';
$str = "<option value=@id @selected @disabled>@spacer @title</option>";
$tree->init($category);
$categorydata = $tree->getTree(0, $str, 0);
} catch (\Exception $e) {
return $this->returnMsg($e->getMessage(), 0);
}
return $this->returnMsg($msg, 1);
}
$data = $this->article->find($post['id']);
$catemodel = new ArticleCategoryModel();
$categorydata = $catemodel->catetree(isset($data['cate_id']) ? $data['cate_id'] : 0);
$this->assign('categorydata', $categorydata);
$this->assign('data', $data);
return $this->fetch('', '', false);
}
public function maind()
public function del()
{
return $this->fetch('', '', false);
$post = input();
$ids = is_array($post['id']) ? implode(',', $post['id']) : $post['id'];
if ($this->article->where("id IN(" . $ids . ")")->update(['is_del' => 1])) {
return $this->returnMsg("删除成功", 1);
} else {
return $this->returnMsg("删除失败");
}
}
......
<?php
/**
* ===========================================================================
* Veitool 快捷开发框架系统
* Author: Niaho 26843818@qq.com
* Copyright (c)2019-2025 www.veitool.com All rights reserved.
* Licensed: 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
* ---------------------------------------------------------------------------
*/
namespace app\admin\controller;
use app\model\ArticleCategoryModel;
use think\App;
use think\facade\Db;
use think\facade\Validate;
/**
* 后台主控制器
*/
class ArticleCategory extends AdminBase
{
protected $articlecategory;
public function __construct(App $app)
{
parent::__construct($app);
$this->articlecategory = new ArticleCategoryModel();
}
//分类列表
public function index(string $do = '')
{
if ($do == 'json') {
$list = $this->articlecategory->list();
return $this->returnMsg('', 0, $list);
}
return $this->fetch('', '', false);
}
//快速编辑
public function editup()
{
$post = input();
$this->articlecategory->update([$post['af'] => $post['av']], [['id', '=', $post['id']]]);
return $this->returnMsg('修改成功');
}
//编辑新增分类
public function edit()
{
$post = input();
if ($this->request->isPost()) {
$validate = Validate::rule([
'title' => 'require'
])->message([
'title.require' => '分类名称不能为空',
]);
if(!$validate->check($post)) {
return $this->returnMsg($validate->getError(), 0);
}
try {
$post['createtime'] = time();
if ($post['id'] > 0) {
$msg = '更新成功';
$this->articlecategory->update($post, ['id' => $post['id']]);
} else {
unset($post['id']);
$msg = '添加成功';
$this->articlecategory->save($post);
}
} catch (\Exception $e) {
return $this->returnMsg($e->getMessage(), 0);
}
return $this->returnMsg($msg, 1);
}
$data = Db::name('article_category')->where('id',$post['id'])->find();
$categorydata = $this->articlecategory->catetree(isset($data['pid']) ? $data['pid'] : 0);
$this->assign('categorydata', $categorydata);
$this->assign('data', $data);
return $this->fetch('', '', false);
}
public function del()
{
$post = input();
$ids = is_array($post['id']) ? implode(',', $post['id']) : $post['id'];
if ($this->articlecategory->where("id IN(" . $ids . ")")->update(['is_del' => 1])) {
return $this->returnMsg("删除成功", 1);
} else {
return $this->returnMsg("删除失败");
}
}
}
\ No newline at end of file
<?php
namespace app\admin\validate;
use think\Validate;
use app\api\validate\BaseValidate;
class ArticleValidate extends BaseValidate
{
protected $rule = [
'title' => 'require',
'cate_id' => 'require',
'thumb'=>'require',
];
protected $message = [
'title.require' => '文章标题不能为空',
'cate_id.require' => '请选择分类',
'thumb.require' => '请上传图片',
];
}
\ No newline at end of file
{extend name="base/header" /}
{block name="body"}
<div style="margin: 0px 10px">
<form class="layui-form " style="margin-top: 20px;">
<form class="layui-form " style="margin-top: 20px;" id="fjfrom">
<div class="layui-form-item">
<label class="layui-form-label"> 选择分类 </label>
<div class="layui-input-block">
<select name="cate_id">
<option value="0">请选择分类</option>
<option value="">请选择分类</option>
{:$categorydata}
</select>
</div>
......@@ -16,7 +16,7 @@
<div class="layui-form-item">
<label class="layui-form-label">文章标题</label>
<div class="layui-input-block">
<input type="text" name="title" placeholder="请输入标题" autocomplete="off" class="layui-input">
<input type="text" name="title" placeholder="请输入标题" autocomplete="off" class="layui-input" value="{$data.title|default=''}">
</div>
</div>
......@@ -24,7 +24,7 @@
<label class="layui-form-label">文章简介</label>
<div class="layui-input-block">
<textarea placeholder="请输入文章简介" name="description" class="layui-textarea"></textarea>
<textarea placeholder="请输入文章简介" name="description" class="layui-textarea">{$data.description|default=''}</textarea>
</div>
</div>
......@@ -40,7 +40,7 @@
<label class="layui-form-label">阅读量</label>
<div class="layui-input-block">
<input type="text" name="click" placeholder="请输入阅读量" autocomplete="off" class="layui-input"
value="0">
value="{$data.click|default=''}">
</div>
</div>
......@@ -49,21 +49,23 @@
</div>
<input type="hidden" name="id" value="{$data.id|default=0}">
</form>
</div>
{/block}
{block name="script"}
<script type="text/javascript">
layui.use(['buildItems', 'form', 'laydate', 'util'], function () {
var form = layui.form;
/*解析顶部分组选项*/
var str = [{
"name": "thumb",
"title": "上传图片",
"value": "",
"value": "{$data.thumb|default=''}",
"type": "imagewt"
}];
layui.buildItems.build({
fjbid:'fjfrom',
bid: 'thumbup',
url: '',
map: layui.cache.maps + 'system.upload/',
......@@ -74,11 +76,12 @@
var str = [{
"name": "content",
"title": "文章内容",
"value": "",
"value": "{$data.content|default=''}",
"type": "ueditor",
"style": "height:500px",
}];
layui.buildItems.build({
fjbid:'fjfrom',
bid: 'contentup',
url: '',
map: layui.cache.maps + 'system.upload/',
......@@ -86,7 +89,7 @@
data: str
});
var form = layui.form;
layui.buildItems.init();
form.render();
......@@ -94,7 +97,6 @@
var callbackdata = function () {
var data = $(".layui-form").serialize();
return data;
};
......
This diff is collapsed.
{extend name="base/header" /}
{block name="body"}
<div style="margin: 0px 10px">
<form class="layui-form " style="margin-top: 20px;" id="fjfrom">
<div class="layui-form-item">
<label class="layui-form-label"> 上级分类 </label>
<div class="layui-input-block">
<select name="pid">
<option value="">请选择分类</option>
{:$categorydata}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分类名称</label>
<div class="layui-input-block">
<input type="text" name="title" placeholder="请输入分类名称" autocomplete="off" class="layui-input" value="{$data.title|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"> 类型 </label>
<div class="layui-input-block">
<select name="type">
<option value="" >请选择类型</option>
<option value="list" {eq name="data.type|default=''" value="list"}selected{/eq}>列表</option>
<option value="page" {eq name="data.type|default=''" value="page"}selected{/eq}>单页</option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分类图片</label>
<div class="layui-input-block" id="thumbup">
</div>
</div>
<input type="hidden" name="id" value="{$data.id|default=0}">
</form>
</div>
{/block}
{block name="script"}
<script type="text/javascript">
layui.use(['buildItems', 'form', 'laydate', 'util'], function () {
var form = layui.form;
/*解析顶部分组选项*/
var str = [{
"name": "thumb",
"title": "上传图片",
"value": "{$data.thumb|default=''}",
"type": "imagewt"
}];
layui.buildItems.build({
fjbid:'fjfrom',
bid: 'thumbup',
url: '',
map: layui.cache.maps + 'system.upload/',
gid: 1,
data: str
});
layui.buildItems.init();
form.render();
});
var callbackdata = function () {
var data = $(".layui-form").serialize();
return data;
};
</script>
{/block}
\ No newline at end of file
<div class="layui-fluid">
<style>
.files_itemw{width:30px;height:30px;line-height:30px;cursor:pointer;padding:1px;background:#fff;display:-webkit-box;-moz-box-align:center;-webkit-box-align:center;-moz-box-pack:center;-webkit-box-pack:center;}
.files_itemw img{max-width:28px;max-height:28px;border:0}
</style>
<div class="layui-card">
<div class="layui-card-header">
<form class="layui-form render">
<input type="hidden" name="groupid" id="articlecategory-groupid" value=""/>
<div class="layui-form-item">
<div class="layui-inline">
<div class="layui-btn-group">
<a class="layui-btn" id="articlecategory-add" ><i class="layui-icon layui-icon-add-circle"></i> 添加</a>
</div>
</div>
</div>
</form>
</div>
<div class="layui-card-body">
<div class="layui-card-body">
<table lay-filter="articlecategory" id="articlecategory"></table>
</div>
</div>
</div>
</div>
<!--JS部分-->
<script>
layui.use(['vinfo', 'buildItems'], function(){
var map_root = layui.cache.maps;
var app_root = map_root + 'article_category/';
var layer = layui.layer,table=layui.table,form=layui.form,admin=layui.admin;
/*渲染数据*/
table.render({
elem: '#articlecategory',
url: app_root+"index?&do=json",
cols: [[
{field:'id',width:50,unresize:true,align:'center',title:'ID'},
{field:'thumb',width:80,height:80,align:'center',title:'缩略图',templet:'<div class="files_itemw"><img src="{{d.thumb}}" lay-event="article-event-image" /></div>'},
{field:'title',align:'left',title:'分类',},
{field:'typetxt',width:100,align:'center',title:'类型'},
{field:'sort',width:100,align:'center',title:'排序',edit:'text'},
{fixed:'right',width:130,align:'center',toolbar:'<div><a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">删除</a></div>',title:'操作'}
]],
done: function(){ admin.vShow($('[lay-table-id="articlecategory"]')); }
});
/*快编监听*/
table.on('edit(articlecategory)',function(obj){
admin.req(app_root+"editup",{id:obj.data.id,av:obj.value,af:obj.field},function(res){
layer.msg(res.msg,{shade:[0.4,'#000'],time:500});
},'post',{headersToken:true});
});/**/
/*工具条监听*/
table.on('tool(articlecategory)', function(obj){
var data = obj.data;
var id = data.id;
if(obj.event === 'edit'){
articlecategoryOpen(data.id);
}else if(obj.event === 'del'){
del(id);
}else if(obj.event === 'article-event-image'){
var src = $(this).attr('src'), alt = $(this).attr('alt');
layer.photos({photos:{data:[{alt:alt,src:src}],start:'0'},anim:5,shade:[0.4,'#000']});
}
});/**/
/*删除*/
function del(ids){
layer.confirm('确定要删除所选文章吗?', function(){
admin.req(app_root+"del",{id:ids},function(res){
layer.msg(res.msg,{shade:[0.4,'#000'],time:1500},function(){
if(res.code==1) table.reloadData('articlecategory');
});
},'post',{headersToken:true});
});
}/**/
/*顶部删除按钮*/
$('#articlecategory-del').on('click', function(){
var checkRows = table.checkStatus('articlecategory').data;
if(checkRows.length === 0){return layer.msg('请选择需删除的文章');}
var ids = checkRows.map(function(d){return d.id;});
console.log(ids);
del(ids);
});/**/
$('#articlecategory-add').on('click',function(){articlecategoryOpen();});/**/
/*弹出窗*/
function articlecategoryOpen(id=''){
if(id > 0){
var title = '编辑分类';
}else{
var title = '添加分类';
}
layer.open({
type: 2,
area: ['900px', '900px'],
title: title,
btn: ['确定', '关闭'],
fixed: false, //不固定
content: app_root+'edit?id='+id,
yes: function(index, layero){
var data = window["layui-layer-iframe" + index].callbackdata();
$.ajax({
method: "post",
url: app_root+'/edit',
data: data,
dataType: "json",
success: function (res){
if(res.code===1) {
layer.msg(res.msg,{icon:1,shade:[0.4,'#000'],time:1500},function (){
layer.close(index);
table.reloadData('articlecategory');
});
}else{
layer.msg(res.msg,{icon:2,shade:[0.4,'#000'],time:1500},function (){
});
}
// layer.closeAll();
}
});
},
});
}/**/
});
</script>
\ No newline at end of file
......@@ -43,7 +43,9 @@
cascader: "cascader/cascader", //无限级联 地区
orgCharts: 'orgCharts/orgCharts', //组织结构图
zTree: 'zTree/zTree' //树形结构
})
}).use(["index", "admin"], function(){
});
</script>
{block name="script"}{/block}
......
<tpl>
<form class="layui-form " action="admin/Index/main">
<form class="layui-form " action="admin/Index/main" id="fjfrom">
<div class="layui-form-item">
<label class="layui-form-label">输入框</label>
<div class="layui-input-block">
......@@ -106,7 +106,7 @@
}];
layui.buildItems.build({
bid: 'imgboxheadimg',
url: '',
fjbid:'fjfrom',
map: layui.cache.maps + 'system.upload/',
gid: 1,
data:str
......@@ -120,40 +120,41 @@
}];
layui.buildItems.build({
bid: 'imgboxheadimg2',
url: '',
map: layui.cache.maps + 'system.upload/',
gid: 1,
data:str
});
var str = [{
"name": "{$data3.name}",
"title": "多图图片",
"value": "{$data3.value}",
"type": "{$data3.type}"
}];
layui.buildItems.build({
bid: 'imgboxheadimg3',
url: '',
map: layui.cache.maps + 'system.upload/',
gid: 1,
data:str
});
var str = [{
"name": "{$data4.name}",
"title": "文件上传",
"value": "{$data4.value}",
"type": "{$data4.type}"
}];
layui.buildItems.build({
bid: 'imgboxheadimg4',
url: '',
fjbid:'fjfrom',
map: layui.cache.maps + 'system.upload/',
gid: 1,
data:str
});
layui.buildItems.init();
//
// var str = [{
// "name": "{$data3.name}",
// "title": "多图图片",
// "value": "{$data3.value}",
// "type": "{$data3.type}"
// }];
// layui.buildItems.build({
// bid: 'imgboxheadimg3',
// url: '',
// map: layui.cache.maps + 'system.upload/',
// gid: 1,
// data:str
// });
//
//
// var str = [{
// "name": "{$data4.name}",
// "title": "文件上传",
// "value": "{$data4.value}",
// "type": "{$data4.type}"
// }];
// layui.buildItems.build({
// bid: 'imgboxheadimg4',
// url: '',
// map: layui.cache.maps + 'system.upload/',
// gid: 1,
// data:str
// });
form=layui.form;
form.render();
......
......@@ -9,7 +9,7 @@
*/
// 版本信息
define('VT_VERSION', '2.2.7');
define('VT_VERSION', '2.2.4');
// 后台管理员 session 标识
define('VT_MANAGER', 'V_MANAGER');
// 前台会员 session 标识
......
<?php
/**
* ===========================================================================
* Veitool 快捷开发框架系统
* Author: Niaho 26843818@qq.com
* Copyright (c)2019-2025 www.veitool.com All rights reserved.
* Licensed: 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
* ---------------------------------------------------------------------------
*/
namespace app\model;
use think\facade\Db;
use think\Model;
use tool\Tree;
/**
* 模型公用类
*/
class ArticleCategoryModel extends Model
{
protected $name = 'article_category';
public function catetree($cate_id = 0)
{
$map[] = ['is_del', '=', 0];
$category = $this->where($map)->order('sort desc')->select()->toArray();
$tree = new Tree();
$tree->icon = ['&nbsp;&nbsp;│ ', '&nbsp;&nbsp;├─ ', '&nbsp;&nbsp;└─ '];
$tree->nbsp = '&nbsp;&nbsp;';
$str = "<option value=@id @selected @disabled>@spacer @title</option>";
$tree->init($category);
$categorydata = $tree->getTree(0, $str, $cate_id);
return $categorydata;
}
public function list(){
$map[] = ['is_del', '=', 0];
$category = $this->order('sort desc')->where($map)->select()->append(['typetxt'])->toArray();
$tree = new Tree();
$tree->icon = ['&nbsp;&nbsp;│ ', '&nbsp;&nbsp;├─ ', '&nbsp;&nbsp;└─ '];
$tree->nbsp = '&nbsp;&nbsp;';
$tree->init($category);
$categorydata = $tree->getTreeList($tree->getTreeArray(0),'title');
return $categorydata;
}
public function getTypetxtAttr($value,$data)
{
return $data['type'] == 'page' ? '单页' : '文章';
}
}
\ No newline at end of file
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment