Commit f7bce4d9 authored by wangtao's avatar wangtao

增加后台文章管理

parent 8e245f63
...@@ -10,13 +10,13 @@ ...@@ -10,13 +10,13 @@
namespace app\admin\controller; namespace app\admin\controller;
use app\model\system\SystemDict as Dict;
use app\model\system\SystemMenus as Menus; use app\model\ArticleCategoryModel;
use app\model\system\SystemCategory as Category;
use think\App; use think\App;
use think\facade\Db; use think\facade\Db;
use app\model\ArticleModel; use app\model\ArticleModel;
use tool\Tree; use app\admin\validate\ArticleValidate;
/** /**
* 后台主控制器 * 后台主控制器
*/ */
...@@ -34,49 +34,89 @@ class Article extends AdminBase ...@@ -34,49 +34,89 @@ class Article extends AdminBase
} }
//文章列表 //文章列表
public function index(string $do='') public function index(string $do = '')
{ {
$limit = 10; $limit = 10;
if ($do == 'json') { if ($do == 'json') {
$post = input(); $post = input();
$post['page'] = isset($post['page']) ? $post['page'] : 1;
$post['limit'] = isset($post['limit']) ? $post['limit'] : $limit; $post['limit'] = isset($post['limit']) ? $post['limit'] : $limit;
$map[] = ['is_del', '=', 0]; $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('category', json_encode($category));
$this->assign('limit', $limit); $this->assign('limit', $limit);
return $this->fetch('', '', false); 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() public function edit()
{ {
$post = input();
if ($this->request->isPost()) {
if($this->request->isPost()){ $check = (new ArticleValidate())->goCheck();
if ($check !== true) {
return $check;
}
$post = input(); try {
print_r($post);exit; $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(); } catch (\Exception $e) {
$tree = new Tree();
$tree->icon = ['  │ ', '  ├─ ', '  └─ ']; return $this->returnMsg($e->getMessage(), 0);
$tree->nbsp = '  '; }
$str = "<option value=@id @selected @disabled>@spacer @title</option>";
$tree->init($category); return $this->returnMsg($msg, 1);
$categorydata = $tree->getTree(0, $str, 0);
}
$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('categorydata', $categorydata);
$this->assign('data', $data);
return $this->fetch('', '', false); return $this->fetch('', '', false);
} }
public function maind() public function del()
{ {
$post = input();
return $this->fetch('', '', false); $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" /} {extend name="base/header" /}
{block name="body"} {block name="body"}
<div style="margin: 0px 10px"> <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"> <div class="layui-form-item">
<label class="layui-form-label"> 选择分类 </label> <label class="layui-form-label"> 选择分类 </label>
<div class="layui-input-block"> <div class="layui-input-block">
<select name="cate_id"> <select name="cate_id">
<option value="0">请选择分类</option> <option value="">请选择分类</option>
{:$categorydata} {:$categorydata}
</select> </select>
</div> </div>
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">文章标题</label> <label class="layui-form-label">文章标题</label>
<div class="layui-input-block"> <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>
</div> </div>
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
<label class="layui-form-label">文章简介</label> <label class="layui-form-label">文章简介</label>
<div class="layui-input-block"> <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>
</div> </div>
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
<label class="layui-form-label">阅读量</label> <label class="layui-form-label">阅读量</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input type="text" name="click" placeholder="请输入阅读量" autocomplete="off" class="layui-input" <input type="text" name="click" placeholder="请输入阅读量" autocomplete="off" class="layui-input"
value="0"> value="{$data.click|default=''}">
</div> </div>
</div> </div>
...@@ -49,21 +49,23 @@ ...@@ -49,21 +49,23 @@
</div> </div>
<input type="hidden" name="id" value="{$data.id|default=0}">
</form> </form>
</div> </div>
{/block} {/block}
{block name="script"} {block name="script"}
<script type="text/javascript"> <script type="text/javascript">
layui.use(['buildItems', 'form', 'laydate', 'util'], function () { layui.use(['buildItems', 'form', 'laydate', 'util'], function () {
var form = layui.form;
/*解析顶部分组选项*/ /*解析顶部分组选项*/
var str = [{ var str = [{
"name": "thumb", "name": "thumb",
"title": "上传图片", "title": "上传图片",
"value": "", "value": "{$data.thumb|default=''}",
"type": "imagewt" "type": "imagewt"
}]; }];
layui.buildItems.build({ layui.buildItems.build({
fjbid:'fjfrom',
bid: 'thumbup', bid: 'thumbup',
url: '', url: '',
map: layui.cache.maps + 'system.upload/', map: layui.cache.maps + 'system.upload/',
...@@ -74,11 +76,12 @@ ...@@ -74,11 +76,12 @@
var str = [{ var str = [{
"name": "content", "name": "content",
"title": "文章内容", "title": "文章内容",
"value": "", "value": "{$data.content|default=''}",
"type": "ueditor", "type": "ueditor",
"style": "height:500px", "style": "height:500px",
}]; }];
layui.buildItems.build({ layui.buildItems.build({
fjbid:'fjfrom',
bid: 'contentup', bid: 'contentup',
url: '', url: '',
map: layui.cache.maps + 'system.upload/', map: layui.cache.maps + 'system.upload/',
...@@ -86,7 +89,7 @@ ...@@ -86,7 +89,7 @@
data: str data: str
}); });
var form = layui.form; layui.buildItems.init();
form.render(); form.render();
...@@ -94,7 +97,6 @@ ...@@ -94,7 +97,6 @@
var callbackdata = function () { var callbackdata = function () {
var data = $(".layui-form").serialize(); var data = $(".layui-form").serialize();
return data; return data;
}; };
......
<style>
#organizationTreeBar{padding:10px 15px;border:1px solid #e6e6e6;background-color:#f2f2f2} <div class="layui-fluid">
#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)}
<style>
#articlecategoryTreeBar{padding:10px 15px;border:1px solid #e6e6e6;background-color:#f2f2f2}
#articlecategoryTree{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 .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} .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_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_item img{max-width:28px;max-height:28px;border:0} .files_itemw img{max-width:28px;max-height:28px;border:0}
</style> </style>
<div class="layui-fluid">
<div class="layui-row layui-col-space15"> <div class="layui-row layui-col-space15">
<div class="layui-col-md2"> <div class="layui-col-md2">
<div class="layui-card"> <div class="layui-card">
...@@ -14,7 +16,7 @@ ...@@ -14,7 +16,7 @@
<!-- 树工具栏 --> <!-- 树工具栏 -->
<!-- 左树 --> <!-- 左树 -->
<div id="organizationTree"></div> <div id="articlecategoryTree"></div>
</div> </div>
</div> </div>
</div> </div>
...@@ -22,40 +24,35 @@ ...@@ -22,40 +24,35 @@
<div class="layui-card"> <div class="layui-card">
<div class="layui-card-header"> <div class="layui-card-header">
<form class="layui-form render"> <form class="layui-form render">
<input type="hidden" name="groupid" id="manager-groupid" value=""/> <input type="hidden" name="groupid" id="article-groupid" value=""/>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-inline" style="width:72px;">
<select name="fields"> <div class="layui-inline" style="width:250px;"><input type="text" name="kw" placeholder="文章标题关键词" autocomplete="off" class="layui-input" lay-affix="clear"/></div>
<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-inline">
<div class="layui-btn-group"> <div class="layui-btn-group">
<button class="layui-btn" lay-submit lay-filter="search-manager"><i class="layui-icon layui-icon-search"></i> 搜索</button> <button class="layui-btn" lay-submit lay-filter="search-article"><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> <a class="layui-btn" lay-submit lay-filter="search-article-all" onclick="$('#article-groupid').val('')"><i class="layui-icon layui-icon-light"></i>全部</a>
<a class="layui-btn" id="article-add" ><i class="layui-icon layui-icon-add-circle"></i> 添加</a>
<a class="layui-btn" id="article-del"><i class="layui-icon layui-icon-delete"></i> 删除</a>
</div> </div>
</div> </div>
</div> </div>
</form> </form>
</div> </div>
<div class="layui-card-body"> <div class="layui-card-body">
<div class="layui-card-box"> <!-- <div class="layui-card-box">-->
<div class="layui-btn-group"> <!-- <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="article-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> <!-- <a class="layui-btn" id="article-del"><i class="layui-icon layui-icon-delete"></i> 删除</a>-->
</div> <!-- </div>-->
</div> <!-- </div>-->
<div class="layui-card-body"> <div class="layui-card-body">
<table lay-filter="manager" id="manager"></table> <table lay-filter="article" id="article"></table>
</div> </div>
</div> </div>
</div> </div>
...@@ -78,18 +75,18 @@ ...@@ -78,18 +75,18 @@
function doTree(data,load){ function doTree(data,load){
layui.tree.render({ layui.tree.render({
id: 'organTree', id: 'organTree',
elem: '#organizationTree', elem: '#articlecategoryTree',
data: data, data: data,
onlyIconControl: true, onlyIconControl: true,
click: function(obj){ click: function(obj){
$('#organizationTree').find('.organ-tree-click').removeClass('organ-tree-click'); $('#articlecategoryTree').find('.organ-tree-click').removeClass('organ-tree-click');
$(obj.elem).children('.layui-tree-entry').addClass('organ-tree-click'); $(obj.elem).children('.layui-tree-entry').addClass('organ-tree-click');
organObj = obj.data; organObj = obj.data;
$('#manager-groupid').val(obj.data.id); $('#article-groupid').val(obj.data.id);
table.reloadData('manager',{where:{groupid:obj.data.id},page:{curr:1}}); table.reloadData('article',{where:{cate_id:obj.data.id},page:{curr:1}});
} }
}); });
var item = $('#organizationTree .layui-tree-entry:first'); var item = $('#articlecategoryTree .layui-tree-entry:first');
load ? item.find('.layui-tree-main>.layui-tree-txt').trigger('click') : item.addClass('organ-tree-click'); load ? item.find('.layui-tree-main>.layui-tree-txt').trigger('click') : item.addClass('organ-tree-click');
} }
/*初始渲染*/ /*初始渲染*/
...@@ -98,48 +95,40 @@ ...@@ -98,48 +95,40 @@
/*渲染数据*/ /*渲染数据*/
table.render({ table.render({
elem: '#manager', elem: '#article',
page: true, page: true,
limit:{$limit}, limit:{$limit},
url: app_root+"index?&do=json", url: app_root+"index?&do=json",
cols: [[ cols: [[
{type:'checkbox',fixed:'left'}, {type:'checkbox',fixed:'left'},
{field:'id',width:50,unresize:true,align:'center',title:'ID',sort:!0}, {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:'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:'center',title:'标题',edit:'text'}, {field:'title',align:'center',title:'标题',edit:'text'},
{field:'cate_name',width:100,align:'center',title:'类别'}, {field:'cate_name',width:120,align:'center',title:'类别'},
{field:'createtime',width:100,align:'center',title:'发布时间'}, {field:'createtime',width:120,align:'center',title:'发布时间'},
{field:'click',width:50,align:'center',title:'阅读'}, {field:'click',width:50,align:'center',title:'阅读',edit:'text'},
{field:'sort',width:50,align:'center',title:'排序'}, {field:'sort',width:50,align:'center',title:'排序',edit:'text'},
{field:"adminname",width:68,align:'center',title:"编辑"}, {field:"adminname",width:80,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:'操作'} {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="manager"]')); } done: function(){ admin.vShow($('[lay-table-id="article"]')); }
}); });
/*快编监听*/ /*快编监听*/
table.on('edit(manager)',function(obj){ table.on('edit(article)',function(obj){
admin.req(app_root+"edit?do=up",{userid:obj.data.userid,av:obj.value,af:obj.field},function(res){ 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}); layer.msg(res.msg,{shade:[0.4,'#000'],time:500});
},'post',{headersToken:true}); },'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){ table.on('tool(article)', function(obj){
var data = obj.data; var data = obj.data;
var userid = data.userid; var id = data.id;
if(obj.event === 'edit'){ if(obj.event === 'edit'){
managerOpen(data); articleOpen(data.id);
}else if(obj.event === 'del'){ }else if(obj.event === 'del'){
del(userid); del(id);
}else if(obj.event === 'article-event-image'){ }else if(obj.event === 'article-event-image'){
var src = $(this).attr('src'), alt = $(this).attr('alt'); 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']}); layer.photos({photos:{data:[{alt:alt,src:src}],start:'0'},anim:5,shade:[0.4,'#000']});
...@@ -148,48 +137,60 @@ ...@@ -148,48 +137,60 @@
/*删除*/ /*删除*/
function del(ids){ function del(ids){
layer.confirm('确定要删除所选文章吗?', function(){ layer.confirm('确定要删除所选文章吗?', function(){
admin.req(app_root+"del",{userid:ids},function(res){ admin.req(app_root+"del",{id:ids},function(res){
layer.msg(res.msg,{shade:[0.4,'#000'],time:1500},function(){ layer.msg(res.msg,{shade:[0.4,'#000'],time:1500},function(){
if(res.code==1) table.reloadData('manager'); if(res.code==1) table.reloadData('article');
}); });
},'post',{headersToken:true}); },'post',{headersToken:true});
}); });
}/**/ }/**/
$('#manager-add').on('click',function(){managerOpen();});/**/ /*顶部删除按钮*/
$('#article-del').on('click', function(){
var checkRows = table.checkStatus('article').data;
if(checkRows.length === 0){return layer.msg('请选择需删除的文章');}
var ids = checkRows.map(function(d){return d.id;});
console.log(ids);
del(ids);
});/**/
$('#article-add').on('click',function(){articleOpen();});/**/
/*弹出窗*/ /*弹出窗*/
function managerOpen(){ function articleOpen(id=''){
if(id > 0){
var title = '编辑文章';
}else{
var title = '添加文章';
}
layer.open({ layer.open({
type: 2, type: 2,
area: ['900px', '900px'], area: ['900px', '900px'],
title: '添加文章', title: title,
btn: ['确定', '关闭'], btn: ['确定', '关闭'],
fixed: false, //不固定 fixed: false, //不固定
content: '/admin/article/edit', content: '/admin/article/edit?id='+id,
yes: function(index, layero){ yes: function(index, layero){
// var data = window["layui-layer-iframe" + index].callbackdata(); 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({ $.ajax({
method: "post", method: "post",
url: layui.cache.maps+'/article/edit', url: layui.cache.maps+'/article/edit',
data: formData, data: data,
processData: false,
contentType: false,
dataType: "json", dataType: "json",
success: function (res){ success: function (res){
if(res.code==1) { if(res.code===1) {
layer.msg(res.msg,{icon:1,shade:[0.4,'#000'],time:1500},function (){
layer.close(index);
table.reloadData('article');
});
}else{ }else{
// layer.msg(res.msg,{icon:2,shade:[0.4,'#000'],time:1500}); layer.msg(res.msg,{icon:2,shade:[0.4,'#000'],time:1500},function (){
});
} }
layer.close(loadIndex); // layer.closeAll();
} }
}); });
}, },
}); });
}/**/ }/**/
......
{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 @@ ...@@ -43,7 +43,9 @@
cascader: "cascader/cascader", //无限级联 地区 cascader: "cascader/cascader", //无限级联 地区
orgCharts: 'orgCharts/orgCharts', //组织结构图 orgCharts: 'orgCharts/orgCharts', //组织结构图
zTree: 'zTree/zTree' //树形结构 zTree: 'zTree/zTree' //树形结构
}) }).use(["index", "admin"], function(){
});
</script> </script>
{block name="script"}{/block} {block name="script"}{/block}
......
<tpl> <tpl>
<form class="layui-form " action="admin/Index/main"> <form class="layui-form " action="admin/Index/main" id="fjfrom">
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">输入框</label> <label class="layui-form-label">输入框</label>
<div class="layui-input-block"> <div class="layui-input-block">
...@@ -106,7 +106,7 @@ ...@@ -106,7 +106,7 @@
}]; }];
layui.buildItems.build({ layui.buildItems.build({
bid: 'imgboxheadimg', bid: 'imgboxheadimg',
url: '', fjbid:'fjfrom',
map: layui.cache.maps + 'system.upload/', map: layui.cache.maps + 'system.upload/',
gid: 1, gid: 1,
data:str data:str
...@@ -120,40 +120,41 @@ ...@@ -120,40 +120,41 @@
}]; }];
layui.buildItems.build({ layui.buildItems.build({
bid: 'imgboxheadimg2', bid: 'imgboxheadimg2',
url: '', fjbid:'fjfrom',
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: '',
map: layui.cache.maps + 'system.upload/', map: layui.cache.maps + 'system.upload/',
gid: 1, gid: 1,
data:str 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=layui.form;
form.render(); form.render();
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
*/ */
// 版本信息 // 版本信息
define('VT_VERSION', '2.2.7'); define('VT_VERSION', '2.2.4');
// 后台管理员 session 标识 // 后台管理员 session 标识
define('VT_MANAGER', 'V_MANAGER'); define('VT_MANAGER', 'V_MANAGER');
// 前台会员 session 标识 // 前台会员 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
...@@ -10,6 +10,7 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){ ...@@ -10,6 +10,7 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){
var f = []; //方法组 var f = []; //方法组
var c = []; //配置组 var c = []; //配置组
var $h; //构建的容器 var $h; //构建的容器
var $hw; //构建的容器
//基础模板 //基础模板
c.label_html = '<label class="layui-form-label{{# if(d.must){ }} layui-form-required{{# } }}">{{- d.title }}</label>'; c.label_html = '<label class="layui-form-label{{# if(d.must){ }} layui-form-required{{# } }}">{{- d.title }}</label>';
c.block_html = '<div class="layui-input-block"'; c.block_html = '<div class="layui-input-block"';
...@@ -135,13 +136,20 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){ ...@@ -135,13 +136,20 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){
}, },
render: function(d){ render: function(d){
$h = $("#"+ d.bid); //绑定ID $h = $("#"+ d.bid); //绑定ID
$hw = d.fjbid ? $("#"+ d.fjbid) : $h;
c.gid = d.gid || -1; //上传资源分组ID c.gid = d.gid || -1; //上传资源分组ID
c.map = d.map || 'admin/system.upload/'; //上传接口 c.map = d.map || 'admin/system.upload/'; //上传接口
if(!d.fjbid){
b.init(); b.init();
}
// b.init();
}, },
build: function(d){ build: function(d){
c.relation = []; //关联项清空 c.relation = []; //关联项清空
c.bid = d.bid || ''; //绑定ID c.bid = d.bid || ''; //绑定ID
c.fjbid = d.fjbid || ''; //绑定ID
c.gid = d.gid || -1; //上传资源分组ID c.gid = d.gid || -1; //上传资源分组ID
c.map = d.map || 'admin/system.upload/'; //上传接口 c.map = d.map || 'admin/system.upload/'; //上传接口
c.url = d.url || ''; //构建项json数据接口 c.url = d.url || ''; //构建项json数据接口
...@@ -166,7 +174,11 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){ ...@@ -166,7 +174,11 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){
}, },
sett: function(data){ //data: 二维数组[{name:标识,title:标题,group:分组,type:类型,value:值,options:选项},{}] sett: function(data){ //data: 二维数组[{name:标识,title:标题,group:分组,type:类型,value:值,options:选项},{}]
var html = '', str = '', tab_t = '', tab_c = ''; var html = '', str = '', tab_t = '', tab_c = '';
$h = $("#"+ c.bid); f = []; //清空方法组
$h = $("#"+ c.bid);
$hw = c.fjbid ? $("#"+ c.fjbid) : $h;
f = []; //清空方法组
for(var i in data){ for(var i in data){
var d = data[i]; var d = data[i];
if(d.type=='layui_tab'){ if(d.type=='layui_tab'){
...@@ -195,7 +207,10 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){ ...@@ -195,7 +207,10 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){
let ra = $h.find('input[name="'+v.name+'"]:checked').val(); let ra = $h.find('input[name="'+v.name+'"]:checked').val();
$("[id^='item-"+v.obj+"_"+ra+"']").show(); $("[id^='item-"+v.obj+"_"+ra+"']").show();
}); });
if(!c.fjbid){
b.init(); b.init();
}
// b.init();
//回调并监听输入框变化 //回调并监听输入框变化
if(typeof c.success === 'function'){ if(typeof c.success === 'function'){
c.success(null, '_init_'); c.success(null, '_init_');
...@@ -205,7 +220,10 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){ ...@@ -205,7 +220,10 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){
settwt: function(data){ //data: 二维数组[{name:标识,title:标题,group:分组,type:类型,value:值,options:选项},{}] settwt: function(data){ //data: 二维数组[{name:标识,title:标题,group:分组,type:类型,value:值,options:选项},{}]
var html = '', str = '', tab_t = '', tab_c = ''; var html = '', str = '', tab_t = '', tab_c = '';
$h = $("#"+ c.bid); f = []; //清空方法组 $h = $("#"+ c.bid);
$hw = c.fjbid ? $("#"+ c.fjbid) : $h;
f = []; //清空方法组
for(var i in data){ for(var i in data){
var d = data[i]; var d = data[i];
...@@ -218,7 +236,7 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){ ...@@ -218,7 +236,7 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){
$h.html(html); $h.html(html);
// form.render(null,c.bid+'_form'); // form.render(null,c.bid+'_form');
b.init(); // b.init();
}, },
init: function(){ init: function(){
...@@ -283,13 +301,13 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){ ...@@ -283,13 +301,13 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){
}); });
}, },
Photos: function(){ Photos: function(){
$h.find("[id^='image-show-']").each(function(){ $hw.find("[id^='image-show-']").each(function(){
var id = '#'+ $(this).attr('id'); var id = '#'+ $(this).attr('id');
layer.photos({photos:id,anim:1,shade:[0.4,'#000']}); layer.photos({photos:id,anim:1,shade:[0.4,'#000']});
}); });
}, },
regUpFile: function(){ regUpFile: function(){
$h.find("[id^='upfile-btn-']").each(function(){ $hw.find("[id^='upfile-btn-']").each(function(){
var id = '#'+ $(this).attr('id'),type = $(this).data('type') || 'file'; var id = '#'+ $(this).attr('id'),type = $(this).data('type') || 'file';
var name = id.split('-')[2]; var name = id.split('-')[2];
layui.upload.render({ layui.upload.render({
...@@ -343,10 +361,11 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){ ...@@ -343,10 +361,11 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){
} }
}, },
regAction: function(){ regAction: function(){
$h.find("[id^='image-show-']").on('click','.image_item .item-edit', function(){ $hw.find("[id^='image-show-']").on('click','.image_item .item-edit', function(){
var $this = $(this); var $this = $(this);
var $img = $this.parent().children('img'); var $img = $this.parent().children('img');
var $input = $this.parent().children('input'); var $input = $this.parent().children('input');
console.log($input);
layui.admin.cropImg({ layui.admin.cropImg({
title: '编辑图像', title: '编辑图像',
imgSrc: $img.attr('src'), imgSrc: $img.attr('src'),
...@@ -377,7 +396,7 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){ ...@@ -377,7 +396,7 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){
} }
}); });
}); });
$h.find("[id^='image-show-']").on('click','.image_item .item-delete', function(){ $hw.find("[id^='image-show-']").on('click','.image_item .item-delete', function(){
var $this = $(this), noClick = $this.data('noClick'), name = $this.data('name'); var $this = $(this), noClick = $this.data('noClick'), name = $this.data('name');
if (noClick) {return false;} if (noClick) {return false;}
layer.confirm('您确定要删除该' + (name ? name : '图片') + '吗?', { layer.confirm('您确定要删除该' + (name ? name : '图片') + '吗?', {
...@@ -392,38 +411,54 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){ ...@@ -392,38 +411,54 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){
layer.close(index); layer.close(index);
}); });
}); });
$h.find("[id^='keyval-add-']").on('click',function(){ $hw.find("[id^='keyval-add-']").on('click',function(){
var id = $(this).attr('id'); var id = $(this).attr('id');
var name = id.split('-')[2]; var name = id.split('-')[2];
var str = b.tpl(c.keyval_html,{value:{'':''}}); var str = b.tpl(c.keyval_html,{value:{'':''}});
$("#keyval-show-"+name).append(str); $("#keyval-show-"+name).append(str);
}); });
$h.find("[id^='keyval-show-']").on('click','.keyval_item .del',function(){ $hw.find("[id^='keyval-show-']").on('click','.keyval_item .del',function(){
var name = $(this).parent().parent().data('name'); var name = $(this).parent().parent().data('name');
$(this).parent().remove(); $(this).parent().remove();
b.setArr(name); b.setArr(name);
}); });
$h.find("[id^='keyval-show-']").on('blur','.keyval_item input',function(){ $hw.find("[id^='keyval-show-']").on('blur','.keyval_item input',function(){
b.setArr($(this).parent().parent().parent().data('name')); b.setArr($(this).parent().parent().parent().data('name'));
}); });
}, },
regUpload: function(){ regUpload: function(){
$h.find("[id^='up-image-btn-']").on('click', function(){
$hw.find("[id^='up-image-btn-']").on('click', function(){
console.log($hw);
var $this = $(this); var $this = $(this);
var type = $this.data('type'); var type = $this.data('type');
var name = $this.data('name'); var name = $this.data('name');
var thum = $this.data('thum'); var thum = $this.data('thum');
fileLibrary.open({title:'图片管理',thum:thum,groupid:c.gid,url:c.map},function(res){ fileLibrary.open({title:'图片管理',thum:thum,groupid:c.gid,url:c.map},function(res){
if(res.length == 0) return; if(res.length == 0) return;
var $pbox = $h.find("#image-show-" + name); var $pbox = $hw.find("#image-show-" + name);
// var $pbox = $(this).find("#image-show-" + name);
if(type=='image'){ if(type=='image'){
$pbox.html('<div class="image_item"><img src="'+ res[0].file_path +'" /><input type="hidden" name="'+ name +'" value="'+ res[0].file_path +'"><i class="layui-icon layui-icon-edit item-edit"></i><i class="layui-icon layui-icon-close item-delete"></i></div>'); $pbox.html('<div class="image_item"><img src="'+ res[0].file_path +'" /><input type="hidden" name="'+ name +'" value="'+ res[0].file_path +'"><i class="layui-icon layui-icon-edit item-edit"></i><i class="layui-icon layui-icon-close item-delete"></i></div>');
// $htmls = '<div class="image_item"><img src="'+ res[0].file_path +'" /><input type="hidden" name="'+ name +'" value="'+ res[0].file_path +'"><i class="layui-icon layui-icon-edit item-edit"></i><i class="layui-icon layui-icon-close item-delete"></i></div>'
// $("#image-show-" + name).html($htmls);
}else{ }else{
if($pbox.children('input').length>0) $pbox.html(''); if($pbox.children('input').length>0) $pbox.html('');
for(var i in res){ for(var i in res){
var v = res[i]; var v = res[i];
$pbox.append('<div class="image_item"><img src="'+ v.file_path +'" /><input type="hidden" name="'+ name +'[]" value="'+ v.file_path +'"><i class="layui-icon layui-icon-edit item-edit"></i><i class="layui-icon layui-icon-close item-delete"></i></div>'); $pbox.append('<div class="image_item"><img src="'+ v.file_path +'" /><input type="hidden" name="'+ name +'[]" value="'+ v.file_path +'"><i class="layui-icon layui-icon-edit item-edit"></i><i class="layui-icon layui-icon-close item-delete"></i></div>');
} }
// if( $("#image-show-" + name).children('input').length>0) $("#image-show-" + name).html('');
// for(var i in res){
// var v = res[i];
// $("#image-show-" + name).append('<div class="image_item"><img src="'+ v.file_path +'" /><input type="hidden" name="'+ name +'[]" value="'+ v.file_path +'"><i class="layui-icon layui-icon-edit item-edit"></i><i class="layui-icon layui-icon-close item-delete"></i></div>');
// }
} }
b.Photos(); b.Photos();
}); });
...@@ -431,7 +466,7 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){ ...@@ -431,7 +466,7 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){
}, },
uEditor: function(){ uEditor: function(){
var ids = []; var ids = [];
$h.find("[id^='ueditor-']").each(function(){ $hw.find("[id^='ueditor-']").each(function(){
ids.push($(this).attr('id')); ids.push($(this).attr('id'));
}); });
if(ids.length > 0){ if(ids.length > 0){
...@@ -485,7 +520,7 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){ ...@@ -485,7 +520,7 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){
}, },
cherryMd: function(){ cherryMd: function(){
var ids = [],obj = []; var ids = [],obj = [];
$h.find("[id^='cherrymd-']").each(function(){ $hw.find("[id^='cherrymd-']").each(function(){
ids.push($(this).attr('id')); ids.push($(this).attr('id'));
}); });
if(ids.length > 0){ if(ids.length > 0){
...@@ -526,7 +561,7 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){ ...@@ -526,7 +561,7 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){
}, },
editorMd: function(){ editorMd: function(){
var ids = []; var ids = [];
$h.find("[id^='editormd-']").each(function(){ $hw.find("[id^='editormd-']").each(function(){
ids.push($(this).attr('id')); ids.push($(this).attr('id'));
}); });
if(ids.length > 0){ if(ids.length > 0){
...@@ -568,7 +603,7 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){ ...@@ -568,7 +603,7 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){
}, },
TinyMCE: function(){ TinyMCE: function(){
var ids = []; var ids = [];
$h.find("[id^='tinymce-']").each(function(){ $hw.find("[id^='tinymce-']").each(function(){
ids.push($(this).attr('id')); ids.push($(this).attr('id'));
}); });
if(ids.length > 0){ if(ids.length > 0){
...@@ -688,7 +723,7 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){ ...@@ -688,7 +723,7 @@ layui.define(['tagsInput','fileLibrary','cascader'], function(e){
}, },
setArr: function(name){ setArr: function(name){
var obj = {}, val; var obj = {}, val;
$h.find("#keyval-show-"+ name +" .keyval_item").each(function(){ $hw.find("#keyval-show-"+ name +" .keyval_item").each(function(){
let key = $(this).find("input:eq(0)").val(); let key = $(this).find("input:eq(0)").val();
if(key) obj[key] = $(this).find("input:eq(1)").val(); if(key) obj[key] = $(this).find("input:eq(1)").val();
}); });
......
/*
* Veitool 1.0.3 构建表单项 2023-08-12
* Website:www.veitool.com
* Author:niaho (QQ:26843818)
*/
layui.define(['tagsInput','fileLibrary','cascader'], function(e){
layui.link(layui.cache.base+"buildItems/buildItems.css");
var $ = layui.$,layer=layui.layer,form=layui.form,tagsInput=layui.tagsInput,fileLibrary=layui.fileLibrary;
var static = layui.cache.static;
var f = []; //方法组
var c = []; //配置组
var $h; //构建的容器
var $hw; //构建的容器
//基础模板
c.label_html = '<label class="layui-form-label{{# if(d.must){ }} layui-form-required{{# } }}">{{- d.title }}</label>';
c.block_html = '<div class="layui-input-block"';
c.inline_html = '<div class="layui-input-inline"';
c.item_html = '<div class="layui-form-item" id="item-{{ d.relation ? d.relation + "-" : "" }}{{ d.name }}" style="{{# if(d.itemStyle){ }}{{ d.itemStyle }}{{# } }}{{# if(d.hide || (d.relation && d.relation.indexOf("_")!=-1)){ }}display:none;{{# } }}">' + c.label_html;
c.tips_html = '{{# if(d.tips){ }}<div class="layui-form-mid{{# if(d.type ==\'switch\' || d.type ==\'captcha\' || d.type ==\'keyval\' || d.type ==\'colorpicker\'){ }} tipx{{# } }}"><i class="layui-icon">&#xe748;</i> {{ d.tips }}</div>{{# } }}';
c.vers_html = '{{# if(d.verify){ }}lay-verify="{{ d.verify }}" lay-vertype="{{ d.vertype || \'\' }}" lay-reqtext="{{ d.reqtext || d.placeholder || \'\' }}" {{# } }}';
c.plac_html = '{{# if(d.placeholder){ }}placeholder="{{ d.placeholder }}" {{# } }}{{# if(d.readonly){ }}readonly {{# } }}';
c.affix_html = '{{# if(d.affix){ }}lay-affix="{{ d.affix }}" {{# } }}';
c.item_style = '{{# if(d.style){ }}style="{{ d.style }}" {{# } }}';
//表单元素
c.text_html = '<input type="text" name="{{ d.name }}" lay-filter="{{ d.name }}" value="{{ d.value }}" ' + c.item_style + c.vers_html + '{{# if(d.maxlength){ }}maxlength="{{ d.maxlength }}"{{# } }} ' + c.plac_html + c.affix_html;
c.number_html = '<input type="number" name="{{ d.name }}" lay-filter="{{ d.name }}" value="{{ d.value }}" ' + c.item_style + c.vers_html + c.plac_html + '{{# if(d.id){ }}id="{{ d.id }}"{{# } }} class="layui-input" lay-affix="number">';
c.switch_html = '{{# layui.buildItems.on(d.name,d.relation || "","switch"); }}<input type="checkbox" name="{{ d.name }}" lay-skin="switch" lay-text="ON|OFF" lay-filter="{{ d.name }}" value="1" {{ d.value ==1 ? "checked" : "" }}/>';
c.radio_html = '{{# layui.buildItems.on(d.name,d.relation || "","radio"); layui.each(d.options, function(key, txt){ }}<input type="radio" name="{{ d.name }}" lay-filter="{{ d.name }}" value="{{ key }}" title="{{ txt }}" {{ d.value == key ? "checked" : "" }} />{{# }); }}';
c.checkbox_html = '{{# layui.buildItems.on(d.name,"","checkbox"); layui.each(d.options, function(key, txt){ }}<input type="checkbox" name="{{ d.name }}[]" lay-filter="{{ d.name }}" lay-skin="{{ d.skin }}" value="{{ key }}" title="{{ txt }}" {{ (d.value).split(",").indexOf(String(key))>-1 ? "checked" : "" }}/>{{# }); }}';
c.password_html = '<input type="password" name="{{ d.name }}" value="{{ d.value }}" ' + c.item_style + c.vers_html + 'autocomplete="off" ' + c.plac_html + c.affix_html;
c.textarea_html = '<textarea name="{{ d.name }}" ' + c.item_style;
c.select_html = '<select name="{{ d.name }}" lay-filter="{{ d.name }}" ' + c.item_style + c.vers_html + '{{# layui.buildItems.on(d.name,"","select"); if(d.search){ }}lay-search{{# } }}>{{# if(d.optiontip || d.reqtext){ }}<option value="">{{ d.optiontip || d.reqtext }}</option>{{# } }}{{# layui.each(d.options, function(key, txt){ }}<option value="{{ key }}" {{ d.value == key ? "selected" : "" }}>{{ txt }}</option>{{# }); }}</select>';
//隐藏域
c.hidden = '<input type="hidden" name="{{ d.name }}" value="{{ d.value || \'\' }}"/>';
//静态代码
c.html = c.item_html + c.block_html + '>' + '{{- d.html }}' + c.tips_html + '</div></div>';
//单行文本、数组
c.text = c.item_html + c.block_html + '>' + c.text_html + '{{# if(d.id){ }}id="{{ d.id }}"{{# } }} class="layui-input"/>' + c.tips_html + '</div></div>';
//多行文本
c.textarea = c.array = c.item_html + c.block_html + '>' + c.textarea_html + 'class="layui-textarea" {{# if(d.id){ }}id="{{ d.id }}" {{# } }}' + c.vers_html + c.plac_html + '>{{ d.value }}</textarea>' + c.tips_html + '</div></div>';
//键值对组
c.keyval_html = '{{# d.value = d.value || "{}"; layui.each(typeof d.value === "string" ? JSON.parse(d.value) : d.value, function(k, v){ }}<div class="keyval_item"><div class="layui-input-inline"><input type="text" value="{{ k }}" class="layui-input" placeholder="key"></div>'+
'<div class="layui-form-mid">:</div><div class="layui-input-inline"><input type="text" value="{{ v }}" class="layui-input" placeholder="value"></div>'+
'<a class="layui-btn layui-bg-red del"><i class="layui-icon layui-icon-delete"></i></a></div>{{# }); }}';
c.keyval = c.item_html + c.block_html + '><div id="keyval-show-{{ d.name }}" data-name="{{ d.name }}"><input type="hidden" name="{{ d.name }}" id="keyval-input-{{ d.name }}" value="" ' +
'lay-verify="{{ d.verify || \'\' }}" lay-reqtext="{{ d.reqtext || \'\' }}"/>'+ c.keyval_html + '</div><a class="layui-btn keyval-add" id="keyval-add-{{ d.name }}"><i class="layui-icon layui-icon-add-circle"></i> 追加</a>' + c.tips_html + '</div></div>';
//静态文本
c.static = c.item_html + c.block_html + '>' + '<div class="layui-form-mid">{{ d.value }}</div></div></div>';
//密码
c.password = c.item_html + c.block_html + '>' + c.password_html + '{{# if(d.id){ }}id="{{ d.id }}"{{# } }} class="layui-input" lay-affix="eye"/>' + c.tips_html + '</div></div>';
//复选
c.checkbox = c.item_html + c.block_html + '>' + c.checkbox_html + '</div>' + c.tips_html + '</div>';
//单选
c.radio = c.item_html + c.block_html + '>' + c.radio_html + '</div>' + c.tips_html + '</div>';
//日期、时间、日期时间
c.year = c.month = c.date = c.time = c.datetime = c.item_html + c.block_html + '>' + c.text_html + 'class="layui-input" placeholder="yyyy-MM-dd" id="show-date-{{ d.name }}" data-type="{{ d.type}}" data-range="{{ d.range ? true : false }}"/>' + c.tips_html + '</div></div>';
//开关
c.switch = c.item_html + c.block_html + '>' + c.inline_html + ' style="width:62px;">' + c.switch_html + '</div>' + c.tips_html + '</div></div>';
//下拉
c.select = c.item_html + c.block_html + '>' + c.select_html + c.tips_html + '</div></div>';
//标签
c.tags = c.item_html + c.block_html + '>' + c.text_html + 'class="layui-hide" id="show-tags-{{ d.name }}"/>' + c.tips_html + '</div></div>';
//数字
c.number = c.item_html + c.block_html + '>' + c.number_html + c.tips_html + '</div></div>';
//级联地区
c.areas = c.item_html + c.block_html + '>' + c.text_html + 'id="areas-{{ d.name }}" class="layui-input"/>' + c.tips_html + '</div></div>';
//取色器
c.colorpicker = c.item_html + c.block_html + '>' + c.inline_html + ' style="width:120px;">' + c.text_html + 'id="show-colorpicker-{{ d.name }}" placeholder="请选择颜色" class="layui-input"/></div>' + c.inline_html + ' style="left:-11px;width:40px;"><div id="colorpicker-{{ d.name }}"></div></div>' + c.tips_html + '</div></div>';
//百度编辑器
c.ueditor = c.item_html + c.block_html + '>' + c.textarea_html + ' id="ueditor-{{ d.id ? d.id : d.name }}" style="border:0;padding:0;">{{- d.value }}</textarea>' + c.tips_html + '</div></div>';
//Md编辑器
c.cherrymd = c.item_html + c.block_html + '><div '+ c.item_style +'id="cherrymd-{{ d.id ? d.id : d.name }}"></div><textarea id="temp-{{ d.id ? d.id : d.name }}" style="display:none;">{{- d.value }}</textarea>' + c.tips_html + '</div></div>';
//Md编辑器
c.editormd = c.item_html + c.block_html + '><style>.editormd-preview li{list-style:inherit!important}.editormd-code-toolbar>select{display:initial}</style><div id="editormd-{{ d.id ? d.id : d.name }}" style="z-index:1000;">' + c.textarea_html + ' style="display:none;">{{- d.value }}</textarea></div>' + c.tips_html + '</div></div>';
//TinyMCE编辑器
c.tinymce = c.item_html + c.block_html + '>' + c.textarea_html + ' id="tinymce-{{ d.id ? d.id : d.name }}">{{- d.value }}</textarea>' + c.tips_html + '</div></div>';
//上传单图
c.image = c.item_html + c.block_html + '><div id="image-show-{{ d.name }}" data-type="image" data-verify="{{ d.verify || \'\' }}" data-reqtext="{{ d.reqtext || \'\' }}">{{# if (d.value) { }}' +
'<div class="image_item"><img src="{{ d.value }}"/><input type="hidden" name="{{ d.name }}" value="{{ d.value }}"/>'+
'<i class="layui-icon layui-icon-edit item-edit"></i><i class="layui-icon layui-icon-close item-delete"></i></div>{{# }else{ }}<input type="hidden" name="{{ d.name }}" lay-verify="{{ d.verify || \'\' }}" lay-reqtext="{{ d.reqtext || \'\' }}"/>{{# } }}</div>'+
'<div class="image_item layui-upload-drag" style="background:#efefef;" id="up-image-btn-{{ d.name }}" data-type="image" data-name="{{ d.name }}" data-thum="{{ d.thum || 0 }}"><i class="layui-icon">&#xe67c;</i><br/>上传图片</div>'+
'<div style="clear:both"></div>' + c.tips_html + '</div></div>';
//上传多图
c.images = c.item_html + c.block_html + '><div id="image-show-{{ d.name }}" data-type="images" data-verify="{{ d.verify || \'\' }}" data-reqtext="{{ d.reqtext || \'\' }}">{{# var i = 0;layui.each(d.value, function(key, url){ i=1; }}'+
'<div class="image_item"><img src="{{ url }}"/><input type="hidden" name="{{ d.name }}[]" value="{{ url }}"/>'+
'<i class="layui-icon layui-icon-edit item-edit"></i><i class="layui-icon layui-icon-close item-delete"></i></div>{{# }); }}{{# if (i == 0) { }}<input type="hidden" name="{{ d.name }}" lay-verify="{{ d.verify || \'\' }}" lay-reqtext="{{ d.reqtext || \'\' }}"/>{{# } }}</div>'+
'<div class="image_item layui-upload-drag" style="background:#efefef;" id="up-image-btn-{{ d.name }}" data-type="images" data-name="{{ d.name }}" data-thum="{{ d.thum || 0 }}"><i class="layui-icon">&#xe67c;</i><br/>上传图片</div>'+
'<div style="clear:both"></div>' + c.tips_html + '</div></div>';
//上传文件
c.upfile = c.item_html + c.block_html + '>' + c.inline_html + ' style="width:85px;float:right;"><button type="button" class="layui-btn" data-type="{{ d.filetype }}" id="{{ d.id ? d.id : \'upfile-btn-\' + d.name }}">上传文件</button></div>'+
c.block_html + ' style="margin-right:105px;margin-left:0;">'+ c.text_html + 'id="upfile-{{ d.name }}" class="layui-input"/></div>'+
c.tips_html + '</div></div>';
//验证码
c.captcha = c.item_html + c.block_html + ' >' + c.text_html + 'id ="{{ d.name }}" class="layui-input" style="width:150px;float:left;margin-right:10px;"/><div class="box-{{ d.name }}" style="float:left;margin-right:10px;"><a class="layui-btn layui-btn-primary">点击获取验证码</a></div>' + c.tips_html + '</div></div>';
//关联项
c.relation = [];
//上传单图
c.imagewt = '<div id="image-show-{{ d.name }}" data-type="image" data-verify="{{ d.verify || \'\' }}" data-reqtext="{{ d.reqtext || \'\' }}">{{# if (d.value) { }}' +
'<div class="image_item"><img src="{{ d.value }}"/><input type="hidden" name="{{ d.name }}" value="{{ d.value }}"/>'+
'<i class="layui-icon layui-icon-edit item-edit"></i><i class="layui-icon layui-icon-close item-delete"></i></div>{{# }else{ }}<input type="hidden" name="{{ d.name }}" lay-verify="{{ d.verify || \'\' }}" lay-reqtext="{{ d.reqtext || \'\' }}"/>{{# } }}</div>'+
'<div class="image_item layui-upload-drag" style="background:#efefef;" id="up-image-btn-{{ d.name }}" data-type="image" data-name="{{ d.name }}" data-thum="{{ d.thum || 0 }}"><i class="layui-icon">&#xe67c;</i><br/>上传图片</div>'+
'</div>';
//上传多图
c.imageswt = '<div id="image-show-{{ d.name }}" data-type="images" data-verify="{{ d.verify || \'\' }}" data-reqtext="{{ d.reqtext || \'\' }}">{{# var i = 0;layui.each(d.value, function(key, url){ i=1; }}'+
'<div class="image_item"><img src="{{ url }}"/><input type="hidden" name="{{ d.name }}[]" value="{{ url }}"/>'+
'<i class="layui-icon layui-icon-edit item-edit"></i><i class="layui-icon layui-icon-close item-delete"></i></div>{{# }); }}{{# if (i == 0) { }}<input type="hidden" name="{{ d.name }}" lay-verify="{{ d.verify || \'\' }}" lay-reqtext="{{ d.reqtext || \'\' }}"/>{{# } }}</div>'+
'<div class="image_item layui-upload-drag" style="background:#efefef;" id="up-image-btn-{{ d.name }}" data-type="images" data-name="{{ d.name }}" data-thum="{{ d.thum || 0 }}"><i class="layui-icon">&#xe67c;</i><br/>上传图片</div>'+
'</div>';
//上传文件
c.upfilewt = c.inline_html + ' style="width:85px;float:right;"><button type="button" class="layui-btn" data-type="{{ d.filetype }}" id="{{ d.id ? d.id : \'upfile-btn-\' + d.name }}">上传文件</button></div>'+
c.block_html + ' style="margin-right:105px;margin-left:0;">'+ c.text_html + 'id="upfile-{{ d.name }}" class="layui-input"/></div>'+
c.tips_html + '</div></div>';
var b = {
on: function(o,m,t){
// 记录关联项,用于渲染完成后显示选中的关联项
if(m && (t=='switch' || t=='radio')) c.relation.push({name:o,obj:m});
// 监听变化并回调
form.on(t +'('+ o +')',function(data){
if(t=='switch' && m){
var obj = $("[id^='item-"+ m + '_' + data.value +"']");
data.elem.checked ? obj.show() : obj.hide();
}else if(t=='radio' && m){
$("[id^='item-"+ m +"_']").hide();
$("[id^='item-"+ m + '_' + data.value +"']").show();
}
typeof c.success === 'function' && c.success(data, o);
});
},
render: function(d){
// $h = $("#"+ d.bid); //绑定ID
if(c.fjbid){
$h = $("#"+ d.fjbid).find("#"+ d.bid);
}else{
$h = $("#"+ d.bid);
}
c.gid = d.gid || -1; //上传资源分组ID
c.map = d.map || 'admin/system.upload/'; //上传接口
b.init();
},
build: function(d){
c.relation = []; //关联项清空
c.bid = d.bid || ''; //绑定ID
c.fjbid = d.fjbid || ''; //绑定ID
c.gid = d.gid || -1; //上传资源分组ID
c.map = d.map || 'admin/system.upload/'; //上传接口
c.url = d.url || ''; //构建项json数据接口
c.data = d.data || []; //构建项json数据
c.space = d.space ? ' '+d.space : ''; //栅格间隙 layui-col-space[n]
c.style = d.style ? '<style>'+ d.style + '</style>' : ''; //追加自定义样式
c.success = d.success || '';
if(c.data.length > 0 || c.data.constructor === Object){
b.settwt(c.data);
}else{
var load = layer.load(2);
$.getJSON(c.url, function(res){
layer.close(load);
if(res.code === 1){
b.sett(res.data);
}else{
layer.msg(res.msg,{anim:6});
}
});
}
},
sett: function(data){ //data: 二维数组[{name:标识,title:标题,group:分组,type:类型,value:值,options:选项},{}]
var html = '', str = '', tab_t = '', tab_c = '';
if(c.fjbid){
$h = $("#"+ c.fjbid).find("#"+ c.bid);
}else{
$h = $("#"+ c.bid);
}
f = []; //清空方法组
for(var i in data){
var d = data[i];
if(d.type=='layui_tab'){
tab_t += '<li'+ (d.showTab ? ' class="layui-this"' : '') +'>'+ d.title +'</li>';
tab_c += '<div class="layui-tab-item'+(d.showTab ? ' layui-show' : '')+ c.space +'">';
for(var j in d.data){
var dd = d.data[j];
if(c[dd.type]){
str = b.tpl(c[dd.type],dd);
if(dd.callBack && typeof dd.callBack === 'function') f[dd.name] = dd.callBack;
tab_c += (dd.itemCol ? '<div class="'+ dd.itemCol +'">' + str + '</div>' : str);
}
}
tab_c += '</div>';
}else if(c[d.type]){
str = b.tpl(c[d.type],d);
if(d.callBack && typeof d.callBack === 'function') f[d.name] = d.callBack;
html += (d.itemCol ? '<div class="'+ d.itemCol +'">' + str + '</div>' : str);
}
}
html += tab_t ? '<div class="layui-tab layui-tab-brief"><ul class="layui-tab-title">'+tab_t+'</ul><div class="layui-tab-content">'+tab_c+'</div></div>' : !$h.addClass(c.space) || '';
$h.html(c.style + html);
form.render(null,c.bid+'_form');
//显示选中的关联项
$.each(c.relation,function(i,v){
let ra = $h.find('input[name="'+v.name+'"]:checked').val();
$("[id^='item-"+v.obj+"_"+ra+"']").show();
});
b.init();
//回调并监听输入框变化
if(typeof c.success === 'function'){
c.success(null, '_init_');
$h.find('input, textarea').on('input', function() { c.success({value: this.value}, this.name); });
}
},
settwt: function(data){ //data: 二维数组[{name:标识,title:标题,group:分组,type:类型,value:值,options:选项},{}]
var html = '', str = '', tab_t = '', tab_c = '';
// $h = $("#"+ c.bid);
if(c.fjbid){
$h = $("#"+ c.fjbid).find("#"+ c.bid);
}else{
$h = $("#"+ c.bid);
}
f = []; //清空方法组
for(var i in data){
var d = data[i];
str = b.tpl(c[d.type],d);
// if(d.callBack && typeof d.callBack === 'function') f[d.name] = d.callBack;
html += str;
}
// html += tab_t ? '<div class="layui-tab layui-tab-brief"><ul class="layui-tab-title">'+tab_t+'</ul><div class="layui-tab-content">'+tab_c+'</div></div>' : !$h.addClass(c.space) || '';
$h.html(html);
// form.render(null,c.bid+'_form');
b.init();
},
init: function(){
//渲染时间
b.rendTime();
//渲染标签
b.rendTags();
//渲染地区
b.rendAreas();
//渲染取色器
b.rendColorpicker();
//注册相册
b.Photos();
//注册拖动
b.ddSort();
//注册编图
b.regAction();
//注册图库
b.regUpload();
//注册上传文件
b.regUpFile();
//百度编辑器
b.uEditor();
//MD编辑器
b.cherryMd();
//MD编辑器
b.editorMd();
//TinyMCE编辑器
b.TinyMCE();
},
rendTime: function(){
$h.find("[id^='show-date-']").each(function(){
layui.laydate.render({elem:'#'+ $(this).attr('id'),type:$(this).data('type'),range:$(this).data('range')});
});
},
rendTags: function(){
$h.find("[id^='show-tags-']").each(function(){
$('#'+ $(this).attr('id')).tagsInput();
});
},
rendAreas:function(){
if($h.find("[id^='areas-']").length > 0){
b.getCT(function(){
$h.find("[id^='areas-']").each(function(){
var id = $(this).attr('id'), name = $(this).attr('name');
layui.cascader.render({
elem: "#"+ id,
data: cityData,
itemHeight: '260px',
filterable: true, //开启搜索
changeOnSelect: true, //选择即改变
onChange: f[name]
});
});
});
}
},
rendColorpicker: function(){
$h.find("[id^='colorpicker-']").each(function(){
var id = $(this).attr('id');
layui.colorpicker.render({elem:'#'+ id,color:$('#show-' + id).val(),done:function(color){$('#show-' + id).val(color);}});
});
},
Photos: function(){
$h.find("[id^='image-show-']").each(function(){
var id = '#'+ $(this).attr('id');
layer.photos({photos:id,anim:1,shade:[0.4,'#000']});
});
},
regUpFile: function(){
$h.find("[id^='upfile-btn-']").each(function(){
var id = '#'+ $(this).attr('id'),type = $(this).data('type') || 'file';
var name = id.split('-')[2];
layui.upload.render({
elem: id,
url: c.map + "upfile?action=" + type,
accept: "file",
done: function(res){
layer.msg(res.msg,{shade:[0.4,'#000'],time:2000},function(){
if(res.code==1){
$("#upfile-" + name).val(res.data.fileurl);
$("#size-" + name).val(res.data.filesize+'KB');
}
});
}
});
layer.photos({photos:id,anim:1,shade:[0.4,'#000']});
});
},
ddSort: function(){
var ids = [];
$h.find("[id^='image-show-']").each(function(){
if($(this).data('type')=='images') ids.push($(this).attr('id'));
});
$h.find("[id^='keyval-show-']").each(function(){
ids.push($(this).attr('id'));
b.setArr($(this).data('name')); // 初始赋值到隐藏域
});
if(ids.length > 0){
layui.define(function(e){
$ = layui.$;window.jQuery = layui.$;
jQuery.getScript(static + "script/ddsort/ddsort.js").done(function(){
e('DDSort',jQuery);
if(ids.length > 0){
for(var i in ids){
let rs = ids[i].split("-");
$("#"+ids[i]).DDSort({
target: '.'+ rs[0] +'_item',
delay: 100, // 延时处理,默认为 50 ms,防止手抖点击 A 链接无效
floatStyle:{
'border': '1px solid #ccc',
'background-color': '#fff'
},
up:function(){if(rs[0]=='keyval') b.setArr(rs[2]);}
});
}
}
}).fail(function(){
layui.hint().error('加载DDSort.js失败');
});
});
}
},
regAction: function(){
$h.find("[id^='image-show-']").on('click','.image_item .item-edit', function(){
var $this = $(this);
var $img = $this.parent().children('img');
var $input = $this.parent().children('input');
layui.admin.cropImg({
title: '编辑图像',
imgSrc: $img.attr('src'),
aspectRatio: 0,
acceptMime: 'image/*',
onCrop: function (base64){
var formData = new FormData();
var timestamp = Date.parse(new Date());
formData.append('file', layui.admin.util.toBlob(base64), timestamp + '.jpg');
var loadIndex = layer.load(2);
$.ajax({
method: "post",
url: c.map + "upfile?action=image&groupid=" + c.gid,
data: formData,
processData: false,
contentType: false,
dataType: "json",
success: function (res){
if(res.code==1) {
$img.attr('src',base64);
$input.val(res.data.fileurl);
}else{
layer.msg(res.msg,{icon:2,shade:[0.4,'#000'],time:1500});
}
layer.close(loadIndex);
}
});
}
});
});
$h.find("[id^='image-show-']").on('click','.image_item .item-delete', function(){
var $this = $(this), noClick = $this.data('noClick'), name = $this.data('name');
if (noClick) {return false;}
layer.confirm('您确定要删除该' + (name ? name : '图片') + '吗?', {
title: '友情提示'
}, function (index){
var pparent = $this.parent().parent();
$this.parent().remove();
if(pparent.children().length==0){
let name = pparent.attr('id').replace("image-show-","");
pparent.html('<input type="hidden" name="'+ name +'" lay-verify="'+ pparent.data('verify') +'" lay-reqtext="'+ pparent.data('reqtext') +'"/>');
}
layer.close(index);
});
});
$h.find("[id^='keyval-add-']").on('click',function(){
var id = $(this).attr('id');
var name = id.split('-')[2];
var str = b.tpl(c.keyval_html,{value:{'':''}});
$("#keyval-show-"+name).append(str);
});
$h.find("[id^='keyval-show-']").on('click','.keyval_item .del',function(){
var name = $(this).parent().parent().data('name');
$(this).parent().remove();
b.setArr(name);
});
$h.find("[id^='keyval-show-']").on('blur','.keyval_item input',function(){
b.setArr($(this).parent().parent().parent().data('name'));
});
},
regUpload: function(){
$h.find("[id^='up-image-btn-']").on('click', function(){
console.log($h);
var $this = $(this);
var type = $this.data('type');
var name = $this.data('name');
var thum = $this.data('thum');
fileLibrary.open({title:'图片管理',thum:thum,groupid:c.gid,url:c.map},function(res){
if(res.length == 0) return;
// var $pbox = $h.find("#image-show-" + name);
var $pbox = $(this).find("#image-show-" + name);
if(type=='image'){
$pbox.html('<div class="image_item"><img src="'+ res[0].file_path +'" /><input type="hidden" name="'+ name +'" value="'+ res[0].file_path +'"><i class="layui-icon layui-icon-edit item-edit"></i><i class="layui-icon layui-icon-close item-delete"></i></div>');
// $htmls = '<div class="image_item"><img src="'+ res[0].file_path +'" /><input type="hidden" name="'+ name +'" value="'+ res[0].file_path +'"><i class="layui-icon layui-icon-edit item-edit"></i><i class="layui-icon layui-icon-close item-delete"></i></div>'
// $("#image-show-" + name).html($htmls);
}else{
if($pbox.children('input').length>0) $pbox.html('');
for(var i in res){
var v = res[i];
$pbox.append('<div class="image_item"><img src="'+ v.file_path +'" /><input type="hidden" name="'+ name +'[]" value="'+ v.file_path +'"><i class="layui-icon layui-icon-edit item-edit"></i><i class="layui-icon layui-icon-close item-delete"></i></div>');
}
// if( $("#image-show-" + name).children('input').length>0) $("#image-show-" + name).html('');
// for(var i in res){
// var v = res[i];
// $("#image-show-" + name).append('<div class="image_item"><img src="'+ v.file_path +'" /><input type="hidden" name="'+ name +'[]" value="'+ v.file_path +'"><i class="layui-icon layui-icon-edit item-edit"></i><i class="layui-icon layui-icon-close item-delete"></i></div>');
// }
}
b.Photos();
});
});
},
uEditor: function(){
var ids = [];
$h.find("[id^='ueditor-']").each(function(){
ids.push($(this).attr('id'));
});
if(ids.length > 0){
b.getUE(function(){
for(var i in ids){
let eid = ids[i], isOpen = $("#"+eid).parents('.layui-layer-content').length, height = $("#"+eid).parent().parent().height() - 110; height = height > 200 ? height : 200;
UE.delEditor(eid); //先销毁 实现每次重新加载
UE.getEditor(eid,{
initialFrameHeight: height,
toolbars: [[
'fullscreen','source','|','undo','redo','|','bold','italic','underline','fontborder','strikethrough','superscript','subscript','removeformat','pasteplain','|',
'forecolor','backcolor','insertorderedlist','insertunorderedlist','selectall','|','justifyleft','justifycenter','justifyright','justifyjustify','|',
'rowspacingtop','rowspacingbottom','lineheight','|','fontfamily','fontsize','insertcode','|','link','unlink','|','imagenone','imageleft','imageright','imagecenter','|',
'insertvideo','attachment','map','|','inserttable','deletetable','insertparagraphbeforetable','insertrow','deleterow','insertcol','deletecol','mergecells','mergeright','mergedown',
'splittocells','splittorows','splittocols','charts','|','horizontal','emotion','print','preview'
]],
wordCount: false,
autoFloatEnabled: false,
autosave: false, //saveInterval: 5000,
zIndex: isOpen ? 19991000 : 999,
cpos: isOpen ? 'fixed' : '', //isOpen来判断是否为弹窗 弹出窗口中编辑器兼容可全屏
UEDITOR_HOME_URL: static + 'ueditor/',
serverUrl: c.map + 'ueditor?groupid=' + c.gid
});
UE.registerUI('插入图片', function(editor, uiName){
var btn = new UE.ui.Button({
name: uiName,
title: uiName,
cssRules: 'background-position:-380px 0;',
onclick: function(){
fileLibrary.open({title:'图片管理',groupid:c.gid,url:c.map},function(res){
if(res.length == 0) return;
var html = '';
for(var i in res){
var v = res[i];
html = html + '<p><img src="'+ v.file_path +'" /></p>';
}
editor.execCommand('insertHtml', html);
});
}
});
editor.addListener('selectionchange', function(){ //源码模式时按钮变灰切换
var state = editor.queryCommandState(uiName);
if(state == -1){btn.setDisabled(true);btn.setChecked(false);}else{btn.setDisabled(false);btn.setChecked(state);}
});
return btn;
},43);
};
});
}
},
cherryMd: function(){
var ids = [],obj = [];
$h.find("[id^='cherrymd-']").each(function(){
ids.push($(this).attr('id'));
});
if(ids.length > 0){
b.getCM(function(){
for(var i in ids){
let eid = ids[i], heg = $("#"+eid).parent().parent().height() - 10; heg = heg>400 ? heg : 400;
let name = eid.split("-")[1],k = i;
obj[i] = new Cherry({
id:eid,
engine:{syntax:{codeBlock:{wrap:false}}},
editor:{height:heg+'px',id:name,name:name,value:$('#temp-'+name).val(),autoSave2Textarea:true,codemirror:{autofocus:false}},
callback:{afterInit:function(){$("textarea[name='"+name+"']")[0].value=$('#temp-'+name).val();}},
toolbars:{
toolbar: ['bold','italic','strikethrough','justify','|','header','list','panel','graph','|','vimg',{insert:['vado','vido','br','code','table','line-table','bar-table','link','linkOut','hr','detail']},'export','settings'],
toolbarRight: ['fullScreen'],
sidebar: ['mobilePreview', 'copy', 'theme'],
customMenu:{
vimg:Cherry.createMenuHook('图库',{onClick:function(){
fileLibrary.open({title:'图片管理',groupid:c.gid,url:c.map},function(res){
if(res.length == 0) return;
var html = '',v = '';
for(var n in res){
v = res[n];
html = html + '![说明#100%]('+ v.file_path +')\n';
}
obj[k].insert(html);
});
}}),
vido:Cherry.createMenuHook('视频',{iconName:'video',onClick:function(){return '!video[描述](url){poster=封面}';}}),
vado:Cherry.createMenuHook('音频',{iconName:'video',onClick:function(){return '!audio[描述](url)';}}),
linkOut:Cherry.createMenuHook('外链接',{iconName:'link',onClick:function(){return '[https://www.veitool.com](https://www.veitool.com){target=_blank}';}})
}
}
});
}
});
}
},
editorMd: function(){
var ids = [];
$h.find("[id^='editormd-']").each(function(){
ids.push($(this).attr('id'));
});
if(ids.length > 0){
b.getEM(function(){
for(var i in ids){
let heg = $("#"+ids[i]).parent().parent().height() - 10; heg = heg>400 ? heg : 400;
editormd(ids[i],{
width: "100%",
height: heg,
emoji: true,
tex: true,
codeFold : true,
flowChart: true,
htmlDecode: true,
sequenceDiagram: true,
//saveHTMLToTextarea : true,
path: static + "editormd/lib/",
toolbarIcons: function(){
return ["undo","redo","|","bold","del","italic","quote","ucwords","uppercase","lowercase","|","h1","h2","h3","h4","h5","h6","|","list-ul","list-ol","hr","link","reference-link","file","|","code","preformatted-text","code-block","table","html-entities","watch","preview","clear","fullscreen","help"]
},
toolbarIconsClass:{file:"fa-picture-o"},
toolbarHandlers:{
file:function(cm){
fileLibrary.open({title:'图片管理',groupid:c.gid,url:c.map},function(res){
if(res.length == 0) return;
var html ='',v = '';
for(var i in res){
v = res[i];
html = html + '<p><img src="'+ v.file_path +'" /></p>';
}
cm.replaceSelection("[![说明]("+ v.file_path +" \"说明\")](https://www.veitool.com \"说明\")");
});
}
}
});
}
});
}
},
TinyMCE: function(){
var ids = [];
$h.find("[id^='tinymce-']").each(function(){
ids.push($(this).attr('id'));
});
if(ids.length > 0){
b.getTE(function(){
tinymce.remove();
for(var i in ids){
let heg = $("#"+ ids[i]).height(); heg = heg>400 ? heg : 400;
tinymce.init({
selector: '#'+ ids[i],
min_height: heg,
suffix: '.min',
branding: false,
language:'zh_CN',
base_url: static + 'tinymce',
relative_urls : false,
plugins: 'preview searchreplace autolink directionality visualblocks visualchars fullscreen image link media template code codesample charmap pagebreak nonbreaking anchor insertdatetime table advlist lists wordcount help emoticons autosave autoresize vimgs',
toolbar: 'code undo redo forecolor backcolor bold italic underline strikethrough removeformat image vimgs media link | alignleft aligncenter alignright alignjustify lineheight fullscreen | \ styles blocks fontfamily fontsize | outdent indent bullist numlist blockquote',
font_size_formats: '12px 14px 16px 18px 24px 36px 48px 56px 72px',
font_family_formats: '微软雅黑=Microsoft YaHei,Helvetica Neue,PingFang SC,sans-serif;苹果苹方=PingFang SC,Microsoft YaHei,sans-serif;宋体=simsun,serif;仿宋体=FangSong,serif;黑体=SimHei,sans-serif;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;',
file_picker_callback: function(callback,value,meta){
var upurl = c.map + "upfile?action=image&groupid=" + c.gid;
var filetype = '.jpg, .jpeg, .png, .gif';
if(meta.filetype === 'file'){
upurl = c.map + "upfile?action=file&groupid=" + c.gid;
filetype = '.pdf, .txt, .zip, .rar, .7z, .doc, .docx, .xls, .xlsx, .ppt, .pptx';
}else if(meta.filetype === 'media'){
upurl = c.map + "upfile?action=video&groupid=" + c.gid;
filetype = '.mp3, .mp4';
}
var input = document.createElement('input');input.setAttribute('type', 'file');input.setAttribute('accept', filetype);input.click();/*模拟出一个input用于添加本地文件*/
input.onchange = function(){
var xhr = new XMLHttpRequest(), formData = new FormData(), file = this.files[0];
xhr.withCredentials = false;
xhr.open('POST',upurl);
xhr.onload = function(){
if(xhr.status != 200){
alert('HTTP Error: ' + xhr.status);return;
}
var res = JSON.parse(xhr.responseText);
if(!res || typeof res.data.fileurl != 'string'){
alert('Invalid JSON: ' + xhr.responseText);return;
}
callback(res.data.fileurl,{title:file.name});
};
formData.append('file', file, file.name);
xhr.send(formData);
};
},
vimgs_upload_hander: function(editor){
fileLibrary.open({title:'图片管理',groupid:c.gid,url:c.map},function(res){
if(res.length == 0) return;
var html = '';
for(var i in res){
var v = res[i];
html = html + '<p><img src="'+ v.file_path +'" /></p>';
}
editor.insertContent(html);
});
},
setup: function(editor){editor.on('change',function(){editor.save();})}
});
}
});
}
},
getCT: function(success){
if(window.cityData){
typeof success === 'function' && success();
}else{
$.getScript(static + "script/cityData.js", function(){
window.cityData = cityData;
typeof success === 'function' && success();
});
}
},
getUE: function(success){
if(window.UE){
typeof success === 'function' && setTimeout(function(){success()},100);
}else{
$.getScript(static + "ueditor/ueditor.all.min.js", function(){
window.UE = UE;
typeof success === 'function' && success();
});
}
},
getCM: function(success){
if(window.Cherry){
typeof success === 'function' && setTimeout(function(){success()},500);/*延迟:解决存在于OPEN窗口中时编辑区的渲染尺寸问题*/
}else{
layui.link(static + "cherrymd/cherry-markdown.min.css");
$.getScript(static + "cherrymd/cherry-markdown.min.js", function(){
window.Cherry = Cherry;
typeof success === 'function' && success();
});
}
},
getEM: function(success){
if(window.editormd){
typeof success === 'function' && setTimeout(function(){success()},100);
}else{
layui.link(static + "editormd/css/editormd.min.css");
$.getScript(static + "editormd/editormd.min.js", function(){
window.editormd = editormd;
typeof success === 'function' && success();
});
}
},
getTE: function(success){
if(window.tinymce){
typeof success === 'function' && success();
}else{
$.getScript(static + "tinymce/tinymce.min.js", function(){
window.tinymce = tinymce;
typeof success === 'function' && success();
});
}
},
setArr: function(name){
var obj = {}, val;
$h.find("#keyval-show-"+ name +" .keyval_item").each(function(){
let key = $(this).find("input:eq(0)").val();
if(key) obj[key] = $(this).find("input:eq(1)").val();
});
val = JSON.stringify(obj);
$("#keyval-input-"+name).val(val==='{}' ? '' : val);
},
tpl: function(t,d){var h='';layui.laytpl(t).render(d,function(r){h=r;});return h;}
};
e("buildItems",b);
});
\ No newline at end of file
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