修改BUG:完善前台5个通知栏

This commit is contained in:
Argo-Lenovo 2016-11-18 14:42:51 +08:00
parent 8b04f10c27
commit 82d967f776
10 changed files with 123 additions and 107 deletions

View File

@ -149,6 +149,7 @@ a, a:hover, a:focus {
background: none; background: none;
margin-right: 0; margin-right: 0;
display: block; display: block;
white-space: nowrap;
} }
.top-menu > li > a:hover .caret { .top-menu > li > a:hover .caret {
@ -273,10 +274,18 @@ a, a:hover, a:focus {
background: #ff6c60; background: #ff6c60;
} }
.notify-row .bg-user, .notify-row .dropdown-menu.users li p {
background: #5cb85c;
}
.notify-row .bg-warning, .notify-row .dropdown-menu.notification li p { .notify-row .bg-warning, .notify-row .dropdown-menu.notification li p {
background: #FCB322; background: #FCB322;
} }
.notify-row .bg-db, .notify-row .dropdown-menu.dbs li p {
background: #d03633;
}
.notify-row > li { .notify-row > li {
float: left; float: left;
position: relative; position: relative;
@ -345,6 +354,18 @@ a, a:hover, a:focus {
border-top-color: #ff6c60; border-top-color: #ff6c60;
} }
.notify-row .dropdown-menu .notify-arrow.notify-arrow-db {
border-color: transparent transparent #d03633;
border-bottom-color: #d03633;
border-top-color: #d03633;
}
.notify-row .dropdown-menu .notify-arrow.notify-arrow-user {
border-color: transparent transparent #5cb85c;
border-bottom-color: #5cb85c;
border-top-color: #5cb85c;
}
.notify-row .dropdown-menu li:last-child, .notify-row .dropdown-menu li:last-child a:hover { .notify-row .dropdown-menu li:last-child, .notify-row .dropdown-menu li:last-child a:hover {
border-radius: 0 0 4px 4px; border-radius: 0 0 4px 4px;
} }
@ -367,14 +388,6 @@ a, a:hover, a:focus {
color: #2E2E2E; color: #2E2E2E;
} }
.notify-row .dropdown-menu .label {
padding: 0.5em 0.8em;
}
.notify-row .dropdown-menu .label.label-danger {
background-color: #FF6C60;
}
.notify-row .dropdown-menu p { .notify-row .dropdown-menu p {
color: #fff; color: #fff;
margin: 0; margin: 0;
@ -424,17 +437,22 @@ a, a:hover, a:focus {
font-size: 11px; font-size: 11px;
font-style: italic; font-style: italic;
font-weight: bold; font-weight: bold;
position: absolute; float: right;
right: 5px;
} }
.notify-row .dropdown-menu.inbox .message { .notify-row .dropdown-menu.inbox .message {
display: block !important;
font-size: 11px; font-size: 11px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
position: absolute;
right: 6px;
left: 56px;
margin-top: 2px;
} }
.notify-row .dropdown-menu.notification .label { .notify-row .dropdown-menu .label {
display: inline-block; display: inline-block;
height: 18px; height: 18px;
width: 20px; width: 20px;
@ -442,7 +460,7 @@ a, a:hover, a:focus {
margin-right: 5px; margin-right: 5px;
} }
.notify-row .dropdown-menu.notification .small { .notify-row .dropdown-menu .small {
font-size: 10px; font-size: 10px;
font-style: italic; font-style: italic;
font-weight: bold; font-weight: bold;
@ -450,7 +468,7 @@ a, a:hover, a:focus {
padding-top: 2px; padding-top: 2px;
} }
.notify-row .dropdown-menu.notification li a div { .notify-row .dropdown-menu li a div {
position: absolute; position: absolute;
left: 36px; left: 36px;
right: 44px; right: 44px;

View File

@ -47,17 +47,49 @@
if (!$.browser.versions.ios) $("#sidebar").niceScroll({ styler: "fb", cursorcolor: "#e8403f", cursorwidth: '3', cursorborderradius: '10px', background: '#404040', spacebarenabled: false, cursorborder: '', scrollspeed: 60 }); if (!$.browser.versions.ios) $("#sidebar").niceScroll({ styler: "fb", cursorcolor: "#e8403f", cursorwidth: '3', cursorborderradius: '10px', background: '#404040', spacebarenabled: false, cursorborder: '', scrollspeed: 60 });
// load widget data // load widget data
Notifications.retrieveAllNotifies(function (result) { bd({
$('#logoutNoti').text(result.NewUsersCount); url: '../api/Notifications/',
swal: false,
method: 'GET',
callback: function (result) {
$('#logoutNoti').text(result.NewUsersCount);
// new users // new users
$('#msgHeaderUser').text(result.NewUsersCount); $('#msgHeaderUser').text(result.NewUsersCount);
$('#msgHeaderUserBadge').text(result.NewUsersCount); $('#msgHeaderUserBadge').text(result.NewUsersCount);
var htmlUserTemplate = '<li><a href="../Admin/Notifications"><span class="label label-success"><i class="fa fa-plus"></i></span><div title="{1}">{0}({1})</div><span class="small italic">{2}</span></a></li>'; var htmlUserTemplate = '<li><a href="../Admin/Notifications"><span class="label label-success"><i class="fa fa-plus"></i></span><div title="{2}">{1}({0})</div><span class="small italic">{3}</span></a></li>';
var html = result.Users.map(function (u) { var html = result.Users.map(function (u) {
return $.format(htmlUserTemplate, u.UserName, u.DisplayName, u.Period); return $.format(htmlUserTemplate, u.UserName, u.DisplayName, u.Description, u.Period);
}).join(''); }).join('');
$(html).insertAfter($('#msgHeaderUserContent')); $(html).insertAfter($('#msgHeaderUserContent'));
console.log(result);
// apps
$('#msgHeaderApp').text(result.AppExceptionsCount);
$('#msgHeaderAppBadge').text(result.AppExceptionsCount);
htmlUserTemplate = '<li><a href="../Admin/Exceptions"><span class="label label-warning"><i class="fa fa-bug"></i></span><div title="{1}">{0}</div><span class="small italic">{2}</span></a></li>';
html = result.Apps.map(function (u) {
return $.format(htmlUserTemplate, u.ExceptionType, u.Message, u.Period);
}).join('');
$(html).insertAfter($('#msgHeaderAppContent'));
// dbs
$('#msgHeaderDb').text(result.DbExceptionsCount);
$('#msgHeaderDbBadge').text(result.DbExceptionsCount);
htmlUserTemplate = '<li><a href="../Admin/Exceptions"><span class="label label-danger"><i class="fa fa-bolt"></i></span><div title="{1}">{0}</div><span class="small italic">{2}</span></a></li>';
html = result.Dbs.map(function (u) {
return $.format(htmlUserTemplate, u.ErrorPage, u.Message, u.Period);
}).join('');
$(html).insertAfter($('#msgHeaderDbContent'));
// messages
$('#msgHeaderMsg').text(result.MessagesCount);
$('#msgHeaderMsgBadge').text(result.MessagesCount);
htmlUserTemplate = '<li><a href="../Admin/Messages?id={0}"><span class="photo"><img alt="avatar" src="{1}"></span><span class="subject"><span class="from">{2}</span><span class="time">{4}</span></span><span class="message" title="{5}">{3}</span></a></li>';
html = result.Messages.map(function (u) {
return $.format(htmlUserTemplate, u.ID, u.FromIcon, u.FromDisplayName, u.Title, u.Period, u.Content);
}).join('');
$(html).insertAfter($('#msgHeaderMsgContent'));
console.log(result);
}
}); });
}); });

View File

@ -432,15 +432,4 @@
Dicts.retrieveCategories = function (callback) { Dicts.retrieveCategories = function (callback) {
processData.call(this, { Id: 1, callback: callback, swal: false, data: { type: 'category' } }); processData.call(this, { Id: 1, callback: callback, swal: false, data: { type: 'category' } });
}; };
// Notifi
Notifications = {
url: '../api/Notifications/'
};
Notifications.retrieveNotifies = function (category, callback) {
processData.call(this, { Id: category, callback: callback, method: "GET", swal: false });
};
Notifications.retrieveAllNotifies = function (callback) {
processData.call(this, { Id: "", callback: callback, method: "GET", swal: false });
}
})(jQuery); })(jQuery);

View File

@ -37,6 +37,7 @@ namespace Bootstrap.Admin.Controllers
//Message //Message
var message = MessageHelper.RetrieveMessagesHeader(User.Identity.Name); var message = MessageHelper.RetrieveMessagesHeader(User.Identity.Name);
ret.Messages = message.Take(6).ToList(); ret.Messages = message.Take(6).ToList();
ret.Messages.AsParallel().ForAll(m => m.FromIcon = Url.Content(m.FromIcon));
ret.MessagesCount = message.Count(); ret.MessagesCount = message.Count();
//Apps //Apps
@ -44,6 +45,7 @@ namespace Bootstrap.Admin.Controllers
ret.Apps = apps.Take(6).OrderByDescending(a => a.LogTime).ToList(); ret.Apps = apps.Take(6).OrderByDescending(a => a.LogTime).ToList();
ret.Apps.AsParallel().ForAll(n => ret.Apps.AsParallel().ForAll(n =>
{ {
n.ExceptionType = n.ExceptionType.Split('.').Last();
var ts = DateTime.Now - n.LogTime; var ts = DateTime.Now - n.LogTime;
if (ts.TotalMinutes < 5) n.Period = "刚刚"; if (ts.TotalMinutes < 5) n.Period = "刚刚";
else if (ts.Days > 0) n.Period = string.Format("{0}天", ts.Days); else if (ts.Days > 0) n.Period = string.Format("{0}天", ts.Days);
@ -77,8 +79,6 @@ namespace Bootstrap.Admin.Controllers
{ {
var ret = new Notifications(); var ret = new Notifications();
if (id == "newusers" || id == "all") ret.Users = UserHelper.RetrieveNewUsers().OrderByDescending(u => u.RegisterTime).ToList(); if (id == "newusers" || id == "all") ret.Users = UserHelper.RetrieveNewUsers().OrderByDescending(u => u.RegisterTime).ToList();
else if (id == "apps" || id == "all") ret.Apps = ExceptionHelper.RetrieveExceptions().Where(n => n.ExceptionType != "Longbow.Data.DBAccessException").OrderByDescending(a => a.LogTime).ToList();
else if (id == "dbs" || id == "all") ret.Dbs = ExceptionHelper.RetrieveExceptions().Where(n => n.ExceptionType == "Longbow.Data.DBAccessException").OrderByDescending(d => d.LogTime).ToList();
return ret; return ret;
} }

View File

@ -1,34 +1,23 @@
$(function () { $(function () {
var htmlNewUsers = '<li class="list-primary"><i class="fa fa-ellipsis-v"></i><div class="task-title notifi"><span class="task-title-sp">{0}</span><span class="task-value">{1}</span><span class="task-time">{2}</span><div class="pull-right hidden-phone"><button class="btn btn-success btn-xs fa fa-check" data-id="{3}" data-result="1"></button><button class="btn btn-danger btn-xs fa fa-remove" data-id="{3}" data-result="0" data-placement="left" data-original-title="拒绝授权"></button></div></div></li>'; var htmlNewUsers = '<li class="list-primary"><i class="fa fa-ellipsis-v"></i><div class="task-title notifi"><span class="task-title-sp">{0}</span><span class="task-value">{1}</span><span class="task-time">{2}</span><div class="pull-right hidden-phone"><button class="btn btn-success btn-xs fa fa-check" data-id="{3}" data-result="1"></button><button class="btn btn-danger btn-xs fa fa-remove" data-id="{3}" data-result="0" data-placement="left" data-original-title="拒绝授权"></button></div></div></li>';
var htmlApp = '<li class="list-warning"><i class="fa fa-ellipsis-v"></i><div class="task-title notifi"><span class="task-title-sp">{0}</span><span class="task-value">{1}</span><span class="task-time">{2}</span><div class="pull-right hidden-phone"><a href="../Admin/Exceptions?id={3}" class="btn btn-warning btn-xs fa fa-bug"></a></div></div></li>';
var htmlDb = '<li class="list-danger"><i class="fa fa-ellipsis-v"></i><div class="task-title notifi"><span class="task-title-sp">{0}</span><span class="task-value">{1}</span><span class="task-time">{2}</span><div class="pull-right hidden-phone"><a href="../Admin/Exceptions?id={3}" class="btn btn-danger btn-xs fa fa-database"></a></div></div></li>';
function listData(options) { function listData(options) {
options = $.extend({ animation: true, ctl: $('a.fa-refresh') }, options); options = $.extend({ animation: true, ctl: $('a.fa-refresh') }, options);
var category = options.ctl.length == 1 ? options.ctl.attr('data-category') : "all";
if (options.animation) options.ctl.toggleClass('fa-spin'); if (options.animation) options.ctl.toggleClass('fa-spin');
Notifications.retrieveNotifies(category, function (result) { bd({
if (result) { Id: 'newusers',
if (category == 'newusers' || category == 'all') { url: '../api/Notifications/',
method: 'GET',
swal: false,
callback: function (result) {
if (result) {
var content = result.Users.map(function (noti) { var content = result.Users.map(function (noti) {
return $.format(htmlNewUsers, noti.UserName, noti.Description, noti.RegisterTime, noti.ID); return $.format(htmlNewUsers, noti.UserName, noti.Description, noti.RegisterTime, noti.ID);
}).join(''); }).join('');
$('#tasks-users').html(content); $('#tasks-users').html(content);
} }
if (category == 'apps' || category == 'all') { if (options.animation) options.ctl.toggleClass('fa-spin');
var content = result.Apps.map(function (noti) {
return $.format(htmlApp, noti.Title, noti.Content, noti.RegisterTime, noti.ID);
}).join('');
$('#tasks-app').html(content);
}
if (category == 'dbs' || category == 'all') {
var content = result.Dbs.map(function (noti) {
return $.format(htmlDb, noti.Title, noti.Content, noti.RegisterTime, noti.ID);
}).join('');
$('#tasks-db').html(content);
}
} }
if (options.animation) options.ctl.toggleClass('fa-spin');
}); });
} }
listData(); listData();
@ -41,8 +30,7 @@
var id = $(this).attr('data-id'); var id = $(this).attr('data-id');
var result = $(this).attr('data-result'); var result = $(this).attr('data-result');
User.processUser(id, result, function (result) { User.processUser(id, result, function (result) {
var refresh = $('#tasks-users').parentsUntil('div.panel').last().prev().find('a.fa-refresh'); listData({ ctl: $('#refreshUsers') });
listData(refresh);
}); });
}); });
}); });

View File

@ -18,7 +18,7 @@
@Html.Partial("Navigator", Model) @Html.Partial("Navigator", Model)
} }
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading">用户注册<span class="pull-right"><a href="javascript:;" class="fa fa-refresh" data-category="newusers"></a></span></div> <div class="panel-heading">用户注册<span class="pull-right"><a id="refreshUsers" href="javascript:;" class="fa fa-refresh"></a></span></div>
<div class="panel-body"> <div class="panel-body">
<div class="tasks-widget"> <div class="tasks-widget">
<ul id="tasks-users" class="task-list ui-sortable"> <ul id="tasks-users" class="task-list ui-sortable">
@ -26,22 +26,3 @@
</div> </div>
</div> </div>
</div> </div>
<div class="panel panel-default">
<div class="panel-heading">程序错误<a href="javascript:;" class="pull-right fa fa-refresh" data-category="apps"></a></div>
<div class="panel-body">
<div class="tasks-widget">
<ul id="tasks-app" class="task-list ui-sortable">
</ul>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">数据库错误<span class="pull-right"><a href="javascript:;" class="fa fa-refresh" data-category="dbs"></a></span></div>
<div class="panel-body">
<div class="tasks-widget">
<ul id="tasks-db" class="task-list ui-sortable">
</ul>
</div>
</div>
</div>

View File

@ -34,10 +34,10 @@
<ul class="dropdown-menu tasks-bar"> <ul class="dropdown-menu tasks-bar">
<div class="notify-arrow notify-arrow-green"></div> <div class="notify-arrow notify-arrow-green"></div>
<li> <li>
<p>您有 0 个未读的消息</p> <p>您有 0 个未完成的任务</p>
</li> </li>
<li> <li>
<a href="~/Admin/Tasks">查看所有消息</a> <a href="~/Admin/Tasks">查看所有任务</a>
</li> </li>
</ul> </ul>
</li> </li>
@ -46,12 +46,12 @@
<li class="dropdown"> <li class="dropdown">
<a data-toggle="dropdown" class="dropdown-toggle" href="#"> <a data-toggle="dropdown" class="dropdown-toggle" href="#">
<i class="fa fa-envelope"></i> <i class="fa fa-envelope"></i>
<span class="badge bg-important"></span> <span id="msgHeaderMsgBadge" class="badge bg-important"></span>
</a> </a>
<ul class="dropdown-menu inbox"> <ul class="dropdown-menu inbox">
<div class="notify-arrow notify-arrow-red"></div> <div class="notify-arrow notify-arrow-red"></div>
<li> <li id="msgHeaderMsgContent">
<p>您有 0 个未读的消息</p> <p>您有 <span id="msgHeaderMsg">0</span> 个未读的消息</p>
</li> </li>
<li> <li>
<a href="~/Admin/Messages">查看所有消息</a> <a href="~/Admin/Messages">查看所有消息</a>
@ -63,14 +63,14 @@
<li class="dropdown"> <li class="dropdown">
<a data-toggle="dropdown" class="dropdown-toggle" href="#"> <a data-toggle="dropdown" class="dropdown-toggle" href="#">
<i class="fa fa-user-plus"></i> <i class="fa fa-user-plus"></i>
<span id="msgHeaderUserBadge" class="badge bg-warning"></span> <span id="msgHeaderUserBadge" class="badge bg-user"></span>
</a> </a>
<ul class="dropdown-menu notification"> <ul class="dropdown-menu users">
<div class="notify-arrow notify-arrow-yellow"></div> <div class="notify-arrow notify-arrow-user"></div>
<li id="msgHeaderUserContent"> <li id="msgHeaderUserContent">
<p>您有 <span id="msgHeaderUser">0</span> 条新通知</p> <p>您有 <span id="msgHeaderUser">0</span> 条新用户通知</p>
</li> </li>
<li id="msgHeaderUserFooter"> <li>
<a href="~/Admin/Notifications">查看所有通知</a> <a href="~/Admin/Notifications">查看所有通知</a>
</li> </li>
</ul> </ul>
@ -80,15 +80,15 @@
<li class="dropdown"> <li class="dropdown">
<a data-toggle="dropdown" class="dropdown-toggle" href="#"> <a data-toggle="dropdown" class="dropdown-toggle" href="#">
<i class="fa fa-bug"></i> <i class="fa fa-bug"></i>
<span class="badge bg-warning"></span> <span id="msgHeaderAppBadge" class="badge bg-warning"></span>
</a> </a>
<ul class="dropdown-menu notification"> <ul class="dropdown-menu notification">
<div class="notify-arrow notify-arrow-yellow"></div> <div class="notify-arrow notify-arrow-yellow"></div>
<li> <li id="msgHeaderAppContent">
<p>您有 0 条新通知</p> <p>您有 <span id="msgHeaderApp">0</span> 条程序异常通知</p>
</li> </li>
<li> <li>
<a href="~/Admin/Notifications">查看所有通知</a> <a href="~/Admin/Exceptions">查看所有异常</a>
</li> </li>
</ul> </ul>
</li> </li>
@ -97,15 +97,15 @@
<li class="dropdown"> <li class="dropdown">
<a data-toggle="dropdown" class="dropdown-toggle" href="#"> <a data-toggle="dropdown" class="dropdown-toggle" href="#">
<i class="fa fa-database"></i> <i class="fa fa-database"></i>
<span class="badge bg-warning"></span> <span id="msgHeaderDbBadge" class="badge bg-db"></span>
</a> </a>
<ul class="dropdown-menu notification"> <ul class="dropdown-menu dbs">
<div class="notify-arrow notify-arrow-yellow"></div> <div class="notify-arrow notify-arrow-db"></div>
<li> <li id="msgHeaderDbContent">
<p>您有 0 条新通知</p> <p>您有 <span id="msgHeaderDb">0</span> 条数据库异常通知</p>
</li> </li>
<li> <li>
<a href="~/Admin/Notifications">查看所有通知</a> <a href="~/Admin/Exceptions">查看所有异常</a>
</li> </li>
</ul> </ul>
</li> </li>
@ -115,9 +115,6 @@
} }
<!--search & user info start--> <!--search & user info start-->
<ul class="pull-right top-menu"> <ul class="pull-right top-menu">
<li>
<input type="text" class="form-control search" placeholder="搜索">
</li>
<!-- user login dropdown start--> <!-- user login dropdown start-->
<li class="dropdown"> <li class="dropdown">
<a data-toggle="dropdown" class="dropdown-toggle" href="#"> <a data-toggle="dropdown" class="dropdown-toggle" href="#">

View File

@ -63,9 +63,10 @@ namespace Bootstrap.DataAccess
ErrorPage = (string)reader[2], ErrorPage = (string)reader[2],
UserID = (string)reader[3], UserID = (string)reader[3],
UserIp = (string)reader[4], UserIp = (string)reader[4],
Message = (string)reader[5], ExceptionType = (string)reader[5],
StackTrace = (string)reader[6], Message = (string)reader[6],
LogTime = (DateTime)reader[7], StackTrace = (string)reader[7],
LogTime = (DateTime)reader[8],
}); });
} }
} }

View File

@ -60,5 +60,13 @@ namespace Bootstrap.DataAccess
/// 获得/设置 时间描述 2分钟内为刚刚 /// 获得/设置 时间描述 2分钟内为刚刚
/// </summary> /// </summary>
public string Period { get; set; } public string Period { get; set; }
/// <summary>
/// 获得/设置 发件人头像
/// </summary>
public string FromIcon { get; set; }
/// <summary>
/// 获得/设置 发件人昵称
/// </summary>
public string FromDisplayName { get; set; }
} }
} }

View File

@ -26,7 +26,7 @@ namespace Bootstrap.DataAccess
{ {
var messageRet = CacheManager.GetOrAdd(RetrieveMessageDataKey, CacheSection.RetrieveIntervalByKey(RetrieveMessageDataKey), key => var messageRet = CacheManager.GetOrAdd(RetrieveMessageDataKey, CacheSection.RetrieveIntervalByKey(RetrieveMessageDataKey), key =>
{ {
string sql = "select m.*, d.Name from [Messages] m left join Dicts d on m.Label = d.Code and d.Category = N'消息状态' and d.Define = 0 where[To] = @UserName or [From] = @UserName"; string sql = "select m.*, d.Name, isnull(i.Code + u.Icon, '~/Content/images/uploader/default.jpg'), u.DisplayName from[Messages] m left join Dicts d on m.Label = d.Code and d.Category = N'消息状态' and d.Define = 0 left join Dicts i on i.Category = N'头像地址' and i.Name = N'头像路径' and i.Define = 0 inner join Users u on m.[From] = u.UserName where [To] = @UserName or [From] = @UserName";
List<Message> messages = new List<Message>(); List<Message> messages = new List<Message>();
DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql); DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql);
try try
@ -48,7 +48,9 @@ namespace Bootstrap.DataAccess
Mark = (int)reader[7], Mark = (int)reader[7],
IsDelete = (int)reader[8], IsDelete = (int)reader[8],
Label = (string)reader[9], Label = (string)reader[9],
LabelName = LgbConvert.ReadValue(reader[10], string.Empty) LabelName = LgbConvert.ReadValue(reader[10], string.Empty),
FromIcon = (string)reader[11],
FromDisplayName = (string)reader[12]
}); });
} }
} }