😎优化代码
This commit is contained in:
parent
0114615004
commit
c9144b6784
@ -14,12 +14,12 @@
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="AlibabaCloud.SDK.Dysmsapi20170525" Version="3.1.0" />
|
||||
<PackageReference Include="AlipaySDKNet.Standard" Version="4.9.370" />
|
||||
<PackageReference Include="AlipaySDKNet.Standard" Version="4.9.376" />
|
||||
<PackageReference Include="AngleSharp" Version="1.2.0" />
|
||||
<PackageReference Include="AspectCore.Extensions.Reflection" Version="2.4.0" />
|
||||
<PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
|
||||
<PackageReference Include="BouncyCastle.Cryptography" Version="2.5.0" Aliases="BouncyCastleV2" />
|
||||
<PackageReference Include="Elastic.Clients.Elasticsearch" Version="8.16.3" />
|
||||
<PackageReference Include="Elastic.Clients.Elasticsearch" Version="8.17.0" />
|
||||
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.6.20" />
|
||||
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.6.20" />
|
||||
<PackageReference Include="Furion.Pure" Version="4.9.6.20" />
|
||||
@ -49,7 +49,7 @@
|
||||
<PackageReference Include="SSH.NET" Version="2024.2.0" />
|
||||
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.5.1" />
|
||||
<PackageReference Include="System.Net.Http" Version="4.3.4" />
|
||||
<PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1155" />
|
||||
<PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1156" />
|
||||
<PackageReference Include="UAParser" Version="3.1.47" />
|
||||
<PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
|
||||
</ItemGroup>
|
||||
|
||||
@ -85,17 +85,11 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter, IDisposable
|
||||
string account = "", realName = "", userId = "", tenantId = "";
|
||||
if (loggingMonitor.authorizationClaims != null)
|
||||
{
|
||||
foreach (var item in loggingMonitor.authorizationClaims)
|
||||
{
|
||||
if (item.type == ClaimConst.Account)
|
||||
account = item.value;
|
||||
if (item.type == ClaimConst.RealName)
|
||||
realName = item.value;
|
||||
if (item.type == ClaimConst.TenantId)
|
||||
tenantId = item.value;
|
||||
if (item.type == ClaimConst.UserId)
|
||||
userId = item.value;
|
||||
}
|
||||
var authDict = (loggingMonitor.authorizationClaims as IEnumerable<dynamic>)!.ToDictionary(u => u.type.ToString(), u => u.value.ToString());
|
||||
account = authDict?.GetValueOrDefault(ClaimConst.Account);
|
||||
realName = authDict?.GetValueOrDefault(ClaimConst.RealName);
|
||||
tenantId = authDict?.GetValueOrDefault(ClaimConst.TenantId);
|
||||
userId = authDict?.GetValueOrDefault(ClaimConst.UserId);
|
||||
}
|
||||
|
||||
// 优先获取 X-Forwarded-For 头部信息携带的IP地址(如nginx代理配置转发)
|
||||
|
||||
@ -4,7 +4,6 @@
|
||||
//
|
||||
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||
|
||||
using Admin.NET.Core.Service.Alipay;
|
||||
using Aop.Api;
|
||||
using Aop.Api.Domain;
|
||||
using Aop.Api.Request;
|
||||
@ -20,24 +19,27 @@ namespace Admin.NET.Core.Service;
|
||||
[ApiDescriptionSettings(Order = 240)]
|
||||
public class AlipayService : IDynamicApiController, ITransient
|
||||
{
|
||||
private readonly UserManager _userManager;
|
||||
private readonly SysConfigService _sysConfigService;
|
||||
private readonly AlipayOptions _alipayOptions;
|
||||
private readonly IHttpContextAccessor _httpContext;
|
||||
private readonly IEnumerable<IAlipayNotify> _alipayNotifyList;
|
||||
private readonly IWebHostEnvironment _webHostEnvironment;
|
||||
private readonly SysConfigService _sysConfigService;
|
||||
private readonly IHttpContextAccessor _httpContext;
|
||||
private readonly AlipayOptions _alipayOptions;
|
||||
private readonly IAopClient _alipayClient;
|
||||
private readonly UserManager _userManager;
|
||||
|
||||
public AlipayService(UserManager userManager,
|
||||
SysConfigService sysConfigService,
|
||||
IOptions<AlipayOptions> alipayOptions,
|
||||
public AlipayService(
|
||||
UserManager userManager,
|
||||
IHttpContextAccessor httpContext,
|
||||
IWebHostEnvironment webHostEnvironment)
|
||||
SysConfigService sysConfigService,
|
||||
IWebHostEnvironment webHostEnvironment,
|
||||
IOptions<AlipayOptions> alipayOptions)
|
||||
{
|
||||
_userManager = userManager;
|
||||
_httpContext = httpContext;
|
||||
_sysConfigService = sysConfigService;
|
||||
_alipayOptions = alipayOptions.Value;
|
||||
_httpContext = httpContext;
|
||||
_webHostEnvironment = webHostEnvironment;
|
||||
_alipayNotifyList = App.GetServices<IAlipayNotify>();
|
||||
|
||||
// 初始化支付宝客户端
|
||||
string path = App.WebHostEnvironment.ContentRootPath;
|
||||
@ -93,7 +95,7 @@ public class AlipayService : IDynamicApiController, ITransient
|
||||
|
||||
// 循环执行扫码后需要执行的业务逻辑,需要至少一个继承方法返回true,否则抛出异常
|
||||
var pass = false;
|
||||
foreach (var notify in App.GetServices<IAlipayNotify>())
|
||||
foreach (var notify in _alipayNotifyList)
|
||||
if (notify.ScanCallback(type, userId, info)) pass = true;
|
||||
if (!pass) throw Oops.Oh("未处理的授权逻辑");
|
||||
|
||||
@ -145,7 +147,7 @@ public class AlipayService : IDynamicApiController, ITransient
|
||||
|
||||
// 循环执行业务逻辑,若都未处理(回调全部返回false)则交易失败
|
||||
var isError = true;
|
||||
foreach (var notify in App.GetServices<IAlipayNotify>())
|
||||
foreach (var notify in _alipayNotifyList)
|
||||
if (notify.TopUpCallback(type, tradeNo)) isError = false;
|
||||
if (isError) throw Oops.Oh("交易失败");
|
||||
}
|
||||
|
||||
@ -5,7 +5,6 @@
|
||||
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||
|
||||
using Aop.Api.Domain;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Admin.NET.Core.Service;
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
using Aop.Api.Response;
|
||||
|
||||
namespace Admin.NET.Core.Service.Alipay;
|
||||
namespace Admin.NET.Core.Service;
|
||||
|
||||
/// <summary>
|
||||
/// 支付宝回调接口
|
||||
|
||||
@ -14,8 +14,8 @@ public class SysRoleService : IDynamicApiController, ITransient
|
||||
{
|
||||
private readonly UserManager _userManager;
|
||||
private readonly SqlSugarRepository<SysRole> _sysRoleRep;
|
||||
private readonly SysRoleOrgService _sysRoleOrgService;
|
||||
private readonly SysRoleMenuService _sysRoleMenuService;
|
||||
private readonly SysRoleOrgService _sysRoleOrgService;
|
||||
private readonly SysRoleTableService _sysRoleTableService;
|
||||
private readonly SysRoleApiService _sysRoleApiService;
|
||||
private readonly SysOrgService _sysOrgService;
|
||||
@ -25,8 +25,8 @@ public class SysRoleService : IDynamicApiController, ITransient
|
||||
|
||||
public SysRoleService(UserManager userManager,
|
||||
SqlSugarRepository<SysRole> sysRoleRep,
|
||||
SysRoleOrgService sysRoleOrgService,
|
||||
SysRoleMenuService sysRoleMenuService,
|
||||
SysRoleOrgService sysRoleOrgService,
|
||||
SysRoleTableService sysRoleTableService,
|
||||
SysRoleApiService sysRoleApiService,
|
||||
SysOrgService sysOrgService,
|
||||
@ -36,8 +36,8 @@ public class SysRoleService : IDynamicApiController, ITransient
|
||||
{
|
||||
_userManager = userManager;
|
||||
_sysRoleRep = sysRoleRep;
|
||||
_sysRoleOrgService = sysRoleOrgService;
|
||||
_sysRoleMenuService = sysRoleMenuService;
|
||||
_sysRoleOrgService = sysRoleOrgService;
|
||||
_sysRoleTableService = sysRoleTableService;
|
||||
_sysRoleApiService = sysRoleApiService;
|
||||
_sysOrgService = sysOrgService;
|
||||
|
||||
@ -49,7 +49,7 @@ public static class SqlSugarFilter
|
||||
{
|
||||
// 若仅本人数据,则直接返回
|
||||
var maxDataScope = SetDataScopeFilter(db);
|
||||
if (maxDataScope == 0 || maxDataScope == (int)DataScopeEnum.Self) return;
|
||||
if (maxDataScope is 0 or (int)DataScopeEnum.Self) return;
|
||||
|
||||
var userId = App.User?.FindFirst(ClaimConst.UserId)?.Value;
|
||||
if (string.IsNullOrWhiteSpace(userId)) return;
|
||||
|
||||
@ -88,6 +88,11 @@ public class ExcelHelper
|
||||
using var package = new ExcelPackage((ExportData(list, filename) as XlsxFileResult)!.Stream);
|
||||
var worksheet = package.Workbook.Worksheets[0];
|
||||
|
||||
// 创建一个隐藏的sheet,用于添加下拉列表
|
||||
var dropdownSheet = package.Workbook.Worksheets.Add("下拉数据");
|
||||
dropdownSheet.Hidden = eWorkSheetHidden.Hidden;
|
||||
|
||||
var sysDictTypeService = App.GetService<SysDictTypeService>();
|
||||
foreach (var prop in typeof(T).GetProperties())
|
||||
{
|
||||
var propType = prop.PropertyType;
|
||||
@ -107,10 +112,10 @@ public class ExcelHelper
|
||||
var dataList = addListValidationFun?.Invoke(worksheet, prop)?.ToList();
|
||||
if (dataList == null)
|
||||
{
|
||||
// 填充枚举项为下列列表
|
||||
if (propType.IsEnum())
|
||||
{
|
||||
// 填充枚举项为下列列表
|
||||
dataList = propType.EnumToList()?.Select(u => u.Describe).ToList();
|
||||
dataList = propType.EnumToList()?.Select(it => it.Describe).ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -119,25 +124,29 @@ public class ExcelHelper
|
||||
if (dict != null)
|
||||
{
|
||||
// 填充字典值value为下列列表
|
||||
dataList = App.GetService<SysDictTypeService>().GetDataList(new GetDataDictTypeInput
|
||||
{ Code = dict.DictTypeCode }).Result?.Select(u => u.Value).ToList();
|
||||
dataList = sysDictTypeService.GetDataList(new GetDataDictTypeInput { Code = dict.DictTypeCode }).Result?.Select(u => u.Value).ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (dataList != null) AddListValidation(columnIndex, dataList);
|
||||
}
|
||||
|
||||
void AddListValidation(int columnIndex, List<string> dataList)
|
||||
{
|
||||
var validation = worksheet.DataValidations.AddListValidation(worksheet.Cells[2, columnIndex, 99999, columnIndex].Address);
|
||||
dataList.ForEach(e => validation!.Formula.Values.Add(e));
|
||||
validation.ShowErrorMessage = true;
|
||||
validation.ErrorTitle = "无效输入";
|
||||
validation.Error = "请从列表中选择一个有效的选项";
|
||||
if (dataList != null)
|
||||
{
|
||||
AddListValidation(columnIndex, dataList);
|
||||
dropdownSheet.Cells[1, columnIndex, dataList.Count, columnIndex].LoadFromCollection(dataList);
|
||||
}
|
||||
}
|
||||
|
||||
package.Save();
|
||||
package.Stream.Position = 0;
|
||||
return new XlsxFileResult(stream: package.Stream, fileDownloadName: $"{filename}-{DateTime.Now:yyyy-MM-dd_HHmmss}");
|
||||
|
||||
void AddListValidation(int columnIndex, List<string> dataList)
|
||||
{
|
||||
var validation = worksheet.DataValidations.AddListValidation(worksheet.Cells[2, columnIndex, 999999, columnIndex].Address);
|
||||
validation!.Formula.ExcelFormula = "=下拉数据!" + worksheet.Cells[1, columnIndex, dataList.Count, columnIndex].Address;
|
||||
validation.ShowErrorMessage = true;
|
||||
validation.ErrorTitle = "无效输入";
|
||||
validation.Error = "请从列表中选择一个有效的选项";
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -22,4 +22,9 @@ public class GoViewLoginInput
|
||||
/// </summary>
|
||||
[Required(ErrorMessage = "密码不能为空")]
|
||||
public string Password { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 租户
|
||||
/// </summary>
|
||||
public long? TenantId { get; set; }
|
||||
}
|
||||
@ -34,6 +34,9 @@ public class GoViewSysService : IDynamicApiController
|
||||
[DisplayName("GoView 登录")]
|
||||
public async Task<GoViewLoginOutput> Login(GoViewLoginInput input)
|
||||
{
|
||||
// 设置默认租户
|
||||
input.TenantId ??= SqlSugarConst.DefaultTenantId;
|
||||
|
||||
_sysCacheService.Set($"{CacheConst.KeyConfig}{ConfigConst.SysCaptcha}", false);
|
||||
|
||||
input.Password = CryptogramUtil.SM2Encrypt(input.Password);
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
"name": "admin.net.pro",
|
||||
"type": "module",
|
||||
"version": "2.4.33",
|
||||
"lastBuildTime": "2025.01.02",
|
||||
"lastBuildTime": "2025.01.03",
|
||||
"description": "Admin.NET 站在巨人肩膀上的 .NET 通用权限开发框架",
|
||||
"author": "zuohuaijun",
|
||||
"license": "MIT",
|
||||
@ -24,7 +24,7 @@
|
||||
"@vue-office/docx": "^1.6.2",
|
||||
"@vue-office/excel": "^1.7.14",
|
||||
"@vue-office/pdf": "^2.0.9",
|
||||
"@vueuse/core": "^12.0.0",
|
||||
"@vueuse/core": "^12.3.0",
|
||||
"@wangeditor/editor": "^5.1.23",
|
||||
"@wangeditor/editor-for-vue": "^5.1.12",
|
||||
"animate.css": "^4.1.1",
|
||||
@ -74,11 +74,11 @@
|
||||
"vue-router": "^4.5.0",
|
||||
"vue-signature-pad": "^3.0.2",
|
||||
"vue3-tree-org": "^4.2.2",
|
||||
"vxe-pc-ui": "^4.3.55",
|
||||
"vxe-pc-ui": "^4.3.58",
|
||||
"vxe-table": "^4.10.0",
|
||||
"vxe-table-plugin-element": "^4.0.4",
|
||||
"vxe-table-plugin-export-xlsx": "^4.0.7",
|
||||
"xe-utils": "^3.6.0",
|
||||
"xe-utils": "^3.7.0",
|
||||
"xlsx-js-style": "^1.2.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
@ -93,7 +93,7 @@
|
||||
"@vitejs/plugin-vue": "^5.2.1",
|
||||
"@vitejs/plugin-vue-jsx": "^4.1.1",
|
||||
"@vue/compiler-sfc": "^3.5.13",
|
||||
"code-inspector-plugin": "^0.18.3",
|
||||
"code-inspector-plugin": "^0.19.0",
|
||||
"eslint": "^9.17.0",
|
||||
"eslint-plugin-vue": "^9.32.0",
|
||||
"globals": "^15.14.0",
|
||||
@ -103,7 +103,7 @@
|
||||
"sass": "^1.83.0",
|
||||
"terser": "^5.37.0",
|
||||
"typescript": "^5.7.2",
|
||||
"vite": "^6.0.6",
|
||||
"vite": "^6.0.7",
|
||||
"vite-plugin-cdn-import": "^1.0.1",
|
||||
"vite-plugin-compression2": "^1.3.3",
|
||||
"vite-plugin-vue-setup-extend": "^0.4.0",
|
||||
|
||||
@ -6,12 +6,14 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="wngEditor">
|
||||
// https://www.wangeditor.com/v5/for-frame.html#vue3
|
||||
import '@wangeditor/editor/dist/css/style.css';
|
||||
import { reactive, shallowRef, watch, onBeforeUnmount } from 'vue';
|
||||
import { ElMessage } from 'element-plus';
|
||||
|
||||
import { IDomEditor } from '@wangeditor/editor';
|
||||
import { Toolbar, Editor } from '@wangeditor/editor-for-vue';
|
||||
import { ElMessage } from 'element-plus';
|
||||
// https://www.wangeditor.com/v5/for-frame.html#vue3
|
||||
import '@wangeditor/editor/dist/css/style.css';
|
||||
|
||||
import { getAPI } from '/@/utils/axios-utils';
|
||||
import { SysFileApi } from '/@/api-services/api';
|
||||
|
||||
@ -46,8 +48,6 @@ const props = defineProps({
|
||||
|
||||
// 定义子组件向父组件传值/事件
|
||||
const emit = defineEmits(['update:getHtml', 'update:getText']);
|
||||
// 接口服务地址
|
||||
const baseUrl = reactive(window.__env__.VITE_API_URL) + '/';
|
||||
|
||||
// 定义变量内容
|
||||
const editorRef = shallowRef();
|
||||
@ -58,20 +58,20 @@ const state = reactive({
|
||||
MENU_CONF: {
|
||||
uploadImage: {
|
||||
fieldName: 'file',
|
||||
customUpload(file: any, insertFn: any) {
|
||||
const uploadFun = async () => {
|
||||
const rps = await getAPI(SysFileApi).apiSysFileUploadFilesPostForm([file]);
|
||||
if (rps.data.type == 'success' && rps.data.result != null) {
|
||||
insertFn(baseUrl + rps.data.result[0].url, rps.data.result[0].fileName, baseUrl + rps.data.result[0].url);
|
||||
} else {
|
||||
ElMessage.error('上传失败!');
|
||||
}
|
||||
};
|
||||
uploadFun();
|
||||
customUpload(file: File) {
|
||||
getAPI(SysFileApi)
|
||||
.apiSysFileUploadFilePostForm(file)
|
||||
.then(({ data }) => {
|
||||
if (data.type == 'success' && data.result) {
|
||||
editorRef.value.insertNode({ type: 'image', src: data.result.url, alt: data.result.fileName, href: data.result.url, children: [{ text: '' }] });
|
||||
} else {
|
||||
ElMessage.error('上传失败!');
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
insertImage: {
|
||||
checkImage(src: string, alt: string, href: string): boolean | string | undefined {
|
||||
checkImage(src: string): boolean | string | undefined {
|
||||
if (src.indexOf('http') !== 0) {
|
||||
return '图片网址必须以 http/https 开头';
|
||||
}
|
||||
@ -87,17 +87,20 @@ const state = reactive({
|
||||
const handleCreated = (editor: IDomEditor) => {
|
||||
editorRef.value = editor;
|
||||
};
|
||||
|
||||
// 编辑器内容改变时
|
||||
const handleChange = (editor: IDomEditor) => {
|
||||
emit('update:getHtml', editor.getHtml());
|
||||
emit('update:getText', editor.getText());
|
||||
};
|
||||
|
||||
// 页面销毁时
|
||||
onBeforeUnmount(() => {
|
||||
const editor = editorRef.value;
|
||||
if (editor == null) return;
|
||||
editor.destroy();
|
||||
});
|
||||
|
||||
// 监听是否禁用改变
|
||||
// https://gitee.com/lyt-top/vue-next-admin/issues/I4LM7I
|
||||
watch(
|
||||
@ -111,6 +114,7 @@ watch(
|
||||
deep: true,
|
||||
}
|
||||
);
|
||||
|
||||
// 监听双向绑定值改变,用于回显
|
||||
watch(
|
||||
() => props.getHtml,
|
||||
@ -122,6 +126,7 @@ watch(
|
||||
}
|
||||
);
|
||||
</script>
|
||||
|
||||
<style lang="less">
|
||||
.editor-container {
|
||||
overflow-y: hidden;
|
||||
@ -131,10 +136,6 @@ watch(
|
||||
z-index: 10 !important;
|
||||
}
|
||||
}
|
||||
.w-e-text-container {
|
||||
// 文本框里面的层级调低
|
||||
//z-index: 3 !important;
|
||||
}
|
||||
.w-e-toolbar {
|
||||
// 给工具栏换行
|
||||
flex-wrap: wrap;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user