Merge branch 'master' of http://120.26.58.240:8888/r/ApiFlexJob
| | |
| | | [ErrorCodeItemMetadata("{0}")] |
| | | s400 = 400, |
| | | /// <summary> |
| | | /// 当前登录用户已失效 |
| | | /// </summary> |
| | | [ErrorCodeItemMetadata("当前登录用户已失效")] |
| | | s401 = 401, |
| | | /// <summary> |
| | | /// {0}不存在 |
| | | /// </summary> |
| | | [ErrorCodeItemMetadata("{0}不存在")] |
| | |
| | | 参数错误 |
| | | </summary> |
| | | </member> |
| | | <member name="F:FlexJobApi.Core.EnumErrorCodeType.s401"> |
| | | <summary> |
| | | 当前登录用户已失效 |
| | | </summary> |
| | | </member> |
| | | <member name="F:FlexJobApi.Core.EnumErrorCodeType.s404"> |
| | | <summary> |
| | | {0}不存在 |
| | |
| | | 名称 |
| | | </summary> |
| | | </member> |
| | | <member name="T:FlexJobApi.Core.DeleteTaskInfoCommand"> |
| | | <summary> |
| | | 删除任务 |
| | | </summary> |
| | | </member> |
| | | <member name="T:FlexJobApi.Core.SaveTaskInfoCommand"> |
| | | <summary> |
| | | 保存任务 |
| | |
| | | 推荐状态 |
| | | </summary> |
| | | </member> |
| | | <member name="P:FlexJobApi.Core.GetTaskInfosQueryResult.Count"> |
| | | <member name="P:FlexJobApi.Core.GetTaskInfosQueryResult.ObjectData"> |
| | | <summary> |
| | | 统计 |
| | | </summary> |
| | | </member> |
| | | <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultCount.WaitAssignCount"> |
| | | <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultObjectData.WaitAssignCount"> |
| | | <summary> |
| | | 待安排数量 |
| | | </summary> |
| | | </member> |
| | | <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultCount.CompletedAssignCount"> |
| | | <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultObjectData.CompletedAssignCount"> |
| | | <summary> |
| | | 已安排数量 |
| | | </summary> |
| | | </member> |
| | | <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultCount.InProcessReleaseCount"> |
| | | <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultObjectData.InProcessReleaseCount"> |
| | | <summary> |
| | | 发布中数量 |
| | | </summary> |
| | | </member> |
| | | <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultCount.StoppedReleaseCount"> |
| | | <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultObjectData.StoppedReleaseCount"> |
| | | <summary> |
| | | 已停止数量 |
| | | </summary> |
| | |
| | | <param name="logier"></param> |
| | | <returns></returns> |
| | | </member> |
| | | <member name="T:FlexJobApi.Core.BindPhoneNumberCommand"> |
| | | <summary> |
| | | 绑定手机号 |
| | | </summary> |
| | | </member> |
| | | <member name="P:FlexJobApi.Core.BindPhoneNumberCommand.PhoneNumber"> |
| | | <summary> |
| | | 手机号码 |
| | | </summary> |
| | | </member> |
| | | <member name="P:FlexJobApi.Core.BindPhoneNumberCommand.VerifyCode"> |
| | | <summary> |
| | | 验证码 |
| | | </summary> |
| | | </member> |
| | | <member name="T:FlexJobApi.Core.PasswordLoginCommand"> |
| | | <summary> |
| | | 密码登录 |
| | |
| | | <member name="P:FlexJobApi.Core.WxmpLoginCommand.Code"> |
| | | <summary> |
| | | 用户登录凭证 |
| | | </summary> |
| | | </member> |
| | | <member name="P:FlexJobApi.Core.WxmpLoginCommand.Type"> |
| | | <summary> |
| | | 用户类型 |
| | | </summary> |
| | | </member> |
| | | <member name="T:FlexJobApi.Core.GetAliyunOSSAcsQuery"> |
| | |
| | | <param name="singularName"></param> |
| | | <returns></returns> |
| | | </member> |
| | | <member name="T:FlexJobApi.Core.WxmpOptions"> |
| | | <summary> |
| | | 微信小程序配置 |
| | | </summary> |
| | | </member> |
| | | <member name="P:FlexJobApi.Core.WxmpOptionsItem.Code"> |
| | | <summary> |
| | | 编号 |
| | | </summary> |
| | | </member> |
| | | <member name="P:FlexJobApi.Core.WxmpOptionsItem.AppId"> |
| | | <summary> |
| | | 小程序ID |
| | | </summary> |
| | | </member> |
| | | <member name="P:FlexJobApi.Core.WxmpOptionsItem.AppSecret"> |
| | | <summary> |
| | | 小程序密钥 |
| | | </summary> |
| | | </member> |
| | | <member name="T:FlexJobApi.Core.WxmpUtils"> |
| | | <summary> |
| | | 微信小程序工具 |
| | | </summary> |
| | | </member> |
| | | <member name="T:FlexJobApi.Core.XmlDoc"> |
| | | <summary> |
| | | 注释文档 |
| | |
| | | services.AddHttpRemote(); |
| | | services.AddSingleton<ResourceHttpUtils>(); |
| | | services.AddSingleton<AliyunSmsUtils>(); |
| | | services.AddSingleton<WxmpUtils>(); |
| | | services.AddScoped<SmsUtils>(); |
| | | |
| | | services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(App.Assemblies.ToArray())); |
| | |
| | | /// 删除数据字典类别 |
| | | /// </summary> |
| | | [Resource([EnumResourceController.Dictionary])] |
| | | public class DeleteDictionaryCategoryCommand : DeleteDataCommand, IRequest<int> |
| | | public class DeleteDictionaryCategoryCommand : DeleteDataCommand |
| | | { |
| | | |
| | | } |
New file |
| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | |
| | | namespace FlexJobApi.Core |
| | | { |
| | | /// <summary> |
| | | /// 删除任务 |
| | | /// </summary> |
| | | [Resource([EnumResourceController.Task])] |
| | | public class DeleteTaskInfoCommand : DeleteDataCommand |
| | | { |
| | | |
| | | } |
| | | } |
| | |
| | | /// <summary> |
| | | /// 统计 |
| | | /// </summary> |
| | | public GetTaskInfosQueryResultCount Count { get; set; } |
| | | public GetTaskInfosQueryResultObjectData ObjectData { get; set; } |
| | | } |
| | | |
| | | public class GetTaskInfosQueryResultCount |
| | | public class GetTaskInfosQueryResultObjectData |
| | | { |
| | | /// <summary> |
| | | /// 待安排数量 |
New file |
| | |
| | | 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.Auth])] |
| | | public class BindPhoneNumberCommand : IRequest<bool> |
| | | { |
| | | /// <summary> |
| | | /// 手机号码 |
| | | /// </summary> |
| | | public string PhoneNumber { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 验证码 |
| | | /// </summary> |
| | | public string VerifyCode { get; set; } |
| | | } |
| | | } |
| | |
| | | /// <summary> |
| | | /// 手机号码 |
| | | /// </summary> |
| | | [Required] |
| | | public string PhoneNumber { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 验证码 |
| | | /// </summary> |
| | | [Required] |
| | | public string VerifyCode { get; set; } |
| | | |
| | | /// <summary> |
| | |
| | | using System; |
| | | using MediatR; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.ComponentModel.DataAnnotations; |
| | | using System.Linq; |
| | |
| | | /// <summary> |
| | | /// 微信小程序登录 |
| | | /// </summary> |
| | | public class WxmpLoginCommand |
| | | [Resource([EnumResourceController.Auth], AllowAnonymous = true)] |
| | | public class WxmpLoginCommand : IRequest<LoginCommandCallback> |
| | | { |
| | | /// <summary> |
| | | /// 用户登录凭证 |
| | | /// </summary> |
| | | [Required] |
| | | public string Code { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 用户类型 |
| | | /// </summary> |
| | | public EnumUserType Type { get; set; } |
| | | } |
| | | } |
| | |
| | | /// 删除菜单 |
| | | /// </summary> |
| | | [Resource([EnumResourceController.Menu])] |
| | | public class DeleteMenuCommand : DeleteDataCommand, IRequest<int> |
| | | public class DeleteMenuCommand : DeleteDataCommand |
| | | { |
| | | |
| | | } |
| | |
| | | /// 删除角色 |
| | | /// </summary> |
| | | [Resource([EnumResourceController.Role])] |
| | | public class DeleteRoleCommand : DeleteDataCommand, IRequest<int> |
| | | public class DeleteRoleCommand : DeleteDataCommand |
| | | { |
| | | |
| | | } |
| | |
| | | using System; |
| | | using MediatR; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.ComponentModel.DataAnnotations; |
| | | using System.Linq; |
| | |
| | | /// <summary> |
| | | /// 删除命令 |
| | | /// </summary> |
| | | public abstract class DeleteDataCommand |
| | | public abstract class DeleteDataCommand : IRequest<int> |
| | | { |
| | | protected DeleteDataCommand() |
| | | { |
| | |
| | | /// </summary> |
| | | public class SmsUtils |
| | | { |
| | | private readonly IRepository<SmsLog> rep; |
| | | private readonly IRepository<SmsLog, LogDbContextLocator> rep; |
| | | private readonly AliyunSmsUtils aliyunSmsUtils; |
| | | |
| | | public SmsUtils( |
| | | IRepository<SmsLog> rep, |
| | | IRepository<SmsLog, LogDbContextLocator> rep, |
| | | AliyunSmsUtils aliyunSmsUtils) |
| | | { |
| | | this.rep = rep; |
New file |
| | |
| | | using Furion.ConfigurableOptions; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | |
| | | namespace FlexJobApi.Core |
| | | { |
| | | /// <summary> |
| | | /// 微信小程序配置 |
| | | /// </summary> |
| | | public class WxmpOptions : IConfigurableOptions |
| | | { |
| | | public WxmpOptions() |
| | | { |
| | | Items = []; |
| | | } |
| | | |
| | | public List<WxmpOptionsItem> Items { get; set; } |
| | | } |
| | | |
| | | public class WxmpOptionsItem |
| | | { |
| | | /// <summary> |
| | | /// 编号 |
| | | /// </summary> |
| | | public string Code { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 小程序ID |
| | | /// </summary> |
| | | public string AppId { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 小程序密钥 |
| | | /// </summary> |
| | | public string AppSecret { get; set; } |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | |
| | | namespace FlexJobApi.Core |
| | | { |
| | | public class WxmpSnsJscode2sessionCallback |
| | | { |
| | | public string session_key { get; set; } |
| | | public string unionid { get; set; } |
| | | public string errmsg { get; set; } |
| | | public string openid { get; set; } |
| | | public int errcode { get; set; } |
| | | } |
| | | } |
New file |
| | |
| | | using Furion.FriendlyException; |
| | | using Furion.HttpRemote; |
| | | using Microsoft.Extensions.Options; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using System.Threading; |
| | | using System.Threading.Tasks; |
| | | |
| | | namespace FlexJobApi.Core |
| | | { |
| | | /// <summary> |
| | | /// 微信小程序工具 |
| | | /// </summary> |
| | | public class WxmpUtils |
| | | { |
| | | private readonly IOptions<WxmpOptions> options; |
| | | private readonly IHttpRemoteService httpRemoteService; |
| | | |
| | | public WxmpUtils( |
| | | IOptions<WxmpOptions> options, |
| | | IHttpRemoteService httpRemoteService) |
| | | { |
| | | this.options = options; |
| | | this.httpRemoteService = httpRemoteService; |
| | | } |
| | | |
| | | public async Task<WxmpSnsJscode2sessionCallback> SnsJscode2sessionAsync(EnumUserType userType, string code, CancellationToken cancellationToken = default) |
| | | { |
| | | var option = options.Value.Items.FirstOrDefault(it => it.Code == userType.ToString()); |
| | | if (option == null || option.AppId.IsNull() || option.AppSecret.IsNull()) |
| | | throw Oops.Oh(EnumErrorCodeType.s400, "登录失败,缺失配置:WxmpOptions"); |
| | | if (code.IsNull()) |
| | | throw Oops.Oh(EnumErrorCodeType.s400, "请填写WxmpCode"); |
| | | var callback = await httpRemoteService.GetAsAsync<WxmpSnsJscode2sessionCallback>("https://api.weixin.qq.com/sns/jscode2session", |
| | | builder => builder.WithQueryParameters(new Dictionary<string, string> |
| | | { |
| | | { "appid", option.AppId }, |
| | | { "secret", option.AppSecret }, |
| | | { "js_code", code }, |
| | | { "grant_type", "authorization_code" } |
| | | })); |
| | | if (callback == null || callback.errcode != 0) |
| | | throw Oops.Oh(EnumErrorCodeType.s510, $"登录失败:{callback.errmsg},请联系管理员"); |
| | | return callback; |
| | | } |
| | | } |
| | | } |
| | |
| | | <param name="cancellationToken"></param> |
| | | <returns></returns> |
| | | </member> |
| | | <member name="M:FlexJobApi.FlexJobServer.Application.TaskInfoCommandHandler.Handle(FlexJobApi.Core.DeleteTaskInfoCommand,System.Threading.CancellationToken)"> |
| | | <summary> |
| | | 删除任务 |
| | | </summary> |
| | | <param name="request"></param> |
| | | <param name="cancellationToken"></param> |
| | | <returns></returns> |
| | | </member> |
| | | <member name="T:FlexJobApi.FlexJobServer.Application.TaskInfoQueryHandler"> |
| | | <summary> |
| | | 任务查询处理器 |
| | |
| | | ) : |
| | | IRequestHandler<SaveTaskInfoCommand, Guid>, |
| | | IRequestHandler<SetTaskInfoReleaseStatusCommand, int>, |
| | | IRequestHandler<SetTaskInfoRecommendStatusCommand, int> |
| | | IRequestHandler<SetTaskInfoRecommendStatusCommand, int>, |
| | | IRequestHandler<DeleteTaskInfoCommand, int> |
| | | { |
| | | private readonly IRepository<TaskInfo> rep = rep; |
| | | |
| | |
| | | return entities.Count; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 删除任务 |
| | | /// </summary> |
| | | /// <param name="request"></param> |
| | | /// <param name="cancellationToken"></param> |
| | | /// <returns></returns> |
| | | public Task<int> Handle(DeleteTaskInfoCommand request, CancellationToken cancellationToken) |
| | | { |
| | | return request.DeleteData<TaskInfo>( |
| | | q => |
| | | { |
| | | q = TaskInfoRepository.GetQueryable(rep, false); |
| | | if (q.AsNoTracking().Any(it => it.Status == EnumTaskStatus.Complete)) |
| | | { |
| | | throw Oops.Oh(EnumErrorCodeType.s510, "已安排的任务无法删除"); |
| | | } |
| | | return q; |
| | | }, cancellationToken); |
| | | } |
| | | |
| | | private async Task BuildCode(TaskInfo entity) |
| | | { |
| | | entity.Code = $"{DateTime.Now:yyyyMMddHHmm}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}"; |
| | |
| | | q = q.Where(it => it.GenderLimit == request.GenderLimit); |
| | | } |
| | | |
| | | var count = new GetTaskInfosQueryResultCount |
| | | var count = new GetTaskInfosQueryResultObjectData |
| | | { |
| | | WaitAssignCount = await q.CountAsync(it => it.Status == EnumTaskStatus.Wait), |
| | | CompletedAssignCount = await q.CountAsync(it => it.Status == EnumTaskStatus.Complete), |
| | |
| | | SettlementStatus = t.SettlementStatus |
| | | }; |
| | | var result = await request.PageModel.GetPagedListAsync<GetTaskInfosQueryResult, GetTaskInfosQueryResultItem>(s, cancellationToken); |
| | | result.Count = count; |
| | | result.ObjectData = count; |
| | | return result; |
| | | } |
| | | } |
| | |
| | | /// </summary> |
| | | public class LoginCommandHandler( |
| | | IRepository<User> rep, |
| | | SmsUtils smsUtils) : |
| | | SmsUtils smsUtils, |
| | | WxmpUtils wxmpUtils) : |
| | | IRequestHandler<PasswordLoginCommand, LoginCommandCallback>, |
| | | IRequestHandler<SmsLoginCommand, LoginCommandCallback> |
| | | IRequestHandler<SmsLoginCommand, LoginCommandCallback>, |
| | | IRequestHandler<WxmpLoginCommand, LoginCommandCallback>, |
| | | IRequestHandler<BindPhoneNumberCommand, bool> |
| | | { |
| | | private readonly IRepository<User> rep = rep; |
| | | private readonly SmsUtils smsUtils = smsUtils; |
| | | private readonly WxmpUtils wxmpUtils = wxmpUtils; |
| | | |
| | | /// <summary> |
| | | /// 密码登录 |
| | |
| | | var user = await rep.AsQueryable().AsNoTracking() |
| | | .Where(it => it.UserName == request.PhoneNumber && it.Type == request.Type) |
| | | .FirstOrDefaultAsync(cancellationToken); |
| | | if (user == null && request.Type == EnumUserType.Personal) |
| | | { |
| | | user = new User |
| | | { |
| | | Type = request.Type, |
| | | UserName = request.PhoneNumber, |
| | | PhoneNumber = request.PhoneNumber, |
| | | IsCheckPhoneNumber = true, |
| | | Level = 1, |
| | | Status = EnumUserStatus.Normal |
| | | }; |
| | | await rep.InsertAsync(user); |
| | | } |
| | | if (user == null) |
| | | throw Oops.Oh(EnumUserErrorCodeType.u1000); |
| | | if (user.Status == EnumUserStatus.Disabled) |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 微信小程序登录 |
| | | /// </summary> |
| | | /// <param name="request"></param> |
| | | /// <param name="cancellationToken"></param> |
| | | /// <returns></returns> |
| | | public async Task<LoginCommandCallback> Handle(WxmpLoginCommand request, CancellationToken cancellationToken) |
| | | { |
| | | var snsJscode2session = await wxmpUtils.SnsJscode2sessionAsync(request.Type, request.Code, cancellationToken); |
| | | var user = await rep.AsQueryable().AsNoTracking() |
| | | .Where(it => it.WxmpOpenId == snsJscode2session.openid && it.Type == request.Type) |
| | | .FirstOrDefaultAsync(cancellationToken); |
| | | if (user == null && request.Type == EnumUserType.Personal) |
| | | { |
| | | user = new User |
| | | { |
| | | Type = request.Type, |
| | | UserName = snsJscode2session.openid, |
| | | WxmpOpenId = snsJscode2session.openid, |
| | | Level = 1, |
| | | Status = EnumUserStatus.Normal |
| | | }; |
| | | await rep.InsertAsync(user); |
| | | } |
| | | if (user == null) |
| | | throw Oops.Oh(EnumUserErrorCodeType.u1000); |
| | | if (user.Status == EnumUserStatus.Disabled) |
| | | throw Oops.Oh(EnumUserErrorCodeType.u1001); |
| | | return GetCurrentLogier(user, EnumClientType.Wxmp); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 绑定手机号 |
| | | /// </summary> |
| | | /// <param name="request"></param> |
| | | /// <param name="cancellationToken"></param> |
| | | /// <returns></returns> |
| | | public async Task<bool> Handle(BindPhoneNumberCommand request, CancellationToken cancellationToken) |
| | | { |
| | | await smsUtils.CheckVerifyCode(new CheckVerifyCodeModel |
| | | { |
| | | PhoneNumber = request.PhoneNumber, |
| | | VerifyCode = request.VerifyCode, |
| | | TemplateCode = EnumSmsTemplateCode.LoginOrRegister |
| | | }); |
| | | var logier = JwtUtils.GetCurrentLogier(); |
| | | var user = await rep.AsQueryable() |
| | | .FirstOrDefaultAsync(it => it.Id == logier.Id); |
| | | if (user == null) |
| | | throw Oops.Oh(EnumErrorCodeType.s404, "当前账号不存在"); |
| | | user.UserName = request.PhoneNumber; |
| | | user.PhoneNumber = request.PhoneNumber; |
| | | user.IsCheckPhoneNumber = true; |
| | | return true; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取当前登录用户 |
| | | /// </summary> |
| | | /// <param name="user"></param> |
| | |
| | | 登录命令处理器 |
| | | </summary> |
| | | </member> |
| | | <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.User},FlexJobApi.Core.SmsUtils)"> |
| | | <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.User},FlexJobApi.Core.SmsUtils,FlexJobApi.Core.WxmpUtils)"> |
| | | <summary> |
| | | 登录命令处理器 |
| | | </summary> |
| | |
| | | <param name="cancellationToken"></param> |
| | | <returns></returns> |
| | | </member> |
| | | <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.Handle(FlexJobApi.Core.WxmpLoginCommand,System.Threading.CancellationToken)"> |
| | | <summary> |
| | | 微信小程序登录 |
| | | </summary> |
| | | <param name="request"></param> |
| | | <param name="cancellationToken"></param> |
| | | <returns></returns> |
| | | </member> |
| | | <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.Handle(FlexJobApi.Core.BindPhoneNumberCommand,System.Threading.CancellationToken)"> |
| | | <summary> |
| | | 绑定手机号 |
| | | </summary> |
| | | <param name="request"></param> |
| | | <param name="cancellationToken"></param> |
| | | <returns></returns> |
| | | </member> |
| | | <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.GetCurrentLogier(FlexJobApi.Core.User,FlexJobApi.Core.EnumClientType)"> |
| | | <summary> |
| | | 获取当前登录用户 |
| | |
| | | "Access": "Redis", |
| | | "Configuration": "118.178.252.28:5390,password=Bole123!" |
| | | }, |
| | | "Wxmp": { |
| | | "Items": [ |
| | | { |
| | | "Code": "Personal", |
| | | "AppId": "wxb9e0baf4f87aa0de", |
| | | "AppSecret": "24abded2cd32b677b1f14ea9ec5767f0" |
| | | }, |
| | | { |
| | | "Code": "Enterprise", |
| | | "AppId": "wx3669dd12a0915f7d ", |
| | | "AppSecret": "c03a62ad6822f1c925532c34183e7f7f" |
| | | } |
| | | ] |
| | | }, |
| | | "Aliyun": { |
| | | "OSS": { |
| | | "AccessKeyId": "LTAI4GAdJ88mUMMFBHHiyDmS", |
| | |
| | | } |
| | | }, |
| | | "SMS": { |
| | | "Enable": false, |
| | | "Enable": true, |
| | | "AccessKeyId": "LTAI5tMS7qz1duiyncCqxB8H", |
| | | "AccessSecret": "TEHSXK6f6Njg0v0MSFkrjURofdjuKQ", |
| | | "Version": "2017-05-25", |