sunpengfei
2025-08-08 2da5c6be190d8078393eb2df777863931218ad19
feat:开发
5个文件已添加
7个文件已修改
311 ■■■■ 已修改文件
FlexJobApi.Core/Entities/Common/Resource.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/FlexJobApi.Core.xml 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfoQuery.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/UserServer/Users/Queries/GetUserResumeQuery.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/ResourceUtils/IResourceHttpProvider.cs 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.FlexJobServer.Test/FlexJobApi.FlexJobServer.Test.csproj 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.FlexJobServer.Test/Tasks/TaskUnitTest.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.FlexJobServer.Test/appsettings.json 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.sln 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Entities/Common/Resource.cs
@@ -1,7 +1,9 @@
using System;
using Furion.FriendlyException;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
@@ -113,5 +115,22 @@
        /// 是否已过期
        /// </summary>
        public bool IsExpired { get; set; }
        public HttpMethod GetHttpMethod()
        {
            switch (Method)
            {
                case EnumResourceMethod.Get:
                    return HttpMethod.Get;
                case EnumResourceMethod.Post:
                    return HttpMethod.Post;
                case EnumResourceMethod.Put:
                    return HttpMethod.Put;
                case EnumResourceMethod.Delete:
                    return HttpMethod.Delete;
                default:
                    throw Oops.Oh(EnumErrorCodeType.s400, "不支持的请求类型");
            }
        }
    }
}
FlexJobApi.Core/FlexJobApi.Core.xml
@@ -3110,6 +3110,16 @@
            任务地点详细地址
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.Longitude">
            <summary>
            经度
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.Latitude">
            <summary>
            纬度
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.BeginTime">
            <summary>
            任务开始时间
@@ -3140,9 +3150,14 @@
            关键字(任务名称)
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfosQuery.Time">
        <member name="P:FlexJobApi.Core.GetTaskInfosQuery.BeginTime">
            <summary>
            发布时间
            发布时间-开始
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfosQuery.EndTime">
            <summary>
            发布时间-结束
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfosQuery.CityCode">
@@ -4893,6 +4908,21 @@
            是否选中
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.GetUserResumeQuery">
            <summary>
            查询用户简历
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetUserResumeQuery.UserId">
            <summary>
            用户Id
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.GetUserResumeQueryResult">
            <summary>
            查询用户简历-结果
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.AliyunOptions">
            <summary>
            阿里云配置
@@ -5760,13 +5790,14 @@
            资源工具
            </summary>
        </member>
        <member name="M:FlexJobApi.Core.ResourceUtils.SendHttpAsync``2(``0)">
        <member name="M:FlexJobApi.Core.ResourceUtils.SendHttpAsync``2(``0,FlexJobApi.Core.IResourceHttpProvider)">
            <summary>
            发送HTTP请求
            </summary>
            <typeparam name="TRequest"></typeparam>
            <typeparam name="TResponse"></typeparam>
            <param name="request"></param>
            <param name="provider"></param>
            <returns></returns>
        </member>
        <member name="M:FlexJobApi.Core.ResourceUtils.GetHealthyServiceDomain(FlexJobApi.Core.Resource)">
FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfoQuery.cs
@@ -129,6 +129,16 @@
        public string AddressDetail { get; set; }
        /// <summary>
        /// 经度
        /// </summary>
        public decimal? Longitude { get; set; }
        /// <summary>
        /// 纬度
        /// </summary>
        public decimal? Latitude { get; set; }
        /// <summary>
        /// 任务开始时间
        /// </summary>
        public DateTime BeginTime { get; set; }
FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs
@@ -24,9 +24,14 @@
        public string Keywords { get; set; }
        /// <summary>
        /// 发布时间
        /// 发布时间-开始
        /// </summary>
        public DateTime? Time { get; set; }
        public DateTime? BeginTime { get; set; }
        /// <summary>
        /// 发布时间-结束
        /// </summary>
        public DateTime? EndTime { get; set; }
        /// <summary>
        /// 任务地点所属城市编号
FlexJobApi.Core/Models/UserServer/Users/Queries/GetUserResumeQuery.cs
New file
@@ -0,0 +1,29 @@
using MediatR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 查询用户简历
    /// </summary>
    [Resource([EnumResourceController.User])]
    public class GetUserResumeQuery : IRequest<GetUserResumeQueryResult>
    {
        /// <summary>
        /// 用户Id
        /// </summary>
        public Guid? UserId { get; set; }
    }
    /// <summary>
    /// 查询用户简历-结果
    /// </summary>
    public class GetUserResumeQueryResult
    {
    }
}
FlexJobApi.Core/Utils/ResourceUtils/IResourceHttpProvider.cs
New file
@@ -0,0 +1,46 @@
using Furion;
using Furion.FriendlyException;
using Furion.HttpRemote;
using Furion.Shapeless;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    public interface IResourceHttpProvider
    {
        HttpRequestBuilder AddAuthentication(HttpRequestBuilder builder);
        Task<TResponse> SendAsAsync<TResponse>(IHttpRemoteService httpRemoteService, HttpRequestBuilder builder);
    }
    public class DefaultResourceHttpProvider : IResourceHttpProvider
    {
        public HttpRequestBuilder AddAuthentication(HttpRequestBuilder builder)
        {
            var token = App.HttpContext.Request.Headers["Authorization"].ToString();
            var refreshToken = App.HttpContext.Request.Headers["X-Authorization"].ToString();
            return builder
                .AddAuthentication(new AuthenticationHeaderValue("Authorization", token))
                .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken));
        }
        public async Task<TResponse> SendAsAsync<TResponse>(IHttpRemoteService httpRemoteService, HttpRequestBuilder builder)
        {
            var response = await httpRemoteService.SendAsAsync<TResponse>(builder);
            dynamic clay = Clay.Parse(response);
            if (clay.Code == 401)
            {
                Console.WriteLine();
                throw new Exception();
            }
            else
            {
                return response;
            }
        }
    }
}
FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs
@@ -42,8 +42,11 @@
        /// <typeparam name="TRequest"></typeparam>
        /// <typeparam name="TResponse"></typeparam>
        /// <param name="request"></param>
        /// <param name="provider"></param>
        /// <returns></returns>
        public static async Task<TResponse> SendHttpAsync<TRequest, TResponse>(TRequest request)
        public static async Task<TResponse> SendHttpAsync<TRequest, TResponse>(
            TRequest request,
            IResourceHttpProvider provider = null)
            where TRequest : class, new()
        {
            var requestTypeFullName = typeof(TRequest).FullName;
@@ -52,46 +55,14 @@
                .FirstOrDefaultAsync();
            var domain = await GetHealthyServiceDomain(resource);
            var httpRemoteService = App.GetRequiredService<IHttpRemoteService>();
            var token = App.HttpContext.Request.Headers["Authorization"].ToString();
            var refreshToken = App.HttpContext.Request.Headers["X-Authorization"].ToString();
            TResponse response;
            switch (resource.Method)
            {
                case EnumResourceMethod.Get:
                    response = await httpRemoteService.GetAsAsync<TResponse>(
                        $"{domain}{resource.Route}",
                        it =>
                            it.WithQueryParameters(request)
                            .AddAuthentication(new AuthenticationHeaderValue("Authorization", token))
                            .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken)));
                    break;
                case EnumResourceMethod.Post:
                    response = await httpRemoteService.PostAsAsync<TResponse>(
                        $"{domain}{resource.Route}",
                        it =>
                            it.SetJsonContent(request)
                            .WithHeader("Authorization", token)
                            .WithHeader("X-Authorization", refreshToken));
                    break;
                case EnumResourceMethod.Put:
                    response = await httpRemoteService.PutAsAsync<TResponse>(
                        $"{domain}{resource.Route}",
                        it =>
                            it.SetJsonContent(request)
                            .AddAuthentication(new AuthenticationHeaderValue("Authorization", token))
                            .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken)));
                    break;
                case EnumResourceMethod.Delete:
                    response = await httpRemoteService.DeleteAsAsync<TResponse>(
                        $"{domain}{resource.Route}",
                        it =>
                            it.SetJsonContent(request)
                            .AddAuthentication(new AuthenticationHeaderValue("Authorization", token))
                            .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken)));
                    break;
                default:
                    throw Oops.Oh(EnumErrorCodeType.s400, $"不支持请求方式{resource.Method}");
            }
            var builder = HttpRequestBuilder.Create(resource.GetHttpMethod(), $"{domain}{resource.Route}");
            if (resource.Method == EnumResourceMethod.Get)
                builder = builder.WithQueryParameters(request);
            else
                builder = builder.SetJsonContent(request);
            provider = provider ?? new DefaultResourceHttpProvider();
            builder = provider.AddAuthentication(builder);
            var response = await provider.SendAsAsync<TResponse>(httpRemoteService, builder);
            return response;
        }
FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs
@@ -55,9 +55,9 @@
            {
                q = q.Where(it => it.Name.Contains(request.Keywords));
            }
            if (request.Time.HasValue)
            if (request.BeginTime.HasValue && request.EndTime.HasValue)
            {
                q = q.Where(it => it.BeginTime <= request.Time && request.Time <= it.EndTime);
                q = q.Where(it => request.BeginTime <= it.BeginTime && it.BeginTime <= request.EndTime);
            }
            if (request.CityCode.IsNotNull())
            {
FlexJobApi.FlexJobServer.Test/FlexJobApi.FlexJobServer.Test.csproj
New file
@@ -0,0 +1,33 @@
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <IsPackable>false</IsPackable>
  </PropertyGroup>
  <ItemGroup>
    <Content Include="appsettings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    </Content>
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="coverlet.collector" Version="6.0.2" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
    <PackageReference Include="xunit" Version="2.9.2" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\FlexJobApi.Core\FlexJobApi.Core.csproj" />
  </ItemGroup>
  <ItemGroup>
    <Using Include="Xunit" />
  </ItemGroup>
</Project>
FlexJobApi.FlexJobServer.Test/Tasks/TaskUnitTest.cs
New file
@@ -0,0 +1,29 @@
using FlexJobApi.Core;
using System.Threading.Tasks;
namespace FlexJobApi.FlexJobServer.Test
{
    public class TaskUnitTest
    {
        [Fact]
        public async Task Test1()
        {
            var categories = await ResourceUtils.SendHttpAsync<
                GetDictionaryCategorySelectQuery,
                FriendlyResult<SelectOption<Guid, GetDictionaryCategorySelectQueryOption>>>(
                new GetDictionaryCategorySelectQuery());
            Console.WriteLine();
            var result = await ResourceUtils.SendHttpAsync<SaveTaskInfoCommand, Guid>(new SaveTaskInfoCommand
            {
                Name = "测试任务",
                BillingMethod = EnumBillingMethod.Month,
                ServiceFee = 100,
                SettlementCycle = EnumSettlementCycle.Month,
                Benefits = new List<string>
                {
                }
            });
        }
    }
}
FlexJobApi.FlexJobServer.Test/appsettings.json
New file
@@ -0,0 +1,33 @@
{
  "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json",
  "ConnectionStrings": {
    "FlexJobApi": "Server=120.26.58.240; Database=Dev_FlexJobApi; User=bole;Password=Bole1472589;Encrypt=false;",
    "FlexJobApiLog": "Server=120.26.58.240; Database=Dev_FlexJobApiLog; User=bole;Password=Bole1472589;Encrypt=false;",
    "HumanResources": "Server=120.26.58.240; Database=Dev_12333; User=bole;Password=Bole1472589;Encrypt=false;"
  },
  "Consul": {
    "Address": "http://localhost:8500/",
    "ServiceName": "Local_FlexJobApi",
    "ServiceIP": "localhost",
    "ServicePort": 53780,
    "ServiceHealthCheck": "/healthz"
  },
  "DistributedCache": {
    "Access": "Redis",
    "Configuration": "118.178.252.28:5390,password=Bole123!"
  },
  "Aliyun": {
    "OSS": {
      "AccessKeyId": "LTAI4GAdJ88mUMMFBHHiyDmS",
      "AccessSecret": "NX3AmjOcGkJ8bncQfIVxqmifBWkI0E",
      "RegionId": "cn-hangzhou",
      "Endpoint": "http://oss-cn-hangzhou.aliyuncs.com",
      "BucketName": "waterdroptest2",
      "Url": "https://waterdroptest2.oss-cn-hangzhou.aliyuncs.com/",
      "RoleArn": "acs:ram::1483797030072898:role/boleoss",
      "RoleSessionName": "SessionTest",
      "Policy": "{\"Version\":\"1\",\"Statement\":[{\"Effect\":\"Allow\",\"Action\":\"oss:PutObject\",\"Resource\":[\"acs:oss:*:*:waterdroptest2/*\",\"acs:oss:*:*:parkmanagement/*\",\"acs:oss:*:*:jurenlian/*\"]}]}",
      "DurationSeconds": 3600
    }
  }
}
FlexJobApi.sln
@@ -19,6 +19,8 @@
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FlexJobApi.FlexJobServer.Application", "FlexJobApi.FlexJobServer.Application\FlexJobApi.FlexJobServer.Application.csproj", "{6D8B1CA5-5859-491D-8E16-027ED8E44BDE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FlexJobApi.FlexJobServer.Test", "FlexJobApi.FlexJobServer.Test\FlexJobApi.FlexJobServer.Test.csproj", "{1D9D054D-B5D4-4F5B-B1D1-0354CD0F322F}"
EndProject
Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        Debug|Any CPU = Debug|Any CPU
@@ -49,6 +51,10 @@
        {6D8B1CA5-5859-491D-8E16-027ED8E44BDE}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {6D8B1CA5-5859-491D-8E16-027ED8E44BDE}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {6D8B1CA5-5859-491D-8E16-027ED8E44BDE}.Release|Any CPU.Build.0 = Release|Any CPU
        {1D9D054D-B5D4-4F5B-B1D1-0354CD0F322F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {1D9D054D-B5D4-4F5B-B1D1-0354CD0F322F}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {1D9D054D-B5D4-4F5B-B1D1-0354CD0F322F}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {1D9D054D-B5D4-4F5B-B1D1-0354CD0F322F}.Release|Any CPU.Build.0 = Release|Any CPU
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE
@@ -56,6 +62,7 @@
    GlobalSection(NestedProjects) = preSolution
        {BAC3E134-8D84-4F6D-8C25-AD6FD8A95697} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
        {6D8B1CA5-5859-491D-8E16-027ED8E44BDE} = {39E37108-90DA-4908-B04C-B5A06591326D}
        {1D9D054D-B5D4-4F5B-B1D1-0354CD0F322F} = {39E37108-90DA-4908-B04C-B5A06591326D}
    EndGlobalSection
    GlobalSection(ExtensibilityGlobals) = postSolution
        SolutionGuid = {B2073C2C-0FD3-452B-8047-8134D68E12CE}