diff --git a/src/admin/Bootstrap.Admin/Controllers/Api/SettingsController.cs b/src/admin/Bootstrap.Admin/Controllers/Api/SettingsController.cs index 63444be5..12a9743b 100644 --- a/src/admin/Bootstrap.Admin/Controllers/Api/SettingsController.cs +++ b/src/admin/Bootstrap.Admin/Controllers/Api/SettingsController.cs @@ -1,4 +1,5 @@ -using Bootstrap.DataAccess; +using Bootstrap.Admin.Query; +using Bootstrap.DataAccess; using Bootstrap.Security; using Longbow.Cache; using Microsoft.AspNetCore.Authorization; @@ -34,16 +35,29 @@ namespace Bootstrap.Admin.Controllers.Api public bool Post(string id, [FromBody]BootstrapDict dict) => id switch { "Demo" => DictHelper.UpdateSystemModel(dict.Code == "1", dict.Name), - "AppPath" => DictHelper.SaveAppSettings(dict), _ => false }; + /// + /// 保存前台应用时调用 + /// + /// + [HttpPut()] + public bool Put([FromBody]QueryAppOption option) => option.Save(); + /// /// 获取网站缓存站点集合 /// [HttpGet] public IEnumerable Get() => CacheManager.CorsSites; + /// + /// 通过指定 AppKey 获取前台应用配置信息 + /// + /// + [HttpGet("{key}")] + public QueryAppOption Get(string key) => QueryAppOption.RetrieveByKey(key); + /// /// 删除指定键值的前台应用配置信息 /// diff --git a/src/admin/Bootstrap.Admin/Query/QueryAppOption.cs b/src/admin/Bootstrap.Admin/Query/QueryAppOption.cs new file mode 100644 index 00000000..34fcf79f --- /dev/null +++ b/src/admin/Bootstrap.Admin/Query/QueryAppOption.cs @@ -0,0 +1,68 @@ +using System.Linq; +using Bootstrap.DataAccess; + +namespace Bootstrap.Admin.Query +{ + /// + /// 前台应用查询类 + /// + public class QueryAppOption + { + /// + /// 应用操作 new 为新建 edit 为保存 + /// + /// + public string AppId { get; set; } = "edit"; + + /// + /// 应用名称 + /// + public string AppName { get; set; } = ""; + + /// + /// 应用编码 + /// + public string AppCode { get; set; } = ""; + + /// + /// 前台应用路径 + /// + public string AppUrl { get; set; } = "#"; + + /// + /// 前台应用标题 + /// + public string AppTitle { get; set; } = "未设置"; + + /// + /// 前台应用页脚 + /// + public string AppFooter { get; set; } = "未设置"; + + /// + /// 保存前台应用方法 + /// + /// + public bool Save() + { + var ret = DictHelper.SaveAppSettings(AppCode, AppName, AppUrl, AppTitle, AppFooter, AppId == "edit"); + return true; + } + + /// + /// 通过指定 AppKey 获取前台应用配置信息 + /// + /// + /// + public static QueryAppOption RetrieveByKey(string key) + { + var ret = new QueryAppOption() { AppCode = key }; + var dicts = DictHelper.RetrieveDicts(); + ret.AppName = dicts.FirstOrDefault(d => d.Category == "应用程序" && d.Code == key).Name ?? ""; + ret.AppUrl = dicts.FirstOrDefault(d => d.Category == "应用首页" && d.Name == key).Code ?? ""; + ret.AppTitle = dicts.FirstOrDefault(d => d.Category == ret.AppName && d.Name == "网站标题").Code ?? ""; + ret.AppFooter = dicts.FirstOrDefault(d => d.Category == ret.AppName && d.Name == "网站页脚").Code ?? ""; + return ret; + } + } +} diff --git a/src/admin/Bootstrap.Admin/Views/Admin/Settings.cshtml b/src/admin/Bootstrap.Admin/Views/Admin/Settings.cshtml index a1465e92..cdcae6b5 100644 --- a/src/admin/Bootstrap.Admin/Views/Admin/Settings.cshtml +++ b/src/admin/Bootstrap.Admin/Views/Admin/Settings.cshtml @@ -83,13 +83,13 @@
@foreach (var app in Model.Apps) { -
+
- +
- +
@@ -331,6 +331,7 @@
+
@@ -343,6 +344,14 @@
+
+ + +
+
+ + +
diff --git a/src/admin/Bootstrap.Admin/wwwroot/js/settings.js b/src/admin/Bootstrap.Admin/wwwroot/js/settings.js index d544606a..613a5991 100644 --- a/src/admin/Bootstrap.Admin/wwwroot/js/settings.js +++ b/src/admin/Bootstrap.Admin/wwwroot/js/settings.js @@ -161,34 +161,57 @@ $(function () { }); break; case 'addApp': - $('#appKey').val(''); - $('#appName').val(''); + $('#appKey').val('').removeAttr('readonly'); + $('#appName').val('').removeAttr('readonly'); $('#appUrl').val(''); + $('#appTitle').val(''); + $('#appFooter').val(''); + $('#appId').val('new'); $dialog.modal('show'); break; - case 'saveApp': - var appPath = $(this).parents('.input-group').find(':text').val(); - var appKey = $(this).attr('data-key'); - var appName = $(this).parents('.input-group').prev().text(); - $.bc({ - url: Settings.url + '/AppPath', data: { category: appName, name: appKey, code: appPath, define: 0 }, title: "保存" + appName, method: "post" - }); - break; case 'saveNewApp': var appPath = $('#appUrl').val(); var appKey = $('#appKey').val(); var appName = $('#appName').val(); + var appTitle = $('#appTitle').val(); + var appFooter = $('#appFooter').val(); + var appId = $('#appId').val(); $.bc({ - url: Settings.url + '/AppPath', data: { category: appName, name: appKey, code: appPath }, title: "保存" + appName, method: "post", + url: Settings.url, data: { AppName: appName, AppCode: appKey, AppUrl: appPath, AppTitle: appTitle, AppFooter: appFooter, AppId: appId }, title: "保存" + appName, method: "put", callback: function (result) { if (result) { $dialog.modal('hide'); - // 保存成功创建新 dom - var segment = $.format('
', appKey, appName, appPath); + if (appId === 'new') { + // 保存成功创建新 dom + var segment = $.format('
', appKey, appName, appPath); - // append dom - $('#appList').append($(segment)); + // append dom + $('#appList').append($(segment)); + } + else { + // update + $('#' + appKey).val(appPath); + } + } + } + }); + break; + case 'editApp': + $('#appId').val('edit'); + $('#appKey').attr('readonly', true); + $('#appName').attr('readonly', true); + var appKey = $(this).parents('.app').attr('data-key'); + $.bc({ + url: Settings.url, id: appKey, method: 'get', + callback: function (result) { + if (result) { + $('#appUrl').val(result.AppUrl); + $('#appKey').val(result.AppCode); + $('#appName').val(result.AppName); + $('#appTitle').val(result.AppTitle); + $('#appFooter').val(result.AppFooter); + $dialog.modal('show'); } } }); diff --git a/src/admin/Bootstrap.DataAccess/Dict.cs b/src/admin/Bootstrap.DataAccess/Dict.cs index ae2f982e..c8f836a3 100644 --- a/src/admin/Bootstrap.DataAccess/Dict.cs +++ b/src/admin/Bootstrap.DataAccess/Dict.cs @@ -53,7 +53,7 @@ namespace Bootstrap.DataAccess public virtual bool SaveSettings(IEnumerable dicts) { using var db = DbManager.Create(); - dicts.ToList().ForEach(dict => db.Update("set Code = @Code where Category = @Category and Name = @Name", dict)); + dicts.ToList().ForEach(dict => db.Update("set Code = @Code where Category = @Category and Name = @Name", dict)); return true; } diff --git a/src/admin/Bootstrap.DataAccess/Helper/DictHelper.cs b/src/admin/Bootstrap.DataAccess/Helper/DictHelper.cs index e3688c81..d7e62031 100644 --- a/src/admin/Bootstrap.DataAccess/Helper/DictHelper.cs +++ b/src/admin/Bootstrap.DataAccess/Helper/DictHelper.cs @@ -394,24 +394,43 @@ namespace Bootstrap.DataAccess /// /// 保存前台应用配置信息 /// - /// + /// + /// + /// + /// + /// + /// /// - public static bool SaveAppSettings(BootstrapDict dict) + public static bool SaveAppSettings(string appKey, string appName, string appUrl, string appTitle, string appFooter, bool update) { // dict define == 1 时为新建前台应用 bool ret; // 前台网站配置地址 不允许以 / 结尾 - dict.Code = dict.Code.TrimEnd('/'); - if (dict.Define == 0) + appUrl = appUrl.TrimEnd('/'); + if (update) { // Update ret = SaveSettings(new BootstrapDict[] { + new BootstrapDict() + { + Category = appName, + Name = "网站标题", + Code = appTitle, + Define = 1 + }, + new BootstrapDict() + { + Category = appName, + Name = "网站页脚", + Code = appFooter, + Define = 1 + }, new BootstrapDict() { Category = "应用首页", - Name = dict.Name, - Code = dict.Code, + Name = appKey, + Code = appUrl, Define = 0 } }); @@ -421,17 +440,52 @@ namespace Bootstrap.DataAccess ret = Save(new BootstrapDict() { Category = "应用程序", - Name = dict.Category, - Code = dict.Name, + Name = appName, + Code = appKey, Define = 0 }); if (ret) ret = Save(new BootstrapDict() { Category = "应用首页", - Name = dict.Name, - Code = dict.Code, + Name = appKey, + Code = appUrl, Define = 0 }); + if (ret) ret = Save(new BootstrapDict() + { + Category = appName, + Name = "网站标题", + Code = appTitle, + Define = 1 + }); + if (ret) ret = Save(new BootstrapDict() + { + Category = appName, + Name = "网站页脚", + Code = appFooter, + Define = 1 + }); + if (ret) ret = Save(new BootstrapDict() + { + Category = appName, + Name = "个人中心地址", + Code = "/Admin/Profiles", + Define = 1 + }); + if (ret) ret = Save(new BootstrapDict() + { + Category = appName, + Name = "系统设置地址", + Code = "/Admin/Index", + Define = 1 + }); + if (ret) ret = Save(new BootstrapDict() + { + Category = appName, + Name = "系统通知地址", + Code = "/Admin/Notifications", + Define = 1 + }); } return ret; } @@ -446,6 +500,7 @@ namespace Bootstrap.DataAccess var ids = new List(); ids.AddRange(RetrieveDicts().Where(d => d.Category == "应用程序" && d.Name == dict.Name && d.Code == dict.Code).Select(d => d.Id ?? "")); ids.AddRange(RetrieveDicts().Where(d => d.Category == "应用首页" && d.Name == dict.Code).Select(d => d.Id ?? "")); + ids.AddRange(RetrieveDicts().Where(d => d.Category == dict.Name).Select(d => d.Id ?? "")); return Delete(ids); } diff --git a/test/UnitTest/Bootstrap.Admin/Api/SettingsTest.cs b/test/UnitTest/Bootstrap.Admin/Api/SettingsTest.cs index 89078fe8..31538da2 100644 --- a/test/UnitTest/Bootstrap.Admin/Api/SettingsTest.cs +++ b/test/UnitTest/Bootstrap.Admin/Api/SettingsTest.cs @@ -1,4 +1,5 @@ -using Bootstrap.DataAccess; +using Bootstrap.Admin.Query; +using Bootstrap.DataAccess; using Bootstrap.Security; using Longbow.Cache; using System.Collections.Generic; @@ -19,6 +20,43 @@ namespace Bootstrap.Admin.Api Assert.NotNull(resp); } + [Fact] + public async void GetByKey_Ok() + { + var resp = await Client.GetAsJsonAsync("Demo"); + Assert.NotNull(resp); + } + + [Fact] + public async void Put_Ok() + { + var data = new QueryAppOption() + { + AppId = "new", + AppName = "UnitTest", + AppCode = "UnitTest", + AppUrl = "http://localhost", + AppTitle = "网站标题", + AppFooter = "网站页脚" + }; + + var resp = await Client.PutAsJsonAsync("", data); + Assert.True(resp); + + // Check + var op = await Client.GetAsJsonAsync("UnitTest"); + Assert.Equal(data.AppTitle, op.AppTitle); + + // 删除 + resp = await Client.DeleteAsJsonAsync("AppPath", new BootstrapDict() + { + Category = "UnitTest", + Name = "UnitTest", + Code = "UnitTest" + }); + Assert.True(resp); + } + [Fact] public async void Post_Ok() {