后台UI完善,体验优化

前端用户中心功能初始化
This commit is contained in:
2020-04-09 17:03:56 +08:00
parent 9810b08993
commit e1d3af1941
55 changed files with 780 additions and 3233 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -9,8 +9,21 @@ define(['jquery', 'layer', 'message'], function ($, layer) {
form.api.bindevent($("form[role=form]"));
})
}
sent.api.bindGet(); //绑定get请求
sent.api.bindPost(); //绑定post请求
sent.api.bindButtonAction(); //绑定元素get/post请求操作
//全选的实现
$(".check-all").click(function() {
$(this).parents('table').find('tbody td input[type=checkbox]').prop("checked", this.checked);
});
$("table tbody td input[type=checkbox]").click(function() {
var checked = true;
$("table tbody td input[type=checkbox]").each(function(i) {
if (!this.checked) {
checked = false;
}
});
$(".check-all").prop("checked", checked);
});
},
msg: function (text, type) {
text = (type == 'success') ? text + ' 页面即将自动跳转~' : text;
@@ -202,6 +215,11 @@ define(['jquery', 'layer', 'message'], function ($, layer) {
ret = sent.events.onAjaxResponse(ret);
if (ret.code === 1) {
sent.events.onAjaxSuccess(ret, success);
if (ret.url) {
setTimeout(function() {
location.href = ret.url;
}, 1500);
}
} else {
sent.events.onAjaxError(ret, error);
}
@@ -218,11 +236,45 @@ define(['jquery', 'layer', 'message'], function ($, layer) {
}, options);
return $.ajax(options);
},
bindGet: function(){
},
bindPost: function(){
bindButtonAction: function(){
if($('a.ajax-get, button.ajax-get, a.ajax-post, button.ajax-post').length > 0){
$('a.ajax-get, button.ajax-get, a.ajax-post, button.ajax-post').click(function(e){
e.preventDefault();
var target, type, form, query;
var nead_confirm = false;
if ($(this).hasClass('confirm')) {
if (!confirm('确认要执行该操作吗?')) {
return false;
}
}
if ($(this).hasClass('ajax-post')) {
type = "post";
form = $('.' + $(this).data('form'));
if ($(this).attr('hide-data') === 'true') { //无数据时也可以使用的功能
form = $('.hide-data');
query = form.serialize();
} else if (form.get(0) == undefined) {
return false;
} else if (form.get(0).nodeName == 'FORM') {
if ($(this).attr('url') !== undefined) {
target = $(this).attr('url');
} else {
target = form.get(0).action;
}
query = form.serialize();
} else if (form.get(0).nodeName == 'INPUT' || form.get(0).nodeName == 'SELECT' || form.get(0).nodeName == 'TEXTAREA') {
query = form.serialize();
} else {
query = form.find('input,select,textarea').serialize();
}
}else{
type = "get";
}
if ((target = $(this).attr('href')) || (target = $(this).attr('url'))) {
sent.api.ajax({url: target, type: type, data: query})
}
})
}
}
},
utils: {

View File

@@ -0,0 +1,143 @@
// +----------------------------------------------------------------------
// | SentCMS [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.tensent.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: molong <molong@tensent.cn> <http://www.tensent.cn>
// +----------------------------------------------------------------------
// 当前资源URL目录
var baseRoot = (function () {
var scripts = document.scripts, src = scripts[0].src;
return src.substring(0, src.lastIndexOf("template")) + 'static/';
})();
var skinRoot = (function () {
var scripts = document.scripts, src = scripts[0].src;
return src.substring(0, src.lastIndexOf("/") - 2);
})();
// 配置参数
require.config({
waitSeconds: 60,
packages: [{
name: 'moment',
location: 'plugins/moment',
main: 'moment'
}
],
baseUrl: baseRoot,
map: {'*': {css: baseRoot + 'plugins/require/require.css.js'}},
paths: {
'sent': ['common/js/sent'],
'form': ['common/js/require-form'],
'upload': 'common/js/require-upload',
'validator': 'common/js/require-validator',
'message': ['plugins/messager/messager'],
'template': ['plugins/art-template/template'],
'webupload': ['plugins/webuploader/webuploader.min'],
//表单组件
'board': ['plugins/board/board.min'],
'droppable': ['plugins/droppable/droppable'],
'tagsinput': ['plugins/tagsinput/bootstrap-tagsinput'],
'select2': ['plugins/select2/select2.full'],
'iconpicker': ['plugins/bootstrap-iconpicker/dist/js/bootstrap-iconpicker.bundle.min'],
// openSource
'layer': ['plugins/layer/layer'],
'base64': ['plugins/jquery/base64.min'],
'cxselect': ['plugins/cxselect/jquery.cxselect.min'],
// jQuery
'jquery': ['plugins/jquery/jquery.min'],
'json': ['plugins/jquery/json2.min'],
'jquery.ztree': ['plugins/ztree/jquery.ztree.all.min'],
'jquery.masonry': ['plugins/jquery/masonry.min'],
'jquery.cookies': ['plugins/jquery/jquery.cookie'],
// bootstrap
'bootstrap': ['plugins/bootstrap/js/bootstrap.min'],
'bootstrap.typeahead': ['plugins/bootstrap/js/bootstrap3-typeahead.min'],
'bootstrap.multiselect': ['plugins/bootstrap-multiselect/bootstrap-multiselect'],
'bootstrap-editable': 'plugins/bootstrap-editable/js/bootstrap-editable.min',
'bootstrap-datetimepicker': 'plugins/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min',
'bootstrap-daterangepicker': 'plugins/bootstrap-daterangepicker/daterangepicker',
'validator-core': 'plugins/nice-validator/jquery.validator',
'validator-lang': 'plugins/nice-validator/local/zh-CN',
'NKeditor': 'plugins/NKeditor/NKeditor-all-min',
//adminlte
'adminlte': ['plugins/adminlte/js/adminlte.min'],
// nanoscroller
'slimscroll': 'plugins/jquery-slimscroll/jquery.slimscroll',
},
shim: {
'message': {deps: ['jquery', 'css!'+'plugins/messager/css/style.css']},
'board': {deps: ['css!'+'plugins/board/board.min.css']},
// open-source
'websocket': {deps: [baseRoot + 'plugins/socket/swfobject.min.js']},
// jquery
'jquery.ztree': {deps: ['css!' + baseRoot + 'plugins/ztree/zTreeStyle/zTreeStyle.css']},
// bootstrap
'bootstrap':{deps: ['jquery']},
'bootstrap.typeahead': {deps: ['bootstrap']},
'bootstrap.multiselect': {deps: ['bootstrap', 'css!' + baseRoot + 'plugins/bootstrap-multiselect/bootstrap-multiselect.css']},
'bootstrap-editable': {deps:['bootstrap', 'css!'+baseRoot+'plugins/bootstrap-editable/css/bootstrap-editable.css'], exports:'$.fn.editable'},
'distpicker': {deps: [baseRoot + 'plugins/distpicker/distpicker.data.js']},
'bootstrap-daterangepicker': ['moment/locale/zh-cn'],
'bootstrap-datetimepicker': ['moment/locale/zh-cn','css!'+baseRoot+'plugins/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css'],
'select2': {deps: ['jquery', 'bootstrap', 'css!'+baseRoot+'plugins/select2/select2.css', 'css!'+baseRoot+'plugins/select2/sent_diy.css']},
'board': {deps:['jquery', 'droppable', 'css!'+baseRoot+'plugins/board/board.min.css'], exports: '$.fn.board'},
'droppable': {deps:['jquery'], exports: '$.fn.droppable'},
'tagsinput':{deps: ['jquery', 'bootstrap', 'css!'+baseRoot+'plugins/tagsinput/bootstrap-tagsinput.css'], exports: '$.fn.tagsinput'},
'iconpicker':{deps: ['jquery', 'bootstrap', 'css!'+baseRoot+'plugins/bootstrap-iconpicker/dist/css/bootstrap-iconpicker.min.css'], exports: '$.fn.iconpicker'},
'validator-lang': ['validator-core'],
'slimscroll': {deps: ['jquery'],exports: '$.fn.extend'},
'adminlte': {deps: ['bootstrap', 'slimscroll'],exports: '$.AdminLTE'},
'form': {deps: ['css!'+baseRoot+'common/css/form.css']},
'webupload': {deps: ['jquery', 'css!'+baseRoot+'plugins/webuploader/theme/webuploader.css', 'css!'+baseRoot+'/plugins/webuploader/theme/app.css']},
'layer': {deps: ['jquery', 'css!'+baseRoot+'plugins/layer/theme/default/layer.css']},
'layui':{exports: "layui"}
},
deps: ['json'],
// 开启debug模式不缓存资源
urlArgs: "ver=" + (new Date()).getTime()
});
// 注册jquery到require模块
require(['jquery', 'bootstrap', 'message', 'adminlte'], function ($) {
//初始配置
var Config = requirejs.s.contexts._.config.config;
//将Config渲染到全局
window.Config = Config;
// 配置语言包的路径
var paths = {}; // 避免目录冲突
require.config({paths: paths});
$(function(){
require(['sent'], function(sent){
require([skinRoot + 'js/user.js'], function(backend){
//加载相应模块
if (Config.jsname) {
require([Config.jsname], function (Controller) {
if (Controller.hasOwnProperty(Config.actionname)) {
Controller[Config.actionname]();
} else {
if (Controller.hasOwnProperty("_empty")) {
Controller._empty();
}
}
}, function (e) {
console.error(e);
// 这里可捕获模块加载的错误
});
}
})
})
})
});

View File

@@ -0,0 +1,186 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!-- Tell the browser to be responsive to screen width -->
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<title>用户中心</title>
<link rel="stylesheet" type="text/css" href="__static__/common/css/main.css?time={:time()}">
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="__static__/common/js/html5shiv.js"></script>
<script src="__static__/common/js/respond.min.js"></script>
<![endif]-->
</head>
<body class="hold-transition skin-blue sidebar-mini layout-top-nav">
<div class="wrapper">
<header class="main-header">
<nav class="navbar navbar-static-top">
<div class="container">
<div class="navbar-header">
<a href="{:url('/user/index/index')}" class="navbar-brand"><b>用户中心</b></a>
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse">
<i class="fa fa-bars"></i>
</button>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse pull-left" id="navbar-collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="{:url('front.Index/index')}">网站首页</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">我的内容 <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="#">文章列表</a></li>
<li class="divider"></li>
<li><a href="#">图片列表</a></li>
</ul>
</li>
</ul>
</div>
<!-- /.navbar-collapse -->
<!-- Navbar Right Menu -->
<div class="navbar-custom-menu">
<ul class="nav navbar-nav">
<!-- Messages: style can be found in dropdown.less-->
<li class="dropdown messages-menu">
<!-- Menu toggle button -->
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-envelope-o"></i>
<span class="label label-success">4</span>
</a>
<ul class="dropdown-menu">
<li class="header">You have 4 messages</li>
<li>
<!-- inner menu: contains the messages -->
<ul class="menu">
<li><!-- start message -->
<a href="#">
<div class="pull-left">
<!-- User Image -->
<img src="__plugins__/adminlte/img/user2-160x160.jpg" class="img-circle" alt="User Image">
</div>
<!-- Message title and timestamp -->
<h4>
Support Team
<small><i class="fa fa-clock-o"></i> 5 mins</small>
</h4>
<!-- The message -->
<p>Why not buy a new awesome theme?</p>
</a>
</li>
<!-- end message -->
</ul>
<!-- /.menu -->
</li>
<li class="footer"><a href="#">See All Messages</a></li>
</ul>
</li>
<!-- /.messages-menu -->
<!-- User Account Menu -->
<li class="dropdown user user-menu">
<!-- Menu Toggle Button -->
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<!-- The user image in the navbar-->
<img src="__plugins__/adminlte/img/user2-160x160.jpg" class="user-image" alt="User Image">
<!-- hidden-xs hides the username on small devices so only the image appears. -->
<span class="hidden-xs">{:session('userInfo.nickname')}</span>
</a>
<ul class="dropdown-menu">
<!-- The user image in the menu -->
<li class="user-header">
<img src="__plugins__/adminlte/img/user2-160x160.jpg" class="img-circle" alt="User Image">
<p>
{:session('userInfo.nickname')}
<small>Member since Nov. 2012</small>
</p>
</li>
<!-- Menu Footer-->
<li class="user-footer">
<div class="pull-left">
<a href="{:url('/user/index/profile')}" class="btn btn-default btn-flat">个人资料</a>
</div>
<div class="pull-right">
<a href="{:url('/user/login/logout')}" class="btn btn-default btn-flat">退出</a>
</div>
</li>
</ul>
</li>
</ul>
</div>
<!-- /.navbar-custom-menu -->
</div>
<!-- /.container-fluid -->
</nav>
</header>
<!-- Full Width Column -->
<div class="content-wrapper">
<div class="container">
<!-- Content Header (Page header) -->
<section class="content-header">
<h1>&nbsp;</h1>
<ol class="breadcrumb">
<li><a href="#"><i class="fa fa-dashboard"></i> 用户中心</a></li>
<li><a href="#">首页</a></li>
<li class="active">我的</li>
</ol>
</section>
<!-- Main content -->
<section class="content">
<div class="row">
<div class="col-sm-2" style="background: #222d32; padding: 0;">
<section class="sidebar">
<!-- Sidebar user panel -->
<div class="user-panel">
<div class="pull-left image">
<img src="__plugins__/adminlte/img/user2-160x160.jpg" class="img-circle" alt="User Image">
</div>
<div class="pull-left info">
<p>{:session('userInfo.nickname')}</p>
</div>
</div>
<ul class="sidebar-menu">
<li class="header">基础信息</li>
<li><a href="{:url('/user/index/profile')}"><i class="fa fa-book"></i> <span>个人资料</span></a></li>
<li><a href="{:url('/user/index/repasswd')}"><i class="fa fa-book"></i> <span>修改密码</span></a></li>
<li class="header">我的内容</li>
<li><a href="#"><i class="fa fa-book"></i> <span>我的内容</span></a></li>
<li class="header">我的表单</li>
<li><a href="#"><i class="fa fa-book"></i> <span>我的内容</span></a></li>
</ul>
</section>
</div>
<div class="col-sm-10" style="padding-left: 15px;">
{block name="body"}
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title"></h3>
</div>
<div class="box-body"></div>
</div>
{/block}
</div>
</div>
</section>
</div>
</div>
<!-- /.content-wrapper -->
<footer class="main-footer">
<div class="pull-right hidden-xs">
<b>Version</b> 4.x
</div>
<strong>Copyright &copy; 2013-2020 <a href="https://www.tensent.cn">SentCMS</a>.</strong> All rights
reserved.
</footer>
</div>
<script type="text/javascript">
var require = {
config: {"site": {$config|json_encode|raw}, 'module': 'admin', 'jsname': "{$require['jsname']|default=''}", 'actionname': "{$require['actionname']|default=''}", }
}
</script>
<script src="__plugins__/require/require.js" data-main="__js__/main.js"></script>
</body>
</html>

View File

@@ -0,0 +1 @@
{extend name="base" /}

View File

@@ -0,0 +1 @@
{extend name="base" /}

View File

@@ -0,0 +1 @@
{extend name="base" /}