Commit 8e245f63 authored by wangtao's avatar wangtao

增加后台文章管理

parent 69bc4795
<?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\system\SystemDict as Dict;
use app\model\system\SystemMenus as Menus;
use app\model\system\SystemCategory as Category;
use think\App;
use think\facade\Db;
use app\model\ArticleModel;
use tool\Tree;
/**
* 后台主控制器
*/
class Article extends AdminBase
{
protected $article;
public function __construct(App $app)
{
parent::__construct($app);
$this->article = new ArticleModel();
}
//文章列表
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();
return $this->returnMsg('',0,$list);
}
$category = Db::name('article_category')->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 edit()
{
if($this->request->isPost()){
$post = input();
print_r($post);exit;
}
$category = Db::name('article_category')->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, 0);
$this->assign('categorydata', $categorydata);
return $this->fetch('', '', false);
}
public function maind()
{
return $this->fetch('', '', false);
}
}
\ No newline at end of file
......@@ -27,7 +27,6 @@ class Index extends AdminBase
public function index()
{
ECHO 11;
$this->assign([
"appMap" => $this->appMap,
"tokenName" => $this->tokenName
......
......@@ -42,6 +42,7 @@ class Manager extends AdminBase
return $this->redirect($this->appMap);
}
$organ = Organ::order(['listorder'=>'asc'])->column('*');
if($do){
if($do=='json'){ //异步管理员列表数据
$where = [[],[['username', '=', $this->manUser['username']]]];
......
{extend name="base/header" /}
{block name="body"}
<div style="margin: 0px 10px">
<form class="layui-form " style="margin-top: 20px;">
<div class="layui-form-item">
<label class="layui-form-label"> 选择分类 </label>
<div class="layui-input-block">
<select name="cate_id">
<option value="0">请选择分类</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">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">文章简介</label>
<div class="layui-input-block">
<textarea placeholder="请输入文章简介" name="description" class="layui-textarea"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">文章图片</label>
<div class="layui-input-block" id="thumbup">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">阅读量</label>
<div class="layui-input-block">
<input type="text" name="click" placeholder="请输入阅读量" autocomplete="off" class="layui-input"
value="0">
</div>
</div>
<div id="contentup">
</div>
</form>
</div>
{/block}
{block name="script"}
<script type="text/javascript">
layui.use(['buildItems', 'form', 'laydate', 'util'], function () {
/*解析顶部分组选项*/
var str = [{
"name": "thumb",
"title": "上传图片",
"value": "",
"type": "imagewt"
}];
layui.buildItems.build({
bid: 'thumbup',
url: '',
map: layui.cache.maps + 'system.upload/',
gid: 1,
data: str
});
var str = [{
"name": "content",
"title": "文章内容",
"value": "",
"type": "ueditor",
"style": "height:500px",
}];
layui.buildItems.build({
bid: 'contentup',
url: '',
map: layui.cache.maps + 'system.upload/',
gid: 1,
data: str
});
var form = layui.form;
form.render();
});
var callbackdata = function () {
var data = $(".layui-form").serialize();
return data;
};
</script>
{/block}
\ No newline at end of file
<style>
#organizationTreeBar{padding:10px 15px;border:1px solid #e6e6e6;background-color:#f2f2f2}
#organizationTree{border:1px solid #e6e6e6;border-top:none;padding:10px 5px;overflow:auto;height:-webkit-calc(100vh - 260px);height:-moz-calc(100vh - 260px);height:calc(100vh - 260px)}
.layui-tree-entry .layui-tree-txt{padding:0 5px;border:1px transparent solid;text-decoration:none!important}
.layui-tree-entry.organ-tree-click .layui-tree-txt{background-color:#fff3e0;border:1px #ffe6b0 solid}
.files_item{width:30px;height:30px;line-height:30px;cursor:pointer;padding:1px;border:1px solid #ddd;background:#fff;display:-webkit-box;-moz-box-align:center;-webkit-box-align:center;-moz-box-pack:center;-webkit-box-pack:center;}
.files_item img{max-width:28px;max-height:28px;border:0}
</style>
<div class="layui-fluid">
<div class="layui-row layui-col-space15">
<div class="layui-col-md2">
<div class="layui-card">
<div class="layui-card-body" style="padding:10px;">
<!-- 树工具栏 -->
<!-- 左树 -->
<div id="organizationTree"></div>
</div>
</div>
</div>
<div class="layui-col-md10">
<div class="layui-card">
<div class="layui-card-header">
<form class="layui-form render">
<input type="hidden" name="groupid" id="manager-groupid" value=""/>
<div class="layui-form-item">
<div class="layui-inline" style="width:72px;">
<select name="fields">
<option value="">属性</option>
<option value="0">帐号</option>
<option value="1">姓名</option>
<option value="2">电话</option>
<option value="3">IP</option>
</select>
</div>
<div class="layui-inline" style="width:150px;"><input type="text" name="kw" placeholder="关键词" autocomplete="off" class="layui-input" lay-affix="clear"/></div>
<div class="layui-inline" style="width:200px;"><input type="text" name="sotime" date-render placeholder="登录时间" class="layui-input" lay-affix="clear"/></div>
<div class="layui-inline" style="width:110px;"><select name="roleid" id="search_roles_select"></select></div>
<div class="layui-inline">
<div class="layui-btn-group">
<button class="layui-btn" lay-submit lay-filter="search-manager"><i class="layui-icon layui-icon-search"></i> 搜索</button>
<a class="layui-btn" lay-submit lay-filter="search-manager-all" onclick="$('#manager-groupid').val('')"><i class="layui-icon layui-icon-light"></i>全部</a>
</div>
</div>
</div>
</form>
</div>
<div class="layui-card-body">
<div class="layui-card-box">
<div class="layui-btn-group">
<a class="layui-btn" id="manager-add" v-show="@system.manager/add"><i class="layui-icon layui-icon-add-circle"></i> 添加</a>
<a class="layui-btn" id="manager-del" v-show="@system.manager/del"><i class="layui-icon layui-icon-delete"></i> 删除</a>
</div>
</div>
<div class="layui-card-body">
<table lay-filter="manager" id="manager"></table>
</div>
</div>
</div>
</div>
</div>
</div>
<!--JS部分-->
<script>
layui.use(['vinfo', 'buildItems'], function(){
var map_root = layui.cache.maps;
var app_root = map_root + 'article/';
var layer = layui.layer,table=layui.table,form=layui.form,admin=layui.admin;
organData = admin.util.toTree({$category|raw});
doTree(organData,'');
function doTree(data,load){
layui.tree.render({
id: 'organTree',
elem: '#organizationTree',
data: data,
onlyIconControl: true,
click: function(obj){
$('#organizationTree').find('.organ-tree-click').removeClass('organ-tree-click');
$(obj.elem).children('.layui-tree-entry').addClass('organ-tree-click');
organObj = obj.data;
$('#manager-groupid').val(obj.data.id);
table.reloadData('manager',{where:{groupid:obj.data.id},page:{curr:1}});
}
});
var item = $('#organizationTree .layui-tree-entry:first');
load ? item.find('.layui-tree-main>.layui-tree-txt').trigger('click') : item.addClass('organ-tree-click');
}
/*初始渲染*/
/*==============左树结构END==============*/
/*渲染数据*/
table.render({
elem: '#manager',
page: true,
limit:{$limit},
url: app_root+"index?&do=json",
cols: [[
{type:'checkbox',fixed:'left'},
{field:'id',width:50,unresize:true,align:'center',title:'ID',sort:!0},
{field:'thumb',width:80,height:80,align:'center',title:'缩略图',templet:'<div class="files_item"><img src="{{d.thumb}}" lay-event="article-event-image" /></div>'},
{field:'title',align:'center',title:'标题',edit:'text'},
{field:'cate_name',width:100,align:'center',title:'类别'},
{field:'createtime',width:100,align:'center',title:'发布时间'},
{field:'click',width:50,align:'center',title:'阅读'},
{field:'sort',width:50,align:'center',title:'排序'},
{field:"adminname",width:68,align:'center',title:"编辑"},
{fixed:'right',width:130,align:'center',toolbar:'<div><a class="layui-btn layui-btn-xs" v-show="@system.manager/edit" lay-event="edit">编辑</a><a class="layui-btn layui-btn-xs layui-btn-danger" v-show="@system.manager/del" lay-event="del">删除</a></div>',title:'操作'}
]],
done: function(){ admin.vShow($('[lay-table-id="manager"]')); }
});
/*快编监听*/
table.on('edit(manager)',function(obj){
admin.req(app_root+"edit?do=up",{userid:obj.data.userid,av:obj.value,af:obj.field},function(res){
layer.msg(res.msg,{shade:[0.4,'#000'],time:500});
},'post',{headersToken:true});
});/**/
/*状态*/
form.on('switch(manager-chang)',function(obj){
var json = JSON.parse(decodeURIComponent($(this).data('json')));
var av = obj.elem.checked ? 1 : 0;
admin.req(app_root+"edit?do=up",{userid:json.userid,av:av,af:obj.elem.name},function(res){
layer.tips(res.msg,obj.othis,{time:1000});
if(res.code === 0) obj.elem.checked = parseInt(obj.value);
},'post',{headersToken:true});
});/**/
/*工具条监听*/
table.on('tool(manager)', function(obj){
var data = obj.data;
var userid = data.userid;
if(obj.event === 'edit'){
managerOpen(data);
}else if(obj.event === 'del'){
del(userid);
}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",{userid:ids},function(res){
layer.msg(res.msg,{shade:[0.4,'#000'],time:1500},function(){
if(res.code==1) table.reloadData('manager');
});
},'post',{headersToken:true});
});
}/**/
$('#manager-add').on('click',function(){managerOpen();});/**/
/*弹出窗*/
function managerOpen(){
layer.open({
type: 2,
area: ['900px', '900px'],
title: '添加文章',
btn: ['确定', '关闭'],
fixed: false, //不固定
content: '/admin/article/edit',
yes: function(index, layero){
// var data = window["layui-layer-iframe" + index].callbackdata();
var data = window["layui-layer-iframe" + index];
var form = data.find(".layui-form");
var formData = new FormData(form[0]);
$.ajax({
method: "post",
url: layui.cache.maps+'/article/edit',
data: formData,
processData: false,
contentType: false,
dataType: "json",
success: function (res){
if(res.code==1) {
}else{
// layer.msg(res.msg,{icon:2,shade:[0.4,'#000'],time:1500});
}
layer.close(loadIndex);
}
});
},
});
}/**/
});
</script>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<title>后台管理</title>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="{STATIC__PATH}layui/css/layui.css"/>
<link rel="stylesheet" href="{STATIC__PATH}admin/admin.css"/>
</head>
<body style="background: #f5f7f9;">
{block name="body"}{/block}
<script src="{STATIC__PATH}layui/layui.js"></script>
<script>
var $ = jQuery = layui.$;
layui.config({
base: "{STATIC__PATH}admin/module/",
maps: "/admin/", // 映射后的后台根路径
static: "{STATIC__PATH}", // 静态资源根路径 buildItems.js中有用
version: "{:VT_VERSION}", // 框架版本
bins: {
baseServer: '', // 接口地址,实际项目请换成http形式的地址
pageTabs: true, // 是否开启多标签
cacheTab: false, // 是否记忆Tab
defaultTheme: '', // 默认主题
openTabCtxMenu: true, // 是否开启Tab右键菜单
maxTabNum: 12, // 最多打开多少个tab
viewPath: '', // 视图位置
viewSuffix: '', // 视图后缀
reqPutToPost: true, // req请求put方法变成post
apiNoCache: true, // ajax请求json数据不带版本号
tabAutoRefresh: true, // 是否每点击菜单都刷新
tableName: 'vadmin', // 存储表名
token: '321321321321321321', // CSRF-TOKEN
}
}).extend({
Cropper: "Cropper/Cropper", //图片裁剪
tagsInput: "tagsInput/tagsInput", //标签
fileLibrary: "fileLibrary/fileLibrary", //资源库管理
buildItems: "buildItems/buildItems", //构建项
cascader: "cascader/cascader", //无限级联 地区
orgCharts: 'orgCharts/orgCharts', //组织结构图
zTree: 'zTree/zTree' //树形结构
})
</script>
{block name="script"}{/block}
</body>
</html>
\ No newline at end of file
......@@ -84,14 +84,18 @@ layui.use(['vinfo', 'buildItems'], function(){
/*==============左树结构===============*/
var organObj, organData, Organ = {}, organArr = {$organ|raw}; /*左树 选中数据 和 总树数据*/
for(let v of organArr){Organ[v.id] = v.title}
function renderTree(data,load){
if(!load) organObj = data[0];
if(data){
organData = admin.util.toTree(data);
doTree(organData,load);
}else{
admin.req(app_root + "index?do=organ",function(res){
organData = admin.util.toTree(res);
doTree(organData,load);
});
}
......@@ -115,21 +119,7 @@ layui.use(['vinfo', 'buildItems'], function(){
}
/*初始渲染*/
renderTree(organArr);
/*左树添加按钮*/
$('#organ-add').on('click',function(){organOpen();});/**/
/*左树编辑按钮*/
$('#organ-edit').on('click',function(){organOpen(organObj);});/**/
/*左树删除按钮*/
$('#organ-del').on('click', function(){
if(!organObj) return layer.msg('未选择机构');
layer.confirm('确定要删除所选机构吗?',function(){
admin.req(app_root+"odel",{id:organObj.id},function(res){
layer.msg(res.msg,{shade:[0.4,'#000'],time:1500},function(){
if(res.code==1) renderTree(res.data,true);
});
},'post',{headersToken:true});
});
});/**/
/*树形编辑弹窗*/
function organOpen(Dt){
admin.open({
......
<?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;
/**
* 模型公用类
*/
class ArticleModel extends Model
{
protected $name = 'article';
public function getCateNameAttr($value,$data){
return Db::name('article_category')->where('id',$data['cate_id'])->value('title');
}
public function getCreatetimeAttr($value,$data){
return date('Y-m-d H:i:s',$data['createtime']);
}
//获取发布者
public function getAdminnameAttr($value,$data){
return Db::name('system_manager')->where('userid',$data['admin_id'])->value('username');
}
}
\ 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