提交代码
13
公司/工作/云游戏/Untitled-2.txt
Normal 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”
|
||||
29
公司/工作/云游戏/Untitled-3.txt
Normal 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
|
||||
162
公司/工作/云游戏/Untitled-4.ini
Normal 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"}
|
||||
3
公司/工作/云游戏/eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAx.txt
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJOaWNrTmFtZSI6IuiSuOaxveS6kea4uDE0NTYiLCJVc2VySWQiOiIyIiwiZXhwIjoxNzMyMTI0Mzk0LCJpc3MiOiJzdGVhbWNsb3VkLmNvIiwiYXVkIjoic3RlYW1jbG91ZC5jbyJ9.A9I25ZDkyjzuiQiUeNIMt0NGQp58b6CHlYMZbbZAWPg
|
||||
|
||||
eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJOaWNrTmFtZSI6IuiSuOaxveS6kea4uDE0NTYiLCJVc2VySWQiOiIyIiwiZXhwIjoxNzMyMTg4MDg3LCJpc3MiOiJzdGVhbWNsb3VkLmNvIiwiYXVkIjoic3RlYW1jbG91ZC5jbyJ9.2CikkM3vn1PmzW4kkIKChq6QNexNzfvmSTEB7DB8mOU
|
||||
BIN
公司/工作/云游戏/openapi开发文档20211117.pdf
Normal file
16
公司/工作/云游戏/request copy.json
Normal file
44
公司/工作/云游戏/request.json
Normal file
|
|
@ -285,4 +285,18 @@ docker save -o I:/docker/ubuntu/cg-admin-0.02.tar cg-admin:dev-0.0.2
|
|||
|
||||
string6fba9c210de54734a91ef4961684d3d1
|
||||
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
|
||||
124
公司/工作/云游戏/using Microsoft.AspNetCore.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
BIN
公司/工作/云游戏/七天登录/.DS_Store
vendored
Normal file
BIN
公司/工作/云游戏/七天登录/1_已领取.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
BIN
公司/工作/云游戏/七天登录/1_未领取.png
Normal file
|
After Width: | Height: | Size: 7.2 KiB |
BIN
公司/工作/云游戏/七天登录/1_选中.png
Normal file
|
After Width: | Height: | Size: 8.8 KiB |
BIN
公司/工作/云游戏/七天登录/2_已领取.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
BIN
公司/工作/云游戏/七天登录/2_未领取.png
Normal file
|
After Width: | Height: | Size: 7.2 KiB |
BIN
公司/工作/云游戏/七天登录/2_选中.png
Normal file
|
After Width: | Height: | Size: 8.8 KiB |
BIN
公司/工作/云游戏/七天登录/3_已领取.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
BIN
公司/工作/云游戏/七天登录/3_未领取.png
Normal file
|
After Width: | Height: | Size: 7.2 KiB |
BIN
公司/工作/云游戏/七天登录/3_选中.png
Normal file
|
After Width: | Height: | Size: 8.8 KiB |
BIN
公司/工作/云游戏/七天登录/4_已领取.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
BIN
公司/工作/云游戏/七天登录/4_未领取.png
Normal file
|
After Width: | Height: | Size: 7.2 KiB |
BIN
公司/工作/云游戏/七天登录/4_选中.png
Normal file
|
After Width: | Height: | Size: 8.8 KiB |
BIN
公司/工作/云游戏/七天登录/5_已领取.png
Normal file
|
After Width: | Height: | Size: 9.7 KiB |
BIN
公司/工作/云游戏/七天登录/5_未领取.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
公司/工作/云游戏/七天登录/5_选中.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
公司/工作/云游戏/七天登录/6_已领取.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
BIN
公司/工作/云游戏/七天登录/6_未领取.png
Normal file
|
After Width: | Height: | Size: 7.2 KiB |
BIN
公司/工作/云游戏/七天登录/6_选中.png
Normal file
|
After Width: | Height: | Size: 8.8 KiB |
BIN
公司/工作/云游戏/七天登录/7_已领取.png
Normal file
|
After Width: | Height: | Size: 9.7 KiB |
BIN
公司/工作/云游戏/七天登录/7_未领取.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
公司/工作/云游戏/七天登录/7_选中.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
公司/工作/云游戏/钻石商品图/100zs.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
公司/工作/云游戏/钻石商品图/100zs_sc.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
公司/工作/云游戏/钻石商品图/100zs_sc_xz.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
公司/工作/云游戏/钻石商品图/100zs_xz.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
公司/工作/云游戏/钻石商品图/200zs.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
公司/工作/云游戏/钻石商品图/200zs_sc.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
公司/工作/云游戏/钻石商品图/200zs_sc_xz.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
公司/工作/云游戏/钻石商品图/200zs_xz.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
公司/工作/云游戏/钻石商品图/300zs.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
公司/工作/云游戏/钻石商品图/300zs_sc.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
公司/工作/云游戏/钻石商品图/300zs_sc_xz.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
公司/工作/云游戏/钻石商品图/300zs_xz.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
|
|
@ -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)
|
||||
|
||||
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. 多语言问题
|
||||
|
|
@ -41,41 +49,163 @@
|
|||
|
||||
1. 采用 vue3
|
||||
|
||||
|
||||
|
||||
|
||||
## 阿里云
|
||||
|
||||
氢荷健康
|
||||
|
||||
Hyhe2022
|
||||
|
||||
|
||||
{"Token":"352ed4aee503a3bf5a66042775eedb07"}
|
||||
{"UserName":"张三","PassWord":"312321"}
|
||||
public class LoginToken{
|
||||
public string Token{get;set;}
|
||||
public string Token{get;set;}
|
||||
}
|
||||
|
||||
public class LoginUser{
|
||||
public string UserName{get;set;}
|
||||
public string PassWord{get;set;}
|
||||
public string UserName{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. 七天签到(完成)
|
||||
2. 任务中心
|
||||
3. 游戏时长排行
|
||||
4. 一键登录
|
||||
5. 兑换码
|
||||
6. 反馈中心
|
||||
7. 我的收藏(我的收藏页面icon使用哪一个)
|
||||
8. 搜索页面推荐-热度
|
||||
9. 头像框
|
||||
10. 头像列表
|
||||
11. 玩游戏
|
||||
12. 游戏心跳设置
|
||||
3. 游戏时长排行(完成)
|
||||
15. 消息(完成)
|
||||
11. 玩游戏(完成)
|
||||
12. 游戏心跳设置(完成)
|
||||
14. 支付中心(完成)
|
||||
views/Apps/App/T_SevenDaySignIns/Index.vue
|
||||
/apps/app/t_sevendaysignins
|
||||
|
||||
views/Apps/App/T_SevenDaySignIn_Rewards/Index.vue
|
||||
/apps/app/t_sevendaysignin_rewards
|
||||
|
||||
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
|
||||
|
|
@ -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
|
||||
# 查看挂载卷
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@ server {
|
|||
server_name _;
|
||||
|
||||
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 X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
|
|
|
|||
|
|
@ -11,10 +11,11 @@ PasswordAuthentication yes
|
|||
sudo systemctl restart sshd
|
||||
# 为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@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@1.15.21.245
|
||||
|
||||
```
|
||||