提交
This commit is contained in:
parent
3cd4a38114
commit
6f4c2ab2fe
|
|
@ -5,7 +5,7 @@ APPID授权管理通知
|
|||
商户全称:: 上海寰梦科技发展有限公司
|
||||
APPID:: wxafecedd1ad0d7483
|
||||
APPID名称:: 上海寰梦科技发展有限公司
|
||||
|
||||
apiV2:bad162066cbc9c34bb457e6997b7255b
|
||||
|
||||
## 公司小程序账号密码
|
||||
zhangxiaode690@gmail.com。 zxd@6666.
|
||||
|
|
|
|||
|
|
@ -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": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
||||
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
|
||||
|
||||
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. 多语言问题
|
||||
2. 部分数据表不全
|
||||
3. 云游戏核心(放后面)
|
||||
|
||||
### 11 号目标
|
||||
|
||||
1. 完成基础组件(已完成)、缓存(已完成)、redis 缓存(已完成)、日志组件(已完成)
|
||||
|
||||
### 12 号目标
|
||||
|
||||
1. 完成首页接口
|
||||
2. 完成游戏分类接口
|
||||
|
||||
### 13 号目标
|
||||
|
||||
1. 完成后台管理技术难点
|
||||
2. 实验多语言技术路径
|
||||
|
||||
### 14 号目标
|
||||
|
||||
1. 完成 AppConfig 接口
|
||||
2. 完成手机号登录接口
|
||||
|
||||
### 后台管理技术
|
||||
|
||||
1. 采用 vue3
|
||||
|
|
@ -67,20 +48,23 @@ public string PassWord{get;set;}
|
|||
}
|
||||
|
||||
## 未做
|
||||
|
||||
1. 一键登录
|
||||
|
||||
|
||||
2. 多语言功能
|
||||
3. 后台用户管理
|
||||
|
||||
views/Apps/Ext/T_App_Channels/Index.vue
|
||||
/apps/ext/t_app_channels
|
||||
|
||||
|
||||
## 目前还差
|
||||
|
||||
2. 官网
|
||||
3. 导入游戏数据
|
||||
4. 后台管理
|
||||
|
||||
5. 导入游戏数据(完成)
|
||||
|
||||
## 后台管理
|
||||
|
||||
1. 用户列表
|
||||
2. 游戏记录
|
||||
3. 用户资产记录
|
||||
|
|
@ -88,10 +72,10 @@ views/Apps/Ext/T_App_Channels/Index.vue
|
|||
5. 用户搜索记录
|
||||
6. 首页-注册人数-登录人数-今天玩游戏人数-正在玩游戏人数-
|
||||
7. 订单管理
|
||||
8.
|
||||
|
||||
8.
|
||||
|
||||
## 暂时不做
|
||||
|
||||
1. 任务中心
|
||||
2. 头像框
|
||||
3. 头像列表
|
||||
|
|
@ -99,19 +83,20 @@ views/Apps/Ext/T_App_Channels/Index.vue
|
|||
5. 包夜卡
|
||||
|
||||
## 已完成
|
||||
|
||||
13. 支付功能(完成)
|
||||
5. 兑换码(完成)
|
||||
6. 反馈中心(完成)
|
||||
7. 我的收藏(我的收藏页面 icon 使用哪一个)
|
||||
8. 搜索页面推荐-热度(完成)
|
||||
1. 七天签到(完成)
|
||||
3. 游戏时长排行(完成)
|
||||
15. 消息(完成)
|
||||
11. 玩游戏(完成)
|
||||
12. 游戏心跳设置(完成)
|
||||
14. 支付中心(完成)
|
||||
views/Apps/App/T_SevenDaySignIns/Index.vue
|
||||
/apps/app/t_sevendaysignins
|
||||
14. 兑换码(完成)
|
||||
15. 反馈中心(完成)
|
||||
16. 我的收藏(我的收藏页面 icon 使用哪一个)
|
||||
17. 搜索页面推荐-热度(完成)
|
||||
18. 七天签到(完成)
|
||||
19. 游戏时长排行(完成)
|
||||
20. 消息(完成)
|
||||
21. 玩游戏(完成)
|
||||
22. 游戏心跳设置(完成)
|
||||
23. 支付中心(完成)
|
||||
views/Apps/App/T_SevenDaySignIns/Index.vue
|
||||
/apps/app/t_sevendaysignins
|
||||
|
||||
views/Apps/App/T_SevenDaySignIn_Rewards/Index.vue
|
||||
/apps/app/t_sevendaysignin_rewards
|
||||
|
|
@ -119,58 +104,46 @@ views/Apps/App/T_SevenDaySignIn_Rewards/Index.vue
|
|||
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"
|
||||
"userName": "章哲",
|
||||
"idCard": "32132219981208335X",
|
||||
"deviceNumber": "j2v0RGqVlyhxSAuAStL0UjXTh4b9mJVVPYSMcU7mE1o"
|
||||
}
|
||||
|
||||
{
|
||||
"sn": "12",
|
||||
"gameId": "sc0010012",
|
||||
"modelName": "vivox200"
|
||||
"sn": "12",
|
||||
"gameId": "sc0010012",
|
||||
"modelName": "vivox200"
|
||||
}
|
||||
{
|
||||
"sn": "12",
|
||||
"gameId": "sc0010012",
|
||||
"modelName": "vivox200",
|
||||
"cpu": "vivox200"
|
||||
"sn": "12",
|
||||
"gameId": "sc0010012",
|
||||
"modelName": "vivox200",
|
||||
"cpu": "vivox200"
|
||||
}
|
||||
|
||||
key: Game:UserId:GameId
|
||||
用户id,
|
||||
用户 id,
|
||||
游戏开始时间
|
||||
游戏最后一次心跳时间
|
||||
游戏id
|
||||
游戏 id
|
||||
游戏名称
|
||||
游戏会话id
|
||||
游戏会话 id
|
||||
用户设备号
|
||||
用户cpu
|
||||
鲸云scid
|
||||
鲸云游戏id
|
||||
|
||||
|
||||
10分钟
|
||||
|
||||
|
||||
|
||||
用户 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
|
||||
|
|
@ -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=vivox200&sn=j2v0RGqVlyhxSAuAS&start_resolution=1080P&time=1732182556&sign=015AE41EF5CDCB0A5CADDB234E56287B
|
||||
|
||||
|
||||
RedemptionCodeEntityCache
|
||||
SevenDayEntityCache
|
||||
|
||||
|
||||
views/Apps/App/T_RedemptionCodes/Index.vue
|
||||
/apps/app/t_redemptioncodes
|
||||
|
||||
|
|
@ -191,21 +162,65 @@ views/Apps/App/T_User_RedemptionUsages/Index.vue
|
|||
|
||||
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.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
|
||||
【云服务器】请在安全组放行 36259 端口
|
||||
外网面板地址: https://1.15.21.245:36259/4b250f5c
|
||||
内网面板地址: https://10.0.16.9:36259/4b250f5c
|
||||
username: oepyym7k
|
||||
password: 2acef8d9
|
||||
|
||||
测试环境使用的服务器:192.168.195.6
|
||||
测试环境使用的服务器:192.168.195.6
|
||||
|
||||
http://1.15.21.245/
|
||||
game.qinghee.com.cn
|
||||
http://1.15.21.245/
|
||||
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
|
||||
|
|
|
|||
5
公司/工作/星岚魔盒/吧唧赏.md
Normal file
5
公司/工作/星岚魔盒/吧唧赏.md
Normal 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;
|
||||
|
|
@ -1,12 +1,17 @@
|
|||
# 星岚魔盒 [官网](http://xinglanmh.shequtuangou.vip)
|
||||
## linux 账户和控制面板g3[(ebSUq)6DL
|
||||
默认账户为 root,初始密码为g3[(ebSUq)6DL
|
||||
外网面板地址: https://129.211.213.92:25032/275a36c5
|
||||
内网面板地址: https://10.206.0.10:25032/275a36c5
|
||||
username: r6ftdo1y
|
||||
password: a4a78696
|
||||
# 星岚魔盒 [官网](http://xinglanmh.shequtuangou.vip)
|
||||
|
||||
## linux 账户和控制面板 g3[(ebSUq)6DL
|
||||
|
||||
默认账户为 root,初始密码为 g3[(ebSUq)6DL
|
||||
外网面板地址: https://129.211.213.92:25032/275a36c5
|
||||
内网面板地址: https://10.206.0.10:25032/275a36c5
|
||||
username: r6ftdo1y
|
||||
password: a4a78696
|
||||
|
||||
ssh root@129.211.213.92
|
||||
|
||||
## 数据库
|
||||
|
||||
## 数据库
|
||||
xinglanmh.shequtuangou.vip
|
||||
xinglanmh_shequt
|
||||
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
|
||||
|
||||
198816
|
||||
## 小程序
|
||||
|
||||
## 小程序
|
||||
|
||||
枫岚云赏
|
||||
Appid:wx82c787f79c22f012
|
||||
AppSecret:c6da2a4588646d4673404b5389e6f8d4
|
||||
|
||||
枫岚云赏OL
|
||||
枫岚云赏 OL
|
||||
Appid:wx22273e57f5fa8e36
|
||||
AppSecret:2c0939eea2cf5685793627ba40f22efc
|
||||
|
||||
|
|
@ -35,19 +42,17 @@ AppSecret:5400fb526cace8d426f056247cf077b3
|
|||
MCHID:1680912237
|
||||
Key:mnshdjkdanbdajhsd662656565656363
|
||||
|
||||
|
||||
1679870953
|
||||
mnshdjkdanbdajhsd662656565656363
|
||||
|
||||
枫岚云赏pro
|
||||
枫岚云赏 pro
|
||||
Appid:wxc14c7b3dc3c2f944
|
||||
AppSecret:29d584a1fc2c46227b41eaf0c4d62506
|
||||
|
||||
微信商户平台:
|
||||
操作密码:198707
|
||||
商户号:1681232757
|
||||
商户APIv2密钥:mnshdjkdanbdajhsd662656565656363
|
||||
|
||||
商户 APIv2 密钥:mnshdjkdanbdajhsd662656565656363
|
||||
|
||||
## [开发文档](https://www.kancloud.cn/manual/thinkphp6_0/1037483)
|
||||
|
||||
|
|
@ -56,8 +61,8 @@ AppSecret:29d584a1fc2c46227b41eaf0c4d62506
|
|||
php think run
|
||||
```
|
||||
|
||||
|
||||
## h5
|
||||
|
||||
1. 修改登录
|
||||
2. 修改获取手机号
|
||||
3. 使用微信支付
|
||||
|
|
@ -65,90 +70,81 @@ php think run
|
|||
## 测试环境
|
||||
|
||||
## 测试环境数据库
|
||||
|
||||
101.43.1.207
|
||||
xinglanmh_shequt
|
||||
mhSJjMeS5erzxEX7
|
||||
## 后台管理
|
||||
http://101.43.1.207/
|
||||
后台 admin6 xu258258
|
||||
|
||||
## 后台管理
|
||||
|
||||
http://101.43.1.207/
|
||||
后台 admin6 xu258258
|
||||
|
||||
外网面板地址: http://101.43.1.207:8888/tencentcloud
|
||||
内网面板地址: http://10.0.4.3:8888/tencentcloud
|
||||
|-用户名: 1rk9uzos
|
||||
|-新密码: hm12345
|
||||
|
||||
<!-- username: 1rk9uzos
|
||||
password: 44fd15edcf5f -->
|
||||
|
||||
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
|
||||
注意:初始密码仅在首次登录面板前能正确获取,其它时间请通过 bt 5 命令修改密码
|
||||
==================================================================
|
||||
|
||||
## 请选择以下其中一种方式解决不安全提醒
|
||||
|
||||
|
||||
## 请选择以下其中一种方式解决不安全提醒
|
||||
1、下载证书,地址:https://dg2.bt.cn/ssl/baota_root.pfx 双击安装,密码【www.bt.cn】
|
||||
2、点击【高级】-【继续访问】或【接受风险并继续】访问
|
||||
教程:https://www.bt.cn/bbs/thread-117246-1-1.html
|
||||
mac用户请下载使用此证书:https://dg2.bt.cn/ssl/baota_root.crt
|
||||
1、下载证书,地址:https://dg2.bt.cn/ssl/baota_root.pfx 双击安装,密码【www.bt.cn】
|
||||
2、点击【高级】-【继续访问】或【接受风险并继续】访问
|
||||
教程:https://www.bt.cn/bbs/thread-117246-1-1.html
|
||||
mac 用户请下载使用此证书:https://dg2.bt.cn/ssl/baota_root.crt
|
||||
|
||||
========================面板账户登录信息==========================
|
||||
|
||||
【云服务器】请在安全组放行 34936 端口
|
||||
外网面板地址: https://119.45.131.215:34936/7cf1f8cc
|
||||
内网面板地址: https://10.206.0.8:34936/7cf1f8cc
|
||||
username: cf3mthue
|
||||
password: fc3f3005
|
||||
【云服务器】请在安全组放行 34936 端口
|
||||
外网面板地址: https://119.45.131.215:34936/7cf1f8cc
|
||||
内网面板地址: https://10.206.0.8:34936/7cf1f8cc
|
||||
username: cf3mthue
|
||||
password: fc3f3005
|
||||
|
||||
xinglanmh_shequt
|
||||
xinglanmh_shequt 9dG2b5E5cWkzkAya
|
||||
|
||||
|
||||
xinglanmh_shequt 9dG2b5E5cWkzkAya
|
||||
|
||||
### 一番赏抽奖规则修改
|
||||
|
||||
#### 原规则
|
||||
|
||||
1. 每次抽奖时将所有奖品的库存查出来,打乱顺序两次,依次从最上面抽取。
|
||||
|
||||
#### 新规则
|
||||
|
||||
1. 每次抽奖时,判断奖品是否满足限制的已抽取次数,满足后将奖品放入奖池。然后在打乱顺序,进行抽奖。
|
||||
|
||||
###
|
||||
|
||||
|
||||
|
||||
|
||||
###
|
||||
https://www.virustotal.com/gui/file/5312213d8b214fbbd63319eabd739bae97b918856e2a8a4b5563879bc26c2ac0?nocache=1
|
||||
https://metadefender.opswat.com/results/file/bzI0MDcwMlFuYWEzQURTTm5Nd1hqeTFmajNv_mdaas/regular/multiscan
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
[root@VM-0-10-centos console]# stat incould.php
|
||||
File: ‘incould.php’
|
||||
Size: 37 Blocks: 8 IO Block: 4096 regular file
|
||||
Device: fd01h/64769d Inode: 1450167 Links: 1
|
||||
Access: (0755/-rwxr-xr-x) Uid: ( 1000/ www) Gid: ( 1000/ www)
|
||||
Access: 2024-07-02 13:35:45.175471538 +0800 访问时间
|
||||
Modify: 2024-04-24 09:36:01.000000000 +0800 修改时间
|
||||
Change: 2024-06-18 14:47:09.226223449 +0800 更改时间
|
||||
Birth: -
|
||||
File: ‘incould.php’
|
||||
Size: 37 Blocks: 8 IO Block: 4096 regular file
|
||||
Device: fd01h/64769d Inode: 1450167 Links: 1
|
||||
Access: (0755/-rwxr-xr-x) Uid: ( 1000/ www) Gid: ( 1000/ www)
|
||||
Access: 2024-07-02 13:35:45.175471538 +0800 访问时间
|
||||
Modify: 2024-04-24 09:36:01.000000000 +0800 修改时间
|
||||
Change: 2024-06-18 14:47:09.226223449 +0800 更改时间
|
||||
Birth: -
|
||||
[root@VM-0-10-centos console]# stat index.78b99ffb.png
|
||||
File: ‘index.78b99ffb.png’
|
||||
Size: 413 Blocks: 8 IO Block: 4096 regular file
|
||||
Device: fd01h/64769d Inode: 1450168 Links: 1
|
||||
Access: (0755/-rwxr-xr-x) Uid: ( 1000/ www) Gid: ( 1000/ www)
|
||||
File: ‘index.78b99ffb.png’
|
||||
Size: 413 Blocks: 8 IO Block: 4096 regular file
|
||||
Device: fd01h/64769d Inode: 1450168 Links: 1
|
||||
Access: (0755/-rwxr-xr-x) Uid: ( 1000/ www) Gid: ( 1000/ www)
|
||||
Access: 2024-07-02 13:36:20.757462800 +0800
|
||||
Modify: 2024-04-24 09:36:04.000000000 +0800
|
||||
Change: 2024-06-18 14:47:09.226223449 +0800
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```sh
|
||||
[root@VM-0-10-centos console]# stat 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
|
||||
```
|
||||
|
||||
|
||||
### 数据库操作
|
||||
|
||||
```sh
|
||||
ALTER TABLE `goods` ADD COLUMN `goods_describe` VARCHAR(300) COMMENT '描述'
|
||||
```
|
||||
|
||||
## 20240911
|
||||
|
||||
## 20240911
|
||||
# 新需求 在一番赏内增加两个奖励类型
|
||||
|
||||
1. 增加新的奖励类型(福袋),抽中后需要在福袋中随机抽取一个奖品(有数量限制,概率不同,等级不同)给用户,福袋内的奖品抽完后,这个福袋就抽不到了。
|
||||
2. 增加新的奖励类型(宝箱),抽中后需要在宝箱中随机抽取一个奖品(无数量限制,概率不同,等级不同)给用户,宝箱次数抽完后,这个宝箱就抽不到了。
|
||||
3. 用户抽中福袋或者宝箱后,直接帮用户开启。
|
||||
##
|
||||
1. 增加奖品类型
|
||||
|
||||
##
|
||||
|
||||
1. 增加奖品类型
|
||||
2. 后台增加配置福袋和宝箱的配置页面。同时需要增加配置的奖品。
|
||||
3. 抽奖的时候增加抽中逻辑
|
||||
4. 发放奖品添加新的发放逻辑
|
||||
5. 前端页面展示福袋和宝箱内的奖品列表
|
||||
|
||||
|
||||
|
||||
|
||||
3. 抽奖的时候增加抽中逻辑
|
||||
4. 发放奖品添加新的发放逻辑
|
||||
5. 前端页面展示福袋和宝箱内的奖品列表
|
||||
|
||||
wx3dcc897ef3f95446
|
||||
|
||||
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 端口
|
||||
外网面板地址: https://119.45.131.215:8888/bskjbt
|
||||
内网面板地址: https://10.206.0.8:8888/bskjbt
|
||||
username: bskjbt
|
||||
password: 7415dc59
|
||||
```sql
|
||||
/// <summary>
|
||||
|
||||
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
25
常用SQL/backup.sql
Normal 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';
|
||||
BIN
接口文档/jssdk开发文档20211117.pdf
Normal file
BIN
接口文档/jssdk开发文档20211117.pdf
Normal file
Binary file not shown.
BIN
接口文档/openapi开发文档20211117.pdf
Normal file
BIN
接口文档/openapi开发文档20211117.pdf
Normal file
Binary file not shown.
BIN
数据库/2024-03-21/CloudGamingAdmin.bak
Normal file
BIN
数据库/2024-03-21/CloudGamingAdmin.bak
Normal file
Binary file not shown.
BIN
数据库/2024-03-21/CloudGamingCBT.bak
Normal file
BIN
数据库/2024-03-21/CloudGamingCBT.bak
Normal file
Binary file not shown.
BIN
数据库/2024-03-21/CloudGamingGame.bak
Normal file
BIN
数据库/2024-03-21/CloudGamingGame.bak
Normal file
Binary file not shown.
BIN
数据库/2024-03-21/CloudGamingPhone.bak
Normal file
BIN
数据库/2024-03-21/CloudGamingPhone.bak
Normal file
Binary file not shown.
BIN
数据库/2024-03-21/CloudGamingUser.bak
Normal file
BIN
数据库/2024-03-21/CloudGamingUser.bak
Normal file
Binary file not shown.
|
|
@ -79,9 +79,9 @@ cat ~/.ssh/id_rsa.pub
|
|||
|
||||
eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa
|
||||
|
||||
ssh -T git@192.168.1.33
|
||||
|
||||
ssh-keygen -t rsa -b 4096 -C "zpc1131"
|
||||
ssh -T git@123.207.203.228
|
||||
http://123.207.203.228/
|
||||
ssh-keygen -t rsa -b 4096 -C "zpc"
|
||||
ssh-keygen -t rsa -b 4096 -C "zpc1131@gmail.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
|
||||
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.name "zhangzhe"
|
||||
git config --global user.email "baji@server"
|
||||
git config --global user.name "baji"
|
||||
|
||||
```
|
||||
|
|
@ -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 system prune -a -f
|
||||
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@ sudo shutdown now
|
|||
|
||||
# 服务文件
|
||||
sudo nano /etc/systemd/system/
|
||||
# 查看磁盘空间
|
||||
df -h
|
||||
|
||||
#查看发行版信息
|
||||
lsb_release -a
|
||||
|
|
@ -21,6 +23,7 @@ hostnamectl
|
|||
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.19.200
|
||||
ssh-keygen -R 43.154.208.215
|
||||
#安装ip查看工具
|
||||
sudo apt-get install net-tools
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ sudo apt install nginx
|
|||
sudo systemctl start nginx
|
||||
#步骤 4:使 Nginx 服务开机自启
|
||||
sudo systemctl enable nginx
|
||||
sudo systemctl enable nginx
|
||||
#步骤 5:检查 Nginx 状态
|
||||
sudo systemctl status nginx
|
||||
#步骤 6:配置防火墙
|
||||
|
|
|
|||
|
|
@ -23,4 +23,6 @@ rsync -avz --delete /home/user/project/ user@remote.server:/home/user/backup/
|
|||
1. -a:归档模式,表示递归传输并保持所有文件属性。
|
||||
2. -v:详细模式,显示传输过程中的详细信息。
|
||||
3. -z:压缩文件数据,以减少传输量。
|
||||
4. -P:显示传输进度,并自动重启传输中断的部分
|
||||
4. -P:显示传输进度,并自动重启传输中断的部分
|
||||
|
||||
rsync -avz /www/wwwroot/119.45.131.215_80/app/admin /www/wwwroot/testbaji.onelight.vip/app/admin
|
||||
|
|
@ -11,23 +11,29 @@ ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu@123.207.203.228
|
|||
# git服务器
|
||||
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@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@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 创建
|
||||
```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
|
||||
# 创建的路径不能有公共的读写权限
|
||||
sudo eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa
|
||||
ssh-copy-id -i ~/.ssh/229_rsa.pub root@192.168.1.229
|
||||
# 远程的时候可以添加密钥文件地址cd
|
||||
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 root@43.154.208.215 -i ~/.ssh/25_rsa
|
||||
|
||||
|
|
@ -38,7 +44,7 @@ ssh-keygen -R 119.45.131.215
|
|||
```sh
|
||||
ssh-keygen -t rsa -b 4096 -C "zhangzhe@wsl"
|
||||
# /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 root@192.168.1.229 -i ~/.ssh/229_rsa
|
||||
|
|
@ -50,7 +56,7 @@ ssh-copy-id -i /root/.ssh/id_rsa.pub
|
|||
|
||||
# linux ssh 线上
|
||||
```sh
|
||||
ssh-keygen -t rsa -b 4096 -C "zhangzhe@wsl"
|
||||
ssh-keygen -t rsa -b 4096 -C "baji@server"
|
||||
# /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
|
||||
|
|
@ -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 ~/.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 root@192.168.1.229 -i ~/.ssh/229_rsa
|
||||
|
|
|
|||
83
脚本/aaa.html
Normal file
83
脚本/aaa.html
Normal 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
BIN
脚本/img_poster.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 540 KiB |
245
面试题 C# .md
Normal file
245
面试题 C# .md
Normal 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 是什么?
|
||||
答案: LINQ(Language 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 GC:C# 使用分代垃圾回收策略,分为 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 运行时(CLR,Common 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)会直接分配到大对象堆(LOH,Large 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)
|
||||
适用于服务器应用程序,能够充分利用多核处理器。
|
||||
增强了吞吐量和多核支持,适用于高并发、大规模应用。
|
||||
启动时有较长的暂停时间,但吞吐量更高。
|
||||
170
面试题-ef和sql server.md
Normal file
170
面试题-ef和sql server.md
Normal 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 JOIN(LEFT OUTER JOIN):返回左表的所有行,即使右表没有匹配的数据。右表没有匹配数据的行会以 NULL 填充。
|
||||
3. RIGHT JOIN(RIGHT OUTER JOIN):返回右表的所有行,即使左表没有匹配的数据。左表没有匹配数据的行会以 NULL 填充。
|
||||
4. FULL JOIN(FULL OUTER JOIN):返回左右表的所有行,若某一表没有匹配的数据,则使用 NULL 填充。
|
||||
5. CROSS JOIN:返回两个表的笛卡尔积,即每个左表的行都会与右表的每一行配对。
|
||||
### SQL Server 中的存储过程(Stored Procedure)和触发器(Trigger)的区别是什么?
|
||||
1. 存储过程:是一组预编译的 SQL 语句,可以通过调用存储过程来执行。存储过程可以接受参数,并且可以返回值。通常用于封装一系列的操作,便于复用。
|
||||
2. 触发器:是一种特殊的存储过程,它在某些数据库事件(如 INSERT、UPDATE、DELETE)发生时自动执行。触发器不能被直接调用,只能由数据操作触发。
|
||||
区别:
|
||||
存储过程是显式调用的,而触发器是隐式触发的。
|
||||
存储过程一般用于业务逻辑处理,而触发器用于自动执行某些操作,如数据验证、审计等。
|
||||
### 什么是视图(View)?SQL 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
|
||||
Loading…
Reference in New Issue
Block a user