合并分支:合并dev分支功能代码
This commit is contained in:
parent
5e1bcadb20
commit
7a94001485
|
@ -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 -- ######
|
|
@ -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>
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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; }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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>
|
||||
///
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -11,7 +11,8 @@ namespace Bootstrap.Admin.Controllers.Api
|
|||
///
|
||||
/// </summary>
|
||||
[Route("api/[controller]")]
|
||||
public class MessagesController : Controller
|
||||
[ApiController]
|
||||
public class MessagesController : ControllerBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 根据Id返回不同的消息列表
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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 })
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
});
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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>
|
||||
///
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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; }
|
||||
}
|
||||
}
|
|
@ -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; }
|
||||
}
|
||||
}
|
|
@ -27,6 +27,6 @@ namespace Bootstrap.Admin.Models
|
|||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public string Theme { get; private set; }
|
||||
public string Theme { get; protected set; }
|
||||
}
|
||||
}
|
|
@ -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>
|
||||
///
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>();
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
},
|
||||
"applicationUrl": "http://localhost:50853/"
|
||||
"applicationUrl": "http://localhost:50852/"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -5,6 +5,9 @@ using System.Linq;
|
|||
|
||||
namespace Bootstrap.Admin.Query
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public class QueryDictOption : PaginationOption
|
||||
{
|
||||
/// <summary>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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>
|
|
@ -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">×</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">×</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>
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
@model ModelBase
|
||||
@{
|
||||
ViewBag.Title = Model.Title;
|
||||
Layout = "~/Views/Shared/_Login.cshtml";
|
||||
}
|
||||
@section css {
|
||||
<link href="~/css/loginm.css" rel="stylesheet" />
|
||||
}
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
File diff suppressed because it is too large
Load Diff
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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")
|
||||
}
|
||||
}
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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")
|
||||
}
|
||||
}
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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")
|
||||
}
|
||||
}
|
|
@ -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>
|
||||
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -1,11 +0,0 @@
|
|||
_Layout.cshtml
|
||||
/Home/Login
|
||||
|
||||
-------> _Admin.cshtml
|
||||
/Admin/Index
|
||||
|
||||
--------------> _Default.cshtml
|
||||
/Admin/Users
|
||||
|
||||
|
||||
-------> _Normal.cshtml
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -22,4 +22,4 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -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">
|
||||
|
|
|
@ -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)
|
|
@ -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">
|
||||
|
|
|
@ -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">×</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>
|
|
@ -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">×</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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -1,3 +1,3 @@
|
|||
@{
|
||||
Layout = "_Layout";
|
||||
Layout = "_Admin";
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
]
|
||||
|
|
|
@ -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": "全局消息提示轮询时间间隔"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
IE 10+
|
||||
Chrome
|
|
@ -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%;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
body {
|
||||
}
|
|
@ -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
|
@ -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
|
@ -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;
|
||||
}
|
|
@ -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
Loading…
Reference in New Issue