增加功能:个人中心增加自定义默认应用程序功能 #IS0WK
This commit is contained in:
parent
b1836eb567
commit
d6b63281fe
|
@ -40,12 +40,14 @@ namespace Bootstrap.Admin.Controllers.Api
|
||||||
{
|
{
|
||||||
return UserHelper.SaveUserCssByName(value.UserName, value.Css);
|
return UserHelper.SaveUserCssByName(value.UserName, value.Css);
|
||||||
}
|
}
|
||||||
if (value.UserName.Equals(User.Identity.Name, System.StringComparison.OrdinalIgnoreCase))
|
if (value.UserName.Equals(User.Identity.Name, StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
if (value.UserStatus == UserStates.ChangeDisplayName)
|
if (value.UserStatus == UserStates.ChangeDisplayName)
|
||||||
ret = UserHelper.SaveDisplayName(value.UserName, value.DisplayName);
|
ret = UserHelper.SaveDisplayName(value.UserName, value.DisplayName);
|
||||||
else if (value.UserStatus == UserStates.ChangePassword)
|
else if (value.UserStatus == UserStates.ChangePassword)
|
||||||
ret = UserHelper.ChangePassword(value.UserName, value.Password, value.NewPassword);
|
ret = UserHelper.ChangePassword(value.UserName, value.Password, value.NewPassword);
|
||||||
|
else if (value.UserStatus == UserStates.SaveApp)
|
||||||
|
ret = UserHelper.SaveApp(value.UserName, value.App);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,8 +17,9 @@ namespace Bootstrap.Admin.Controllers
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public IActionResult Index()
|
public IActionResult Index()
|
||||||
{
|
{
|
||||||
var url = DictHelper.RetrieveHomeUrl();
|
var model = new HeaderBarModel(User.Identity);
|
||||||
return url.Equals("~/Home/Index", System.StringComparison.OrdinalIgnoreCase) ? (IActionResult)View(new HeaderBarModel(User.Identity)) : Redirect(url);
|
var url = DictHelper.RetrieveHomeUrl(model.AppCode);
|
||||||
|
return url.Equals("~/Home/Index", System.StringComparison.OrdinalIgnoreCase) ? (IActionResult)View(model) : Redirect(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -18,19 +18,28 @@ namespace Bootstrap.Admin.Models
|
||||||
Icon = string.Format("{0}{1}", DictHelper.RetrieveIconFolderPath(), user.Icon);
|
Icon = string.Format("{0}{1}", DictHelper.RetrieveIconFolderPath(), user.Icon);
|
||||||
DisplayName = user.DisplayName;
|
DisplayName = user.DisplayName;
|
||||||
UserName = user.UserName;
|
UserName = user.UserName;
|
||||||
|
AppCode = user.App;
|
||||||
if (!string.IsNullOrEmpty(user.Css)) Theme = user.Css;
|
if (!string.IsNullOrEmpty(user.Css)) Theme = user.Css;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string UserName { get; }
|
public string UserName { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string DisplayName { get; }
|
public string DisplayName { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获得/设置 用户头像地址
|
/// 获得/设置 用户头像地址
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Icon { get; }
|
public string Icon { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获得 当前设置的默认应用
|
||||||
|
/// </summary>
|
||||||
|
public string AppCode { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -10,13 +10,15 @@ namespace Bootstrap.Admin.Models
|
||||||
public class ProfilesModel : ThemeModel
|
public class ProfilesModel : ThemeModel
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获得/设置 头像文件大小
|
/// 获得 头像文件大小
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public long Size { get; }
|
public long Size { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// 获得 头像文件名称
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string FileName { get; }
|
public string FileName { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -76,6 +76,25 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">默认应用</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="btn-group" role="group">
|
||||||
|
<button id="app" class="btn btn-success dropdown-select dropdown-toggle" data-toggle="dropdown" data-default-val="" value="@Model.AppCode">未设置</button>
|
||||||
|
<div class="dropdown-menu">
|
||||||
|
@foreach (var app in Model.Applications)
|
||||||
|
{
|
||||||
|
<a href="#" data-val="@app.Key">@app.Value</a>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer d-none" data-admin="@User.IsInRole("Administrators")">
|
||||||
|
<button id="btnSaveApp" data-method="app" class="btn btn-secondary" type="button"><i class="fa fa-save"></i><span>保存</span></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header">网站皮肤</div>
|
<div class="card-header">网站皮肤</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
|
|
|
@ -67,7 +67,8 @@
|
||||||
NewPassword: "#newPassword",
|
NewPassword: "#newPassword",
|
||||||
DisplayName: "#displayName",
|
DisplayName: "#displayName",
|
||||||
UserName: "#userName",
|
UserName: "#userName",
|
||||||
Css: "#css"
|
Css: "#css",
|
||||||
|
App: '#app'
|
||||||
});
|
});
|
||||||
|
|
||||||
$('button[data-method]').on('click', function (e) {
|
$('button[data-method]').on('click', function (e) {
|
||||||
|
@ -100,6 +101,16 @@
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
case 'app':
|
||||||
|
data.UserStatus = 'SaveApp';
|
||||||
|
$.bc({
|
||||||
|
url: User.url, method: "put", data: data, title: "保存应用", callback: function (result) {
|
||||||
|
if (result) {
|
||||||
|
window.setTimeout(function () { window.location.reload(true); }, 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
$('[data-admin="False"]').removeClass('d-none');
|
$('[data-admin="False"]').removeClass('d-none');
|
||||||
|
@ -107,4 +118,5 @@
|
||||||
$('.card-img').removeClass('d-none');
|
$('.card-img').removeClass('d-none');
|
||||||
}
|
}
|
||||||
$('#css').dropdown('val');
|
$('#css').dropdown('val');
|
||||||
|
$('#app').dropdown('val');
|
||||||
});
|
});
|
|
@ -11,7 +11,7 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Bootstrap.Security.DataAccess" Version="2.0.0" />
|
<PackageReference Include="Bootstrap.Security.DataAccess" Version="2.1.0" />
|
||||||
<PackageReference Include="Longbow.Cache" Version="2.2.3" />
|
<PackageReference Include="Longbow.Cache" Version="2.2.3" />
|
||||||
<PackageReference Include="Longbow.Data" Version="2.2.6" />
|
<PackageReference Include="Longbow.Data" Version="2.2.6" />
|
||||||
<PackageReference Include="Longbow.Web" Version="2.2.4" />
|
<PackageReference Include="Longbow.Web" Version="2.2.4" />
|
||||||
|
|
|
@ -51,6 +51,13 @@ namespace Bootstrap.DataAccess.MongoDB
|
||||||
return u != null && !string.IsNullOrEmpty(u.PassSalt) && u.Password == LgbCryptography.ComputeHash(password, u.PassSalt);
|
return u != null && !string.IsNullOrEmpty(u.PassSalt) && u.Password == LgbCryptography.ComputeHash(password, u.PassSalt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override bool SaveApp(string userName, string app)
|
||||||
|
{
|
||||||
|
var update = Builders<User>.Update.Set(u => u.App, app);
|
||||||
|
DbManager.Users.FindOneAndUpdate(u => u.UserName.ToLowerInvariant() == UserName.ToLowerInvariant(), update);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Bootstrap.Security.DataAccess" Version="2.0.0" />
|
<PackageReference Include="Bootstrap.Security.DataAccess" Version="2.1.0" />
|
||||||
<PackageReference Include="Longbow.Data" Version="2.2.6" />
|
<PackageReference Include="Longbow.Data" Version="2.2.6" />
|
||||||
<PackageReference Include="Longbow.Security.Cryptography" Version="1.3.0" />
|
<PackageReference Include="Longbow.Security.Cryptography" Version="1.3.0" />
|
||||||
<PackageReference Include="Longbow.Web" Version="2.2.4" />
|
<PackageReference Include="Longbow.Web" Version="2.2.4" />
|
||||||
|
|
|
@ -96,8 +96,26 @@ namespace Bootstrap.DataAccess
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获得默认的前台首页地址,默认为~/Home/Index
|
/// 获得默认的前台首页地址,默认为~/Home/Index
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="appCode"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public virtual string RetrieveHomeUrl() => (DictHelper.RetrieveDicts().FirstOrDefault(d => d.Name == "前台首页" && d.Category == "网站设置" && d.Define == 0) ?? new BootstrapDict() { Code = "~/Home/Index" }).Code;
|
public virtual string RetrieveHomeUrl(string appCode)
|
||||||
|
{
|
||||||
|
// https://gitee.com/LongbowEnterprise/dashboard/issues?id=IS0WK
|
||||||
|
var url = "~/Home/Index";
|
||||||
|
var dicts = DictHelper.RetrieveDicts();
|
||||||
|
if (appCode != "0")
|
||||||
|
{
|
||||||
|
var appUrl = dicts.FirstOrDefault(d => d.Name.Equals(appCode, StringComparison.OrdinalIgnoreCase) && d.Category == "应用首页" && d.Define == 0)?.Code;
|
||||||
|
if (!string.IsNullOrEmpty(appUrl))
|
||||||
|
{
|
||||||
|
url = appUrl;
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var defaultUrl = dicts.FirstOrDefault(d => d.Name == "前台首页" && d.Category == "网站设置" && d.Define == 0)?.Code;
|
||||||
|
if (!string.IsNullOrEmpty(defaultUrl)) url = defaultUrl;
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
|
|
|
@ -106,8 +106,9 @@ namespace Bootstrap.DataAccess
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获得默认的前台首页地址,默认为~/Home/Index
|
/// 获得默认的前台首页地址,默认为~/Home/Index
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="appCode">应用程序编码</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static string RetrieveHomeUrl() => DbContextManager.Create<Dict>().RetrieveHomeUrl();
|
public static string RetrieveHomeUrl(string appCode) => DbContextManager.Create<Dict>().RetrieveHomeUrl(appCode);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using Bootstrap.Security;
|
using Bootstrap.Security;
|
||||||
using Longbow.Cache;
|
using Longbow.Cache;
|
||||||
using Longbow.Data;
|
using Longbow.Data;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace Bootstrap.DataAccess
|
namespace Bootstrap.DataAccess
|
||||||
|
@ -48,6 +49,19 @@ namespace Bootstrap.DataAccess
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 保存用户默认App
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="userName"></param>
|
||||||
|
/// <param name="app"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static bool SaveApp(string userName, string app)
|
||||||
|
{
|
||||||
|
var ret = DbContextManager.Create<User>().SaveApp(userName, app);
|
||||||
|
if (ret) CacheCleanUtility.ClearCache(cacheKey: $"{RetrieveUsersDataKey}*");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 保存新建
|
/// 保存新建
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -163,6 +177,7 @@ namespace Bootstrap.DataAccess
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
/// 根据用户名修改用户头像
|
/// 根据用户名修改用户头像
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="userName"></param>
|
/// <param name="userName"></param>
|
||||||
|
|
|
@ -81,6 +81,14 @@ namespace Bootstrap.DataAccess
|
||||||
return user != null && !string.IsNullOrEmpty(user.PassSalt) && user.Password == LgbCryptography.ComputeHash(password, user.PassSalt);
|
return user != null && !string.IsNullOrEmpty(user.PassSalt) && user.Password == LgbCryptography.ComputeHash(password, user.PassSalt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="userName"></param>
|
||||||
|
/// <param name="app"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public virtual bool SaveApp(string userName, string app) => DbManager.Create().Update<User>("set App = @1 where UserName = @0", userName, app) == 1;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -358,6 +366,10 @@ namespace Bootstrap.DataAccess
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
RejectUser
|
RejectUser,
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
SaveApp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
"Description": "系统默认创建",
|
"Description": "系统默认创建",
|
||||||
"Icon": "default.jpg",
|
"Icon": "default.jpg",
|
||||||
"Css": null,
|
"Css": null,
|
||||||
|
"App": null,
|
||||||
"Roles": [
|
"Roles": [
|
||||||
"5bd7cc105fa31256f77e4eb7"
|
"5bd7cc105fa31256f77e4eb7"
|
||||||
],
|
],
|
||||||
|
@ -30,6 +31,7 @@
|
||||||
"Description": "管理员Admin创建用户",
|
"Description": "管理员Admin创建用户",
|
||||||
"Icon": "default.jpg",
|
"Icon": "default.jpg",
|
||||||
"Css": null,
|
"Css": null,
|
||||||
|
"App": null,
|
||||||
"Groups": [
|
"Groups": [
|
||||||
|
|
||||||
],
|
],
|
||||||
|
|
|
@ -110,6 +110,12 @@ namespace Bootstrap.Admin.Api
|
||||||
resp = await client.PutAsJsonAsync<User, bool>(usr);
|
resp = await client.PutAsJsonAsync<User, bool>(usr);
|
||||||
Assert.True(resp);
|
Assert.True(resp);
|
||||||
|
|
||||||
|
// change app
|
||||||
|
usr.App = "UnitTest";
|
||||||
|
usr.UserStatus = UserStates.SaveApp;
|
||||||
|
resp = await client.PutAsJsonAsync<User, bool>(usr);
|
||||||
|
Assert.True(resp);
|
||||||
|
|
||||||
// delete
|
// delete
|
||||||
usr.Delete(usr.Retrieves().Where(u => u.UserName == usr.UserName).Select(u => u.Id));
|
usr.Delete(usr.Retrieves().Where(u => u.UserName == usr.UserName).Select(u => u.Id));
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,7 +80,7 @@ namespace Bootstrap.DataAccess
|
||||||
public void RetrieveHomeUrl_Ok()
|
public void RetrieveHomeUrl_Ok()
|
||||||
{
|
{
|
||||||
var dict = new Dict();
|
var dict = new Dict();
|
||||||
Assert.Equal("~/Home/Index", dict.RetrieveHomeUrl());
|
Assert.Equal("~/Home/Index", dict.RetrieveHomeUrl("0"));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
Loading…
Reference in New Issue