mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-19 12:28:15 +08:00
新增文档分类列表树
This commit is contained in:
@ -35,15 +35,6 @@ namespace FreeSql.Site.UI.Areas.Admin.Controllers
|
||||
return View(model);
|
||||
}
|
||||
|
||||
#region 文档分类
|
||||
public IActionResult DocType()
|
||||
{
|
||||
DocumentType model = new DocumentType();
|
||||
return View(model);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 文档内容
|
||||
public IActionResult DocContent()
|
||||
{
|
||||
@ -82,7 +73,7 @@ namespace FreeSql.Site.UI.Areas.Admin.Controllers
|
||||
|
||||
public ActionResult DocContentEditModule(string id)
|
||||
{
|
||||
ViewBag.DocumentTypeList = DocumentTypeDAL.Query(w => w.Status == 1).Select(s => new SelectListItem { Text = s.TypeName, Value = s.ID.ToString() }).ToList();
|
||||
ViewBag.DocumentTypeList = DocumentTypeDAL.Query(w => w.Status == 1).list.Select(s => new SelectListItem { Text = s.TypeName, Value = s.ID.ToString() }).ToList();
|
||||
DocumentContent model = new DocumentContent();
|
||||
if (!string.IsNullOrEmpty(id))
|
||||
{
|
||||
@ -140,6 +131,109 @@ namespace FreeSql.Site.UI.Areas.Admin.Controllers
|
||||
return Json(resdata);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 文档分类
|
||||
public IActionResult DocType()
|
||||
{
|
||||
DocumentType model = new DocumentType();
|
||||
|
||||
ViewBag.TypeList = DocumentTypeDAL.Query(w => w.Status == 1).list.Select(s => new DocumentTypeTreeNode
|
||||
{
|
||||
id = s.ID.ToString(),
|
||||
pid = (s.UpID ?? 0).ToString(),
|
||||
title = s.TypeName,
|
||||
tag = s.Tag,
|
||||
createdt = s.CreateDt
|
||||
}).ToList();
|
||||
|
||||
return View(model);
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
public IActionResult DocTypeList(string searchContent, string seniorQueryJson, int page = 1, int limit = 10)
|
||||
{
|
||||
DocumentType model = null;
|
||||
if (!string.IsNullOrWhiteSpace(seniorQueryJson))
|
||||
{
|
||||
model = Newtonsoft.Json.JsonConvert.DeserializeObject<DocumentType>(seniorQueryJson);
|
||||
}
|
||||
Expression<Func<DocumentType, bool>> predicate = i => 1 == 0;
|
||||
var searchPredicate = PredicateExtensions.True<DocumentType>();
|
||||
if (model != null)
|
||||
{
|
||||
searchPredicate = searchPredicate.And(u => u.Status == 1);
|
||||
}
|
||||
var contents = DocumentTypeDAL.Query(searchPredicate);
|
||||
|
||||
return Json(new DataPage<DocumentType>
|
||||
{
|
||||
code = "0",
|
||||
msg = "",
|
||||
count = contents.count,
|
||||
data = contents.list
|
||||
});
|
||||
}
|
||||
|
||||
public ActionResult DocTypeEditModule(string id)
|
||||
{
|
||||
DocumentType model = new DocumentType();
|
||||
if (!string.IsNullOrEmpty(id))
|
||||
{
|
||||
int _id = Convert.ToInt32(id);
|
||||
model = DocumentTypeDAL.GetByOne(w => w.ID == _id);
|
||||
}
|
||||
return View(model);
|
||||
}
|
||||
|
||||
// POST: Documents/Create
|
||||
[HttpPost]
|
||||
//[ValidateAntiForgeryToken]
|
||||
public ActionResult DocTypeCreate([FromBody]DocumentContent model)
|
||||
{
|
||||
var resdata = AutoException.Excute<long>((result) =>
|
||||
{
|
||||
result.Data = DocumentContentDAL.Insert(model);
|
||||
if (result.Data == 0)
|
||||
{
|
||||
throw new Exception("数据新增异常,JSON:" + Newtonsoft.Json.JsonConvert.SerializeObject(model));
|
||||
}
|
||||
}, false);
|
||||
return Json(resdata);
|
||||
}
|
||||
|
||||
// POST: Documents/Create
|
||||
[HttpPost]
|
||||
//[ValidateAntiForgeryToken]
|
||||
public ActionResult DocTypeUpdate([FromBody]DocumentContent model)
|
||||
{
|
||||
var resdata = AutoException.Excute<bool>((result) =>
|
||||
{
|
||||
model.UpdateBy = "admin";
|
||||
model.UpdateDt = DateTime.Now;
|
||||
result.Data = DocumentContentDAL.Update(model);
|
||||
if (result.Data == false)
|
||||
{
|
||||
throw new Exception("数据新增异常,JSON:" + Newtonsoft.Json.JsonConvert.SerializeObject(model));
|
||||
}
|
||||
}, false);
|
||||
return Json(resdata);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[ValidateAntiForgeryToken]
|
||||
public ActionResult DocTypeDelete(int id, IFormCollection collection)
|
||||
{
|
||||
var resdata = AutoException.Excute<long>((result) =>
|
||||
{
|
||||
if (!DocumentContentDAL.Delete(id))
|
||||
{
|
||||
throw new Exception("数据删除异常,ID:" + id);
|
||||
}
|
||||
}, false);
|
||||
return Json(resdata);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
@ -16,7 +16,7 @@
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm" lay-event="add">添加</button>
|
||||
@*<button class="layui-btn layui-btn-sm" lay-event="delete">删除</button>
|
||||
<button class="layui-btn layui-btn-sm" lay-event="update">编辑</button>*@
|
||||
<button class="layui-btn layui-btn-sm" lay-event="update">编辑</button>*@
|
||||
<div style="float:right;border:0px solid red;">
|
||||
<input type="text" name="search_txt" lay-verify="title" autocomplete="off" placeholder="标题" class="layui-input" style="height: 30px;width:160px;float:left;">
|
||||
<a href="#" style="line-height:30px;margin-left:8px;">高级查询</a>
|
||||
@ -30,21 +30,11 @@
|
||||
</script>
|
||||
|
||||
<script>
|
||||
var testEditor;
|
||||
layui.use(['form', 'layedit', 'laydate', 'table'], function () {
|
||||
var contentEdit;
|
||||
layui.use(['form', 'table'], function () {
|
||||
var table = layui.table;
|
||||
var form = layui.form
|
||||
, layer = layui.layer
|
||||
, layedit = layui.layedit
|
||||
, laydate = layui.laydate;
|
||||
|
||||
//日期
|
||||
laydate.render({
|
||||
elem: '#date'
|
||||
});
|
||||
laydate.render({
|
||||
elem: '#date1'
|
||||
});
|
||||
, layer = layui.layer;
|
||||
|
||||
|
||||
table.render({
|
||||
@ -65,7 +55,7 @@
|
||||
, { fixed: 'right', title: '操作', toolbar: '#barDemo', width: 150 }
|
||||
]]
|
||||
, page: true
|
||||
, id : 'docContentTable'
|
||||
, id: 'docContentTable'
|
||||
});
|
||||
|
||||
var reloadTable = function () {
|
||||
@ -77,6 +67,26 @@
|
||||
});
|
||||
};
|
||||
|
||||
var deleteObj = function (removeRowDatas) {
|
||||
layer.confirm('确定要删除吗?', function (index) {
|
||||
//调用删除
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: "/Admin/Document/DocContentDelete",
|
||||
data: { id: rowid },
|
||||
dataType: "html",
|
||||
success: function (data) {
|
||||
obj.del();
|
||||
layer.close(index);
|
||||
},
|
||||
error: function () {
|
||||
layer.close(index);
|
||||
layer.alert("删除失败!");
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
//监听事件
|
||||
table.on('toolbar(test)', function (obj) {
|
||||
var checkStatus = table.checkStatus(obj.config.id);
|
||||
@ -91,10 +101,11 @@
|
||||
},
|
||||
callback: reloadTable
|
||||
};
|
||||
dialogWindow.create(options);
|
||||
freejs.dialogWindow.create(options);
|
||||
break;
|
||||
case 'delete':
|
||||
layer.msg('删除');
|
||||
var data = checkStatus.data;
|
||||
deleteObj(data);
|
||||
break;
|
||||
case 'update':
|
||||
layer.msg('编辑');
|
||||
@ -106,6 +117,7 @@
|
||||
table.on('tool(test)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === 'del') {
|
||||
deleteObj(obj.data);
|
||||
layer.confirm('确定要删除吗?', function (index) {
|
||||
//调用删除
|
||||
$.ajax({
|
||||
@ -133,92 +145,10 @@
|
||||
},
|
||||
callback: reloadTable
|
||||
};
|
||||
dialogWindow.create(options);
|
||||
|
||||
//form.render();
|
||||
//layer.prompt({
|
||||
// formType: 2
|
||||
// , value: data.email
|
||||
//}, function (value, index) {
|
||||
// obj.update({
|
||||
// email: value
|
||||
// });
|
||||
// layer.close(index);
|
||||
//});
|
||||
freejs.dialogWindow.create(options);
|
||||
}
|
||||
});
|
||||
|
||||
//先简单封装下
|
||||
var dialogWindow = {
|
||||
create: function (options, formpage) {
|
||||
$("#docContentEdit").load(options.url, options.paramters, function (responseText, textStatus, jqXHR) {
|
||||
switch (textStatus) {
|
||||
case "success":
|
||||
dialogWindow.open($.extend({
|
||||
type: 1,
|
||||
maxmin: true,
|
||||
title: "编辑",
|
||||
area: ['1100px', '660px'],
|
||||
shadeClose: false, //点击遮罩关闭
|
||||
content: responseText,
|
||||
submit: {
|
||||
url: "/Admin/Document/DocContentCreate",
|
||||
}
|
||||
}, options), form);
|
||||
break;
|
||||
case "error":
|
||||
freejs.showMessage({ title: "提示", msg: "页面加载失败", type: 2 });
|
||||
break;
|
||||
}
|
||||
});
|
||||
},
|
||||
open: function (options, form) {
|
||||
var base_options = {
|
||||
type: 1,
|
||||
maxmin: true,
|
||||
title: "编辑",
|
||||
area: ['1100px', '660px'],
|
||||
shadeClose: false //点击遮罩关闭
|
||||
};
|
||||
var new_options = $.extend(base_options, options);
|
||||
new_options.success = function (layero, index) {
|
||||
form.render();
|
||||
$(".form-module-content").height(dialog_Paramters.height - 110);
|
||||
testEditor = editormd("md_DocContent", {
|
||||
width: "96%",
|
||||
height: 640,
|
||||
syncScrolling: "single",
|
||||
path: "../../lib/editormd/lib/"
|
||||
});
|
||||
//监听提交
|
||||
form.on('submit(formDemo)', function (data) {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: options.submit.url,//"/Admin/Document/DocContentCreate",
|
||||
data: JSON.stringify(data.field),
|
||||
contentType: "application/json; charset=utf-8",
|
||||
dataType: "json",
|
||||
success: function (e) {
|
||||
if (e.Status == 1) {
|
||||
freejs.showMessage({ title: "提示", msg: e.Msg || "保存成功", type: 1 });
|
||||
if ($.isFunction(new_options.callback)) new_options.callback();
|
||||
layer.close(index);
|
||||
}
|
||||
else {
|
||||
freejs.showMessage({ title: "提示", msg: e.Msg, type: 2 });
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
}
|
||||
layer.open(new_options);
|
||||
},
|
||||
close: function () {
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
$(document).on('click', '#btnSubmit', function () {
|
||||
layer.msg('响应点击事件');
|
||||
});
|
||||
|
@ -3,125 +3,108 @@
|
||||
|
||||
//Layout = "~/Areas/Admin/Shared/_Layout.cshtml";
|
||||
}
|
||||
<style>
|
||||
body {
|
||||
padding: 10px 30px;
|
||||
}
|
||||
|
||||
<div id="myeditor" style="display: none">
|
||||
<!-- 富文本编辑器 -->
|
||||
<div id="test-editormd"></div>
|
||||
</div>
|
||||
|
||||
<div id="markdownToHTML" style="margin-left: 100px">
|
||||
<textarea id="content" style="display:none;" placeholder="markdown语言"></textarea>
|
||||
</div>
|
||||
|
||||
<div class="layui-btn-container" style="margin: 10px">
|
||||
<button id="showEditor" class="layui-btn">显示编辑器</button>
|
||||
<button id="getMarkdownContent" class="layui-btn">获取Markdown源码</button>
|
||||
<button id="getHtmlContent" class="layui-btn">获取Html源码</button>
|
||||
<button id="showHTML" class="layui-btn">Markdown解析成HTML</button>
|
||||
</div>
|
||||
.hide {
|
||||
display: none
|
||||
}
|
||||
</style>
|
||||
<button class="layui-btn layui-btn-primary down-up-all">全部收起/展开</button>
|
||||
<button class="layui-btn layui-btn-primary get-checked">获取选中</button>
|
||||
|
||||
<table class="layui-table layui-form" id="doctype-tree-table"></table>
|
||||
|
||||
<script type="text/javascript">
|
||||
layui.use(['layer', 'jquery'], function () {
|
||||
var layer = layui.layer
|
||||
, $ = layui.jquery;
|
||||
layui.use(['treetable', 'form'], function () {
|
||||
var data = @Html.Raw(Html.ToJson(ViewBag.TypeList as List<DocumentTypeTreeNode>));
|
||||
|
||||
var testEditor;
|
||||
$('#showEditor').on('click', function () {
|
||||
// 弹出框
|
||||
layer.open({
|
||||
type: 1
|
||||
, content: $('#myeditor')
|
||||
, btn: '关闭全部'
|
||||
, btnAlign: 'c' //按钮居中
|
||||
, shade: 0 //不显示遮罩
|
||||
, area: ['800px', '600px']
|
||||
, yes: function () {
|
||||
layer.closeAll();
|
||||
},
|
||||
success: function () {
|
||||
testEditor = editormd("test-editormd", {
|
||||
width: "90%",
|
||||
height: 740,
|
||||
path: "../../lib/editormd/lib/",
|
||||
theme: "default",
|
||||
previewTheme: "default",
|
||||
editorTheme: "default",
|
||||
//markdown : md, // 初始化编辑区的内容
|
||||
codeFold: true,
|
||||
//syncScrolling : false,
|
||||
saveHTMLToTextarea: true, // 保存 HTML 到 Textarea
|
||||
searchReplace: true,
|
||||
//watch : false, // 关闭实时预览
|
||||
htmlDecode: "style,script,iframe|on*", // 开启 HTML 标签解析,为了安全性,默认不开启
|
||||
//toolbar : false, //关闭工具栏
|
||||
//previewCodeHighlight : false, // 关闭预览 HTML 的代码块高亮,默认开启
|
||||
emoji: true,
|
||||
taskList: true,
|
||||
tocm: true, // Using [TOCM]
|
||||
tex: true, // 开启科学公式TeX语言支持,默认关闭
|
||||
flowChart: true, // 开启流程图支持,默认关闭
|
||||
sequenceDiagram: true, // 开启时序/序列图支持,默认关闭,
|
||||
//dialogLockScreen : false, // 设置弹出层对话框不锁屏,全局通用,默认为true
|
||||
//dialogShowMask : false, // 设置弹出层对话框显示透明遮罩层,全局通用,默认为true
|
||||
//dialogDraggable : false, // 设置弹出层对话框不可拖动,全局通用,默认为true
|
||||
//dialogMaskOpacity : 0.4, // 设置透明遮罩层的透明度,全局通用,默认值为0.1
|
||||
//dialogMaskBgColor : "#000", // 设置透明遮罩层的背景颜色,全局通用,默认为#fff
|
||||
imageUpload: true,
|
||||
imageFormats: ["jpg", "jpeg", "gif", "png", "bmp", "webp"],
|
||||
imageUploadURL: "./php/upload.php", // 文件上传路径,返回值为图片加载的路径
|
||||
onload: function () {
|
||||
// 加载后富文本编辑器成功后的回调
|
||||
console.log('onload', this);
|
||||
//this.fullscreen();
|
||||
//this.unwatch();
|
||||
//this.watch().fullscreen();
|
||||
|
||||
//this.setMarkdown("#PHP");
|
||||
//this.width("100%");
|
||||
//this.height(480);
|
||||
//this.resize("100%", 640);
|
||||
|
||||
// 异步请求md文件,用于编辑时的数据回显
|
||||
$.get('test.md', function (md) {
|
||||
testEditor.setMarkdown(md);
|
||||
});
|
||||
var o = layui.$, treetable = layui.treetable;
|
||||
var form = layui.form, layer = layui.layer;
|
||||
treetable.render({
|
||||
elem: '#doctype-tree-table',
|
||||
data: data,
|
||||
field: 'title',
|
||||
is_checkbox: true,
|
||||
checked: [1, 2, 3, 4],
|
||||
/*icon_val: {
|
||||
open: "",
|
||||
close: ""
|
||||
},
|
||||
space: 4,*/
|
||||
cols: [
|
||||
{
|
||||
field: 'title',
|
||||
title: '标题',
|
||||
width: '40%',
|
||||
template: function (item) {
|
||||
if (item.level == 1) {
|
||||
return '<span style="color:red;">' + item.title + '</span>';
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
if (item.level == 2) {
|
||||
return '<span style="color:green;">' + item.title + '</span>';
|
||||
}
|
||||
return item.title;
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'id',
|
||||
title: '编号',
|
||||
width: '10%'
|
||||
},
|
||||
{
|
||||
title: '标签',
|
||||
width: '10%',
|
||||
template: function (item) {
|
||||
return item.tag||"";//'<input type="checkbox" lay-skin="switch" lay-filter="status" lay-text="开启|关闭">';
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '创建时间',
|
||||
width: '20%',
|
||||
template: function (item) {
|
||||
return item.createdt.replace('T',' ') || "";//'<input type="checkbox" lay-skin="switch" lay-filter="status" lay-text="开启|关闭">';
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'actions',
|
||||
title: '操作',
|
||||
width: '20%',
|
||||
template: function (item) {
|
||||
var tem = [];
|
||||
tem.push('<button class="layui-btn layui-btn-xs layui-btn-normal">添加子级</button>');
|
||||
tem.push('<button class="layui-btn layui-btn-xs">编辑</button>');
|
||||
return tem.join(' ')
|
||||
},
|
||||
},
|
||||
]
|
||||
});
|
||||
|
||||
// 获取markdown源码
|
||||
$('#getMarkdownContent').on('click', function () {
|
||||
var mdContent = $('.editormd-markdown-textarea').val();
|
||||
console.log(mdContent);
|
||||
var content = testEditor.getMarkdown();
|
||||
console.log(content);
|
||||
});
|
||||
// 获取解析后的html
|
||||
$('#getHtmlContent').on('click', function () {
|
||||
var content = testEditor.getHTML();
|
||||
treetable.on('treetable(add)', function (data) {
|
||||
layer.msg('添加操作');
|
||||
console.log(data);
|
||||
})
|
||||
|
||||
console.log(content);
|
||||
});
|
||||
treetable.on('treetable(edit)', function (data) {
|
||||
layer.msg('编辑操作');
|
||||
console.log(data);
|
||||
})
|
||||
|
||||
// 页面解析markdown为html进行显示
|
||||
$('#showHTML').on('click', function () {
|
||||
// 模拟从数据库中取内容
|
||||
$.get('test.md', function (md) {
|
||||
// 给textarea赋值
|
||||
$('#content').val(md);
|
||||
// 解析
|
||||
editormd.markdownToHTML("markdownToHTML", {
|
||||
htmlDecode: "style,script,iframe",
|
||||
emoji: true, // 解析表情
|
||||
taskList: true, // 解析列表
|
||||
tex: true, // 默认不解析
|
||||
flowChart: true, // 默认不解析
|
||||
sequenceDiagram: true // 默认不解析
|
||||
});
|
||||
});
|
||||
});
|
||||
o('.down-up-all').click(function () {
|
||||
var expandStatus = o(this).attr("expandStatus");
|
||||
expandStatus == "down" ? treetable.all('up') : treetable.all('down');
|
||||
expandStatus == "down" ? o(this).attr('expandStatus', 'up') : o(this).attr('expandStatus', 'down');
|
||||
})
|
||||
|
||||
o('.get-checked').click(function () {
|
||||
console.log(treetable.all('checked'));
|
||||
})
|
||||
|
||||
form.on('switch(status)', function (data) {
|
||||
layer.msg('监听状态操作');
|
||||
console.log(data);
|
||||
})
|
||||
});
|
||||
</script>
|
@ -0,0 +1,5 @@
|
||||
@using FreeSql.Site.UI
|
||||
@using FreeSql.Site.UI.Models
|
||||
@using FreeSql.Site.Entity
|
||||
@using FreeSql.Site.UI.Common
|
||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
Reference in New Issue
Block a user