This commit is contained in:
zpc 2025-03-04 21:49:01 +08:00
parent 3cd4a38114
commit 6f4c2ab2fe
23 changed files with 808 additions and 175 deletions

View File

@ -5,7 +5,7 @@ APPID授权管理通知
商户全称:: 上海寰梦科技发展有限公司 商户全称:: 上海寰梦科技发展有限公司
APPID: wxafecedd1ad0d7483 APPID: wxafecedd1ad0d7483
APPID名称: 上海寰梦科技发展有限公司 APPID名称: 上海寰梦科技发展有限公司
apiV2:bad162066cbc9c34bb457e6997b7255b
## 公司小程序账号密码 ## 公司小程序账号密码
zhangxiaode690@gmail.com。 zxd@6666. zhangxiaode690@gmail.com。 zxd@6666.

View File

@ -1,3 +1,26 @@
{ {
"api.App.GetConfig1.Message":"天才" "api.App.GetConfig.Message": "天才"
}
{
"default": {
"zh": {
"api.App.GetConfig": {
"api.App.GetConfig.Message": ""
}
}
}
}
{
"default": {
"api.App.GetConfig": {
"zh": {
"api.App.GetConfig.Message": ""
}
}
}
} }

View File

@ -12,39 +12,20 @@
第三方: 第三方:
数脉 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 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 2 3 1 True 全局游戏消耗配置 NULL NULL NULL NULL NULL NULL 60 游戏消耗钻石配置 NULL
views/Apps/Ext/T_App_Configs/Index.vue views/Apps/Ext/T_App_Configs/Index.vue
/apps/ext/t_app_configs /apps/ext/t_app_configs
views/Apps/Ext/T_App_Channels/Index.vue views/Apps/Ext/T_App_Channels/Index.vue
/apps/ext/t_app_channels /apps/ext/t_app_channels
### 项目难点 ### 项目难点
1. 多语言问题 1. 多语言问题
2. 部分数据表不全 2. 部分数据表不全
3. 云游戏核心(放后面) 3. 云游戏核心(放后面)
### 11 号目标
1. 完成基础组件(已完成)、缓存(已完成)、redis 缓存(已完成)、日志组件(已完成)
### 12 号目标
1. 完成首页接口
2. 完成游戏分类接口
### 13 号目标
1. 完成后台管理技术难点
2. 实验多语言技术路径
### 14 号目标
1. 完成 AppConfig 接口
2. 完成手机号登录接口
### 后台管理技术 ### 后台管理技术
1. 采用 vue3 1. 采用 vue3
@ -67,20 +48,23 @@ public string PassWord{get;set;}
} }
## 未做 ## 未做
1. 一键登录 1. 一键登录
2. 多语言功能
3. 后台用户管理
views/Apps/Ext/T_App_Channels/Index.vue views/Apps/Ext/T_App_Channels/Index.vue
/apps/ext/t_app_channels /apps/ext/t_app_channels
## 目前还差 ## 目前还差
2. 官网 2. 官网
3. 导入游戏数据 3. 导入游戏数据
4. 后台管理 4. 后台管理
5. 导入游戏数据(完成)
## 后台管理 ## 后台管理
1. 用户列表 1. 用户列表
2. 游戏记录 2. 游戏记录
3. 用户资产记录 3. 用户资产记录
@ -88,10 +72,10 @@ views/Apps/Ext/T_App_Channels/Index.vue
5. 用户搜索记录 5. 用户搜索记录
6. 首页-注册人数-登录人数-今天玩游戏人数-正在玩游戏人数- 6. 首页-注册人数-登录人数-今天玩游戏人数-正在玩游戏人数-
7. 订单管理 7. 订单管理
8. 8.
## 暂时不做 ## 暂时不做
1. 任务中心 1. 任务中心
2. 头像框 2. 头像框
3. 头像列表 3. 头像列表
@ -99,19 +83,20 @@ views/Apps/Ext/T_App_Channels/Index.vue
5. 包夜卡 5. 包夜卡
## 已完成 ## 已完成
13. 支付功能(完成) 13. 支付功能(完成)
5. 兑换码(完成) 14. 兑换码(完成)
6. 反馈中心(完成) 15. 反馈中心(完成)
7. 我的收藏(我的收藏页面 icon 使用哪一个) 16. 我的收藏(我的收藏页面 icon 使用哪一个)
8. 搜索页面推荐-热度(完成) 17. 搜索页面推荐-热度(完成)
1. 七天签到(完成) 18. 七天签到(完成)
3. 游戏时长排行(完成) 19. 游戏时长排行(完成)
15. 消息(完成) 20. 消息(完成)
11. 玩游戏(完成) 21. 玩游戏(完成)
12. 游戏心跳设置(完成) 22. 游戏心跳设置(完成)
14. 支付中心(完成) 23. 支付中心(完成)
views/Apps/App/T_SevenDaySignIns/Index.vue views/Apps/App/T_SevenDaySignIns/Index.vue
/apps/app/t_sevendaysignins /apps/app/t_sevendaysignins
views/Apps/App/T_SevenDaySignIn_Rewards/Index.vue views/Apps/App/T_SevenDaySignIn_Rewards/Index.vue
/apps/app/t_sevendaysignin_rewards /apps/app/t_sevendaysignin_rewards
@ -119,58 +104,46 @@ views/Apps/App/T_SevenDaySignIn_Rewards/Index.vue
views/Apps/App/T_Productss/Index.vue views/Apps/App/T_Productss/Index.vue
/apps/app/t_productss /apps/app/t_productss
views/Apps/App/T_Products_Rewards/Index.vue views/Apps/App/T_Products_Rewards/Index.vue
/apps/app/t_products_rewards /apps/app/t_products_rewards
eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJOaWNrTmFtZSI6IuiSuOaxveS6kea4uDgwMjQiLCJVc2VySWQiOiIxMDAzIiwiZXhwIjoxNzMyNTE0ODY5LCJpc3MiOiJzdGVhbWNsb3VkLmNvIiwiYXVkIjoic3RlYW1jbG91ZC5jbyJ9.j2v0RGqVlyhxSAuAStL0UjXTh4b9mJVVPYSMcU7mE1o eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJOaWNrTmFtZSI6IuiSuOaxveS6kea4uDgwMjQiLCJVc2VySWQiOiIxMDAzIiwiZXhwIjoxNzMyNTE0ODY5LCJpc3MiOiJzdGVhbWNsb3VkLmNvIiwiYXVkIjoic3RlYW1jbG91ZC5jbyJ9.j2v0RGqVlyhxSAuAStL0UjXTh4b9mJVVPYSMcU7mE1o
eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJOaWNrTmFtZSI6IuiSuOaxveS6kea4uDc2MTIiLCJVc2VySWQiOiIxMDA0IiwiZXhwIjoxNzMzMTUzNzM0LCJpc3MiOiJzdGVhbWNsb3VkLmNvIiwiYXVkIjoic3RlYW1jbG91ZC5jbyJ9.Z8TlcO-hiUtIVDXw92AnLnZWV1a3YjxwH-D0WkcUn-w eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJOaWNrTmFtZSI6IuiSuOaxveS6kea4uDc2MTIiLCJVc2VySWQiOiIxMDA0IiwiZXhwIjoxNzMzMTUzNzM0LCJpc3MiOiJzdGVhbWNsb3VkLmNvIiwiYXVkIjoic3RlYW1jbG91ZC5jbyJ9.Z8TlcO-hiUtIVDXw92AnLnZWV1a3YjxwH-D0WkcUn-w
https://pay.shhuanmeng.com/api/pay/default/wx/WX0T1732583693U001004P001M001RP8/4b45f4f47386fc2b658714b8be9c2967 https://pay.shhuanmeng.com/api/pay/default/wx/WX0T1732583693U001004P001M001RP8/4b45f4f47386fc2b658714b8be9c2967
{ {
"userName": "章哲", "userName": "章哲",
"idCard": "32132219981208335X", "idCard": "32132219981208335X",
"deviceNumber": "j2v0RGqVlyhxSAuAStL0UjXTh4b9mJVVPYSMcU7mE1o" "deviceNumber": "j2v0RGqVlyhxSAuAStL0UjXTh4b9mJVVPYSMcU7mE1o"
} }
{ {
"sn": "12", "sn": "12",
"gameId": "sc0010012", "gameId": "sc0010012",
"modelName": "vivox200" "modelName": "vivox200"
} }
{ {
"sn": "12", "sn": "12",
"gameId": "sc0010012", "gameId": "sc0010012",
"modelName": "vivox200", "modelName": "vivox200",
"cpu": "vivox200" "cpu": "vivox200"
} }
key Game:UserId:GameId key Game:UserId:GameId
用户id, 用户 id,
游戏开始时间 游戏开始时间
游戏最后一次心跳时间 游戏最后一次心跳时间
游戏id 游戏 id
游戏名称 游戏名称
游戏会话id 游戏会话 id
用户设备号 用户设备号
用户cpu 用户 cpu
鲸云scid 鲸云 scid
鲸云游戏id 鲸云游戏 id
10分钟
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 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 channel_id=d612a79436ef9ceeee4d6847d854b2e1&client_sid=1004&ip=::1&sn=string&time=1732182359&sign=AF722CD3E78E15E6F8C05C2372F53EAB
@ -178,11 +151,9 @@ able_queue=1&channel_id=d612a79436ef9ceeee4d6847d854b2e1&client_sid=1004&game_ke
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=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 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 RedemptionCodeEntityCache
SevenDayEntityCache SevenDayEntityCache
views/Apps/App/T_RedemptionCodes/Index.vue views/Apps/App/T_RedemptionCodes/Index.vue
/apps/app/t_redemptioncodes /apps/app/t_redemptioncodes
@ -191,21 +162,65 @@ views/Apps/App/T_User_RedemptionUsages/Index.vue
redemption_codes redemption_codes
views/Apps/App/T_User_FeedBacks/Index.vue views/Apps/App/T_User_FeedBacks/Index.vue
/apps/app/t_user_feedbacks /apps/app/t_user_feedbacks
测试环境接口地址映射的192.168.195.6:81接口地址http://test.steamcloud.co/ 测试环境接口地址((映射的 192.168.195.6:81 接口地址http://test.steamcloud.co/
测试服务器地址1.15.21.245 dbt@com@123 测试服务器地址 1.15.21.245 dbt@com@123
测试服务器内网地址192.168.195.8 测试服务器内网地址192.168.195.8
测试环境宝塔面板 测试环境宝塔面板
【云服务器】请在安全组放行 36259 端口 【云服务器】请在安全组放行 36259 端口
外网面板地址: https://1.15.21.245:36259/4b250f5c 外网面板地址: https://1.15.21.245:36259/4b250f5c
内网面板地址: https://10.0.16.9:36259/4b250f5c 内网面板地址: https://10.0.16.9:36259/4b250f5c
username: oepyym7k username: oepyym7k
password: 2acef8d9 password: 2acef8d9
测试环境使用的服务器192.168.195.6 测试环境使用的服务器192.168.195.6
http://1.15.21.245/ http://1.15.21.245/
game.qinghee.com.cn game.qinghee.com.cn
## 多语言
### 需要特殊处理的模块
1. 游戏
2. 菜单
### 不需要特殊处理的模块
1. 提示消息
2. 游戏类型
3. 游戏标签
3. 商城
```json
//游戏多语言
{
"sc0010110":{
"gameName":"泰坦陨落2",
"gameIntroduce":"《泰坦陨落2》是一款以机甲和士兵为主角的第一人称射击游戏。玩家将体验到驾驶巨型机甲的快感以及在战场上与敌人进行激烈对抗的刺激。游戏以其紧张的战斗、丰富的武器系统和机甲自定义选项受到玩家的喜爱。"
},
}
//菜单多语言
[{
"Title":"Banner",
"MenuList":[
{
"title":"古墓丽影:崛起",
"subTitle":"",
"resParams":""
}
]
}]
```
119.45.131.215
接口服务api
官网服务www
扩展服务ext
支付:pay
后台接口adminapi
图片cos
加速cdncos
cdnapi

View File

@ -0,0 +1,5 @@
SELECT * FROM `order_list` where order_id in ( select order_id from `order` where price>0 and status=1 and addtime>1740931200 ) and addtime>1740931200 and user_id=5031;
SELECT sum(price) FROM `order` where addtime>1740931200 and status=1;
SELECT * FROM `user` where addtime>1740931200;

View File

@ -1,12 +1,17 @@
# 星岚魔盒 [官网](http://xinglanmh.shequtuangou.vip) # 星岚魔盒 [官网](http://xinglanmh.shequtuangou.vip)
## linux 账户和控制面板g3[(ebSUq)6DL
默认账户为 root初始密码为g3[(ebSUq)6DL ## linux 账户和控制面板 g3[(ebSUq)6DL
外网面板地址: https://129.211.213.92:25032/275a36c5
内网面板地址: https://10.206.0.10:25032/275a36c5 默认账户为 root初始密码为 g3[(ebSUq)6DL
username: r6ftdo1y 外网面板地址: https://129.211.213.92:25032/275a36c5
password: a4a78696 内网面板地址: https://10.206.0.10:25032/275a36c5
username: r6ftdo1y
password: a4a78696
ssh root@129.211.213.92
## 数据库
## 数据库
xinglanmh.shequtuangou.vip xinglanmh.shequtuangou.vip
xinglanmh_shequt xinglanmh_shequt
9dG2b5E5cWkzkAya 9dG2b5E5cWkzkAya
@ -18,12 +23,14 @@ docker exec -i mysql5.7 sh -c 'exec mysql -uroot -p"$9dG2b5E5cWkzkAya"' < xingla
mysql -uroot -p xinglanmh_shequt < /disk/xinglanmh_shequt.sql mysql -uroot -p xinglanmh_shequt < /disk/xinglanmh_shequt.sql
198816 198816
## 小程序
## 小程序
枫岚云赏 枫岚云赏
Appidwx82c787f79c22f012 Appidwx82c787f79c22f012
AppSecretc6da2a4588646d4673404b5389e6f8d4 AppSecretc6da2a4588646d4673404b5389e6f8d4
枫岚云赏OL 枫岚云赏 OL
Appidwx22273e57f5fa8e36 Appidwx22273e57f5fa8e36
AppSecret2c0939eea2cf5685793627ba40f22efc AppSecret2c0939eea2cf5685793627ba40f22efc
@ -35,19 +42,17 @@ AppSecret5400fb526cace8d426f056247cf077b3
MCHID1680912237 MCHID1680912237
Keymnshdjkdanbdajhsd662656565656363 Keymnshdjkdanbdajhsd662656565656363
1679870953 1679870953
mnshdjkdanbdajhsd662656565656363 mnshdjkdanbdajhsd662656565656363
枫岚云赏pro 枫岚云赏 pro
Appidwxc14c7b3dc3c2f944 Appidwxc14c7b3dc3c2f944
AppSecret29d584a1fc2c46227b41eaf0c4d62506 AppSecret29d584a1fc2c46227b41eaf0c4d62506
微信商户平台: 微信商户平台:
操作密码198707 操作密码198707
商户号1681232757 商户号1681232757
商户APIv2密钥mnshdjkdanbdajhsd662656565656363 商户 APIv2 密钥mnshdjkdanbdajhsd662656565656363
## [开发文档](https://www.kancloud.cn/manual/thinkphp6_0/1037483) ## [开发文档](https://www.kancloud.cn/manual/thinkphp6_0/1037483)
@ -56,8 +61,8 @@ AppSecret29d584a1fc2c46227b41eaf0c4d62506
php think run php think run
``` ```
## h5 ## h5
1. 修改登录 1. 修改登录
2. 修改获取手机号 2. 修改获取手机号
3. 使用微信支付 3. 使用微信支付
@ -65,90 +70,81 @@ php think run
## 测试环境 ## 测试环境
## 测试环境数据库 ## 测试环境数据库
101.43.1.207 101.43.1.207
xinglanmh_shequt xinglanmh_shequt
mhSJjMeS5erzxEX7 mhSJjMeS5erzxEX7
## 后台管理
http://101.43.1.207/
后台 admin6 xu258258
## 后台管理
http://101.43.1.207/
后台 admin6 xu258258
外网面板地址: http://101.43.1.207:8888/tencentcloud 外网面板地址: http://101.43.1.207:8888/tencentcloud
内网面板地址: http://10.0.4.3:8888/tencentcloud 内网面板地址: http://10.0.4.3:8888/tencentcloud
|-用户名: 1rk9uzos |-用户名: 1rk9uzos
|-新密码: hm12345 |-新密码: hm12345
<!-- username: 1rk9uzos <!-- username: 1rk9uzos
password: 44fd15edcf5f --> password: 44fd15edcf5f -->
Warning: Warning:
If you cannot access the panel, If you cannot access the panel,
release the following port (8888|888|80|443|20|21) in the security group release the following port (8888|888|80|443|20|21) in the security group
注意:初始密码仅在首次登录面板前能正确获取,其它时间请通过 bt 5 命令修改密码 注意:初始密码仅在首次登录面板前能正确获取,其它时间请通过 bt 5 命令修改密码
================================================================== ==================================================================
## 请选择以下其中一种方式解决不安全提醒
1、下载证书地址https://dg2.bt.cn/ssl/baota_root.pfx 双击安装,密码【www.bt.cn】
## 请选择以下其中一种方式解决不安全提醒 2、点击【高级】-【继续访问】或【接受风险并继续】访问
1、下载证书地址https://dg2.bt.cn/ssl/baota_root.pfx 双击安装,密码【www.bt.cn】 教程https://www.bt.cn/bbs/thread-117246-1-1.html
2、点击【高级】-【继续访问】或【接受风险并继续】访问 mac 用户请下载使用此证书https://dg2.bt.cn/ssl/baota_root.crt
教程https://www.bt.cn/bbs/thread-117246-1-1.html
mac用户请下载使用此证书https://dg2.bt.cn/ssl/baota_root.crt
========================面板账户登录信息========================== ========================面板账户登录信息==========================
【云服务器】请在安全组放行 34936 端口 【云服务器】请在安全组放行 34936 端口
外网面板地址: https://119.45.131.215:34936/7cf1f8cc 外网面板地址: https://119.45.131.215:34936/7cf1f8cc
内网面板地址: https://10.206.0.8:34936/7cf1f8cc 内网面板地址: https://10.206.0.8:34936/7cf1f8cc
username: cf3mthue username: cf3mthue
password: fc3f3005 password: fc3f3005
xinglanmh_shequt xinglanmh_shequt
xinglanmh_shequt 9dG2b5E5cWkzkAya xinglanmh_shequt 9dG2b5E5cWkzkAya
### 一番赏抽奖规则修改 ### 一番赏抽奖规则修改
#### 原规则 #### 原规则
1. 每次抽奖时将所有奖品的库存查出来,打乱顺序两次,依次从最上面抽取。 1. 每次抽奖时将所有奖品的库存查出来,打乱顺序两次,依次从最上面抽取。
#### 新规则 #### 新规则
1. 每次抽奖时,判断奖品是否满足限制的已抽取次数,满足后将奖品放入奖池。然后在打乱顺序,进行抽奖。 1. 每次抽奖时,判断奖品是否满足限制的已抽取次数,满足后将奖品放入奖池。然后在打乱顺序,进行抽奖。
###
###
https://www.virustotal.com/gui/file/5312213d8b214fbbd63319eabd739bae97b918856e2a8a4b5563879bc26c2ac0?nocache=1 https://www.virustotal.com/gui/file/5312213d8b214fbbd63319eabd739bae97b918856e2a8a4b5563879bc26c2ac0?nocache=1
https://metadefender.opswat.com/results/file/bzI0MDcwMlFuYWEzQURTTm5Nd1hqeTFmajNv_mdaas/regular/multiscan https://metadefender.opswat.com/results/file/bzI0MDcwMlFuYWEzQURTTm5Nd1hqeTFmajNv_mdaas/regular/multiscan
[root@VM-0-10-centos console]# stat incould.php [root@VM-0-10-centos console]# stat incould.php
File: incould.php File: incould.php
Size: 37 Blocks: 8 IO Block: 4096 regular file Size: 37 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 1450167 Links: 1 Device: fd01h/64769d Inode: 1450167 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 1000/ www) Gid: ( 1000/ www) Access: (0755/-rwxr-xr-x) Uid: ( 1000/ www) Gid: ( 1000/ www)
Access: 2024-07-02 13:35:45.175471538 +0800 访问时间 Access: 2024-07-02 13:35:45.175471538 +0800 访问时间
Modify: 2024-04-24 09:36:01.000000000 +0800 修改时间 Modify: 2024-04-24 09:36:01.000000000 +0800 修改时间
Change: 2024-06-18 14:47:09.226223449 +0800 更改时间 Change: 2024-06-18 14:47:09.226223449 +0800 更改时间
Birth: - Birth: -
[root@VM-0-10-centos console]# stat index.78b99ffb.png [root@VM-0-10-centos console]# stat index.78b99ffb.png
File: index.78b99ffb.png File: index.78b99ffb.png
Size: 413 Blocks: 8 IO Block: 4096 regular file Size: 413 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 1450168 Links: 1 Device: fd01h/64769d Inode: 1450168 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 1000/ www) Gid: ( 1000/ www) Access: (0755/-rwxr-xr-x) Uid: ( 1000/ www) Gid: ( 1000/ www)
Access: 2024-07-02 13:36:20.757462800 +0800 Access: 2024-07-02 13:36:20.757462800 +0800
Modify: 2024-04-24 09:36:04.000000000 +0800 Modify: 2024-04-24 09:36:04.000000000 +0800
Change: 2024-06-18 14:47:09.226223449 +0800 Change: 2024-06-18 14:47:09.226223449 +0800
```sh ```sh
[root@VM-0-10-centos console]# stat incould.php [root@VM-0-10-centos console]# stat incould.php
File: incould.php File: incould.php
@ -169,40 +165,98 @@ Modify: 2024-04-24 09:36:04.000000000 +0800
Change: 2024-06-18 14:47:09.226223449 +0800 Change: 2024-06-18 14:47:09.226223449 +0800
``` ```
### 数据库操作 ### 数据库操作
```sh ```sh
ALTER TABLE `goods` ADD COLUMN `goods_describe` VARCHAR(300) COMMENT '描述' ALTER TABLE `goods` ADD COLUMN `goods_describe` VARCHAR(300) COMMENT '描述'
``` ```
## 20240911
## 20240911
# 新需求 在一番赏内增加两个奖励类型 # 新需求 在一番赏内增加两个奖励类型
1. 增加新的奖励类型(福袋),抽中后需要在福袋中随机抽取一个奖品(有数量限制,概率不同,等级不同)给用户,福袋内的奖品抽完后,这个福袋就抽不到了。 1. 增加新的奖励类型(福袋),抽中后需要在福袋中随机抽取一个奖品(有数量限制,概率不同,等级不同)给用户,福袋内的奖品抽完后,这个福袋就抽不到了。
2. 增加新的奖励类型(宝箱),抽中后需要在宝箱中随机抽取一个奖品(无数量限制,概率不同,等级不同)给用户,宝箱次数抽完后,这个宝箱就抽不到了。 2. 增加新的奖励类型(宝箱),抽中后需要在宝箱中随机抽取一个奖品(无数量限制,概率不同,等级不同)给用户,宝箱次数抽完后,这个宝箱就抽不到了。
3. 用户抽中福袋或者宝箱后,直接帮用户开启。 3. 用户抽中福袋或者宝箱后,直接帮用户开启。
##
1. 增加奖品类型 ##
1. 增加奖品类型
2. 后台增加配置福袋和宝箱的配置页面。同时需要增加配置的奖品。 2. 后台增加配置福袋和宝箱的配置页面。同时需要增加配置的奖品。
3. 抽奖的时候增加抽中逻辑 3. 抽奖的时候增加抽中逻辑
4. 发放奖品添加新的发放逻辑 4. 发放奖品添加新的发放逻辑
5. 前端页面展示福袋和宝箱内的奖品列表 5. 前端页面展示福袋和宝箱内的奖品列表
wx3dcc897ef3f95446 wx3dcc897ef3f95446
5b6be87fd3df73d4f04e0a5f269b703d 5b6be87fd3df73d4f04e0a5f269b703d
【云服务器】请在安全组放行 8888 端口
外网面板地址: https://119.45.131.215:8888/bskjbt
内网面板地址: https://10.206.0.8:8888/bskjbt
username: bskjbt
password: 7415dc59
php think Zd
baji2024
/cloudgaming/1002/sc100010.png
LB 65
RB 127
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x10, // USAGE_MAXIMUM (Button 16)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
(byte) 0x95, 0x10, // REPORT_COUNT (16)
(byte) 0x81, 0x02, // INPUT (Data, Var, Abs)
// 按钮部分
0x05, 0x09, // USAGE_PAGE (Button) - 按钮输入
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x10, // USAGE_MAXIMUM (Button 16)
0x15, 0x00, // LOGICAL_MINIMUM (0) - 按钮的逻辑最小值
0x25, 0x01, // LOGICAL_MAXIMUM (1) - 按钮的逻辑最大值
0x75, 0x01, // REPORT_SIZE (1) - 每个按钮占用 1 位
(byte) 0x95, 0x10, // REPORT_COUNT (16) - 总共有 16 个按钮
(byte) 08x1, 0x02, // INPUT (Data, Var, Abs) - 按钮输入,数据类型、变量、绝对值
*/5 * * * * flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &'
【云服务器】请在安全组放行 8888 端口 ```sql
外网面板地址: https://119.45.131.215:8888/bskjbt /// <summary>
内网面板地址: https://10.206.0.8:8888/bskjbt
username: bskjbt
password: 7415dc59
baji2024 /// 订单号规则表,定义订单号的组成规则
/// </summary>
CREATE TABLE OrderNumberRule (
Id INT PRIMARY KEY AUTO_INCREMENT, -- 主键 ID
RuleName VARCHAR(50) NOT NULL, -- 规则名称
DateFormat VARCHAR(20), -- 日期格式,例如 yyyyMMdd、yyMMdd
IntegerLength INT NOT NULL, -- 整数部分位数,例如 3 表示 001、002
Prefix VARCHAR(20), -- 订单号前缀,例如"ORD"
Suffix VARCHAR(20) -- 订单号后缀
);
/// <summary>
/// 订单号流水表,记录每个规则的当前流水号
/// </summary>
CREATE TABLE OrderNumberSequence (
RuleId INT PRIMARY KEY, -- 规则 ID关联 OrderNumberRule
CurrentNumber INT NOT NULL, -- 当前流水号
FOREIGN KEY (RuleId) REFERENCES OrderNumberRule(Id)
);
```
吧唧赏:
1640336072
YIlFPpYoZVfDQu2pvjOhv7joBjhitFjV

25
常用SQL/backup.sql Normal file
View File

@ -0,0 +1,25 @@
-- 备份 CloudGamingAdmin 数据库
BACKUP DATABASE CloudGamingAdmin
TO DISK = '/var/opt/mssql/backup/2024-03-21/CloudGamingAdmin.bak'
WITH FORMAT, INIT, NAME = 'CloudGamingAdmin-Full Database Backup';
-- 备份 CloudGamingCBT 数据库
BACKUP DATABASE CloudGamingCBT
TO DISK = '/var/opt/mssql/backup/2024-03-21/CloudGamingCBT.bak'
WITH FORMAT, INIT, NAME = 'CloudGamingCBT-Full Database Backup';
-- 备份 CloudGamingGame 数据库
BACKUP DATABASE CloudGamingGame
TO DISK = '/var/opt/mssql/backup/2024-03-21/CloudGamingGame.bak'
WITH FORMAT, INIT, NAME = 'CloudGamingGame-Full Database Backup';
-- 备份 CloudGamingPhone 数据库
BACKUP DATABASE CloudGamingPhone
TO DISK = '/var/opt/mssql/backup/2024-03-21/CloudGamingPhone.bak'
WITH FORMAT, INIT, NAME = 'CloudGamingPhone-Full Database Backup';
-- 备份 CloudGamingUser 数据库
BACKUP DATABASE CloudGamingUser
TO DISK = '/var/opt/mssql/backup/2024-03-21/CloudGamingUser.bak'
WITH FORMAT, INIT, NAME = 'CloudGamingUser-Full Database Backup';

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -79,9 +79,9 @@ cat ~/.ssh/id_rsa.pub
eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa
ssh -T git@192.168.1.33 ssh -T git@123.207.203.228
http://123.207.203.228/
ssh-keygen -t rsa -b 4096 -C "zpc1131" ssh-keygen -t rsa -b 4096 -C "zpc"
ssh-keygen -t rsa -b 4096 -C "zpc1131@gmail.com" ssh-keygen -t rsa -b 4096 -C "zpc1131@gmail.com"
ssh -T git@github.com ssh -T git@github.com
### 拉取 ### 拉取
@ -101,7 +101,7 @@ ssh-keygen -t rsa -b 4096 -C "zhangzhe@wsl"
eval "$(ssh-agent -s)" ssh-add /home/z/.ssh/229_rsa eval "$(ssh-agent -s)" ssh-add /home/z/.ssh/229_rsa
ssh-copy-id -i /home/z/.ssh/229_rsa.pub root@192.168.1.229 ssh-copy-id -i /home/z/.ssh/229_rsa.pub root@192.168.1.229
git config --global user.email "zpc1131@wsl" git config --global user.email "baji@server"
git config --global user.name "zhangzhe" git config --global user.name "baji"
``` ```

View File

@ -92,7 +92,8 @@ docker save -o I:/docker/ubuntu/cg-admin-0.02.tar cg-admin:dev-0.0.2
# 运行 # 运行
docker run -d -p 90:90 -v miaoyu-log:/app/output --name webapi miaoyu:dev-0.0.3 docker run -d -p 90:90 -v miaoyu-log:/app/output --name webapi miaoyu:dev-0.0.3
# 清理未使用的容器、镜像、网络和卷
docker system prune -a -f
``` ```

View File

@ -8,6 +8,8 @@ sudo shutdown now
# 服务文件 # 服务文件
sudo nano /etc/systemd/system/ sudo nano /etc/systemd/system/
# 查看磁盘空间
df -h
#查看发行版信息 #查看发行版信息
lsb_release -a lsb_release -a
@ -21,6 +23,7 @@ hostnamectl
ssh-keygen -R 106.75.209.57 ssh-keygen -R 106.75.209.57
ssh-keygen -R 101.43.1.207 ssh-keygen -R 101.43.1.207
ssh-keygen -R 101.43.1.207 ssh-keygen -R 101.43.1.207
ssh-keygen -R 101.43.19.200
ssh-keygen -R 43.154.208.215 ssh-keygen -R 43.154.208.215
#安装ip查看工具 #安装ip查看工具
sudo apt-get install net-tools sudo apt-get install net-tools

View File

@ -37,6 +37,7 @@ sudo apt install nginx
sudo systemctl start nginx sudo systemctl start nginx
#步骤 4使 Nginx 服务开机自启 #步骤 4使 Nginx 服务开机自启
sudo systemctl enable nginx sudo systemctl enable nginx
sudo systemctl enable nginx
#步骤 5检查 Nginx 状态 #步骤 5检查 Nginx 状态
sudo systemctl status nginx sudo systemctl status nginx
#步骤 6配置防火墙 #步骤 6配置防火墙

View File

@ -23,4 +23,6 @@ rsync -avz --delete /home/user/project/ user@remote.server:/home/user/backup/
1. -a归档模式表示递归传输并保持所有文件属性。 1. -a归档模式表示递归传输并保持所有文件属性。
2. -v详细模式显示传输过程中的详细信息。 2. -v详细模式显示传输过程中的详细信息。
3. -z压缩文件数据以减少传输量。 3. -z压缩文件数据以减少传输量。
4. -P显示传输进度并自动重启传输中断的部分 4. -P显示传输进度并自动重启传输中断的部分
rsync -avz /www/wwwroot/119.45.131.215_80/app/admin /www/wwwroot/testbaji.onelight.vip/app/admin

View File

@ -11,23 +11,29 @@ ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu@123.207.203.228
# git服务器 # git服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu@123.207.203.228 ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu@123.207.203.228
ssh-copy-id -i ~/.ssh/id_rsa.pub root@123.207.203.228 ssh-copy-id -i ~/.ssh/id_rsa.pub root@123.207.203.228
ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu@101.43.19.200
ssh-copy-id -i ~/.ssh/id_rsa.pub root@124.220.55.158
Dbt@com@123
ssh-copy-id -i ~/.ssh/id_rsa.pub root@110.42.231.54 ssh-copy-id -i ~/.ssh/id_rsa.pub root@110.42.231.54
ssh-copy-id -i ~/.ssh/id_rsa.pub root@119.45.131.215 ssh-copy-id -i ~/.ssh/id_rsa.pub root@119.45.131.215
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.195.6
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.195.8
ssh-copy-id -i ~/.ssh/id_rsa.pub root@1.15.21.245
ssh-keygen -R 101.43.19.200
web-1308826010.cos-website.ap-shanghai.myqcloud.com
``` ```
# windwos ssh 创建 # windwos ssh 创建
```sh ```sh
ssh-keygen -t rsa -b 4096 -C "zhangzhe@pc" ssh-keygen -t rsa -b 4096 -C "zpc@pc"
# 输入路径 /c/Users/admin/.ssh/229_rsa # 输入路径 /c/Users/admin/.ssh/229_rsa
# 创建的路径不能有公共的读写权限 # 创建的路径不能有公共的读写权限
sudo eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa sudo eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa
ssh-copy-id -i ~/.ssh/229_rsa.pub root@192.168.1.229 ssh-copy-id -i ~/.ssh/229_rsa.pub root@192.168.1.229
# 远程的时候可以添加密钥文件地址cd # 远程的时候可以添加密钥文件地址cd
ssh root@192.168.1.229 -i ~/.ssh/229_rsa ssh root@192.168.1.229 -i ~/.ssh/229_rsa
ssh root@192.168.195.8 -i ~/.ssh/229_rsa
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 root@43.154.208.215 -i ~/.ssh/25_rsa ssh root@43.154.208.215 -i ~/.ssh/25_rsa
@ -38,7 +44,7 @@ ssh-keygen -R 119.45.131.215
```sh ```sh
ssh-keygen -t rsa -b 4096 -C "zhangzhe@wsl" ssh-keygen -t rsa -b 4096 -C "zhangzhe@wsl"
# /home/z/.ssh/229_rsa # /home/z/.ssh/229_rsa
eval "$(ssh-agent -s)" ssh-add /home/z/.ssh/229_rsa eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa /home/z/.ssh/229_rsa
ssh-copy-id -i /home/z/.ssh/229_rsa.pub root@192.168.1.229 ssh-copy-id -i /home/z/.ssh/229_rsa.pub root@192.168.1.229
# 远程的时候可以添加密钥文件地址 # 远程的时候可以添加密钥文件地址
ssh root@192.168.1.229 -i ~/.ssh/229_rsa ssh root@192.168.1.229 -i ~/.ssh/229_rsa
@ -50,7 +56,7 @@ ssh-copy-id -i /root/.ssh/id_rsa.pub
# linux ssh 线上 # linux ssh 线上
```sh ```sh
ssh-keygen -t rsa -b 4096 -C "zhangzhe@wsl" ssh-keygen -t rsa -b 4096 -C "baji@server"
# /home/z/.ssh/25_rsa # /home/z/.ssh/25_rsa
eval "$(ssh-agent -s)" ssh-add /home/z/.ssh/25_rsa eval "$(ssh-agent -s)" ssh-add /home/z/.ssh/25_rsa
ssh-copy-id -i /home/z/.ssh/25_rsa.pub root@192.144.132.25 ssh-copy-id -i /home/z/.ssh/25_rsa.pub root@192.144.132.25
@ -81,7 +87,7 @@ ssh root@1.117.87.77
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.144.132.25 ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.144.132.25
ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu@123.207.203.228 ssh-copy-id -i ~/.ssh/id_rsa.pub root@123.207.203.228
ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu@106.75.209.57 ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu@106.75.209.57
ssh root@192.168.1.229 -i ~/.ssh/229_rsa ssh root@192.168.1.229 -i ~/.ssh/229_rsa

83
脚本/aaa.html Normal file
View File

@ -0,0 +1,83 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>海报合成</title>
<script src="https://cdn.jsdelivr.net/npm/qrcodejs/qrcode.min.js"></script>
</head>
<body>
<img id="resultImage" style="width: 650px;" />
<script>
function generatePosterWithQR(backgroundUrl, qrText) {
return new Promise((resolve, reject) => {
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
const qrSize = 500; // 二维码大小
const poster = new Image();
poster.crossOrigin = "anonymous"; // 允许跨域加载
poster.src = backgroundUrl;
poster.onload = () => {
canvas.width = poster.width;
canvas.height = poster.height;
ctx.drawImage(poster, 0, 0);
// 创建隐藏的 div 生成二维码
const qrDiv = document.createElement("div");
qrDiv.style.display = "none";
document.body.appendChild(qrDiv);
const qrCode = new QRCode(qrDiv, {
text: qrText,
width: qrSize,
height: qrSize
});
setTimeout(() => {
const qrCanvas = qrDiv.querySelector("canvas");
if (qrCanvas) {
const qrImg = new Image();
qrImg.src = qrCanvas.toDataURL("image/png");
qrImg.onload = () => {
const qrX = (canvas.width - qrSize) * 0.5;
const qrY = (canvas.height - qrSize) * 0.73;
ctx.drawImage(qrImg, qrX, qrY, qrSize, qrSize);
document.body.removeChild(qrDiv); // 清理 DOM
// 返回合成后的图片
resolve(canvas.toDataURL("image/png"));
};
} else {
reject("二维码生成失败");
}
}, 500);
};
poster.onerror = () => reject("海报图片加载失败");
});
}
generatePosterWithQR("img_poster.jpg", "https://example.com")
.then((imageUrl) => {
console.log("合成图片地址:", imageUrl);
// 你可以直接设置到 <img> 标签
document.getElementById("resultImage").src = imageUrl;
// 或者提供下载功能
const link = document.createElement("a");
link.href = imageUrl;
link.download = "final_poster.png";
link.innerText = "下载合成图片";
document.body.appendChild(link);
})
.catch((error) => console.error("生成失败:", error));
</script>
</body>
</html>

BIN
脚本/img_poster.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 540 KiB

245
面试题 C# .md Normal file
View File

@ -0,0 +1,245 @@
1. C# 中值类型和引用类型的区别是什么?
答案:
值类型:存储数据本身,分配在栈上,通常具有较高的性能。常见的值类型有 int、float、char、struct。
引用类型:存储对数据的引用,分配在堆上。常见的引用类型有 string、class、array、delegate。
区别:
值类型变量直接存储数据,而引用类型变量存储的是指向数据的引用。
值类型赋值会复制数据,引用类型赋值会复制引用。
在堆上创建的对象的生命周期由垃圾回收器管理,而栈上的数据会在方法执行完毕后自动销毁。
2. C# 中的 static 关键字有什么作用?
答案:
静态成员static 修饰符用于声明类的静态成员(字段、方法、属性等)。静态成员属于类本身,而不是类的实例。静态成员在程序启动时初始化,并且在整个应用程序生命周期内共享。
静态类static 修饰符也可用于声明静态类。静态类只能包含静态成员,并且不能实例化。
示例:
```csharp
public static class MyStaticClass
{
public static int Counter = 0;
public static void IncrementCounter()
{
Counter++;
}
}
```
1. C# 中的 async 和 await 是如何工作的?
答案:
async用于修饰方法表示该方法是异步的。异步方法可以包含 await 关键字。
await用于等待一个异步操作的完成。await 会暂停方法的执行,直到异步任务完成,之后恢复执行。
async 和 await 使得异步编程变得更加简洁和易读。在执行异步操作时,线程不会被阻塞,从而提高了应用的响应性。
示例:
```csharp
public async Task<int> CalculateSumAsync(int a, int b)
{
await Task.Delay(1000); // 模拟异步操作
return a + b;
}
```
4. C# 中 ref 和 out 的区别是什么?
答案:
ref参数在传递之前必须已经初始化方法内的修改会影响到方法外的值。
out参数无需初始化方法内部必须给 out 参数赋值,方法外的值将被修改。
示例:
```csharp
public void RefMethod(ref int x)
{
x = x + 1; // 需要初始化
}
public void OutMethod(out int x)
{
x = 10; // 不需要初始化
}
```
5. 什么是委托Delegate
答案: 委托是对方法的引用,允许将方法作为参数传递。委托可以用来实现事件机制或回调函数。委托类似于函数指针,但它是类型安全的。
示例:
``` csharp
public delegate void MyDelegate(string message);
public void DisplayMessage(string message)
{
Console.WriteLine(message);
}
MyDelegate del = new MyDelegate(DisplayMessage);
del("Hello, world!");
```
6. 解释 C# 中的事件Event和委托Delegate的关系。
答案:
委托:委托是一个引用类型,用来定义方法的签名,可以指向一个或多个方法。
事件:事件基于委托,用于通知订阅者某些事情已经发生。事件是一种封装机制,通常用于实现发布/订阅模式。
事件的主要作用是防止直接调用委托,而是通过事件的触发机制来通知订阅者。
示例:
```csharp
public delegate void Notify(); // 定义委托
public class Publisher
{
public event Notify OnNotify; // 定义事件
public void TriggerEvent()
{
OnNotify?.Invoke(); // 触发事件
}
}
```
7. C# 中的 LINQ 是什么?
答案: LINQLanguage Integrated Query是一种用于查询集合数据的强大工具它使得你可以用一种声明性的方法在内存中处理数据如数组、列表、数据库等。LINQ 提供了多种操作符,如 Where、Select、GroupBy、OrderBy 等,用来处理和筛选数据。
示例:
```csharp
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = from num in numbers
where num % 2 == 0
select num;
foreach (var num in evenNumbers)
{
Console.WriteLine(num);
}
```
8. C# 中的垃圾回收机制Garbage Collection是如何工作的
答案: C# 使用自动垃圾回收GC机制来管理内存。GC 负责回收不再使用的对象释放它们占用的内存空间。GC 会定期检查堆上的对象并回收那些不再被引用的对象。C# 中的对象在堆上创建,并且它们的生命周期由垃圾回收器控制。
Generational GCC# 使用分代垃圾回收策略,分为 3 代0、1、2 代)。年轻代的对象容易被回收,而老年代的对象通常会存活更长时间。
Dispose 和 Finalize实现 IDisposable 接口可以让对象在垃圾回收之前释放资源Finalize 用于定义清理资源的逻辑。
9. C# 中的 using 语句的作用是什么?
答案: using 语句用于确保实现了 IDisposable 接口的对象在使用完毕后正确释放资源。using 语句会在代码块结束时自动调用对象的 Dispose 方法。
```csharp
using (var stream = new FileStream("file.txt", FileMode.Open))
{
// 使用 stream 进行操作
} // stream.Dispose() 会自动被调用
```
10. C# 中的扩展方法Extension Method是什么
答案: 扩展方法是 C# 中的一种特殊方法,它允许向现有类型添加新功能,而无需修改原始类型的代码。扩展方法通常定义为静态方法,并且第一个参数是 this 修饰符,指示它是扩展哪个类型。
```csharp
public static class StringExtensions
{
public static bool IsCapitalized(this string str)
{
return char.IsUpper(str[0]);
}
}
class Program
{
static void Main()
{
string text = "Hello";
Console.WriteLine(text.IsCapitalized()); // 使用扩展方法
}
}
```
### 垃圾回收机制Garbage Collection是如何工作的
在 C# 中垃圾回收机制Garbage Collection简称 GC负责自动管理内存确保不再使用的对象能够被回收以便释放内存并避免内存泄漏。垃圾回收是 .NET 平台的核心特性之一,它简化了内存管理,开发人员不需要手动释放内存。然而,理解其工作原理对于优化应用程序的性能和减少内存使用非常重要。
1. 垃圾回收的基本概念
垃圾回收机制的主要目的是释放不再使用的内存以便为新的对象腾出空间。GC 在运行时自动跟踪和管理托管堆中的对象,确保已经不再引用的对象能够被销毁,释放其占用的内存。
托管堆Managed Heap 是垃圾回收管理的内存区域,所有通过 new 关键字创建的对象(如类实例)都存储在托管堆上。托管堆是 .NET 平台自动管理的内存区域,垃圾回收器会负责清理这些对象。
2. 垃圾回收的工作流程
垃圾回收的过程是由 .NET 运行时CLRCommon Language Runtime自动执行的通常包括以下步骤
2.1 标记Mark
垃圾回收器会首先遍历所有的活动仍然被引用的对象并标记它们为存活对象。这些存活对象通过根GC Roots进行引用根对象包括
局部变量和方法参数
静态字段
当前线程的栈
其他存活对象引用的对象
通过从这些根对象开始,垃圾回收器会遍历所有直接或间接引用的对象,并标记它们为“活跃”的。
2.2 清除Sweep
在标记阶段完成后,垃圾回收器会遍历堆中的所有对象,检查哪些对象没有被标记为存活对象。对于这些未被标记的对象,垃圾回收器会将它们标记为“死对象”并准备删除。
2.3 压缩Compact
清除不再使用的对象后,垃圾回收器将释放的内存位置合并并压缩堆。这个过程包括将存活对象重新排列,使得堆中的内存空间不再被碎片化。压缩过程有时会导致对象的地址发生变化,但这是由垃圾回收器自动处理的。
3. 垃圾回收的代Generations
垃圾回收器将堆内存分为多个代Generation目的是提高性能并减少回收的频率。GC 使用代的概念来优化回收过程,根据对象的生命周期将对象分配到不同的代。常见的有三个代:
3.1 第 0 代Generation 0
新创建的对象:大多数新对象都会被分配到第 0 代。
垃圾回收频繁:第 0 代的对象生命周期较短,因此垃圾回收器会频繁回收这一代的对象。
性能优化:垃圾回收器通过频繁清理第 0 代中的对象来减少不必要的内存占用。
3.2 第 1 代Generation 1
存活对象:如果一个对象在第 0 代的回收过程中仍然存活,它会被提升到第 1 代。
回收频率较低:相对于第 0 代,第 1 代的垃圾回收会更少发生,因为这些对象通常存活时间较长。
3.3 第 2 代Generation 2
长期存活的对象:第 2 代包含存活时间较长的对象,例如缓存对象、连接池对象等。通常较少发生垃圾回收。
回收频率最低:当第 2 代发生垃圾回收时,意味着系统正在经历较大的内存压力。
3.4 代间晋升
当对象从一个代晋升到另一个代时它们的生命周期变得更长。GC 会尽可能将存活的对象提升到较高的代,以减少回收频率。
4. 垃圾回收的触发条件
垃圾回收的触发可以由多种因素触发:
4.1 内存压力
当系统内存不足时垃圾回收会被触发。GC 会尝试回收不再使用的对象,以释放内存。
4.2 显式调用
开发人员可以通过调用 GC.Collect() 显式触发垃圾回收。一般来说,不建议频繁调用此方法,除非你有特别的理由进行显式垃圾回收。
```csharp
GC.Collect(); // 显式触发垃圾回收
```
4.3 堆满
当托管堆的内存达到阈值时,也会触发垃圾回收。堆的大小通常由 .NET 运行时的配置决定,但垃圾回收器会根据需要扩展堆的大小。
5. 垃圾回收的优化
虽然垃圾回收机制大大简化了内存管理,但它仍然有可能对性能产生影响,尤其是在大量对象创建和销毁时。以下是一些优化建议:
5.1 减少短生命周期的对象
尽量避免创建生命周期短暂的对象,尤其是在高频率的循环中。这些对象将频繁地进入第 0 代垃圾回收,可能导致性能问题。
5.2 使用对象池Object Pool
对于那些高频次创建销毁的对象,可以使用对象池(如 ObjectPool<T>)来重复使用对象,减少垃圾回收的频率。
5.3 避免大对象分配
大对象(通常大于 85 KB会直接分配到大对象堆LOHLarge Object Heap它不属于常规的代管理。大对象堆的回收较为复杂可能导致长时间的暂停。如果可能尽量避免频繁分配大对象。
5.4 减少内存碎片
当你处理大型数据集或长生命周期的对象时,要注意内存碎片的影响。适时压缩堆可以有效减少碎片。
6. 垃圾回收的暂停时间GC Pauses
在垃圾回收过程中CLR 会停止应用程序的执行,这通常称为 GC 停顿GC Pause。GC 停顿的时间取决于多种因素,包括堆的大小、代的数量以及是否发生了大对象堆的回收。
在较大的应用程序中,频繁的垃圾回收可能会导致性能瓶颈,尤其是在需要响应快速的实时应用中。为了减少这种停顿,.NET 提供了 后台垃圾回收Background GC它在后台线程中执行垃圾回收操作以减少应用程序停顿的时间。
7. GC 类型的选择
.NET 提供了两种主要的垃圾回收模式:
7.1 工作站垃圾回收Workstation GC
适用于客户端应用程序(如桌面应用程序)。
在较小的系统上工作良好。
启动时有较短的暂停时间,但吞吐量较低。
7.2 服务器垃圾回收Server GC
适用于服务器应用程序,能够充分利用多核处理器。
增强了吞吐量和多核支持,适用于高并发、大规模应用。
启动时有较长的暂停时间,但吞吐量更高。

View File

@ -0,0 +1,170 @@
### 在 Entity Framework (EF) 中,开启事务的方式主要有以下几种:
1. 使用 SaveChanges 时自动管理事务
2. 显式使用 DbContext.Database.BeginTransaction
3. 使用 TransactionScope 来管理事务 TransactionScope 是 .NET 提供的一种跨多个数据库操作的事务管理方法。它适用于不同数据库之间的事务,但需要注意,它会使用 System.Transactions 命名空间,因此需要引用相应的程序集。
### 事务隔离级别 (Transaction Isolation Levels)
事务的隔离级别决定了事务范围内操作的可见性以及对并发操作的控制。常见的隔离级别包括:
• Read Uncommitted允许读取未提交的数据。不会对读取的数据加锁可能导致“脏读”。
• Read Committed只允许读取已提交的数据。会对读取的数据加共享锁防止脏读但可能会导致不可重复读。
• Repeatable Read保证读取的数据在事务期间不变。会对读取的数据加共享锁防止脏读和不可重复读但可能会导致幻读。
• Serializable保证事务之间完全隔离避免任何并发问题。会对读取的数据加范围锁防止脏读、不可重复读和幻读是最严格的隔离级别。
### Sql server的锁级别
1. 行级锁 (Row Locks)
行级锁是锁定单一行数据的最细粒度的锁。它能够允许对同一表中的不同行进行并发操作,从而提高并发性。行级锁是 SQL Server 在默认情况下对修改数据(如 UPDATE、DELETE 或 INSERT时所使用的锁类型。
• 适用场景:当多个事务需要访问同一表的不同数据行时,行级锁可以有效减少锁的竞争。
• 示例UPDATE 语句会锁定更新的行,而不会影响到其他行。
2. 页级锁 (Page Locks)
页级锁是锁定数据库中单个数据页(通常是 8KB 的数据页。当数据页上的多个行被访问时SQL Server 会使用页级锁。虽然页级锁的锁粒度大于行级锁,但它比表级锁的粒度要小,因此能够在一定程度上提高并发性。
• 适用场景当多行数据位于同一个数据页上时SQL Server 可能会使用页级锁。
• 示例当查询或更新的数据行分布在同一页中时SQL Server 会对整个数据页加锁。
3. 表级锁 (Table Locks)
表级锁是锁定整个数据表的锁。它是最粗粒度的锁,通常在以下情况使用:当 SQL Server 执行 SELECT、UPDATE、DELETE 或 INSERT 操作时如果表中的数据量较大或涉及整个表的数据操作SQL Server 会考虑使用表级锁。虽然表级锁减少了并发性,但它对事务的完整性保护更强。
• 适用场景:对整个表进行操作时,如在没有指定索引的情况下进行全表扫描。
• 示例DELETE 语句在没有索引优化的情况下可能会锁定整个表。
3. 键范围锁 (Key-Range Locks)
### SQL Server 中的索引是什么?它的类型有哪些?
答案: 索引是数据库管理系统中提高查询效率的一种数据结构。它允许数据库引擎快速找到某些列的数据而不需要扫描整个表。SQL Server 支持多种类型的索引:
• 聚集索引Clustered Index数据表的行数据按照索引键的顺序存储在磁盘中表只能有一个聚集索引。默认情况下主键约束会创建聚集索引。
• 非聚集索引Non-Clustered Index索引和数据存储在不同的地方。一个表可以有多个非聚集索引。
• 唯一索引Unique Index确保索引列中的值是唯一的。
• 全文索引Full-Text Index用于优化文本数据的查询允许对大量文本数据进行复杂的查询例如LIKE 查询)。
• 空间索引Spatial Index用于处理空间数据如地理信息数据
## SQL Server 中的死锁Deadlock是什么如何解决死锁问题
死锁是指两个或多个事务在执行过程中互相等待对方释放资源导致它们永远无法完成操作。SQL Server 会自动检测死锁,并选择其中一个事务回滚以解锁资源。
解决死锁的策略包括:
1. 最小化事务的锁定范围:尽量减少事务锁定的资源和时间。
2. 避免循环依赖:确保事务的操作顺序是一致的,避免事务之间的资源依赖循环。
3. 使用适当的隔离级别:选择合适的隔离级别来平衡并发和一致性。
4. 优化查询:通过索引优化查询,减少锁的争用。
5. 使用 SET DEADLOCK_PRIORITY设置事务的死锁优先级确保某些事务优先被回滚。
### 如何在 SQL Server 中优化查询性能?
1. 使用合适的索引:为常用的查询列创建适当的索引,避免全表扫描。
2. **避免使用 SELECT * **:只选择需要的列,减少 I/O 和数据传输。
3. 避免在 WHERE 子句中使用函数:尽量避免在 WHERE 子句中对列进行计算或使用函数,这样会导致索引无法使用。
4. 使用连接而不是子查询:在可能的情况下,使用 JOIN 替代子查询,以减少查询的复杂性和执行时间。
5. 分区表:使用分区表将数据分割成更小的部分,从而提高查询效率。
6. 查询计划分析:使用 SET STATISTICS IO ON 和 SET STATISTICS TIME ON 分析查询的执行计划,找到性能瓶颈。
7. 缓存优化:使用 WITH (NOLOCK) 提高查询速度,但要小心脏读问题。
### SQL Server 中的 JOIN 类型及其作用是什么?
答案: JOIN 用于将两个或多个表中的数据根据一定的条件进行合并。常见的 JOIN 类型包括:
1. INNER JOIN返回两个表中符合条件的行。当两个表中有匹配的数据时才返回结果。
2. LEFT JOINLEFT OUTER JOIN返回左表的所有行即使右表没有匹配的数据。右表没有匹配数据的行会以 NULL 填充。
3. RIGHT JOINRIGHT OUTER JOIN返回右表的所有行即使左表没有匹配的数据。左表没有匹配数据的行会以 NULL 填充。
4. FULL JOINFULL OUTER JOIN返回左右表的所有行若某一表没有匹配的数据则使用 NULL 填充。
5. CROSS JOIN返回两个表的笛卡尔积即每个左表的行都会与右表的每一行配对。
### SQL Server 中的存储过程Stored Procedure和触发器Trigger的区别是什么
1. 存储过程:是一组预编译的 SQL 语句,可以通过调用存储过程来执行。存储过程可以接受参数,并且可以返回值。通常用于封装一系列的操作,便于复用。
2. 触发器:是一种特殊的存储过程,它在某些数据库事件(如 INSERT、UPDATE、DELETE发生时自动执行。触发器不能被直接调用只能由数据操作触发。
区别:
存储过程是显式调用的,而触发器是隐式触发的。
存储过程一般用于业务逻辑处理,而触发器用于自动执行某些操作,如数据验证、审计等。
### 什么是视图ViewSQL Server 中视图的作用是什么?
视图是一个虚拟表,它并不存储数据,而是存储查询的 SQL 语句。视图可以简化复杂的查询,提供不同的数据显示层次,或者作为数据的抽象层来实现安全控制。
### 什么是 SQL Server 中的事务Transaction
答案: 事务是一个逻辑工作单元,由一组 SQL 语句组成这些语句要么全部成功要么全部失败。事务保证了数据库操作的原子性、隔离性、一致性和持久性ACID 属性)。
1. 原子性:事务中的所有操作要么全部成功,要么全部失败。
2. 一致性:事务使数据库从一个一致的状态转换到另一个一致的状态。
3. 隔离性:事务执行时,其内部的操作对外部事务是不可见的。
4. 持久性:一旦事务提交,结果是永久性的。
### SQL Server 中的 NULL 和空字符串 ('') 有什么区别?
1. NULL表示未知或不存在的值。NULL 不等于任何值,包括空字符串、零等。
2. 空字符串 (''):表示一个长度为 0 的字符串,是一个有效的值,但它并不等于 NULL。
在查询中NULL 需要使用 IS NULL 或 IS NOT NULL 来判断,而空字符串则可以直接与其他字符串进行比较。
### sql server 开启事务
```sql
BEGIN TRANSACTION; -- 开始事务
-- 你的 SQL 操作
INSERT INTO Employees (Name, Age) VALUES ('John Doe', 30);
UPDATE Employees SET Age = 31 WHERE Name = 'John Doe';
-- 如果操作成功,提交事务
COMMIT;
-- 如果发生错误,回滚事务
-- ROLLBACK;
```
#### 扩展
在 SQL Server 中锁用于确保数据库中的并发访问是安全的避免数据不一致或损坏。SQL Server 提供了多种锁类型,包括 行级锁、表级锁 和 页级锁。这些锁决定了事务访问数据时可以选择锁定的数据级别。下面将详细讲解如何使用这些不同的锁。
你可以通过 WITH (ROWLOCK) 提示强制 SQL Server 在执行查询时使用行级锁。这样可以确保对特定数据行的访问不会被其他事务锁定的页或表干扰。
```sql
BEGIN TRANSACTION;
-- 强制使用行级锁
SELECT *
FROM Employees
WITH (ROWLOCK)
WHERE EmployeeID = 1;
-- 提交事务
COMMIT;
```
表级锁锁定整个表,因此表中的所有行在事务执行期间都将被锁定,其他事务无法对该表进行修改或查询(如果使用了 TABLOCKX 锁的话)。表级锁通常用于批量操作,或当锁定整个表的数据时使用。
使用表级锁的场景:
批量操作在大规模更新、删除或插入操作中SQL Server 通常会使用表级锁。
显式指定:可以通过 WITH (TABLOCK) 提示来强制使用表级锁。
```sql
BEGIN TRANSACTION;
-- 强制使用表级锁
UPDATE Employees
WITH (TABLOCK)
SET Age = 30
WHERE Department = 'Sales';
COMMIT;
```
强制使用表级锁:
你可以使用 WITH (TABLOCK) 提示来显式要求 SQL Server 在操作时使用表级锁。
```sql
BEGIN TRANSACTION;
-- 强制使用表级锁
DELETE FROM Employees
WITH (TABLOCK)
WHERE Age < 25;
COMMIT;
```
页级锁是介于行级锁和表级锁之间的一种锁类型。页级锁通常会锁定数据库页(通常每页包含 8KB 的数据),如果一个查询或操作锁定了某个页中的一行,那么该页上的所有其他行也将被锁定。页级锁通常在以下情况中使用:
当多个行在同一个页上并且一个事务对其中一个行进行了修改时SQL Server 可能会使用页级锁。
显式控制:你不能直接强制使用页级锁,但可以通过使用 WITH (PAGLOCK) 提示来请求它。
```sql
BEGIN TRANSACTION;
-- 强制使用页级锁
UPDATE Employees
WITH (PAGLOCK)
SET Age = 30
WHERE EmployeeID = 10;
COMMIT;
```
APP渠道号
phone system缩写为 ps_001
车机渠道号:
car system缩写为 cs_001
TV渠道号
tv system缩写为 ts_001
android
ios
tv
car
会员
2