创建版本

This commit is contained in:
2021-02-22 12:17:00 +08:00
commit af555f49c3
2332 changed files with 369202 additions and 0 deletions
+225
View File
@@ -0,0 +1,225 @@
<style>
body {
text-align: center;
background-image: url({{$asset_url}}/images/login-bg2.jpg);
background-repeat: no-repeat;
height: 100vh;
background-attachment: scroll;
background-position: center center;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
}
.content-body {
margin: 0;
}
.overlay {
position: absolute;
top: 0;
bottom: 0;
width: 100vw;
height: 100vh;
z-index: 0;
background: rgba(0, 0, 0, 0.50);
background: linear-gradient(to bottom, rgba(25, 137, 250, 0.65), rgba(25, 137, 250, 0.35));
}
.text-muted {
color: #fff;
}
.text-muted a {
color: #fff;
}
.login-box {
position: relative;
margin: 0 auto;
text-align: left;
max-width: 750px;
}
.login-box .h5 {
text-align: center;
line-height: 20px;
}
.toast {
text-align: left;
}
.login-box {
padding-top: 220px;
}
.logo-text {
padding: 20px;
padding-top: 60px;
padding-left: 0;
}
.text-title {
font-weight: 500;
font-size: 36px;
}
.footer {
margin-top: 10px;
padding-top: 10px;
border-top: solid 1px rgba(255, 255, 255, 0.3);
text-align: right;
}
@media (max-width: 767px) {
.login-box {
padding-top: 60px;
}
.logo-text {
text-align: center;
}
.row {
margin-left: 15px;
margin-right: 15px;
}
.footer {
border-top: 0;
text-align: center;
}
.panel-heading {
display: none;
}
}
.fa-lock {
color: #666;
font-size: 18px;
}
.text-tips {
color: #999;
padding-top: 5px;
}
.panel {
border-radius: 5px !important;
}
.show_captcha {
display: flex;
}
#refresh_captcha {
margin-left: 5px;
margin-top: 2px;
}
</style>
<div class="overlay"></div>
<div class="login-box">
@if(Session::has('error'))
<div class="alert alert-warning alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
{{Session::pull('error')}}
</div>
@endif
<div class="row">
<div class="col-sm-7 col-xs-12" id="aaa">
<div class="logo-text layer" data-depth="0.60">
<h2 class="text-white text-title">{{$setting['title']}}</h2>
<small class="text-muted">Good Online Office</small>
</div>
</div>
<div class="col-sm-5 col-xs-12">
<form class="form-horizontal" url="{{url('login')}}" method="post" id="myform" name="myform">
<div class="panel">
<div class="panel-heading wrapper b-b b-light">
<h4 class="font-thin m-t-none m-b-none"><i class="fa fa-lock"></i> 登录</h4>
<div class="text-tips">
请使用您的帐号密码进行登录
</div>
</div>
<div class="panel-body" style="padding:20px 30px 0 30px;">
<div class="form-group">
<input type="text" placeholder="账号" class="form-control" name="username" required>
</div>
<div class="form-group">
<input type="password" placeholder="密码" class="form-control" name="password" required>
</div>
<div id="show_captcha" style="display:@if($show_captcha) '' @else none @endif">
<div class="form-group">
<div class="show_captcha">
<input type="text" maxlength="4" name="captcha" class="form-control" id="input-code" autocomplete="off" placeholder="验证码">
<a id="refresh_captcha" title="点击刷新">
<img id="captcha_image" src="{{url('user/auth/captcha')}}" style="vertical-align:middle;height:30px;">
</a>
</div>
</div>
</div>
<div class="form-group">
<div class="checkbox m-b-md m-t-none">
<label class="i-checks i-checks-sm">
<input type="checkbox" name="remember">
<i></i> 下次自动登录
</label>
</div>
<div class="line line-dashed"></div>
<button type="submit" class="btn btn-lg btn-info btn-block"> 登录 </button>
</div>
</div>
</div>
</form>
</div>
</div>
<!--
<div class="line line-dashed"></div>
<div class="text-center text-muted">
<a class="text-base" href="{{url('qrcode')}}">
<i class="fa fa-qrcode"></i> 扫码登录</a>
</div>
-->
<div class="footer">
<small class="text-muted">© {{date('Y')}} {{$version}}</small>
</div>
</div>
</div>
<script>
(function($) {
// ajax 登录
$('#myform').on('submit', function () {
var url = $(this).attr('action');
var data = $(this).serialize();
$.post(url, data, function (res) {
if (res.show_captcha) {
$('#show_captcha').show();
}
if (res.success) {
toastrSuccess(res.msg);
app.redirect('/');
} else {
// 登录错误显示验证码
if (res.show_captcha) {
refresh_captcha();
}
toastrError(res.msg);
}
}, 'json');
return false;
});
// 刷新验证码方法
function refresh_captcha() {
$('#captcha_image').attr('src', settings.public_url + '/user/auth/captcha?_=' + Math.random());
}
// 刷新验证码
$(document).on('click', '#refresh_captcha', function () {
refresh_captcha();
});
})(jQuery);
</script>
+72
View File
@@ -0,0 +1,72 @@
<style>
body {
color: #badbe6;
text-align: center;
background: -webkit-linear-gradient(right, #198fb4, #0b6fab);
background: -o-linear-gradient(right, #198fb4, #0b6fab);
background: linear-gradient(to left, #198fb4, #0b6fab);
background-color: #3586b7;
}
.text-muted {
color: #badbe6;
}
.text-muted a {
color: #fff;
}
.list-group-item {
border-color: #fff;
}
.login-box {
margin: 0 auto;
text-align: left;
}
.login-box .h5 {
text-align: center;
line-height: 20px;
}
</style>
<div class="login-box">
<div class="container w-xxl w-auto-xs" style="padding-top:50px;">
<div class="wrapper text-center">
<h2 class="text-white">{{$setting['title']}}</h2>
<small class="text-muted">Different Office</small>
</div>
@if(Session::has('error'))
<div class="alert alert-warning alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
{{Session::pull('error')}}
</div>
@endif
<div class="text-center">
<img src="{{url('index/api/qrcode', ['size' => 5, 'data' => 'qrlogin:'.time().''])}}">
</div>
<div class="line line-dashed"></div>
<div class="text-center text-muted">
<a class="text-base" href="{{url('login')}}"><i class="fa fa-mail-reply"></i> 账号登录</a>
</div>
<div class="line line-dashed"></div>
<div class="text-center">
<small class="text-muted">© {{date('Y')}} {{$version}}</small>
</div>
<div class="line line-dashed"></div>
</div>
<div class="h5 m-t-lg text-white help">
<p>合作经销商的账号和密码请与客户经理联络。</p>
<p>公司员工、供应商的账号和密码请与总经理助理联络。</p>
<p>系统异常请与上述岗位联络。</p>
</div>
</div>
+106
View File
@@ -0,0 +1,106 @@
<style>
body {
background: -webkit-linear-gradient(right, #198fb4, #0b6fab);
background: -o-linear-gradient(right, #198fb4, #0b6fab);
background: linear-gradient(to left, #198fb4, #0b6fab);
background-color: #3586b7;
}
.text-muted {
color: #badbe6;
}
.text-muted a {
color: #fff;
}
</style>
<div class="container w-xxl w-auto-xs" style="padding-top:100px;">
@if(Session::has('error'))
<div class="alert alert-warning alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
{{Session::pull('error')}}
</div>
@endif
<div class="panel">
<div class="panel-body">
<form class="form-horizontal padder-md" url="{{url()}}" method="post" id="myform" name="myform" role="form">
<div class="form-group">
<label class="control-label">两步验证</label>
<input type="text" class="form-control" maxlength="6" id="code" name="code" value="{{Request::old('code')}}">
</div>
<div class="form-group">
<!--
<span id="sms-info"><a onclick="totp.smsCode();" href="javascript:;" class="btn btn-info btn-xs" id="sms-code">点击短信获取验证码</a></span>
-->
<div class="pull-right">
<a href="{{url('logout')}}" class="btn btn-default"> 注销 </a>
<button type="submit" class="btn btn-primary"> 验证 </button>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="line line-dashed"></div>
<div class="text-center">
<small class="text-muted">© {{date('Y')}} {{$version}}</small>
</div>
<script type="text/javascript">
$('#myform').submit(function() {
var url = $(this).attr('action');
var data = $(this).serialize();
$.post(url, data, function(res) {
if(res.status) {
toastrSuccess(res.data);
app.redirect('/');
} else {
toastrError(res.data);
}
}, 'json');
return false;
});
var totp = {
second: 0,
timeId: undefined,
init: function(second)
{
clearTimeout(this.timeId);
this.second = second;
this.start();
},
start: function()
{
var self = this;
if(this.second > 0) {
$("#second").html(this.second);
this.timeId = setTimeout(function()
{
self.start();
}, 1000);
this.second--;
} else {
clearTimeout(this.timeId);
$("#sms-info").html('<a class="btn btn-info btn-xs" onclick="getSMSCode();" href="javascript:;" id="sms-code">重新获取验证码</a>');
}
},
smsCode:function()
{
var self = this;
$.get('{{url()}}',{sms:true}, function(res) {
if(res.status == true) {
self.init(res.data);
$("#sms-info").html('<span class="btn btn-info btn-xs disabled">剩余<span id="second">' + res.data + '</span>秒重新获取</span>');
} else {
toastrError(res.data);
}
},'json');
}
}
</script>
@@ -0,0 +1,3 @@
<form class="form-horizontal form-controller" method="post" id="department" name="department">
{{$form['tpl']}}
</form>
@@ -0,0 +1,133 @@
<div class="wrapper-xs">
<form id="dialog-{{$search['query']['id']}}-search-form" class="form-inline" method="get">
@include('searchForm6')
</form>
</div>
<div id="dialog-{{$search['query']['id']}}" class="ag-theme-balham" style="width:100%;height:380px;"></div>
<script>
(function ($) {
var search = JSON.parse('{{json_encode($search)}}');
var params = search.query;
var option = gdoo.formKey(params);
var event = gdoo.event.get(option.key);
event.trigger('query', params);
var sid = params.prefix == 1 ? 'sid' : 'id';
var gridDiv = document.querySelector("#dialog-{{$search['query']['id']}}");
var grid = new agGridOptions();
var selectedData = {};
var multiple = params.multi == 0 ? false : true;
grid.remoteDataUrl = '{{url()}}';
grid.remoteParams = params;
grid.suppressRowClickSelection = true;
grid.rowSelection = multiple ? 'multiple' : 'single';
grid.autoGroupColumnDef = {
headerName: '名称',
width: 250,
cellRendererParams: {
checkbox: true,
suppressCount: false,
}
};
grid.treeData = true;
grid.groupDefaultExpanded = -1;
grid.getDataPath = function(data) {
return data.tree_path;
};
grid.columnDefs = [];
grid.columnDefs.push({suppressMenu: true, cellClass:'text-center', field: 'id', headerName: 'ID', width: 60});
grid.onRowClicked = function(row) {
var selected = row.node.isSelected();
if (selected === false) {
row.node.setSelected(true, true);
}
};
grid.onRowDoubleClicked = function (row) {
var ret = writeSelected();
if (ret == true) {
$('#gdoo-dialog-' + params.dialog_index).dialog('close');
}
};
/**
* 初始化选择
*/
function initSelected() {
if (params.is_grid) {
} else {
var rows = {};
var id = $('#'+option.id).val();
if (id) {
var ids = id.split(',');
for (var i = 0; i < ids.length; i++) {
rows[ids[i]] = ids[i];
}
}
grid.api.forEachNode(function(node) {
var key = node.data[sid];
if (rows[key] != undefined) {
node.setSelected(true);
}
});
}
}
/**
* 写入选中
*/
function writeSelected() {
var rows = grid.api.getSelectedRows();
if (params.is_grid) {
var list = gdoo.forms[params.form_id];
list.api.dialogSelected(params);
} else {
var id = [];
var text = [];
$.each(rows, function(k, row) {
id.push(row[sid]);
text.push(row.name);
});
$('#'+option.id).val(id.join(','));
$('#'+option.id+'_text').val(text.join(','));
if (event.exist('onSelect')) {
return event.trigger('onSelect', multiple ? rows : rows[0]);
}
}
return true;
}
grid.writeSelected = writeSelected;
gdoo.dialogs[option.id] = grid;
new agGrid.Grid(gridDiv, grid);
// 读取数据
grid.remoteData();
// 数据载入成功
grid.remoteSuccessed = function() {
initSelected();
}
var data = search.forms;
var search = $("#dialog-{{$search['query']['id']}}-search-form").searchForm({
data: data
});
search.find('#search-submit').on('click', function() {
var params = search.serializeArray();
$.map(params, function(row) {
data[row.name] = row.value;
});
grid.remoteData(data);
return false;
});
})(jQuery);
</script>
@@ -0,0 +1,66 @@
{{$header["js"]}}
<div class="panel no-border" id="{{$header['table']}}-controller">
@include('headers')
<div class="list-jqgrid">
<div id="{{$header['table']}}-grid" class="ag-theme-balham"></div>
<div class="ag-theme-balham" id="ag-pagination"></div>
<div class="clearfix"></div>
</div>
</div>
<script>
(function ($) {
var table = '{{$header["table"]}}';
var config = gdoo.grids[table];
var action = config.action;
var search = config.search;
// 自定义搜索方法
search.searchInit = function (e) {
var self = this;
}
var grid = new agGridOptions();
var gridDiv = document.querySelector("#{{$header['table']}}-grid");
gridDiv.style.height = getPanelHeight(11);
config.cols[0]['hide'] = true;
config.cols[1]['hide'] = true;
grid.autoGroupColumnDef = {
headerName: '名称',
width: 250,
cellRendererParams: {
checkbox: true,
suppressCount: true,
}
};
grid.treeData = true;
grid.groupDefaultExpanded = -1;
grid.getDataPath = function(data) {
return data.tree_path;
};
grid.remoteDataUrl = '{{url()}}';
grid.remoteParams = search.advanced.query;
grid.columnDefs = config.cols;
new agGrid.Grid(gridDiv, grid);
// 读取数据
grid.remoteData();
// 绑定自定义事件
var $gridDiv = $(gridDiv);
$gridDiv.on('click', '[data-toggle="event"]', function () {
var data = $(this).data();
if (data.master_id > 0) {
action[data.action](data);
}
});
config.grid = grid;
})(jQuery);
</script>
@include('footers')
@@ -0,0 +1,3 @@
<form class="form-horizontal form-controller" method="post" id="user_group" name="user_group">
{{$form['tpl']}}
</form>
+58
View File
@@ -0,0 +1,58 @@
{{$header["js"]}}
<div class="panel no-border" id="{{$header['table']}}-controller">
@include('headers')
<div class="list-jqgrid">
<div id="{{$header['table']}}-grid" class="ag-theme-balham"></div>
</div>
</div>
<script>
(function ($) {
var table = '{{$header["table"]}}';
var config = gdoo.grids[table];
var action = config.action;
var search = config.search;
// 自定义搜索方法
search.searchInit = function (e) {
var self = this;
}
var grid = new agGridOptions();
var gridDiv = document.querySelector("#{{$header['table']}}-grid");
gridDiv.style.height = getPanelHeight(48);
grid.remoteDataUrl = '{{url()}}';
grid.remoteParams = search.advanced.query;
grid.columnDefs = config.cols;
grid.onRowDoubleClicked = function (params) {
if (params.node.rowPinned) {
return;
}
if (params.data == undefined) {
return;
}
if (params.data.id > 0) {
action.edit(params.data);
}
};
new agGrid.Grid(gridDiv, grid);
// 读取数据
grid.remoteData({page: 1});
// 绑定自定义事件
var $gridDiv = $(gridDiv);
$gridDiv.on('click', '[data-toggle="event"]', function () {
var data = $(this).data();
if (data.master_id > 0) {
action[data.action](data);
}
});
config.grid = grid;
})(jQuery);
</script>
@include('footers')
@@ -0,0 +1,34 @@
<table class="table table-form m-b-none">
<tbody>
<tr>
<td width="10%" align="right">姓名</td>
<td width="40%">{{$user->name}}</td>
<td width="10%" align="right">性别</td>
<td width="40%">{{option('user.gender', $user['gender'])}}</td>
</tr>
<tr>
<td align="right">部门</td>
<td>{{$user->department->name}}</td>
<td align="right">岗位</td>
<td>{{$user->role->name}}</td>
</tr>
<tr>
<td align="right">手机</td>
<td>{{$user->phone}}</td>
<td align="right">邮箱</td>
<td>{{$user->email}}</td>
</tr>
<tr>
<th colspan="4" align="left">站内私信</th>
</tr>
<tr>
<td align="right">内容</td>
<td colspan="3">
<form class="form-horizontal" method="post" action="{{url()}}" id="user_message" name="user_message">
<textarea class="form-control" name="content"></textarea>
<input type="hidden" name="read_by" value="{{$user->id}}" />
</form>
</td>
</tr>
</tbody>
</table>
@@ -0,0 +1,86 @@
{{$header["js"]}}
<div class="panel no-border" id="{{$header['master_table']}}-controller">
@include('headers')
<div class="list-jqgrid">
<div id="{{$header['master_table']}}-grid" class="ag-theme-balham"></div>
</div>
</div>
<script>
(function($) {
var table = '{{$header["master_table"]}}';
var config = gdoo.grids[table];
var action = config.action;
var search = config.search;
var statusAction = function(type) {
var grid = config.grid;
var selections = grid.jqGrid('getSelections');
var ids = [];
$.each(selections, function(i, selection) {
ids.push(selection.id);
});
if(ids.length > 0) {
$.post('{{url("status")}}', {type: type, id: ids}, function(res) {
if(res.status) {
toastrSuccess(res.data);
grid.trigger('reloadGrid');
} else {
toastrError(res.data);
}
},'json');
} else {
toastrError('最少选择一行记录。');
}
}
// 标记已读
action.read = function() {
statusAction('read');
};
// 标记未读
action.unread = function() {
statusAction('unread');
};
// 自定义搜索方法
search.searchInit = function(e) {
var self = this;
}
var grid = new agGridOptions();
grid.remoteDataUrl = '{{url()}}';
grid.remoteParams = search.advanced.query;
grid.columnDefs = config.cols;
grid.onRowDoubleClicked = function (params) {
if (params.node.rowPinned) {
return;
}
if (params.data == undefined) {
return;
}
if (params.data.master_id > 0) {
action.show(params.data);
}
};
var gridDiv = document.querySelector("#{{$header['master_table']}}-grid");
gridDiv.style.height = getPanelHeight(48);
new agGrid.Grid(gridDiv, grid);
// 读取数据
grid.remoteData({page: 1});
// 绑定自定义事件
var $gridDiv = $(gridDiv);
$gridDiv.on('click', '[data-toggle="event"]', function () {
var data = $(this).data();
if (data.master_id > 0) {
action[data.action](data);
}
});
config.grid = grid;
})(jQuery);
</script>
@include('footers')
@@ -0,0 +1,10 @@
<div class="panel m-b-none">
<div class="panel-heading b-b b-light">
<small class="text-muted">
来自 : {{get_user($row['created_id'], 'name')}} &nbsp;创建时间 : @datetime($row['created_at'])
</small>
</div>
<div class="panel-body">
{{$row['content']}}
</div>
</div>
@@ -0,0 +1,3 @@
<form class="form-horizontal form-controller" method="post" id="user_position" name="user_position">
{{$form['tpl']}}
</form>
@@ -0,0 +1,123 @@
<div class="padder">
<div class="m-t-sm m-b-sm">
<form id="dialog-{{$search['query']['id']}}-search-form" class="form-inline" method="get">
@include('searchForm')
</form>
</div>
</div>
<div id="dialog-{{$search['query']['id']}}" class="ag-theme-balham" style="width:100%;height:380px;"></div>
<script>
(function ($) {
var search = JSON.parse('{{json_encode($search)}}');
var params = search.query;
var option = gdoo.formKey(params);
var event = gdoo.event.get(option.key);
event.trigger('query', params);
var sid = params.prefix == 1 ? 'sid' : 'id';
var gridDiv = document.querySelector("#dialog-{{$search['query']['id']}}");
var grid = new agGridOptions();
var selectedData = {};
var multiple = params.multi == 0 ? false : true;
grid.remoteDataUrl = '{{url()}}';
grid.remoteParams = params;
grid.rowSelection = multiple ? 'multiple' : 'single';
grid.columnDefs = [
{suppressMenu: true, cellClass:'text-center', checkboxSelection: true, headerCheckboxSelection: multiple, suppressSizeToFit: true, sortable: false, width: 40},
{suppressMenu: true, cellClass:'text-center', field: 'name', headerName: '名称', width: 200},
{suppressMenu: true, cellClass:'text-center', field: 'id', headerName: 'ID', width: 60}
];
grid.onRowClicked = function(row) {
var selected = row.node.isSelected();
if (selected === false) {
row.node.setSelected(true, true);
}
};
grid.onRowDoubleClicked = function (row) {
var ret = writeSelected();
if (ret == true) {
$('#gdoo-dialog-' + params.dialog_index).dialog('close');
}
};
/**
* 初始化选择
*/
function initSelected() {
if (params.is_grid) {
} else {
var rows = {};
var id = $('#'+option.id).val();
if (id) {
var ids = id.split(',');
for (var i = 0; i < ids.length; i++) {
rows[ids[i]] = ids[i];
}
}
grid.api.forEachNode(function(node) {
var key = node.data[sid];
if (rows[key] != undefined) {
node.setSelected(true);
}
});
}
}
/**
* 写入选中
*/
function writeSelected() {
var rows = grid.api.getSelectedRows();
if (params.is_grid) {
var list = gdoo.forms[params.form_id];
list.api.dialogSelected(params);
} else {
var id = [];
var text = [];
$.each(rows, function(k, row) {
id.push(row[sid]);
text.push(row.name);
});
$('#'+option.id).val(id.join(','));
$('#'+option.id+'_text').val(text.join(','));
if (event.exist('onSelect')) {
return event.trigger('onSelect', multiple ? rows : rows[0]);
}
}
return true;
}
grid.writeSelected = writeSelected;
gdoo.dialogs[option.id] = grid;
new agGrid.Grid(gridDiv, grid);
// 读取数据
grid.remoteData();
// 数据载入成功
grid.remoteSuccessed = function() {
initSelected();
}
var data = search.forms;
var search = $("#dialog-{{$search['query']['id']}}-search-form").searchForm({
data: data
});
search.find('#search-submit').on('click', function() {
var params = search.serializeArray();
$.map(params, function(row) {
data[row.name] = row.value;
});
grid.remoteData(data);
return false;
});
})(jQuery);
</script>
@@ -0,0 +1,58 @@
{{$header["js"]}}
<div class="panel no-border" id="{{$header['table']}}-controller">
@include('headers')
<div class="list-jqgrid">
<div id="{{$header['table']}}-grid" class="ag-theme-balham"></div>
</div>
</div>
<script>
(function ($) {
var table = '{{$header["table"]}}';
var config = gdoo.grids[table];
var action = config.action;
var search = config.search;
// 自定义搜索方法
search.searchInit = function (e) {
var self = this;
}
var grid = new agGridOptions();
var gridDiv = document.querySelector("#{{$header['table']}}-grid");
gridDiv.style.height = getPanelHeight(48);
grid.remoteDataUrl = '{{url()}}';
grid.remoteParams = search.advanced.query;
grid.columnDefs = config.cols;
grid.onRowDoubleClicked = function (params) {
if (params.node.rowPinned) {
return;
}
if (params.data == undefined) {
return;
}
if (params.data.id > 0) {
action.edit(params.data);
}
};
new agGrid.Grid(gridDiv, grid);
// 读取数据
grid.remoteData({page: 1});
// 绑定自定义事件
var $gridDiv = $(gridDiv);
$gridDiv.on('click', '[data-toggle="event"]', function () {
var data = $(this).data();
if (data.master_id > 0) {
action[data.action](data);
}
});
config.grid = grid;
})(jQuery);
</script>
@include('footers')
@@ -0,0 +1,128 @@
<div class="wrapper-sm">
<div class="avatar-form">
<div class="col-sm-9">
<div class="image-box">
<img id="image" class="hide">
</div>
</div>
<div class="col-sm-3">
<div class="preview-box" style="width:150px;height:150px;">
<div class="preview" style="width:148px;height:148px;"></div>
</div>
<div class="preview-box" style="width:98px;height:98px;">
<div class="preview" style="width:96px;height:96px;"></div>
</div>
<div class="preview-box" style="width:50px;height:50px;">
<div class="preview" style="width:48px;height:48px;"></div>
</div>
</div>
<div class="clearfix"></div>
<div class="btn-avatar">
<input class="hide" id="avatarInput" name="image" type="file">
<a class="btn btn-info" onclick="$('#avatarInput').click();"><i class="fa fa-cloud-upload"></i> 上传文件</a>
<a class="btn btn-success" id="avatarCrop"><i class="fa fa-crop"></i> 裁剪</a>
</div>
</div>
</div>
<style>
.avatar-form {
position: relative;
}
.btn-avatar {
position:absolute;
bottom: 0;
right: 46px;
}
.preview-box {
border: 1px solid #eee;
padding: 0;
margin-bottom: 10px;
}
.preview {
display: block;
overflow: hidden;
}
.image-box {
border: 1px solid #eee;
height: 420px;
background-image: url(/assets/images/wf_canvas_bg.png);
background-position: -1px -1px;
}
#image {
max-width: 100%;
height: 420px;
border: 1px solid #eee;
display: block;
}
.col-sm-9 {
padding-left: 5px;
}
</style>
<link href="{{$asset_url}}/vendor/cropper/cropper.min.css" rel="stylesheet" type="text/css" />
<script src="{{$asset_url}}/vendor/cropper/cropper.min.js" type="text/javascript"></script>
<script>
$(function () {
var options = {
aspectRatio: 1,
autoCropArea: 0.5,
preview: '.preview',
}
var $image = $('#image').cropper(options);
var $inputImage = $('#avatarInput');
var uploadedImageURL = null;
if (URL) {
$inputImage.on('change', function () {
var files = this.files;
var file;
if (!$image.data('cropper')) {
return;
}
if (files && files.length) {
file = files[0];
if (/^image\/\w+$/.test(file.type)) {
uploadedImageName = file.name;
uploadedImageType = file.type;
if (uploadedImageURL) {
URL.revokeObjectURL(uploadedImageURL);
}
uploadedImageURL = URL.createObjectURL(file);
$image.cropper('destroy').attr('src', uploadedImageURL).cropper(options);
$inputImage.val('');
} else {
window.alert('请选择图片文件');
}
}
});
} else {
$inputImage.prop('disabled', true).parent().addClass('disabled');
}
$('#avatarCrop').on('click', function() {
$image.cropper('getCroppedCanvas', {width: 128, height: 128}).toBlob(function (blob) {
var formData = new FormData();
formData.append('image', blob);
$.ajax('{{url()}}', {
method: "post",
data: formData,
processData: false,
contentType: false,
success: function (res) {
$('#user-avatar').attr('src', app.url('uploads/avatar/' + res.data) + '?s=' + Math.random());
toastrSuccess('头像上传成功。');
$('#modal-avatar-dialog').dialog('close');
},
error: function () {
toastrError('头像上传失败。');
}
});
});
});
});
</script>
+137
View File
@@ -0,0 +1,137 @@
<form method="post" action="{{url()}}" id="profile" name="profile">
<div class="panel">
<div class="panel-heading tabs-box">
<ul class="nav nav-tabs">
<li class="@if(Request::action() == 'index') active @endif">
<a class="text-sm" href="{{url('index')}}">我的资料</a>
</li>
<li class="@if(Request::action() == 'password') active @endif">
<a class="text-sm" href="{{url('password')}}">修改密码</a>
</li>
</ul>
</div>
<div class="panel-body">
<div class="row">
<div class="col-sm-2">
<div class="text-center">
<span class="thumb-lg w-auto-folded avatar m-t-sm">
<a href="javascript:avatar();" class="hinted" title="修改头像"><img src="{{avatar(Auth::user()->avatar)}}" id="user-avatar" class="img-full" alt="{{Auth::user()->name}}"></a>
<div class="h4 font-thin m-t-sm">{{Auth::user()->login}}</div>
</span>
</div>
</div>
<div class="col-sm-4">
<div class="form-group">
<label class="control-label">主题</label>
<select id="change-theme" class="form-control input-sm" name="theme" id="theme">
<?php $themes = ['primary' => '原色', 'blue2' => '科技蓝', 'blue' => '经典蓝', 'wood' => '木质纸', 'purple' => '个性紫', 'green' => '绿色', 'lilac' => '淡紫色']; ?>
@if($themes)
@foreach($themes as $theme_key => $theme)
<option value="{{$theme_key}}" @if($user->theme == $theme_key) selected @endif>{{$theme}}</option>
@endforeach
@endif
</select>
</div>
<div class="form-group">
<label class="control-label">
头像显示
</label>
<select id="avatar_show" class="form-control input-sm" name="avatar_show">
<?php $avatar_shows = ['1' => '显示', '0' => '隐藏']; ?>
@if($avatar_shows)
@foreach($avatar_shows as $k => $v)
<option value="{{$k}}" @if($user->avatar_show == $k) selected @endif>{{$v}}</option>
@endforeach
@endif
</select>
</div>
<div class="form-group">
<label class="control-label">安全密钥</label>
<strong>{{$user->auth_secret}}</strong>
<span class="qrcodeTotp" style="display:none;">
<div id="qrcode_canvas"></div>
<div id="qrcode_img"></div>
</span>
<a href="javascript:;" onclick="qrcodeTotp();">
<i class="fa fa-qrcode"></i>
</a>
</div>
</div>
</div>
</div>
<div class="panel-footer">
<div class="col-sm-offset-2">
<button type="button" onclick="history.back();" class="btn btn-default">返回</button>
<button type="button" id="profile-form-submit" class="btn btn-success"><i class="fa fa-check-circle"></i> 提交</button>
</div>
</div>
</div>
</form>
<script type="text/javascript" src="{{$asset_url}}/vendor/jquery.qrcode.min.js"></script>
<script>
function qrcodeTotp() {
$.messager.alert("二次验证二维码", '<div align="center">' + $("#qrcode_img").prop("outerHTML") + '</div>');
}
function qrcodeMake(qrcode_canvas, qrcode_image) {
$("#" + qrcode_canvas).qrcode({
render: "canvas",
text: "{{$secretURL}}",
correctLevel: 1,
width: 220,
height: 220
});
var canvas = $('#' + qrcode_canvas).find('canvas')[0];
var image = new Image();
image.src = canvas.toDataURL("image/png");
$('#' + qrcode_image).append(image);
}
$(function() {
// 生成二维码
qrcodeMake('qrcode_canvas', 'qrcode_img');
// 主题修改
$('#change-theme').on('change', function() {
var e = $(this).val();
$('body').attr('class', 'theme-' + e);
top.$('body').attr('class', 'theme-' + e);
});
ajaxSubmit('profile', function(res) {
if (res.status) {
toastrSuccess(res.data);
} else {
toastrError(res.data);
}
});
});
function avatar() {
viewDialog({
title: '修改头像',
url: '{{url("avatar")}}',
dialogClass: 'modal-lg',
id: 'avatar-dialog',
buttons: [{
text: "确定",
'class': "btn-default",
click: function() {
$(this).dialog("close");
}
}]
});
}
</script>
@@ -0,0 +1,84 @@
<form method="post" action="{{url()}}" id="password" name="password">
<div class="panel">
<div class="panel-heading tabs-box">
<ul class="nav nav-tabs">
<li class="@if(Request::action() == 'index') active @endif">
<a class="text-sm" href="{{url('index')}}">我的资料</a>
</li>
<li class="@if(Request::action() == 'password') active @endif">
<a class="text-sm" href="{{url('password')}}">修改密码</a>
</li>
</ul>
</div>
<div class="panel-body">
<div class="row">
<div class="col-sm-2">
<div class="text-center">
<span class="thumb-lg w-auto-folded avatar m-t-sm">
<a href="javascript:avatar();" class="hinted" title="修改头像"><img src="{{avatar(Auth::user()->avatar)}}" id="user-avatar" class="img-full" alt="{{Auth::user()->name}}"></a>
<div class="h4 font-thin m-t-sm">{{Auth::user()->login}}</div>
</span>
</div>
</div>
<div class="col-sm-4">
<div class="form-group">
<label class="control-label">旧密码</label>
<input type="password" class="form-control input-sm" id="old_password" name="old_password" placeholder="请输入旧密码">
</div>
<div class="form-group">
<label class="control-label">新密码</label>
<input type="password" class="form-control input-sm" id="new_password" name="new_password" placeholder="请输入新密码">
</div>
<div class="form-group">
<label class="control-label">确认新密码</label>
<input type="password" id="new_password_confirmation" name="new_password_confirmation" class="form-control input-sm" placeholder="请输入再次输入新密码">
</div>
</div>
</div>
</div>
<div class="panel-footer">
<div class="col-sm-offset-2">
<button type="button" onclick="history.back();" class="btn btn-default">返回</button>
<button type="submit" id="password-form-submit" class="btn btn-success"><i class="fa fa-check-circle"></i> 提交</button>
</div>
</div>
</div>
</form>
<script>
ajaxSubmit('password', function(res) {
if (res.status) {
toastrSuccess(res.data);
} else {
toastrError(res.data);
}
});
function avatar() {
viewDialog({
title: '修改头像',
url: '{{url("avatar")}}',
dialogClass: 'modal-lg',
id: 'avatar-dialog',
buttons: [{
text: "确定",
'class': "btn-default",
click: function() {
$(this).dialog("close");
}
}]
});
}
</script>
+181
View File
@@ -0,0 +1,181 @@
<style>
.content-body {
margin: 0;
}
.form-panel-body {
overflow: hidden;
}
.left-group {
overflow: hidden;
overflow-y: auto;
height: calc(100vh - 185px);
}
.right-group {
overflow: hidden;
overflow-y: auto;
height: calc(100vh - 177px);
}
</style>
<div class="form-panel">
<div class="form-panel-header">
<div class="pull-right">
</div>
<button type="button" class="btn btn-sm btn-info" id="role-form-submit"><i class="fa fa-check"></i> 保存</button>
<a class="btn btn-sm btn-default" data-toggle="closetab" data-id="role_config"><i class="fa fa-sign-out"></i> 退出</a>
</div>
<div class="form-panel-body">
<div class="panel no-border">
<div class="padder padder-t padder-r-n">
<form id="myfilter" role="form" class="form-inline" name="myfilter" action="{{url()}}" method="get">
<div class="form-group">
<label>授权角色</label>
<select class="form-control input-sm" data-toggle="redirect" id='role_id' name='role_id' data-url="{{url($atcion, $query)}}">
@foreach($roles as $key => $role)
<option value="{{$role->id}}" @if($query['role_id']==$role->id) selected @endif>{{$role->layer_space}}{{$role->name}}</option>
@endforeach
</select>
</div>
<span class="hidden-xs">&nbsp;</span>
<div class="form-group">
<label>参照角色</label>
<select class="form-control input-sm" data-toggle="redirect" id='clone_id' name='clone_id' data-url="{{url($atcion, $query)}}">
<option value=""></option>
@foreach($roles as $key => $role)
<option value="{{$role->id}}" @if($query['clone_id']==$role->id) selected @endif>{{$role->layer_space}}{{$role->name}}</option>
@endforeach
</select>
</div>
</form>
</div>
<div class="wrapper m-t b-t" style="background-color:#f0f3f4;">
<div class="row">
<div class="col-sm-2 m-b padder-r-n">
<div class="panel panel-info">
<div class="panel-heading b-b b-light">
<div class="h5 m-t-xs m-b-xs"><i class="fa fa-cubes"></i> 模块列表</div>
</div>
<div class="list-group left-group">
@if(count($modules))
@foreach($modules as $menuKey => $menuValue)
<a class="list-group-item" onclick="module('{{$menuKey}}');" href="javascript:;">
<span class="h5">{{$menuValue['name']}}</span>
</a>
@endforeach
@endif
</div>
</div>
</div>
<div class="col-sm-10">
<form method="post" class="form-inline" action="{{url()}}" id="role" name="role">
@if(count($modules))
@foreach($modules as $menuKey => $menuValue)
<div class="modules" style="display:none;" id="{{$menuKey}}">
<div class="panel m-b-sm b-a">
<div class="panel-heading b-b b-light">
<label class="checkbox-inline"><input type="checkbox" class="menu-check">{{$menuValue['name']}}</label>
</div>
<div class="panel-body right-group">
@if(count($menuValue['controllers']))
@foreach($menuValue['controllers'] as $groupKey => $groupValue)
<div class="panel m-b-sm b-a">
<div class="panel-heading b-b b-light">
<label class="checkbox-inline" title="{{$groupKey}}"><input class="group-check" type="checkbox">{{$groupValue['name']}}</label>
</div>
<div class="panel-body">
@if(count($groupValue['actions']))
@foreach($groupValue['actions'] as $childKey => $childValue)
<div class="col-md-3 col-sm-6 wrapper-xs">
{{'';$selected = $assets[$menuKey][$groupKey.'.'.$childKey]}}
<label title="{{$childKey}}" class="checkbox-inline">
<input type="checkbox" class="action-check" name="assets[{{$menuKey}}][{{$groupKey}}.{{$childKey}}][action]" value="1" @if(isset($selected)) checked @endif>
{{$childValue['name']}}
</label>
</div>
@endforeach
@endif
</div>
</div>
@endforeach
@endif
<div class="clearfix"></div>
</div>
</div>
</div>
@endforeach
@endif
<input type="hidden" name="role_id" value="{{$query['role_id']}}">
<input type="hidden" name="key" id="key" value="{{$query['key']}}">
</form>
</div>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(function() {
$('.menu-check,.group-check').on('click', function() {
if ($(this).prop("checked") == true) {
$(this).parent().parent().parent().find(':checkbox').prop('checked', true);
} else {
$(this).parent().parent().parent().find(':checkbox').prop('checked', false);
}
});
ajaxSubmit('role', function(res) {
if (res.status) {
toastrSuccess(res.data);
} else {
toastrError(res.data);
}
});
var e = $('#role');
var key = e.find('#key').val();
if (key == '') {
var list = e.find('.modules');
key = list.eq(0).attr('id');
e.find('#key').val(key);
}
e.find('#' + key).fadeIn();
});
function module(key) {
var e = $('#role');
e.find('#key').val(key);
e.find('.modules').hide();
e.find('#' + key).fadeIn();
}
</script>
@@ -0,0 +1,3 @@
<form class="form-horizontal form-controller" method="post" id="role" name="role">
{{$form['tpl']}}
</form>
+133
View File
@@ -0,0 +1,133 @@
<div class="wrapper-xs">
<form id="dialog-{{$search['query']['id']}}-search-form" class="form-inline" method="get">
@include('searchForm6')
</form>
</div>
<div id="dialog-{{$search['query']['id']}}" class="ag-theme-balham" style="width:100%;height:380px;"></div>
<script>
(function ($) {
var search = JSON.parse('{{json_encode($search)}}');
var params = search.query;
var option = gdoo.formKey(params);
var event = gdoo.event.get(option.key);
event.trigger('query', params);
var sid = params.prefix == 1 ? 'sid' : 'id';
var gridDiv = document.querySelector("#dialog-{{$search['query']['id']}}");
var grid = new agGridOptions();
var selectedData = {};
var multiple = params.multi == 0 ? false : true;
grid.remoteDataUrl = '{{url()}}';
grid.remoteParams = params;
grid.suppressRowClickSelection = true;
grid.rowSelection = multiple ? 'multiple' : 'single';
grid.autoGroupColumnDef = {
headerName: '名称',
width: 250,
cellRendererParams: {
checkbox: true,
suppressCount: false,
}
};
grid.treeData = true;
grid.groupDefaultExpanded = -1;
grid.getDataPath = function(data) {
return data.tree_path;
};
grid.columnDefs = [];
grid.columnDefs.push({suppressMenu: true, cellClass:'text-center', field: 'id', headerName: 'ID', width: 60});
grid.onRowClicked = function(row) {
var selected = row.node.isSelected();
if (selected === false) {
row.node.setSelected(true, true);
}
};
grid.onRowDoubleClicked = function (row) {
var ret = writeSelected();
if (ret == true) {
$('#gdoo-dialog-' + params.dialog_index).dialog('close');
}
};
/**
* 初始化选择
*/
function initSelected() {
if (params.is_grid) {
} else {
var rows = {};
var id = $('#'+option.id).val();
if (id) {
var ids = id.split(',');
for (var i = 0; i < ids.length; i++) {
rows[ids[i]] = ids[i];
}
}
grid.api.forEachNode(function(node) {
var key = node.data[sid];
if (rows[key] != undefined) {
node.setSelected(true);
}
});
}
}
/**
* 写入选中
*/
function writeSelected() {
var rows = grid.api.getSelectedRows();
if (params.is_grid) {
var list = gdoo.forms[params.form_id];
list.api.dialogSelected(params);
} else {
var id = [];
var text = [];
$.each(rows, function(k, row) {
id.push(row[sid]);
text.push(row.name);
});
$('#'+option.id).val(id.join(','));
$('#'+option.id+'_text').val(text.join(','));
if (event.exist('onSelect')) {
return event.trigger('onSelect', multiple ? rows : rows[0]);
}
}
return true;
}
grid.writeSelected = writeSelected;
gdoo.dialogs[option.id] = grid;
new agGrid.Grid(gridDiv, grid);
// 读取数据
grid.remoteData();
// 数据载入成功
grid.remoteSuccessed = function() {
initSelected();
}
var data = search.forms;
var search = $("#dialog-{{$search['query']['id']}}-search-form").searchForm({
data: data
});
search.find('#search-submit').on('click', function() {
var params = search.serializeArray();
$.map(params, function(row) {
data[row.name] = row.value;
});
grid.remoteData(data);
return false;
});
})(jQuery);
</script>
+49
View File
@@ -0,0 +1,49 @@
{{$header["js"]}}
<div class="panel no-border" id="{{$header['table']}}-controller">
@include('headers')
<div class="list-jqgrid">
<div id="{{$header['table']}}-grid" class="ag-theme-balham"></div>
</div>
</div>
<script>
(function ($) {
var table = '{{$header["table"]}}';
var config = gdoo.grids[table];
var action = config.action;
var search = config.search;
action.config = function(data) {
top.addTab('user/role/config?role_id=' + data.master_id, 'role_config', '权限配置');
}
// 自定义搜索方法
search.searchInit = function (e) {
var self = this;
}
var grid = new agGridOptions();
var gridDiv = document.querySelector("#{{$header['table']}}-grid");
gridDiv.style.height = getPanelHeight(48);
grid.remoteDataUrl = '{{url()}}';
grid.remoteParams = search.advanced.query;
grid.columnDefs = config.cols;
new agGrid.Grid(gridDiv, grid);
// 读取数据
grid.remoteData({page: 1});
// 绑定自定义事件
var $gridDiv = $(gridDiv);
$gridDiv.on('click', '[data-toggle="event"]', function () {
var data = $(this).data();
if (data.master_id > 0) {
action[data.action](data);
}
});
config.grid = grid;
})(jQuery);
</script>
@include('footers')
@@ -0,0 +1,39 @@
<style>
#grid_user_role .ag-root-wrapper {
border: 0;
}
</style>
<div id="grid_user_role" class="ag-theme-balham" style="width:100%;height:380px;"></div>
<script>
var $table = null;
(function($) {
var data = JSON.parse('{{json_encode($rows)}}');
var users = JSON.parse('{{json_encode($users)}}');
var grid = new agGridOptions();
grid.suppressLoadingOverlay = true;
grid.suppressNoRowsOverlay = true;
grid.rowMultiSelectWithClick = true;
grid.suppressRowClickSelection = false;
grid.defaultColDef.sortable = false;
grid.defaultColDef.filter = false;
grid.defaultColDef.suppressMenu = true;
grid.defaultColDef.suppressNavigable = true;
grid.columnDefs = [
{field:'id', hide: true},
{width: 40, cellClass:'text-center', suppressSizeToFit: true, headerCheckboxSelection: true, checkboxSelection: true},
{headerName: '角色编码', field:'code', cellClass:'text-center', width: 60},
{headerName: '角色名称', field:'name', cellClass:'text-left', width: 120},
];
var gridDiv = document.querySelector("#grid_user_role");
new agGrid.Grid(gridDiv, grid);
grid.api.updateRowData({add:data});
grid.api.forEachNode(function(node) {
if (users[node.data.id] > 0) {
node.setSelected(true);
}
});
gdoo.dialogs['user_role'] = grid;
})(jQuery);
</script>
+36
View File
@@ -0,0 +1,36 @@
<div class="form-panel">
<div class="form-panel-header">
<div class="pull-right"></div>
{{$form['btn']}}
</div>
<div class="form-panel-body panel-form-{{$form['action']}}">
<form class="form-horizontal form-controller" method="post" id="user" name="user">
{{$form['tpl']}}
</form>
</div>
</div>
<script>
var action = '{{$form["action"]}}';
var table = '{{$form["table"]}}';
function getAuthSecret(userId) {
$.messager.confirm('操作警告', '确定要更新安全密钥。', function(btn) {
if (btn == true) {
$.post('{{url("user/profile/secret")}}',{id:userId}, function(res) {
$("#secret").html(res.data);
$('#user_auth_secret_value').val(res.data);
}, 'json');
}
});
}
$(function() {
if (action == 'show') {
var text = $('#user_auth_secret').text();
} else {
var text = $('#user_auth_secret').data('content');
}
$('#user_auth_secret').html('<input type="hidden" id="user_auth_secret_value" name="user[auth_secret]" value="'+ text +'"><code id="secret">' + text + '</code><a class="btn btn-info btn-xs" onclick="getAuthSecret();" href="javascript:;">更新</a>');
});
</script>
+155
View File
@@ -0,0 +1,155 @@
<div class="wrapper-xs">
<form id="dialog-{{$search['query']['id']}}-search-form" class="form-inline" method="get">
<!--
<div class="btn-group" data-toggle="buttons">
<label class="btn btn-sm btn-default active">
<input type="radio" name="group_id" value="1">用户
</label>
<label class="btn btn-sm btn-default">
<input type="radio" name="group_id" value="2">客户
</label>
</div>
-->
@include('searchForm3')
</form>
</div>
<div id="dialog-{{$search['query']['id']}}" class="ag-theme-balham" style="width:100%;height:380px;"></div>
<script>
(function ($) {
var search = JSON.parse('{{json_encode($search)}}');
var params = search.query;
var option = gdoo.formKey(params);
var event = gdoo.event.get(option.key);
event.trigger('query', params);
var sid = params.prefix == 1 ? 'sid' : 'id';
var gridDiv = document.querySelector("#dialog-{{$search['query']['id']}}");
var grid = new agGridOptions();
var selectedData = {};
var multiple = params.multi == 0 ? false : true;
grid.remoteDataUrl = '{{url()}}';
grid.remoteParams = params;
grid.suppressRowClickSelection = true;
grid.rowSelection = multiple ? 'multiple' : 'single';
grid.columnDefs = [
{suppressMenu: true, cellClass:'text-center', checkboxSelection: true, headerCheckboxSelection: multiple, suppressSizeToFit: true, sortable: false, width: 40},
{suppressMenu: true, cellClass:'text-center', sortable: false, field: 'username', headerName: '用户名', width: 60},
{suppressMenu: true, cellClass:'text-left', sortable: false, field: 'name', headerName: '名称', minWidth: 160},
{suppressMenu: true, cellClass:'text-center', cellRenderer: statusRenderer, field: 'status', headerName: '状态', width: 60},
{suppressMenu: true, cellClass:'text-center', field: 'id', headerName: 'ID', width: 60}
];
var selecteds = {};
var id = $('#'+option.id).val();
var text = $('#'+option.id+'_text').val();
if (id) {
var ids = id.split(',');
var texts = text.split(',');
for (var i = 0; i < ids.length; i++) {
selecteds[ids[i]] = texts[i];
}
}
function statusRenderer(row) {
if (row.value == 0) {
return '<span style="color:red">禁用</span>';
}
if (row.value == 1) {
return '启用';
}
}
grid.onCustomRowSelected = function(event) {
var data = event.node.data;
if (event.node.isSelected()) {
selecteds[data[sid]] = data.name;
} else {
delete selecteds[data[sid]];
}
}
grid.onRowClicked = function(row) {
var selected = row.node.isSelected();
if (selected === false) {
row.node.setSelected(true, true);
}
};
grid.onRowDoubleClicked = function (row) {
var ret = writeSelected();
if (ret == true) {
$('#gdoo-dialog-' + params.dialog_index).dialog('close');
}
};
/**
* 初始化选择
*/
function initSelected() {
if (params.is_grid) {
} else {
grid.api.forEachNode(function(node) {
var key = node.data[sid];
if (selecteds[key] != undefined) {
node.setSelected(true);
}
});
}
}
/**
* 写入选中
*/
function writeSelected() {
var rows = grid.api.getSelectedRows();
if (params.is_grid) {
var list = gdoo.forms[params.form_id];
list.api.dialogSelected(params);
} else {
var id = [];
var text = [];
$.each(selecteds, function(k, v) {
id.push(k);
text.push(v);
});
$('#'+option.id).val(id.join(','));
$('#'+option.id+'_text').val(text.join(','));
if (event.exist('onSelect')) {
return event.trigger('onSelect', multiple ? rows : rows[0]);
}
}
return true;
}
grid.writeSelected = writeSelected;
gdoo.dialogs[option.id] = grid;
new agGrid.Grid(gridDiv, grid);
// 读取数据
grid.remoteData({page: 1});
// 数据载入成功
grid.remoteSuccessed = function() {
initSelected();
}
var data = search.forms;
var search = $("#dialog-{{$search['query']['id']}}-search-form").searchForm({
data: data
});
search.find('#search-submit').on('click', function() {
var params = search.serializeArray();
$.map(params, function(row) {
data[row.name] = row.value;
});
grid.remoteData(data);
return false;
});
})(jQuery);
</script>
+128
View File
@@ -0,0 +1,128 @@
{{$header["js"]}}
<div class="panel no-border" id="{{$header['table']}}-controller">
@include('headers')
<div class="list-jqgrid">
<div id="{{$header['table']}}-grid" class="ag-theme-balham"></div>
</div>
</div>
<script>
(function ($) {
var table = '{{$header["table"]}}';
var config = gdoo.grids[table];
var action = config.action;
var search = config.search;
action.dialogType = 'layer';
// 自定义搜索方法
search.searchInit = function (e) {
var self = this;
}
action.user_warehouse = function(data) {
var me = this;
var grid = config.grid;
var rows = grid.api.getSelectedRows();
if (rows.length == 1) {
var user_id = rows[0].id;
formDialog({
title: '仓库权限',
url: app.url('stock/warehouse/permission', {user_id: user_id}),
storeUrl: app.url('stock/warehouse/permission'),
id: 'user_warehouse',
dialogClass:'modal-md',
onSubmit: function() {
var me = this;
var form = gdoo.dialogs['user_warehouse'];
var selectedRows = form.api.getSelectedRows();
var loading = layer.msg('数据提交中...', {
icon: 16, shade: 0.1, time: 1000 * 120
});
$.post(app.url('stock/warehouse/permission', {user_id: user_id}), {rows: selectedRows}, function(res) {
if (res.status) {
toastrSuccess(res.data);
$(me).dialog('close');
} else {
toastrError(res.data);
}
}).complete(function() {
layer.close(loading);
});
}
});
} else {
toastrError('只能选择一条记录');
}
}
action.user_role = function(data) {
var me = this;
var grid = config.grid;
var rows = grid.api.getSelectedRows();
if (rows.length == 1) {
var user_id = rows[0].id;
formDialog({
title: '角色权限',
url: app.url('user/role/permission', {user_id: user_id}),
storeUrl: app.url('user/role/permission'),
id: 'user_role',
dialogClass:'modal-md',
onSubmit: function() {
var me = this;
var form = gdoo.dialogs['user_role'];
var selectedRows = form.api.getSelectedRows();
var loading = layer.msg('数据提交中...', {
icon: 16, shade: 0.1, time: 1000 * 120
});
$.post(app.url('user/role/permission', {user_id: user_id}), {rows: selectedRows}, function(res) {
if (res.status) {
toastrSuccess(res.data);
$(me).dialog('close');
} else {
toastrError(res.data);
}
}).complete(function() {
layer.close(loading);
});
}
});
} else {
toastrError('只能选择一条记录');
}
}
var grid = new agGridOptions();
grid.remoteDataUrl = '{{url()}}';
grid.remoteParams = search.advanced.query;
grid.columnDefs = config.cols;
grid.onRowDoubleClicked = function (params) {
if (params.node.rowPinned) {
return;
}
if (params.data == undefined) {
return;
}
if (params.data.master_id > 0) {
action.show(params.data);
}
};
var gridDiv = document.querySelector("#{{$header['table']}}-grid");
gridDiv.style.height = getPanelHeight(48);
new agGrid.Grid(gridDiv, grid);
// 读取数据
grid.remoteData({page: 1});
// 绑定自定义事件
var $gridDiv = $(gridDiv);
$gridDiv.on('click', '[data-toggle="event"]', function () {
var data = $(this).data();
if (data.master_id > 0) {
action[data.action](data);
}
});
config.grid = grid;
})(jQuery);
</script>
@include('footers')