现今,前端主要是以 React 和 Vue 为代表的 JS 框架盛行的时代,但还是有很多后端开发人员在使用Layui,因为Layui门槛极低,拿来即用,无需涉足各种前端工具的复杂配置,程序员只需面对浏览器本身,就能让业务所需要的一切元素与交互快速实现。
勾股Admin是一款开基于Layui的最新版扩展的Web UI解决方案。封装了Layui的自身调用方法和一些常用的工具函数,整合部分第三方开源的组件。更多是为服务端程序员量身定做,为使用者提供相对完善的前端UI开发方案,相信她是一个很好的前端轮子。
开源项目地址:https://gitee.com/gouguopen/guoguadmin
PS:项目会不定时进行更新,建议⭐star⭐和👁️watch👁️一份。
只需引用一个CSS文件和两个JS文件,声明需要加载的模块,然后初始化操作即可。
1、引用CSS文件,放在页头。
<link rel="stylesheet" href="/assets/gougu/css/gougu.css">
PS:如果是布局母模板需要引入 layout.css。
<link rel="stylesheet" href="/assets/gougu/css/layout.css">
2、声明需要加载的模块,并完成初始化元素操作函数等,放在页脚。
<script>
//声明需要加载的模块
const moduleInit = ['tool', 'admin'];
//初始化操作
function gouguInit() {
//do something here
}
</script>
3、引用JS文件,放在页面的最下面。
<script src="/assets/layui/layui.js"></script>
<script src="/assets/gougu/gouguInit.js"></script>
PS:如果是项目使用的是模板继承方式开发的话,把引入文件固定写在母模板,然后只需要在子模板声明需要加载的模块,并完成初始化元素操作函数即可。
┌── assets # 静态资源
│ ├── gougu # 核心文件
│ │ ├── images # 图片文件
│ │ ├── module # 封装或第三方组件
│ │ ├── css # 样式
│ │ ├── gouguInit.js # Lyui调用文件方法
│ ├── icon # icon文件
│ ├── layui # layui文件
│ ├── third_party # 第三方插件文件
├── json # 页面展示模拟数据Json格式
├── view # 页面文件
│ ├── base # 基础组件页面
│ ├── form # 表单组件页面
│ ├── home # 推荐效果页面
│ ├── table # 数据表组件页面
├── index.html # 入口文件
PS:项目会不定时进行更新,建议⭐star⭐和👁️watch👁️一份。
┌── admin.js # admin组件,一般在布局页面的母页面使用
├── tool.js # 工具类组件,一般每个页面都使用都到(右侧是针对tool工具类的使用讲解)
├── tag.js # tag组件
├── tagpicker.js # tag新增选择组件
├── treeGrid.js # 树形菜单组件
├── treetable.js # 树形表格组件
├── formSelects.js # 表单下来选择选项之间,支持多选、单选
├── tinymce.js # tinymce富文本编辑器
├── editormd.js # editormd Markdown编辑器
PS:以上组件都在项目的assets\gougu\module\目录内,会不定时进行更新,建议关注项目,获取更新。
┌── echart # 强大的chart插件
├── fullcalendar # 强大的日历插件
├── prism # 轻巧实用的代码高亮插件
PS:以上组件都在项目的assets\third_party\目录内,会不定时进行更新,建议关注项目,获取更新。
-- ----------------------------
-- Table structure for cms_course
-- ----------------------------
DROP TABLE IF EXISTS `cms_course`;
CREATE TABLE `cms_course` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`cate_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '分类ID',
`course_type` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '类型:1线下课程,2视频课程,3音频课,4直播课',
`type` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '属性:1精华 2热门 3推荐',
`is_home` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否首页显示:0否,1是',
`status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:0下架,1正常',
`title` varchar(200) NOT NULL DEFAULT '' COMMENT '课程名称',
`thumb` varchar(255) NOT NULL DEFAULT '' COMMENT '缩略图',
`desc` varchar(1000) NOT NULL DEFAULT '' COMMENT '课程摘要',
`content` text NULL COMMENT '课程介绍',
`speaker` varchar(200) NOT NULL DEFAULT '' COMMENT '主讲老师',
`base_price` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '基础价格',
`price` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '实际价格',
`live_link` varchar(255) NOT NULL DEFAULT '' COMMENT '直播地址',
`address` varchar(255) NOT NULL DEFAULT '' COMMENT '线下开课地址',
`start_time` int(10) UNSIGNED NULL DEFAULT 0 COMMENT '课程开始时间',
`end_time` int(10) UNSIGNED NULL DEFAULT 0 COMMENT '课程结束时间',
`read` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '阅读量',
`sort` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序',
`create_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
`update_time` int(11) NOT NULL DEFAULT 0 COMMENT '编辑时间',
`delete_time` int(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '课程::crud';
<script>
//以下方法在加载了tool模块后可调用
const moduleInit = ['tool'];
//初始化操作
function gouguInit() {
let tool = layui.tool;
}
</script>
//右侧打开页面,如果不传框架宽度参数的话,打开的窗口会根据1280与1920两个宽度来自适应。
tool.side(url, width);
//关闭右侧打开页面,如果传入delay参数(数字毫秒),则会延迟关闭,不传即立即关闭。
tool.sideClose(delay);
//子页面打开新的tab,参数必填,'url':链接,'title':tab标题。
tool.tabAdd(url,title);
//子页面关闭当前tab
tool.tabClose();
//子页面关闭指定tab,参数id必填,且是数字
tool.tabDelete(id);
//子页面切换到指定tab,参数id必填,且是数字
tool.tabChange(id);
//子页面刷新指定tab,参数id必填,且是数字
tool.tabRefresh(id);
<script>
//以下方法在加载了tool模块后可调用
const moduleInit = ['tool'];
//初始化操作
function gouguInit() {
let tool = layui.tool;
}
</script>
/*=================以下是常规的(get、post、put、delete)方法调用====================*/
//get获取。必填参数,'url':请求地址,字符串, 'data':需要传的参数,对象, 'callback':成功回调函数
tool.get(url, data, callback);
//例子:
tool.get("/project/api/get_project", {}, function (res) {
let data = res.data;
console.log(data);
});
/*========================华丽的分割线============================*/
//post提交。必填参数,'url':请求地址,字符串, 'data':需要传的参数,对象, 'callback':成功回调函数
tool.post(url, data, callback);
//例子:
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
setTimeout(function () {
parent.location.reload();
}, 1000);
}
}
tool.post("/article/cate/cate_add", {id:1,title:'勾股Admin'}, callback);
/*========================华丽的分割线============================*/
//put修改。必填参数,'url':请求地址,字符串, 'data':需要传的参数,对象, 'callback':成功回调函数
tool.put(url, data, callback);
//例子:
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
parent.layui.tool.close(1000);
}
}
tool.put("/contract/index/add", {'id':1,'title':'勾股CMS'}, callback);
/*========================华丽的分割线============================*/
//delete删除。必填参数,'url':请求地址,字符串, 'data':需要传的参数,对象, 'callback':成功回调函数
tool.delete(url, data, callback);
//例子:
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
obj.del();
}
}
tool.delete("/article/cate/cate_delete", { id: 2}, callback);
/*=================以下是常规的ajax(json、jsonp)方法调用====================*/
//ajax。必填参数,'options':请求参数,对象,'callback':成功回调函数
tool.ajax(options, callback);
//常规json请求例子:
let options = {
url: '/home/ask/ask',
type: 'post',
data: {
title: '正常的Ajax请求',
content: '注意:这是一个常规的Ajax请求'
}
});
let callback = function(res) {
if (res.code == 0) {
layer.msg('问题提交成功,我们会尽快回复您。');
setTimeout(function() {
window.location.href = '/home/user/my_ask.html'
}, 2000);
return;
}
layer.msg('发布失败!');
}
tool.ajax(options, callback);
/*========================华丽的分割线============================*/
//jsonp请求例子:
let options = {
url: '/home/ask/ask',
type: 'post',
data: {
format:'jsonp',//这个jsonp必须要有
title: 'jsonp的Ajax请求',
content: '注意:这是一个jsonp的Ajax请求'
}
});
let callback = function(res) {
if (res.code == 0) {
layer.msg('问题提交成功,我们会尽快回复您。');
setTimeout(function() {
window.location.href = '/home/user/my_ask.html'
}, 2000);
return;
}
layer.msg('发布失败!');
}
tool.ajax(options, callback);