Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
projecttwo
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wangtao
projecttwo
Commits
8e245f63
Commit
8e245f63
authored
Apr 24, 2025
by
wangtao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
增加后台文章管理
parent
69bc4795
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
868 additions
and
16 deletions
+868
-16
Article.php
app/admin/controller/Article.php
+83
-0
Index.php
app/admin/controller/Index.php
+0
-1
Manager.php
app/admin/controller/system/Manager.php
+1
-0
edit.html
app/admin/view/article/edit.html
+102
-0
index.html
app/admin/view/article/index.html
+197
-0
header.html
app/admin/view/base/header.html
+51
-0
index.html
app/admin/view/system/manager/index.html
+5
-15
ArticleModel.php
app/model/ArticleModel.php
+38
-0
Tree.php
extend/tool/Tree.php
+391
-0
No files found.
app/admin/controller/Article.php
0 → 100644
View file @
8e245f63
<?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
=
[
' │ '
,
' ├─ '
,
' └─ '
];
$tree
->
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
app/admin/controller/Index.php
View file @
8e245f63
...
@@ -27,7 +27,6 @@ class Index extends AdminBase
...
@@ -27,7 +27,6 @@ class Index extends AdminBase
public
function
index
()
public
function
index
()
{
{
ECHO
11
;
$this
->
assign
([
$this
->
assign
([
"appMap"
=>
$this
->
appMap
,
"appMap"
=>
$this
->
appMap
,
"tokenName"
=>
$this
->
tokenName
"tokenName"
=>
$this
->
tokenName
...
...
app/admin/controller/system/Manager.php
View file @
8e245f63
...
@@ -42,6 +42,7 @@ class Manager extends AdminBase
...
@@ -42,6 +42,7 @@ class Manager extends AdminBase
return
$this
->
redirect
(
$this
->
appMap
);
return
$this
->
redirect
(
$this
->
appMap
);
}
}
$organ
=
Organ
::
order
([
'listorder'
=>
'asc'
])
->
column
(
'*'
);
$organ
=
Organ
::
order
([
'listorder'
=>
'asc'
])
->
column
(
'*'
);
if
(
$do
){
if
(
$do
){
if
(
$do
==
'json'
){
//异步管理员列表数据
if
(
$do
==
'json'
){
//异步管理员列表数据
$where
=
[[],[[
'username'
,
'='
,
$this
->
manUser
[
'username'
]]]];
$where
=
[[],[[
'username'
,
'='
,
$this
->
manUser
[
'username'
]]]];
...
...
app/admin/view/article/edit.html
0 → 100644
View file @
8e245f63
{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
app/admin/view/article/index.html
0 → 100644
View file @
8e245f63
<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
app/admin/view/base/header.html
0 → 100644
View file @
8e245f63
<!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
app/admin/view/system/manager/index.html
View file @
8e245f63
...
@@ -84,14 +84,18 @@ layui.use(['vinfo', 'buildItems'], function(){
...
@@ -84,14 +84,18 @@ layui.use(['vinfo', 'buildItems'], function(){
/*==============左树结构===============*/
/*==============左树结构===============*/
var
organObj
,
organData
,
Organ
=
{},
organArr
=
{
$organ
|
raw
};
/*左树 选中数据 和 总树数据*/
var
organObj
,
organData
,
Organ
=
{},
organArr
=
{
$organ
|
raw
};
/*左树 选中数据 和 总树数据*/
for
(
let
v
of
organArr
){
Organ
[
v
.
id
]
=
v
.
title
}
for
(
let
v
of
organArr
){
Organ
[
v
.
id
]
=
v
.
title
}
function
renderTree
(
data
,
load
){
function
renderTree
(
data
,
load
){
if
(
!
load
)
organObj
=
data
[
0
];
if
(
!
load
)
organObj
=
data
[
0
];
if
(
data
){
if
(
data
){
organData
=
admin
.
util
.
toTree
(
data
);
organData
=
admin
.
util
.
toTree
(
data
);
doTree
(
organData
,
load
);
doTree
(
organData
,
load
);
}
else
{
}
else
{
admin
.
req
(
app_root
+
"index?do=organ"
,
function
(
res
){
admin
.
req
(
app_root
+
"index?do=organ"
,
function
(
res
){
organData
=
admin
.
util
.
toTree
(
res
);
organData
=
admin
.
util
.
toTree
(
res
);
doTree
(
organData
,
load
);
doTree
(
organData
,
load
);
});
});
}
}
...
@@ -115,21 +119,7 @@ layui.use(['vinfo', 'buildItems'], function(){
...
@@ -115,21 +119,7 @@ layui.use(['vinfo', 'buildItems'], function(){
}
}
/*初始渲染*/
/*初始渲染*/
renderTree
(
organArr
);
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
){
function
organOpen
(
Dt
){
admin
.
open
({
admin
.
open
({
...
...
app/model/ArticleModel.php
0 → 100644
View file @
8e245f63
<?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
extend/tool/Tree.php
0 → 100644
View file @
8e245f63
<?php
// +----------------------------------------------------------------------
// | Yzncms [ 御宅男工作室 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2018 http://yzncms.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 御宅男 <530765310@qq.com>
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
// | 通用的树型类,可以生成任何树型结构
// +----------------------------------------------------------------------
namespace
tool
;
class
Tree
{
/**
* 生成树型结构所需要的2维数组
* @var array
*/
public
$arr
=
array
();
protected
static
$instance
;
public
$options
=
[];
/**
* 生成树型结构所需修饰符号,可以换成图片
* @var array
*/
public
$icon
=
array
(
'│'
,
'├'
,
'└'
);
public
$nbsp
=
" "
;
public
$id
=
"id"
;
public
$pidname
=
'pid'
;
public
$child
=
'child'
;
public
$ret
=
''
;
/**
* 初始化.
*
* @param array $options 参数
*
* @return Tree
*/
public
static
function
instance
(
$options
=
[])
{
if
(
is_null
(
self
::
$instance
))
{
self
::
$instance
=
new
static
(
$options
);
}
return
self
::
$instance
;
}
/**
* 构造函数,初始化类
* @param array 2维数组,例如:
* array(
* 1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'),
* 2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'),
* 3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'),
* 4 => array('id'=>'4','parentid'=>1,'name'=>'二级栏目二'),
* 5 => array('id'=>'5','parentid'=>2,'name'=>'二级栏目三'),
* 6 => array('id'=>'6','parentid'=>3,'name'=>'三级栏目一'),
* 7 => array('id'=>'7','parentid'=>3,'name'=>'三级栏目二')
* )
*/
public
function
init
(
$arr
=
[],
$pidname
=
null
,
$nbsp
=
null
)
{
$this
->
arr
=
$arr
;
if
(
!
is_null
(
$pidname
))
{
$this
->
pidname
=
$pidname
;
}
if
(
!
is_null
(
$nbsp
))
{
$this
->
nbsp
=
$nbsp
;
}
$this
->
ret
=
''
;
return
$this
;
}
/**
* 得到子级数组
* @param int
* @return array
*/
public
function
getChild
(
$myid
)
{
$a
=
$newarr
=
array
();
if
(
is_array
(
$this
->
arr
))
{
foreach
(
$this
->
arr
as
$id
=>
$a
)
{
if
(
$a
[
$this
->
pidname
]
==
$myid
)
{
$newarr
[
$id
]
=
$a
;
}
}
}
return
$newarr
;
}
/**
* 读取指定节点的所有孩子节点
* @param int $myid 节点ID
* @param boolean $withself 是否包含自身
* @return array
*/
public
function
getChildren
(
$myid
,
$withself
=
false
)
{
$newarr
=
[];
foreach
(
$this
->
arr
as
$value
)
{
if
(
!
isset
(
$value
[
'id'
]))
{
continue
;
}
if
(
$value
[
$this
->
pidname
]
==
$myid
)
{
$newarr
[]
=
$value
;
$newarr
=
array_merge
(
$newarr
,
$this
->
getChildren
(
$value
[
'id'
]));
}
elseif
(
$withself
&&
$value
[
'id'
]
==
$myid
)
{
$newarr
[]
=
$value
;
}
}
return
$newarr
;
}
/**
* 读取指定节点的所有孩子节点ID
* @param int $myid 节点ID
* @param boolean $withself 是否包含自身
* @return array
*/
public
function
getChildrenIds
(
$myid
,
$withself
=
false
)
{
$childrenlist
=
$this
->
getChildren
(
$myid
,
$withself
);
$childrenids
=
[];
foreach
(
$childrenlist
as
$k
=>
$v
)
{
$childrenids
[]
=
$v
[
'id'
];
}
return
$childrenids
;
}
/**
* 得到当前位置父辈数组
* @param int
* @return array
*/
public
function
getParent
(
$myid
)
{
$pid
=
0
;
$newarr
=
[];
foreach
(
$this
->
arr
as
$value
)
{
if
(
!
isset
(
$value
[
'id'
]))
{
continue
;
}
if
(
$value
[
'id'
]
==
$myid
)
{
$pid
=
$value
[
$this
->
pidname
];
break
;
}
}
if
(
$pid
)
{
foreach
(
$this
->
arr
as
$value
)
{
if
(
$value
[
'id'
]
==
$pid
)
{
$newarr
[]
=
$value
;
break
;
}
}
}
return
$newarr
;
}
/**
* 得到当前位置所有父辈数组
* @param int
* @param bool $withself 是否包含自己
* @return array
*/
public
function
getParents
(
$myid
,
$withself
=
false
)
{
$pid
=
0
;
$newarr
=
[];
foreach
(
$this
->
arr
as
$value
)
{
if
(
!
isset
(
$value
[
'id'
]))
{
continue
;
}
if
(
$value
[
'id'
]
==
$myid
)
{
if
(
$withself
)
{
$newarr
[]
=
$value
;
}
$pid
=
$value
[
$this
->
pidname
];
break
;
}
}
if
(
$pid
)
{
$arr
=
$this
->
getParents
(
$pid
,
true
);
$newarr
=
array_merge
(
$arr
,
$newarr
);
}
return
$newarr
;
}
/**
* 读取指定节点所有父类节点ID
* @param int $myid
* @param boolean $withself
* @return array
*/
public
function
getParentsIds
(
$myid
,
$withself
=
false
)
{
$parentlist
=
$this
->
getParents
(
$myid
,
$withself
);
$parentsids
=
[];
foreach
(
$parentlist
as
$k
=>
$v
)
{
$parentsids
[]
=
$v
[
'id'
];
}
return
$parentsids
;
}
/**
* 树型结构Option
* @param int $myid 表示获得这个ID下的所有子级
* @param string $itemtpl 条目模板 如:"<option value=@id @selected @disabled>@spacer@name</option>"
* @param mixed $selectedids 被选中的ID,比如在做树型下拉框的时候需要用到
* @param mixed $disabledids 被禁用的ID,比如在做树型下拉框的时候需要用到
* @param string $itemprefix 每一项前缀
* @param string $toptpl 顶级栏目的模板
* @return string
*/
public
function
getTree
(
$myid
,
$itemtpl
=
''
,
$selectedids
=
''
,
$disabledids
=
''
,
$itemprefix
=
''
,
$toptpl
=
''
)
{
if
(
!
$itemtpl
)
{
$itemtpl
=
'<option value=@id @selected @disabled>@spacer @title</option>'
;
}
$ret
=
''
;
$number
=
1
;
$childs
=
$this
->
getChild
(
$myid
);
if
(
$childs
)
{
$total
=
count
(
$childs
);
foreach
(
$childs
as
$value
)
{
$id
=
$value
[
'id'
];
$j
=
$k
=
''
;
if
(
$number
==
$total
)
{
$j
.=
$this
->
icon
[
2
];
$k
=
$itemprefix
?
$this
->
nbsp
:
''
;
}
else
{
$j
.=
$this
->
icon
[
1
];
$k
=
$itemprefix
?
$this
->
icon
[
0
]
:
''
;
}
$spacer
=
$itemprefix
?
$itemprefix
.
$j
:
''
;
if
(
''
!==
$selectedids
)
{
$selected
=
$selectedids
&&
in_array
(
$id
,
(
is_array
(
$selectedids
)
?
$selectedids
:
explode
(
','
,
$selectedids
)))
?
'selected'
:
''
;
$value
=
array_merge
(
$value
,
[
'selected'
=>
$selected
]);
}
if
(
''
!==
$disabledids
)
{
$disabled
=
$disabledids
&&
in_array
(
$id
,
(
is_array
(
$disabledids
)
?
$disabledids
:
explode
(
','
,
$disabledids
)))
?
'disabled'
:
''
;
$value
=
array_merge
(
$value
,
[
'disabled'
=>
$disabled
]);
}
$value
=
array_merge
(
$value
,
array
(
'spacer'
=>
$spacer
));
$value
=
array_combine
(
array_map
(
function
(
$k
)
{
return
'@'
.
$k
;
},
array_keys
(
$value
)),
$value
);
$nstr
=
strtr
(((
$value
[
"@
{
$this
->
pidname
}
"
]
==
0
||
$this
->
getChild
(
$id
))
&&
$toptpl
?
$toptpl
:
$itemtpl
),
$value
);
$ret
.=
$nstr
;
$ret
.=
$this
->
getTree
(
$id
,
$itemtpl
,
$selectedids
,
$disabledids
,
$itemprefix
.
$k
.
$this
->
nbsp
,
$toptpl
);
$number
++
;
}
}
return
$ret
;
}
/**
* 树型结构UL
* @param int $myid 表示获得这个ID下的所有子级
* @param string $itemtpl 条目模板 如:"<li value=@id @selected @disabled>@name @childlist</li>"
* @param string $selectedids 选中的ID
* @param string $disabledids 禁用的ID
* @param string $wraptag 子列表包裹标签
* @param string $wrapattr 子列表包裹属性
* @return string
*/
public
function
getTreeUl
(
$myid
,
$itemtpl
,
$selectedids
=
''
,
$disabledids
=
''
,
$wraptag
=
'ul'
,
$wrapattr
=
''
)
{
$str
=
''
;
$childs
=
$this
->
getChild
(
$myid
);
if
(
$childs
)
{
foreach
(
$childs
as
$value
)
{
$id
=
$value
[
'id'
];
unset
(
$value
[
'child'
]);
$selected
=
$selectedids
&&
in_array
(
$id
,
(
is_array
(
$selectedids
)
?
$selectedids
:
explode
(
','
,
$selectedids
)))
?
'selected'
:
''
;
$disabled
=
$disabledids
&&
in_array
(
$id
,
(
is_array
(
$disabledids
)
?
$disabledids
:
explode
(
','
,
$disabledids
)))
?
'disabled'
:
''
;
$value
=
array_merge
(
$value
,
array
(
'selected'
=>
$selected
,
'disabled'
=>
$disabled
));
$value
=
array_combine
(
array_map
(
function
(
$k
)
{
return
'@'
.
$k
;
},
array_keys
(
$value
)),
$value
);
$nstr
=
strtr
(
$itemtpl
,
$value
);
$childdata
=
$this
->
getTreeUl
(
$id
,
$itemtpl
,
$selectedids
,
$disabledids
,
$wraptag
,
$wrapattr
);
$childlist
=
$childdata
?
"<
{
$wraptag
}
{
$wrapattr
}
>"
.
$childdata
.
"</
{
$wraptag
}
>"
:
""
;
$str
.=
strtr
(
$nstr
,
array
(
'@childlist'
=>
$childlist
));
}
}
return
$str
;
}
/**
* 将数据集格式化成层次结构
* @param int $pid 父级id
* @param int $max_level 最多返回多少层,0为不限制
* @param int $curr_level 当前层数
* @author 蔡伟明 <314013107@qq.com>
* @return array
*/
public
function
toLayer
(
$pid
=
0
,
$max_level
=
0
,
$curr_level
=
0
)
{
$trees
=
[];
$lists
=
$this
->
getChild
(
$pid
);
foreach
(
$lists
as
$key
=>
$value
)
{
if
(
$value
[
$this
->
pidname
]
==
$pid
)
{
if
(
$max_level
>
0
&&
$curr_level
==
$max_level
)
{
return
$trees
;
}
unset
(
$lists
[
$key
]);
$child
=
$this
->
toLayer
(
$value
[
$this
->
id
],
$max_level
,
$curr_level
+
1
);
if
(
!
empty
(
$child
))
{
$value
[
$this
->
child
]
=
$child
;
}
$trees
[
$key
]
=
$value
;
}
}
return
$trees
;
}
/**
*
* 获取树状数组
* @param string $myid 要查询的ID
* @param string $nametpl 名称条目模板
* @param string $itemprefix 前缀
* @return string
*/
public
function
getTreeArray
(
$myid
,
$itemprefix
=
''
)
{
$child
=
$this
->
getChild
(
$myid
);
$n
=
0
;
$data
=
[];
$number
=
1
;
if
(
is_array
(
$child
))
{
$total
=
count
(
$child
);
foreach
(
$child
as
$id
=>
$value
)
{
$j
=
$k
=
''
;
if
(
$number
==
$total
)
{
$j
.=
$this
->
icon
[
2
];
$k
=
$itemprefix
?
$this
->
nbsp
:
''
;
}
else
{
$j
.=
$this
->
icon
[
1
];
$k
=
$itemprefix
?
$this
->
icon
[
0
]
:
''
;
}
$spacer
=
$itemprefix
?
$itemprefix
.
$j
:
''
;
$value
[
'spacer'
]
=
$spacer
;
$data
[
$n
]
=
$value
;
$data
[
$n
][
'childlist'
]
=
$this
->
getTreeArray
(
$value
[
$this
->
id
],
$itemprefix
.
$k
.
$this
->
nbsp
);
$n
++
;
$number
++
;
}
}
return
$data
;
}
/**
* 将getTreeArray的结果返回为二维数组
* @param array $data
* @return array
*/
public
function
getTreeList
(
$data
=
[],
$field
=
'name'
)
{
$arr
=
[];
foreach
(
$data
as
$k
=>
$v
)
{
$childlist
=
isset
(
$v
[
'childlist'
])
?
$v
[
'childlist'
]
:
[];
unset
(
$v
[
'childlist'
]);
$v
[
$field
]
=
$v
[
'spacer'
]
.
' '
.
$v
[
$field
];
$v
[
'haschild'
]
=
$childlist
?
1
:
0
;
if
(
$v
[
$this
->
id
])
{
$arr
[]
=
$v
;
}
if
(
$childlist
)
{
$arr
=
array_merge
(
$arr
,
$this
->
getTreeList
(
$childlist
,
$field
));
}
}
return
$arr
;
}
private
function
have
(
$list
,
$item
)
{
return
(
strpos
(
',,'
.
$list
.
','
,
','
.
$item
.
','
));
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment