提交代码

This commit is contained in:
zpc 2024-12-04 14:23:41 +08:00
parent ebe0174f10
commit 3cd4a38114
47 changed files with 568 additions and 22 deletions

View File

@ -0,0 +1,13 @@
Tea.TeaException:“code: 400, Specified signature does not match our calculation. server StringToSign is [ACS3-HMAC-SHA256
300cee1fd9c5180829d6b5081397415433a1102930cc65a757ae3efb27369537], server CanonicalRequest is [POST
/
PhoneNumbers=17521010998&SignName=%E6%B0%A2%E8%8D%B7%E5%81%A5%E5%BA%B7&TemplateCode=SMS_154950909&TemplateParam=%7B%22code%22%3A%229410%22%7D
host:dysmsapi.aliyuncs.com
x-acs-action:SendSms
x-acs-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-acs-date:2024-11-11T06:22:20Z
x-acs-signature-nonce:ba1ab8b5-df74-4f62-9d12-36cec8161e83
x-acs-version:2017-05-25
host;x-acs-action;x-acs-content-sha256;x-acs-date;x-acs-signature-nonce;x-acs-version
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855] request id: 1C3326C3-E8E5-5A35-B481-C02D5A9497B5”

View File

@ -0,0 +1,29 @@
Tea.TeaException:“code: 400, Specified signature does not match our calculation. server StringToSign is [ACS3-HMAC-SHA256
93a93201695c387f8029c22df7720f2423fbb5bc975cf77d1453c747df8cdd43], server CanonicalRequest is [POST
/
PhoneNumbers=17521010998&SignName=%E6%B0%A2%E8%8D%B7%E5%81%A5%E5%BA%B7&TemplateCode=SMS_273790693&TemplateParam=%7B%22code%22%3A%227021%22%7D
host:dysmsapi.aliyuncs.com
x-acs-action:SendSms
x-acs-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-acs-date:2024-11-11T06:27:45Z
x-acs-signature-nonce:75438f93-b7ff-4ade-a3ec-fde2f945747c
x-acs-version:2017-05-25
host;x-acs-action;x-acs-content-sha256;x-acs-date;x-acs-signature-nonce;x-acs-version
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855] request id: FAD6B76E-2C68-5CFB-8130-02E79DFDEBF5”
code: 400, Specified signature does not match our calculation. server StringToSign is [ACS3-HMAC-SHA256
9ef4f635539e5f327c34587ddaa3792c89589b0ce0959501542db775ad296b3e], server CanonicalRequest is [POST
/
PhoneNumbers=17521010998&SignName=%E6%B0%A2%E8%8D%B7%E5%81%A5%E5%BA%B7&TemplateCode=SMS_273790693&TemplateParam=%7B%22code%22%3A%221234%22%7D
host:dysmsapi.aliyuncs.com
x-acs-action:SendSms
x-acs-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-acs-date:2024-11-11T06:34:59Z
x-acs-signature-nonce:d4b89516-a5d2-4875-b7c1-69a262ba0a64
x-acs-version:2017-05-25
host;x-acs-action;x-acs-content-sha256;x-acs-date;x-acs-signature-nonce;x-acs-version
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855] request id: 3D699841-8352-5E67-A878-1D2DBE7FC6EC0

View File

@ -0,0 +1,162 @@
/// <summary>
///
/// </summary>
/// <returns></returns>
public async Task<AccountLogInResponse> Login()
{
var json = await new StreamReader(this.HttpContextAccessor.HttpContext.Request.Body).ReadToEndAsync();
if (string.IsNullOrEmpty(json))
{
throw MessageBox.Show(ResonseCode.NullOrEmpty, "登录方式不合格");
}
var account = AccountExtend.GetUserAccount(json, this);
if (account == null)
{
throw MessageBox.Show(ResonseCode.NullOrEmpty, "未找到登录方式");
}
var userId = await account.LoginAsync();
T_User? user = null;
if (userId > 0)
{
user = await Dao.DaoUser.Context.T_User.FirstOrDefaultAsync(it => it.Id == userId);
}
var ip = this.HttpContextAccessor.HttpContext.GetClientIpAddress();
if (user == null)
{
//注册用户
user = new T_User()
{
CreatedAt = DateTime.Now,
LastLoginAt = DateTime.Now,
UpdatedAt = DateTime.Now,
IsTest = false,
LastLoginType = account.LastLoginType,
RegisterType = account.LastLoginType,
State = 0,
UserIconUrl = AppConfig.UserConfig.UserIconUrl,
NickName = $"{AppConfig.UserConfig.NickName}{new Random().Next(1000, 9999)}",
Ip = ip
};
await Dao.DaoUser.Context.T_User.AddAsync(user);
}
if (user == null)
{
throw MessageBox.Show(ResonseCode.Error, "用户注册失败");
}
user.LastLoginAt = DateTime.Now;
user.UpdatedAt = DateTime.Now;
user.Ip = ip;
await Dao.DaoUser.Context.SaveChangesAsync();
var userData = await Dao.DaoUser.Context.T_User_Data.FirstOrDefaultAsync(it => it.UserId == user.Id);
if (userData == null)
{
userData = new T_User_Data()
{
CreateAt = DateTime.Now,
UpdateAt = DateTime.Now,
PhoneNum = account.GetUserDataProperty(UserDataPropertyEnum.PhoneNum),
UserId = user.Id,
Email = account.GetUserDataProperty(UserDataPropertyEnum.Email)
};
await Dao.DaoUser.Context.T_User_Data.AddAsync(userData);
await Dao.DaoUser.Context.SaveChangesAsync();
}
var claims = new[]
{
new Claim("NickName",user.NickName),
new Claim("UserId",user.Id.ToString()),
};
var jwt = JwtAuthManager.GenerateTokens(user.NickName, claims, DateTime.Now);
var accountLogIn = new AccountLogInResponse()
{
NickName = user.NickName,
Token = jwt.AccessToken,
UserId = user.Id,
};
//获取用户登录的设备
var userLoginList = await Dao.DaoUser.Context.T_User_Token.Where(it => it.UserId == user.Id).ToListAsync();
if (userLoginList == null)
{
//用户没有登录过
userLoginList = new List<T_User_Token>();
}
var dev = account.DeviceNumber;
//如果设备号为空则使用用户Id+登录方式
if (string.IsNullOrEmpty(dev))
{
dev = MD5Encryption.ComputeMD5Hash($"{user.Id}:{account.LastLoginType}");
}
// 获取当前时间用于后续多次调用
var currentTime = DateTime.Now;
// 获取当前设备号,若为空则生成一个唯一的设备号
var dev = string.IsNullOrEmpty(account.DeviceNumber)
? MD5Encryption.ComputeMD5Hash($"{user.Id}:{account.LastLoginType}")
: account.DeviceNumber;
// 获取用户的设备列表
var userLoginList = await Dao.DaoUser.Context.T_User_Token
.Where(it => it.UserId == user.Id)
.OrderBy(it => it.LastLoginAt)
.ToListAsync();
// 如果当前登录设备数超过配置的最大设备数
if (userLoginList.Count > AppConfig.UserConfig.MaxDeviceCount)
{
// 删除多余设备记录,保留最新的设备
var excessDevices = userLoginList.Take(userLoginList.Count - AppConfig.UserConfig.MaxDeviceCount).ToList();
Dao.DaoUser.Context.T_User_Token.RemoveRange(excessDevices);
await Dao.DaoUser.Context.SaveChangesAsync();
}
// 查找当前设备记录
var existingDevice = userLoginList.FirstOrDefault(it => it.DeviceNumber == dev);
if (existingDevice == null)
{
// 情况1当前设备不存在且设备数已达最大值
if (userLoginList.Count == AppConfig.UserConfig.MaxDeviceCount)
{
// 踢掉最早登录的设备,将其替换为当前设备
var oldestDevice = userLoginList.First();
oldestDevice.DeviceNumber = dev;
oldestDevice.TokenMd5 = MD5Encryption.ComputeMD5Hash(jwt.AccessToken);
oldestDevice.LastLoginAt = currentTime;
oldestDevice.ExpiresAt = currentTime.AddDays(5);
oldestDevice.Token = jwt.AccessToken;
}
else
{
// 情况2当前设备不存在且设备数小于最大值新增一条设备记录
var newDevice = new T_User_Token
{
CreateAt = currentTime,
ExpiresAt = currentTime.AddDays(5),
LastLoginAt = currentTime,
Token = jwt.AccessToken,
UserId = user.Id,
DeviceNumber = dev,
TokenMd5 = MD5Encryption.ComputeMD5Hash(jwt.AccessToken)
};
await Dao.DaoUser.Context.T_User_Token.AddAsync(newDevice);
}
}
else
{
// 情况3当前设备已存在更新登录时间等参数
existingDevice.LastLoginAt = currentTime;
existingDevice.ExpiresAt = currentTime.AddDays(5);
existingDevice.Token = jwt.AccessToken;
existingDevice.TokenMd5 = MD5Encryption.ComputeMD5Hash(jwt.AccessToken);
}
// 保存更改
await Dao.DaoUser.Context.SaveChangesAsync();
return accountLogIn;
}
{"phoneNumber":"17521010998","verificationCode":"1645"}

View File

@ -0,0 +1,3 @@
eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJOaWNrTmFtZSI6IuiSuOaxveS6kea4uDE0NTYiLCJVc2VySWQiOiIyIiwiZXhwIjoxNzMyMTI0Mzk0LCJpc3MiOiJzdGVhbWNsb3VkLmNvIiwiYXVkIjoic3RlYW1jbG91ZC5jbyJ9.A9I25ZDkyjzuiQiUeNIMt0NGQp58b6CHlYMZbbZAWPg
eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJOaWNrTmFtZSI6IuiSuOaxveS6kea4uDE0NTYiLCJVc2VySWQiOiIyIiwiZXhwIjoxNzMyMTg4MDg3LCJpc3MiOiJzdGVhbWNsb3VkLmNvIiwiYXVkIjoic3RlYW1jbG91ZC5jbyJ9.2CikkM3vn1PmzW4kkIKChq6QNexNzfvmSTEB7DB8mOU

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -285,4 +285,18 @@ docker save -o I:/docker/ubuntu/cg-admin-0.02.tar cg-admin:dev-0.0.2
string6fba9c210de54734a91ef4961684d3d1 string6fba9c210de54734a91ef4961684d3d1
352ed4aee503a3bf5a66042775eedb07 352ed4aee503a3bf5a66042775eedb07
352ed4aee503a3bf5a66042775eedb07 352ed4aee503a3bf5a66042775eedb07
able_queue=1&channel_id=d612a79436ef9ceeee4d6847d854b2e1&client_sid=1004&game_key=jy0532&hang_up_timer=300&ip=::1&model_name=vivo+x200&sn=j2v0RGqVlyhxSAuAS&start_resolution=1080P&time=1732181378&key=671f73f2cf137
able_queue=1&channel_id=d612a79436ef9ceeee4d6847d854b2e1&client_sid=1004&game_key=jy0532&hang_up_timer=300&ip=::1&key=671f73f2cf137&model_name=vivo+x200&sn=j2v0RGqVlyhxSAuAS&start_resolution=1080P&time=1732181378
able_queue=1&channel_id=d612a79436ef9ceeee4d6847d854b2e1&client_sid=1004&game_key=jy0532&hang_up_timer=300&ip=::1&key=671f73f2cf137&model_name=vivo+x200&sn=j2v0RGqVlyhxSAuAS&start_resolution=1080P&time=1732181751
6E2940FF5EA50DDC4E5F5E8BAB8166D7
6FDBF53301F56F7A6EB6CA5EF670277D
able_queue=1&channel_id=d612a79436ef9ceeee4d6847d854b2e1&client_sid=1004&game_key=jy0532&hang_up_timer=300&ip=::1&model_name=vivo+x200&sign=6E2940FF5EA50DDC4E5F5E8BAB8166D7&sn=j2v0RGqVlyhxSAuAS&start_resolution=1080P&time=1732181554

View File

@ -0,0 +1,124 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.Caching.Distributed;
using System;
using System.Collections.Concurrent;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace CloudGaming.Code.MiddlewareExtend
{
/// <summary>
/// Redis 缓存中间件
/// </summary>
public class RedisCacheMiddleware
{
private readonly RequestDelegate _next;
private static readonly ConcurrentDictionary<Endpoint, RedisCacheAttribute> _attributeCache = new();
public RedisCacheMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context,
IServiceProvider _serviceProvider,
AppConfig appConfig
)
{
// 检查当前请求是否需要缓存
var cacheAttribute = GetCacheAttribute(context);
if (cacheAttribute == null)
{
await _next(context);
return;
}
var _cache = appConfig.GetRedisDataBase();
// 生成缓存键(基于请求路径和查询字符串)
var cacheKey = GenerateCacheKey(context.Request, appConfig);
// 尝试从 Redis 缓存中获取数据
var cachedResponse = await _cache.StringGetAsync(cacheKey);
if (!cachedResponse.IsNullOrEmpty)
{
context.Response.StatusCode = StatusCodes.Status200OK;
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(cachedResponse);
return;
}
// 捕获原始响应流
var originalResponseStream = context.Response.Body;
try
{
using (var memoryStream = new MemoryStream())
{
context.Response.Body = memoryStream;
// 调用下一个中间件
await _next(context);
// 将响应流重新定位到起始位置
memoryStream.Position = 0;
// 读取响应内容
var responseBody = await new StreamReader(memoryStream).ReadToEndAsync();
await _cache.StringSetAsync(cacheKey, responseBody, cacheAttribute.TimeSpan);
// 将内容写回原始响应流
memoryStream.Position = 0;
await memoryStream.CopyToAsync(originalResponseStream);
}
}
finally
{
context.Response.Body = originalResponseStream;
}
}
private RedisCacheAttribute GetCacheAttribute(HttpContext context)
{
var endpoint = context.Features.Get<IEndpointFeature>()?.Endpoint;
if (endpoint == null) return null;
if (_attributeCache.TryGetValue(endpoint, out var cachedAttribute))
{
return cachedAttribute;
}
var attribute = endpoint.Metadata.GetMetadata<RedisCacheAttribute>();
if (attribute != null)
{
_attributeCache.TryAdd(endpoint, attribute);
}
return attribute;
}
private string GenerateCacheKey(HttpRequest request, AppConfig appConfig)
{
var appRequestInfo = new AppRequestConfig(request);
var cacheKey = $"cache:api:{request.Path.Value.Replace('/', '.').TrimStart('.')}:{appRequestInfo.Key}:{(string.IsNullOrEmpty(request.QueryString.Value) ? "default" : request.QueryString)}";
return cacheKey;
}
}
/// <summary>
/// Redis 缓存特性类
/// </summary>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class RedisCacheAttribute : Attribute
{
public TimeSpan TimeSpan { get; }
public RedisCacheAttribute(int durationInSeconds) => TimeSpan = TimeSpan.FromSeconds(durationInSeconds);
public RedisCacheAttribute(int hours, int minutes, int seconds) => TimeSpan = new TimeSpan(hours, minutes, seconds);
public RedisCacheAttribute(int minutes, int seconds) => TimeSpan = new TimeSpan(0, minutes, seconds);
}
}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -12,6 +12,14 @@
第三方: 第三方:
数脉 API 0.036 5000 180 [数脉 API](https://market.aliyun.com/apimarket/detail/cmapi026109?spm=5176.api_collection.collection-page.1.30d11d66865dHb#sku=yuncode2010900002) 数脉 API 0.036 5000 180 [数脉 API](https://market.aliyun.com/apimarket/detail/cmapi026109?spm=5176.api_collection.collection-page.1.30d11d66865dHb#sku=yuncode2010900002)
1 7 1 False 审核配置 NULL NULL NULL NULL NULL NULL 1.0.0 审核配置 NULL
2 3 1 True 全局游戏消耗配置 NULL NULL NULL NULL NULL NULL 60 游戏消耗钻石配置 NULL
views/Apps/Ext/T_App_Configs/Index.vue
/apps/ext/t_app_configs
views/Apps/Ext/T_App_Channels/Index.vue
/apps/ext/t_app_channels
### 项目难点 ### 项目难点
1. 多语言问题 1. 多语言问题
@ -41,41 +49,163 @@
1. 采用 vue3 1. 采用 vue3
## 阿里云 ## 阿里云
氢荷健康 氢荷健康
Hyhe2022 Hyhe2022
{"Token":"352ed4aee503a3bf5a66042775eedb07"} {"Token":"352ed4aee503a3bf5a66042775eedb07"}
{"UserName":"张三","PassWord":"312321"} {"UserName":"张三","PassWord":"312321"}
public class LoginToken{ public class LoginToken{
public string Token{get;set;} public string Token{get;set;}
} }
public class LoginUser{ public class LoginUser{
public string UserName{get;set;} public string UserName{get;set;}
public string PassWord{get;set;} public string PassWord{get;set;}
} }
## 未做
1. 一键登录
## views/Apps/Ext/T_App_Channels/Index.vue
/apps/ext/t_app_channels
## 目前还差
2. 官网
3. 导入游戏数据
4. 后台管理
## 后台管理
1. 用户列表
2. 游戏记录
3. 用户资产记录
4. 热门搜索管理
5. 用户搜索记录
6. 首页-注册人数-登录人数-今天玩游戏人数-正在玩游戏人数-
7. 订单管理
8.
## 暂时不做
1. 任务中心
2. 头像框
3. 头像列表
4. 首页弹窗(暂时不做)
5. 包夜卡
## 已完成
13. 支付功能(完成)
5. 兑换码(完成)
6. 反馈中心(完成)
7. 我的收藏(我的收藏页面 icon 使用哪一个)
8. 搜索页面推荐-热度(完成)
1. 七天签到(完成) 1. 七天签到(完成)
2. 任务中心 3. 游戏时长排行(完成)
3. 游戏时长排行 15. 消息(完成)
4. 一键登录 11. 玩游戏(完成)
5. 兑换码 12. 游戏心跳设置(完成)
6. 反馈中心 14. 支付中心(完成)
7. 我的收藏我的收藏页面icon使用哪一个 views/Apps/App/T_SevenDaySignIns/Index.vue
8. 搜索页面推荐-热度 /apps/app/t_sevendaysignins
9. 头像框
10. 头像列表 views/Apps/App/T_SevenDaySignIn_Rewards/Index.vue
11. 玩游戏 /apps/app/t_sevendaysignin_rewards
12. 游戏心跳设置
views/Apps/App/T_Productss/Index.vue
/apps/app/t_productss
views/Apps/App/T_Products_Rewards/Index.vue
/apps/app/t_products_rewards
eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJOaWNrTmFtZSI6IuiSuOaxveS6kea4uDgwMjQiLCJVc2VySWQiOiIxMDAzIiwiZXhwIjoxNzMyNTE0ODY5LCJpc3MiOiJzdGVhbWNsb3VkLmNvIiwiYXVkIjoic3RlYW1jbG91ZC5jbyJ9.j2v0RGqVlyhxSAuAStL0UjXTh4b9mJVVPYSMcU7mE1o
eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJOaWNrTmFtZSI6IuiSuOaxveS6kea4uDc2MTIiLCJVc2VySWQiOiIxMDA0IiwiZXhwIjoxNzMzMTUzNzM0LCJpc3MiOiJzdGVhbWNsb3VkLmNvIiwiYXVkIjoic3RlYW1jbG91ZC5jbyJ9.Z8TlcO-hiUtIVDXw92AnLnZWV1a3YjxwH-D0WkcUn-w
https://pay.shhuanmeng.com/api/pay/default/wx/WX0T1732583693U001004P001M001RP8/4b45f4f47386fc2b658714b8be9c2967
{
"userName": "章哲",
"idCard": "32132219981208335X",
"deviceNumber": "j2v0RGqVlyhxSAuAStL0UjXTh4b9mJVVPYSMcU7mE1o"
}
{
"sn": "12",
"gameId": "sc0010012",
"modelName": "vivox200"
}
{
"sn": "12",
"gameId": "sc0010012",
"modelName": "vivox200",
"cpu": "vivox200"
}
key Game:UserId:GameId
用户id,
游戏开始时间
游戏最后一次心跳时间
游戏id
游戏名称
游戏会话id
用户设备号
用户cpu
鲸云scid
鲸云游戏id
10分钟
able_queue=1&channel_id=d612a79436ef9ceeee4d6847d854b2e1&client_sid=1004&game_key=jy0532&hang_up_timer=300&ip=::1&model_name=vivo+x200&sign=CCE6006CDC268F0A9A6203A8B4C29307&sn=string&start_resolution=1080P&time=1732182012
channel_id=d612a79436ef9ceeee4d6847d854b2e1&client_sid=1004&ip=::1&sn=string&time=1732182359&sign=AF722CD3E78E15E6F8C05C2372F53EAB
able_queue=1&channel_id=d612a79436ef9ceeee4d6847d854b2e1&client_sid=1004&game_key=jy0532&hang_up_timer=300&ip=::1&model_name=vivo+x200&sn=j2v0RGqVlyhxSAuAS&start_resolution=1080P&time=1732182307&sign=37820DFB415A0E5F8F2018973CC29547
able_queue=1&channel_id=d612a79436ef9ceeee4d6847d854b2e1&client_sid=1004&game_key=jy0532&hang_up_timer=300&ip=::1&model_name=vivo+x200&sn=j2v0RGqVlyhxSAuAS&start_resolution=1080P&time=1732182307
able_queue=1&channel_id=d612a79436ef9ceeee4d6847d854b2e1&client_sid=1004&game_key=jy0532&hang_up_timer=300&ip=::1&model_name=vivox200&sn=j2v0RGqVlyhxSAuAS&start_resolution=1080P&time=1732182556&sign=015AE41EF5CDCB0A5CADDB234E56287B
RedemptionCodeEntityCache
SevenDayEntityCache
views/Apps/App/T_RedemptionCodes/Index.vue
/apps/app/t_redemptioncodes
views/Apps/App/T_User_RedemptionUsages/Index.vue
/apps/app/t_user_redemptionusages
redemption_codes
views/Apps/App/T_User_FeedBacks/Index.vue
/apps/app/t_user_feedbacks
测试环境接口地址映射的192.168.195.6:81接口地址http://test.steamcloud.co/
测试服务器地址1.15.21.245 dbt@com@123
测试服务器内网地址192.168.195.8
测试环境宝塔面板
【云服务器】请在安全组放行 36259 端口
外网面板地址: https://1.15.21.245:36259/4b250f5c
内网面板地址: https://10.0.16.9:36259/4b250f5c
username: oepyym7k
password: 2acef8d9
测试环境使用的服务器192.168.195.6
http://1.15.21.245/
game.qinghee.com.cn

View File

@ -14,6 +14,16 @@ sudo nano /etc/docker/daemon.json
] ]
} }
{
"insecure-registries" : ["123.207.203.228:92","123.207.203.228:93"],
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
{
# 允许http请求拉取镜像
"insecure-registries" : ["123.207.203.228:92","123.207.203.228:93"]
}
# 改完后需要重启 # 改完后需要重启
sudo systemctl restart docker sudo systemctl restart docker
# 查看挂载卷 # 查看挂载卷

View File

@ -115,7 +115,7 @@ server {
server_name _; server_name _;
location / { location / {
proxy_pass http://192.168.195.32:8189; proxy_pass http://192.168.195.6:81;
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

View File

@ -11,10 +11,11 @@ PasswordAuthentication yes
sudo systemctl restart sshd sudo systemctl restart sshd
# 为root用户设置密码 # 为root用户设置密码
sudo passwd root sudo passwd root
ssh-copy-id -i ~/.ssh/id_rsa.pub root@43.154.208.215 ssh-copy-id -i ~/.ssh/id_rsa.pub root@43.154.208.215
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.34 ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.34
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.23 ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.23
ssh-copy-id -i ~/.ssh/id_rsa.pub root@1.15.21.245
``` ```