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
Expand all
Hide 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
public
function
index
()
{
ECHO
11
;
$this
->
assign
([
"appMap"
=>
$this
->
appMap
,
"tokenName"
=>
$this
->
tokenName
...
...
app/admin/controller/system/Manager.php
View file @
8e245f63
...
...
@@ -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'
]]]];
...
...
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(){
/*==============左树结构===============*/
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
({
...
...
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
This diff is collapsed.
Click to expand it.
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