提交代码

This commit is contained in:
zpc 2024-11-15 02:58:48 +08:00
parent 1ff159f836
commit 65e6ce8a9d
1524 changed files with 147216 additions and 2 deletions

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021 HZY
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

36
README.en.md Normal file
View File

@ -0,0 +1,36 @@
# HzyAdminSpaNet6
#### Description
HzyAdminSpa .Net6
#### Software Architecture
Software architecture description
#### Installation
1. xxxx
2. xxxx
3. xxxx
#### Instructions
1. xxxx
2. xxxx
3. xxxx
#### Contribution
1. Fork the repository
2. Create Feat_xxx branch
3. Commit your code
4. Create Pull Request
#### Gitee Feature
1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
4. The most valuable open source project [GVP](https://gitee.com/gvp)
5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

View File

@ -1,3 +1,70 @@
# CloudGamingAdmin
![输入图片说明](gitee/images/image_cover.png)
# HzyAdmin通用管理平台
数据库脚本位置根目录 doc 文件夹 目前仅提供了 MySql、SqlServer、PgSql 脚本。
其他请使用efcore迁移迁移教程请看文档
QQ 534584927 174311837
后端技术: .Net8、EFCore8
前端: Vue3.x 、Antd Of Vue 4.x 、Vite 、Pinia 2.0.x 、TypeScript
开发需要环境: vs2022 、 .Net8.0 、VsCode 、Redis
MVC版本 https://gitee.com/hzy6/hzy-admin-mvc
WebApi 任务调度平台: https://gitee.com/hzy6/hzy-quartz
文档/演示地址: http://47.98.179.56/docs
bilibili视频介绍 https://www.bilibili.com/video/BV1tt4y157qH?vd_source=8803f9b05bd0271050a91c6e659a69d0#reply121926607792
### 模块化工程结构
![输入图片说明](gitee/images/project_map.jpg)
### 功能列表
![输入图片说明](gitee/images/menu_map_2023-2-3.jpg)
### 微服务案例模块化工程结构
![输入图片说明](gitee/images/project_1.jpg)
### 属性注入
![输入图片说明](gitee/images/attr_inj.png)
### ✨ 部分截图
![输入图片说明](gitee/images/winform.png)
| ![输入图片说明](gitee/images/theme_dark.png) | ![输入图片说明](gitee/images/theme_dark_1.png) |
|---|---|
| ![输入图片说明](gitee/images/DataAuthority.png) | ![输入图片说明](gitee/images/function.png) |
|-------------------------------------------|---|
| ![输入图片说明](gitee/images/MenuInfo.png) | ![输入图片说明](gitee/images/menu_function.png) |
|--------------------------------------|---|
| ![输入图片说明](gitee/images/home.png) | ![输入图片说明](gitee/images/icons.png) |
|-----------------------------------|---|
| ![输入图片说明](gitee/images/chart.png) | ![输入图片说明](gitee/images/%E6%9B%B4%E5%A4%9A%E5%9B%BE%E8%A1%A8.png) |
|-----------------------------------|---|
| ![输入图片说明](gitee/images/user_list.png) | ![输入图片说明](gitee/images/wangeditor.png) |
|---------------------------------------|---|
| ![输入图片说明](gitee/images/code_gen.png) | ![输入图片说明](gitee/images/user_center.png) |
|--------------------------------------|---|
| ![输入图片说明](gitee/images/login.png) | ![输入图片说明](gitee/images/Efcore%20%E7%9B%91%E6%8E%A7.png) |
|-----------------------------------|---|
![输入图片说明](gitee/images/home1.png)
蒸汽云游后台管理

View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.9.34407.89
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HZY.Admin.Blazor.Client", "HZY.Admin.Blazor.Client\HZY.Admin.Blazor.Client.csproj", "{3AAA4515-690C-4A6B-959F-1DAD8EBD4533}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3AAA4515-690C-4A6B-959F-1DAD8EBD4533}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3AAA4515-690C-4A6B-959F-1DAD8EBD4533}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3AAA4515-690C-4A6B-959F-1DAD8EBD4533}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3AAA4515-690C-4A6B-959F-1DAD8EBD4533}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A41AE26B-CF96-48EA-9EEB-202ABA63D2AA}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,14 @@
<Router AppAssembly="@typeof(App).Assembly">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<Result Status="404" />
</LayoutView>
</NotFound>
</Router>
@* antd *@
<AntContainer />

View File

@ -0,0 +1,26 @@
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<Content Remove="compilerconfig.json" />
</ItemGroup>
<ItemGroup>
<None Include="compilerconfig.json" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AntDesign" Version="0.19.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="8.0.2" PrivateAssets="all" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Flurl.Http" Version="4.0.2" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,7 @@
@inherits LayoutComponentBase
@Body
@code {
}

View File

@ -0,0 +1,84 @@
@inherits LayoutComponentBase
<Layout>
<Header Class="header">
<div class="logo" />
<Menu Theme="MenuTheme.Dark" Mode="MenuMode.Horizontal" DefaultSelectedKeys=@(new []{"2"})>
<MenuItem Key="1">nav 1</MenuItem>
<MenuItem Key="2">nav 2</MenuItem>
<MenuItem Key="3">nav 3</MenuItem>
</Menu>
</Header>
<Layout>
<Sider Width="200" Class="site-layout-background">
<Menu Mode="MenuMode.Inline"
DefaultSelectedKeys=@(new[] {"1"})
DefaultOpenKeys=@(new[] {"sub1"})
Style="height: 100%; border-right: 0;">
@{
RenderFragment sub1Title =
@<span>
<Icon Type="user" Theme="outline" />
subnav 1
</span>;
}
<SubMenu Key="sub1" Title=sub1Title>
<MenuItem Key="1">option1</MenuItem>
<MenuItem Key="2">option2</MenuItem>
<MenuItem Key="3">option3</MenuItem>
<MenuItem Key="4">option4</MenuItem>
</SubMenu>
@{
RenderFragment sub2Title =
@<span>
<Icon Type="laptop" Theme="outline" />
subnav 2
</span>;
}
<SubMenu Key="sub2" Title=sub2Title>
<MenuItem Key="5">option5</MenuItem>
<MenuItem Key="6">option6</MenuItem>
<MenuItem Key="7">option7</MenuItem>
<MenuItem Key="8">option8</MenuItem>
</SubMenu>
@{
RenderFragment sub3Title =
@<span>
<Icon Type="notification" Theme="outline" />
subnav 3
</span>;
}
<SubMenu Key="sub3" Title=sub3Title>
<MenuItem Key="9">option9</MenuItem>
<MenuItem Key="10">option10</MenuItem>
<MenuItem Key="11">option11</MenuItem>
<MenuItem Key="12">option12</MenuItem>
</SubMenu>
</Menu>
</Sider>
<Layout Style=" padding: 0 24px 24px;">
<Breadcrumb Style="margin: 16px 0;">
<BreadcrumbItem>Home</BreadcrumbItem>
<BreadcrumbItem>List</BreadcrumbItem>
<BreadcrumbItem>App</BreadcrumbItem>
</Breadcrumb>
<Content Class="site-layout-background" Style=" padding: 24px; margin: 0; min-height: 280px;">
@Body
</Content>
</Layout>
</Layout>
</Layout>
<style>
#components-layout-demo-top-side-2 .logo {
width: 120px;
height: 31px;
background: rgba(255, 255, 255, 0.2);
margin: 16px 28px 16px 0;
float: left;
}
.site-layout-background {
background: #fff;
}
</style>

View File

@ -0,0 +1,53 @@
using AntDesign;
using Flurl.Http;
namespace HZY.Admin.Blazor.Client.Layout;
public partial class MainLayout
{
[Inject] public HttpClient? HttpClient { get; set; }
[Inject] public NavigationManager _navigationManager { get; set; }
[Inject] public IJSRuntime _jSRuntime { get; set; }
[Inject] public IMessageService Message { get; set; } = null!;
// 加载用户信息
string urlPrefix = "http://localhost:5500/api/v1/admin/SysUser";
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
// http://localhost:5500/api/v1/admin/SysUser/info
var token = await _jSRuntime.GetLocalStorageItemAsync<string>("token");
if (string.IsNullOrWhiteSpace(token))
{
_navigationManager.NavigateTo("/login");
return;
}
var result = await $"{urlPrefix}/info"
.WithHeader("Authorization", "Bearer " + token)
.GetStringAsync();
//var data = result.Data;
//if (result.Code != 200)
//{
// await Message.Error(result.Message);
// return;
//}
//await Message.Info("拿到了用户信息 : " + JsonConvert.SerializeObject(data));
}
await base.OnAfterRenderAsync(firstRender);
}
}

View File

@ -0,0 +1,77 @@
.page {
position: relative;
display: flex;
flex-direction: column;
}
main {
flex: 1;
}
.sidebar {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}
.top-row {
background-color: #f7f7f7;
border-bottom: 1px solid #d6d5d5;
justify-content: flex-end;
height: 3.5rem;
display: flex;
align-items: center;
}
.top-row ::deep a, .top-row ::deep .btn-link {
white-space: nowrap;
margin-left: 1.5rem;
text-decoration: none;
}
.top-row ::deep a:hover, .top-row ::deep .btn-link:hover {
text-decoration: underline;
}
.top-row ::deep a:first-child {
overflow: hidden;
text-overflow: ellipsis;
}
@media (max-width: 640.98px) {
.top-row {
justify-content: space-between;
}
.top-row ::deep a, .top-row ::deep .btn-link {
margin-left: 0;
}
}
@media (min-width: 641px) {
.page {
flex-direction: row;
}
.sidebar {
width: 250px;
height: 100vh;
position: sticky;
top: 0;
}
.top-row {
position: sticky;
top: 0;
z-index: 1;
}
.top-row.auth ::deep a:first-child {
flex: 1;
text-align: right;
width: 0;
}
.top-row, article {
padding-left: 2rem !important;
padding-right: 1.5rem !important;
}
}

View File

@ -0,0 +1,20 @@
@page "/counter"
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
<Button Type="primary" @onclick="IncrementCount">Hello World!</Button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}

View File

@ -0,0 +1,7 @@
@page "/"
<PageTitle>Home</PageTitle>
<h1>Hello, world!</h1>
Welcome to your new app.

View File

@ -0,0 +1,47 @@
@layout AppLayout
@page "/login"
<div class="login">
<div class="login-card">
<div class="flex-left">
<img src="/images/info_service.png" alt="" />
</div>
<div class="flex-right p-30">
<div class="title">欢迎登录 HzyAdmin</div>
<div class="mt-16">
<Input Placeholder="large size" Size="@InputSize.Large" @bind-Value="@UserName">
<Prefix>
<Icon Type="user" Theme="outline" style="color: #1890ff; font-size: 14px" />
</Prefix>
</Input>
@* <a-input v-model:value="state.userName" placeholder="请输入" size="large" allow-clear>
<template #prefix>
<Icon Type="user" Theme="outline" style="color: #1890ff; font-size: 14px" />
</template>
</a-input> *@
</div>
<div class="mt-16">
<InputPassword Placeholder="large size" Size="@InputSize.Large" @bind-Value="@Password">
<Prefix>
<Icon Type="lock" Theme="outline" style="color: #1890ff; font-size: 14px" />
</Prefix>
</InputPassword>
@* <AInputPassword type="password" v-model:value="state.userPassword" size="large" ref="inputPassword" @keyup.enter="check()">
<template #prefix>
<Icon Type="lock" Theme="outline" style="color: #1890ff; font-size: 14px" />
</template>
</AInputPassword> *@
</div>
<div class="mt-40">
<Button Type="@ButtonType.Primary" @onclick="CheckAsync" Loading="Loading" Size="large" Block>
登录 @Loading
</Button>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,84 @@
using AntDesign;
using Flurl;
using Flurl.Http;
namespace HZY.Admin.Blazor.Client.Pages.Login;
public partial class Login
{
public string UserName { get; set; }
public string Password { get; set; }
public bool Loading { get; set; } = false;
[Inject]
public NavigationManager NavigationManager { get; set; } = null!;
[Inject]
public IJSRuntime JSRuntime { get; set; } = null!;
[Inject] public HttpClient? HttpClient { get; set; }
[Inject] public IMessageService Message { get; set; } = null!;
public async Task CheckAsync()
{
Loading = true;
StateHasChanged();
try
{
var result = await (await $"http://localhost:5500/api/v1/identity/Account/Login".PostJsonAsync(new
{
UserName,
UserPassword = Password
})).GetJsonAsync<R<LoginResultDto>>();
var data = result.Data;
if (result.Code != 200)
{
await Message.Error(result.Message);
return;
}
string? token = result.Data?.Token;
if (string.IsNullOrWhiteSpace(token))
{
await Message.Error("错误 token");
return;
}
await JSRuntime.SetLocalStorageItemAsync("token", token);
}
catch (Exception ex)
{
throw;
}
finally
{
Loading = false;
StateHasChanged();
}
//var result = HttpClient!.PostAsJsonAsync($"/api/v1/identity/Account/Login", new
//{
// UserName,
// Password
//}).Result;
NavigationManager.NavigateTo("/");
}
}
public class LoginResultDto
{
public string? Token { get; set; }
public string? TokenType { get; set; }
}

View File

@ -0,0 +1,76 @@
body {
margin: 0;
padding: 0;
overflow: hidden;
}
.login {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background: url("/images/login-1.jpg") no-repeat;
background-size: cover;
}
.login .login-card {
height: 600px;
width: 1000px;
box-shadow: 0px 16px 48px 16px rgba(0, 0, 0, 0.72), 0px 12px 32px #000000, 0px 8px 16px -8px #000000;
display: flex;
border-radius: 5px;
}
.login .login-card .flex-left {
flex: 1;
width: 450px;
}
.login .login-card .flex-left img {
height: 100%;
}
.login .login-card .flex-right {
flex: 1;
background-color: #ffffff;
display: flex;
justify-content: center;
flex-direction: column;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
}
.login .login-card .title {
text-align: center;
font-size: 30px;
padding: 20px;
font-weight: bold;
}
.login .login-card .el-input-group__append {
padding: 0 !important;
}
.login .login-card .el-input-group__append .login-code {
height: 38px;
}
@media (max-width: 1024px) {
.flex-left {
display: none;
flex: 0 !important;
}
.flex-left img {
height: auto !important;
width: 80% !important;
}
.flex-right {
border-radius: 5px;
}
}
@media (min-width: 600px) and (max-width: 1024px) {
.login-card {
width: 70% !important;
}
}
@media (max-width: 600px) {
.login-card {
width: 100% !important;
}
}
.lang-content {
position: absolute;
right: 24px;
top: 20px;
}

View File

@ -0,0 +1,93 @@
body {
margin: 0;
padding: 0;
overflow: hidden;
}
.login {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
//可以解开一下注解 放置一个背景图片
background: url("/images/login-1.jpg") no-repeat;
background-size: cover;
.login-card {
height: 600px;
width: 1000px;
box-shadow: 0px 16px 48px 16px rgba(0, 0, 0, 0.72), 0px 12px 32px #000000, 0px 8px 16px -8px #000000;
display: flex;
border-radius: 5px;
.flex-left {
flex: 1;
width: 450px;
img {
height: 100%;
}
}
.flex-right {
flex: 1;
background-color: #ffffff;
display: flex;
justify-content: center;
flex-direction: column;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
}
.title {
text-align: center;
font-size: 30px;
padding: 20px;
font-weight: bold;
}
.el-input-group__append {
padding: 0 !important;
.login-code {
height: 38px;
}
}
}
}
//小于 1024 像素 选择采用此样式
@media (max-width: 1024px) {
.flex-left {
display: none;
flex: 0 !important;
img {
height: auto !important;
width: 80% !important;
}
}
.flex-right {
border-radius: 5px;
}
}
@media (min-width: 600px) and (max-width: 1024px) {
.login-card {
width: 70% !important;
}
}
@media (max-width: 600px) {
.login-card {
// flex-direction: column;
width: 100% !important;
}
}
.lang-content {
position: absolute;
right: 24px;
top: 20px;
}

View File

@ -0,0 +1 @@
body{margin:0;padding:0;overflow:hidden;}.login{display:flex;justify-content:center;align-items:center;height:100vh;background:url("/images/login-1.jpg") no-repeat;background-size:cover;}.login .login-card{height:600px;width:1000px;box-shadow:0 16px 48px 16px rgba(0,0,0,.72),0 12px 32px #000,0 8px 16px -8px #000;display:flex;border-radius:5px;}.login .login-card .flex-left{flex:1;width:450px;}.login .login-card .flex-left img{height:100%;}.login .login-card .flex-right{flex:1;background-color:#fff;display:flex;justify-content:center;flex-direction:column;border-top-right-radius:5px;border-bottom-right-radius:5px;}.login .login-card .title{text-align:center;font-size:30px;padding:20px;font-weight:bold;}.login .login-card .el-input-group__append{padding:0!important;}.login .login-card .el-input-group__append .login-code{height:38px;}@media(max-width:1024px){.flex-left{display:none;flex:0!important;}.flex-left img{height:auto!important;width:80%!important;}.flex-right{border-radius:5px;}}@media(min-width:600px) and (max-width:1024px){.login-card{width:70%!important;}}@media(max-width:600px){.login-card{width:100%!important;}}.lang-content{position:absolute;right:24px;top:20px;}

View File

@ -0,0 +1,57 @@
@page "/weather"
@inject HttpClient Http
<PageTitle>Weather</PageTitle>
<h1>Weather</h1>
<p>This component demonstrates fetching data from the server.</p>
@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th>Temp. (C)</th>
<th>Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
private WeatherForecast[]? forecasts;
protected override async Task OnInitializedAsync()
{
forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("sample-data/weather.json");
}
public class WeatherForecast
{
public DateOnly Date { get; set; }
public int TemperatureC { get; set; }
public string? Summary { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
}

View File

@ -0,0 +1,18 @@
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
builder.RootComponents.Add<HeadOutlet>("head::after");
builder.Services.AddTransient<HttpClientDelegatingHandler>();
builder.Services.AddScoped(sp =>
{
var httpClientDelegatingHandler = sp.GetRequiredService<HttpClientDelegatingHandler>();
return new HttpClient(httpClientDelegatingHandler)
{
BaseAddress = new Uri("http://localhost:5500")//builder.HostEnvironment.BaseAddress
};
});
builder.Services.AddAntDesign();
await builder.Build().RunAsync();

View File

@ -0,0 +1,15 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"applicationUrl": "http://localhost:5176",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@ -0,0 +1,8 @@
global using HZY.Admin.Blazor.Client;
global using HZY.Admin.Blazor.Client.Utils;
global using Microsoft.AspNetCore.Components.Web;
global using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
global using Microsoft.AspNetCore.Components;
global using System.Net.Http.Json;
global using Microsoft.JSInterop;
global using Newtonsoft.Json;

View File

@ -0,0 +1,62 @@
using Microsoft.AspNetCore.Components.WebAssembly.Http;
namespace HZY.Admin.Blazor.Client.Utils;
/// <summary>
/// http 拦截器
/// </summary>
public class HttpClientDelegatingHandler : DelegatingHandler
{
private readonly NavigationManager _navigationManager;
private readonly IJSRuntime _jSRuntime;
public HttpClientDelegatingHandler(NavigationManager navigationManager, IJSRuntime jSRuntime)
{
_navigationManager = navigationManager;
_jSRuntime = jSRuntime;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var token = await _jSRuntime.GetLocalStorageItemAsync<string>("token");
if (string.IsNullOrWhiteSpace(token))
{
_navigationManager.NavigateTo("/login");
return new HttpResponseMessage();
}
// 跨域配置
request.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);
// 在发送请求之前进行JSON序列化
//if (request.Content != null && request.Content.Headers.ContentType?.MediaType == "application/json")
//{
// var content = await request.Content.ReadAsStringAsync();
// var serializedContent = JsonConvert.SerializeObject(JsonConvert.DeserializeObject(content));
// request.Content = new StringContent(serializedContent, System.Text.Encoding.UTF8, "application/json");
//}
try
{
// 发送请求
var response = await base.SendAsync(request, cancellationToken);
// 在收到响应后进行JSON反序列化
//if (response.Content != null && response.Content.Headers.ContentType?.MediaType == "application/json")
//{
// var content = await response.Content.ReadAsStringAsync();
// var deserializedContent = JsonConvert.DeserializeObject(content);
// response.Content = new StringContent(JsonConvert.SerializeObject(deserializedContent), System.Text.Encoding.UTF8, "application/json");
//}
return response;
}
catch (Exception ex)
{
throw;
}
}
}

View File

@ -0,0 +1,168 @@
using System.Net;
namespace HZY.Admin.Blazor.Client.Utils;
/// <summary>
/// Api 消息返回类
/// </summary>
public class R : R<object>
{
public R() : base()
{
}
public R(int code, string? message, object? data) : base(code, message, data)
{
}
#region result
/// <summary>
/// 返回消息
/// </summary>
/// <param name="code"></param>
/// <param name="message"></param>
/// <returns></returns>
public static R ResultMessage(HttpStatusCode code, string message)
=> new R((int)code, message, null);
/// <summary>
/// 返回数据
/// </summary>
/// <param name="code"></param>
/// <param name="data"></param>
/// <returns></returns>
public static R ResultData(HttpStatusCode code, object data)
=> new R((int)code, null, data);
/// <summary>
/// 可返回消息和数据
/// </summary>
/// <param name="code"></param>
/// <param name="message"></param>
/// <param name="data"></param>
/// <returns></returns>
public static R Result(HttpStatusCode code, string message, object data)
=> new R((int)code, message, data);
#endregion
#region result code int
/// <summary>
/// 返回消息
/// </summary>
/// <param name="code"></param>
/// <param name="message"></param>
/// <returns></returns>
public static R ResultMessage(int code, string message)
=> new R(code, message, null);
/// <summary>
/// 返回数据
/// </summary>
/// <param name="code"></param>
/// <param name="data"></param>
/// <returns></returns>
public static R ResultData(int code, object data)
=> new R(code, null, data);
/// <summary>
/// 可返回消息和数据
/// </summary>
/// <param name="code"></param>
/// <param name="message"></param>
/// <param name="data"></param>
/// <returns></returns>
public static R Result(int code, string message, object data)
=> new R(code, message, data);
#endregion
#region Ok
/// <summary>
/// 成功 可返回消息
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public static R OkMessage(string message)
=> ResultMessage(HttpStatusCode.OK, message);
/// <summary>
/// 成功 可返回数据
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static R OkData(object data)
=> ResultData(HttpStatusCode.OK, data);
/// <summary>
/// 成功 可返回 消息和数据
/// </summary>
/// <param name="message"></param>
/// <param name="data"></param>
/// <returns></returns>
public static R Ok(string message, object data)
=> Result(HttpStatusCode.OK, message, data);
#endregion
#region Error
/// <summary>
/// Error 可返回消息
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public static R ErrorMessage(string message)
=> ResultMessage(HttpStatusCode.InternalServerError, message);
/// <summary>
/// Error 可返回数据
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static R ErrorData(object data)
=> ResultData(HttpStatusCode.InternalServerError, data);
/// <summary>
/// Error 可返回 消息和数据
/// </summary>
/// <param name="message"></param>
/// <param name="data"></param>
/// <returns></returns>
public static R Error(string message, object data)
=> Result(HttpStatusCode.InternalServerError, message, data);
#endregion
}
/// <summary>
/// Api 消息返回类
/// </summary>
public class R<T>
{
public R()
{
}
public R(int code, string? message, T? data)
{
this.Code = code;
this.Message = message;
this.Data = data;
}
public int Code { get; set; }
public string? Message { get; set; }
public T? Data { get; set; }
}

View File

@ -0,0 +1,35 @@
namespace HZY.Admin.Blazor.Client.Utils;
/// <summary>
/// 工具
/// </summary>
public static class Tools
{
/// <summary>
/// 获取浏览器内存数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="jSRuntime"></param>
/// <param name="key"></param>
/// <returns></returns>
public static async Task<T> GetLocalStorageItemAsync<T>(this IJSRuntime jSRuntime, string key)
{
var token = await jSRuntime.InvokeAsync<T>("localStorage.getItem", key);
return token;
}
/// <summary>
/// 存储数据到浏览器
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="jSRuntime"></param>
/// <param name="key"></param>
/// <param name="data"></param>
/// <returns></returns>
public static async Task SetLocalStorageItemAsync<T>(this IJSRuntime jSRuntime, string key, T data)
{
await jSRuntime.InvokeAsync<T>("localStorage.setItem", key, JsonConvert.SerializeObject(data));
}
}

View File

@ -0,0 +1,11 @@
@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.AspNetCore.Components.WebAssembly.Http
@using Microsoft.JSInterop
@using HZY.Admin.Blazor.Client
@using HZY.Admin.Blazor.Client.Layout
@using AntDesign

View File

@ -0,0 +1,10 @@
[
{
"outputFile": "Pages/Login/Login.razor.css",
"inputFile": "Pages/Login/Login.razor.less"
},
{
"outputFile": "wwwroot/css/hzy-admin-ui-tools.css",
"inputFile": "wwwroot/css/hzy-admin-ui-tools.less"
}
]

View File

@ -0,0 +1,71 @@
{
"compilers": {
"less": {
"autoPrefix": "",
"cssComb": "none",
"ieCompat": true,
"math": null,
"strictMath": false,
"strictUnits": false,
"relativeUrls": true,
"rootPath": "",
"sourceMapRoot": "",
"sourceMapBasePath": "",
"sourceMap": false
},
"sass": {
"autoPrefix": "",
"loadPaths": "",
"style": "expanded",
"relativeUrls": true,
"sourceMap": false
},
"nodesass": {
"autoPrefix": "",
"includePath": "",
"indentType": "space",
"indentWidth": 2,
"outputStyle": "nested",
"precision": 5,
"relativeUrls": true,
"sourceMapRoot": "",
"lineFeed": "",
"sourceMap": false
},
"stylus": {
"sourceMap": false
},
"babel": {
"sourceMap": false
},
"coffeescript": {
"bare": false,
"runtimeMode": "node",
"sourceMap": false
},
"handlebars": {
"root": "",
"noBOM": false,
"name": "",
"namespace": "",
"knownHelpersOnly": false,
"forcePartial": false,
"knownHelpers": [],
"commonjs": "",
"amd": false,
"sourceMap": false
}
},
"minifiers": {
"css": {
"enabled": true,
"termSemicolons": true,
"gzip": false
},
"javascript": {
"enabled": true,
"termSemicolons": true,
"gzip": false
}
}
}

View File

@ -0,0 +1,103 @@
html, body {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
h1:focus {
outline: none;
}
a, .btn-link {
color: #0071c1;
}
.btn-primary {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
}
.content {
padding-top: 1.1rem;
}
.valid.modified:not([type=checkbox]) {
outline: 1px solid #26b050;
}
.invalid {
outline: 1px solid red;
}
.validation-message {
color: red;
}
#blazor-error-ui {
background: lightyellow;
bottom: 0;
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
display: none;
left: 0;
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
position: fixed;
width: 100%;
z-index: 1000;
}
#blazor-error-ui .dismiss {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}
.blazor-error-boundary {
background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
padding: 1rem 1rem 1rem 3.7rem;
color: white;
}
.blazor-error-boundary::after {
content: "An error has occurred."
}
.loading-progress {
position: relative;
display: block;
width: 8rem;
height: 8rem;
margin: 20vh auto 1rem auto;
}
.loading-progress circle {
fill: none;
stroke: #e0e0e0;
stroke-width: 0.6rem;
transform-origin: 50% 50%;
transform: rotate(-90deg);
}
.loading-progress circle:last-child {
stroke: #1b6ec2;
stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%;
transition: stroke-dasharray 0.05s ease-in-out;
}
.loading-progress-text {
position: absolute;
text-align: center;
font-weight: bold;
inset: calc(20vh + 3.25rem) 0 auto 0.2rem;
}
.loading-progress-text:after {
content: var(--blazor-load-percentage-text, "Loading");
}
code {
color: #c02d76;
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,114 @@
//工具样式库
/* 全局样式 */
// ======================================================text
.text-danger {
color: #F56C6C !important;
}
.text-blue {
color: #91d5ff !important;
}
.text-lime {
color: #d3f261 !important;
}
.text-cyan {
color: #87e8de !important;
}
.text-left {
text-align: left !important;
}
.text-right {
text-align: right !important;
}
.text-center {
text-align: center !important;
}
// ======================================================height / width
.h100 {
height: 100% !important;
}
.w100 {
width: 100% !important;
}
.bg-white {
background-color: #fff;
}
/*
循环
*/
.go_for(@count, @stylename, @name, @base) when (@count >=0) {
.@{name}-@{count} {
@{stylename}: @base * @count !important;
}
.go_for((@count - 1), (@stylename), (@name), @base);
}
/*
end
*/
// ======================================================padding
.go_for(100, padding, p, 1px);
.go_for(100, padding-left, pl, 1px);
.go_for(100, padding-top, pt, 1px);
.go_for(100, padding-bottom, pb, 1px);
.go_for(100, padding-right, pr, 1px);
//负数
.go_for(100, padding, p-, -1px);
.go_for(100, padding-left, pl-, -1px);
.go_for(100, padding-top, pt-, -1px);
.go_for(100, padding-bottom, pb-, -1px);
.go_for(100, padding-right, pr-, -1px);
// ======================================================margin
.go_for(100, margin, m, 1px);
.go_for(100, margin-left, ml, 1px);
.go_for(100, margin-top, mt, 1px);
.go_for(100, margin-bottom, mb, 1px);
.go_for(100, margin-right, mr, 1px);
//负数
.go_for(100, margin, m-, -1px);
.go_for(100, margin-left, ml-, -1px);
.go_for(100, margin-top, mt-, -1px);
.go_for(100, margin-bottom, mb-, -1px);
.go_for(100, margin-right, mr-, -1px);
// ======================================================font size
.go_for(100, font-size, fs, 1px);
// ======================================================Width
.go_for(100, width, w, 1px);
.go_for(100, width, w-, -1px);
// ======================================================Height
.go_for(100, height, h, 1px);
.go_for(100, height, h-, -1px);
// ======================================================Height
@media (max-width: 768px) {
.xs-hide {
display: none !important;
}
.logo {
width: 200px;
}
.xs-w100 {
width: 100% !important;
}
}
@media (min-width:768px) and (max-width: 1200px) {
.xs-w100 {
width: 85% !important;
}
}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 KiB

View File

@ -0,0 +1,37 @@
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>HZY.Admin.Blazor.Client</title>
<base href="/" />
<link rel="stylesheet" href="css/bootstrap/bootstrap.min.css" />
<link rel="stylesheet" href="css/app.css" />
<link rel="icon" type="image/png" href="favicon.png" />
<link href="HZY.Admin.Blazor.Client.styles.css" rel="stylesheet" />
</head>
<body>
<link href="/wwwroot/css/hzy-admin-ui-tools.min.css" rel="stylesheet">
<!-- blazor -->
<link href="_content/AntDesign/css/ant-design-blazor.css" rel="stylesheet">
<div id="app">
<svg class="loading-progress">
<circle r="40%" cx="50%" cy="50%" />
<circle r="40%" cx="50%" cy="50%" />
</svg>
<div class="loading-progress-text"></div>
</div>
<div id="blazor-error-ui">
An unhandled error has occurred.
<a href="" class="reload">Reload</a>
<a class="dismiss">🗙</a>
</div>
<script src="_framework/blazor.webassembly.js"></script>
<script src="_content/AntDesign/js/ant-design-blazor.js"></script>
</body>
</html>

View File

@ -0,0 +1,27 @@
[
{
"date": "2022-01-06",
"temperatureC": 1,
"summary": "Freezing"
},
{
"date": "2022-01-07",
"temperatureC": 14,
"summary": "Bracing"
},
{
"date": "2022-01-08",
"temperatureC": -13,
"summary": "Freezing"
},
{
"date": "2022-01-09",
"temperatureC": -16,
"summary": "Balmy"
},
{
"date": "2022-01-10",
"temperatureC": -2,
"summary": "Chilly"
}
]

2
admin-client/.env Normal file
View File

@ -0,0 +1,2 @@
VUE_APP_BASE=/ #打包路径 VUE_APP_ 开头的变量会被 webpack.DefinePlugin 静态嵌入到客户端侧的包中。你可以在应用的代码中这样访问它们
VITE_API_URL=https://steamcloud.shhuanmeng.com

View File

@ -0,0 +1,3 @@
VUE_APP_BASE=/ #打包路径
VITE_API_URL=http://127.0.0.1:802
# VITE_API_URL=https://steamcloud.shhuanmeng.com

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
<excludeFolder url="file://$MODULE_DIR$/temp" />
<excludeFolder url="file://$MODULE_DIR$/tmp" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/admin-client.iml" filepath="$PROJECT_DIR$/.idea/admin-client.iml" />
</modules>
</component>
</project>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

3
admin-client/.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"recommendations": ["Vue.volar"]
}

21
admin-client/LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2022 HZY
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

16
admin-client/README.md Normal file
View File

@ -0,0 +1,16 @@
# Vue 3 + TypeScript + Vite
This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
## Recommended IDE Setup
- [VS Code](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar)
## Type Support For `.vue` Imports in TS
Since TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates. However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can enable Volar's Take Over mode by following these steps:
1. Run `Extensions: Show Built-in Extensions` from VS Code's command palette, look for `TypeScript and JavaScript Language Features`, then right click and select `Disable (Workspace)`. By default, Take Over mode will enable itself if the default TypeScript extension is disabled.
2. Reload the VS Code window by running `Developer: Reload Window` from the command palette.
You can learn more about Take Over mode [here](https://github.com/johnsoncodehk/volar/discussions/471).

15
admin-client/dist/index.html vendored Normal file
View File

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="./vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>蒸汽云游</title>
<script type="module" crossorigin src="./static/js/index-D2_T1wn8.js"></script>
<link rel="stylesheet" crossorigin href="./static/css/index-DlxyC_yF.css">
</head>
<body>
<div id="app"></div>
</body>
</html>

View File

@ -0,0 +1 @@
iframe[data-v-51fc24e0]{width:100%;height:calc(100vh - 120px)}

View File

@ -0,0 +1 @@
.hzy-icon-list[data-v-e385b3df]{text-align:center}.hzy-icon-list .hzy-icon-show[data-v-e385b3df]{width:50px;height:50px;line-height:50px;border-radius:50%;background-color:#52c41a;display:inline-flex;align-items:center;justify-content:center}.hzy-icon-list .icon-list[data-v-e385b3df]{width:auto;overflow:hidden;overflow-y:auto}.hzy-icon-list .icon-list .icon-list-item[data-v-e385b3df]{overflow:hidden;width:220px;height:40px;margin:0 5px 15px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;border:1px solid #ccc}.hzy-icon-list .icon-list .icon-list-item[data-v-e385b3df]:hover,.hzy-icon-list .icon-list .active[data-v-e385b3df]{background-color:#52c41a;color:#fff}.hzy-icon-list ul[data-v-e385b3df]{margin:0;padding:0;list-style:none;display:flex}.hzy-icon-list ul li[data-v-e385b3df]{height:40px;line-height:40px;text-align:center;flex:1}.hzy-icon-list ul li.active[data-v-e385b3df]{border-bottom:2px solid #52c41a}.hzy-icon-list ul li[data-v-e385b3df]:hover{cursor:pointer;background-color:#52c41a;color:#fff}

View File

@ -0,0 +1 @@
.btns .ant-btn{margin:10px}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
a[data-v-4bc9bfa0]{font-size:25px}

View File

@ -0,0 +1 @@
.ant-btn-primary[data-v-2d8f8df2]{border-color:red;background:red}

View File

@ -0,0 +1 @@
.v3c[data-v-604e748c]{width:auto;border:1px solid #f5f7fa}.v3c-tab[data-v-604e748c]{padding:0;list-style:none;margin:0;background-color:#f5f7fa;display:flex}.v3c-tab-item[data-v-604e748c]{flex:1;text-align:center;cursor:pointer;padding:10px}.v3c-tab-item.v3c-active[data-v-604e748c]{background-color:#5b8ff9;color:#fff}.v3c-lang-btn[data-v-604e748c]{background-color:#61ddaa;color:#fff}.v3c-content[data-v-604e748c]{padding:20px;max-height:var(--a40de8bc);overflow:hidden;overflow-y:auto}.p-20[data-v-604e748c]{padding:20px}.v3c-footer[data-v-604e748c]{background-color:#f5f7fa;padding-top:10px;padding-bottom:10px;display:flex;text-align:center}.mt-20[data-v-604e748c]{margin-top:20px}.v3c input[type=text][data-v-604e748c]{width:80px}.v3c input[type=number][data-v-604e748c]{width:80px;height:28px;border:1px solid #d9d9d9}.v3c select[data-v-604e748c]{width:80px;height:32px;border:1px solid #d9d9d9}.v3c select[multiple][data-v-604e748c]{width:80px;height:100px;border:1px solid #d9d9d9}.btn-ok[data-v-604e748c]{line-height:1.5715;position:relative;display:inline-block;font-weight:400;white-space:nowrap;text-align:center;background-image:none;border:1px solid transparent;box-shadow:0 2px #00000004;cursor:pointer;transition:all .3s cubic-bezier(.645,.045,.355,1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;touch-action:manipulation;height:32px;padding:4px 15px;font-size:14px;border-radius:2px;color:#fff;background:#5b8ff9;border-color:#5b8ff9;text-shadow:0 -1px 0 rgb(0 0 0 / 12%);box-shadow:0 2px #0000000b}.btn-close[data-v-604e748c]{line-height:1.5715;position:relative;display:inline-block;font-weight:400;white-space:nowrap;text-align:center;background-image:none;border:1px solid transparent;box-shadow:0 2px #00000004;cursor:pointer;transition:all .3s cubic-bezier(.645,.045,.355,1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;touch-action:manipulation;height:32px;padding:4px 15px;font-size:14px;border-radius:2px;color:#fff;background:#61ddaa;border-color:#61ddaa;text-shadow:0 -1px 0 rgb(0 0 0 / 12%);box-shadow:0 2px #0000000b}.cron[data-v-604e748c]{background-color:#61ddaa;padding:5px 10px;color:#fff}

View File

@ -0,0 +1 @@
.ant-card-grid[data-v-aedeeb8a]{cursor:pointer;text-align:center}h1[data-v-aedeeb8a]{font-size:24px;font-weight:500}

View File

@ -0,0 +1 @@
.min-height[data-v-ff4c3585]{min-height:calc(100vh - 300px)}

View File

@ -0,0 +1 @@
.cell[data-v-9dcfe539]{position:absolute;left:0;top:0;bottom:0;right:0;color:#fff;display:flex;justify-content:center;align-items:center}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.hzy-layout .ant-layout-header{position:relative;z-index:6;width:100%;height:auto!important;line-height:normal!important}.hzy-layout .hzy-layout-header{padding:0;position:relative;display:flex;align-items:center;height:48px!important;transition:background-color .1s;-moz-transition:background-color .1s;-webkit-transition:background-color .1s;-o-transition:background-color .1s}.hzy-layout .hzy-layout-header .hzy-header-btn{padding:0 8px;cursor:pointer;height:100%;display:inline-flex;justify-content:center;align-items:center}.hzy-layout .hzy-layout-header .hzy-header-btn:hover{background:var(--68bf285a)}

View File

@ -0,0 +1 @@
iframe[data-v-3649fb62]{width:100%;height:calc(100vh - 90px)}

View File

@ -0,0 +1 @@
.hzy-logo{font-size:16px;overflow:hidden;display:flex;justify-content:center;align-items:center;min-height:50px}

View File

@ -0,0 +1 @@
.hzy-menu .ant-menu{border-inline-end:0!important}

View File

@ -0,0 +1 @@
.hzy-left-nav[data-v-edd062de]{background-color:#000;z-index:7;box-shadow:8px 0 2px #0000001a;width:var(--44807a38)}.hzy-left-nav ul[data-v-edd062de]{margin:0;padding:0;list-style:none}.hzy-left-nav ul li[data-v-edd062de]{text-align:center;cursor:pointer;color:#fff;padding:4px 0;margin:16px 8px;border-radius:4px}.hzy-left-nav ul .active[data-v-edd062de]{color:var(--35bf5c73)!important;transition:background-color .1s;-moz-transition:background-color .1s;-webkit-transition:background-color .1s;-o-transition:background-color .1s}.hzy-left-nav ul li[data-v-edd062de]:hover{color:var(--35bf5c73)!important}.hzy-one-nav[data-v-edd062de]{margin:0;padding:0;list-style:none;display:inline-flex}.hzy-one-nav li[data-v-edd062de]{text-align:center;cursor:pointer;justify-content:center;align-items:center;display:inline-flex;padding:0 8px}.hzy-one-nav li .menu-item[data-v-edd062de]{display:inline-flex;align-items:center;justify-content:center;height:32px;padding:2px 15px;border-radius:4px;transition:background-color .3s;-moz-transition:background-color .3s;-webkit-transition:background-color .3s;-o-transition:background-color .3s}.hzy-one-nav .active .menu-item[data-v-edd062de],.hzy-one-nav .menu-item[data-v-edd062de]:hover{color:var(--35bf5c73)!important}

View File

@ -0,0 +1 @@
.hzy-logo[data-v-377b21e8]{font-weight:700;font-size:20px;min-height:90px}

View File

@ -0,0 +1 @@
.hzy-layout .ant-layout .ant-layout-sider{overflow:auto;left:0;z-index:10}.hzy-layout .ant-layout .ant-layout-content{position:relative}.hzy-layout .ant-layout .hzy-header-content{position:fixed;z-index:9;right:0;top:0;padding:0}

View File

@ -0,0 +1 @@
.tabs .ant-tabs-content-holder .ant-tabs-content{height:100%}.hzy-layout .ant-layout .ant-layout-sider{overflow:auto;left:0;z-index:10}.hzy-layout .ant-layout .ant-layout-content{position:relative}.hzy-layout .ant-layout .hzy-header-content{position:fixed;z-index:9;right:0;top:0;padding:0}.hzy-layout .ant-layout .hzy-ground-glass{position:absolute;left:0;right:0;top:0;background-size:4px 4px;backdrop-filter:saturate(50%) blur(1px);-webkit-backdrop-filter:saturate(50%) blur(1px);box-shadow:0 4px 4px #00152914}

View File

@ -0,0 +1 @@
.hzy-settings .hzy-skin-list[data-v-8de701bf]{width:100%;display:flex;flex-wrap:wrap;justify-content:center}.hzy-settings .hzy-skin-list .hzy-skin-item[data-v-8de701bf]{width:40px;height:40px;margin:8px;cursor:pointer;border-radius:8px}

View File

@ -0,0 +1 @@
.hzy-tabs .ant-tabs-nav{margin:0!important}.hzy-tabs .ant-tabs-nav .ant-tabs-tab-active .close{visibility:visible!important}.hzy-tabs .ant-tabs-nav:before{border-bottom:0}.hzy-tabs .ant-tabs-tab .close{visibility:hidden}.hzy-tabs .ant-tabs-tab:hover .close{visibility:visible!important}.hzy-tabs .tab-more{position:absolute;margin-top:13px;left:18px;display:none}

View File

@ -0,0 +1 @@
body[data-v-701a73a3]{margin:0;padding:0;overflow:hidden}.login[data-v-701a73a3]{display:flex;justify-content:center;align-items:center;height:100vh;background:url(../jpg/login-1-DvL7JDPn.jpg) no-repeat;background-size:cover}.login .login-card[data-v-701a73a3]{height:600px;width:1000px;box-shadow:0 16px 48px 16px #000000b8,0 12px 32px #000,0 8px 16px -8px #000;display:flex;border-radius:5px}.login .login-card .flex-left[data-v-701a73a3]{flex:1;width:450px}.login .login-card .flex-left img[data-v-701a73a3]{height:100%}.login .login-card .flex-right[data-v-701a73a3]{flex:1;background-color:#fff;display:flex;justify-content:center;flex-direction:column;border-top-right-radius:5px;border-bottom-right-radius:5px}.login .login-card .title[data-v-701a73a3]{text-align:center;font-size:30px;padding:20px;font-weight:700}.login .login-card .el-input-group__append[data-v-701a73a3]{padding:0!important}.login .login-card .el-input-group__append .login-code[data-v-701a73a3]{height:38px}@media (max-width: 1024px){.flex-left[data-v-701a73a3]{display:none;flex:0!important}.flex-left img[data-v-701a73a3]{height:auto!important;width:80%!important}.flex-right[data-v-701a73a3]{border-radius:5px}}@media (min-width: 600px) and (max-width: 1024px){.login-card[data-v-701a73a3]{width:70%!important}}@media (max-width: 600px){.login-card[data-v-701a73a3]{width:100%!important}}.lang-content[data-v-701a73a3]{position:absolute;right:24px;top:20px}

View File

@ -0,0 +1 @@
iframe[data-v-e44ffa85]{width:100%;height:calc(100vh - 120px)}

View File

@ -0,0 +1 @@
iframe[data-v-86fc71bb]{width:100%;height:calc(100vh - 120px)}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.icon{display:flex;justify-content:center}

View File

@ -0,0 +1 @@
.work-order .icon-size{font-size:70px}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.el-checkbox-group{font-size:0;line-height:0}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.certain-category-search-dropdown .ant-select-dropdown-menu-item-group-title[data-v-21c7bbc3]{color:#666;font-weight:700}.certain-category-search-dropdown .ant-select-dropdown-menu-item-group[data-v-21c7bbc3]{border-bottom:1px solid #f6f6f6}.certain-category-search-dropdown .ant-select-dropdown-menu-item[data-v-21c7bbc3]{padding-left:16px}.certain-category-search-dropdown .ant-select-dropdown-menu-item.show-all[data-v-21c7bbc3]{text-align:center;cursor:default}.certain-category-search-dropdown .ant-select-dropdown-menu[data-v-21c7bbc3]{max-height:300px}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.el-checkbox-button{--el-checkbox-button-checked-bg-color:var(--el-color-primary);--el-checkbox-button-checked-text-color:var(--el-color-white);--el-checkbox-button-checked-border-color:var(--el-color-primary);display:inline-block;position:relative}.el-checkbox-button__inner{-webkit-appearance:none;background:var(--el-button-bg-color,var(--el-fill-color-blank));border:var(--el-border);border-left-color:transparent;border-radius:0;box-sizing:border-box;color:var(--el-button-text-color,var(--el-text-color-regular));cursor:pointer;display:inline-block;font-size:var(--el-font-size-base);font-weight:var(--el-checkbox-font-weight);line-height:1;margin:0;outline:none;padding:8px 15px;position:relative;text-align:center;transition:var(--el-transition-all);-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.el-checkbox-button__inner.is-round{padding:8px 15px}.el-checkbox-button__inner:hover{color:var(--el-color-primary)}.el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.el-checkbox-button__original{margin:0;opacity:0;outline:none;position:absolute;z-index:-1}.el-checkbox-button.is-checked .el-checkbox-button__inner{background-color:var(--el-checkbox-button-checked-bg-color);border-color:var(--el-checkbox-button-checked-border-color);box-shadow:-1px 0 0 0 var(--el-color-primary-light-7);color:var(--el-checkbox-button-checked-text-color)}.el-checkbox-button.is-checked:first-child .el-checkbox-button__inner{border-left-color:var(--el-checkbox-button-checked-border-color)}.el-checkbox-button.is-disabled .el-checkbox-button__inner{background-color:var(--el-button-disabled-bg-color,var(--el-fill-color-blank));background-image:none;border-color:var(--el-button-disabled-border-color,var(--el-border-color-light));box-shadow:none;color:var(--el-disabled-text-color);cursor:not-allowed}.el-checkbox-button.is-disabled:first-child .el-checkbox-button__inner{border-left-color:var(--el-button-disabled-border-color,var(--el-border-color-light))}.el-checkbox-button:first-child .el-checkbox-button__inner{border-bottom-left-radius:var(--el-border-radius-base);border-left:var(--el-border);border-top-left-radius:var(--el-border-radius-base);box-shadow:none!important}.el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:var(--el-checkbox-button-checked-border-color)}.el-checkbox-button:last-child .el-checkbox-button__inner{border-bottom-right-radius:var(--el-border-radius-base);border-top-right-radius:var(--el-border-radius-base)}.el-checkbox-button--large .el-checkbox-button__inner{border-radius:0;font-size:var(--el-font-size-base);padding:12px 19px}.el-checkbox-button--large .el-checkbox-button__inner.is-round{padding:12px 19px}.el-checkbox-button--small .el-checkbox-button__inner{border-radius:0;font-size:12px;padding:5px 11px}.el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:5px 11px}

View File

@ -0,0 +1 @@
.el-image__error,.el-image__inner,.el-image__placeholder,.el-image__wrapper{height:100%;width:100%}.el-image{display:inline-block;overflow:hidden;position:relative}.el-image__inner{opacity:1;vertical-align:top}.el-image__inner.is-loading{opacity:0}.el-image__wrapper{left:0;position:absolute;top:0}.el-image__error,.el-image__placeholder{background:var(--el-fill-color-light)}.el-image__error{align-items:center;color:var(--el-text-color-placeholder);display:flex;font-size:14px;justify-content:center;vertical-align:middle}.el-image__preview{cursor:pointer}.el-image-viewer__wrapper{bottom:0;left:0;position:fixed;right:0;top:0}.el-image-viewer__btn{align-items:center;border-radius:50%;box-sizing:border-box;cursor:pointer;display:flex;justify-content:center;opacity:.8;position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:1}.el-image-viewer__btn .el-icon{cursor:pointer;font-size:inherit}.el-image-viewer__close{font-size:40px;height:40px;right:40px;top:40px;width:40px}.el-image-viewer__canvas{align-items:center;display:flex;height:100%;justify-content:center;position:static;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.el-image-viewer__actions{background-color:var(--el-text-color-regular);border-color:#fff;border-radius:22px;bottom:30px;height:44px;left:50%;padding:0 23px;transform:translate(-50%);width:282px}.el-image-viewer__actions__inner{align-items:center;color:#fff;cursor:default;display:flex;font-size:23px;height:100%;justify-content:space-around;width:100%}.el-image-viewer__prev{left:40px}.el-image-viewer__next,.el-image-viewer__prev{background-color:var(--el-text-color-regular);border-color:#fff;color:#fff;font-size:24px;height:44px;top:50%;transform:translateY(-50%);width:44px}.el-image-viewer__next{right:40px;text-indent:2px}.el-image-viewer__close{background-color:var(--el-text-color-regular);border-color:#fff;color:#fff;font-size:24px;height:44px;width:44px}.el-image-viewer__mask{background:#000;height:100%;left:0;opacity:.5;position:absolute;top:0;width:100%}.viewer-fade-enter-active{animation:viewer-fade-in var(--el-transition-duration)}.viewer-fade-leave-active{animation:viewer-fade-out var(--el-transition-duration)}@keyframes viewer-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@keyframes viewer-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 KiB

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