合并分支:合并dev分支功能代码

This commit is contained in:
Argo-Surface 2019-01-14 17:31:57 +08:00
parent 5e1bcadb20
commit 7a94001485
430 changed files with 73867 additions and 33471 deletions

670
.gitignore vendored
View File

@ -1,339 +1,341 @@
###### -- File Created With Git Source Control Provider 2015 -- ######
###### -- From https://github.com/github/gitignore -- ######
###### -- Warning Regenerating this file will erase all your custom ignores, unless you add them below the Custom Ignore section at the bottom -- ######
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush
.cr/
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# MAC Files
**/.DS_Store
@ -342,5 +344,7 @@ ASALocalRun/
# Net Core Keys
[Kk]eys/
Bootstrap.Admin.xml
###### -- Custom Ignore Section, Make sure all files you add to the git repo are below this line -- ######
###### -- Custom Ignore Section, Make sure all files you add to the git repo are below this line -- ######

View File

@ -1,17 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<TargetFramework>netcoreapp2.2</TargetFramework>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>..\Keys\Longbow.Utility.snk</AssemblyOriginatorKeyFile>
<MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish>
<TargetLatestRuntimePatch>true</TargetLatestRuntimePatch>
</PropertyGroup>
<PropertyGroup>
<DocumentationFile>..\Bootstrap.Admin\Bootstrap.Admin.xml</DocumentationFile>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Bootstrap.Security.Mvc" Version="1.0.0" />
<PackageReference Include="Longbow.Web" Version="1.0.1" />
<PackageReference Include="Bootstrap.Security.Mvc" Version="2.2.0" />
<PackageReference Include="Longbow.Logging" Version="2.2.4" />
<PackageReference Include="Longbow.Web" Version="2.2.2" />
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.1.0" PrivateAssets="All" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="2.3.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.2.0" PrivateAssets="All" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="4.0.1" />
</ItemGroup>
<ItemGroup>
@ -22,13 +30,4 @@
<ProjectReference Include="..\Bootstrap.DataAccess\Bootstrap.DataAccess.csproj" />
</ItemGroup>
<ItemGroup>
<Content Update="wwwroot\css\bootstrap.css">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
<Content Update="wwwroot\css\bootstrap.min.css">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
</ItemGroup>
</Project>

View File

@ -1,11 +1,13 @@
using Bootstrap.Admin.Models;
using Bootstrap.DataAccess;
using Bootstrap.Security;
using Longbow.Web;
using Longbow;
using Longbow.Configuration;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
@ -15,8 +17,19 @@ namespace Bootstrap.Admin.Controllers
/// Account controller.
/// </summary>
[AllowAnonymous]
[AutoValidateAntiforgeryToken]
public class AccountController : Controller
{
/// <summary>
///
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult Login()
{
return User.Identity.IsAuthenticated ? (ActionResult)Redirect("~/Home/Index") : View("Login", new ModelBase());
}
/// <summary>
/// Login the specified userName, password and remember.
/// </summary>
@ -24,19 +37,20 @@ namespace Bootstrap.Admin.Controllers
/// <param name="userName">User name.</param>
/// <param name="password">Password.</param>
/// <param name="remember">Remember.</param>
[HttpPost]
public async Task<IActionResult> Login(string userName, string password, string remember)
{
if (!string.IsNullOrEmpty(userName) && BootstrapUser.Authenticate(userName, password))
if (UserHelper.Authenticate(userName, password))
{
var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
identity.AddClaim(new Claim(ClaimTypes.Name, userName));
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity), new AuthenticationProperties() { IsPersistent = remember == "true" });
return Redirect("~/");
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity), new AuthenticationProperties() { ExpiresUtc = DateTimeOffset.Now.AddDays(LgbConvert.ReadValue(ConfigurationManager.AppSettings["CookieExpiresDays"], 7)), IsPersistent = remember == "true" });
}
var mobile = Request.IsMobileDevice();
var model = Request.IPad();
return mobile && !model ? View("Loginm", new ModelBase()) : View("Login", new ModelBase());
// redirect origin url
var originUrl = Request.Query[CookieAuthenticationDefaults.ReturnUrlParameter].FirstOrDefault() ?? "~/Home/Index";
return Redirect(originUrl);
}
/// <summary>
/// Logout this instance.
/// </summary>
@ -46,20 +60,16 @@ namespace Bootstrap.Admin.Controllers
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return Redirect("~" + CookieAuthenticationDefaults.LoginPath);
}
/// <summary>
/// Accesses the denied.
/// </summary>
/// <returns>The denied.</returns>
[ResponseCache(Duration = 600)]
public ActionResult AccessDenied()
{
return View();
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult Mobile()
{
var returnUrl = Request.Query[CookieAuthenticationDefaults.ReturnUrlParameter].ToString();
ViewBag.ReturnUrl = string.IsNullOrEmpty(returnUrl) ? Url.Content("~/Home/Index") : returnUrl;
return View();
}
}

View File

@ -1,6 +1,7 @@
using Bootstrap.Admin.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
namespace Bootstrap.Admin.Controllers
{
@ -13,141 +14,104 @@ namespace Bootstrap.Admin.Controllers
///
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
return View(new NavigatorBarModel(this));
}
public ActionResult Index() => View(new NavigatorBarModel(this));
/// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult Users()
{
return View(new NavigatorBarModel(this));
}
public ActionResult Users() => View(new NavigatorBarModel(this));
/// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult Groups()
{
return View(new NavigatorBarModel(this));
}
public ActionResult Groups() => View(new NavigatorBarModel(this));
/// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult Dicts()
{
return View(new NavigatorBarModel(this));
}
public ActionResult Dicts() => View(new NavigatorBarModel(this));
/// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult Roles()
{
return View(new NavigatorBarModel(this));
}
public ActionResult Roles() => View(new NavigatorBarModel(this));
/// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult Menus()
{
return View(new NavigatorBarModel(this));
}
public ActionResult Menus() => View(new NavigatorBarModel(this));
/// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult Logs()
{
return View(new NavigatorBarModel(this));
}
public ActionResult Logs() => View(new NavigatorBarModel(this));
/// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult FAIcon()
{
return View(new NavigatorBarModel(this));
}
public ActionResult FAIcon() => View(new NavigatorBarModel(this));
/// <summary>
///
/// </summary>
/// <returns></returns>
[AllowAnonymous]
[ResponseCache(Duration = 600)]
public PartialViewResult IconView()
{
return PartialView("IconView");
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult Settings()
{
return View(new ThemeModel(this));
}
public PartialViewResult IconView() => PartialView("IconView");
/// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult Notifications()
{
return View(new NavigatorBarModel(this));
}
public ActionResult Settings() => View(new ThemeModel(this));
/// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult Profiles()
{
return View(new ProfilesModel(this));
}
public ActionResult Notifications() => View(new NavigatorBarModel(this));
/// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult Exceptions()
{
return View(new NavigatorBarModel(this));
}
public ActionResult Profiles() => View(new ProfilesModel(this));
/// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult Messages()
{
return View(new NavigatorBarModel(this));
}
public ActionResult Exceptions() => View(new NavigatorBarModel(this));
/// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult Tasks()
{
return View(new NavigatorBarModel(this));
}
public ActionResult Messages() => View(new NavigatorBarModel(this));
/// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult Mobile()
{
return View(new NavigatorBarModel(this));
}
public ActionResult Tasks() => View(new NavigatorBarModel(this));
/// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult Api()
{
return View(new NavigatorBarModel(this));
}
public ActionResult Mobile() => View(new NavigatorBarModel(this));
/// <summary>
/// 用于测试ExceptionFilter
/// </summary>
/// <returns></returns>
public ActionResult Error() => throw new Exception("Customer Excetion UnitTest");
}
}

View File

@ -1,21 +1,24 @@
using Bootstrap.DataAccess;
using Bootstrap.Security;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
namespace Bootstrap.Admin.Controllers.Api
{
/// <summary>
/// 数据字典分类
/// </summary>
[Route("api/[controller]")]
public class CategoryController : Controller
[ApiController]
public class CategoryController : ControllerBase
{
/// <summary>
///
/// 获取字典表中所有Category数据
/// </summary>
/// <returns></returns>
[HttpGet]
[AllowAnonymous]
public IEnumerable<BootstrapDict> Get()
public IEnumerable<string> Get()
{
return DictHelper.RetrieveCategories();
}

View File

@ -12,7 +12,8 @@ namespace Bootstrap.Admin.Controllers.Api
///
/// </summary>
[Route("api/[controller]")]
public class DictsController : Controller
[ApiController]
public class DictsController : ControllerBase
{
/// <summary>
///
@ -20,7 +21,7 @@ namespace Bootstrap.Admin.Controllers.Api
/// <param name="value"></param>
/// <returns></returns>
[HttpGet]
public QueryData<BootstrapDict> Get(QueryDictOption value)
public QueryData<BootstrapDict> Get([FromQuery]QueryDictOption value)
{
return value.RetrieveData();
}
@ -31,7 +32,7 @@ namespace Bootstrap.Admin.Controllers.Api
[HttpPost]
public bool Post([FromBody]BootstrapDict value)
{
return DictHelper.SaveDict(value);
return DictHelper.Save(value);
}
/// <summary>
///
@ -39,10 +40,9 @@ namespace Bootstrap.Admin.Controllers.Api
/// <param name="value"></param>
[HttpDelete]
[Authorize(Roles = "Administrators")]
public object Delete([FromBody]IEnumerable<int> value)
public bool Delete([FromBody]IEnumerable<string> value)
{
var result = DictHelper.DeleteDict(value);
return new { result, msg = result ? "成功!" : "失败" };
return DictHelper.Delete(value);
}
}
}

View File

@ -1,9 +1,6 @@
using Bootstrap.Admin.Query;
using Bootstrap.DataAccess;
using Longbow.Web.Mvc;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.IO;
@ -16,7 +13,8 @@ namespace Bootstrap.Admin.Controllers.Api
///
/// </summary>
[Route("api/[controller]")]
public class ExceptionsController : Controller
[ApiController]
public class ExceptionsController : ControllerBase
{
/// <summary>
/// 显示所有异常
@ -24,10 +22,11 @@ namespace Bootstrap.Admin.Controllers.Api
/// <param name="value"></param>
/// <returns></returns>
[HttpGet]
public QueryData<Exceptions> Get(QueryExceptionOption value)
public QueryData<object> Get([FromQuery]QueryExceptionOption value)
{
return value.RetrieveData();
return value.Retrieves();
}
/// <summary>
///
/// </summary>
@ -36,10 +35,12 @@ namespace Bootstrap.Admin.Controllers.Api
public IEnumerable<string> Post()
{
var filePath = Path.Combine(AppContext.BaseDirectory, "Error");
if (!Directory.Exists(filePath)) return new List<string>();
return Directory.GetFiles(filePath)
.Where(f => Path.GetExtension(f).Equals(".log", System.StringComparison.OrdinalIgnoreCase))
.Where(f => Path.GetExtension(f).Equals(".log", StringComparison.OrdinalIgnoreCase))
.Select(f => Path.GetFileNameWithoutExtension(f)).OrderByDescending(s => s);
}
/// <summary>
///
/// </summary>
@ -69,8 +70,14 @@ namespace Bootstrap.Admin.Controllers.Api
return new JsonResult(sb.ToString());
}
/// <summary>
///
/// </summary>
public class ExceptionFileQuery
{
/// <summary>
///
/// </summary>
public string FileName { get; set; }
}
}

View File

@ -2,7 +2,6 @@
using Bootstrap.DataAccess;
using Longbow.Web.Mvc;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using System.Linq;
@ -12,94 +11,98 @@ namespace Bootstrap.Admin.Controllers.Api
///
/// </summary>
[Route("api/[controller]")]
public class GroupsController : Controller
{
/// <summary>
///
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
[HttpGet]
public QueryData<Group> Get(QueryGroupOption value)
{
return value.RetrieveData();
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
public Group Get(int id)
{
return GroupHelper.RetrieveGroups().FirstOrDefault(t => t.Id == id);
}
/// <summary>
///
/// </summary>
/// <param name="value"></param>
[HttpPost]
public bool Post([FromBody]Group value)
{
return GroupHelper.SaveGroup(value);
}
[ApiController]
public class GroupsController : ControllerBase
{
/// <summary>
///
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
[HttpGet]
public QueryData<object> Get([FromQuery]QueryGroupOption value)
{
return value.RetrieveData();
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
public Group Get(string id)
{
return GroupHelper.Retrieves().FirstOrDefault(t => t.Id == id);
}
/// <summary>
///
/// </summary>
/// <param name="value"></param>
[HttpPost]
public bool Post([FromBody]Group value)
{
return GroupHelper.Save(value);
}
/// <summary>
///
/// </summary>
/// <param name="value"></param>
[HttpDelete]
public bool Delete([FromBody]IEnumerable<int> value)
{
return GroupHelper.DeleteGroup(value);
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <param name="value"></param>
/// <returns></returns>
[HttpPost("{id}")]
public IEnumerable<Group> Post(int id, [FromBody]JObject value)
{
var ret = new List<Group>();
dynamic json = value;
switch ((string)json.type)
{
case "user":
ret = GroupHelper.RetrieveGroupsByUserId(id).ToList();
break;
case "role":
ret = GroupHelper.RetrieveGroupsByRoleId(id).ToList();
break;
default:
break;
}
return ret;
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <param name="value"></param>
/// <returns></returns>
[HttpPut("{id}")]
public bool Put(int id, [FromBody]JObject value)
{
var ret = false;
dynamic json = value;
string groupIds = json.groupIds;
switch ((string)json.type)
{
case "user":
ret = GroupHelper.SaveGroupsByUserId(id, groupIds);
break;
case "role":
ret = GroupHelper.SaveGroupsByRoleId(id, groupIds);
break;
default:
break;
}
return ret;
}
}
public bool Delete([FromBody]IEnumerable<string> value)
{
return GroupHelper.Delete(value);
}
/// <summary>
/// 获取部门授权
/// </summary>
/// <param name="id"></param>
/// <param name="type"></param>
/// <returns></returns>
[HttpPost("{id}")]
public IEnumerable<object> Post(string id, [FromQuery]string type)
{
IEnumerable<Group> ret = new List<Group>();
switch (type)
{
case "user":
ret = GroupHelper.RetrievesByUserId(id);
break;
case "role":
ret = GroupHelper.RetrievesByRoleId(id);
break;
default:
break;
}
return ret.Select(p => new { p.Id, p.Checked, p.GroupName, p.Description });
}
/// <summary>
/// 保存部门授权
/// </summary>
/// <param name="id"></param>
/// <param name="groupIds"></param>
/// <param name="type"></param>
/// <returns></returns>
[HttpPut("{id}")]
public bool Put(string id, [FromBody]IEnumerable<string> groupIds, [FromQuery]string type)
{
var ret = false;
switch (type)
{
case "user":
ret = GroupHelper.SaveByUserId(id, groupIds);
break;
case "role":
ret = GroupHelper.SaveByRoleId(id, groupIds);
break;
default:
break;
}
return ret;
}
}
}

View File

@ -0,0 +1,63 @@
using Bootstrap.DataAccess;
using Bootstrap.Security;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
namespace Bootstrap.Admin.Controllers
{
/// <summary>
///
/// </summary>
[Route("api/[controller]/[action]")]
[AllowAnonymous]
[ApiController]
public class InterfaceController : ControllerBase
{
/// <summary>
///
/// </summary>
/// <returns></returns>
[HttpPost]
public IEnumerable<BootstrapDict> RetrieveDicts()
{
return DictHelper.RetrieveDicts();
}
/// <summary>
///
/// </summary>
/// <returns></returns>
[HttpPost]
public IEnumerable<string> RetrieveRolesByUrl([FromBody]string url)
{
return RoleHelper.RetrieveRolesByUrl(url);
}
/// <summary>
///
/// </summary>
/// <returns></returns>
[HttpPost]
public IEnumerable<string> RetrieveRolesByUserName([FromBody]string userName)
{
return RoleHelper.RetrieveRolesByUserName(userName);
}
/// <summary>
///
/// </summary>
/// <returns></returns>
[HttpPost]
public BootstrapUser RetrieveUserByUserName([FromBody]string userName)
{
return UserHelper.RetrieveUserByUserName(userName);
}
/// <summary>
///
/// </summary>
/// <returns></returns>
[HttpPost]
public IEnumerable<BootstrapMenu> RetrieveAppMenus([FromBody]AppMenuOption args)
{
return MenuHelper.RetrieveAppMenus(args.AppId, args.UserName, args.Url);
}
}
}

View File

@ -1,10 +1,8 @@
using Bootstrap.Security;
using Longbow.Cache;
using Bootstrap.DataAccess;
using Bootstrap.Security;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
using System;
using System.Linq;
namespace Bootstrap.Admin.Controllers.Api
{
@ -15,14 +13,9 @@ namespace Bootstrap.Admin.Controllers.Api
///
/// </summary>
[Route("api/[controller]")]
public class LoginController : Controller
[ApiController]
public class LoginController : ControllerBase
{
[HttpGet]
public object Get()
{
var token = Request.Headers["Token"];
return new { UserName = User.Identity.Name, Token = token };
}
/// <summary>
///
/// </summary>
@ -30,18 +23,16 @@ namespace Bootstrap.Admin.Controllers.Api
/// <returns></returns>
[AllowAnonymous]
[HttpPost]
public object Post([FromBody]JObject value)
public string Post([FromBody]JObject value)
{
dynamic user = value;
string userName = user.userName;
string password = user.password;
if (BootstrapUser.Authenticate(userName, password))
if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password) && UserHelper.Authenticate(userName, password))
{
var token = CacheManager.AddOrUpdate(string.Format("WebApi-{0}", userName), k => new { UserName = userName, Token = Guid.NewGuid().ToString() }, (k, info) => info, "WebApi");
CacheManager.AddOrUpdate(token.Token, k => token, (k, info) => info, "Token");
return token;
return BootstrapAdminJwtTokenHandler.CreateToken(userName);
}
return new { UserName = userName };
return null;
}
/// <summary>
///

View File

@ -10,7 +10,8 @@ namespace Bootstrap.Admin.Controllers.Api
///
/// </summary>
[Route("api/[controller]")]
public class LogsController : Controller
[ApiController]
public class LogsController : ControllerBase
{
/// <summary>
///
@ -18,7 +19,7 @@ namespace Bootstrap.Admin.Controllers.Api
/// <param name="value"></param>
/// <returns></returns>
[HttpGet]
public QueryData<Log> Get(QueryLogOption value)
public QueryData<Log> Get([FromQuery]QueryLogOption value)
{
return value.RetrieveData();
}
@ -28,18 +29,22 @@ namespace Bootstrap.Admin.Controllers.Api
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
public Log Get(int id)
public Log Get(string id)
{
return LogHelper.RetrieveLogs().FirstOrDefault(t => t.Id == id);
return LogHelper.Retrieves().FirstOrDefault(t => t.Id == id);
}
/// <summary>
///
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
[HttpPost]
public bool Post([FromBody]Log value)
{
value.ClientAgent = Request.Headers["User-Agent"];
value.ClientIp = HttpContext.Connection.RemoteIpAddress.ToString();
value.UserName = User.Identity.Name;
return LogHelper.SaveLog(value);
return LogHelper.Save(value);
}
}
}

View File

@ -3,9 +3,7 @@ using Bootstrap.DataAccess;
using Bootstrap.Security;
using Longbow.Web.Mvc;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using System.Linq;
namespace Bootstrap.Admin.Controllers.Api
{
@ -13,81 +11,74 @@ namespace Bootstrap.Admin.Controllers.Api
///
/// </summary>
[Route("api/[controller]")]
public class MenusController : Controller
[ApiController]
public class MenusController : ControllerBase
{
/// <summary>
///
/// 获得所有菜单列表调用
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
[HttpGet]
public QueryData<BootstrapMenu> Get(QueryMenuOption value)
public QueryData<object> Get([FromQuery]QueryMenuOption value)
{
return value.RetrieveData(User.Identity.Name);
}
/// <summary>
///
/// 保存菜单调用
/// </summary>
/// <param name="value"></param>
[HttpPost]
public bool Post([FromBody]BootstrapMenu value)
{
return MenuHelper.SaveMenu(value);
return MenuHelper.Save(value);
}
/// <summary>
///
/// 删除菜单调用
/// </summary>
/// <param name="value"></param>
[HttpDelete]
public bool Delete([FromBody]IEnumerable<int> value)
public bool Delete([FromBody]IEnumerable<string> value)
{
return MenuHelper.DeleteMenu(value);
return MenuHelper.Delete(value);
}
/// <summary>
///
/// 角色管理菜单授权按钮调用
/// </summary>
/// <param name="id"></param>
/// <param name="value"></param>
/// <param name="id">角色ID</param>
/// <param name="type">type=role时角色管理菜单授权调用type=user时菜单管理编辑页面父类菜单按钮调用</param>
/// <returns></returns>
[HttpPost("{id}")]
public IEnumerable<BootstrapMenu> Post(int id, [FromBody]JObject value)
public IEnumerable<object> Post(string id, [FromQuery]string type)
{
var ret = new List<BootstrapMenu>();
dynamic json = value;
switch ((string)json.type)
IEnumerable<object> ret = new List<object>();
switch (type)
{
case "role":
ret = MenuHelper.RetrieveMenusByRoleId(id).ToList();
ret = MenuHelper.RetrieveMenusByRoleId(id);
break;
case "user":
ret = BootstrapMenu.RetrieveAllMenus(User.Identity.Name).ToList();
ret = MenuHelper.RetrieveMenus(User.Identity.Name);
break;
default:
break;
}
return ret;
}
/// <summary>
///
/// 角色管理菜单授权保存按钮调用
/// </summary>
/// <param name="id"></param>
/// <param name="value"></param>
/// <param name="id">角色ID</param>
/// <param name="value">菜单ID集合</param>
/// <returns></returns>
[HttpPut("{id}")]
public bool Put(int id, [FromBody]JObject value)
public bool Put(string id, [FromBody]IEnumerable<string> value)
{
var ret = false;
dynamic json = value;
string menuIds = json.menuIds.ToString();
switch ((string)json.type)
{
case "role":
ret = MenuHelper.SaveMenusByRoleId(id, menuIds);
break;
default:
break;
}
return ret;
return MenuHelper.SaveMenusByRoleId(id, value);
}
}
}

View File

@ -11,7 +11,8 @@ namespace Bootstrap.Admin.Controllers.Api
///
/// </summary>
[Route("api/[controller]")]
public class MessagesController : Controller
[ApiController]
public class MessagesController : ControllerBase
{
/// <summary>
/// 根据Id返回不同的消息列表

View File

@ -1,7 +1,6 @@
using Bootstrap.DataAccess;
using Bootstrap.Security;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Linq;
namespace Bootstrap.Admin.Controllers
@ -10,26 +9,42 @@ namespace Bootstrap.Admin.Controllers
///
/// </summary>
[Route("api/[controller]")]
public class NewController : Controller
[ApiController]
public class NewController : ControllerBase
{
/// <summary>
///
/// 通知管理页面获得所有新用户方法调用
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
[HttpGet]
[AllowAnonymous]
public bool Get(string userName)
public IEnumerable<object> Get()
{
return BootstrapUser.RetrieveUserByUserName(userName) == null && !UserHelper.RetrieveNewUsers().Any(u => u.UserName == userName);
return UserHelper.RetrieveNewUsers().Select(user => new
{
user.Id,
user.UserName,
user.DisplayName,
user.Description,
user.RegisterTime
});
}
[HttpPost]
[AllowAnonymous]
public bool Post([FromBody] User user)
/// <summary>
/// 新用户授权/拒绝接口
/// </summary>
/// <returns></returns>
[HttpPut("{id}")]
public bool Put([FromBody]User value)
{
var ret = false;
if (string.IsNullOrEmpty(user.UserName) || string.IsNullOrEmpty(user.Password) || string.IsNullOrEmpty(user.DisplayName) || string.IsNullOrEmpty(user.Description)) return ret;
return UserHelper.SaveUser(user);
if (value.UserStatus == UserStates.ApproveUser)
{
ret = UserHelper.Approve(value.Id, User.Identity.Name);
}
else if (value.UserStatus == UserStates.RejectUser)
{
ret = UserHelper.Reject(value.Id, User.Identity.Name);
}
return ret;
}
}
}

View File

@ -1,7 +1,6 @@
using Bootstrap.DataAccess;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Bootstrap.Admin.Controllers.Api
@ -10,44 +9,49 @@ namespace Bootstrap.Admin.Controllers.Api
///
/// </summary>
[Route("api/[controller]")]
public class NotificationsController : Controller
[ApiController]
public class NotificationsController : ControllerBase
{
/// <summary>
///
/// </summary>
/// <returns></returns>
[HttpGet]
public Notifications Get()
public object Get()
{
var ret = new Notifications();
if (!User.IsInRole("Administrators")) return false;
// New Users
var user = UserHelper.RetrieveNewUsers();
ret.Users = user.Take(6).ToList();
ret.Users.AsParallel().ForAll(n =>
{
var ts = DateTime.Now - n.RegisterTime;
if (ts.TotalMinutes < 5) n.Period = "刚刚";
else if (ts.Days > 0) n.Period = string.Format("{0}天", ts.Days);
else if (ts.Hours > 0) n.Period = string.Format("{0}小时", ts.Hours);
else if (ts.Minutes > 0) n.Period = string.Format("{0}分钟", ts.Minutes);
});
ret.NewUsersCount = user.Count();
var usersCount = user.Count();
user = user.Take(6);
user.AsParallel().ForAll(n =>
{
var ts = DateTime.Now - n.RegisterTime;
if (ts.TotalMinutes < 5) n.Period = "刚刚";
else if (ts.Days > 0) n.Period = string.Format("{0}天", ts.Days);
else if (ts.Hours > 0) n.Period = string.Format("{0}小时", ts.Hours);
else if (ts.Minutes > 0) n.Period = string.Format("{0}分钟", ts.Minutes);
});
// Tasks
var task = TaskHelper.RetrieveTasks();
ret.Tasks = task.Take(6).ToList();
ret.TasksCount = task.Count();
var task = TaskHelper.Retrieves();
var tasksCount = task.Count();
//Message
var message = MessageHelper.RetrieveMessagesHeader(User.Identity.Name);
ret.Messages = message.Take(6).ToList();
ret.Messages.AsParallel().ForAll(m => m.FromIcon = Url.Content(m.FromIcon));
ret.MessagesCount = message.Count();
var message = MessageHelper.Retrieves(User.Identity.Name);
var messagesCount = message.Count();
message = message.Take(6);
message.AsParallel().ForAll(m => m.FromIcon = Url.Content(m.FromIcon));
//Apps
var apps = ExceptionHelper.RetrieveExceptions().Where(n => n.ExceptionType != "Longbow.Data.DBAccessException");
ret.Apps = apps.Take(6).ToList();
ret.Apps.AsParallel().ForAll(n =>
var apps = ExceptionsHelper.Retrieves().Where(n => n.ExceptionType != "Longbow.Data.DBAccessException");
var appExceptionsCount = apps.Count();
apps = apps.Take(6);
apps.AsParallel().ForAll(n =>
{
n.ExceptionType = n.ExceptionType.Split('.').Last();
var ts = DateTime.Now - n.LogTime;
@ -56,12 +60,13 @@ namespace Bootstrap.Admin.Controllers.Api
else if (ts.Hours > 0) n.Period = string.Format("{0}小时", ts.Hours);
else if (ts.Minutes > 0) n.Period = string.Format("{0}分钟", ts.Minutes);
});
ret.AppExceptionsCount = apps.Count();
//Dbs
var dbs = ExceptionHelper.RetrieveExceptions().Where(n => n.ExceptionType == "Longbow.Data.DBAccessException");
ret.Dbs = dbs.Take(6).ToList();
ret.Dbs.AsParallel().ForAll(n =>
var dbs = ExceptionsHelper.Retrieves().Where(n => n.ExceptionType == "Longbow.Data.DBAccessException");
var dbExceptionsCount = dbs.Count();
dbs = dbs.Take(6);
dbs.AsParallel().ForAll(n =>
{
var ts = DateTime.Now - n.LogTime;
if (ts.TotalMinutes < 5) n.Period = "刚刚";
@ -69,72 +74,20 @@ namespace Bootstrap.Admin.Controllers.Api
else if (ts.Hours > 0) n.Period = string.Format("{0}小时", ts.Hours);
else if (ts.Minutes > 0) n.Period = string.Format("{0}分钟", ts.Minutes);
});
ret.DbExceptionsCount = dbs.Count();
return ret;
}
/// <summary>
///
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
[HttpGet("{id}")]
public object Get(string id)
{
var ret = new object();
if (id == "newusers") ret = UserHelper.RetrieveNewUsers().ToList();
return ret;
}
public class Notifications
{
public Notifications()
return new
{
Users = new List<User>();
Apps = new List<Exceptions>();
Dbs = new List<Exceptions>();
Tasks = new List<Task>();
Messages = new List<Message>();
}
/// <summary>
///
/// </summary>
public List<User> Users { get; set; }
/// <summary>
///
/// </summary>
public List<Exceptions> Apps { get; set; }
/// <summary>
///
/// </summary>
public List<Exceptions> Dbs { get; set; }
/// <summary>
///
/// </summary>
public List<Task> Tasks { get; set; }
/// <summary>
///
/// </summary>
public List<Message> Messages { get; set; }
/// <summary>
/// 获得/设置 消息数量
/// </summary>
public int MessagesCount { get; set; }
/// <summary>
/// 获得/设置 新用户数量
/// </summary>
public int NewUsersCount { get; set; }
/// <summary>
/// 获取/设置 任务数量
/// </summary>
public int TasksCount { get; set; }
/// <summary>
/// 获取/设置 应用程序错误数量
/// </summary>
public int AppExceptionsCount { get; set; }
/// <summary>
/// 获取/设置 数据库错误数量
/// </summary>
public int DbExceptionsCount { get; set; }
NewUsersCount = usersCount,
TasksCount = tasksCount,
MessagesCount = messagesCount,
AppExceptionsCount = appExceptionsCount,
DbExceptionsCount = dbExceptionsCount,
Users = user.Select(i => new { i.Period, i.UserName, i.DisplayName, i.Description }),
Tasks = task.Take(6),
Messages = message,
Apps = apps.Select(n => new { n.ExceptionType, n.Message, n.Period }),
Dbs = dbs.Select(n => new { n.ErrorPage, n.Message, n.Period })
};
}
}
}

View File

@ -1,10 +1,8 @@
using Bootstrap.DataAccess;
using Longbow.Logging;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Specialized;
using System.IO;
using System.Threading.Tasks;
@ -14,8 +12,15 @@ namespace Bootstrap.Admin.Controllers.Api
///
/// </summary>
[Route("api/[controller]")]
public class ProfilesController : Controller
[ApiController]
public class ProfilesController : ControllerBase
{
/// <summary>
///
/// </summary>
/// <param name="env"></param>
/// <param name="files"></param>
/// <returns></returns>
[HttpPost]
public async Task<JsonResult> Post([FromServices]IHostingEnvironment env, IFormCollection files)
{
@ -23,34 +28,42 @@ namespace Bootstrap.Admin.Controllers.Api
long fileSize = 0;
var userName = User.Identity.Name;
var error = string.Empty;
var fileName = string.Empty;
if (User.IsInRole("Administrators")) userName = "default";
if (files.Count > 0)
if (files.Files.Count > 0)
{
var uploadFile = files.Files[0];
var webSiteUrl = DictHelper.RetrieveIconFolderPath().Code;
var fileName = string.Format("{0}{1}", userName, Path.GetExtension(uploadFile.FileName));
var webSiteUrl = DictHelper.RetrieveIconFolderPath();
fileName = string.Format("{0}{1}", userName, Path.GetExtension(uploadFile.FileName));
var fileUrl = string.Format("{0}{1}", webSiteUrl, fileName);
var filePath = Path.Combine(env.WebRootPath, webSiteUrl.Replace("~", string.Empty).Replace("/", "\\").TrimStart('\\') + fileName);
var fileFolder = Path.GetDirectoryName(filePath);
fileSize = uploadFile.Length;
try
if (!Directory.Exists(fileFolder)) Directory.CreateDirectory(fileFolder);
using (var fs = new FileStream(filePath, FileMode.Create))
{
if (!Directory.Exists(fileFolder)) Directory.CreateDirectory(fileFolder);
using (var fs = new FileStream(filePath, FileMode.Create))
{
await uploadFile.CopyToAsync(fs);
}
previewUrl = string.Format("{0}?q={1}", Url.Content(fileUrl), DateTime.Now.Ticks);
UserHelper.SaveUserIconByName(userName, fileName);
await uploadFile.CopyToAsync(fs);
}
catch (Exception ex)
previewUrl = string.Format("{0}?q={1}", Url.Content(fileUrl), DateTime.Now.Ticks);
UserHelper.SaveUserIconByName(userName, fileName);
}
else
{
// delete file
fileName = files["key"];
if (!fileName.Equals("default.jpg"))
{
var nv = new NameValueCollection
fileName = Path.Combine(env.WebRootPath, $"images\\uploader\\{fileName}");
try
{
{ "UpLoadFileName", filePath }
};
error = ex.Message;
ExceptionManager.Publish(ex, nv);
if (System.IO.File.Exists(fileName)) System.IO.File.Delete(fileName);
fileName = "default.jpg";
UserHelper.SaveUserIconByName(userName, fileName);
}
catch (Exception ex)
{
error = ex.Message;
}
}
}
return new JsonResult(new
@ -58,7 +71,7 @@ namespace Bootstrap.Admin.Controllers.Api
error = string.IsNullOrEmpty(error) ? error : $"服务器端错误-{error}",
initialPreview = new string[] { previewUrl },
initialPreviewConfig = new object[] {
new { caption= "新头像", size= fileSize, showZoom= true }
new { caption = "新头像", size = fileSize, showZoom = true, key = fileName }
},
append = false
});

View File

@ -0,0 +1,43 @@
using Bootstrap.DataAccess;
using Longbow.Web.SignalR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using System.Linq;
using System.Threading.Tasks;
namespace Bootstrap.Admin.Controllers.Api
{
/// <summary>
/// 注册用户操作类
/// </summary>
[AllowAnonymous]
[Route("api/[controller]")]
[ApiController]
public class RegisterController : ControllerBase
{
/// <summary>
/// 登录页面注册新用户remote validate调用
/// </summary>
/// <param name="userName"></param>
/// <returns></returns>
[HttpGet]
public bool Get(string userName)
{
return UserHelper.RetrieveUserByUserName(userName) == null && !UserHelper.RetrieveNewUsers().Any(u => u.UserName == userName);
}
/// <summary>
/// 登录页面注册新用户提交按钮调用
/// </summary>
/// <param name="hub"></param>
/// <param name="user"></param>
/// <returns></returns>
[HttpPost]
public async Task<bool> Post([FromServices]IHubContext<SignalRHub> hub, [FromBody]User user)
{
var ret = UserHelper.Save(user);
if (ret) await SignalRManager.Send(hub.Clients.All, new MessageBody() { Category = "Users", Message = string.Format("{0}-{1}", user.UserName, user.Description) });
return ret;
}
}
}

View File

@ -2,7 +2,6 @@
using Bootstrap.DataAccess;
using Longbow.Web.Mvc;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using System.Linq;
@ -13,7 +12,8 @@ namespace Bootstrap.Admin.Controllers.Api
///
/// </summary>
[Route("api/[controller]")]
public class RolesController : Controller
[ApiController]
public class RolesController : ControllerBase
{
/// <summary>
///
@ -21,59 +21,57 @@ namespace Bootstrap.Admin.Controllers.Api
/// <param name="value"></param>
/// <returns></returns>
[HttpGet]
public QueryData<Role> Get(QueryRoleOption value)
public QueryData<object> Get([FromQuery]QueryRoleOption value)
{
return value.RetrieveData();
}
/// <summary>
///
/// 通过指定用户ID/部门ID/菜单ID获得所有角色集合已经授权的有checked标记
/// </summary>
/// <param name="id"></param>
/// <param name="value"></param>
/// <param name="id">用户ID/部门ID/菜单ID</param>
/// <param name="type">类型</param>
/// <returns></returns>
[HttpPost("{id}")]
public IEnumerable<Role> Post(int id, [FromBody]JObject value)
public IEnumerable<object> Post(string id, [FromQuery]string type)
{
var ret = new List<Role>();
dynamic json = value;
switch ((string)json.type)
IEnumerable<Role> ret = new List<Role>();
switch (type)
{
case "user":
ret = RoleHelper.RetrieveRolesByUserId(id).ToList();
ret = RoleHelper.RetrievesByUserId(id);
break;
case "group":
ret = RoleHelper.RetrieveRolesByGroupId(id).ToList();
ret = RoleHelper.RetrievesByGroupId(id);
break;
case "menu":
ret = RoleHelper.RetrieveRolesByMenuId(id).ToList();
ret = RoleHelper.RetrievesByMenuId(id);
break;
default:
break;
}
return ret;
return ret.Select(m => new { m.Id, m.Checked, m.RoleName, m.Description });
}
/// <summary>根据GroupID获取
/// <summary>
/// 保存角色
/// </summary>
/// <param name="value"></param>
/// <param name="id">用户ID/部门ID/菜单ID</param>
/// <param name="roleIds">选中的角色ID集合</param>
/// <param name="type">type=menu时菜单维护页面对角色授权弹框保存按钮调用</param>
/// <returns></returns>
[HttpPut("{id}")]
public bool Put(int id, [FromBody]JObject value)
public bool Put(string id, [FromBody]IEnumerable<string> roleIds, [FromQuery]string type)
{
var ret = false;
dynamic json = value;
string roleIds = json.roleIds;
switch ((string)json.type)
switch (type)
{
case "user":
ret = RoleHelper.SaveRolesByUserId(id, roleIds);
ret = RoleHelper.SaveByUserId(id, roleIds);
break;
case "group":
ret = RoleHelper.SaveRolesByGroupId(id, roleIds);
ret = RoleHelper.SaveByGroupId(id, roleIds);
break;
case "menu":
ret = RoleHelper.SavaRolesByMenuId(id, roleIds);
ret = RoleHelper.SavaByMenuId(id, roleIds);
break;
default:
break;
@ -87,16 +85,16 @@ namespace Bootstrap.Admin.Controllers.Api
[HttpPost]
public bool Post([FromBody]Role value)
{
return RoleHelper.SaveRole(value);
return RoleHelper.Save(value);
}
/// <summary>
///
/// </summary>
/// <param name="value"></param>
[HttpDelete]
public bool Delete([FromBody]IEnumerable<int> value)
public bool Delete([FromBody]IEnumerable<string> value)
{
return RoleHelper.DeleteRole(value);
return RoleHelper.Delete(value);
}
}
}

View File

@ -10,7 +10,8 @@ namespace Bootstrap.Admin.Controllers.Api
///
/// </summary>
[Route("api/[controller]")]
public class SettingsController : Controller
[ApiController]
public class SettingsController : ControllerBase
{
/// <summary>
///
@ -26,7 +27,6 @@ namespace Bootstrap.Admin.Controllers.Api
/// <summary>
///
/// </summary>
/// <param name="value"></param>
[HttpGet]
public IEnumerable<ICacheCorsItem> Get()
{

View File

@ -8,7 +8,8 @@ namespace Bootstrap.Admin.Controllers.Api
///
/// </summary>
[Route("api/[controller]")]
public class TasksController : Controller
[ApiController]
public class TasksController : ControllerBase
{
/// <summary>
///
@ -17,7 +18,7 @@ namespace Bootstrap.Admin.Controllers.Api
[HttpGet]
public IEnumerable<Task> Get()
{
return TaskHelper.RetrieveTasks();
return TaskHelper.Retrieves();
}
}
}

View File

@ -1,10 +1,9 @@
using Bootstrap.Admin.Query;
using Bootstrap.DataAccess;
using Bootstrap.Security;
using Longbow.Web.Mvc;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
@ -14,7 +13,8 @@ namespace Bootstrap.Admin.Controllers.Api
///
/// </summary>
[Route("api/[controller]")]
public class UsersController : Controller
[ApiController]
public class UsersController : ControllerBase
{
/// <summary>
///
@ -22,7 +22,7 @@ namespace Bootstrap.Admin.Controllers.Api
/// <param name="value"></param>
/// <returns></returns>
[HttpGet]
public QueryData<User> Get(QueryUserOption value)
public QueryData<object> Get([FromQuery]QueryUserOption value)
{
return value.RetrieveData();
}
@ -36,16 +36,16 @@ namespace Bootstrap.Admin.Controllers.Api
if (User.IsInRole("Administrators")) return false;
var ret = false;
if (value.UserStatus == 3)
if (value.UserStatus == UserStates.ChangeTheme)
{
return UserHelper.SaveUserCssByName(value.UserName, value.Css);
}
if (value.UserName.Equals(User.Identity.Name, System.StringComparison.OrdinalIgnoreCase))
{
if (value.UserStatus == 1)
ret = BootstrapUser.SaveUserInfoByName(value.UserName, value.DisplayName);
else if (value.UserStatus == 2)
ret = BootstrapUser.ChangePassword(value.UserName, value.Password, value.NewPassword);
if (value.UserStatus == UserStates.ChangeDisplayName)
ret = UserHelper.SaveDisplayName(value.UserName, value.DisplayName);
else if (value.UserStatus == UserStates.ChangePassword)
ret = UserHelper.ChangePassword(value.UserName, value.Password, value.NewPassword);
}
return ret;
}
@ -53,70 +53,66 @@ namespace Bootstrap.Admin.Controllers.Api
///
/// </summary>
/// <param name="id"></param>
/// <param name="value"></param>
/// <param name="type"></param>
/// <returns></returns>
[HttpPost("{id}")]
public IEnumerable<User> Post(int id, [FromBody]JObject value)
public IEnumerable<object> Post(string id, [FromQuery]string type)
{
var ret = new List<User>();
dynamic json = value;
switch ((string)json.type)
switch (type)
{
case "role":
ret = UserHelper.RetrieveUsersByRoleId(id).ToList();
break;
return UserHelper.RetrievesByRoleId(id).Select(p => new
{
p.Id,
p.DisplayName,
p.UserName,
p.Checked
});
case "group":
ret = UserHelper.RetrieveUsersByGroupId(id).ToList();
break;
return UserHelper.RetrievesByGroupId(id).ToList();
default:
break;
return null;
}
return ret;
}
/// <summary>
///
/// 前台User View调用新建/更新用户
/// </summary>
/// <param name="value"></param>
[HttpPost]
public bool Post([FromBody]User value)
{
value.Description = string.Format("管理员{0}创建用户", User.Identity.Name);
value.ApprovedBy = User.Identity.Name;
return UserHelper.SaveUser(value);
var ret = false;
if (string.IsNullOrEmpty(value.Id))
{
value.Description = string.Format("管理员{0}创建用户", User.Identity.Name);
value.ApprovedBy = User.Identity.Name;
value.ApprovedTime = DateTime.Now;
ret = UserHelper.Save(value);
}
else
{
ret = UserHelper.Update(value.Id, value.Password, value.DisplayName);
}
return ret;
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <param name="value"></param>
/// <param name="userIds"></param>
/// <param name="type"></param>
/// <returns></returns>
[HttpPut("{id}")]
public bool Put(int id, [FromBody]JObject value)
public bool Put(string id, [FromBody]IEnumerable<string> userIds, [FromQuery]string type)
{
var ret = false;
dynamic json = value;
string userIds = json.userIds;
switch ((string)json.type)
switch (type)
{
case "role":
ret = UserHelper.SaveUsersByRoleId(id, userIds);
ret = UserHelper.SaveByRoleId(id, userIds);
break;
case "group":
ret = UserHelper.SaveUsersByGroupId(id, userIds);
break;
case "user":
// 此时 userIds 存储的信息是操作结果 1 标示同意 0 标示拒绝
var user = new User() { Id = id, UserStatus = 2 };
if (userIds == "1")
{
user.ApprovedBy = User.Identity.Name;
}
else
{
user.RejectedReason = "无原因";
user.RejectedBy = User.Identity.Name;
}
ret = UserHelper.SaveUser(user);
ret = UserHelper.SaveByGroupId(id, userIds);
break;
default:
break;
@ -128,9 +124,9 @@ namespace Bootstrap.Admin.Controllers.Api
/// </summary>
/// <param name="value"></param>
[HttpDelete]
public bool Delete([FromBody]IEnumerable<int> value)
public bool Delete([FromBody]IEnumerable<string> value)
{
return UserHelper.DeleteUser(value);
return UserHelper.Delete(value);
}
/// <summary>
///

View File

@ -1,10 +1,8 @@
using Bootstrap.Admin.Models;
using Bootstrap.DataAccess;
using Longbow.Web.WebSockets;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
namespace Bootstrap.Admin.Controllers
{
@ -17,11 +15,12 @@ namespace Bootstrap.Admin.Controllers
///
/// </summary>
/// <returns></returns>
public ActionResult Index()
public IActionResult Index()
{
var v = new HeaderBarModel(User.Identity) { HomeUrl = DictHelper.RetrieveHomeUrl() };
return v.HomeUrl.StartsWith("~/") ? (ActionResult)View(v) : Redirect(v.HomeUrl);
var url = DictHelper.RetrieveHomeUrl();
return url.Equals("~/Home/Index", System.StringComparison.OrdinalIgnoreCase) ? (IActionResult)View(new HeaderBarModel(User.Identity)) : Redirect(url);
}
/// <summary>
///
/// </summary>
@ -30,7 +29,22 @@ namespace Bootstrap.Admin.Controllers
[AllowAnonymous]
public IActionResult Error(int id)
{
return id == 404 ? View("NotFound") : View();
var returnUrl = Request.Query[CookieAuthenticationDefaults.ReturnUrlParameter].ToString();
var model = new ErrorModel() { ReturnUrl = string.IsNullOrEmpty(returnUrl) ? Url.Content("~/Home/Index") : returnUrl };
model.Title = "服务器内部错误";
model.Content = "服务器内部错误";
model.Image = "error_icon.png";
if (id == 0)
{
model.Content = "未处理服务器内部错误";
}
else if (id == 404)
{
model.Title = "资源未找到";
model.Content = "请求资源未找到";
model.Image = "404_icon.png";
}
return View(model);
}
}
}

View File

@ -0,0 +1,36 @@
using Microsoft.AspNetCore.Authorization;
using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Collections.Generic;
using System.Linq;
using Operation = Swashbuckle.AspNetCore.Swagger.Operation;
namespace Bootstrap.Admin
{
/// <summary>
///
/// </summary>
public class HttpHeaderOperation : IOperationFilter
{
/// <summary>
///
/// </summary>
/// <param name="operation"></param>
/// <param name="context"></param>
public void Apply(Operation operation, OperationFilterContext context)
{
if (operation.Parameters == null) operation.Parameters = new List<IParameter>();
if (context.MethodInfo.GetCustomAttributes(typeof(AllowAnonymousAttribute), true).Length == 0)
{
operation.Parameters.Add(new NonBodyParameter()
{
Name = "Authorization", //添加Authorization头部参数
In = "header",
Type = "string",
Required = false
});
}
}
}
}

View File

@ -1,21 +1,28 @@
namespace Bootstrap.Admin.Models
{
/// <summary>
///
/// </summary>
public class LoginModel : ModelBase
{
/// <summary>
///
/// </summary>
public string UserName { get; set; }
/// <summary>
///
/// </summary>
public string Password { get; set; }
/// <summary>
///
/// </summary>
public string Remember { get; set; }
}
}
namespace Bootstrap.Admin.Models
{
/// <summary>
///
/// </summary>
public class ErrorModel
{
/// <summary>
///
/// </summary>
public string Title { get; set; }
/// <summary>
///
/// </summary>
public string Content { get; set; }
/// <summary>
///
/// </summary>
public string Image { get; set; }
/// <summary>
///
/// </summary>
public string ReturnUrl { get; set; }
}
}

View File

@ -1,7 +1,6 @@
using Bootstrap.DataAccess;
using Bootstrap.Security;
using System.IO;
using System.Security.Principal;
using System.Web;
namespace Bootstrap.Admin.Models
{
@ -10,30 +9,29 @@ namespace Bootstrap.Admin.Models
/// </summary>
public class HeaderBarModel : ModelBase
{
/// <summary>
///
/// </summary>
/// <param name="identity"></param>
public HeaderBarModel(IIdentity identity)
{
var user = BootstrapUser.RetrieveUserByUserName(identity.Name);
Icon = user.Icon;
var user = UserHelper.RetrieveUserByUserName(identity.Name);
Icon = Path.Combine(DictHelper.RetrieveIconFolderPath(), string.IsNullOrEmpty(user.Icon) ? DictHelper.RetrieveDefaultIcon() : user.Icon);
DisplayName = user.DisplayName;
UserName = user.UserName;
Css = user.Css;
if (!string.IsNullOrEmpty(user.Css)) Theme = user.Css;
}
/// <summary>
///
/// </summary>
public string UserName { get; }
/// <summary>
///
/// </summary>
public string DisplayName { get; }
/// <summary>
///
/// </summary>
public string HomeUrl { get; set; }
/// <summary>
/// 获得/设置 用户头像地址
/// </summary>
public string Icon { get; }
/// <summary>
///
/// </summary>
public string Css { get; }
}
}

View File

@ -27,6 +27,6 @@ namespace Bootstrap.Admin.Models
/// <summary>
///
/// </summary>
public string Theme { get; private set; }
public string Theme { get; protected set; }
}
}

View File

@ -5,13 +5,19 @@ using System.Collections.Generic;
namespace Bootstrap.Admin.Models
{
/// <summary>
///
/// </summary>
public class NavigatorBarModel : HeaderBarModel
{
/// <summary>
///
/// </summary>
/// <param name="controller"></param>
public NavigatorBarModel(ControllerBase controller) : base(controller.User.Identity)
{
Navigations = BootstrapMenu.RetrieveSystemMenus(UserName, $"~{controller.HttpContext.Request.Path}");
Navigations = MenuHelper.RetrieveSystemMenus(UserName, $"~{controller.HttpContext.Request.Path}");
Applications = DictHelper.RetrieveApps();
HomeUrl = "~/Admin/Index";
}
/// <summary>
///

View File

@ -1,8 +1,5 @@
using Bootstrap.DataAccess;
using Bootstrap.Security;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.IO;
namespace Bootstrap.Admin.Models
@ -19,14 +16,20 @@ namespace Bootstrap.Admin.Models
/// <summary>
///
/// </summary>
public string FileName { get; }
/// <summary>
///
/// </summary>
/// <param name="controller"></param>
public ProfilesModel(ControllerBase controller) : base(controller)
{
// TODO: 找到MapPath方法
var fileName = AppContext.BaseDirectory + Icon;
var host = controller.HttpContext.RequestServices.GetService(typeof(IHostingEnvironment)) as IHostingEnvironment;
if (host == null) return;
var fileName = Path.Combine(host.WebRootPath, Icon.TrimStart('~', '/').Replace('/', '\\'));
if (File.Exists(fileName))
{
Size = new FileInfo(fileName).Length;
FileName = Path.GetFileName(fileName);
}
}
}

View File

@ -3,13 +3,24 @@ using Microsoft.AspNetCore.Hosting;
namespace Bootstrap.Admin
{
/// <summary>
///
/// </summary>
public class Program
{
/// <summary>
///
/// </summary>
/// <param name="args"></param>
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
/// <summary>
///
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
}

View File

@ -22,7 +22,7 @@
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:50853/"
"applicationUrl": "http://localhost:50852/"
}
}
}

View File

@ -5,6 +5,9 @@ using System.Linq;
namespace Bootstrap.Admin.Query
{
/// <summary>
///
/// </summary>
public class QueryDictOption : PaginationOption
{
/// <summary>

View File

@ -1,56 +1,33 @@
using Bootstrap.DataAccess;
using Longbow.Web.Mvc;
using System;
using System.Globalization;
using System.Linq;
namespace Bootstrap.Admin.Query
{
/// <summary>
///
/// </summary>
public class QueryExceptionOption : PaginationOption
{
/// <summary>
///
/// </summary>
public DateTime StartTime { get; set; }
public DateTime? StartTime { get; set; }
/// <summary>
///
/// </summary>
public DateTime EndTime { get; set; }
public DateTime? EndTime { get; set; }
/// <summary>
///
/// </summary>
/// <returns></returns>
public QueryData<Exceptions> RetrieveData()
public QueryData<object> Retrieves()
{
var data = ExceptionHelper.RetrieveExceptions();
if (StartTime > DateTime.MinValue)
{
data = data.Where(t => t.LogTime > StartTime);
}
if (EndTime > DateTime.MinValue)
{
data = data.Where(t => t.LogTime < EndTime.AddDays(1));
}
var ret = new QueryData<Exceptions>();
ret.total = data.Count();
switch (Sort)
{
case "ErrorPage":
data = Order == "asc" ? data.OrderBy(t => t.ErrorPage) : data.OrderByDescending(t => t.ErrorPage);
break;
case "UserID":
data = Order == "asc" ? data.OrderBy(t => t.UserId) : data.OrderByDescending(t => t.UserId);
break;
case "UserIp":
data = Order == "asc" ? data.OrderBy(t => t.UserIp) : data.OrderByDescending(t => t.UserIp);
break;
case "LogTime":
data = Order == "asc" ? data.OrderBy(t => t.LogTime) : data.OrderByDescending(t => t.LogTime);
break;
default:
break;
}
ret.rows = data.Skip(Offset).Take(Limit);
var data = ExceptionsHelper.RetrievePages(this, StartTime, EndTime);
var ret = new QueryData<object>();
ret.total = (int)data.TotalItems;
ret.rows = data.Items.Select(ex => new { ex.UserId, ex.UserIp, ex.LogTime, ex.Message, ex.ErrorPage, ex.ExceptionType });
return ret;
}
}

View File

@ -4,6 +4,9 @@ using System.Linq;
namespace Bootstrap.Admin.Query
{
/// <summary>
///
/// </summary>
public class QueryGroupOption : PaginationOption
{
/// <summary>
@ -18,10 +21,10 @@ namespace Bootstrap.Admin.Query
///
/// </summary>
/// <returns></returns>
public QueryData<Group> RetrieveData()
public QueryData<object> RetrieveData()
{
// int limit, int offset, string name, string price, string sort, string order
var data = GroupHelper.RetrieveGroups();
var data = GroupHelper.Retrieves();
if (!string.IsNullOrEmpty(GroupName))
{
data = data.Where(t => t.GroupName.Contains(GroupName));
@ -30,10 +33,10 @@ namespace Bootstrap.Admin.Query
{
data = data.Where(t => t.Description.Contains(Description));
}
var ret = new QueryData<Group>();
var ret = new QueryData<object>();
ret.total = data.Count();
data = Order == "asc" ? data.OrderBy(t => t.GroupName) : data.OrderByDescending(t => t.GroupName);
ret.rows = data.Skip(Offset).Take(Limit);
ret.rows = data.Skip(Offset).Take(Limit).Select(g => new { g.Id, g.GroupName, g.Description });
return ret;
}
}

View File

@ -1,11 +1,13 @@
using Bootstrap.DataAccess;
using Longbow.Web.Mvc;
using System;
using System.Globalization;
using System.Linq;
namespace Bootstrap.Admin.Query
{
/// <summary>
///
/// </summary>
public class QueryLogOption : PaginationOption
{
/// <summary>
@ -15,18 +17,18 @@ namespace Bootstrap.Admin.Query
/// <summary>
///
/// </summary>
public DateTime OperateTimeStart { get; set; }
public DateTime? OperateTimeStart { get; set; }
/// <summary>
///
/// </summary>
public DateTime OperateTimeEnd { get; set; }
public DateTime? OperateTimeEnd { get; set; }
/// <summary>
///
/// </summary>
/// <returns></returns>
public QueryData<Log> RetrieveData()
{
var data = LogHelper.RetrieveLogs();
var data = LogHelper.Retrieves();
if (!string.IsNullOrEmpty(OperateType))
{
data = data.Where(t => t.CRUD.ToString().Contains(OperateType));
@ -38,7 +40,7 @@ namespace Bootstrap.Admin.Query
}
if (OperateTimeEnd > DateTime.MinValue)
{
data = data.Where(t => t.LogTime < OperateTimeEnd.AddDays(1));
data = data.Where(t => t.LogTime < OperateTimeEnd.Value.AddDays(1));
}
var ret = new QueryData<Log>();

View File

@ -1,9 +1,12 @@
using Bootstrap.Security;
using Bootstrap.DataAccess;
using Longbow.Web.Mvc;
using System.Linq;
namespace Bootstrap.Admin.Query
{
/// <summary>
///
/// </summary>
public class QueryMenuOption : PaginationOption
{
/// <summary>
@ -22,10 +25,14 @@ namespace Bootstrap.Admin.Query
///
/// </summary>
public string IsResource { get; set; }
public QueryData<BootstrapMenu> RetrieveData(string userName)
/// <summary>
///
/// </summary>
/// <param name="userName"></param>
/// <returns></returns>
public QueryData<object> RetrieveData(string userName)
{
var data = BootstrapMenu.RetrieveMenusByUserName(userName);
var data = MenuHelper.RetrieveMenusByUserName(userName);
if (!string.IsNullOrEmpty(ParentName))
{
data = data.Where(t => t.ParentName.Contains(ParentName));
@ -42,7 +49,7 @@ namespace Bootstrap.Admin.Query
{
data = data.Where(t => t.IsResource.ToString() == IsResource);
}
var ret = new QueryData<BootstrapMenu>();
var ret = new QueryData<object>();
ret.total = data.Count();
switch (Sort)
{
@ -64,13 +71,27 @@ namespace Bootstrap.Admin.Query
case "IsResource":
data = Order == "asc" ? data.OrderBy(t => t.IsResource) : data.OrderByDescending(t => t.IsResource);
break;
case "ApplicationCode":
data = Order == "asc" ? data.OrderBy(t => t.ApplicationCode) : data.OrderByDescending(t => t.ApplicationCode);
case "Application":
data = Order == "asc" ? data.OrderBy(t => t.Application) : data.OrderByDescending(t => t.Application);
break;
default:
break;
}
ret.rows = data.Skip(Offset).Take(Limit);
ret.rows = data.Skip(Offset).Take(Limit).Select(p => new
{
p.Id,
p.ParentId,
p.ParentName,
p.Name,
p.Order,
p.Icon,
p.Url,
p.Category,
p.CategoryName,
p.Target,
p.IsResource,
p.Application
});
return ret;
}
}

View File

@ -4,6 +4,9 @@ using System.Linq;
namespace Bootstrap.Admin.Query
{
/// <summary>
///
/// </summary>
public class QueryRoleOption : PaginationOption
{
/// <summary>
@ -18,10 +21,10 @@ namespace Bootstrap.Admin.Query
///
/// </summary>
/// <returns></returns>
public QueryData<Role> RetrieveData()
public QueryData<object> RetrieveData()
{
// int limit, int offset, string name, string price, string sort, string order
var data = RoleHelper.RetrieveRoles();
var data = RoleHelper.Retrieves();
if (!string.IsNullOrEmpty(RoleName))
{
data = data.Where(t => t.RoleName.Contains(RoleName));
@ -30,10 +33,10 @@ namespace Bootstrap.Admin.Query
{
data = data.Where(t => t.Description.Contains(Description));
}
var ret = new QueryData<Role>();
var ret = new QueryData<object>();
ret.total = data.Count();
data = Order == "asc" ? data.OrderBy(t => t.RoleName) : data.OrderByDescending(t => t.RoleName);
ret.rows = data.Skip(Offset).Take(Limit);
ret.rows = data.Skip(Offset).Take(Limit).Select(r => new { r.Id, r.RoleName, r.Description });
return ret;
}
}

View File

@ -17,11 +17,14 @@ namespace Bootstrap.Admin.Query
///
/// </summary>
public string DisplayName { get; set; }
public QueryData<User> RetrieveData()
/// <summary>
///
/// </summary>
/// <returns></returns>
public QueryData<object> RetrieveData()
{
// int limit, int offset, string name, string price, string sort, string order
var data = UserHelper.RetrieveUsers();
var data = UserHelper.Retrieves();
if (!string.IsNullOrEmpty(Name))
{
data = data.Where(t => t.UserName.Contains(Name));
@ -30,7 +33,7 @@ namespace Bootstrap.Admin.Query
{
data = data.Where(t => t.DisplayName.Contains(DisplayName));
}
var ret = new QueryData<User>();
var ret = new QueryData<object>();
ret.total = data.Count();
switch (Sort)
{
@ -52,7 +55,16 @@ namespace Bootstrap.Admin.Query
default:
break;
}
ret.rows = data.Skip(Offset).Take(Limit);
ret.rows = data.Skip(Offset).Take(Limit).Select(u => new
{
u.Id,
u.UserName,
u.DisplayName,
u.RegisterTime,
u.ApprovedTime,
u.ApprovedBy,
u.Description
});
return ret;
}
}

View File

@ -0,0 +1,34 @@
using Bootstrap.DataAccess;
using Microsoft.AspNetCore.SignalR;
using System;
using System.Data.Common;
namespace Bootstrap.Admin
{
/// <summary>
///
/// </summary>
public static class SignalRManager
{
/// <summary>
///
/// </summary>
/// <param name="client"></param>
/// <param name="args"></param>
/// <returns></returns>
public static async System.Threading.Tasks.Task Send(IClientProxy client, MessageBody args) => await client.SendAsync("rev", args);
/// <summary>
///
/// </summary>
/// <param name="context"></param>
/// <param name="ex"></param>
/// <returns></returns>
public static async System.Threading.Tasks.Task Send<T>(IHubContext<T> context, Exception ex) where T : Hub
{
var category = "App";
if (ex.GetType().IsSubclassOf(typeof(DbException))) category = "DB";
var message = new MessageBody() { Category = category, Message = ex.Message };
await Send(context.Clients.All, message);
}
}
}

View File

@ -1,38 +1,49 @@
using Bootstrap.DataAccess;
using Bootstrap.Security.Filter;
using Bootstrap.Security.Middleware;
using Longbow.Cache;
using Longbow.Cache.Middleware;
using Longbow.Configuration;
using Longbow.Data;
using Longbow.Logging;
using Longbow.Web;
using Longbow.Web.WebSockets;
using Longbow.Web.SignalR;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Versioning;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Swashbuckle.AspNetCore.Swagger;
using System;
using System.IO;
namespace Bootstrap.Admin
{
/// <summary>
///
/// </summary>
public class Startup
{
/// <summary>
///
/// </summary>
/// <param name="configuration"></param>
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
/// <summary>
///
/// </summary>
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
/// <summary>
///
/// </summary>
/// <param name="services"></param>
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
@ -42,28 +53,57 @@ namespace Bootstrap.Admin
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddCors();
services.AddLogging(builder => builder.AddFileLogger().AddDBLogger(ExceptionHelper.Log));
services.AddConfigurationManager();
services.AddCacheManager();
services.AddDBAccessFactory();
services.AddLogging(builder => builder.AddFileLogger().AddDBLogger(ExceptionsHelper.Log));
services.AddConfigurationManager(Configuration);
services.AddCacheManager(Configuration);
services.AddDbAdapter();
var dataProtectionBuilder = services.AddDataProtection(op => op.ApplicationDiscriminator = Configuration["ApplicationDiscriminator"])
.SetApplicationName(Configuration["ApplicationName"])
.PersistKeysToFileSystem(new DirectoryInfo(Configuration["KeyPath"]));
if (Configuration["DisableAutomaticKeyGeneration"] == "True") dataProtectionBuilder.DisableAutomaticKeyGeneration();
services.AddSignalR().AddJsonProtocalDefault();
services.AddSignalRExceptionFilterHandler<SignalRHub>(async (client, ex) => await SignalRManager.Send(client, ex));
services.AddResponseCompression();
services.AddMvc(options =>
{
options.Filters.Add<BootstrapAdminAuthorizeFilter>();
options.Filters.Add<ExceptionFilter>();
options.Filters.Add<SignalRExceptionFilter<SignalRHub>>();
}).AddJsonOptions(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
JsonConvert.DefaultSettings = () => options.SerializerSettings;
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options => options.Cookie.Path = "/");
services.AddApiVersioning(option =>
{
option.DefaultApiVersion = new ApiVersion(1, 0);
option.ReportApiVersions = true;
option.AssumeDefaultVersionWhenUnspecified = true;
option.ApiVersionReader = ApiVersionReader.Combine(new HeaderApiVersionReader("api-version"), new QueryStringApiVersionReader("api-version"));
});
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new Info
{
Version = "v1",
Title = "BootstrapAdmin API"
});
//Set the comments path for the swagger json and ui.
var xmlPath = Path.Combine(AppContext.BaseDirectory, "Bootstrap.Admin.xml");
options.IncludeXmlComments(xmlPath);
options.OperationFilter<HttpHeaderOperation>(); // 添加httpHeader参数
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
/// <summary>
///
/// </summary>
/// <param name="app"></param>
/// <param name="env"></param>
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
@ -78,18 +118,31 @@ namespace Bootstrap.Admin
app.UseStatusCodePagesWithReExecute("/Home/Error/{0}");
app.UseCors(builder => builder.WithOrigins(Configuration["AllowOrigins"].Split(',', StringSplitOptions.RemoveEmptyEntries)).AllowAnyHeader().AllowAnyMethod().AllowCredentials());
app.UseHttpsRedirection();
app.UseResponseCompression();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseBootstrapRoleAuthorization();
app.UseWebSocketHandler(options => options.UseAuthentication = true);
app.UseBootstrapAdminAuthorization(userName => RoleHelper.RetrieveRolesByUserName(userName), url => RoleHelper.RetrieveRolesByUrl(url));
app.UseCacheManagerCorsHandler();
app.UseSignalR(routes => { routes.MapHub<SignalRHub>("/NotiHub"); });
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
app.UseWhen(context => context.Request.Path.StartsWithSegments("/swagger"), builder =>
{
builder.Use(async (context, next) =>
{
if (!context.User.Identity.IsAuthenticated) await context.ChallengeAsync();
else await next();
});
});
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint($"{Configuration["SwaggerPathBase"]}/swagger/v1/swagger.json", "BootstrapAdmin API V1");
});
}
}
}
}

View File

@ -1,17 +1,17 @@
@{
ViewBag.Title = "未授权请求";
Layout = "~/Views/Shared/_Root.cshtml";
Layout = "_Layout";
}
@section css {
<link href="~/css/error.css" rel="stylesheet" />
<link href="~/css/error.css" rel="stylesheet" asp-append-version="true" />
}
@section Javascript {
<script src="~/js/error.js"></script>
@section javascript {
<script src="~/js/error.js" asp-append-version="true"></script>
}
<section class="error-wrapper">
<img src="~/images/error_icon.png" />
<h1>网页拒绝访问</h1>
<h3>您无权访问本页面请联系网站管理员授权后再查看</h3>
<br />
<a href="~/Home/Index" target="_top">返回首页</a>
</section>
<a href="@ViewBag.ReturnUrl" target="_top">返回首页</a>
</section>

View File

@ -1,8 +1,196 @@
@model ModelBase
@{
ViewBag.Title = Model.Title;
Layout = "~/Views/Shared/_Login.cshtml";
Layout = "_Layout";
}
@section css {
<link href="~/css/login.css" rel="stylesheet" />
}
<environment include="Development">
<link href="~/lib/twitter-bootstrap/css/bootstrap.css" rel="stylesheet" />
<link href="~/lib/font-awesome/css/font-awesome.css" rel="stylesheet" />
<link href="~/lib/bootstrap-sweetalert/sweetalert.css" rel="stylesheet" />
</environment>
<environment exclude="Development">
<link href="~/lib/twitter-bootstrap/css/bootstrap.min.css" rel="stylesheet" />
<link href="~/lib/font-awesome/css/font-awesome.min.css" rel="stylesheet" />
<link href="~/lib/bootstrap-sweetalert/sweetalert.min.css" rel="stylesheet" />
</environment>
<link href="~/css/theme.css" rel="stylesheet" asp-append-version="true" />
<link href="~/css/login.css" rel="stylesheet" asp-append-version="true" />
<link href="~/css/login-responsive.css" rel="stylesheet" asp-append-version="true" />
@if (!string.IsNullOrEmpty(Model.Theme))
{
<link href="~/css/@Model.Theme" rel="stylesheet" asp-append-version="true" />
}
}
@section javascript {
<environment include="Development">
<script src="~/lib/twitter-bootstrap/js/bootstrap.bundle.js"></script>
<script src="~/lib/validate/jquery.validate.js"></script>
<script src="~/lib/validate/localization/messages_zh.js"></script>
<script src="~/lib/bootstrap-sweetalert/sweetalert.js"></script>
</environment>
<environment exclude="Development">
<script src="~/lib/twitter-bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="~/lib/validate/jquery.validate.min.js"></script>
<script src="~/lib/validate/localization/messages_zh.min.js"></script>
<script src="~/lib/bootstrap-sweetalert/sweetalert.min.js"></script>
</environment>
<script src="~/lib/longbow/longbow.common.js"></script>
<script src="~/lib/longbow/longbow.validate.js"></script>
<script src="~/js/login.js" asp-append-version="true"></script>
}
<div class="container">
<form id="login" method="post" class="form-signin">
<h2 class="form-signin-heading">@Model.Title</h2>
<div class="login-wrap" data-toggle="LgbValidate" data-valid-button="button[type='submit']">
<div class="form-group">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
<span class="fa fa-user"></span>
</div>
</div>
<input type="text" name="userName" class="form-control" placeholder="用户名" data-required-msg="请输入用户名" value="" autofocus data-valid="true" />
</div>
</div>
<div class="form-group">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
<span class="fa fa-lock"></span>
</div>
</div>
<input type="password" name="password" class="form-control" value="" placeholder="密码" data-required-msg="请输入密码" data-valid="true" />
</div>
</div>
<div class="form-group rememberPwd" onselectstart="return false">
<i class="fa fa-square-o"></i>
<span>记住密码自动登录</span>
<input id="remember" name="remember" type="hidden" value="false" />
</div>
<button class="btn btn-lg btn-login btn-block" type="submit">登 陆</button>
<div class="login-footer">
<a href="#" data-method="register">申请账号</a>
<a href="#" data-method="forgot">忘记密码</a>
</div>
</div>
</form>
</div>
<div class="modal fade" id="dialogNew" tabindex="-1" role="dialog" data-backdrop="static" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg" role="document">
<div class="modal-content" data-toggle="LgbValidate" data-valid-button="#btnSubmit" data-valid-modal="#dialogNew">
<div class="modal-header">
<h5 class="modal-title" id="myModalLabel">新用户注册</h5>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body">
<div class="form-group">
<label for="userName">登陆账号:</label>
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
<span class="fa fa-user-plus"></span>
</div>
</div>
<input type="text" id="userName" autocomplete="off" class="form-control" placeholder="登陆账号不可为空" minlength="4" maxlength="50" remote="api/Register" data-remote-msg="此用户已存在" data-valid="true" />
</div>
</div>
<div class="form-group">
<label for="displayName">显示名称:</label>
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
<span class="fa fa-user-circle-o"></span>
</div>
</div>
<input type="text" id="displayName" class="form-control" value="" placeholder="显示名称不可为空" maxlength="50" data-valid="true" />
</div>
</div>
<div class="form-group">
<label for="password">密码:</label>
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
<span class="fa fa-lock"></span>
</div>
</div>
<input type="password" id="password" class="form-control" value="" placeholder="密码不可为空" maxlength="50" data-valid="true" />
</div>
</div>
<div class="form-group">
<label for="assurePassword">确认密码:</label>
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
<span class="fa fa-lock"></span>
</div>
</div>
<input type="password" id="assurePassword" class="form-control" value="" placeholder="确认密码" maxlength="50" equalTo="#password" data-valid="true" />
</div>
</div>
<div class="form-group">
<label for="description">申请理由:</label>
<textarea id="description" class="form-control" placeholder="申请理由500字以内" rows="3" maxlength="500" data-valid="true"></textarea>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">
<i class="fa fa-times"></i>
<span>关闭</span>
</button>
<button type="button" class="btn btn-primary" id="btnSubmit">
<i class="fa fa-save"></i>
<span>提交</span>
</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="dialogForgot" tabindex="-1" role="dialog" data-backdrop="static" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg" role="document">
<div class="modal-content" data-toggle="LgbValidate" data-valid-button="#btnForgot" data-valid-modal="#dialogForgot">
<div class="modal-header">
<h5 class="modal-title" id="myModalLabelForgot">忘记密码</h5>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body">
<div class="form-group">
<label for="f_userName">登陆账号:</label>
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
<span class="fa fa-user-plus"></span>
</div>
</div>
<input type="text" id="f_userName" autocomplete="off" class="form-control" placeholder="登陆账号不可为空" minlength="4" maxlength="50" remote="api/Register" data-remote-msg="此用户已存在" data-valid="true" />
</div>
</div>
<div class="form-group">
<label for="f_displayName">显示名称:</label>
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
<span class="fa fa-user-circle-o"></span>
</div>
</div>
<input type="text" id="f_displayName" class="form-control" value="" placeholder="显示名称不可为空" maxlength="50" data-valid="true" />
</div>
</div>
<div class="form-group">
<label for="f_desc">申请理由:</label>
<textarea id="f_desc" class="form-control" placeholder="申请理由500字以内" rows="3" maxlength="500" data-valid="true"></textarea>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">
<i class="fa fa-times"></i>
<span>关闭</span>
</button>
<button type="button" class="btn btn-danger" id="btnForgot">
<i class="fa fa-send-o"></i>
<span>提交</span>
</button>
</div>
</div>
</div>
</div>

View File

@ -1,8 +0,0 @@
@model ModelBase
@{
ViewBag.Title = Model.Title;
Layout = "~/Views/Shared/_Login.cshtml";
}
@section css {
<link href="~/css/loginm.css" rel="stylesheet" />
}

View File

@ -1,18 +0,0 @@
@{
ViewBag.Title = "客户端测试";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@section css {
<style type="text/css">
label {
word-break: break-all;
}
section {
padding-top: 15px;
}
</style>
}
<section class="container-fluid">
@await Html.PartialAsync("_Mobile")
</section>

View File

@ -1,38 +0,0 @@
@model ModelBase
<div class="container">
<form id="login" method="post" class="form-signin">
<h2 class="form-signin-heading">@Model.Title</h2>
<div class="login-wrap" data-toggle="LgbValidate" data-valid-button="button[type='submit']">
<div class="form-group">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
<span class="fa fa-user"></span>
</div>
</div>
<input type="text" name="userName" class="form-control" placeholder="用户名" data-required-msg="请输入用户名" value="" autofocus data-valid="true" />
</div>
</div>
<div class="form-group">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
<span class="fa fa-lock"></span>
</div>
</div>
<input type="password" name="password" class="form-control" value="" placeholder="密码" data-required-msg="请输入密码" data-valid="true" />
</div>
</div>
<div class="form-group">
<div class="form-check">
<input id="remember" name="remember" type="checkbox" class="form-check-input" value="true" /><label for="remember" class="form-check-label">记住我</label>
</div>
</div>
<button class="btn btn-lg btn-login btn-block" type="submit">登 陆</button>
<div class="login-footer">
<a href="#" data-method="register">申请账号</a>
<a href="#" data-method="forgot">忘记密码</a>
</div>
</div>
</form>
</div>

View File

@ -1,21 +0,0 @@
@model Bootstrap.Admin.Models.NavigatorBarModel
@{
ViewBag.Title = "Api 文档";
Layout = "~/Views/Shared/_Admin.cshtml";
}
@section javascript {
<script src="~/js/apidoc.js"></script>
}
@section css {
<link href="~/css/api.css" rel="stylesheet" />
}
<section>
<div><h3>接口返回值定义</h3></div>
<div><label class="control-label">布尔值:</label><div>成功返回True失败返回False</div></div>
<div><label class="control-label">对象:</label><div>Json字符串</div></div>
</section>
<section>
<div><h3>接口请求定义</h3></div>
<div><label class="control-label">内容类型</label><div>Content-Type:application/json; charset=utf-8</div></div>
<div><label class="control-label">授权Token</label><div>Token:362a4733-341a-464d-ab12-e01554338839</div></div>
</section>

View File

@ -1,24 +1,29 @@
@model Bootstrap.Admin.Models.NavigatorBarModel
@model NavigatorBarModel
@{
ViewBag.Title = "字典表维护";
Layout = "~/Views/Shared/_Default.cshtml";
Layout = "_Default";
}
@section Javascript {
<script src="~/js/bootstrap3-typeahead.js"></script>
<script src="~/js/dicts.js"></script>
@section javascript {
<environment include="Development">
<script src="~/lib/bootstrap-3-typeahead/bootstrap3-typeahead.js"></script>
</environment>
<environment exclude="Development">
<script src="~/lib/bootstrap-3-typeahead/bootstrap3-typeahead.min.js"></script>
</environment>
<script src="~/js/dicts.js" asp-append-version="true"></script>
}
@section query {
<form class="form-inline">
<div class="form-row">
<div class="form-group col-sm-6 col-md-5">
<div class="row">
<div class="form-group col-sm-6 col-md-auto">
<label class="control-label" for="txt_dict_cate">字典标签</label>
<input type="text" class="form-control" id="txt_dict_cate" data-provide="typeahead" />
</div>
<div class="form-group col-sm-6 col-md-5">
<div class="form-group col-sm-6 col-md-auto">
<label class="control-label" for="txt_dict_name">字典名称</label>
<input type="text" class="form-control" id="txt_dict_name" />
</div>
<div class="form-group col-sm-6 col-md-5">
<div class="form-group form-group-dropdown col-sm-6 col-md-auto">
<label class="control-label" for="txt_dict_define">字典类别</label>
<div class="dropdown">
<button id="txt_dict_define" class="btn btn-success dropdown-select dropdown-toggle" data-toggle="dropdown">全部</button>
@ -30,7 +35,7 @@
</div>
</div>
</div>
<div class="form-group col-sm-6 col-md-5">
<div class="form-group col-sm-6 col-md-auto flex-md-fill justify-content-md-end">
<button type="button" id="btn_query" class="btn btn-primary btn-fill"><i class="fa fa-search" aria-hidden="true"></i><span>查询</span></button>
</div>
</div>
@ -51,21 +56,21 @@
</div>
<div class="modal-body">
<form class="form-inline">
<div class="form-row">
<input type="text" class="form-control d-none" id="dictID" data-default-val="0" />
<div class="row">
<input type="hidden" id="dictID" />
<div class="form-group col-12">
<label class="control-label" for="dictCate">字典标签</label>
<input type="text" class="form-control form-control-url" id="dictCate" placeholder="不可为空50字以内" maxlength="50" data-valid="true" />
<input type="text" class="form-control flex-sm-fill" id="dictCate" placeholder="不可为空50字以内" maxlength="50" data-valid="true" />
</div>
<div class="form-group col-12">
<label class="control-label" for="dictName">字典名称</label>
<input type="text" class="form-control form-control-url" id="dictName" placeholder="不可为空50字以内" maxlength="50" data-valid="true" />
<input type="text" class="form-control flex-sm-fill" id="dictName" placeholder="不可为空50字以内" maxlength="50" data-valid="true" />
</div>
<div class="form-group col-12">
<label class="control-label" for="dictCode">字典代码</label>
<input type="text" class="form-control form-control-url" id="dictCode" placeholder="不可为空50字以内" maxlength="50" data-valid="true" />
<input type="text" class="form-control flex-sm-fill" id="dictCode" placeholder="不可为空50字以内" maxlength="50" data-valid="true" />
</div>
<div class="form-group col-12">
<div class="form-group form-group-dropdown col-12">
<label class="control-label" for="dictDefine">字典类型</label>
<div class="dropdown">
<button id="dictDefine" class="btn btn-success dropdown-select dropdown-toggle" data-toggle="dropdown" data-default-val="1">全部</button>

View File

@ -1,29 +1,40 @@
@model Bootstrap.Admin.Models.NavigatorBarModel
@model NavigatorBarModel
@{
ViewBag.Title = "程序异常";
Layout = "~/Views/Shared/_Admin.cshtml";
}
@section css {
<link href="~/css/bootstrap-table.css" rel="stylesheet" />
<link href="~/css/bootstrap-datetimepicker.css" rel="stylesheet" />
<link href="~/css/fa.css" rel="stylesheet" />
<environment include="Development">
<link href="~/lib/bootstrap-table/bootstrap-table.css" rel="stylesheet" />
<link href="~/lib/datetimepicker/css/bootstrap-datetimepicker.css" rel="stylesheet" />
</environment>
<environment exclude="Development">
<link href="~/lib/bootstrap-table/bootstrap-table.min.css" rel="stylesheet" />
<link href="~/lib/datetimepicker/css/bootstrap-datetimepicker.min.css" rel="stylesheet" />
</environment>
<link href="~/css/fa.css" rel="stylesheet" asp-append-version="true" />
}
@section Javascript {
<script src="~/js/bootstrap-table.js"></script>
<script src="~/js/bootstrap-table-zh-CN.js"></script>
<script src="~/js/longbow.dataentity.js"></script>
<script src="~/js/bootstrap-datetimepicker.js"></script>
<script src="~/js/bootstrap-datetimepicker.zh-CN.js"></script>
<script src="~/js/exceptions.js"></script>
@section javascript {
<environment include="Development">
<script src="~/lib/bootstrap-table/bootstrap-table.js"></script>
<script src="~/lib/bootstrap-table/locale/bootstrap-table-zh-CN.js"></script>
<script src="~/lib/datetimepicker/js/bootstrap-datetimepicker.js"></script>
</environment>
<environment exclude="Development">
<script src="~/lib/bootstrap-table/bootstrap-table.min.js"></script>
<script src="~/lib/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
<script src="~/lib/datetimepicker/js/bootstrap-datetimepicker.min.js"></script>
</environment>
<script src="~/lib/datetimepicker/js/locales/bootstrap-datetimepicker.zh-CN.js"></script>
<script src="~/js/exceptions.js" asp-append-version="true"></script>
}
<div class="card">
<div class="card-header">查询条件</div>
<div class="card-body">
<form class="form-inline">
<div class="form-row">
<div class="form-group col-sm-6 col-lg-5">
<div class="row">
<div class="form-group col-sm-auto">
<label class="control-label" for="txt_operate_start">起始时间</label>
<div class="input-group date form_date">
<div class="input-group date">
<input id="txt_operate_start" class="form-control" size="16" type="text" value="" readonly>
<div class="input-group-append input-group-addon">
<div class="input-group-text"><span class="fa fa-times"></span></div>
@ -33,9 +44,9 @@
</div>
</div>
</div>
<div class="form-group col-sm-6 col-lg-5">
<div class="form-group col-sm-auto">
<label class="control-label" for="txt_operate_end">终止时间</label>
<div class="input-group date form_date">
<div class="input-group date">
<input id="txt_operate_end" class="form-control" size="16" type="text" value="" readonly>
<div class="input-group-append input-group-addon">
<div class="input-group-text"><span class="fa fa-times"></span></div>
@ -45,7 +56,7 @@
</div>
</div>
</div>
<div class="form-group col-lg-2">
<div class="form-group col-sm-auto flex-sm-fill justify-content-sm-end">
<label class="sr-only"></label>
<button type="button" id="btn_query" class="btn btn-primary btn-fill"><i class="fa fa-search" aria-hidden="true"></i><span>查询</span></button>
</div>

View File

@ -1,12 +1,11 @@
@model Bootstrap.Admin.Models.NavigatorBarModel
@model NavigatorBarModel
@{
ViewBag.Title = "图标集";
Layout = "~/Views/Shared/_Admin.cshtml";
}
@section css {
<link href="~/css/fa.css" rel="stylesheet" />
<link href="~/css/fa.css" rel="stylesheet" asp-append-version="true" />
}
@section javascript {
<script src="~/js/icon.js"></script>
<script src="~/js/icon.js" asp-append-version="true"></script>
}
@await Html.PartialAsync("IconView")
<div class="text-center"><i class="fa fa-spinner fa-pulse fa-3x fa-fw"></i></div>

View File

@ -1,24 +1,24 @@
@model Bootstrap.Admin.Models.NavigatorBarModel
@model NavigatorBarModel
@{
ViewBag.Title = "部门管理";
Layout = "~/Views/Shared/_Default.cshtml";
Layout = "_Default";
}
@section Javascript {
<script src="~/js/groups.js"></script>
@section javascript {
<script src="~/js/groups.js" asp-append-version="true"></script>
}
@section query {
<form class="form-inline">
<div class="form-row">
<div class="form-group col-sm-6 col-md-5">
<div class="row">
<div class="form-group col-sm-5 col-md-auto">
<label class="control-label" for="txt_search_name">部门名称</label>
<input type="text" class="form-control" id="txt_search_name" />
</div>
<div class="form-group col-sm-6 col-md-5">
<div class="form-group col-sm-5 col-md-auto">
<label class="control-label" for="txt_group_desc">部门描述</label>
<input type="text" class="form-control" id="txt_group_desc" />
</div>
<div class="form-group col-sm-12 col-md-2">
<button type="button" id="btn_query" class="btn btn-primary btn-fill"><i class="fa fa-search" aria-hidden="true"></i><span>查询</span></button>
<div class="form-group col-sm-2 col-md-auto flex-md-fill justify-content-md-end">
<button type="button" id="btn_query" class="btn btn-primary btn-fill align-self-sm-end align-self-md-auto"><i class="fa fa-search" aria-hidden="true"></i><span>查询</span></button>
</div>
</div>
</form>
@ -46,13 +46,13 @@
</div>
<div class="modal-body">
<form class="form-inline">
<div class="form-row">
<div class="row">
<div class="form-group col-sm-6">
<label class="control-label" for="groupName">部门名称</label>
<input type="text" class="form-control" id="groupName" placeholder="不可为空50字以内" maxlength="50" data-valid="true" />
</div>
<div class="form-group col-sm-6">
<input type="text" class="form-control d-none" id="groupID" data-default-val="0" />
<input type="hidden" id="groupID" />
<label class="control-label" for="groupDesc">部门描述</label>
<input type="text" class="form-control" id="groupDesc" placeholder="描述信息(可为空)50字以内" maxlength="50" />
</div>

View File

@ -1,29 +1,29 @@
<div data-spy="scroll" data-target=".fa-nav" class="iconview">
@await Html.PartialAsync("AwesomeIcon")
<div class="fa-nav">
<h2>图标分类</h2>
<nav class="nav">
<a class="nav-link" href="#fa-top">返回顶部</a>
<a class="nav-link" href="#fa-bottom">返回底部</a>
<a class="nav-link" href="#new">新图标</a>
<a class="nav-link" href="#web-application">Web 图标</a>
<a class="nav-link" href="#accessibility">辅助图标</a>
<a class="nav-link" href="#hand">手形图标</a>
<a class="nav-link" href="#transportation">交通运输图标</a>
<a class="nav-link" href="#gender">性别图标</a>
<a class="nav-link" href="#file-type">文件类型图标</a>
<a class="nav-link" href="#spinner">微调控制项图标</a>
<a class="nav-link" href="#form-control">格式控制图标</a>
<a class="nav-link" href="#payment">支付图标</a>
<a class="nav-link" href="#chart">图表图标</a>
<a class="nav-link" href="#currency">货币图标</a>
<a class="nav-link" href="#text-editor">文本编辑图标</a>
<a class="nav-link" href="#directional">方向图标</a>
<a class="nav-link" href="#video-player">影像播放器图标</a>
<a class="nav-link" href="#brand">品牌图标</a>
<a class="nav-link" href="#medical">医疗图标</a>
<a class="nav-link" href="#fa-top">返回顶部</a>
<a class="nav-link" href="#fa-bottom">返回底部</a>
</nav>
</div>
<div data-spy="scroll" data-target=".fa-nav" class="iconview">
@await Html.PartialAsync("AwesomeIcon")
<div class="fa-nav">
<h2>图标分类</h2>
<nav class="nav">
<a class="nav-link" href="#fa-top">返回顶部</a>
<a class="nav-link" href="#fa-bottom">返回底部</a>
<a class="nav-link" href="#new">新图标</a>
<a class="nav-link" href="#web-application">Web 图标</a>
<a class="nav-link" href="#accessibility">辅助图标</a>
<a class="nav-link" href="#hand">手形图标</a>
<a class="nav-link" href="#transportation">交通运输图标</a>
<a class="nav-link" href="#gender">性别图标</a>
<a class="nav-link" href="#file-type">文件类型图标</a>
<a class="nav-link" href="#spinner">微调控制项图标</a>
<a class="nav-link" href="#form-control">格式控制图标</a>
<a class="nav-link" href="#payment">支付图标</a>
<a class="nav-link" href="#chart">图表图标</a>
<a class="nav-link" href="#currency">货币图标</a>
<a class="nav-link" href="#text-editor">文本编辑图标</a>
<a class="nav-link" href="#directional">方向图标</a>
<a class="nav-link" href="#video-player">影像播放器图标</a>
<a class="nav-link" href="#brand">品牌图标</a>
<a class="nav-link" href="#medical">医疗图标</a>
<a class="nav-link" href="#fa-top">返回顶部</a>
<a class="nav-link" href="#fa-bottom">返回底部</a>
</nav>
</div>
</div>

View File

@ -1,11 +1,10 @@
@model Bootstrap.Admin.Models.ModelBase
@model ModelBase
@{
ViewBag.Title = "后台管理";
Layout = "~/Views/Shared/_Admin.cshtml";
}
@section css {
<style>
.site-footer, .main-content {
.main-content {
position: fixed;
}
@ -22,4 +21,4 @@
});
</script>
}
<h4>欢迎使用后台管理</h4>
<h4>欢迎使用后台管理</h4>

View File

@ -1,45 +1,39 @@
@model Bootstrap.Admin.Models.NavigatorBarModel
@model NavigatorBarModel
@{
ViewBag.Title = "系统日志";
Layout = "~/Views/Shared/_Admin.cshtml";
}
@section css {
<environment include="Development">
<link href="~/css/bootstrap-table.css" rel="stylesheet" />
<link href="~/css/bootstrap-datetimepicker.css" rel="stylesheet" />
<link href="~/lib/datetimepicker/css//bootstrap-datetimepicker.css" rel="stylesheet" />
<link href="~/lib/bootstrap-table/bootstrap-table.css" rel="stylesheet" />
</environment>
<environment exclude="Development">
<link href="~/css/bootstrap-table.min.css" rel="stylesheet" />
<link href="~/css/bootstrap-datetimepicker.min.css" rel="stylesheet" />
<link href="~/lib/datetimepicker/css//bootstrap-datetimepicker.min.css" rel="stylesheet" />
<link href="~/lib/bootstrap-table/bootstrap-table.min.css" rel="stylesheet" />
</environment>
}
@section Javascript {
@section javascript {
<environment include="Development">
<script src="~/js/bootstrap-table.js"></script>
<script src="~/js/bootstrap-table-zh-CN.js"></script>
<script src="~/js/bootstrap-datetimepicker.js"></script>
<script src="~/lib/bootstrap-table/bootstrap-table.js"></script>
<script src="~/lib/bootstrap-table/locale/bootstrap-table-zh-CN.js"></script>
<script src="~/lib/datetimepicker/js/bootstrap-datetimepicker.js"></script>
</environment>
<environment exclude="Development">
<script src="~/js/bootstrap-table.min.js"></script>
<script src="~/js/bootstrap-table-zh-CN.min.js"></script>
<script src="~/js/bootstrap-datetimepicker.min.js"></script>
<script src="~/lib/bootstrap-table/bootstrap-table.min.js"></script>
<script src="~/lib/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
<script src="~/lib/datetimepicker/js/bootstrap-datetimepicker.min.js"></script>
</environment>
<script src="~/js/bootstrap-datetimepicker.zh-CN.js"></script>
<script src="~/js/longbow.dataentity.js"></script>
<script src="~/js/logs.js"></script>
<script src="~/lib/datetimepicker/js/locales/bootstrap-datetimepicker.zh-CN.js"></script>
<script src="~/js/logs.js" asp-append-version="true"></script>
}
<div class="card">
<div class="card-header">查询条件</div>
<div class="card-body">
<form class="form-inline">
<div class="form-row">
<div class="form-group col-12">
<label class="control-label" for="txt_operate_type">操作类型</label>
<input type="text" class="form-control" id="txt_operate_type" />
</div>
<div class="form-group col-sm-6 col-lg-5">
<div class="row">
<div class="form-group col-sm-auto">
<label class="control-label" for="txt_operate_start">起始时间</label>
<div class="input-group date form_date">
<div class="input-group date">
<input id="txt_operate_start" class="form-control" size="16" type="text" value="" readonly>
<div class="input-group-append input-group-addon">
<div class="input-group-text"><span class="fa fa-times"></span></div>
@ -49,9 +43,9 @@
</div>
</div>
</div>
<div class="form-group col-sm-6 col-lg-5">
<div class="form-group col-sm-auto">
<label class="control-label" for="txt_operate_end">终止时间</label>
<div class="input-group date form_date">
<div class="input-group date">
<input id="txt_operate_end" class="form-control" size="16" type="text" value="" readonly>
<div class="input-group-append input-group-addon">
<div class="input-group-text"><span class="fa fa-times"></span></div>
@ -61,7 +55,11 @@
</div>
</div>
</div>
<div class="form-group col-lg-2">
<div class="form-group col-sm-auto">
<label class="control-label" for="txt_operate_type">操作类型</label>
<input type="text" class="form-control" id="txt_operate_type" />
</div>
<div class="form-group col-sm-auto flex-sm-fill justify-content-sm-end">
<button type="button" id="btn_query" class="btn btn-primary btn-fill"><i class="fa fa-search" aria-hidden="true"></i><span>查询</span></button>
</div>
</div>

View File

@ -1,28 +1,38 @@
@model Bootstrap.Admin.Models.NavigatorBarModel
@model NavigatorBarModel
@{
ViewBag.Title = "菜单管理";
Layout = "~/Views/Shared/_Default.cshtml";
Layout = "_Default";
}
@section css {
<link href="~/css/fa.css" rel="stylesheet" />
<link href="~/css/jquery.nestable.css" rel="stylesheet" />
<environment include="Development">
<link href="~/lib/nestable2/jquery.nestable.css" rel="stylesheet" />
</environment>
<environment exclude="Development">
<link href="~/lib/nestable2/jquery.nestable.min.css" rel="stylesheet" />
</environment>
<link href="~/css/fa.css" rel="stylesheet" asp-append-version="true" />
}
@section Javascript {
<script src="~/js/jquery.nestable.js"></script>
<script src="~/js/menus.js"></script>
@section javascript {
<environment include="Development">
<script src="~/lib/nestable2/jquery.nestable.js"></script>
</environment>
<environment exclude="Development">
<script src="~/lib/nestable2/jquery.nestable.min.js"></script>
</environment>
<script src="~/js/menus.js" asp-append-version="true"></script>
}
@section query {
<form class="form-inline">
<div class="form-row">
<div class="form-group col-sm-12 col-md-5">
<div class="row">
<div class="form-group col-sm-6 col-lg-auto">
<label class="control-label" for="txt_menus_name">菜单名称</label>
<input type="text" class="form-control" id="txt_menus_name" />
</div>
<div class="form-group col-sm-12 col-md-5">
<div class="form-group col-sm-6 col-lg-auto">
<label class="control-label" for="txt_parent_menus_name">父级菜单</label>
<input type="text" class="form-control" id="txt_parent_menus_name" />
</div>
<div class="form-group col-6 col-md-5">
<div class="form-group form-group-dropdown col-sm-6 col-lg-auto">
<label class="control-label" for="sel_menus_category">菜单类别</label>
<div class="dropdown">
<button id="sel_menus_category" class="btn btn-success dropdown-select dropdown-toggle" data-toggle="dropdown">全部</button>
@ -34,8 +44,8 @@
</div>
</div>
</div>
<div class="form-group col-6 col-md-5">
<label class="control-label" for="sel_menus_category">菜单类型</label>
<div class="form-group form-group-dropdown col-sm-6 col-lg-auto">
<label class="control-label" for="sel_menus_res">菜单类型</label>
<div class="dropdown">
<button id="sel_menus_res" class="btn btn-success dropdown-select dropdown-toggle" data-toggle="dropdown">全部</button>
<div class="dropdown-menu">
@ -46,7 +56,7 @@
</div>
</div>
</div>
<div class="form-group col-md-2">
<div class="form-group col-lg-auto flex-lg-fill justify-content-lg-end">
<button type="button" id="btn_query" class="btn btn-primary btn-fill"><i class="fa fa-search" aria-hidden="true"></i><span>查询</span></button>
</div>
</div>
@ -75,7 +85,7 @@
<form class="form-inline" id="dataForm">
<div class="form-row">
<div class="form-group col-sm-6">
<input type="text" class="form-control d-none" id="menuID" name="menuID" data-default-val="0" />
<input type="hidden" id="menuID" />
<label class="control-label" for="name">菜单名称</label>
<div class="input-group">
<input type="text" class="form-control" id="name" name="name" placeholder="不可为空50字以内" maxlength="50" data-valid="true" />
@ -118,9 +128,9 @@
</div>
<div class="form-group col-12">
<label class="control-label" for="url">路径</label>
<input type="text" class="form-control form-control-url" id="url" placeholder="不可为空4000字以内" maxlength="4000" data-valid="true" />
<input type="text" class="form-control flex-sm-fill" id="url" placeholder="不可为空4000字以内" maxlength="4000" data-valid="true" />
</div>
<div class="form-group col-6">
<div class="form-group form-group-dropdown col-sm-6">
<label class="control-label" for="category">菜单类别</label>
<div class="dropup">
<button id="category" class="btn btn-success dropdown-select dropdown-toggle" data-toggle="dropdown" data-default-val="1">外部菜单</button>
@ -130,7 +140,7 @@
</div>
</div>
</div>
<div class="form-group col-6">
<div class="form-group form-group-dropdown col-sm-6">
<label class="control-label" for="target">目标</label>
<div class="dropup">
<button id="target" class="btn btn-info dropdown-select dropdown-toggle" data-toggle="dropdown" data-default-val="_self">本窗口</button>
@ -142,7 +152,7 @@
</div>
</div>
</div>
<div class="form-group col-6">
<div class="form-group form-group-dropdown col-sm-6">
<label class="control-label" for="isRes">菜单类型</label>
<div class="dropup">
<button id="isRes" class="btn btn-success dropdown-select dropdown-toggle" data-toggle="dropdown" data-default-val="0">菜单</button>
@ -152,7 +162,7 @@
</div>
</div>
</div>
<div class="form-group col-6">
<div class="form-group form-group-dropdown col-sm-6">
<label class="control-label" for="app">所属应用</label>
<div class="dropup">
<button id="app" class="btn btn-info dropdown-select dropdown-toggle" data-toggle="dropdown" data-default-val="0">未设置</button>
@ -191,4 +201,4 @@
</div>
</div>
@await Html.PartialAsync("NavigatorConfig")
}
}

View File

@ -1,10 +1,9 @@
@model Bootstrap.Admin.Models.NavigatorBarModel
@model NavigatorBarModel
@{
ViewBag.Title = "站内消息";
Layout = "~/Views/Shared/_Admin.cshtml";
}
@section Javascript {
<script src="~/js/message.js"></script>
@section javascript {
<script src="~/js/message.js" asp-append-version="true"></script>
}
<div class="mail-box">
<div class="sm-side">

View File

@ -1,8 +1,25 @@
@model Bootstrap.Admin.Models.ModelBase
NavigatorBarModel
@model ModelBase
@{
ViewBag.Title = "客户端测试";
Layout = "~/Views/Shared/_Admin.cshtml";
}
@section javascript {
<script>
window.onload = function () {
var browser = $.browser;
$('#language').text(browser.language);
$('#mobile').text(browser.versions.mobile);
$('#webapp').text(browser.versions.webApp);
$('#webkit').text(browser.versions.webKit);
$('#ios').text(browser.versions.ios);
$('#android').text(browser.versions.android);
$('#iphone').text(browser.versions.iPhone);
$('#ipad').text(browser.versions.iPad);
$('#useragent').text(navigator.userAgent);
$('#versions').text(JSON.stringify(browser.versions));
$.footer();
};
</script>
}
@section css {
<style type="text/css">
@ -15,4 +32,42 @@ NavigatorBarModel
}
</style>
}
@await Html.PartialAsync("_Mobile")
<div class="form-group">
<label class="control-label">语言版本:</label>
<label id="language" class="form-control-static"></label>
</div>
<div class="form-group">
<label class="control-label">是否为移动终端:</label>
<label id="mobile" class="form-control-static"></label>
</div>
<div class="form-group">
<label class="control-label">webApp</label>
<label id="webapp" class="form-control-static"></label>
</div>
<div class="form-group">
<label class="control-label">webKit</label>
<label id="webkit" class="form-control-static"></label>
</div>
<div class="form-group">
<label class="control-label">ios终端</label>
<label id="ios" class="form-control-static"></label>
</div>
<div class="form-group">
<label class="control-label">android终端</label>
<label id="android" class="form-control-static"></label>
</div>
<div class="form-group">
<label class="control-label">是否为iPhone</label>
<label id="iphone" class="form-control-static"></label>
</div>
<div class="form-group">
<label class="control-label">是否iPad</label>
<label id="ipad" class="form-control-static"></label>
</div><div class="form-group">
<label class="control-label">userAgent</label>
<label id="useragent" class="form-control-static"></label>
</div>
<div class="form-group">
<label class="control-label">versions</label>
<label id="versions" class="form-control-static"></label>
</div>

View File

@ -1,30 +1,29 @@
@model NavigatorBarModel
@{
ViewBag.Title = "通知管理";
Layout = "~/Views/Shared/_Admin.cshtml";
}
@section css {
<environment include="Development">
<link href="~/css/bootstrap-table.css" rel="stylesheet" />
<link href="~/lib/bootstrap-table/bootstrap-table.css" rel="stylesheet" />
</environment>
<environment exclude="Development">
<link href="~/css/bootstrap-table.min.css" rel="stylesheet" />
<link href="~/lib/bootstrap-table/bootstrap-table.min.css" rel="stylesheet" />
</environment>
}
@section Javascript {
@section javascript {
<environment include="Development">
<script src="~/js/bootstrap-table.js"></script>
<script src="~/js/bootstrap-table-zh-CN.js"></script>
<script src="~/lib/bootstrap-table/bootstrap-table.js"></script>
<script src="~/lib/bootstrap-table/locale/bootstrap-table-zh-CN.js"></script>
</environment>
<environment exclude="Development">
<script src="~/js/bootstrap-table.min.js"></script>
<script src="~/js/bootstrap-table-zh-CN.min.js"></script>
<script src="~/lib/bootstrap-table/bootstrap-table.min.js"></script>
<script src="~/lib/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
</environment>
<script src="~/js/noti.js"></script>
<script src="~/js/noti.js" asp-append-version="true"></script>
}
<div class="card">
<div class="card-header">用户注册<span class="pull-right"><a id="refreshUsers" href="javascript:;" class="fa fa-refresh" title="点击刷新" data-toggle="tooltip" data-placement="left"></a></span></div>
<div class="card-body" style="padding-top: 25px;">
<table></table>
</div>
</div>
</div>

View File

@ -1,44 +1,45 @@
@model Bootstrap.Admin.Models.ProfilesModel
@model ProfilesModel
@{
ViewBag.Title = "个人中心";
Layout = "~/Views/Shared/_Admin.cshtml";
}
@section Javascript {
<environment include="Development">
<script src="~/js/fileinput.js"></script>
<script src="~/js/jquery.validate.js"></script>
<script src="~/js/messages_zh.js"></script>
</environment>
<environment exclude="Development">
<script src="~/js/fileinput.min.js"></script>
<script src="~/js/jquery.validate.min.js"></script>
<script src="~/js/messages_zh.min.js"></script>
</environment>
<script src="~/js/fileinput.zh.js"></script>
<script src="~/js/longbow.dataentity.js"></script>
<script src="~/js/longbow.validate.js"></script>
<script src="~/js/profiles.js"></script>
<script src="~/js/theme.js"></script>
}
@section css {
<environment include="Development">
<link href="~/css/fileinput.css" rel="stylesheet" />
<link href="~/lib/bootstrap-fileinput/css/fileinput.css" rel="stylesheet" />
</environment>
<environment exclude="Development">
<link href="~/css/fileinput.min.css" rel="stylesheet" />
<link href="~/lib/bootstrap-fileinput/css/fileinput.min.css" rel="stylesheet" />
</environment>
<link href="~/css/tasks.css" rel="stylesheet" />
<link href="~/css/tasks.css" rel="stylesheet" asp-append-version="true" />
}
@section javascript {
<environment include="Development">
<script src="~/lib/bootstrap-fileinput/js/fileinput.js"></script>
<script src="~/lib/bootstrap-fileinput/js/locales/zh.js"></script>
<script src="~/lib/bootstrap-fileinput/themes/fa/theme.js"></script>
<script src="~/lib/validate/jquery.validate.js"></script>
<script src="~/lib/validate/localization/messages_zh.js"></script>
</environment>
<environment exclude="Development">
<script src="~/lib/bootstrap-fileinput/js/fileinput.min.js"></script>
<script src="~/lib/bootstrap-fileinput/js/locales/zh.min.js"></script>
<script src="~/lib/bootstrap-fileinput/themes/fa/theme.min.js"></script>
<script src="~/lib/validate/jquery.validate.min.js"></script>
<script src="~/lib/validate/localization/messages_zh.min.js"></script>
</environment>
<script src="~/lib/longbow/longbow.dataentity.js" asp-append-version="true"></script>
<script src="~/lib/longbow/longbow.validate.js" asp-append-version="true"></script>
<script src="~/js/profiles.js" asp-append-version="true"></script>
}
<div class="card">
<div class="card-header">基本资料</div>
<div class="card-body" data-toggle="LgbValidate" data-valid-button="#btnSaveDisplayName">
<form class="form-inline">
<div class="form-row">
<div class="form-group col-sm-6">
<div class="row">
<div class="form-group col-sm-6 col-md-auto">
<label class="control-label" for="userName">登陆名称</label>
<input type="text" class="form-control ignore" id="userName" name="userName" value="@Model.UserName" readonly />
</div>
<div class="form-group col-sm-6">
<div class="form-group col-sm-6 col-md-auto">
<label class="control-label" for="DisplayName">显示名称</label>
<input type="text" class="form-control" id="displayName" name="displayName" value="@Model.DisplayName" placeholder="不可为空50字以内" maxlength="50" data-valid="true" />
</div>
@ -53,18 +54,18 @@
<div class="card-header">修改密码</div>
<div class="card-body" data-toggle="LgbValidate" data-valid-button="#btnSavePassword">
<form class="form-inline">
<div class="form-row">
<div class="form-group col">
<div class="row">
<div class="form-group col-sm-6 col-md-auto">
<label class="control-label" for="currentPassword">原密码: </label>
<input type="password" class="form-control" id="currentPassword" placeholder="原密码50字以内" maxlength="50" data-valid="true" />
</div>
</div>
<div class="form-row">
<div class="form-group col-sm-6">
<div class="row">
<div class="form-group col-sm-6 col-md-auto">
<label class="control-label" for="newPassword">新密码: </label>
<input type="password" class="form-control" id="newPassword" placeholder="新密码50字以内" maxlength="50" data-valid="true" />
</div>
<div class="form-group col-sm-6">
<div class="form-group col-sm-6 col-md-auto">
<label class="control-label" for="confirmPassword">确认密码: </label>
<input type="password" class="form-control" id="confirmPassword" placeholder="与新密码一致50字以内" maxlength="50" equalTo="#newPassword" data-valid="true" />
</div>
@ -85,14 +86,7 @@
<a href="#" data-val="">默认样式</a>
@foreach (var css in Model.Themes)
{
if (css.Code == Model.Css)
{
<a href="#" data-val="@css.Code">@css.Name</a>
}
else
{
<a href="#" data-val="@css.Code">@css.Name</a>
}
<a href="#" data-val="@css.Code">@css.Name</a>
}
</div>
</div>
@ -107,9 +101,9 @@
<div class="card-body">
<form enctype="multipart/form-data" class="d-none" data-admin="@User.IsInRole("Administrators")">
<div class="form-group">
<input id="fileIcon" class="file" type="file" data-init="@Model.Size">
<input id="fileIcon" type="file" data-init="@Model.Size" data-file="@Model.FileName">
</div>
</form>
<img class="card-img d-none" src="@Url.Content(Model.Icon)" />
</div>
</div>
</div>

View File

@ -1,30 +1,39 @@
@model Bootstrap.Admin.Models.NavigatorBarModel
@model NavigatorBarModel
@{
ViewBag.Title = "角色管理";
Layout = "~/Views/Shared/_Default.cshtml";
Layout = "_Default";
}
@section css {
<link href="~/css/fa.css" rel="stylesheet" />
<link href="~/css/jquery.nestable.css" rel="stylesheet" />
<environment include="Development">
<link href="~/lib/nestable2/jquery.nestable.css" rel="stylesheet" />
</environment>
<environment exclude="Development">
<link href="~/lib/nestable2/jquery.nestable.min.css" rel="stylesheet" />
</environment>
<link href="~/css/fa.css" rel="stylesheet" asp-append-version="true" />
}
@section Javascript {
<script src="~/js/jquery.nestable.js"></script>
<script src="~/js/roles.js"></script>
@section javascript {
<environment include="Development">
<script src="~/lib/nestable2/jquery.nestable.js"></script>
</environment>
<environment exclude="Development">
<script src="~/lib/nestable2/jquery.nestable.min.js"></script>
</environment>
<script src="~/js/roles.js" asp-append-version="true"></script>
}
@section query {
<form class="form-inline">
<div class="form-row">
<div class="form-group col-sm-6 col-md-5">
<div class="row">
<div class="form-group col-sm-5 col-md-auto">
<label class="control-label" for="txt_search_name">角色名称</label>
<input type="text" class="form-control" id="txt_search_name" />
</div>
<div class="form-group col-sm-6 col-md-5">
<div class="form-group col-sm-5 col-md-auto">
<label class="control-label" for="txt_role_desc">角色描述</label>
<input type="text" class="form-control" id="txt_role_desc" />
</div>
<div class="form-group col-sm-12 col-md-2">
<button type="button" id="btn_query" class="btn btn-primary btn-fill"><i class="fa fa-search" aria-hidden="true"></i><span>查询</span></button>
<div class="form-group col-sm-2 col-md-auto flex-md-fill justify-content-md-end">
<button type="button" id="btn_query" class="btn btn-primary btn-fill align-self-sm-end align-self-md-auto"><i class="fa fa-search" aria-hidden="true"></i><span>查询</span></button>
</div>
</div>
</form>
@ -56,13 +65,13 @@
</div>
<div class="modal-body">
<form class="form-inline">
<div class="form-row">
<div class="row">
<div class="form-group col-sm-6">
<label class="control-label" for="roleName">角色名称</label>
<input type="text" class="form-control" id="roleName" placeholder="不可为空50字以内" maxlength="50" data-valid="true" />
</div>
<div class="form-group col-sm-6">
<input type="text" class="form-control d-none" id="roleID" data-default-val="0" />
<input type="hidden" id="roleID" />
<label class="control-label" for="roleDesc">角色描述</label>
<input type="text" class="form-control" id="roleDesc" placeholder="描述信息(可为空)50字以内" maxlength="50" />
</div>
@ -74,4 +83,4 @@
@await Html.PartialAsync("UserConfig")
@await Html.PartialAsync("GroupConfig")
@await Html.PartialAsync("NavigatorConfig")
}
}

View File

@ -1,20 +1,19 @@
@model Bootstrap.Admin.Models.ThemeModel
@model ThemeModel
@{
ViewBag.Title = "网站设置";
Layout = "~/Views/Shared/_Admin.cshtml";
}
@section Javascript {
@section javascript {
<environment include="Development">
<script src="~/js/jquery.validate.js"></script>
<script src="~/js/messages_zh.js"></script>
<script src="~/lib/validate/jquery.validate.js"></script>
<script src="~/lib/validate/localization/messages_zh.js"></script>
</environment>
<environment exclude="Development">
<script src="~/js/jquery.validate.min.js"></script>
<script src="~/js/messages_zh.min.js"></script>
<script src="~/lib/validate/jquery.validate.min.js"></script>
<script src="~/lib/validate/localization/messages_zh.min.js"></script>
</environment>
<script src="~/js/longbow.dataentity.js"></script>
<script src="~/js/longbow.validate.js"></script>
<script src="~/js/settings.js"></script>
<script src="~/lib/longbow/longbow.dataentity.js"></script>
<script src="~/lib/longbow/longbow.validate.js"></script>
<script src="~/js/settings.js" asp-append-version="true"></script>
}
<div class="card">
<div class="card-header">系统名称设置</div>
@ -53,14 +52,7 @@
<a href="#" data-val="">默认样式</a>
@foreach (var css in Model.Themes)
{
if (css.Code == Model.Css)
{
<a href="#" data-val="@css.Code">@css.Name</a>
}
else
{
<a href="#" data-val="@css.Code">@css.Name</a>
}
<a href="#" data-val="@css.Code">@css.Name</a>
}
</div>
</div>

View File

@ -1,20 +1,18 @@
@model Bootstrap.Admin.Models.NavigatorBarModel
@model NavigatorBarModel
@{
ViewBag.Title = "任务管理";
Layout = "~/Views/Shared/_Admin.cshtml";
}
@section Javascript {
<script src="~/js/tasks.js"></script>
}
@section css {
<link href="~/css/tasks.css" rel="stylesheet" />
<link href="~/css/tasks.css" rel="stylesheet" asp-append-version="true" />
}
@section javascript {
<script src="~/js/tasks.js" asp-append-version="true"></script>
}
<div class="card">
<div class="card-header">任务消息<span class="pull-right"><a id="refreshTask" href="javascript:;" class="fa fa-refresh"></a></span></div>
<div class="card-body">
<div class="tasks-widget">
<ul id="list-task" class="task-list ui-sortable">
</ul>
<ul id="list-task" class="task-list ui-sortable"></ul>
</div>
</div>
</div>
</div>

View File

@ -1,24 +1,24 @@
@model Bootstrap.Admin.Models.NavigatorBarModel
@model NavigatorBarModel
@{
ViewBag.Title = "用户管理";
Layout = "~/Views/Shared/_Default.cshtml";
Layout = "_Default";
}
@section Javascript {
<script src="~/js/users.js"></script>
@section javascript {
<script src="~/js/users.js" asp-append-version="true"></script>
}
@section query {
<form class="form-inline">
<div class="form-row">
<div class="form-group col-sm-6 col-md-5">
<div class="row">
<div class="form-group col-sm-5 col-md-auto">
<label class="control-label" for="txt_search_name">登陆名称</label>
<input type="text" class="form-control" id="txt_search_name" />
</div>
<div class="form-group col-sm-6 col-md-5">
<div class="form-group col-sm-5 col-md-auto">
<label class="control-label" for="txt_display_name">显示名称</label>
<input type="text" class="form-control" id="txt_display_name" />
</div>
<div class="form-group col-sm-12 col-md-2">
<button type="button" id="btn_query" class="btn btn-primary btn-fill"><i class="fa fa-search" aria-hidden="true"></i><span>查询</span></button>
<div class="form-group col-sm-2 col-md-auto flex-md-fill justify-content-md-end">
<button type="button" id="btn_query" class="btn btn-primary btn-fill align-self-sm-end align-self-md-auto"><i class="fa fa-search" aria-hidden="true"></i><span>查询</span></button>
</div>
</div>
</form>
@ -46,11 +46,11 @@
</div>
<div class="modal-body">
<form class="form-inline">
<input type="text" class="form-control" hidden id="userID" data-default-val="0" />
<div class="form-row">
<input type="hidden" id="userID" />
<div class="row">
<div class="form-group col-sm-6">
<label class="control-label" for="userName">登陆名称</label>
<input type="text" class="form-control" id="userName" placeholder="不可为空50字以内" minlength="4" maxlength="50" remote="api/New/" data-remote-msg="此用户已存在" data-valid="true" />
<input type="text" class="form-control" id="userName" placeholder="不可为空50字以内" minlength="4" maxlength="50" remote="api/Register" data-remote-msg="此用户已存在" data-valid="true" />
</div>
<div class="form-group col-sm-6">
<label class="control-label" for="displayName">显示名称</label>
@ -71,4 +71,4 @@
@section customModal {
@await Html.PartialAsync("RoleConfig")
@await Html.PartialAsync("GroupConfig")
}
}

View File

@ -1,4 +1,4 @@
<a id="tb_add" href="#" title="新增"><i class="fa fa-plus"></i></a>
<a id="tb_delete" href="#" title="删除"><i class="fa fa-remove"></i></a>
<a id="tb_edit" href="#" title="编辑"><i class="fa fa-pencil"></i></a>
<a id="tb_add" href="#" title="新增"><i class="fa fa-plus"></i></a>
<a id="tb_delete" href="#" title="删除"><i class="fa fa-remove"></i></a>
<a id="tb_edit" href="#" title="编辑"><i class="fa fa-pencil"></i></a>

View File

@ -1,17 +1,18 @@
@{
ViewBag.Title = "服务器内部错误";
Layout = "~/Views/Shared/_Root.cshtml";
@model ErrorModel
@{
ViewBag.Title = Model.Title;
Layout = "_Layout";
}
@section css {
<link href="~/css/error.css" rel="stylesheet" />
}
@section Javascript {
@section javascript {
<script src="~/js/error.js"></script>
}
<section class="error-wrapper">
<img src="~/images/error_icon.png" />
<h1>服务器内部错误</h1>
<img src="~/images/@Model.Image" />
<h1>@Model.Content</h1>
<h3>相关错误信息已经记录到日志中,请登录服务器查看</h3>
<br />
<a href="~/Home/Index" target="_top">返回首页</a>
</section>
<a href="@Model.ReturnUrl" target="_top">返回首页</a>
</section>

View File

@ -1,17 +1,18 @@
@model Bootstrap.Admin.Models.HeaderBarModel
@{
@{
ViewBag.Title = "首页";
Layout = "~/Views/Shared/_Normal.cshtml";
Layout = "_Bootstrap";
}
@section css {
<style>
.site-footer {
<style type="text/css">
.content-body {
position: fixed;
left: 0;
bottom: 40px;
right: 0;
top: 96px;
overflow: hidden;
}
</style>
}
@section javascript {
<script src="~/js/content.js"></script>
}
<div id="content" class="content-body welcome-bg">
<div class="content-body welcome-bg">
</div>

View File

@ -1,17 +0,0 @@
@{
ViewBag.Title = "资源未找到";
Layout = "~/Views/Shared/_Root.cshtml";
}
@section css {
<link href="~/css/error.css" rel="stylesheet" />
}
@section Javascript {
<script src="~/js/error.js"></script>
}
<section class="error-wrapper">
<img src="~/images/404_icon.png" />
<h1>请求资源未找到</h1>
<h3>相关错误信息已经记录到日志中,请登录服务器查看</h3>
<br />
<a href="~/Home/Index" target="_top">返回首页</a>
</section>

View File

@ -1,7 +1,7 @@
@model ModelBase
<footer class="site-footer">
<footer class="position-fixed">
<span id="websiteFooter">@Model.Footer</span>
<a id="gotoTop" href="#" class="go-top" title="返回顶部" data-toggle="tooltip" data-placement="left">
<i class="fa fa-angle-up"></i>
</a>
</footer>
</footer>

View File

@ -15,7 +15,7 @@
<i class="fa fa-times"></i>
<span>关闭</span>
</button>
<button type="button" class="btn btn-primary" id="btnSubmitUser">
<button type="button" class="btn btn-primary" id="btnSubmitGroup">
<i class="fa fa-save"></i>
<span>保存</span>
</button>

View File

@ -88,8 +88,8 @@
</div>
<div class="dropdown userinfo">
<a data-toggle="dropdown" class="dropdown-toggle shadow-default" href="#">
<img id="headerIcon" alt="" src="@Url.Content(Model.Icon)">
<span id="userDisplayName" data-userName="@Model.UserName" class="username">@Model.DisplayName</span>
<img id="headerIcon" alt="" src="@Url.Content(Model.Icon)" asp-append-version="true">
<span id="userDisplayName" data-userName="@Model.UserName" class="username text-truncate d-inline-block">@Model.DisplayName</span>
</a>
<div class="dropdown-menu dropdown-menu-right">
<div class="dropdown-item">
@ -105,8 +105,8 @@
</div>
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="@Url.Content(Model.HomeUrl)"><i class="fa fa-home"></i>首页</a></li>
<li class="breadcrumb-item"><a href="@Url.Content("~/Admin/Index")"><i class="fa fa-home"></i>首页</a></li>
<li class="breadcrumb-item d-none" id="breadNav"></li>
</ol>
</nav>
</header>
</header>

View File

@ -1,13 +1,11 @@
@model Bootstrap.Admin.Models.NavigatorBarModel
@model NavigatorBarModel
<aside>
<div id="sidebar" class="nav-collapse sidebar">
<!-- sidebar menu start-->
<ul class="sidebar-menu" id="nav-accordion">
@foreach (var menu in Model.Navigations)
{
@await Html.PartialAsync("SubMenu", menu)
}
</ul>
<!-- sidebar menu end-->
</div>
<!-- sidebar menu start-->
<ul class="sidebar nav nav-pills flex-column flex-nowrap">
@foreach (var menu in Model.Navigations)
{
@await Html.PartialAsync("SubNavItem", menu)
}
</ul>
<!-- sidebar menu end-->
</aside>

View File

@ -1,11 +0,0 @@
_Layout.cshtml
/Home/Login
-------> _Admin.cshtml
/Admin/Index
--------------> _Default.cshtml
/Admin/Users
-------> _Normal.cshtml

View File

@ -1,8 +0,0 @@
@model Bootstrap.Security.BootstrapMenu
<li class="sub-menu">
<a href="@Url.Content(Model.Url)" class="@Model.Active" target="@Model.Target"><i class="@Model.Icon"></i>@Model.Name</a>
@if (Model.Menus.Count() > 0)
{
@await Html.PartialAsync("SubNavigation", Model.Menus)
}
</li>

View File

@ -0,0 +1,8 @@
@model Bootstrap.Security.BootstrapMenu
<li class="nav-item @Model.Active">
<a href="@Url.Content(Model.Url)" class="nav-link @Model.Active" target="@Model.Target"><i class="@Model.Icon"></i>@Model.Name</a>
@if (Model.Menus.Any())
{
@await Html.PartialAsync("SubNavigation", Model.Menus)
}
</li>

View File

@ -1,7 +1,7 @@
@model IEnumerable<Bootstrap.Security.BootstrapMenu>
<ul class="sub" style="display: none;">
<ul class="sub nav nav-pills flex-column flex-nowrap" style="display: none;">
@foreach (var menu in Model)
{
@await Html.PartialAsync("SubMenu", menu)
@await Html.PartialAsync("SubNavItem", menu)
}
</ul>

View File

@ -1,43 +0,0 @@
@{
ViewBag.Title = "无权访问页面";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@section css {
<style>
body {
background: #8075c6;
color: #fff;
}
.error-wrapper {
text-align: center;
margin-top: 10%;
}
.error-wrapper .icon-500 {
background: url(/images/error_icon.png) no-repeat;
width: 289px;
height: 274px;
display: inline-block;
margin-left: 55px;
}
.error-wrapper p {
padding-top: 15px;
}
a, a:hover, a:focus {
text-decoration: none;
outline: none;
font-size: 14px;
font-weight: 300;
color: #ffffff;
}
</style>
}
<section class="error-wrapper">
<i class="icon-500"></i>
<h1>访问网页被拒绝</h1>
<h2>您无权访问本页面,请联系网站管理员授权后在查看</h2>
<p class="page-500"><a href="~/Home/Logout" target="_top">返回登陆页</a></p>
</section>

View File

@ -22,4 +22,4 @@
</div>
</div>
</div>
</div>
</div>

View File

@ -1,34 +1,41 @@
@{
Layout = "~/Views/Shared/_Layout.cshtml";
Layout = "_Bootstrap";
}
@section css {
<link href="~/css/sweetalert.css" rel="stylesheet" />
<environment include="Development">
<link href="~/css/toastr.css" rel="stylesheet" />
<link href="~/lib/toastr.js/toastr.css" rel="stylesheet" />
<link href="~/lib/nprogress/nprogress.css" rel="stylesheet" />
<link href="~/lib/bootstrap-sweetalert/sweetalert.css" rel="stylesheet" />
<link href="~/lib/scrollbar/jquery.mCustomScrollbar.css" rel="stylesheet" />
</environment>
<environment exclude="Development">
<link href="~/css/toastr.min.css" rel="stylesheet" />
<link href="~/lib/toastr.js/toastr.min.css" rel="stylesheet" />
<link href="~/lib/nprogress/nprogress.min.css" rel="stylesheet" />
<link href="~/lib/bootstrap-sweetalert/sweetalert.min.css" rel="stylesheet" />
<link href="~/lib/scrollbar/jquery.mCustomScrollbar.min.css" rel="stylesheet" />
</environment>
@RenderSection("css", false)
<link href="~/css/admin.css" rel="stylesheet" />
<link href="~/css/admin-responsive.css" rel="stylesheet" />
}
@section javascript {
<environment include="Development">
<script src="~/js/sweetalert.js"></script>
<script src="~/js/jquery.scrollTo.js"></script>
<script src="~/lib/scrollbar/jquery.mCustomScrollbar.js"></script>
<script src="~/lib/signalr/dist/browser/signalr.js"></script>
<script src="~/lib/dcjqaccordion/js/jquery.dcjqaccordion.2.7.js"></script>
<script src="~/lib/bootstrap-sweetalert/sweetalert.js"></script>
<script src="~/lib/nprogress/nprogress.js"></script>
</environment>
<environment exclude="Development">
<script src="~/js/sweetalert.min.js"></script>
<script src="~/js/jquery.scrollTo.min.js"></script>
<script src="~/lib/scrollbar/jquery.mCustomScrollbar.concat.min.js"></script>
<script src="~/lib/signalr/dist/browser/signalr.min.js"></script>
<script src="~/lib/dcjqaccordion/js/jquery.dcjqaccordion.2.7.min.js"></script>
<script src="~/lib/bootstrap-sweetalert/sweetalert.min.js"></script>
<script src="~/lib/nprogress/nprogress.min.js"></script>
</environment>
<script src="~/js/jquery.dcjqaccordion.2.7.js"></script>
<script src="~/js/jquery.nicescroll.min.js"></script>
<script src="~/js/common-scripts.js"></script>
<script src="~/js/log.js"></script>
<script src="~/js/toastr.min.js"></script>
<script src="~/js/framework.js"></script>
@RenderSection("Javascript", false)
<script src="~/lib/toastr.js/toastr.min.js"></script>
<script src="~/lib/dcjqaccordion/js/jquery.cookie.js"></script>
<script src="~/js/common-scripts.js" asp-append-version="true"></script>
<script src="~/js/log.js" asp-append-version="true"></script>
@RenderSection("javascript", false)
}
@await Html.PartialAsync("navigator")
<section id="main-content" class="main-content">

View File

@ -0,0 +1,37 @@
@model ModelBase
@{
Layout = "_Layout";
}
@section css {
<environment include="Development">
<link href="~/lib/twitter-bootstrap/css/bootstrap.css" rel="stylesheet" />
<link href="~/lib/font-awesome/css/font-awesome.css" rel="stylesheet" />
</environment>
<environment exclude="Development">
<link href="~/lib/twitter-bootstrap/css/bootstrap.min.css" rel="stylesheet" />
<link href="~/lib/font-awesome/css/font-awesome.min.css" rel="stylesheet" />
</environment>
@RenderSection("css", false)
<link href="~/css/theme.css" rel="stylesheet" asp-append-version="true" />
<link href="~/css/theme-responsive.css" rel="stylesheet" asp-append-version="true" />
<link href="~/css/site.css" rel="stylesheet" asp-append-version="true" />
<link href="~/css/site-responsive.css" rel="stylesheet" asp-append-version="true" />
@if (!string.IsNullOrEmpty(Model.Theme))
{
<link href="~/css/@Model.Theme" rel="stylesheet" asp-append-version="true" />
}
}
@section javascript {
<environment include="Development">
<script src="~/lib/twitter-bootstrap/js/bootstrap.bundle.js"></script>
</environment>
<environment exclude="Development">
<script src="~/lib/twitter-bootstrap/js/bootstrap.bundle.min.js"></script>
</environment>
<script src="~/lib/longbow/longbow.common.js" asp-append-version="true"></script>
@RenderSection("javascript", false)
}
@await Html.PartialAsync("Header")
@RenderBody()
@await Html.PartialAsync("Footer")
@RenderSection("modal", false)

View File

@ -1,31 +1,31 @@
@{
Layout = "~/Views/Shared/_Admin.cshtml";
Layout = "_Admin";
}
@section css {
<environment include="Development">
<link href="~/css/bootstrap-table.css" rel="stylesheet" />
<link href="~/lib/bootstrap-table/bootstrap-table.css" rel="stylesheet" />
</environment>
<environment exclude="Development">
<link href="~/css/bootstrap-table.min.css" rel="stylesheet" />
<link href="~/lib/bootstrap-table/bootstrap-table.min.css" rel="stylesheet" />
</environment>
@RenderSection("css", false)
}
@section javascript {
<environment include="Development">
<script src="~/js/bootstrap-table.js"></script>
<script src="~/js/bootstrap-table-zh-CN.js"></script>
<script src="~/js/jquery.validate.js"></script>
<script src="~/js/messages_zh.js"></script>
<script src="~/lib/bootstrap-table/bootstrap-table.js"></script>
<script src="~/lib/bootstrap-table/locale/bootstrap-table-zh-CN.js"></script>
<script src="~/lib/validate/jquery.validate.js"></script>
<script src="~/lib/validate/localization/messages_zh.js"></script>
</environment>
<environment exclude="Development">
<script src="~/js/bootstrap-table.min.js"></script>
<script src="~/js/bootstrap-table-zh-CN.min.js"></script>
<script src="~/js/jquery.validate.min.js"></script>
<script src="~/js/messages_zh.min.js"></script>
<script src="~/lib/bootstrap-table/bootstrap-table.min.js"></script>
<script src="~/lib/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
<script src="~/lib/validate/jquery.validate.min.js"></script>
<script src="~/lib/validate/localization/messages_zh.min.js"></script>
</environment>
<script src="~/js/longbow.dataentity.js"></script>
<script src="~/js/longbow.validate.js"></script>
@RenderSection("Javascript", false)
<script src="~/lib/longbow/longbow.dataentity.js" asp-append-version="true"></script>
<script src="~/lib/longbow/longbow.validate.js" asp-append-version="true"></script>
@RenderSection("javascript", false)
}
@section modal {
<div class="modal fade" id="dialogNew" tabindex="-1" role="dialog" data-backdrop="static" aria-labelledby="myModalLabel" aria-hidden="true">
@ -59,8 +59,8 @@
<button id="btn_edit" type="button" class="btn btn-primary"><i class="fa fa-pencil" aria-hidden="true"></i><span>编辑</span></button>
@RenderSection("toolbar", false)
</div>
<div id="panelResult" class="card">
<div id="panelResultHeader" class="card-header">
<div class="card">
<div class="card-header">
查询结果
</div>
<div class="card-body">

View File

@ -1,39 +1,31 @@
@model ModelBase
@{
Layout = "~/Views/Shared/_Root.cshtml";
}
@section css {
<environment include="Development">
<link href="~/css/bootstrap.css" rel="stylesheet">
<link href="~/css/font-awesome.css" rel="stylesheet" />
</environment>
<environment exclude="Development">
<link href="~/css/bootstrap.min.css" rel="stylesheet">
<link href="~/css/font-awesome.min.css" rel="stylesheet" />
</environment>
<link href="~/css/nprogress.css" rel="stylesheet" />
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>@ViewBag.Title</title>
@RenderSection("css", false)
<link href="~/css/theme.css" rel="stylesheet" />
<link href="~/css/theme-responsive.css" rel="stylesheet" />
<link href="~/css/site.css" rel="stylesheet" />
<link href="~/css/site-responsive.css" rel="stylesheet" />
@if (!string.IsNullOrEmpty(Model.Theme))
{
<link href="~/css/@Model.Theme" rel="stylesheet" />
}
}
@section javascript {
<!--[if lt IE 10 ]>
<link href="../css/IE8.css" rel="stylesheet" />
<![endif]-->
</head>
<body>
<!--[if lt IE 10 ]>
<div id="ieAlert" class="alert alert-danger alert-dismissible">
<div>当前浏览器版本太低不支持本系统请升级到至少IE10 <a href="../browser/IE10.exe" target="_blank">本地下载</a> <a href="https://support.microsoft.com/zh-cn/help/17621/internet-explorer-downloads" target="_blank">微软下载</a>或者使用Chrome浏览器 <a href="../browser/ChromeSetup.exe" target="_blank">本地下载</a></div>
<button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">关闭</span></button>
</div>
<![endif]-->
@RenderBody()
<a id="pathBase" href="~/" hidden></a>
<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<environment include="Development">
<script src="~/js/bootstrap.bundle.js"></script>
<script src="~/lib/jquery/jquery.js"></script>
</environment>
<environment exclude="Development">
<script src="~/js/bootstrap.bundle.min.js"></script>
<script src="~/lib/jquery/jquery.min.js"></script>
</environment>
<script src="~/js/nprogress.js"></script>
<script src="~/js/longbow.common.js"></script>
@RenderSection("Javascript", false)
}
@await Html.PartialAsync("Header")
@RenderBody()
@await Html.PartialAsync("Footer")
@RenderSection("modal", false)
@RenderSection("javascript", false)
</body>
</html>

View File

@ -1,110 +0,0 @@
@model ModelBase
@{
ViewBag.Title = Model.Title;
Layout = "~/Views/Shared/_Root.cshtml";
}
@section css {
<environment include="Development">
<link href="~/css/bootstrap.css" rel="stylesheet">
<link href="~/css/font-awesome.css" rel="stylesheet" />
</environment>
<environment exclude="Development">
<link href="~/css/bootstrap.min.css" rel="stylesheet">
<link href="~/css/font-awesome.min.css" rel="stylesheet" />
</environment>
<link href="~/css/sweetalert.css" rel="stylesheet" />
<link href="~/css/theme.css" rel="stylesheet" />
@RenderSection("css", false)
@if (!string.IsNullOrEmpty(Model.Theme))
{
<link href="~/css/@Model.Theme" rel="stylesheet" />
}
}
@section javascript {
<environment include="Development">
<script src="~/js/bootstrap.bundle.js"></script>
<script src="~/js/jquery.validate.js"></script>
<script src="~/js/messages_zh.js"></script>
<script src="~/js/sweetalert.js"></script>
</environment>
<environment exclude="Development">
<script src="~/js/bootstrap.bundle.min.js"></script>
<script src="~/js/jquery.validate.min.js"></script>
<script src="~/js/messages_zh.min.js"></script>
<script src="~/js/sweetalert.min.js"></script>
</environment>
<script src="~/js/longbow.common.js"></script>
<script src="~/js/longbow.validate.js"></script>
<script src="~/js/login.js"></script>
}
@await Html.PartialAsync("SignIn")
<div class="modal fade" id="dialogNew" tabindex="-1" role="dialog" data-backdrop="static" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg" role="document">
<div class="modal-content" data-toggle="LgbValidate" data-valid-button="#btnSubmit" data-valid-modal="#dialogNew">
<div class="modal-header">
<h5 class="modal-title" id="myModalLabel">新用户注册</h5>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body">
<div class="form-group">
<label for="userName">登陆账号:</label>
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
<span class="fa fa-user-plus"></span>
</div>
</div>
<input type="text" id="userName" autocomplete="off" class="form-control" placeholder="登陆账号不可为空" value="" maxlength="50" remote="api/New/" data-remote-msg="此用户已存在" data-valid="true" />
</div>
</div>
<div class="form-group">
<label for="displayName">显示名称:</label>
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
<span class="fa fa-user-circle-o"></span>
</div>
</div>
<input type="text" id="displayName" class="form-control" value="" placeholder="显示名称不可为空" maxlength="50" data-valid="true" />
</div>
</div>
<div class="form-group">
<label for="password">密码:</label>
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
<span class="fa fa-lock"></span>
</div>
</div>
<input type="password" id="password" class="form-control" value="" placeholder="密码不可为空" maxlength="50" data-valid="true" />
</div>
</div>
<div class="form-group">
<label for="assurePassword">确认密码:</label>
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
<span class="fa fa-lock"></span>
</div>
</div>
<input type="password" id="assurePassword" class="form-control" value="" placeholder="确认密码" maxlength="50" equalTo="#password" data-valid="true" />
</div>
</div>
<div class="form-group">
<label for="description">申请理由:</label>
<textarea id="description" class="form-control" placeholder="申请理由500字以内" rows="6" maxlength="500" data-valid="true"></textarea>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">
<i class="fa fa-times"></i>
<span>关闭</span>
</button>
<button type="button" class="btn btn-primary" id="btnSubmit">
<i class="fa fa-save"></i>
<span>提交</span>
</button>
</div>
</div>
</div>
</div>

View File

@ -1,54 +0,0 @@
<div class="form-group">
<label class="control-label">语言版本:</label>
<label id="language" class="form-control-static"></label>
</div>
<div class="form-group">
<label class="control-label">是否为移动终端:</label>
<label id="mobile" class="form-control-static"></label>
</div>
<div class="form-group">
<label class="control-label">webApp</label>
<label id="webapp" class="form-control-static"></label>
</div>
<div class="form-group">
<label class="control-label">webKit</label>
<label id="webkit" class="form-control-static"></label>
</div>
<div class="form-group">
<label class="control-label">ios终端</label>
<label id="ios" class="form-control-static"></label>
</div>
<div class="form-group">
<label class="control-label">android终端</label>
<label id="android" class="form-control-static"></label>
</div>
<div class="form-group">
<label class="control-label">是否为iPhone</label>
<label id="iphone" class="form-control-static"></label>
</div>
<div class="form-group">
<label class="control-label">是否iPad</label>
<label id="ipad" class="form-control-static"></label>
</div><div class="form-group">
<label class="control-label">userAgent</label>
<label id="useragent" class="form-control-static"></label>
</div>
<div class="form-group">
<label class="control-label">versions</label>
<label id="versions" class="form-control-static"></label>
</div>
<script>
window.onload = function () {
var browser = $.browser;
$('#language').text(browser.language);
$('#mobile').text(browser.versions.mobile);
$('#webapp').text(browser.versions.webApp);
$('#webkit').text(browser.versions.webKit);
$('#ios').text(browser.versions.ios);
$('#android').text(browser.versions.android);
$('#iphone').text(browser.versions.iPhone);
$('#ipad').text(browser.versions.iPad);
$('#useragent').text(navigator.userAgent);
$('#versions').text(JSON.stringify(browser.versions));
};
</script>

View File

@ -1,12 +0,0 @@
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
@section css {
@RenderSection("css", false)
}
@section javascript {
@RenderSection("Javascript", false)
}
<section id="main-content">
@RenderBody()
</section>

View File

@ -1,3 +1,3 @@
@{
Layout = "_Layout";
Layout = "_Admin";
}

View File

@ -11,16 +11,18 @@
"LogLevel": {
"Default": "Error"
},
"FileName": "Error\\Log.log"
"FileName": "Error\\Log.log",
"MaxFileCount": 1
}
},
"ConnectionStrings": {
"ba": "Data Source=.;Initial Catalog=BootstrapAdmin;User ID=sa;Password=sa"
},
"KeyPath": "keys",
"DisableAutomaticKeyGeneration": false,
"SwaggerPathBase": "",
"AllowOrigins": "http://localhost:49823",
"KeyPath": "..\\keys",
"DisableAutomaticKeyGeneration": false,
"KeepExceptionsPeriod": 1,
"KeepLogsPeriod": 1,
"LongbowCache": {
"Enabled": false,
"CorsItems": [
{
"Enabled": true,
@ -31,9 +33,9 @@
},
{
"Enabled": true,
"Name": "Pallet",
"Url": "http://localhost:49823/CacheList.axd",
"Desc": "托盘组垛系统",
"Name": "APP",
"Url": "http://localhost:49185/CacheList.axd",
"Desc": "测试系统",
"Self": false
}
]

View File

@ -15,11 +15,49 @@
"ConnectionStrings": {
"ba": "Data Source=.;Initial Catalog=BootstrapAdmin;User ID=sa;Password=sa"
},
"DB": [
{
"Enabled": true
},
{
"Enabled": true,
"Widget": "Bootstrap.DataAccess.MySQL",
"DBProviderFactory": "MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data",
"ConnectionStrings": {
"ba": "Server=10.211.55.2;Database=BA;Uid=argozhang;Pwd=argo@163.com;SslMode=none;"
}
},
{
"Enabled": true,
"Widget": "Bootstrap.DataAccess.SQLite",
"DBProviderFactory": "Microsoft.Data.Sqlite.SqliteFactory, Microsoft.Data.Sqlite",
"ConnectionStrings": {
"ba": "Data Source=BootstrapAdmin.db;"
}
},
{
"Enabled": true,
"Widget": "Bootstrap.DataAccess.MongoDB",
"ConnectionStrings": {
"ba": "mongodb://10.211.55.2:27017;Data Source=BootstrapAdmin"
}
}
],
"SwaggerPathBase": "/BA",
"AllowOrigins": "http://localhost,http://10.15.63.218",
"KeyPath": "D:\\App\\Web-App\\keys",
"ApplicationName": "__bd__",
"ApplicationDiscriminator": "BootstrapAdmin",
"KeyPath": "D:\\App\\Web-App\\keys",
"DisableAutomaticKeyGeneration": true,
"AllowOrigins": "http://localhost,http://10.15.63.218",
"DisableAutomaticKeyGeneration": false,
"TokenValidateOption": {
"Issuer": "BA",
"Audience": "api",
"Expires": 5,
"SecurityKey": "BootstrapAdmin-V1.1"
},
"KeepExceptionsPeriod": 12,
"KeepLogsPeriod": 12,
"CookieExpiresDays": 7,
"LongbowCache": {
"Enabled": true,
"CorsItems": [
@ -41,185 +79,192 @@
"CacheItems": [
{
"Enabled": true,
"Key": "BootstrapAdminAuthorizeFilter-RetrieveRolesByUrl",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "后台菜单获得所有可访问角色数据缓存"
},
{
"Enabled": true,
"Key": "BootstrapAdminGroupMiddleware-RetrieveGroups",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "后台管理所有组数据缓存"
},
{
"Enabled": true,
"Key": "BootstrapAdminGroupMiddleware-RetrieveGroupsByUserName",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "后台管理特定用户所属所有组数据缓存"
},
{
"Enabled": true,
"Key": "BootstrapAdminRoleMiddleware-RetrieveRoles",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "后台管理所有角色数据缓存"
},
{
"Enabled": true,
"Key": "BootstrapAdminRoleMiddleware-RetrieveRolesByUserName",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "后台管理特定用户所属所有角色数据缓存"
},
{
"Enabled": true,
"Key": "BootstrapDict-RetrieveDicts",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "后台管理所有字典数据缓存"
},
{
"Enabled": true,
"Key": "BootstrapMenu-RetrieveMenus",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "后台管理所有菜单数据缓存"
},
{
"Enabled": true,
"Key": "BootstrapUser-RetrieveUsers",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "后台管理所有用户数据缓存"
},
{
"Enabled": true,
"Key": "BootstrapUser-RetrieveUsersByName",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "后台管理通过登录名获得当前用户数据缓存"
},
{
"Enabled": true,
"Key": "UserHelper-RetrieveNewUsers",
"Interval": 30,
"SlidingExpiration": true,
"Desc": "新用户数据缓存"
},
{
"Enabled": true,
"Key": "MenuHelper-RetrieveMenusByRoleId",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "角色菜单信息缓存"
},
{
"Enabled": true,
"Key": "RoleHelper-RetrieveRoles",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "所有角色数据缓存"
},
{
"Enabled": true,
"Key": "RoleHelper-RetrieveRolesByUserId",
"Key": "RoleHelper-RetrieveRolesByUserName",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "指定用户角色数据缓存"
},
{
"Enabled": true,
"Key": "RoleHelper-RetrieveRolesByMenuId",
"Key": "RoleHelper-RetrieveRolesByUrl",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "指定菜单角色数据缓存"
"Desc": "通过菜单获得角色数据"
},
{
"Enabled": true,
"Key": "RoleHelper-RetrieveRolesByGroupId",
"Key": "BootstrapUser-RetrieveUsersByName",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "指定组角色数据缓存"
"Desc": "登录用户数据"
},
{
"Enabled": true,
"Key": "GroupHelper-RetrieveGroups",
"Key": "BootstrapDict-RetrieveDicts",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "所有数据缓存"
"Desc": "所有字典数据缓存"
},
{
"Enabled": true,
"Key": "GroupHelper-RetrieveGroupsByUserId",
"Key": "BootstrapMenu-RetrieveMenus",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "用户所有菜单数据缓存"
},
{
"Enabled": true,
"Key": "GroupHelper-RetrieveGroupsByUserName",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "指定用户组数据缓存"
},
{
"Enabled": true,
"Key": "UserHelper-RetrieveUsers",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "所有用户数据"
},
{
"Enabled": true,
"Key": "UserHelper-RetrieveUsersByRoleId",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "通过角色ID获得所有用户数据"
},
{
"Enabled": true,
"Key": "UserHelper-RetrieveUsersByGroupId",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "通过部门ID获得所有用户数据"
},
{
"Enabled": true,
"Key": "UserHelper-RetrieveNewUsers",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "新用户数据"
},
{
"Enabled": true,
"Key": "MenuHelper-RetrieveMenusByRoleId",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "通过角色ID获得所有菜单数据"
},
{
"Enabled": true,
"Key": "RoleHelper-RetrieveRoles",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "所有角色数据"
},
{
"Enabled": true,
"Key": "RoleHelper-RetrieveRolesByUserId",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "通过用户ID获得所有角色数据"
},
{
"Enabled": true,
"Key": "RoleHelper-RetrieveRolesByMenuId",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "通过菜单ID获得所有角色数据"
},
{
"Enabled": true,
"Key": "RoleHelper-RetrieveRolesByGroupId",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "通过部门ID获得所有角色数据"
},
{
"Enabled": true,
"Key": "GroupHelper-RetrieveGroups",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "所有部门数据"
},
{
"Enabled": true,
"Key": "GroupHelper-RetrieveGroupsByUserId",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "通过用户ID获得所有部门数据"
},
{
"Enabled": true,
"Key": "GroupHelper-RetrieveGroupsByRoleId",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "指定角色组数据缓存"
"Desc": "通过角色ID获得所有部门数据"
},
{
"Enabled": true,
"Key": "LogHelper-RetrieveLogs",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "所有日志数据缓存"
"Desc": "所有日志数据"
},
{
"Enabled": true,
"Key": "DictHelper-RetrieveDictsCategory",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "字典分类数据缓存"
"Desc": "字典分类数据"
},
{
"Enabled": true,
"Key": "NotificationHelper-RetrieveNotifications",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "通知管理数据缓存"
"Desc": "通知管理数据"
},
{
"Enabled": true,
"Key": "ExceptionHelper-RetrieveExceptions",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "程序异常数据缓存"
"Desc": "程序异常数据"
},
{
"Enabled": true,
"Key": "MessageHelper-RetrieveMessages",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "站内消息数据缓存"
"Desc": "站内消息数据"
},
{
"Enabled": true,
"Key": "TaskHelper-RetrieveTasks",
"Interval": 600,
"SlidingExpiration": true,
"Desc": "所有任务数据缓存"
"Desc": "所有任务数据"
},
{
"Enabled": true,
"Key": "WebApi",
"Interval": 21600,
"SlidingExpiration": true,
"Desc": "WebApi 数据缓存"
"Desc": "WebApi 数据"
},
{
"Enabled": true,
"Key": "Token",
"Interval": 21600,
"SlidingExpiration": true,
"Desc": "Token 数据缓存"
"Desc": "Token 数据"
},
{
"Enabled": true,
"Key": "NotificationHelper-PullNotificationsInterval",
"Interval": 10,
"SlidingExpiration": false,
"Desc": "全局消息提示轮询时间间隔"
}
]
}

187
Bootstrap.Admin/libman.json Normal file
View File

@ -0,0 +1,187 @@
{
"version": "1.0",
"defaultProvider": "cdnjs",
"libraries": [
{
"provider": "unpkg",
"library": "@aspnet/signalr@1.0.4",
"destination": "wwwroot/lib/signalr/",
"files": [
"dist/browser/signalr.js",
"dist/browser/signalr.js.map",
"dist/browser/signalr.min.js",
"dist/browser/signalr.min.js.map"
]
},
{
"provider": "cdnjs",
"library": "jquery@3.3.1",
"destination": "wwwroot/lib/jquery/",
"files": [
"jquery.min.js",
"jquery.js",
"jquery.min.map"
]
},
{
"provider": "cdnjs",
"library": "jquery-validate@1.18.0",
"destination": "wwwroot/lib/validate",
"files": [
"jquery.validate.js",
"jquery.validate.min.js",
"localization/messages_zh.js",
"localization/messages_zh.min.js"
]
},
{
"provider": "cdnjs",
"library": "toastr.js@2.1.4",
"destination": "wwwroot/lib/toastr.js/",
"files": [
"toastr.min.js",
"toastr.css",
"toastr.js.map",
"toastr.min.css"
]
},
{
"provider": "cdnjs",
"library": "bootstrap-table@1.12.1",
"destination": "wwwroot/lib/bootstrap-table/",
"files": [
"bootstrap-table.min.js",
"locale/bootstrap-table-zh-CN.js",
"locale/bootstrap-table-zh-CN.min.js",
"bootstrap-table.css",
"bootstrap-table.js",
"bootstrap-table.min.css"
]
},
{
"provider": "cdnjs",
"library": "twitter-bootstrap@4.1.3",
"destination": "wwwroot/lib/twitter-bootstrap/",
"files": [
"js/bootstrap.bundle.js",
"css/bootstrap.css",
"css/bootstrap.css.map",
"css/bootstrap.min.css",
"css/bootstrap.min.css.map",
"js/bootstrap.bundle.js.map",
"js/bootstrap.bundle.min.js",
"js/bootstrap.bundle.min.js.map"
]
},
{
"provider": "cdnjs",
"library": "font-awesome@4.7.0",
"destination": "wwwroot/lib/font-awesome/",
"files": [
"css/font-awesome.min.css",
"css/font-awesome.css",
"css/font-awesome.css.map",
"fonts/fontawesome-webfont.eot",
"fonts/fontawesome-webfont.svg",
"fonts/fontawesome-webfont.ttf",
"fonts/fontawesome-webfont.woff",
"fonts/fontawesome-webfont.woff2",
"fonts/FontAwesome.otf"
]
},
{
"provider": "cdnjs",
"library": "bootstrap-sweetalert@1.0.1",
"destination": "wwwroot/lib/bootstrap-sweetalert/",
"files": [
"sweetalert.min.js",
"sweetalert.css",
"sweetalert.js",
"sweetalert.min.css",
"sweetalert.min.css.map"
]
},
{
"library": "malihu-custom-scrollbar-plugin@3.1.5",
"destination": "wwwroot/lib/scrollbar/",
"files": [
"jquery.mCustomScrollbar.concat.min.js",
"jquery.mCustomScrollbar.css",
"jquery.mCustomScrollbar.js",
"jquery.mCustomScrollbar.min.css",
"jquery.mCustomScrollbar.min.js",
"jquery.mCustomScrollbar.min.js.map",
"mCSB_buttons.png"
]
},
{
"library": "smalot-bootstrap-datetimepicker@2.4.4",
"destination": "wwwroot/lib/datetimepicker",
"files": [
"css/bootstrap-datetimepicker.css",
"css/bootstrap-datetimepicker.min.css",
"js/locales/bootstrap-datetimepicker.zh-CN.js",
"js/bootstrap-datetimepicker.js",
"js/bootstrap-datetimepicker.min.js"
]
},
{
"provider": "unpkg",
"library": "dcjqaccordion@2.7.1",
"destination": "wwwroot/lib/dcjqaccordion/",
"files": [
"js/jquery.dcjqaccordion.2.7.js",
"js/jquery.dcjqaccordion.2.7.min.js",
"js/jquery.cookie.js"
]
},
{
"provider": "cdnjs",
"library": "bootstrap-fileinput@4.5.1",
"destination": "wwwroot/lib/bootstrap-fileinput/",
"files": [
"js/fileinput.min.js",
"themes/fa/theme.js",
"themes/fa/theme.min.js",
"js/fileinput.js",
"js/locales/zh.js",
"js/locales/zh.min.js",
"js/locales/zh.min.js.map",
"img/loading-sm.gif",
"img/loading.gif",
"css/fileinput.css",
"css/fileinput.min.css"
]
},
{
"provider": "cdnjs",
"library": "bootstrap-3-typeahead@4.0.2",
"destination": "wwwroot/lib/bootstrap-3-typeahead/",
"files": [
"bootstrap3-typeahead.min.js",
"bootstrap3-typeahead.js"
]
},
{
"provider": "cdnjs",
"library": "nprogress@0.2.0",
"destination": "wwwroot/lib/nprogress/",
"files": [
"nprogress.min.js",
"nprogress.css",
"nprogress.js",
"nprogress.min.css"
]
},
{
"library": "nestable2@1.6.0",
"destination": "wwwroot/lib/nestable2/",
"files": [
"jquery.nestable.min.js",
"jquery.nestable.css",
"jquery.nestable.js",
"jquery.nestable.min.css"
]
}
]
}

View File

@ -0,0 +1,2 @@
IE 10+
Chrome

View File

@ -1,11 +1,8 @@
.alert {
position: absolute;
top: 15px;
left: 15px;
right: 15px;
z-index: 100;
body > header, body > aside, body > section, body > footer {
display: none;
}
.alert div {
display: inline-block;
}
.alert {
margin: 15px auto;
width: 90%;
}

View File

@ -1,72 +0,0 @@
@media (min-width: 375px) {
.hidden-375 {
display: inline-block;
}
.toolbar .dropdown-menu a {
padding: 0 20px;
}
.toolbar .dropdown-menu a:first-child {
border-left: none;
}
}
@media (min-width: 768px) {
.sidebar {
top: 98px;
bottom: 40px;
position: absolute;
overflow: auto;
}
}
@media (min-width: 769px) {
.sidebar {
display: block;
width: 210px;
}
.main-content {
margin-left: 210px;
transition: none;
}
.main-content.open {
display: block;
}
aside {
transition: none;
transform: none;
top: 0;
right: auto;
}
}
@media (min-height: 672px) {
.sidebar {
top: 98px;
bottom: 40px;
position: absolute;
overflow: auto;
}
.main-content {
position: fixed;
overflow: auto;
transition: none;
}
.main-content.open {
display: block;
}
aside {
top: 0;
}
.aside.open {
transform: translate(0);
}
}

View File

@ -1,327 +0,0 @@
.dropdown-select + .dropdown-menu a:hover {
background: #007AC0;
color: #fff;
}
.logTs, .logSql, .logDbExcep {
color: red;
font-weight: 600;
}
.logExcep {
color: #337ab7;
font-weight: 600;
}
.logMsg {
color: #ce2520;
font-weight: 600;
}
.hidden-375 {
display: none;
}
.clearcache {
position: absolute;
right: 60px;
color: #d9534f;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
}
.clearcache:hover, .clearcache:focus {
color: #c12e2a;
}
.clearcache:active:hover {
color: #ac2925;
}
.main-content {
transition: all .4s ease-in-out;
padding: 15px 15px 0 15px;
margin-left: 0;
height: auto;
left: 0;
bottom: 40px;
right: 0;
top: 98px;
}
.main-content.open {
display: none;
}
.main-content.closed {
margin-left: 0;
}
.main-content > .panel:last-child .panel-body {
padding-bottom: 0;
}
.main-content > .panel > .panel-body > .modal-footer {
text-align: left;
}
aside {
transition: transform .4s ease-in-out;
transform: translate(-100%);
height: 100%;
position: absolute;
top: 98px;
bottom: 40px;
left: 0;
right: 0;
z-index: 5;
}
aside.open {
transform: translate(0);
}
.sidebar {
display: none;
overflow: auto;
width: 100%;
z-index: 5;
background: #2a3542;
}
.sidebar-menu {
padding: 20px 0;
margin-bottom: 0;
}
.sidebar-menu .dcjq-icon {
height: 17px;
width: 17px;
display: inline-block;
background: url(../images/nav-expand.png) no-repeat;
float: right;
margin-top: 3px;
}
.sidebar-menu .active .dcjq-icon {
background-position: bottom;
}
.sidebar-menu li {
margin: 5px 10px;
}
.sidebar-menu li a {
color: #aeb2b7;
display: block;
padding: 15px 10px;
transition: all 0.3s ease;
border-radius: 4px;
}
.sidebar-menu li a.active, .sidebar-menu li a:hover, .sidebar-menu li a:focus {
background: #35404d;
color: #fff;
}
.sidebar-menu li a.active i {
color: #FF6C60;
}
.sidebar-menu li a i {
width: 22px;
}
.sidebar-menu li .sub {
padding-left: 0;
}
.sidebar-menu li .sub li a:hover, .sidebar-menu li .sub li.active a {
color: #FF6C60;
transition: all 0.3s ease;
display: block;
}
.sidebar-menu li .sub li {
background: #35404D;
margin: 0;
padding: 0 10px 0 32px;
}
.sidebar-menu li .sub li:last-child {
border-radius: 0 0 4px 4px;
padding-bottom: 10px;
}
.sidebar-menu li .sub li a {
padding: 12px 0;
}
.affix {
position: fixed;
bottom: 95px;
right: 50px;
}
.affix a {
font-size: 2rem;
margin-top: 16px;
}
.bs-bars {
display: none;
}
.toolbar {
position: relative;
margin-top: 10px;
margin-bottom: 10px;
line-height: 34px;
}
.toolbar .dropdown-menu a {
padding: 0 14px;
display: table-cell;
color: #504d4d;
}
.toolbar .dropdown-menu a:not(:first-child) {
border-left: solid 1px #aeb2b7;
}
.toolbar .dropdown-menu a:hover {
color: #235e90;
}
/*Messages*/
.mail-box {
display: flex;
}
.mail-box .sm-side {
flex: 0.4;
background: #e5e8ef;
border-radius: 4px 0 0 4px;
}
.mail-box .sm-side .user-head {
background: #00a8b3;
border-radius: 4px 0 0 0;
padding: 10px;
color: #fff;
min-height: 80px;
}
.mail-box .sm-side .user-head .inbox-avatar {
width: 65px;
float: left;
}
.mail-box .sm-side .user-head .inbox-avatar img {
height: 65px;
border-radius: 4px;
border: 0;
vertical-align: middle;
}
.mail-box .sm-side .user-head .user-name {
display: inline-block;
margin: 0 0 0 10px;
}
.mail-box .sm-side .user-head .user-name h5 {
margin-top: 15px;
margin-bottom: 0;
font-weight: 300;
}
.mail-box .sm-side .user-head .user-name h5 a {
color: #fff;
}
.mail-box .sm-side .inbox-body, .mail-box .lg-side .inbox-body {
padding: 20px;
}
.mail-box .sm-side .inbox-body .btn-compose {
background: #ff6c60;
padding: 12px 0;
text-align: center;
width: 100%;
color: #fff;
}
.mail-box .sm-side .inbox-body .btn-compose:hover {
background: #f5675c;
color: #fff;
}
.mail-box .sm-side ul.inbox-nav {
display: inline-block;
width: 100%;
margin: 0;
padding: 0;
}
.mail-box .sm-side ul.inbox-nav li {
display: inline-block;
line-height: 45px;
width: 100%;
}
.mail-box .sm-side ul.inbox-nav li a {
color: #6a6a6a;
line-height: 45px;
width: 100%;
display: inline-block;
padding: 0 20px;
}
.mail-box .sm-side ul.inbox-nav li a:hover, .mail-box .sm-side ul.inbox-nav li.active a, .mail-box .sm-side ul.inbox-nav li a:focus {
color: #6a6a6a;
background: #d5d7de;
}
.mail-box .sm-side ul.inbox-nav li a .label {
margin-top: 13px;
padding: 0.5em 0.8em;
}
.mail-box .sm-side ul.inbox-nav li a i {
width: 18px;
}
.mail-box .lg-side {
flex: 0.6;
background: #fff;
border-radius: 0 4px 4px 0;
}
.mail-box .lg-side .inbox-head {
padding: 12px;
background: #41cac0;
color: #fff;
border-radius: 0 4px 0 0;
min-height: 80px;
}
.mail-box .lg-side .table-inbox {
border: 1px solid #d3d3d3;
margin-bottom: 0;
}
.mail-box .lg-side .table-inbox .unread td {
font-weight: 600;
background: #f7f7f7;
}
.mail-box .lg-side .table-inbox tr td {
padding: 12px;
}
.mail-box .lg-side .table-inbox tr td .fa-star.inbox-started, .mail-box .lg-side .table-inbox tr td .fa-star:hover {
color: #f78a09;
}
.mail-box .lg-side .table-inbox tr td:hover {
cursor: pointer;
}

View File

@ -1,35 +0,0 @@
h3 {
margin-top: 0;
color: #000;
}
.btn {
text-shadow: none;
}
.control-label {
width: 80px;
}
.main-content {
padding: 15px;
}
.main-content > section:not(:first-child) {
padding-top: 10px;
}
.main-content > section > div {
line-height: 26px;
}
.main-content > section > div > div {
display: inline-block;
word-break: break-all;
}
.test {
display: none;
padding: 10px 0 0 0;
color: #5cb85c;
}

View File

@ -0,0 +1,2 @@
body {
}

View File

@ -1,22 +1,93 @@
.card {
border: 1px solid #5198cb;
.navbar-light .navbar-nav .show > .nav-link, .navbar-light .navbar-nav .active > .nav-link, .navbar-light .navbar-nav .nav-link.show, .navbar-light .navbar-nav .nav-link.active {
color: rgb(51, 122, 183);
}
.card-header, .modal-header {
.navbar-light .navbar-nav .nav-link {
padding: 3px 8px;
color: rgba(51, 122, 183, 0.9);
transition: color .3s linear;
}
.navbar-light .navbar-nav .nav-link:hover, .nav-link .navbar-nav .active > .nav-link:hover {
color: #0056b3;
}
.dropdown-item.active, .dropdown-item:active {
color: rgba(0, 0, 0, 0.9);
}
.dropdown-item:hover, .nav .dropdown-item:nth-of-type(odd):hover, .dropdown-item:active, .dropdown-item.active {
background-color: #77afd5;
}
.userinfo .dropdown-item:hover {
background-color: #f8f9fa;
}
.breadcrumb, .pagination-detail {
color: #337ab7;
}
.card-header, .modal-header, .popover-header {
background-color: #5899c8;
border-color: #3581b8;
color: #fff;
border-radius: 4px 4px 0 0;
}
.card-header a, .modal-header a {
color: #fff;
}
.close {
text-shadow: none;
}
.modal-footer {
border-top-color: #5198cb;
.header .navbar {
padding-bottom: 0;
}
.header .nav-item.active {
border-bottom: solid 1px #307eb6;
}
.card, .modal-footer, .form-control, .popover, .date .input-group-text,
.input-group .btn:not(.btn-secondary):not(.btn-primary):not(.btn-warning):not(.btn-info):not(.btn-danger) {
border-color: #5198cb;
}
.card .card-header, .modal-header {
background-image: linear-gradient(to bottom, #5893be 0%, #63a6d7 100%);
background-color: #5899c8;
border-color: #3581b8;
}
.card .card-header, a[data-toggle="collapse"], .modal-header, .modal-header .close, .popover-header,
.card .card-header a, .modal-header a,
.card .card-header a:hover,
.close:not(:disabled):not(.disabled):hover,
.close:not(:disabled):not(.disabled):focus {
color: #fff;
}
.card .card-header a {
color: #eee;
}
.control-label {
color: #467fa7;
}
.breadcrumb > li + li:before, .breadcrumb, .pagination-detail {
color: #337ab7;
}
.form-control[disabled], .form-control[readonly], .date .form-control, .date .input-group-text,
.input-group .btn:not(.btn-secondary):not(.btn-primary):not(.btn-warning):not(.btn-info):not(.btn-danger) {
background-color: rgba(84, 189, 220, 0.21);
}
.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^="right"] .arrow::before {
border-right-color: #305873;
}
@media (min-width: 768px) {
.breadcrumb {
border-color: rgba(81, 152, 203, 0.8)
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -41,6 +41,7 @@
bottom: 0;
position: absolute;
overflow-y: auto;
width: 100%;
}
.fa-nav nav a {
@ -70,6 +71,10 @@
padding-left: 10px;
}
.fa-nav .mCS-minimal-dark.mCSB_scrollTools_vertical {
margin: 0;
}
.form-group .input-group .input-group-append .btn i {
color: #187c9a;
width: 22px;
@ -92,9 +97,9 @@
}
.icon-content .fa-nav {
right: 33px;
top: 68px;
bottom: 84px;
right: 34px;
top: 83px;
bottom: 99px;
}
.icon-content .modal-body {
@ -254,17 +259,17 @@
.fa-nav {
display: block;
position: fixed;
top: 98px;
top: 113px;
right: 17px;
width: 140px;
bottom: 40px;
bottom: 55px;
}
.fa-icons {
margin-right: 120px;
margin-right: 140px;
}
.modal-body .fa-icons {
margin-right: 148px;
margin-right: 155px;
}
}

File diff suppressed because one or more lines are too long

View File

@ -1,253 +0,0 @@
/**
* Nestable
*/
.dd {
position: relative;
display: block;
margin: 0;
padding: 0;
list-style: none;
line-height: 20px;
}
.dd-list {
display: block;
position: relative;
margin: 0;
padding: 0;
list-style: none;
}
.dd-list .dd-list {
padding-left: 30px;
}
.dd-collapsed .dd-list {
display: none;
}
.dd-item,
.dd-empty,
.dd-placeholder {
display: block;
position: relative;
margin: 0;
padding: 0;
min-height: 20px;
line-height: 20px;
}
.dd-handle {
display: block;
height: 30px;
margin: 5px 0;
padding: 5px 10px;
cursor: move;
color: #333;
text-decoration: none;
font-weight: bold;
border: 1px solid #ccc;
background: #F5F5F5;
background: -webkit-linear-gradient(top, #fafafa 0%, #eee 100%);
background: -moz-linear-gradient(top, #fafafa 0%, #eee 100%);
background: linear-gradient(top, #fafafa 0%, #eee 100%);
border-radius: 3px;
box-sizing: border-box;
-moz-box-sizing: border-box;
}
.dd-handle:hover {
color: #2ea8e5;
background: #fff;
}
.dd-item > button {
display: block;
position: relative;
cursor: pointer;
float: left;
width: 25px;
height: 20px;
margin: 5px 0;
padding: 0;
text-indent: 100%;
white-space: nowrap;
overflow: hidden;
border: 0;
background: transparent;
line-height: 1;
text-align: center;
font-weight: bold;
}
.dd-item > button:before {
content: '+';
display: block;
position: absolute;
width: 100%;
text-align: center;
text-indent: 0;
}
.dd-item > button[data-action="collapse"]:before {
content: '-';
}
.dd-placeholder,
.dd-empty {
margin: 5px 0;
padding: 0;
min-height: 30px;
background: #f2fbff;
border: 1px dashed #b6bcbf;
box-sizing: border-box;
-moz-box-sizing: border-box;
}
.dd-empty {
border: 1px dashed #bbb;
min-height: 100px;
background-color: #e5e5e5;
background-image: -webkit-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), -webkit-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff);
background-image: -moz-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), -moz-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff);
background-image: linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff);
background-size: 60px 60px;
background-position: 0 0, 30px 30px;
}
.dd-dragel {
position: absolute;
pointer-events: none;
z-index: 9999;
}
.dd-dragel > .dd-item .dd-handle {
margin-top: 0;
}
.dd-dragel .dd-handle {
-webkit-box-shadow: 2px 4px 6px 0 rgba(0,0,0,.1);
box-shadow: 2px 4px 6px 0 rgba(0,0,0,.1);
}
.dd3-content {
display: block;
height: 30px;
margin: 5px 0;
padding: 5px 10px 5px 40px;
color: #333;
text-decoration: none;
font-weight: bold;
border: 1px solid #ccc;
background: #F5F5F5;
background: -webkit-linear-gradient(top, #fafafa 0%, #eee 100%);
background: -moz-linear-gradient(top, #fafafa 0%, #eee 100%);
background: linear-gradient(top, #fafafa 0%, #eee 100%);
box-sizing: border-box;
-moz-box-sizing: border-box;
border-radius: 3px;
cursor: pointer;
}
.dd3-content:hover {
color: #2ea8e5;
background: #d5d5d5;
}
.dd3-content label {
display: block;
cursor: pointer;
}
.dd3-content label span.active {
color: darkred;
}
.dd3-content label span i {
width: 22px;
display: inline-block;
text-align: center;
margin-right: 4px;
}
.dd3-content label input {
margin-right: 10px;
cursor: pointer;
margin-top: 4px;
}
.dd3-content span {
position: absolute;
top: 6px;
}
.dd3-content .menuOrder {
right: 15px;
}
.dd3-content .menuType {
right: 45px;
}
@media (max-width: 480px) {
.dd3-content .menuType {
display: none;
}
li[data-category="1"] .dd3-content .menuOrder {
color: green;
}
}
li[data-category="1"] .dd3-content .menuType {
color: green;
}
.dd-dragel > .dd3-item > .dd3-content {
margin: 0;
}
.dd3-item > button {
margin-left: 30px;
}
.dd3-handle {
position: absolute;
margin: 0;
left: 0;
top: 0;
cursor: pointer;
width: 30px;
text-indent: 100%;
white-space: nowrap;
overflow: hidden;
border: 1px solid #ccc;
background: #d5d5d5;
background: -webkit-linear-gradient(top, #ddd 0%, #bbb 100%);
background: -moz-linear-gradient(top, #ddd 0%, #bbb 100%);
background: linear-gradient(top, #ddd 0%, #bbb 100%);
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.dd3-handle:before {
content: '≡';
display: block;
position: absolute;
left: 0;
top: 3px;
width: 100%;
text-align: center;
text-indent: 0;
color: #fff;
font-size: 20px;
font-weight: normal;
}
.dd3-handle:hover {
/*background: #404040;*/
background: #5cb85c;
border: 1px solid #404040;
}

View File

@ -1,12 +1,18 @@
@media (min-width: 375px) {
@media (max-width: 767px) {
.form-signin {
width: 320px;
margin: 0 auto;
background: #fff;
border-radius: 5px;
max-width: 320px;
border: solid 1px #ddd;
}
}
@media (min-width: 768px) {
body {
background: url('../images/bg2.jpg') fixed repeat;
background-color: #5bc0de;
background: url('../images/bg2.jpg') fixed no-repeat;
background-size: 100% 100%;
}
.container {
@ -17,22 +23,15 @@
margin: 0 auto;
}
.form-signin {
border: none;
background: none;
width: auto;
.form-signin-heading {
padding: 28px 0;
background-color: transparent;
}
.form-signin .form-signin-heading {
background: none;
margin-top: 10px;
}
.form-signin .input-group {
border: solid 1px #286090;
}
.login-wrap {
margin: 30px 0 0 370px;
padding: 0;
margin: 36px 0 0 370px;
width: 280px;
height: 200px;
}
}

Some files were not shown because too many files have changed in this diff Show More