提交新版本

development
温天培 1 year ago
parent 40b305e418
commit 10da1957af

@ -2,8 +2,6 @@
using SqlSugar;
using System.ComponentModel;
using GDZZ.Core.Entity;
using GDZZ.Application.Enum;
namespace GDZZ.Application.Entity
{
/// <summary>
@ -32,7 +30,7 @@ namespace GDZZ.Application.Entity
/// <summary>
/// 审核状态
/// </summary>
public CompanyEnum ApprovalStatus { get; set; }
public int ApprovalStatus { get; set; }
/// <summary>
/// 审核人
/// </summary>
@ -41,5 +39,9 @@ namespace GDZZ.Application.Entity
/// 审核时间
/// </summary>
public DateTime ApprovalTime { get; set; }
/// <summary>
/// 公司地址
/// </summary>
public string Address { get; set; }
}
}

@ -0,0 +1,39 @@
using System;
using SqlSugar;
using System.ComponentModel;
using GDZZ.Core.Entity;
namespace GDZZ.Application.Entity
{
/// <summary>
/// 小程序求职
/// </summary>
[SugarTable("mini_jobhunt")]
[Description("小程序求职")]
public class JobHunt : DEntityBase
{
/// <summary>
/// 职业名称
/// </summary>
public string Career { get; set; }
/// <summary>
/// 个人简介
/// </summary>
public string Info { get; set; }
/// <summary>
/// 期望工作地点
/// </summary>
public string Address { get; set; }
/// <summary>
/// 标志
/// </summary>
public string Tags { get; set; }
/// <summary>
/// 电话
/// </summary>
public string phone { get; set; }
/// <summary>
/// 头像
/// </summary>
public string Logo { get; set; }
}
}

@ -2,7 +2,7 @@
using SqlSugar;
using System.ComponentModel;
using GDZZ.Core.Entity;
using GDZZ.Application.Enum;
using GDZZ.Application;
namespace GDZZ.Application.Entity
{

@ -0,0 +1,23 @@
using System;
using SqlSugar;
using System.ComponentModel;
using GDZZ.Core.Entity;
namespace GDZZ.Application.Entity
{
/// <summary>
/// 套餐表
/// </summary>
[SugarTable("mini_thali")]
[Description("套餐表")]
public class MiniThali : DEntityBase
{
/// <summary>
/// 套餐金额
/// </summary>
public decimal Amount { get; set; }
/// <summary>
/// 套餐名称
/// </summary>
public string Name { get; set; }
}
}

@ -5,7 +5,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GDZZ.Application.Enum
namespace GDZZ.Application
{
public enum CompanyEnum
{

@ -5,7 +5,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GDZZ.Application.Enum
namespace GDZZ.Application
{
public enum RechargeTypeEnum
{

@ -5,7 +5,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GDZZ.Application.Enum
namespace GDZZ.Application
{
public enum ResumeStatusEnum
{
@ -14,24 +14,17 @@ namespace GDZZ.Application.Enum
/// </summary>
[Description("已发布")] Release = 0,
/// <summary>
/// 招聘成功
/// </summary>
[Description("招聘成功")] Success = 1,
/// <summary>
/// 审核通过
/// 下架
/// </summary>
[Description("审核通过")] Approved = 2,
[Description("下架")] OffShelf = 10,
/// <summary>
/// 审核未通过
/// </summary>
[Description("审核未通过")] Rejected = 3,
[Description("审核未通过")] Rejected = 30,

@ -38,6 +38,12 @@ namespace GDZZ.Application
/// </summary>
public const string MINI_USERINFO = "Live_Message:";
/// <summary>
/// 小程序电话验证码
/// </summary>
public const string MINI_USERPHONECODE = "User_PhoneCode:";
#endregion
}
}

@ -10,7 +10,8 @@
<PackageReference Include="Senparc.CO2NET.WebApi" Version="1.3.3.7" />
<PackageReference Include="Senparc.NeuChar.App" Version="1.1.4.5" />
<PackageReference Include="Senparc.NeuChar.AspNet" Version="1.1.3.5" />
<PackageReference Include="Senparc.Weixin.MP.MVC" Version="7.12.5.5" />
<PackageReference Include="TencentCloudSDK.Common" Version="3.0.820" />
<PackageReference Include="TencentCloudSDK.Sms" Version="3.0.820" />
</ItemGroup>
@ -24,7 +25,9 @@
<Content Include="applicationsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="GDZZ.Application.xml" />
<Content Include="GDZZ.Application.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>

@ -114,6 +114,11 @@
审核时间
</summary>
</member>
<member name="P:GDZZ.Application.Entity.Company.Address">
<summary>
公司地址
</summary>
</member>
<member name="T:GDZZ.Application.Entity.Consume">
<summary>
消费记录
@ -239,6 +244,41 @@
创建时间
</summary>
</member>
<member name="T:GDZZ.Application.Entity.JobHunt">
<summary>
小程序求职
</summary>
</member>
<member name="P:GDZZ.Application.Entity.JobHunt.Career">
<summary>
职业名称
</summary>
</member>
<member name="P:GDZZ.Application.Entity.JobHunt.Info">
<summary>
个人简介
</summary>
</member>
<member name="P:GDZZ.Application.Entity.JobHunt.Address">
<summary>
期望工作地点
</summary>
</member>
<member name="P:GDZZ.Application.Entity.JobHunt.Tags">
<summary>
标志
</summary>
</member>
<member name="P:GDZZ.Application.Entity.JobHunt.phone">
<summary>
电话
</summary>
</member>
<member name="P:GDZZ.Application.Entity.JobHunt.Logo">
<summary>
头像
</summary>
</member>
<member name="T:GDZZ.Application.Entity.LiveHistoryContacts">
<summary>
聊天历史任务列表
@ -489,6 +529,21 @@
状态
</summary>
</member>
<member name="T:GDZZ.Application.Entity.MiniThali">
<summary>
套餐表
</summary>
</member>
<member name="P:GDZZ.Application.Entity.MiniThali.Amount">
<summary>
套餐金额
</summary>
</member>
<member name="P:GDZZ.Application.Entity.MiniThali.Name">
<summary>
套餐名称
</summary>
</member>
<member name="T:GDZZ.Application.Entity.Recommend">
<summary>
推荐表
@ -569,51 +624,21 @@
求职联系费用
</summary>
</member>
<member name="F:GDZZ.Application.Enum.CompanyEnum.Pending">
<member name="F:GDZZ.Application.CompanyEnum.Pending">
<summary>
待审核
</summary>
</member>
<member name="F:GDZZ.Application.Enum.CompanyEnum.Approved">
<member name="F:GDZZ.Application.CompanyEnum.Approved">
<summary>
联系费用
</summary>
</member>
<member name="F:GDZZ.Application.Enum.CompanyEnum.Rejected">
<member name="F:GDZZ.Application.CompanyEnum.Rejected">
<summary>
联系费用
</summary>
</member>
<member name="F:GDZZ.Application.Enum.RechargeTypeEnum.Reward">
<summary>
奖励
</summary>
</member>
<member name="F:GDZZ.Application.Enum.RechargeTypeEnum.StoredValue">
<summary>
储值
</summary>
</member>
<member name="F:GDZZ.Application.Enum.ResumeStatusEnum.Release">
<summary>
已发布
</summary>
</member>
<member name="F:GDZZ.Application.Enum.ResumeStatusEnum.Success">
<summary>
招聘成功
</summary>
</member>
<member name="F:GDZZ.Application.Enum.ResumeStatusEnum.Approved">
<summary>
审核通过
</summary>
</member>
<member name="F:GDZZ.Application.Enum.ResumeStatusEnum.Rejected">
<summary>
审核未通过
</summary>
</member>
<member name="F:GDZZ.Application.ConsumeEnum.Contact">
<summary>
联系费用
@ -654,6 +679,31 @@
完成
</summary>
</member>
<member name="F:GDZZ.Application.RechargeTypeEnum.Reward">
<summary>
奖励
</summary>
</member>
<member name="F:GDZZ.Application.RechargeTypeEnum.StoredValue">
<summary>
储值
</summary>
</member>
<member name="F:GDZZ.Application.ResumeStatusEnum.Release">
<summary>
已发布
</summary>
</member>
<member name="F:GDZZ.Application.ResumeStatusEnum.OffShelf">
<summary>
下架
</summary>
</member>
<member name="F:GDZZ.Application.ResumeStatusEnum.Rejected">
<summary>
审核未通过
</summary>
</member>
<member name="T:GDZZ.Application.SalaryEnum">
<summary>
@ -684,6 +734,11 @@
小程序用户信息
</summary>
</member>
<member name="F:GDZZ.Application.SystemConst.MINI_USERPHONECODE">
<summary>
小程序电话验证码
</summary>
</member>
<member name="T:GDZZ.Application.UserEnum">
<summary>
用户类型枚举
@ -761,6 +816,56 @@
</summary>
<returns></returns>
</member>
<member name="M:GDZZ.Application.Help.ICacheService.SetUserInfoAsync(GDZZ.Application.AuthUserOut,System.Int64)">
<summary>
</summary>
<param name="authUserOut"></param>
<param name="UserID"></param>
<returns></returns>
</member>
<member name="M:GDZZ.Application.Help.ICacheService.GetUserInfoAsync(System.Int64)">
<summary>
设置用户缓存
</summary>
<param name="UserID"></param>
<returns></returns>
</member>
<member name="M:GDZZ.Application.Help.ICacheService.SetVerifyCode(System.String,System.String)">
<summary>
设置验证码
</summary>
<returns></returns>
</member>
<member name="M:GDZZ.Application.Help.ICacheService.GetVerifyCode(System.String)">
<summary>
获取验证码
</summary>
<param name="UserID"></param>
<returns></returns>
</member>
<member name="M:GDZZ.Application.Help.TencentCloudExamples.SendTextMessage(TencentCloud.Sms.V20210111.Models.SendSmsRequest,TencentCloud.Common.Credential)">
<summary>
发送验证码
</summary>
<param name="req"></param>
<param name="cred"></param>
</member>
<member name="M:GDZZ.Application.Help.TencentCloudSmsService.SendCode(System.String,System.Int64,System.Int32)">
<summary>
发送验证码
</summary>
<param name="countryCode">电话号码</param>
<param name="mobile"></param>
<param name="code"></param>
<returns></returns>
</member>
<member name="M:GDZZ.Application.Help.TencentCloudSmsService.GetRandom">
<summary>
随机数
</summary>
<returns></returns>
</member>
<member name="M:GDZZ.Application.Help.Utils.ShowHelp(System.DateTime)">
<summary>
@ -782,7 +887,19 @@
</member>
<member name="M:GDZZ.Application.Service.Auth.AuthService.SignInAsync(GDZZ.Core.OAuth.PhoneModel)">
<summary>
手机端登录
手机端登录(一键登录)
</summary>
<returns></returns>
</member>
<member name="M:GDZZ.Application.Service.Auth.AuthService.SignInCodeAsync(GDZZ.Core.OAuth.PhoneModel)">
<summary>
手机端登录(验证码登录)
</summary>
<returns></returns>
</member>
<member name="M:GDZZ.Application.Service.Auth.AuthService.SendTextMessage(System.String)">
<summary>
发送验证码
</summary>
<returns></returns>
</member>
@ -792,6 +909,13 @@
</summary>
<returns></returns>
</member>
<member name="M:GDZZ.Application.Service.Auth.AuthService.GetConfigCache(System.String)">
<summary>
获取配置信息
</summary>
<param name="code"></param>
<returns></returns>
</member>
<member name="T:GDZZ.Application.Service.Auth.IAuthService">
<summary>
业务权限控制
@ -1251,6 +1375,13 @@
公司属性服务
</summary>
</member>
<member name="M:GDZZ.Application.CompanyService.Page(GDZZ.Application.CompanyInput)">
<summary>
分页查询套餐管理
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:GDZZ.Application.CompanyService.Update(GDZZ.Application.UpdateCompanyInput)">
<summary>
更新公司属性
@ -1335,6 +1466,11 @@
公司详情图片
</summary>
</member>
<member name="P:GDZZ.Application.CompanyInput.Address">
<summary>
公司地址
</summary>
</member>
<member name="P:GDZZ.Application.DeleteCompanyInput.Id">
<summary>
主键Id
@ -2401,6 +2537,20 @@
<param name="input"></param>
<returns></returns>
</member>
<member name="M:GDZZ.Application.MiniResumeService.OffResume">
<summary>
招聘下架条数
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:GDZZ.Application.MiniResumeService.GetSelfResumeListNumber">
<summary>
获取发布数量
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:GDZZ.Application.MiniResumeService.Delete(GDZZ.Application.DeleteMiniResumeInput)">
<summary>
删除招聘信息
@ -2415,6 +2565,128 @@
<param name="input"></param>
<returns></returns>
</member>
<member name="T:GDZZ.Application.MiniThaliDto">
<summary>
套餐管理输出参数
</summary>
</member>
<member name="P:GDZZ.Application.MiniThaliDto.Id">
<summary>
主键Id
</summary>
</member>
<member name="P:GDZZ.Application.MiniThaliDto.Amount">
<summary>
套餐金额
</summary>
</member>
<member name="P:GDZZ.Application.MiniThaliDto.Name">
<summary>
套餐名称
</summary>
</member>
<member name="T:GDZZ.Application.MiniThaliInput">
<summary>
套餐管理输入参数
</summary>
</member>
<member name="P:GDZZ.Application.MiniThaliInput.Amount">
<summary>
套餐金额
</summary>
</member>
<member name="P:GDZZ.Application.MiniThaliInput.Name">
<summary>
套餐名称
</summary>
</member>
<member name="P:GDZZ.Application.AddMiniThaliInput.Amount">
<summary>
套餐金额
</summary>
</member>
<member name="P:GDZZ.Application.AddMiniThaliInput.Name">
<summary>
套餐名称
</summary>
</member>
<member name="P:GDZZ.Application.DeleteMiniThaliInput.Id">
<summary>
主键Id
</summary>
</member>
<member name="P:GDZZ.Application.UpdateMiniThaliInput.Id">
<summary>
主键Id
</summary>
</member>
<member name="T:GDZZ.Application.MiniThaliOutput">
<summary>
套餐管理输出参数
</summary>
</member>
<member name="P:GDZZ.Application.MiniThaliOutput.Id">
<summary>
主键Id
</summary>
</member>
<member name="P:GDZZ.Application.MiniThaliOutput.Amount">
<summary>
套餐金额
</summary>
</member>
<member name="P:GDZZ.Application.MiniThaliOutput.Name">
<summary>
套餐名称
</summary>
</member>
<member name="T:GDZZ.Application.MiniThaliService">
<summary>
套餐管理服务
</summary>
</member>
<member name="M:GDZZ.Application.MiniThaliService.Page(GDZZ.Application.MiniThaliInput)">
<summary>
分页查询套餐管理
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:GDZZ.Application.MiniThaliService.Add(GDZZ.Application.AddMiniThaliInput)">
<summary>
增加套餐管理
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:GDZZ.Application.MiniThaliService.Delete(GDZZ.Application.DeleteMiniThaliInput)">
<summary>
删除套餐管理
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:GDZZ.Application.MiniThaliService.Update(GDZZ.Application.UpdateMiniThaliInput)">
<summary>
更新套餐管理
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:GDZZ.Application.MiniThaliService.Get(GDZZ.Application.QueryeMiniThaliInput)">
<summary>
获取套餐管理
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:GDZZ.Application.MiniThaliService.List(GDZZ.Application.MiniThaliInput)">
<summary>
获取套餐管理列表
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="T:GDZZ.Application.SysRegionDto">
<summary>
地区表输出参数
@ -2658,5 +2930,207 @@
<param name="input"></param>
<returns></returns>
</member>
<member name="T:Magic.Application.JobHuntDto">
<summary>
求职列表输出参数
</summary>
</member>
<member name="P:Magic.Application.JobHuntDto.Id">
<summary>
主键Id
</summary>
</member>
<member name="P:Magic.Application.JobHuntDto.Career">
<summary>
职业名称
</summary>
</member>
<member name="P:Magic.Application.JobHuntDto.Info">
<summary>
个人简介
</summary>
</member>
<member name="P:Magic.Application.JobHuntDto.Address">
<summary>
期望工作地点
</summary>
</member>
<member name="P:Magic.Application.JobHuntDto.Tags">
<summary>
标志
</summary>
</member>
<member name="P:Magic.Application.JobHuntDto.phone">
<summary>
电话
</summary>
</member>
<member name="P:Magic.Application.JobHuntDto.Logo">
<summary>
头像
</summary>
</member>
<member name="T:Magic.Application.JobHuntInput">
<summary>
求职列表输入参数
</summary>
</member>
<member name="P:Magic.Application.JobHuntInput.Career">
<summary>
职业名称
</summary>
</member>
<member name="P:Magic.Application.JobHuntInput.Info">
<summary>
个人简介
</summary>
</member>
<member name="P:Magic.Application.JobHuntInput.Address">
<summary>
期望工作地点
</summary>
</member>
<member name="P:Magic.Application.JobHuntInput.Tags">
<summary>
标志
</summary>
</member>
<member name="P:Magic.Application.JobHuntInput.phone">
<summary>
电话
</summary>
</member>
<member name="P:Magic.Application.JobHuntInput.Logo">
<summary>
头像
</summary>
</member>
<member name="P:Magic.Application.AddJobHuntInput.Career">
<summary>
职业名称
</summary>
</member>
<member name="P:Magic.Application.AddJobHuntInput.Info">
<summary>
个人简介
</summary>
</member>
<member name="P:Magic.Application.AddJobHuntInput.Address">
<summary>
期望工作地点
</summary>
</member>
<member name="P:Magic.Application.AddJobHuntInput.Tags">
<summary>
标志
</summary>
</member>
<member name="P:Magic.Application.AddJobHuntInput.phone">
<summary>
电话
</summary>
</member>
<member name="P:Magic.Application.AddJobHuntInput.Logo">
<summary>
头像
</summary>
</member>
<member name="P:Magic.Application.DeleteJobHuntInput.Id">
<summary>
主键Id
</summary>
</member>
<member name="P:Magic.Application.UpdateJobHuntInput.Id">
<summary>
主键Id
</summary>
</member>
<member name="T:Magic.Application.JobHuntOutput">
<summary>
求职列表输出参数
</summary>
</member>
<member name="P:Magic.Application.JobHuntOutput.Id">
<summary>
主键Id
</summary>
</member>
<member name="P:Magic.Application.JobHuntOutput.Career">
<summary>
职业名称
</summary>
</member>
<member name="P:Magic.Application.JobHuntOutput.Info">
<summary>
个人简介
</summary>
</member>
<member name="P:Magic.Application.JobHuntOutput.Address">
<summary>
期望工作地点
</summary>
</member>
<member name="P:Magic.Application.JobHuntOutput.Tags">
<summary>
标志
</summary>
</member>
<member name="P:Magic.Application.JobHuntOutput.phone">
<summary>
电话
</summary>
</member>
<member name="P:Magic.Application.JobHuntOutput.Logo">
<summary>
头像
</summary>
</member>
<member name="T:Magic.Application.JobHuntService">
<summary>
求职列表服务
</summary>
</member>
<member name="M:Magic.Application.JobHuntService.Page(Magic.Application.JobHuntInput)">
<summary>
分页查询求职列表
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Magic.Application.JobHuntService.Add(Magic.Application.AddJobHuntInput)">
<summary>
增加求职列表
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Magic.Application.JobHuntService.Delete(Magic.Application.DeleteJobHuntInput)">
<summary>
删除求职列表
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Magic.Application.JobHuntService.Update(Magic.Application.UpdateJobHuntInput)">
<summary>
更新求职列表
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Magic.Application.JobHuntService.Get(Magic.Application.QueryeJobHuntInput)">
<summary>
获取求职列表
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Magic.Application.JobHuntService.List(Magic.Application.JobHuntInput)">
<summary>
获取求职列表列表
</summary>
<param name="input"></param>
<returns></returns>
</member>
</members>
</doc>

@ -147,6 +147,18 @@ namespace GDZZ.Application.Help
return await _redisCache.GetAsync<AuthUserOut>(cacheKey);
}
public async Task SetVerifyCode(string Phone, string Verify)
{
string cacheKey = SystemConst.MINI_USERPHONECODE + $"{Phone}";
await _redisCache.SetAsync(cacheKey, Verify, TimeSpan.FromMinutes(1));
}
public async Task<string> GetVerifyCode(string Phone)
{
string cacheKey = SystemConst.MINI_USERPHONECODE + $"{Phone}";
return await _redisCache.GetAsync<string>(cacheKey);
}
#endregion
}
}

@ -27,8 +27,37 @@ namespace GDZZ.Application.Help
#region 用户信息
/// <summary>
///
/// </summary>
/// <param name="authUserOut"></param>
/// <param name="UserID"></param>
/// <returns></returns>
Task SetUserInfoAsync(AuthUserOut authUserOut, long UserID);
/// <summary>
/// 设置用户缓存
/// </summary>
/// <param name="UserID"></param>
/// <returns></returns>
Task<AuthUserOut> GetUserInfoAsync(long UserID);
/// <summary>
/// 设置验证码
/// </summary>
/// <returns></returns>
Task SetVerifyCode(string Phone, string Verify);
/// <summary>
/// 获取验证码
/// </summary>
/// <param name="UserID"></param>
/// <returns></returns>
Task<string> GetVerifyCode(string Phone);
#endregion
}
}

@ -0,0 +1,38 @@
using System;
using TencentCloud.Common.Profile;
using TencentCloud.Common;
using TencentCloud.Sms.V20210111;
using TencentCloud.Sms.V20210111.Models;
using GDZZ.Core.Entity;
using GDZZ.Core;
namespace GDZZ.Application.Help
{
public class TencentCloudExamples
{
/// <summary>
/// 发送验证码
/// </summary>
/// <param name="req"></param>
/// <param name="cred"></param>
public static void SendTextMessage(SendSmsRequest req, Credential cred)
{
// 实例化一个client选项可选的没有特殊需求可以跳过
ClientProfile clientProfile = new ClientProfile();
// 实例化一个http选项可选的没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.Endpoint = ("sms.tencentcloudapi.com");
clientProfile.HttpProfile = httpProfile;
// 实例化要请求产品的client对象,clientProfile是可选的
SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile);
// 返回的resp是一个SendSmsResponse的实例与请求对象对应
SendSmsResponse resp = client.SendSmsSync(req);
// 输出json格式的字符串回包
Console.WriteLine(AbstractModel.ToJsonString(resp));
}
}
}

@ -0,0 +1,95 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Json;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace GDZZ.Application.Help
{
public class TencentCloudSmsService
{
private static readonly HttpClient _httpClient =
new HttpClient { BaseAddress = new Uri("https://yun.tim.qq.com") };
private readonly string _appId;
private readonly string _appKey;
private const string SIGNATURE = "...";
private const int DOMESTIC_TEMPLATE_ID = 1234;
private const int OVERSEA_TEMPLATE_ID = 5678;
private readonly ILogger _logger;
public TencentCloudSmsService(IConfiguration conf,
ILoggerFactory loggerFactory)
{
_appId = conf["tencentCloudSms:appId"];
if (string.IsNullOrEmpty(_appId))
throw new ArgumentException($"{nameof(_appId)} must have a value");
_appKey = conf["tencentCloudSms:appKey"];
if (string.IsNullOrEmpty(_appKey))
throw new ArgumentException($"{nameof(_appKey)} must have a value");
_logger = loggerFactory.CreateLogger<TencentCloudSmsService>();
}
/// <summary>
/// 发送验证码
/// </summary>
/// <param name="countryCode">电话号码</param>
/// <param name="mobile"></param>
/// <param name="code"></param>
/// <returns></returns>
public async Task<bool> SendCode(string countryCode, long mobile, int code)
{
var random = GetRandom();
var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
var data = new
{
tel = new { nationcode = countryCode.Replace("+", ""), mobile = mobile.ToString() },
sign = SIGNATURE,
tpl_id = countryCode == "+86" ? DOMESTIC_TEMPLATE_ID : OVERSEA_TEMPLATE_ID,
@params = new[] { code.ToString() },
sig = ComputeSignature(mobile, random, timestamp),
time = timestamp,
extend = "",
ext = ""
};
var url = $"/v5/tlssmssvr/sendsms?sdkappid={_appId}&random={random}";
_logger.LogDebug("Post to " + _httpClient.BaseAddress + url);
var response = await _httpClient.PostAsJsonAsync<dynamic>(url, data);
_logger.LogDebug("Post data:\n" + JsonConvert.SerializeObject(data));
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadFromJsonAsync<decimal>();
if (result != 0)
{
//_logger.LogError($"Failed to send message to {countryCode}-{mobile}: {result.errmsg}");
return false;
}
return true;
}
private string ComputeSignature(long mobile, int random, long timestamp)
{
var input = $"appkey={_appKey}&random={random}&time={timestamp}&mobile={mobile}";
var hasBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(input));
return string.Join("", hasBytes.Select(b => b.ToString("x2")));
}
/// <summary>
/// 随机数
/// </summary>
/// <returns></returns>
private int GetRandom()
{
return new Random().Next(100000, 999999);
}
}
}

@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace GDZZ.Application.Help
{
public static class Utils
public static class Utils
{
//自定义进制(0、O没有加入,容易混淆同时排除X,用X补位)
@ -25,7 +25,7 @@ namespace GDZZ.Application.Help
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
public static bool ShowHelp(DateTime date)
public static bool ShowHelp(DateTime date)
{
bool isTheDay = false;
//判断日期是否是当天
@ -87,5 +87,49 @@ namespace GDZZ.Application.Help
long result = BitConverter.ToInt64(buffer, 0);
return (Math.Abs(result % (maxValue - minValue)) + minValue);
}
public static string stringToUnicode(string s)
{
if (!containsEmoji(s))
return s;
string str = "";
for (int i = 0; i < s.Length; i++)
{
int ch = (int)s[i];
if (ch > 255)
{
str += "\\u" + String.Format("{0:X}", ch);
}
else
{
str += s[i].ToString();
}
}
return str;
}
public static bool containsEmoji(String str)
{
int len = str.Length;
for (int i = 0; i < len; i++)
{
if (isEmojiCharacter(str[i]))
{
return true;
}
}
return false;
}
public static bool isEmojiCharacter(char codePoint)
{
return !((codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA)
|| (codePoint == 0xD)
|| ((codePoint >= 0x20) && (codePoint <= 0xD7FF))
|| ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))
|| ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF)));
}
}
}

@ -1,133 +0,0 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>GDZZ.Application</name>
</assembly>
<members>
<member name="T:GDZZ.Application.Entity.JobhuntMessage">
<summary>
求职信息
</summary>
</member>
<member name="P:GDZZ.Application.Entity.JobhuntMessage.TenantId">
<summary>
租户Id
</summary>
</member>
<member name="P:GDZZ.Application.Entity.JobhuntMessage.PositionInfo">
<summary>
求职详情
</summary>
</member>
<member name="P:GDZZ.Application.Entity.JobhuntMessage.Title">
<summary>
求职标题
</summary>
</member>
<member name="P:GDZZ.Application.Entity.JobhuntMessage.Status">
<summary>
求职状态
</summary>
</member>
<member name="P:GDZZ.Application.Entity.JobhuntMessage.Experience">
<summary>
经验
</summary>
</member>
<member name="P:GDZZ.Application.Entity.JobhuntMessage.Tag">
<summary>
标签
</summary>
</member>
<member name="P:GDZZ.Application.Entity.JobhuntMessage.ProvinceId">
<summary>
省份
</summary>
</member>
<member name="P:GDZZ.Application.Entity.JobhuntMessage.CityId">
<summary>
城市
</summary>
</member>
<member name="T:GDZZ.Application.Entity.RecruitMessage">
<summary>
招聘消息
</summary>
</member>
<member name="P:GDZZ.Application.Entity.RecruitMessage.TenantId">
<summary>
租户Id
</summary>
</member>
<member name="P:GDZZ.Application.Entity.RecruitMessage.PositionInfo">
<summary>
职位详情
</summary>
</member>
<member name="P:GDZZ.Application.Entity.RecruitMessage.Title">
<summary>
标题
</summary>
</member>
<member name="P:GDZZ.Application.Entity.RecruitMessage.Status">
<summary>
状态
</summary>
</member>
<member name="P:GDZZ.Application.Entity.RecruitMessage.ProvinceId">
<summary>
省份
</summary>
</member>
<member name="P:GDZZ.Application.Entity.RecruitMessage.CityId">
<summary>
城市
</summary>
</member>
<member name="P:GDZZ.Application.Entity.RecruitMessage.AreaId">
<summary>
</summary>
</member>
<member name="P:GDZZ.Application.Entity.RecruitMessage.Address">
<summary>
详细地址
</summary>
</member>
<member name="P:GDZZ.Application.Entity.RecruitMessage.Phone">
<summary>
联系电话
</summary>
</member>
<member name="P:GDZZ.Application.Entity.RecruitMessage.Tag">
<summary>
标签
</summary>
</member>
<member name="P:GDZZ.Application.Entity.RecruitMessage.Education">
<summary>
学历
</summary>
</member>
<member name="P:GDZZ.Application.Entity.RecruitMessage.Experience">
<summary>
经验
</summary>
</member>
<member name="T:GDZZ.Application.Entity.SysArea">
<summary>
系统地区数据
</summary>
</member>
<member name="P:GDZZ.Application.Entity.SysArea.parent_id">
<summary>
父级ID
</summary>
</member>
<member name="P:GDZZ.Application.Entity.SysArea.name">
<summary>
地区名
</summary>
</member>
</members>
</doc>

@ -18,6 +18,8 @@ using GDZZ.Application.Help;
using Microsoft.AspNetCore.Authorization;
using Mapster;
using GDZZ.Core.Service;
using TencentCloud.Sms.V20210111.Models;
using TencentCloud.Common;
namespace GDZZ.Application.Service.Auth
{
@ -31,6 +33,8 @@ namespace GDZZ.Application.Service.Auth
private readonly SqlSugarRepository<SeIF> Self; //职业仓储
private readonly SqlSugarRepository<Company> CompanyRep;
private readonly SqlSugarRepository<MiniPayTake> payTakeRep; //支付仓储
private readonly SqlSugarRepository<SysConfig> _sysConfigRep; // 参数配置表仓储
private readonly ISysCacheService _sysCacheService; //缓存
#endregion
#region 服务
@ -54,6 +58,8 @@ namespace GDZZ.Application.Service.Auth
SqlSugarRepository<SeIF> Self,
SqlSugarRepository<Company> CompanyRep,
SqlSugarRepository<MiniPayTake> payTakeRep,
SqlSugarRepository<SysConfig> sysConfigRep,
ISysCacheService sysCacheService,
ICacheService cacheService,
WechatOAuth wechatOAuth,
IEventPublisher eventPublisher,
@ -68,12 +74,14 @@ namespace GDZZ.Application.Service.Auth
this.cacheService= cacheService;
this.Self = Self;
this.payTakeRep = payTakeRep;
this._sysCacheService= sysCacheService;
this._sysConfigRep= sysConfigRep;
_wechatOAuth = wechatOAuth;
_oauthConfig = options.Value.Wechat;
}
/// <summary>
/// 手机端登录
/// 手机端登录(一键登录)
/// </summary>
/// <returns></returns>
[HttpPost("/Mini/SignIn")]
@ -229,6 +237,199 @@ namespace GDZZ.Application.Service.Auth
}
/// <summary>
/// 手机端登录(验证码登录)
/// </summary>
/// <returns></returns>
[HttpPost("/Mini/SignInCode")]
[AllowAnonymous]
public async Task<AuthUserOut> SignInCodeAsync(PhoneModel phoneModel)
{
Company company = new Company();
AuthUserOut authUserOut = new AuthUserOut();
//验证电话和验证码一致
var verIfy = await this.cacheService.GetVerifyCode(phoneModel.phone);
if (verIfy != phoneModel.checkingCode)
throw new Exception("验证码错误");
//查询系统用户
var sysUser = this._sysUserRep.AsQueryable()
.Filter("TenantId", true)
.First(x => x.Phone == phoneModel.phone.ToString());
//账号不存在 生成系统账号
if (sysUser.IsEmpty())
{
sysUser = await this._sysUserRep.InsertReturnEntityAsync(new SysUser()
{
Account = phoneModel.phone.ToString(),
AdminType = AdminType.None,
Avatar = "https://gdzongzhi.com/assets/img/logo.png",
Birthday = DateTime.Now,
CreatedTime = DateTime.Now,
CreatedUserId = null,
CreatedUserName = null,
Sex = Gender.UNKNOWN,
Status = CommonStatus.ENABLE,
Email = null,
IsDeleted = false,
Name = phoneModel.phone.ToString(),
Password = MD5Encryption.Encrypt("123456"),
TenantId = 392820661919813,
Phone = phoneModel.phone.ToString(),
NickName = "",
Tel = null,
});
}
//读取凭证
var tokenModel = await this._wechatOAuth.GetAccessTokenAsync(phoneModel.code);
var wxUser = await this.Baseuser.AsQueryable()
.Filter("TenantId", true)
.Where(x => x.OpenID == tokenModel.OpenId).SingleAsync();
//区分不同类型账号
if (phoneModel.logInType == (int)UserEnum.JOB)
{
if (wxUser.IsEmpty())
{
wxUser = await this.Baseuser.InsertReturnEntityAsync(new BaseUser()
{
UnionId = tokenModel.Unionid,
CreatedUserId = sysUser.Id,
CreatedTime = DateTime.Now,
CreatedUserName = sysUser.Name,
AvatarUrl = "https://gdzongzhi.com/assets/img/logo.png",
Status = (int)CommonStatus.ENABLE,
OpenID = tokenModel.OpenId,
TenantId = 392820661919813,
Type = (int)UserEnum.JOB,
UserName = phoneModel.phone.ToString(),
});
}
else
{
wxUser.Type = (int)UserEnum.JOB;
var bsUser = await this.Baseuser.UpdateAsync(wxUser);
}
}
else
{
//如果是企业账号,应该是绑定了企业租户信息
if (wxUser.IsEmpty() || wxUser.CompanyID.IsNullOrZero())
throw Oops.Oh(ErrorCode.xg1002);
wxUser.Type = (int)UserEnum.ADVERTISE;
var bsUser = await this.Baseuser.UpdateAsync(wxUser);
//获取公司信息
company = await this.CompanyRep.SingleAsync(x => x.Id == wxUser.CompanyID);
authUserOut.companyDto = company.Adapt<CompanyDto>();
}
if (wxUser.IsEmpty() || sysUser.IsEmpty())
throw Oops.Oh(ErrorCode.xg1002);
var Self = await this.Self.FirstOrDefaultAsync(x => x.CreatedUserId == sysUser.Id);
// 获取加密后的密码
var encryptPassword = MD5Encryption.Encrypt(sysUser.Password);
// 验证账号是否被冻结
if (sysUser.Status == CommonStatus.DISABLE)
throw Oops.Oh(ErrorCode.D1017);
//获取对应租户
var tenant = this._sysTenantRep.Single(sysUser.TenantId);
if (tenant.IsNullOrZero())
throw Oops.Oh(ErrorCode.F1001);
// 生成Token令牌
authUserOut.Token = JWTEncryption.Encrypt(new Dictionary<string, object>
{
{ClaimConst.CLAINM_USERID, sysUser.Id},
{ClaimConst.TENANT_ID, sysUser.TenantId},
{ClaimConst.CLAINM_ACCOUNT, sysUser.Account},
{ClaimConst.CLAINM_NAME, sysUser.Name},
{ClaimConst.CLAINM_SUPERADMIN, sysUser.AdminType},
{ ClaimConst.CLAINM_TENANT_TYPE, tenant.TenantType },
{ ClaimConst.CLAINM_TENANT_NAME, tenant.Name },
});
// 设置Swagger自动登录
_httpContextAccessor.HttpContext.SigninToSwagger(authUserOut.Token);
// 生成刷新Token令牌
var refreshToken = JWTEncryption.GenerateRefreshToken(authUserOut.Token, 30);
// 设置刷新Token令牌
_httpContextAccessor.HttpContext.Response.Headers["x-access-token"] = refreshToken;
var httpContext = App.HttpContext;
await _eventPublisher.PublishAsync(new ChannelEventSource("Update:UserLoginInfo",
new SysUser { Id = sysUser.Id, LastLoginIp = httpContext.GetLocalIpAddressToIPv4(), LastLoginTime = DateTime.Now }));
authUserOut.Avatar = sysUser.Avatar;
authUserOut.Phone = sysUser.Phone;
authUserOut.Sex = sysUser.Sex;
authUserOut.UserId = sysUser.Id;
authUserOut.UserName = sysUser.Name;
authUserOut.Self = Self.IsEmpty() ? null : Self.Name;
authUserOut.Type = (UserEnum)wxUser.Type;
authUserOut.OpenID = tokenModel.OpenId;
authUserOut.Tenant = tenant.Adapt<TenantOutput>();
authUserOut.Describe = wxUser.Describe;
await this.cacheService.SetUserInfoAsync(authUserOut, authUserOut.UserId);
return authUserOut;
}
/// <summary>
/// 发送验证码
/// </summary>
/// <returns></returns>
[HttpGet("/Mini/SendTextMessage")]
[AllowAnonymous]
public async Task SendTextMessage(string phone)
{
string code = "";
//生成随机数字
Random rand = new Random();
for (int i = 0; i < 6; i++)
{
code += rand.Next(0, 9).ToString();
}
Credential credential = new Credential()
{
SecretId = await GetConfigCache("TENCENT_SMS_SECRET_ID"),
SecretKey =await GetConfigCache("TENCENT_SMS_SECRET_KEY")
};
SendSmsRequest sendSmsRequest = new SendSmsRequest()
{
SignName = await GetConfigCache("TENCENT_SMS_SIGN"),
SmsSdkAppId = await GetConfigCache("TENCENT_SMS_SDK_APP_ID"),
PhoneNumberSet = new string[] { "+86" + phone },
TemplateId = await GetConfigCache("TENCENT_SMS_TEMPLATEID"),
TemplateParamSet = new string[] { code }
};
TencentCloudExamples.SendTextMessage(sendSmsRequest,credential);
await this.cacheService.SetVerifyCode(phone, code);
}
/// <summary>
/// 获取当前登录用户信息
/// </summary>
@ -242,7 +443,22 @@ namespace GDZZ.Application.Service.Auth
/// <summary>
/// 获取配置信息
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
private async Task<dynamic> GetConfigCache(string code)
{
var value = await _sysCacheService.GetAsync(code);
if (string.IsNullOrEmpty(value))
{
var config = await _sysConfigRep.FirstOrDefaultAsync(u => u.Code == code);
value = config != null ? config.Value : "";
await _sysCacheService.SetAsync(code, value);
}
return value;
}

@ -23,6 +23,31 @@ namespace GDZZ.Application
}
/// <summary>
/// 分页查询套餐管理
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/Mini/Company/page")]
public async Task<dynamic> Page([FromQuery] CompanyInput input)
{
var entities = await _rep.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(input.SearchValue), u => u.Name.Contains(input.SearchValue.Trim()))
.Select((u) => new MiniResumeOutput()
{
CompanyID = u.Id,
CompanyName = u.Name,
Logo = u.logo,
Id = u.Id,
Info = u.Info,
Title = u.Name,
Time = u.CreatedTime.Value.ToString("yyyy/MM/dd"),
})
.ToPagedListAsync(input.PageNo, input.PageSize);
return entities.XnPagedResult();
}
/// <summary>
/// 更新公司属性

@ -1,5 +1,5 @@
using System;
using GDZZ.Application.Enum;
using GDZZ.Application;
using GDZZ.Core;
namespace GDZZ.Application

@ -34,6 +34,11 @@ namespace GDZZ.Application
/// </summary>
public string CompanyInfoUrl { get; set; }
/// <summary>
/// 公司地址
/// </summary>
public string Address { get; set; }
}
public class AddCompanyInput : CompanyInput

@ -0,0 +1,47 @@
using System;
using GDZZ.Core;
namespace Magic.Application
{
/// <summary>
/// 求职列表输出参数
/// </summary>
public class JobHuntDto
{
/// <summary>
/// 主键Id
/// </summary>
public long Id { get; set; }
/// <summary>
/// 职业名称
/// </summary>
public string Career { get; set; }
/// <summary>
/// 个人简介
/// </summary>
public string Info { get; set; }
/// <summary>
/// 期望工作地点
/// </summary>
public string Address { get; set; }
/// <summary>
/// 标志
/// </summary>
public string Tags { get; set; }
/// <summary>
/// 电话
/// </summary>
public string phone { get; set; }
/// <summary>
/// 头像
/// </summary>
public string Logo { get; set; }
}
}

@ -0,0 +1,108 @@
using GDZZ.Core;
using System;
using System.ComponentModel.DataAnnotations;
namespace Magic.Application
{
/// <summary>
/// 求职列表输入参数
/// </summary>
public class JobHuntInput : PageInputBase
{
/// <summary>
/// 职业名称
/// </summary>
public virtual string Career { get; set; }
/// <summary>
/// 个人简介
/// </summary>
public virtual string Info { get; set; }
/// <summary>
/// 期望工作地点
/// </summary>
public virtual string Address { get; set; }
/// <summary>
/// 标志
/// </summary>
public virtual string Tags { get; set; }
/// <summary>
/// 电话
/// </summary>
public virtual string phone { get; set; }
/// <summary>
/// 头像
/// </summary>
public virtual string Logo { get; set; }
}
public class AddJobHuntInput : JobHuntInput
{
/// <summary>
/// 职业名称
/// </summary>
[Required(ErrorMessage = "职业名称不能为空")]
public override string Career { get; set; }
/// <summary>
/// 个人简介
/// </summary>
[Required(ErrorMessage = "个人简介不能为空")]
public override string Info { get; set; }
/// <summary>
/// 期望工作地点
/// </summary>
[Required(ErrorMessage = "期望工作地点不能为空")]
public override string Address { get; set; }
/// <summary>
/// 标志
/// </summary>
[Required(ErrorMessage = "标志不能为空")]
public override string Tags { get; set; }
/// <summary>
/// 电话
/// </summary>
[Required(ErrorMessage = "电话不能为空")]
public override string phone { get; set; }
/// <summary>
/// 头像
/// </summary>
[Required(ErrorMessage = "头像不能为空")]
public override string Logo { get; set; }
}
public class DeleteJobHuntInput
{
/// <summary>
/// 主键Id
/// </summary>
[Required(ErrorMessage = "主键Id不能为空")]
public long Id { get; set; }
}
public class UpdateJobHuntInput : JobHuntInput
{
/// <summary>
/// 主键Id
/// </summary>
[Required(ErrorMessage = "主键Id不能为空")]
public long Id { get; set; }
}
public class QueryeJobHuntInput : DeleteJobHuntInput
{
}
}

@ -0,0 +1,46 @@
using System;
namespace Magic.Application
{
/// <summary>
/// 求职列表输出参数
/// </summary>
public class JobHuntOutput
{
/// <summary>
/// 主键Id
/// </summary>
public long Id { get; set; }
/// <summary>
/// 职业名称
/// </summary>
public string Career { get; set; }
/// <summary>
/// 个人简介
/// </summary>
public string Info { get; set; }
/// <summary>
/// 期望工作地点
/// </summary>
public string Address { get; set; }
/// <summary>
/// 标志
/// </summary>
public string Tags { get; set; }
/// <summary>
/// 电话
/// </summary>
public string phone { get; set; }
/// <summary>
/// 头像
/// </summary>
public string Logo { get; set; }
}
}

@ -0,0 +1,16 @@
using GDZZ.Core;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using GDZZ.Application.Entity;
namespace Magic.Application
{
public interface IJobHuntService
{
Task Add(AddJobHuntInput input);
Task Delete(DeleteJobHuntInput input);
Task<JobHunt> Get([FromQuery] QueryeJobHuntInput input);
Task<dynamic> List([FromQuery] JobHuntInput input);
Task<dynamic> Page([FromQuery] JobHuntInput input);
Task Update(UpdateJobHuntInput input);
}
}

@ -0,0 +1,105 @@
using GDZZ.Core;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System.Linq;
using System.Threading.Tasks;
using GDZZ.Application.Entity;
using Microsoft.AspNetCore.Authorization;
namespace Magic.Application
{
/// <summary>
/// 求职列表服务
/// </summary>
[ApiDescriptionSettings("Application",Name = "JobHunt", Order = 1)]
public class JobHuntService : IJobHuntService, IDynamicApiController, ITransient
{
private readonly SqlSugarRepository<JobHunt> _rep;
public JobHuntService(SqlSugarRepository<JobHunt> rep)
{
_rep = rep;
}
/// <summary>
/// 分页查询求职列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/JobHunt/page")]
[AllowAnonymous]
public async Task<dynamic> Page([FromQuery] JobHuntInput input)
{
var entities = await _rep.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(input.Career), u => u.Career == input.Career)
.WhereIF(!string.IsNullOrWhiteSpace(input.Info), u => u.Info == input.Info)
.WhereIF(!string.IsNullOrWhiteSpace(input.Address), u => u.Address == input.Address)
.WhereIF(!string.IsNullOrWhiteSpace(input.Tags), u => u.Tags == input.Tags)
.WhereIF(!string.IsNullOrWhiteSpace(input.phone), u => u.phone == input.phone)
.WhereIF(!string.IsNullOrWhiteSpace(input.Logo), u => u.Logo == input.Logo)
.ToPagedListAsync(input.PageNo, input.PageSize);
return entities.XnPagedResult();
}
/// <summary>
/// 增加求职列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/JobHunt/add")]
public async Task Add(AddJobHuntInput input)
{
var entity = input.Adapt<JobHunt>();
await _rep.InsertAsync(entity);
}
/// <summary>
/// 删除求职列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/JobHunt/delete")]
public async Task Delete(DeleteJobHuntInput input)
{
var entity = await _rep.FirstOrDefaultAsync(u => u.Id == input.Id);
await _rep.DeleteAsync(entity);
}
/// <summary>
/// 更新求职列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/JobHunt/edit")]
public async Task Update(UpdateJobHuntInput input)
{
var entity = input.Adapt<JobHunt>();
await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns:true).ExecuteCommandAsync();
}
/// <summary>
/// 获取求职列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/JobHunt/detail")]
public async Task<JobHunt> Get([FromQuery] QueryeJobHuntInput input)
{
return await _rep.FirstOrDefaultAsync(u => u.Id == input.Id);
}
/// <summary>
/// 获取求职列表列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/JobHunt/list")]
public async Task<dynamic> List([FromQuery] JobHuntInput input)
{
return await _rep.ToListAsync();
}
}
}

@ -244,6 +244,7 @@ namespace GDZZ.Application
public async Task AddMessage(AddLiveMessageInput input)
{
var entity = input.Adapt<LiveMessage>();
entity.Content = Utils.stringToUnicode(entity.Content);
var live = this.liveMessageRep.InsertReturnEntity(entity);
var user = await _sysOnlineUerRep.Where(m => m.UserId == entity.OtherUserID).OrderByDescending(x=>x.LastTime).FirstAsync();
if (user != null)

@ -1,4 +1,4 @@
using GDZZ.Application.Enum;
using GDZZ.Application;
using System;
namespace GDZZ.Application

@ -20,7 +20,7 @@ namespace GDZZ.Application
/// <summary>
/// 小程序招聘列表服务
/// </summary>
[ApiDescriptionSettings("Application",Name = "MiniResume", Order = 1)]
[ApiDescriptionSettings("Application", Name = "MiniResume", Order = 1)]
public class MiniResumeService : IMiniResumeService, IDynamicApiController, ITransient
{
private readonly SqlSugarRepository<MiniResume> _rep; //招聘列表仓储
@ -41,7 +41,7 @@ namespace GDZZ.Application
this.ComsumeRep = ComsumeRep;
this._sysTenantRep = _sysTenantRep;
this.baseUser = baseUser;
this.CompanyRep= CompanyRep;
this.CompanyRep = CompanyRep;
}
@ -56,24 +56,30 @@ namespace GDZZ.Application
[AllowAnonymous]
public async Task<dynamic> GetResumeList([FromQuery] MiniResumeInput input)
{
var companys = await this.CompanyRep.AsQueryable().WhereIF(!string.IsNullOrWhiteSpace(input.SearchValue), u => u.Name.Contains(input.SearchValue)).FirstAsync();
var companys = await this.CompanyRep.AsQueryable().WhereIF(!string.IsNullOrWhiteSpace(input.SearchValue), u => u.Name.Contains(input.SearchValue)).FirstAsync();
var entities =await _rep.AsQueryable()
var entities = await _rep.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(input.RegionName), u => u.RegionName.Contains(input.RegionName.Trim()))
.WhereIF(!companys.IsNullOrZero(),u => u.Title.Contains(input.SearchValue)|| u.CompanyID == companys.Id)
.WhereIF(!companys.IsNullOrZero(), u => u.Title.Contains(input.SearchValue) || u.CompanyID == companys.Id)
.WhereIF(!string.IsNullOrWhiteSpace(input.Salary), u => u.Salary.Contains(input.Salary.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.Record), u => u.Record.Contains(input.Record.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.Level), u => u.Record.Contains(input.Level.Trim()))
.LeftJoin<Company>((u, y) => u.CompanyID == y.Id ) //关联公司信息
.Where(u => u.Status == ResumeStatusEnum.Release)
.LeftJoin<Company>((u, y) => u.CompanyID == y.Id) //关联公司信息
.Select((u, y) => new MiniResumeOutput
{
CompanyID =y.Id,CompanyName = y.Name,
Logo = y.logo,Id = u.Id,
Info = u.Info,Sak = u.Sak,
Salary = u.Salary,Title = u.Title,
{
CompanyID = y.Id,
CompanyName = y.Name,
Logo = y.logo,
Id = u.Id,
Info = u.Info,
Sak = u.Sak,
Salary = u.Salary,
Title = u.Title,
Time = u.CreatedTime.Value.ToString("yyyy/MM/dd"),
RegionName = u.RegionName,
Record = u.Record,
Level = u.Level,
Level = u.Level,
Status = u.Status
}).MergeTable()
.OrderByDescending(u => u.Time)
@ -84,6 +90,9 @@ namespace GDZZ.Application
/// <summary>
/// 初始化
/// </summary>
@ -132,6 +141,7 @@ namespace GDZZ.Application
var entities = await _rep.AsQueryable()
.LeftJoin<Company>((u, y) => u.CompanyID == y.Id) //关联公司信息
.WhereIF(!string.IsNullOrWhiteSpace(input.SearchValue), u => u.Title.Contains(input.SearchValue))
.Where(u => u.Status == ResumeStatusEnum.Release)
//.WhereIF(!string.IsNullOrWhiteSpace(input.SearchValue), u => u.CompanyName.Contains(input.SearchValue))
//.WhereIF(!string.IsNullOrWhiteSpace(input.SearchValue), u => u.Level.Contains(input.SearchValue))
//.WhereIF(!string.IsNullOrWhiteSpace(input.SearchValue), u => u.RegionName.Contains(input.SearchValue))
@ -157,6 +167,9 @@ namespace GDZZ.Application
return entities.XnPagedResult();
}
#endregion
@ -171,28 +184,28 @@ namespace GDZZ.Application
public async Task Add(AddMiniResumeInput input)
{
var entity = input.Adapt<MiniResume>();
var user =await this.baseUser.AsQueryable().Filter("TenantId", true).SingleAsync(x=>x.CreatedUserId == UserManager.UserId);
var user = await this.baseUser.AsQueryable().Filter("TenantId", true).SingleAsync(x => x.CreatedUserId == UserManager.UserId);
entity.CompanyID = user.CompanyID;
entity.CompanyName ="";
entity.CompanyName = "";
//查询是否有余额
var banlan = await this.balance.FirstOrDefaultAsync(x => x.UserID == UserManager.UserId);
if(banlan.IsNullOrZero() | banlan.Amount <= 0)
if (banlan.IsNullOrZero() | banlan.Amount <= 0)
throw Oops.Oh(ErrorCode.B1001);
//查询所属租户收费
var tenantID =await this._sysTenantRep.FirstOrDefaultAsync(s => s.Id ==long.Parse(UserManager.TenantID));
var tenantID = await this._sysTenantRep.FirstOrDefaultAsync(s => s.Id == long.Parse(UserManager.TenantID));
if (tenantID.IsNullOrZero())
throw Oops.Oh(ErrorCode.F1001);
if(tenantID.PushFee > banlan.Amount)
if (tenantID.PushFee > banlan.Amount)
throw Oops.Oh(ErrorCode.B1001);
//在余额中减去
banlan.Amount = banlan.Amount - tenantID.PushFee;
await this.balance.UpdateAsync(banlan);
//新增消费记录
await this.ComsumeRep.InsertAsync(new Consume { CAmount= tenantID.PushFee, Surplus = banlan.Amount,UserID = UserManager.UserId,Sort =(int)ConsumeEnum.Push });
await this.ComsumeRep.InsertAsync(new Consume { CAmount = tenantID.PushFee, Surplus = banlan.Amount, UserID = UserManager.UserId, Sort = (int)ConsumeEnum.Push });
await _rep.InsertAsync(entity);
}
@ -232,6 +245,38 @@ namespace GDZZ.Application
}
/// <summary>
/// 招聘下架条数
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/Mini/OffResume")]
public async Task<MiniResume[]> OffResume()
{
var entities = await _rep.AsQueryable()
.Where(u => u.Status == ResumeStatusEnum.OffShelf)
.ToArrayAsync();
return entities;
}
/// <summary>
/// 获取发布数量
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/Mini/GetSelfResumeListNumber")]
public async Task<dynamic> GetSelfResumeListNumber()
{
var entities = await _rep.AsQueryable()
.LeftJoin<Company>((u, y) => u.CompanyID == y.Id) //关联公司信息
.Where(u => u.CreatedUserId == UserManager.UserId)
.CountAsync();
return entities;
}
/// <summary>
/// 删除招聘信息
/// </summary>
@ -258,17 +303,5 @@ namespace GDZZ.Application
}
#endregion
}
}

@ -0,0 +1,27 @@
using System;
using GDZZ.Core;
namespace GDZZ.Application
{
/// <summary>
/// 套餐管理输出参数
/// </summary>
public class MiniThaliDto
{
/// <summary>
/// 主键Id
/// </summary>
public long Id { get; set; }
/// <summary>
/// 套餐金额
/// </summary>
public decimal Amount { get; set; }
/// <summary>
/// 套餐名称
/// </summary>
public string Name { get; set; }
}
}

@ -0,0 +1,64 @@
using GDZZ.Core;
using System;
using System.ComponentModel.DataAnnotations;
namespace GDZZ.Application
{
/// <summary>
/// 套餐管理输入参数
/// </summary>
public class MiniThaliInput : PageInputBase
{
/// <summary>
/// 套餐金额
/// </summary>
public virtual decimal Amount { get; set; }
/// <summary>
/// 套餐名称
/// </summary>
public virtual string Name { get; set; }
}
public class AddMiniThaliInput : MiniThaliInput
{
/// <summary>
/// 套餐金额
/// </summary>
[Required(ErrorMessage = "套餐金额不能为空")]
public override decimal Amount { get; set; }
/// <summary>
/// 套餐名称
/// </summary>
[Required(ErrorMessage = "套餐名称不能为空")]
public override string Name { get; set; }
}
public class DeleteMiniThaliInput
{
/// <summary>
/// 主键Id
/// </summary>
[Required(ErrorMessage = "主键Id不能为空")]
public long Id { get; set; }
}
public class UpdateMiniThaliInput : MiniThaliInput
{
/// <summary>
/// 主键Id
/// </summary>
[Required(ErrorMessage = "主键Id不能为空")]
public long Id { get; set; }
}
public class QueryeMiniThaliInput : DeleteMiniThaliInput
{
}
}

@ -0,0 +1,26 @@
using System;
namespace GDZZ.Application
{
/// <summary>
/// 套餐管理输出参数
/// </summary>
public class MiniThaliOutput
{
/// <summary>
/// 主键Id
/// </summary>
public long Id { get; set; }
/// <summary>
/// 套餐金额
/// </summary>
public decimal Amount { get; set; }
/// <summary>
/// 套餐名称
/// </summary>
public string Name { get; set; }
}
}

@ -0,0 +1,16 @@
using GDZZ.Core;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using GDZZ.Application.Entity;
namespace GDZZ.Application
{
public interface IMiniThaliService
{
Task Add(AddMiniThaliInput input);
Task Delete(DeleteMiniThaliInput input);
Task<MiniThali> Get([FromQuery] QueryeMiniThaliInput input);
Task<dynamic> List([FromQuery] MiniThaliInput input);
Task<dynamic> Page([FromQuery] MiniThaliInput input);
Task Update(UpdateMiniThaliInput input);
}
}

@ -0,0 +1,97 @@
using GDZZ.Core;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System.Linq;
using System.Threading.Tasks;
using GDZZ.Application.Entity;
namespace GDZZ.Application
{
/// <summary>
/// 套餐管理服务
/// </summary>
[ApiDescriptionSettings("Application",Name = "MiniThali", Order = 1)]
public class MiniThaliService : IMiniThaliService, IDynamicApiController, ITransient
{
private readonly SqlSugarRepository<MiniThali> _rep;
public MiniThaliService(SqlSugarRepository<MiniThali> rep)
{
_rep = rep;
}
/// <summary>
/// 分页查询套餐管理
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/MiniThali/page")]
public async Task<dynamic> Page([FromQuery] MiniThaliInput input)
{
var entities = await _rep.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name.Trim()))
.ToPagedListAsync(input.PageNo, input.PageSize);
return entities.XnPagedResult();
}
/// <summary>
/// 增加套餐管理
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/MiniThali/add")]
public async Task Add(AddMiniThaliInput input)
{
var entity = input.Adapt<MiniThali>();
await _rep.InsertAsync(entity);
}
/// <summary>
/// 删除套餐管理
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/MiniThali/delete")]
public async Task Delete(DeleteMiniThaliInput input)
{
var entity = await _rep.FirstOrDefaultAsync(u => u.Id == input.Id);
await _rep.DeleteAsync(entity);
}
/// <summary>
/// 更新套餐管理
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/MiniThali/edit")]
public async Task Update(UpdateMiniThaliInput input)
{
var entity = input.Adapt<MiniThali>();
await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns:true).ExecuteCommandAsync();
}
/// <summary>
/// 获取套餐管理
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/MiniThali/detail")]
public async Task<MiniThali> Get([FromQuery] QueryeMiniThaliInput input)
{
return await _rep.FirstOrDefaultAsync(u => u.Id == input.Id);
}
/// <summary>
/// 获取套餐管理列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/MiniThali/list")]
public async Task<dynamic> List([FromQuery] MiniThaliInput input)
{
return await _rep.ToListAsync();
}
}
}

@ -1,4 +1,4 @@
using GDZZ.Application.Enum;
using GDZZ.Application;
using System;
using System.Collections.Generic;
using System.Linq;

@ -23,7 +23,7 @@ using Microsoft.AspNetCore.Authorization;
using System.Collections.Generic;
using Mapster;
using Furion.FriendlyException;
using GDZZ.Application.Enum;
namespace GDZZ.Application.Service.WXPay
{

@ -3585,6 +3585,21 @@
登录类型
</summary>
</member>
<member name="P:GDZZ.Core.OAuth.PhoneModel.checkingCode">
<summary>
验证码
</summary>
</member>
<member name="P:GDZZ.Core.OAuth.PhoneModel.code">
<summary>
登录code
</summary>
</member>
<member name="P:GDZZ.Core.OAuth.PhoneModel.phone">
<summary>
手机号码
</summary>
</member>
<member name="T:GDZZ.Core.TokenModel">
<summary>
AccessToken参数
@ -4860,6 +4875,12 @@
</summary>
<returns></returns>
</member>
<member name="M:GDZZ.Core.Service.SysConfigService.GetTencentSmsSign">
<summary>
获取腾讯云SMS短信签名
</summary>
<returns></returns>
</member>
<member name="M:GDZZ.Core.Service.SysConfigService.GetDefaultPassword">
<summary>
获取默认密码

File diff suppressed because it is too large Load Diff

@ -18,8 +18,21 @@ namespace GDZZ.Core.OAuth
public string iv { get; set; }
/// <summary>
/// 验证码
/// </summary>
public string checkingCode { get; set; }
/// <summary>
/// 登录code
/// </summary>
public string code { get; set; }
/// <summary>
/// 手机号码
/// </summary>
public string phone { get; set; }
}
}

@ -168,6 +168,16 @@ public class SysConfigService : ISysConfigService, IDynamicApiController, ITrans
return bool.Parse(value);
}
/// <summary>
/// 获取腾讯云SMS短信签名
/// </summary>
/// <returns></returns>
public async Task<bool> GetTencentSmsSign()
{
var value = await GetConfigCache("TENCENT_SMS_SIGN");
return bool.Parse(value);
}
/// <summary>
/// 获取默认密码
/// </summary>

File diff suppressed because it is too large Load Diff

@ -31,11 +31,10 @@
"Version": "1.0.0"
},
{
//rm -rf
"Group": "Application",
"Title": "业务模块",
"Description": "独立业务模块",
"Version": "1.0.0"
"Version": "1.0.1"
}
]
},

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,75 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Senparc.Weixin.Cache.CsRedis</name>
</assembly>
<members>
<member name="T:Senparc.Weixin.Cache.CsRedis.RedisContainerCacheStrategy">
<summary>
Redis容器缓存策略
</summary>
</member>
<member name="M:Senparc.Weixin.Cache.CsRedis.RedisContainerCacheStrategy.#ctor">
<summary>
Redis 缓存策略
</summary>
</member>
<member name="M:Senparc.Weixin.Cache.CsRedis.RedisContainerCacheStrategy.Finalize">
<summary>
Redis 缓存策略析构函数,用于 _client 资源回收
</summary>
</member>
<member name="M:Senparc.Weixin.Cache.CsRedis.RedisContainerCacheStrategy.GetAll``1">
<summary>
获取所有 Bag 对象
</summary>
<typeparam name="TBag"></typeparam>
<returns></returns>
</member>
<member name="M:Senparc.Weixin.Cache.CsRedis.RedisContainerCacheStrategy.GetAllAsync``1">
<summary>
【异步方法】获取所有 Bag 对象
</summary>
<typeparam name="TBag"></typeparam>
<returns></returns>
</member>
<member name="T:Senparc.Weixin.Cache.CsRedis.RedisHashSetContainerCacheStrategy">
<summary>
Redis容器缓存策略
</summary>
</member>
<member name="M:Senparc.Weixin.Cache.CsRedis.RedisHashSetContainerCacheStrategy.#ctor">
<summary>
Redis 缓存策略
</summary>
</member>
<member name="M:Senparc.Weixin.Cache.CsRedis.RedisHashSetContainerCacheStrategy.Finalize">
<summary>
Redis 缓存策略析构函数,用于 _client 资源回收
</summary>
</member>
<member name="M:Senparc.Weixin.Cache.CsRedis.RedisHashSetContainerCacheStrategy.GetAllAsync``1">
<summary>
【异步方法】获取所有 Bag 对象
</summary>
<typeparam name="TBag"></typeparam>
<returns></returns>
</member>
<member name="T:Senparc.Weixin.Cache.CsRedis.Register">
<summary>
Senparc.Weixin.Cache.Redis 注册类
</summary>
</member>
<member name="M:Senparc.Weixin.Cache.CsRedis.Register.UseSenparcWeixinCacheCsRedis(Senparc.CO2NET.RegisterServices.IRegisterService)">
<summary>
注册 Senparc.Weixin.Cache.Redis
</summary>
<param name="register"></param>
</member>
<member name="M:Senparc.Weixin.Cache.CsRedis.Register.ActivityDomainCache">
<summary>
激活领域缓存
</summary>
</member>
</members>
</doc>

@ -0,0 +1,31 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Senparc.Weixin.Cache.Memcached</name>
</assembly>
<members>
<member name="M:Senparc.Weixin.Cache.Memcached.MemcachedContainerCacheStrategy.#ctor">
<summary>
MemcachedContainerCacheStrategy 的构造函数
</summary>
</member>
<member name="M:Senparc.Weixin.Cache.Memcached.MemcachedContainerCacheStrategy.GetAllAsync``1">
<summary>
【异步方法】获取所有 Bag 对象
</summary>
<typeparam name="TBag"></typeparam>
<returns></returns>
</member>
<member name="M:Senparc.Weixin.Cache.Memcached.Register.UseSenparcWeixinCacheMemcached(Senparc.CO2NET.RegisterServices.IRegisterService)">
<summary>
注册 Senparc.Weixin.Cache.Memcached
</summary>
<param name="app"></param>
</member>
<member name="M:Senparc.Weixin.Cache.Memcached.Register.ActivityDomainCache">
<summary>
激活领域缓存
</summary>
</member>
</members>
</doc>

@ -0,0 +1,75 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Senparc.Weixin.Cache.Redis</name>
</assembly>
<members>
<member name="T:Senparc.Weixin.Cache.Redis.RedisContainerCacheStrategy">
<summary>
Redis容器缓存策略
</summary>
</member>
<member name="M:Senparc.Weixin.Cache.Redis.RedisContainerCacheStrategy.#ctor">
<summary>
Redis 缓存策略
</summary>
</member>
<member name="M:Senparc.Weixin.Cache.Redis.RedisContainerCacheStrategy.Finalize">
<summary>
Redis 缓存策略析构函数,用于 _client 资源回收
</summary>
</member>
<member name="M:Senparc.Weixin.Cache.Redis.RedisContainerCacheStrategy.GetAll``1">
<summary>
获取所有 Bag 对象
</summary>
<typeparam name="TBag"></typeparam>
<returns></returns>
</member>
<member name="M:Senparc.Weixin.Cache.Redis.RedisContainerCacheStrategy.GetAllAsync``1">
<summary>
【异步方法】获取所有 Bag 对象
</summary>
<typeparam name="TBag"></typeparam>
<returns></returns>
</member>
<member name="T:Senparc.Weixin.Cache.Redis.RedisHashSetContainerCacheStrategy">
<summary>
Redis容器缓存策略
</summary>
</member>
<member name="M:Senparc.Weixin.Cache.Redis.RedisHashSetContainerCacheStrategy.#ctor">
<summary>
Redis 缓存策略
</summary>
</member>
<member name="M:Senparc.Weixin.Cache.Redis.RedisHashSetContainerCacheStrategy.Finalize">
<summary>
Redis 缓存策略析构函数,用于 _client 资源回收
</summary>
</member>
<member name="M:Senparc.Weixin.Cache.Redis.RedisHashSetContainerCacheStrategy.GetAllAsync``1">
<summary>
【异步方法】获取所有 Bag 对象
</summary>
<typeparam name="TBag"></typeparam>
<returns></returns>
</member>
<member name="T:Senparc.Weixin.Cache.Redis.Register">
<summary>
Senparc.Weixin.Cache.Redis 注册类
</summary>
</member>
<member name="M:Senparc.Weixin.Cache.Redis.Register.UseSenparcWeixinCacheRedis(Senparc.CO2NET.RegisterServices.IRegisterService)">
<summary>
注册 Senparc.Weixin.Cache.Redis
</summary>
<param name="register"></param>
</member>
<member name="M:Senparc.Weixin.Cache.Redis.Register.ActivityDomainCache">
<summary>
激活领域缓存
</summary>
</member>
</members>
</doc>

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

@ -0,0 +1,121 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Senparc.WebSocket</name>
</assembly>
<members>
<member name="T:Senparc.WebSocket.Exceptions.WebSocketExceptionBase">
<summary>
WebSocket 自定义异常基类
</summary>
</member>
<member name="T:Senparc.WebSocket.WebSocketHelper">
<summary>
WebSocketHelper
</summary>
</member>
<member name="M:Senparc.WebSocket.WebSocketHelper.#ctor(System.Net.WebSockets.WebSocket,System.Threading.CancellationToken)">
<param name="cancellationToken"></param>
</member>
<member name="M:Senparc.WebSocket.WebSocketHelper.SendMessage(System.String)">
<summary>
发送消息
</summary>
<param name="message">文字消息</param>
<returns></returns>
</member>
<member name="T:Senparc.WebSocket.WebSocketMessageHandler">
<summary>
WebSocket 处理程序
</summary>
</member>
<member name="M:Senparc.WebSocket.WebSocketMessageHandler.OnConnecting(Senparc.WebSocket.WebSocketHelper)">
<summary>
连接时触发事件
</summary>
<param name="webSocketHandler"></param>
<returns></returns>
</member>
<member name="M:Senparc.WebSocket.WebSocketMessageHandler.OnDisConnected(Senparc.WebSocket.WebSocketHelper)">
<summary>
断开连接时触发事件
</summary>
<param name="webSocketHandler"></param>
<returns></returns>
</member>
<member name="M:Senparc.WebSocket.WebSocketMessageHandler.OnMessageReceiced(Senparc.WebSocket.WebSocketHelper,Senparc.WebSocket.ReceivedMessage,System.String)">
<summary>
收到消息时触发事件
</summary>
<param name="webSocketHandler"></param>
<param name="message">封装好的数据</param>
<param name="originalData">原始数据字符串</param>
<returns></returns>
</member>
<member name="T:Senparc.WebSocket.ReceivedMessage">
<summary>
接收到消息封装的实体
</summary>
</member>
<member name="T:Senparc.WebSocket.WebSocketHandler">
<summary>
WebSocket处理程序
</summary>
</member>
<member name="M:Senparc.WebSocket.WebSocketHandler.WebSocketRequestHandler(System.Web.WebSockets.AspNetWebSocketContext)">
<summary>
部分Handler过程参考http://www.cnblogs.com/lookbs/p/MVC-IMG.html
</summary>
<param name="webSocketContext"></param>
<returns></returns>
</member>
<member name="T:Senparc.WebSocket.WebSocketRoute">
<summary>
WebSocketRoute
</summary>
</member>
<member name="M:Senparc.WebSocket.WebSocketRoute.#ctor(System.String,System.Web.Routing.IRouteHandler)">
<summary>
WebSocketRoute
</summary>
<param name="url"></param>
<param name="routeHandler"></param>
</member>
<member name="M:Senparc.WebSocket.WebSocketRoute.GetVirtualPath(System.Web.Routing.RequestContext,System.Web.Routing.RouteValueDictionary)">
<summary>
GetVirtualPath
</summary>
<param name="requestContext"></param>
<param name="values"></param>
<returns></returns>
</member>
<member name="T:Senparc.WebSocket.WebSocketRouteHandler">
<summary>
WebSocketHansler处理WebSocket请求
</summary>
</member>
<member name="T:Senparc.WebSocket.WebSocketConfig">
<summary>
WebSocket 配置
</summary>
</member>
<member name="M:Senparc.WebSocket.WebSocketConfig.RegisterRoutes(System.Web.Routing.RouteCollection)">
<summary>
注册WebSocket路由规则
</summary>
<param name="routes"></param>
</member>
<member name="M:Senparc.WebSocket.WebSocketConfig.RegisterMessageHandler``1">
<summary>
注册WebSocketMessageHandler
</summary>
<typeparam name="T"></typeparam>
</member>
<member name="M:Senparc.WebSocket.WebSocketConfig.RegisterMessageHandler``1(System.Func{``0})">
<summary>
注册WebSocketMessageHandler自定义对象的实例化方法
</summary>
<typeparam name="T"></typeparam>
</member>
</members>
</doc>

@ -0,0 +1,66 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Senparc.Weixin.AspNet</name>
</assembly>
<members>
<member name="T:Senparc.Weixin.AspNet.RegisterServices.RegisterServiceExtension">
<summary>
快捷注册类RegisterService 扩展类
</summary>
</member>
<member name="T:Senparc.Weixin.AspNet.MvcExtension.FixWeixinBugWeixinResult">
<summary>
修复微信换行 bug
</summary>
</member>
<member name="M:Senparc.Weixin.AspNet.MvcExtension.FixWeixinBugWeixinResult.#ctor(Senparc.NeuChar.MessageHandlers.IMessageHandlerDocument)">
<summary>
这个类型只用于特殊阶段目前IOS版本微信有换行的bug\r\n会识别为2行
</summary>
</member>
<member name="T:Senparc.Weixin.AspNet.MvcExtension.WeixinResult">
<summary>
返回MessageHandler结果
</summary>
</member>
<member name="P:Senparc.Weixin.AspNet.MvcExtension.WeixinResult.Content">
<summary>
获取ContentResult中的Content或IMessageHandler中的ResponseDocument文本结果。
一般在测试的时候使用。
</summary>
</member>
<member name="T:Senparc.Weixin.BrowserUtility.BrowserUtility">
<summary>
浏览器公共类
</summary>
</member>
<member name="M:Senparc.Weixin.BrowserUtility.BrowserUtility.SideInWeixinBrowser(System.Web.HttpContextBase)">
<summary>
判断是否在微信内置浏览器中
</summary>
<param name="httpContext">HttpContextBase对象</param>
<returns>true在微信内置浏览器内。false不在微信内置浏览器内。</returns>
</member>
<member name="M:Senparc.Weixin.BrowserUtility.BrowserUtility.SideInWeixinMiniProgram(System.Web.HttpContextBase)">
<summary>
判断是否在微信小程序内发起请求注意此方法在Android下有效在iOS下暂时无效
</summary>
<param name="httpContext">HttpContextBase对象</param>
<returns>true在微信内置浏览器内。false不在微信内置浏览器内。</returns>
</member>
<member name="T:Senparc.Weixin.AspNetHttpUtility.UrlUtility">
<summary>
URL工具类
</summary>
</member>
<member name="M:Senparc.Weixin.AspNetHttpUtility.UrlUtility.GenerateOAuthCallbackUrl(System.Web.HttpContextBase,System.String)">
<summary>
生成OAuth用的CallbackUrl参数原始状态未整体进行UrlEncode
</summary>
<param name="httpContext"></param>
<param name="oauthCallbackUrl"></param>
<returns></returns>
</member>
</members>
</doc>

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

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

Loading…
Cancel
Save