Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp

# Conflicts:
#	.gitignore
#	Yi.Abp.Net8/src/Yi.Abp.Web/Logs/log-20231214.txt
This commit is contained in:
陈淳
2023-12-15 18:28:01 +08:00
29 changed files with 2673 additions and 1864 deletions

View File

@@ -70,19 +70,22 @@ namespace Yi.Framework.SqlSugarCore
private void CodeFirst(IServiceProvider service)
{
var moduleContainer = service.GetRequiredService<IModuleContainer>();
var db = service.GetRequiredService<ISqlSugarDbContext>().SqlSugarClient;
var moduleContainer = service.GetRequiredService<IModuleContainer>();
var db = service.GetRequiredService<ISqlSugarDbContext>().SqlSugarClient;
//尝试创建数据库
db.DbMaintenance.CreateDatabase();
List<Type> types = new List<Type>();
foreach (var module in moduleContainer.Modules)
{
types.AddRange(module.Assembly.GetTypes().Where(x => x.GetCustomAttribute<SugarTable>() != null).Where(x => x.GetCustomAttribute<SplitTableAttribute>() is null));
}
if (types.Count > 0)
{
db.CodeFirst.InitTables(types.ToArray());
}
List<Type> types = new List<Type>();
foreach (var module in moduleContainer.Modules)
{
types.AddRange(module.Assembly.GetTypes().Where(x => x.GetCustomAttribute<SugarTable>() != null).Where(x => x.GetCustomAttribute<SplitTableAttribute>() is null));
}
if (types.Count > 0)
{
db.CodeFirst.InitTables(types.ToArray());
}
}
private async Task DataSeedAsync(IServiceProvider service)

View File

@@ -12,7 +12,7 @@ namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss
public string Content { get; set; }
public string? Color { get; set; }
public List<Guid> PermissionUserIds { get; set; }
public List<Guid>? PermissionUserIds { get; set; }
public DiscussPermissionTypeEnum PermissionType { get; set; }

View File

@@ -55,7 +55,7 @@ namespace Yi.Framework.Bbs.Application.Services
/// <summary>
/// 获取文章全部平铺信息
/// 获取文章全部树级信息
/// </summary>
/// <param name="discussId"></param>
/// <returns></returns>

View File

@@ -0,0 +1,214 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
using Yi.Framework.Rbac.Domain.Entities;
using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Framework.Bbs.SqlSugarCore.DataSeeds
{
public class BbsDictionaryDataSeed : IDataSeedContributor, ITransientDependency
{
private ISqlSugarRepository<DictionaryEntity> _repository;
private ISqlSugarRepository<DictionaryTypeEntity> _typeRepository;
public BbsDictionaryDataSeed(ISqlSugarRepository<DictionaryEntity> repository, ISqlSugarRepository<DictionaryTypeEntity> typeRepository) {
_repository=repository;
_typeRepository=typeRepository;
}
public async Task SeedAsync(DataSeedContext context)
{
if (!await _typeRepository.IsAnyAsync(x => x.DictType== "bbs_type_lable"))
{
await _typeRepository.InsertManyAsync(GetSeedDictionaryTypeData());
await _repository.InsertManyAsync(GetSeedDictionaryData());
}
}
public List<DictionaryEntity> GetSeedDictionaryData()
{
List<DictionaryEntity> entities = new List<DictionaryEntity>();
DictionaryEntity dictInfo1 = new DictionaryEntity()
{
DictLabel = "前端",
DictValue = "0",
DictType = "bbs_type_lable",
OrderNum = 100,
Remark = "",
IsDeleted = false,
State = true
};
entities.Add(dictInfo1);
DictionaryEntity dictInfo2 = new DictionaryEntity()
{
DictLabel = "后端",
DictValue = "1",
DictType = "bbs_type_lable",
OrderNum = 99,
Remark = "",
IsDeleted = false,
State = true
};
entities.Add(dictInfo2);
DictionaryEntity dictInfo3 = new DictionaryEntity()
{
DictLabel = "运维",
DictValue = "2",
DictType = "bbs_type_lable",
OrderNum = 98,
Remark = "",
IsDeleted = false,
State = true
};
entities.Add(dictInfo3);
DictionaryEntity dictInfo4 = new DictionaryEntity()
{
DictLabel = "测试",
DictValue = "3",
DictType = "bbs_type_lable",
OrderNum = 97,
Remark = "",
IsDeleted = false,
State = true
};
entities.Add(dictInfo4);
DictionaryEntity dictInfo5 = new DictionaryEntity()
{
DictLabel = "UI",
DictValue = "4",
DictType = "bbs_type_lable",
OrderNum = 96,
Remark = "",
IsDeleted = false,
State = true
};
entities.Add(dictInfo5);
DictionaryEntity dictInfo6 = new DictionaryEntity()
{
DictLabel = "产品",
DictValue = "5",
DictType = "bbs_type_lable",
OrderNum = 95,
Remark = "",
IsDeleted = false,
State = true
};
entities.Add(dictInfo6);
DictionaryEntity dictInfo7 = new DictionaryEntity()
{
DictLabel = "项目",
DictValue = "6",
DictType = "bbs_type_lable",
OrderNum = 94,
Remark = "",
IsDeleted = false,
State = true
};
entities.Add(dictInfo7);
DictionaryEntity dictInfo8 = new DictionaryEntity()
{
DictLabel = "C#",
DictValue = "7",
DictType = "bbs_type_lable",
OrderNum = 93,
Remark = "",
IsDeleted = false,
State = true
};
entities.Add(dictInfo8);
DictionaryEntity dictInfo9 = new DictionaryEntity()
{
DictLabel = ".Net",
DictValue = "8",
DictType = "bbs_type_lable",
OrderNum = 92,
Remark = "",
IsDeleted = false,
State = true
};
entities.Add(dictInfo9);
DictionaryEntity dictInfo10 = new DictionaryEntity()
{
DictLabel = ".NetCore",
DictValue = "9",
DictType = "bbs_type_lable",
OrderNum = 91,
Remark = "",
IsDeleted = false,
State = true
};
entities.Add(dictInfo10);
DictionaryEntity dictInfo11 = new DictionaryEntity()
{
DictLabel = "Asp.NetCore",
DictValue = "10",
DictType = "bbs_type_lable",
OrderNum = 90,
Remark = "",
IsDeleted = false,
State = true
};
entities.Add(dictInfo11);
DictionaryEntity dictInfo12 = new DictionaryEntity()
{
DictLabel = "Abp.vNext",
DictValue = "11",
DictType = "bbs_type_lable",
OrderNum = 89,
Remark = "",
IsDeleted = false,
State = true
};
entities.Add(dictInfo12);
return entities;
}
public List<DictionaryTypeEntity> GetSeedDictionaryTypeData()
{
List<DictionaryTypeEntity> entities = new List<DictionaryTypeEntity>();
DictionaryTypeEntity dict1 = new DictionaryTypeEntity()
{
DictName = "BBS类型标签",
DictType = "bbs_type_lable",
OrderNum = 200,
Remark = "BBS类型标签",
IsDeleted = false,
State = true
};
entities.Add(dict1);
return entities;
}
}
}

View File

@@ -0,0 +1,94 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SqlSugar.DistributedSystem.Snowflake;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Guids;
using Yi.Framework.Rbac.Domain.Entities;
using Yi.Framework.Rbac.Domain.Shared.Enums;
using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Framework.Bbs.SqlSugarCore.DataSeeds
{
public class BbsMenuDataSeed : IDataSeedContributor, ITransientDependency
{
private IGuidGenerator _guidGenerator;
private ISqlSugarRepository<MenuEntity, Guid> _repository;
public BbsMenuDataSeed(ISqlSugarRepository<MenuEntity,Guid> repository, IGuidGenerator guidGenerator)
{
_repository=repository;
_guidGenerator=guidGenerator;
}
public async Task SeedAsync(DataSeedContext context)
{
if (!await _repository.IsAnyAsync(x => x.MenuName == "BBS"))
{
await _repository.InsertManyAsync(GetSeedData());
}
}
public List<MenuEntity> GetSeedData()
{
List<MenuEntity> entities = new List<MenuEntity>();
//BBS
MenuEntity bbs = new MenuEntity(_guidGenerator.Create())
{
MenuName = "BBS",
MenuType = MenuTypeEnum.Catalogue,
Router = "/bbs",
IsShow = true,
IsLink = false,
MenuIcon = "monitor",
OrderNum = 91,
IsDeleted = false
};
entities.Add(bbs);
//板块管理
MenuEntity plate = new MenuEntity(_guidGenerator.Create())
{
MenuName = "板块管理",
PermissionCode = "bbs:plate:list",
MenuType = MenuTypeEnum.Menu,
Router = "plate",
IsShow = true,
IsLink = false,
IsCache = true,
Component = "bbs/plate/index",
MenuIcon = "component",
OrderNum = 100,
ParentId = bbs.Id,
IsDeleted = false
};
entities.Add(plate);
//文章管理
MenuEntity article = new MenuEntity(_guidGenerator.Create())
{
MenuName = "文章管理",
PermissionCode = "bbs:article:list",
MenuType = MenuTypeEnum.Menu,
Router = "article",
IsShow = true,
IsLink = false,
IsCache = true,
Component = "bbs/article/index",
MenuIcon = "documentation",
OrderNum = 99,
ParentId = bbs.Id,
IsDeleted = false
};
entities.Add(article);
return entities;
}
}
}

View File

@@ -15,7 +15,7 @@ namespace Yi.Framework.Bbs.SqlSugarCore.Repositories
public async Task<List<ArticleEntity>> GetTreeAsync(Expression<Func<ArticleEntity, bool>> where)
{
return await _DbQueryable.Where(where).ToTreeAsync(x => x.Children, x => x.ParentId, 0);
return await _DbQueryable.Where(where).ToTreeAsync(x => x.Children, x => x.ParentId, Guid.Empty);
}
}
}

View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Rbac.Application.FileManger
{
public class FileGetListOutputDto:EntityDto<Guid>
{
}
}

View File

@@ -0,0 +1,12 @@
using Microsoft.AspNetCore.Http;
using Volo.Abp.Application.Services;
using Yi.Framework.Rbac.Application.FileManger;
namespace Yi.Framework.Rbac.Application.Contracts.IServices
{
public interface IFileService : IApplicationService
{
Task<string> GetReturnPathAsync(Guid code, bool? isThumbnail);
Task<List<FileGetListOutputDto>> Post(IFormFileCollection file);
}
}

View File

@@ -0,0 +1,142 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Mapster;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Guids;
using Yi.Framework.Core.Enums;
using Yi.Framework.Core.Helper;
using Yi.Framework.Rbac.Application.Contracts.IServices;
using Yi.Framework.Rbac.Application.FileManger;
using Yi.Framework.Rbac.Domain.Entities;
namespace Yi.Framework.Rbac.Application.Services
{
public class FileService : ApplicationService, IFileService
{
private readonly IRepository<FileAggregateRoot> _repository;
private readonly HttpContext _httpContext;
private IGuidGenerator _guidGenerator;
public FileService(IRepository<FileAggregateRoot> repository, IHttpContextAccessor httpContextAccessor, IGuidGenerator guidGenerator)
{
_guidGenerator = guidGenerator;
_repository = repository;
_httpContext = httpContextAccessor.HttpContext;
}
/// <summary>
/// 下载文件,是否缩略图
/// </summary>
/// <returns></returns>
[Route("file/{code}/{isThumbnail?}")]
public async Task<IActionResult> Get([FromRoute] Guid code, [FromRoute] bool? isThumbnail)
{
var path = await GetReturnPathAsync(code, isThumbnail);
var steam = await File.ReadAllBytesAsync(path);
//考虑从路径中获取
var fileContentType = MimeHelper.GetMimeMapping(Path.GetFileName(path));
//设置附件下载,下载名称
//_httpContext.FileAttachmentHandle(file.FileName);
return new FileContentResult(steam, fileContentType ?? @"text/plain");
}
public async Task<string> GetReturnPathAsync(Guid code, bool? isThumbnail)
{
var file = await _repository.GetAsync(x => x.Id == code);
if (file is null)
{
throw new UserFriendlyException("文件编号未匹配", "404");
}
var path = file.FilePath;
//如果为缩略图,需要修改路径
if (isThumbnail is true)
{
path = $"wwwroot/{FileTypeEnum.Thumbnail}/{file.Id}{Path.GetExtension(file.FileName)}";
}
//路径为: 文件路径/文件id+文件扩展名
if (!File.Exists(path))
{
throw new UserFriendlyException("本地文件不存在", "404");
}
return path;
}
/// <summary>
/// 上传文件
/// </summary>
/// <returns></returns>
public async Task<List<FileGetListOutputDto>> Post([FromForm] IFormFileCollection file)
{
if (file.Count() == 0)
{
throw new ArgumentException("文件上传为空!");
}
//批量插入
List<FileAggregateRoot> entities = new();
foreach (var f in file)
{
FileAggregateRoot data = new(_guidGenerator.Create());
data.FileSize = (decimal)f.Length / 1024;
data.FileName = f.FileName;
var type = MimeHelper.GetFileType(f.FileName);
//落盘文件文件名为雪花id+自己的扩展名
string filename = data.Id.ToString() + Path.GetExtension(f.FileName);
string typePath = $"wwwroot/{type}";
if (!Directory.Exists(typePath))
{
Directory.CreateDirectory(typePath);
}
var filePath = Path.Combine(typePath, filename);
data.FilePath = filePath;
//生成文件
using (var stream = new FileStream(filePath, FileMode.CreateNew, FileAccess.ReadWrite))
{
await f.CopyToAsync(stream);
//如果是图片类型,还需要生成缩略图,当然,如果图片很小,直接复制过去即可
if (FileTypeEnum.Image.Equals(type))
{
string thumbnailPath = $"wwwroot/{FileTypeEnum.Thumbnail}";
if (!Directory.Exists(thumbnailPath))
{
Directory.CreateDirectory(thumbnailPath);
}
string thumbnailFilePath = Path.Combine(thumbnailPath, filename);
try
{
// _imageSharpManager.ImageCompress(f.FileName, f.OpenReadStream(), thumbnailFilePath);
}
catch
{
var result = new byte[stream.Length];
await stream.ReadAsync(result, 0, result.Length);
await File.WriteAllBytesAsync(thumbnailFilePath, result);
}
}
};
entities.Add(data);
}
await _repository.InsertManyAsync(entities);
return entities.Adapt<List<FileGetListOutputDto>>();
}
}
}

View File

@@ -1,5 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<ItemGroup>
<Compile Remove="Events\**" />
<EmbeddedResource Remove="Events\**" />
<None Remove="Events\**" />
</ItemGroup>
<ItemGroup>
@@ -15,8 +20,4 @@
<ProjectReference Include="..\Yi.Framework.Rbac.Domain\Yi.Framework.Rbac.Domain.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Events\" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SqlSugar;
using Volo.Abp.Auditing;
using Volo.Abp.Domain.Entities;
namespace Yi.Framework.Rbac.Domain.Entities
{
public class FileAggregateRoot : AggregateRoot<Guid>, IAuditedObject
{
public FileAggregateRoot()
{
}
public FileAggregateRoot(Guid fileId)
{
this.Id = fileId;
}
[SugarColumn(IsPrimaryKey = true)]
public override Guid Id { get; protected set; }
/// <summary>
/// 文件大小
///</summary>
[SugarColumn(ColumnName = "FileSize")]
public decimal FileSize { get; set; }
/// <summary>
/// 文件名
///</summary>
[SugarColumn(ColumnName = "FileName")]
public string FileName { get; set; }
/// <summary>
/// 文件路径
///</summary>
[SugarColumn(ColumnName = "FilePath")]
public string FilePath { get; set; }
public DateTime CreationTime { get; set; }
public Guid? CreatorId { get; set; }
public Guid? LastModifierId { get; set; }
public DateTime? LastModificationTime { get; set; }
}
}

View File

@@ -652,7 +652,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds
IsCache = true,
Component = "system/role/index",
MenuIcon = "peoples",
OrderNum = 100,
OrderNum = 99,
ParentId = system.Id,
IsDeleted = false
};
@@ -720,7 +720,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds
IsCache = true,
Component = "system/menu/index",
MenuIcon = "tree-table",
OrderNum = 100,
OrderNum = 98,
ParentId = system.Id,
IsDeleted = false
};
@@ -787,7 +787,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds
IsCache = true,
Component = "system/dept/index",
MenuIcon = "tree",
OrderNum = 100,
OrderNum = 97,
ParentId = system.Id,
IsDeleted = false
};
@@ -856,7 +856,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds
IsCache = true,
Component = "system/post/index",
MenuIcon = "post",
OrderNum = 100,
OrderNum = 96,
ParentId = system.Id,
IsDeleted = false
};
@@ -923,7 +923,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds
IsCache = true,
Component = "system/dict/index",
MenuIcon = "dict",
OrderNum = 100,
OrderNum = 95,
ParentId = system.Id,
IsDeleted = false
};
@@ -991,7 +991,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds
IsCache = true,
Component = "system/config/index",
MenuIcon = "edit",
OrderNum = 100,
OrderNum = 94,
ParentId = system.Id,
IsDeleted = false
};
@@ -1058,7 +1058,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds
IsShow = true,
IsLink = false,
MenuIcon = "log",
OrderNum = 100,
OrderNum = 93,
ParentId = system.Id,
IsDeleted = false
};

View File

@@ -73,7 +73,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.Repositories
user.Roles = new List<RoleEntity>();
userRoleMenu.User = user.Adapt<UserDto>();
userRoleMenu.Menus = userRoleMenu.Menus.OrderByDescending(x => x.OrderNum).ToHashSet();
return userRoleMenu;
}
}

View File

@@ -0,0 +1,84 @@
2023-12-15 00:10:51.343 +08:00 [INF] Yi框架-Abp.vNext启动
2023-12-15 00:10:57.118 +08:00 [INF] Loaded ABP modules:
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Abp.Web.YiAbpWebModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Abp.SqlsugarCore.YiAbpSqlSugarCoreModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Abp.Domain.YiAbpDomainModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Abp.Domain.Shared.YiAbpDomainSharedModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Rbac.Domain.Shared.YiFrameworkRbacDomainSharedModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Data.AbpDataModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Mapster.YiFrameworkMapsterModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Core.YiFrameworkCoreModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Bbs.Domain.Shared.YiFrameworkBbsDomainSharedModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Rbac.Domain.YiFrameworkRbacDomainModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.AspNetCore.SignalR.AbpAspNetCoreSignalRModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Bbs.Domain.YiFrameworkBbsDomainModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Rbac.SqlSugarCore.YiFrameworkRbacSqlSugarCoreModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.SqlSugarCore.YiFrameworkSqlSugarCoreModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Bbs.SqlSugarCore.YiFrameworkBbsSqlSugarCoreModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Abp.Application.YiAbpApplicationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Abp.Application.Contracts.YiAbpApplicationContractsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Rbac.Application.Contracts.YiFrameworkRbacApplicationContractsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Ddd.Application.Contracts.YiFrameworkDddApplicationContractsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Bbs.Application.Contracts.YiFrameworkBbsApplicationContractsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Rbac.Application.YiFrameworkRbacApplicationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Ddd.Application.YiFrameworkDddApplicationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.BackgroundWorkers.Quartz.AbpBackgroundWorkersQuartzModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Quartz.AbpQuartzModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Bbs.Application.YiFrameworkBbsApplicationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.UI.AbpUiModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule
2023-12-15 00:10:57.121 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule
2023-12-15 00:10:57.121 +08:00 [INF] - Volo.Abp.AspNetCore.Authentication.JwtBearer.AbpAspNetCoreAuthenticationJwtBearerModule
2023-12-15 00:10:57.121 +08:00 [INF] - Yi.Framework.AspNetCore.YiFrameworkAspNetCoreModule
2023-12-15 00:10:58.044 +08:00 [INF] User profile is available. Using 'C:\Users\45431\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest.
2023-12-15 00:10:58.208 +08:00 [INF] Initialized all ABP modules.
2023-12-15 00:10:58.431 +08:00 [INF] Now listening on: http://[::]:19001
2023-12-15 00:10:58.431 +08:00 [INF] Application started. Press Ctrl+C to shut down.
2023-12-15 00:10:58.431 +08:00 [INF] Hosting environment: Development
2023-12-15 00:10:58.431 +08:00 [INF] Content root path: D:\CSharp\Yi\Yi.Abp.Net8\src\Yi.Abp.Web

View File

@@ -1,4 +1,5 @@
# 接口前缀
VITE_APP_BASEAPI="/api-dev"
VITE_APP_URL="http://123.207.63.87:19001/api/app"
# VITE_APP_URL="http://localhost:19001/api/app"
VITE_APP_ENV_NAME = "dev"

View File

@@ -1,4 +1,4 @@
# 接口前缀
VITE_APP_BASEAPI="/prod-api"
VITE_APP_URL="http://123.207.63.87:19001/api/app"
VITE_APP_ENV_NAME = "production"
VITE_APP_ENV_NAME = "pro"

View File

@@ -19,10 +19,12 @@
"mavon-editor": "^3.0.0",
"nprogress": "^0.2.0",
"pinia": "^2.0.32",
"pinia-plugin-persistedstate": "^3.2.0",
"vue": "^3.2.47",
"vue-cropper": "1.0.3",
"vue-router": "^4.1.6",
"yarm": "^0.4.0"
"yarm": "^0.4.0",
"yarn": "^1.22.21"
},
"devDependencies": {
"@vitejs/plugin-vue": "^4.0.0",
@@ -30,7 +32,8 @@
"sass": "1.52.1",
"unplugin-auto-import": "^0.15.0",
"unplugin-vue-components": "^0.24.0",
"vite": "^4.1.3"
"vite": "^4.1.3",
"vite-plugin-require-transform": "^1.0.21"
}
},
"node_modules/@ampproject/remapping": {
@@ -53,12 +56,13 @@
"dev": true
},
"node_modules/@babel/code-frame": {
"version": "7.18.6",
"resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz",
"integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
"version": "7.23.5",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/code-frame/-/code-frame-7.23.5.tgz",
"integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
"dev": true,
"dependencies": {
"@babel/highlight": "^7.18.6"
"@babel/highlight": "^7.23.4",
"chalk": "^2.4.2"
},
"engines": {
"node": ">=6.9.0"
@@ -109,12 +113,12 @@
}
},
"node_modules/@babel/generator": {
"version": "7.21.1",
"resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.21.1.tgz",
"integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==",
"version": "7.23.6",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/generator/-/generator-7.23.6.tgz",
"integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
"dev": true,
"dependencies": {
"@babel/types": "^7.21.0",
"@babel/types": "^7.23.6",
"@jridgewell/gen-mapping": "^0.3.2",
"@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
@@ -181,34 +185,34 @@
"dev": true
},
"node_modules/@babel/helper-environment-visitor": {
"version": "7.18.9",
"resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
"integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
"version": "7.22.20",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
"integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-function-name": {
"version": "7.21.0",
"resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
"integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
"version": "7.23.0",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
"integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
"dev": true,
"dependencies": {
"@babel/template": "^7.20.7",
"@babel/types": "^7.21.0"
"@babel/template": "^7.22.15",
"@babel/types": "^7.23.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-hoist-variables": {
"version": "7.18.6",
"resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
"integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
"version": "7.22.5",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
"integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
"dev": true,
"dependencies": {
"@babel/types": "^7.18.6"
"@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
@@ -258,30 +262,30 @@
}
},
"node_modules/@babel/helper-split-export-declaration": {
"version": "7.18.6",
"resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
"integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
"version": "7.22.6",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
"integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
"dev": true,
"dependencies": {
"@babel/types": "^7.18.6"
"@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser": {
"version": "7.19.4",
"resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
"integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
"version": "7.23.4",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
"integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.19.1",
"resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
"integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
"version": "7.22.20",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
"dev": true,
"engines": {
"node": ">=6.9.0"
@@ -311,13 +315,13 @@
}
},
"node_modules/@babel/highlight": {
"version": "7.18.6",
"resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz",
"integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
"version": "7.23.4",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/highlight/-/highlight-7.23.4.tgz",
"integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
"dev": true,
"dependencies": {
"@babel/helper-validator-identifier": "^7.18.6",
"chalk": "^2.0.0",
"@babel/helper-validator-identifier": "^7.22.20",
"chalk": "^2.4.2",
"js-tokens": "^4.0.0"
},
"engines": {
@@ -325,9 +329,9 @@
}
},
"node_modules/@babel/parser": {
"version": "7.21.2",
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.21.2.tgz",
"integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==",
"version": "7.23.6",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/parser/-/parser-7.23.6.tgz",
"integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==",
"bin": {
"parser": "bin/babel-parser.js"
},
@@ -345,34 +349,34 @@
}
},
"node_modules/@babel/template": {
"version": "7.20.7",
"resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.20.7.tgz",
"integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
"version": "7.22.15",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/template/-/template-7.22.15.tgz",
"integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.18.6",
"@babel/parser": "^7.20.7",
"@babel/types": "^7.20.7"
"@babel/code-frame": "^7.22.13",
"@babel/parser": "^7.22.15",
"@babel/types": "^7.22.15"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
"version": "7.21.2",
"resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.21.2.tgz",
"integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==",
"version": "7.23.6",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/traverse/-/traverse-7.23.6.tgz",
"integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.18.6",
"@babel/generator": "^7.21.1",
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-function-name": "^7.21.0",
"@babel/helper-hoist-variables": "^7.18.6",
"@babel/helper-split-export-declaration": "^7.18.6",
"@babel/parser": "^7.21.2",
"@babel/types": "^7.21.2",
"debug": "^4.1.0",
"@babel/code-frame": "^7.23.5",
"@babel/generator": "^7.23.6",
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-function-name": "^7.23.0",
"@babel/helper-hoist-variables": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
"@babel/parser": "^7.23.6",
"@babel/types": "^7.23.6",
"debug": "^4.3.1",
"globals": "^11.1.0"
},
"engines": {
@@ -380,13 +384,13 @@
}
},
"node_modules/@babel/types": {
"version": "7.21.2",
"resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.21.2.tgz",
"integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==",
"version": "7.23.6",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/types/-/types-7.23.6.tgz",
"integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==",
"dev": true,
"dependencies": {
"@babel/helper-string-parser": "^7.19.4",
"@babel/helper-validator-identifier": "^7.19.1",
"@babel/helper-string-parser": "^7.23.4",
"@babel/helper-validator-identifier": "^7.22.20",
"to-fast-properties": "^2.0.0"
},
"engines": {
@@ -1524,7 +1528,7 @@
},
"node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
"resolved": "https://mirrors.cloud.tencent.com/npm/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"dependencies": {
@@ -1652,7 +1656,7 @@
},
"node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz",
"resolved": "https://mirrors.cloud.tencent.com/npm/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"dependencies": {
@@ -1666,8 +1670,8 @@
},
"node_modules/chalk/node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"resolved": "https://mirrors.cloud.tencent.com/npm/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true,
"engines": {
"node": ">=0.8.0"
@@ -1715,7 +1719,7 @@
},
"node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz",
"resolved": "https://mirrors.cloud.tencent.com/npm/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"dependencies": {
@@ -1724,8 +1728,8 @@
},
"node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"resolved": "https://mirrors.cloud.tencent.com/npm/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"node_modules/colorette": {
@@ -2294,8 +2298,8 @@
},
"node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"resolved": "https://mirrors.cloud.tencent.com/npm/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true,
"engines": {
"node": ">=4"
@@ -2482,7 +2486,7 @@
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
"resolved": "https://mirrors.cloud.tencent.com/npm/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
},
@@ -2898,6 +2902,14 @@
}
}
},
"node_modules/pinia-plugin-persistedstate": {
"version": "3.2.0",
"resolved": "https://mirrors.cloud.tencent.com/npm/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.2.0.tgz",
"integrity": "sha512-tZbNGf2vjAQcIm7alK40sE51Qu/m9oWr+rEgNm/2AWr1huFxj72CjvpQcIQzMknDBJEkQznCLAGtJTIcLKrKdw==",
"peerDependencies": {
"pinia": "^2.0.0"
}
},
"node_modules/pinia/node_modules/vue-demi": {
"version": "0.13.11",
"resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz",
@@ -3226,7 +3238,7 @@
},
"node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz",
"resolved": "https://mirrors.cloud.tencent.com/npm/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"dependencies": {
@@ -3660,6 +3672,18 @@
}
}
},
"node_modules/vite-plugin-require-transform": {
"version": "1.0.21",
"resolved": "https://mirrors.cloud.tencent.com/npm/vite-plugin-require-transform/-/vite-plugin-require-transform-1.0.21.tgz",
"integrity": "sha512-A3SrHhVg9tCW35O7E8kcuB71YTEdVd3EaM1zh6gbH4zxy4WzXSfcNf0UiWmaHHhr6wdFhiiAGdpR6S0SUxXkGQ==",
"dev": true,
"dependencies": {
"@babel/generator": "^7.22.5",
"@babel/parser": "^7.22.5",
"@babel/traverse": "^7.22.5",
"@babel/types": "^7.22.5"
}
},
"node_modules/vue": {
"version": "3.2.47",
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.2.47.tgz",
@@ -3863,6 +3887,19 @@
"resolved": "https://registry.npmmirror.com/yarm/-/yarm-0.4.0.tgz",
"integrity": "sha512-yCoX5QCA5Upb+VP7/UBuNGBz7MO5oWyc6degv5AifeGnakpaHeNwE/SNOPMefFKpQBionZyUeRdBo63Dl+awDQ=="
},
"node_modules/yarn": {
"version": "1.22.21",
"resolved": "https://registry.npmmirror.com/yarn/-/yarn-1.22.21.tgz",
"integrity": "sha512-ynXaJsADJ9JiZ84zU25XkPGOvVMmZ5b7tmTSpKURYwgELdjucAOydqIOrOfTxVYcNXe91xvLZwcRh68SR3liCg==",
"hasInstallScript": true,
"bin": {
"yarn": "bin/yarn.js",
"yarnpkg": "bin/yarn.js"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/zrender": {
"version": "5.4.3",
"resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.4.3.tgz",
@@ -3890,12 +3927,13 @@
"dev": true
},
"@babel/code-frame": {
"version": "7.18.6",
"resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz",
"integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
"version": "7.23.5",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/code-frame/-/code-frame-7.23.5.tgz",
"integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
"dev": true,
"requires": {
"@babel/highlight": "^7.18.6"
"@babel/highlight": "^7.23.4",
"chalk": "^2.4.2"
}
},
"@babel/compat-data": {
@@ -3936,12 +3974,12 @@
}
},
"@babel/generator": {
"version": "7.21.1",
"resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.21.1.tgz",
"integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==",
"version": "7.23.6",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/generator/-/generator-7.23.6.tgz",
"integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
"dev": true,
"requires": {
"@babel/types": "^7.21.0",
"@babel/types": "^7.23.6",
"@jridgewell/gen-mapping": "^0.3.2",
"@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
@@ -3997,28 +4035,28 @@
}
},
"@babel/helper-environment-visitor": {
"version": "7.18.9",
"resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
"integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
"version": "7.22.20",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
"integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
"dev": true
},
"@babel/helper-function-name": {
"version": "7.21.0",
"resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
"integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
"version": "7.23.0",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
"integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
"dev": true,
"requires": {
"@babel/template": "^7.20.7",
"@babel/types": "^7.21.0"
"@babel/template": "^7.22.15",
"@babel/types": "^7.23.0"
}
},
"@babel/helper-hoist-variables": {
"version": "7.18.6",
"resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
"integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
"version": "7.22.5",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
"integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
"dev": true,
"requires": {
"@babel/types": "^7.18.6"
"@babel/types": "^7.22.5"
}
},
"@babel/helper-module-imports": {
@@ -4056,24 +4094,24 @@
}
},
"@babel/helper-split-export-declaration": {
"version": "7.18.6",
"resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
"integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
"version": "7.22.6",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
"integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
"dev": true,
"requires": {
"@babel/types": "^7.18.6"
"@babel/types": "^7.22.5"
}
},
"@babel/helper-string-parser": {
"version": "7.19.4",
"resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
"integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
"version": "7.23.4",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
"integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
"dev": true
},
"@babel/helper-validator-identifier": {
"version": "7.19.1",
"resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
"integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
"version": "7.22.20",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
"dev": true
},
"@babel/helper-validator-option": {
@@ -4094,20 +4132,20 @@
}
},
"@babel/highlight": {
"version": "7.18.6",
"resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz",
"integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
"version": "7.23.4",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/highlight/-/highlight-7.23.4.tgz",
"integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
"dev": true,
"requires": {
"@babel/helper-validator-identifier": "^7.18.6",
"chalk": "^2.0.0",
"@babel/helper-validator-identifier": "^7.22.20",
"chalk": "^2.4.2",
"js-tokens": "^4.0.0"
}
},
"@babel/parser": {
"version": "7.21.2",
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.21.2.tgz",
"integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ=="
"version": "7.23.6",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/parser/-/parser-7.23.6.tgz",
"integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ=="
},
"@babel/standalone": {
"version": "7.21.2",
@@ -4116,42 +4154,42 @@
"dev": true
},
"@babel/template": {
"version": "7.20.7",
"resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.20.7.tgz",
"integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
"version": "7.22.15",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/template/-/template-7.22.15.tgz",
"integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.18.6",
"@babel/parser": "^7.20.7",
"@babel/types": "^7.20.7"
"@babel/code-frame": "^7.22.13",
"@babel/parser": "^7.22.15",
"@babel/types": "^7.22.15"
}
},
"@babel/traverse": {
"version": "7.21.2",
"resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.21.2.tgz",
"integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==",
"version": "7.23.6",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/traverse/-/traverse-7.23.6.tgz",
"integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.18.6",
"@babel/generator": "^7.21.1",
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-function-name": "^7.21.0",
"@babel/helper-hoist-variables": "^7.18.6",
"@babel/helper-split-export-declaration": "^7.18.6",
"@babel/parser": "^7.21.2",
"@babel/types": "^7.21.2",
"debug": "^4.1.0",
"@babel/code-frame": "^7.23.5",
"@babel/generator": "^7.23.6",
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-function-name": "^7.23.0",
"@babel/helper-hoist-variables": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
"@babel/parser": "^7.23.6",
"@babel/types": "^7.23.6",
"debug": "^4.3.1",
"globals": "^11.1.0"
}
},
"@babel/types": {
"version": "7.21.2",
"resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.21.2.tgz",
"integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==",
"version": "7.23.6",
"resolved": "https://mirrors.cloud.tencent.com/npm/@babel/types/-/types-7.23.6.tgz",
"integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==",
"dev": true,
"requires": {
"@babel/helper-string-parser": "^7.19.4",
"@babel/helper-validator-identifier": "^7.19.1",
"@babel/helper-string-parser": "^7.23.4",
"@babel/helper-validator-identifier": "^7.22.20",
"to-fast-properties": "^2.0.0"
}
},
@@ -4985,7 +5023,7 @@
},
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
"resolved": "https://mirrors.cloud.tencent.com/npm/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
@@ -5095,7 +5133,7 @@
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz",
"resolved": "https://mirrors.cloud.tencent.com/npm/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
@@ -5106,8 +5144,8 @@
"dependencies": {
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"resolved": "https://mirrors.cloud.tencent.com/npm/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
}
}
@@ -5143,7 +5181,7 @@
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz",
"resolved": "https://mirrors.cloud.tencent.com/npm/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
@@ -5152,8 +5190,8 @@
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"resolved": "https://mirrors.cloud.tencent.com/npm/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"colorette": {
@@ -5611,8 +5649,8 @@
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"resolved": "https://mirrors.cloud.tencent.com/npm/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"hash-sum": {
@@ -5759,7 +5797,7 @@
},
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
"resolved": "https://mirrors.cloud.tencent.com/npm/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
},
@@ -6089,6 +6127,12 @@
}
}
},
"pinia-plugin-persistedstate": {
"version": "3.2.0",
"resolved": "https://mirrors.cloud.tencent.com/npm/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.2.0.tgz",
"integrity": "sha512-tZbNGf2vjAQcIm7alK40sE51Qu/m9oWr+rEgNm/2AWr1huFxj72CjvpQcIQzMknDBJEkQznCLAGtJTIcLKrKdw==",
"requires": {}
},
"pkg-types": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.0.2.tgz",
@@ -6344,7 +6388,7 @@
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz",
"resolved": "https://mirrors.cloud.tencent.com/npm/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
@@ -6662,6 +6706,18 @@
"rollup": "^3.10.0"
}
},
"vite-plugin-require-transform": {
"version": "1.0.21",
"resolved": "https://mirrors.cloud.tencent.com/npm/vite-plugin-require-transform/-/vite-plugin-require-transform-1.0.21.tgz",
"integrity": "sha512-A3SrHhVg9tCW35O7E8kcuB71YTEdVd3EaM1zh6gbH4zxy4WzXSfcNf0UiWmaHHhr6wdFhiiAGdpR6S0SUxXkGQ==",
"dev": true,
"requires": {
"@babel/generator": "^7.22.5",
"@babel/parser": "^7.22.5",
"@babel/traverse": "^7.22.5",
"@babel/types": "^7.22.5"
}
},
"vue": {
"version": "3.2.47",
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.2.47.tgz",
@@ -6830,6 +6886,11 @@
"resolved": "https://registry.npmmirror.com/yarm/-/yarm-0.4.0.tgz",
"integrity": "sha512-yCoX5QCA5Upb+VP7/UBuNGBz7MO5oWyc6degv5AifeGnakpaHeNwE/SNOPMefFKpQBionZyUeRdBo63Dl+awDQ=="
},
"yarn": {
"version": "1.22.21",
"resolved": "https://registry.npmmirror.com/yarn/-/yarn-1.22.21.tgz",
"integrity": "sha512-ynXaJsADJ9JiZ84zU25XkPGOvVMmZ5b7tmTSpKURYwgELdjucAOydqIOrOfTxVYcNXe91xvLZwcRh68SR3liCg=="
},
"zrender": {
"version": "5.4.3",
"resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.4.3.tgz",

View File

@@ -19,10 +19,12 @@
"mavon-editor": "^3.0.0",
"nprogress": "^0.2.0",
"pinia": "^2.0.32",
"pinia-plugin-persistedstate": "^3.2.0",
"vue": "^3.2.47",
"vue-cropper": "1.0.3",
"vue-router": "^4.1.6",
"yarm": "^0.4.0"
"yarm": "^0.4.0",
"yarn": "^1.22.21"
},
"devDependencies": {
"@vitejs/plugin-vue": "^4.0.0",
@@ -30,6 +32,7 @@
"sass": "1.52.1",
"unplugin-auto-import": "^0.15.0",
"unplugin-vue-components": "^0.24.0",
"vite": "^4.1.3"
"vite": "^4.1.3",
"vite-plugin-require-transform": "^1.0.21"
}
}

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -1,131 +1,144 @@
<template >
<div class="avatar">
<div class="avatar-left">
<el-avatar :size="props.size" :src="iconUrl" />
<template>
<div class="avatar">
<div class="avatar-left">
<el-avatar :size="props.size" :src="iconUrl" />
<div v-if="props.isSelf">
<div class="nick"> {{ userInfo.nick }}</div>
</div>
<div v-if="props.isSelf">
<div class="nick">{{ userInfo.nick }}</div>
</div>
<div v-if="!props.isSelf">
<div class="nick" :class="{ mt_1: props.time != 'undefined' }"> {{ userInfo.nick }}</div>
<div class="remarks" v-if="props.time"> {{ props.time }}</div>
<div class="remarks">
<slot name="bottom" />
</div>
</div>
<div class="info" v-if="!props.isSelf">
<el-tag class="ml-2" type="warning">V8</el-tag>
<el-tag class="ml-2" type="danger">会员</el-tag>
</div>
<div v-if="!props.isSelf">
<div class="nick" :class="{ mt_1: props.time != 'undefined' }">
{{ userInfo.nick }}
</div>
<el-button v-if="props.showWatching" type="primary" size="default" icon="Plus">关注</el-button>
<div class="remarks" v-if="props.time">{{ props.time }}</div>
<div class="remarks">
<slot name="bottom" />
</div>
</div>
<div class="info" v-if="!props.isSelf">
<el-tag class="ml-2" type="warning">V8</el-tag>
<el-tag class="ml-2" type="danger">会员</el-tag>
</div>
</div>
<el-button
v-if="props.showWatching"
type="primary"
size="default"
icon="Plus"
>关注</el-button
>
</div>
</template>
<script setup>
import useUserStore from '@/stores/user'
import { reactive, watch, onMounted, computed, ref } from 'vue';
import useUserStore from "@/stores/user";
import { reactive, watch, onMounted, computed, ref } from "vue";
//userInfo
//{icon,name,role,id},根据判断userInfo是否等于未定义来觉得是当前登录用户信息还是其他人信息
const props = defineProps(['size', 'showWatching', 'time', 'userInfo', 'isSelf'])
const props = defineProps([
"size",
"showWatching",
"time",
"userInfo",
"isSelf",
]);
const userStore = useUserStore();
const userInfo = reactive({
icon: "",
nick: "",
role: [],
id: ""
icon: "",
nick: "",
role: [],
id: "",
});
const iconUrl=ref('/src/assets/logo.ico');
const iconUrl = ref("/favicon.ico");
const iconUrlHandler = () => {
if (userInfo.icon == null || userInfo.icon == undefined || userInfo.icon == '') {
return '/src/assets/logo.ico';
}
return `${import.meta.env.VITE_APP_BASEAPI}/file/${userInfo.icon}`;
}
if (
userInfo.icon == null ||
userInfo.icon == undefined ||
userInfo.icon == ""
) {
return "/favicon.ico";
}
return `/favicon.ico`;
};
watch(userStore, (n) => {
if (props.userInfo == undefined) {
userInfo.nick = n.name;
}
if (props.userInfo == undefined) {
userInfo.nick = n.name;
}
});
})
watch(() => props, (n) => {
watch(
() => props,
(n) => {
Init();
}, { deep: true })
},
{ deep: true }
);
onMounted(() => {
Init();
})
Init();
});
const Init = () => {
//使用传入值
if (props.userInfo != undefined) {
userInfo.icon = props.userInfo.icon;
userInfo.nick = props.userInfo.nick;
userInfo.role = props.userInfo.role;
userInfo.id = props.userInfo.id;
iconUrl.value=iconUrlHandler(userInfo.icon)
}
//使用当前登录用户
else {
userInfo.icon = userStore.icon;
userInfo.nick = userStore.name;
userInfo.role = userStore.role;
userInfo.id = userStore.id;
iconUrl.value=userInfo.icon;
}
}
//使用传入值
if (props.userInfo != undefined) {
userInfo.icon = props.userInfo.icon;
userInfo.nick = props.userInfo.nick;
userInfo.role = props.userInfo.role;
userInfo.id = props.userInfo.id;
iconUrl.value = iconUrlHandler(userInfo.icon);
}
//使用当前登录用户
else {
userInfo.icon = userStore.icon;
userInfo.nick = userStore.name;
userInfo.role = userStore.role;
userInfo.id = userStore.id;
iconUrl.value = iconUrlHandler(userInfo.icon);
}
};
</script>
<style scoped>
.mt_1 {
margin-top: 0.5rem;
margin-top: 0.5rem;
}
.nick {
font-weight: bold;
font-weight: bold;
}
.info {
margin-top: 0.6rem;
margin-left: 1rem;
margin-top: 0.6rem;
margin-left: 1rem;
}
.info .el-tag {
margin-right: 1rem;
margin-right: 1rem;
}
.el-icon {
color: white;
color: white;
}
.avatar {
display: flex;
justify-content: space-between;
display: flex;
justify-content: space-between;
}
.avatar-left {
display: flex;
justify-content: flex-start;
align-items: center;
display: flex;
justify-content: flex-start;
align-items: center;
}
.el-avatar {
margin-right: 1.2rem;
margin-right: 1.2rem;
}
.remarks {
padding-top: 0.5rem;
color: #8C8C8C;
padding-top: 0.5rem;
color: #8c8c8c;
}
</style>
</style>

View File

@@ -1,7 +1,11 @@
<template>
<div class="common-layout">
<el-container>
<el-header class="common-header">
<el-header
class="common-header"
ref="header"
:class="[isFixed ? 'fixed' : '']"
>
<AppHeader />
</el-header>
<el-main>
@@ -11,13 +15,35 @@
</div>
</template>
<script setup>
import { ref, onMounted } from "vue";
import AppHeader from "./AppHeader.vue";
import AppBody from "./AppBody.vue";
const header = ref(null);
const isFixed = ref(false);
onMounted(() => {
window.addEventListener("scroll", handleScroll);
});
const handleScroll = () => {
const scrollTop =
window.scrollY ||
document.documentElement.scrollTop ||
document.body.scrollTop;
const currentEle = header.value.$el;
if (scrollTop > currentEle.offsetTop) {
isFixed.value = true;
} else {
isFixed.value = false;
}
};
</script>
<style scoped lang="scss">
.common {
&-header {
background-color: #fff;
width: 100%;
display: flex;
justify-content: center;
@@ -30,4 +56,12 @@ import AppBody from "./AppBody.vue";
min-height: 10rem;
background-color: #f0f2f5;
}
.fixed {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 99;
}
</style>

View File

@@ -1,23 +1,27 @@
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import { createApp } from "vue";
import { createPinia } from "pinia";
import App from './App.vue'
import router from './router'
import App from "./App.vue";
import router from "./router";
import piniaPluginPersistedstate from "pinia-plugin-persistedstate";
import './assets/main.css'
import '@/assets/styles/index.scss' // global css
import "./assets/main.css";
import "@/assets/styles/index.scss"; // global css
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import directive from './directive' // directive
import * as ElementPlusIconsVue from "@element-plus/icons-vue";
import directive from "./directive"; // directive
import "./permission"
import "./permission";
const app = createApp(App)
const app = createApp(App);
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.component(key, component)
}
app.component(key, component);
}
app.use(createPinia())
const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);
app.use(pinia);
directive(app);
app.use(router)
app.mount('#app')
app.use(router);
app.mount("#app");

View File

@@ -41,7 +41,8 @@ router.beforeEach((to, from, next) => {
// 在免登录白名单,直接进入
next();
} else {
next(`/login?redirect=${to.path}&unTourist=true`); // 否则全部重定向到登录页
next();
// next(`/login?redirect=${to.path}&unTourist=true`); // 否则全部重定向到登录页
NProgress.done();
}
}

View File

@@ -1,22 +1,37 @@
import {getAll} from '@/apis/configApi'
import { defineStore } from 'pinia'
const useConfigStore = defineStore('config',
{
state: () => ({
data: []
}),
getters: {
name:(state)=>state.data.filter(s=> s.configKey=='bbs.site.name').map(x=>x.configValue)[0],
author:(state)=>state.data.filter(s=> s.configKey=='bbs.site.author').map(x=>x.configValue)[0],
icp:(state)=>state.data.filter(s=> s.configKey=='bbs.site.icp').map(x=>x.configValue)[0],
bottom:(state)=>state.data.filter(s=>s.configKey=='bbs.site.bottom').map(x=>x.configValue)[0]
},
actions: {
// 登录
async getConfig() {
const response = await getAll();
this.data = response.data.items;
},
},
})
import { getAll } from "@/apis/configApi";
import { defineStore } from "pinia";
const useConfigStore = defineStore("config", {
state: () => ({
data: [],
}),
getters: {
name: (state) =>
state.data
.filter((s) => s.configKey == "bbs.site.name")
.map((x) => x.configValue)[0],
author: (state) =>
state.data
.filter((s) => s.configKey == "bbs.site.author")
.map((x) => x.configValue)[0],
icp: (state) =>
state.data
.filter((s) => s.configKey == "bbs.site.icp")
.map((x) => x.configValue)[0],
bottom: (state) =>
state.data
.filter((s) => s.configKey == "bbs.site.bottom")
.map((x) => x.configValue)[0],
},
actions: {
// 登录
async getConfig() {
const response = await getAll();
this.data = response.data.items;
},
},
persist: {
key: "configInfo",
storage: window.sessionStorage,
},
});
export default useConfigStore;

View File

@@ -42,12 +42,14 @@ const useUserStore = defineStore("user", {
getUserDetailInfo()
.then((response) => {
const res = response.data;
const user = res.user;
console.log(user, "user");
const avatar =
user.icon == "" || user.icon == null
? "/src/assets/logo.ico"
? "/favicon.ico"
: import.meta.env.VITE_APP_BASEAPI + "/file/" + user.icon;
console.log(avatar, "avatar");
if (res.roleCodes && res.roleCodes.length > 0) {
// 验证返回的roles是否是一个非空数组
this.roles = res.roleCodes;

View File

@@ -7,12 +7,27 @@
<el-col :span="24">
<InfoCard header="文章信息" text="展开" hideDivider="true">
<template #content>
<el-button style="width: 100%; margin-bottom: 0.8rem" @click="loadDiscuss(true)">首页</el-button>
<el-button v-hasPer="['bbs:article:add']" @click="addArticle(0)" type="primary"
style="width: 100%; margin-bottom: 0.8rem; margin-left: 0">添加子文章</el-button>
<el-button
style="width: 100%; margin-bottom: 0.8rem"
@click="loadDiscuss(true)"
>首页</el-button
>
<el-button
v-hasPer="['bbs:article:add']"
@click="addArticle('00000000-0000-0000-0000-000000000000')"
type="primary"
style="width: 100%; margin-bottom: 0.8rem; margin-left: 0"
>添加子文章</el-button
>
<!--目录在这里 -->
<TreeArticleInfo :data="articleData" @remove="delArticle" @update="updateArticle" @create="addNextArticle"
@handleNodeClick="handleNodeClick" :currentNodeKey="currentNodeKey"/>
<TreeArticleInfo
:data="articleData"
@remove="delArticle"
@update="updateArticle"
@create="addNextArticle"
@handleNodeClick="handleNodeClick"
:currentNodeKey="currentNodeKey"
/>
</template>
</InfoCard>
</el-col>
@@ -37,50 +52,70 @@
<el-row class="left-div">
<el-col :span="24">
<!-- {{ discuss.user }} -->
<AvatarInfo :size="50" :showWatching="true" :time="discuss.creationTime" :userInfo="discuss.user"></AvatarInfo>
<AvatarInfo
:size="50"
:showWatching="true"
:time="discuss.creationTime"
:userInfo="discuss.user"
></AvatarInfo>
<!-- :userInfo="{nick:'qwe'} -->
<el-divider />
<h2>{{ discuss.title }}</h2>
<el-image :preview-src-list="[getUrl(discuss.cover)]" v-if="discuss.cover" :src="getUrl(discuss.cover)" style="width: 150px;height: 150px;" />
<el-image
:preview-src-list="[getUrl(discuss.cover)]"
v-if="discuss.cover"
:src="getUrl(discuss.cover)"
style="width: 150px; height: 150px"
/>
<ArticleContentInfo :code="discuss.content??''"></ArticleContentInfo>
<ArticleContentInfo
:code="discuss.content ?? ''"
></ArticleContentInfo>
<el-divider class="tab-divider" />
<el-space :size="10" :spacer="spacer">
<AgreeInfo :data="discuss"/>
<AgreeInfo :data="discuss" />
<el-button icon="Star" text> 0</el-button>
<el-button icon="Share" text> 分享</el-button>
<el-button icon="Operation" text> 操作</el-button>
</el-space>
</el-col>
<el-col :span="24" class="comment">
<CommentInfo/>
<el-col :span="24" class="comment">
<CommentInfo />
</el-col>
</el-row>
<BottomInfo/>
<BottomInfo />
</el-col>
<el-col :span="5">
<el-row class="right-div">
<el-col :span="24">
<InfoCard class="art-info-right" header="主题信息" text="更多" hideDivider="true">
<InfoCard
class="art-info-right"
header="主题信息"
text="更多"
hideDivider="true"
>
<template #content>
<div>
<ul class="art-info-ul">
<li>
<el-button type="primary" size="default"
v-hasPer="['bbs:discuss:edit']"
@click="updateHander(route.params.discussId)">编辑</el-button>
<el-button style="margin-left: 1rem" type="danger"
v-hasPer="['bbs:discuss:remove']"
@click="delHander(route.params.discussId)">删除</el-button>
<el-button
type="primary"
size="default"
v-hasPer="['bbs:discuss:edit']"
@click="updateHander(route.params.discussId)"
>编辑</el-button
>
<el-button
style="margin-left: 1rem"
type="danger"
v-hasPer="['bbs:discuss:remove']"
@click="delHander(route.params.discussId)"
>删除</el-button
>
</li>
<li>分类: <span>主题</span></li>
标签:
@@ -95,11 +130,20 @@
<InfoCard class="art-info-right" header="目录" hideDivider="true">
<template #content>
<div>
<el-empty :image-size="100" style="padding: 20px 0;" v-if="catalogueData.length==0" description="无目录" />
<el-empty
:image-size="100"
style="padding: 20px 0"
v-if="catalogueData.length == 0"
description="无目录"
/>
<ul v-else class="art-info-ul">
<li v-for="(item, i) in catalogueData" :key="i">
<el-button style="width: 100%; justify-content: left" type="primary" text>{{ `${i + 1} ${item}`
}}</el-button>
<el-button
style="width: 100%; justify-content: left"
type="primary"
text
>{{ `${i + 1} ${item}` }}</el-button
>
</li>
</ul>
</div>
@@ -131,42 +175,44 @@ import AvatarInfo from "@/components/AvatarInfo.vue";
import InfoCard from "@/components/InfoCard.vue";
import ArticleContentInfo from "@/components/ArticleContentInfo.vue";
import CommentInfo from "@/components/CommentInfo.vue";
import BottomInfo from '@/components/BottomInfo.vue'
import BottomInfo from "@/components/BottomInfo.vue";
import TreeArticleInfo from "@/components/TreeArticleInfo.vue";
import { useRoute, useRouter } from "vue-router";
import AgreeInfo from '@/components/AgreeInfo.vue'
import AgreeInfo from "@/components/AgreeInfo.vue";
import { get as discussGet, del as discussDel } from "@/apis/discussApi.js";
import { all as articleall, del as articleDel, get as articleGet } from "@/apis/articleApi.js";
import {
all as articleall,
del as articleDel,
get as articleGet,
} from "@/apis/articleApi.js";
//数据定义
const route = useRoute();
const router = useRouter();
const spacer = h(ElDivider, { direction: "vertical" });
const items = [{ user: "用户1" }, { user: "用户2" }, { user: "用户3" }];
//子文章数据
const articleData = ref([]);
//主题内容
const discuss = ref({});
//封面url
const getUrl= (str)=>{
return `${import.meta.env.VITE_APP_BASEAPI}/file/${str}`
}
const getUrl = (str) => {
return `${import.meta.env.VITE_APP_BASEAPI}/file/${str}`;
};
//当前默认选择的子文章
const currentNodeKey=route.params.articleId;
const currentNodeKey = route.params.articleId;
//目录数据
const catalogueData = ref([]);
//子文章初始化
const loadArticleData = async () => {
const response= await articleall(route.params.discussId)
const response = await articleall(route.params.discussId);
articleData.value = response.data;
}
};
//主题初始化
const loadDiscuss = async (isRewrite) => {
if (isRewrite) {
//跳转路由
router.push(`/article/${route.params.discussId}`);
@@ -183,16 +229,15 @@ const ContentHander = () => {
//加载目录
var reg = /(#{1,6})\s(.*)/g;
if(discuss.value.content)
{
var myArray = discuss.value.content.match(reg);
if (myArray != null) {
catalogueData.value = myArray.map((x) => {
return x.replace(/#/g, "").replace(/\s/g, "");
});
if (discuss.value.content) {
var myArray = discuss.value.content.match(reg);
if (myArray != null) {
catalogueData.value = myArray.map((x) => {
return x.replace(/#/g, "").replace(/\s/g, "");
});
}
}
}
}
};
//添加树型子文章
const addArticle = (parentArticleId) => {
//跳转路由
@@ -251,7 +296,7 @@ const addNextArticle = (node, data) => {
},
};
router.push(routerPer);
}
};
//跳转更新子菜单
const updateArticle = (node, data) => {
@@ -263,22 +308,21 @@ const updateArticle = (node, data) => {
artType: "article",
discussId: data.discussId,
parentArticleId: data.parentId,
articleId: data.id
articleId: data.id,
},
};
router.push(routerPer);
}
};
//单机节点
const handleNodeClick = async(data) => {
const handleNodeClick = async (data) => {
//跳转路由
router.push(`/article/${route.params.discussId}/${data.id}`);
const response=await articleGet(data.id);
const response = await articleGet(data.id);
discuss.value.content = response.data.content;
ContentHander();
}
};
//删除子文章
const delArticle = (node, data) => {
ElMessageBox.confirm(`确定是否删除编号[${data.id}]的子文章吗?`, "警告", {
@@ -286,7 +330,6 @@ const delArticle = (node, data) => {
cancelButtonText: "取消",
type: "warning",
}).then(async () => {
await articleDel(data.id);
await loadArticleData();
@@ -295,14 +338,13 @@ const delArticle = (node, data) => {
message: "删除成功",
});
});
}
};
onMounted(async () => {
await loadDiscuss();
await loadArticleData();
});
</script>
<style scoped >
<style scoped>
.comment {
min-height: 40rem;
}

View File

@@ -26,7 +26,7 @@
</el-form>
<RouterLink to="/register"> 没有账号前往注册</RouterLink>
<button class="login-btn" @click="login(loginFormRef)"> </button>
<button class="login-btn" @click="guestlogin">游客临时登录</button>
<button class="login-btn" @click="guestlogin">访客</button>
</div>
<div class="divider">
@@ -76,9 +76,6 @@ const loginForm = reactive({
code: "",
});
const guestlogin = async () => {
loginForm.userName = "guest";
loginForm.password = "123456";
await userStore.login(loginForm);
const redirect = route.query?.redirect ?? "/index";
router.push(redirect);
};

View File

@@ -27,7 +27,7 @@ export default defineConfig(({ command, mode }) => {
},
},
server: {
port: 18000,
port: 18001,
open: true,
proxy: {
[env.VITE_APP_BASEAPI]: {
@@ -37,5 +37,9 @@ export default defineConfig(({ command, mode }) => {
},
},
},
// 增加新的配置
build: {
assetsInlineLimit: 0,
},
};
});

File diff suppressed because it is too large Load Diff