Compare commits

9 Commits

Author SHA1 Message Date
f941751304 feat(login): 添加奶昔论坛第三方登录支持
- 在登录页面增加奶昔论坛登录选项
- 实现奶昔论坛OAuth2.0认证流程
- 添加用户绑定和直接登录功能
- 优化登录界面布局和样式
2025-04-17 16:07:34 +08:00
eb74743826 chore(config): 更新物品掉落组 ID
将物品 ID 为 48394 的掉落组 ID 从 100881 修改为 100882
2025-04-17 15:50:46 +08:00
8171485c95 refactor(config): 更新物品合成配置
- 将物品 ID 3206 更改为 72
- 更新相应的 Eid 和 table 中的 ID
2025-04-17 15:20:28 +08:00
8e4d5fd69d feat(config): 增加兑换功能并调整道具数量
- 在 ItemMergeConfig.json 中添加了新的兑换配置项
- 在 StdItems.json 中将多个道具的最大堆叠数量从 9999 调整为 99999
2025-04-17 15:11:25 +08:00
d700be4fe7 feat(config): 调整道具合成数量
- 将多个道具的合成数量从 5 个调整为 3 个
- 涉及的道具 ID 包括 365、366、367、368、369、370、371、863 和 864
2025-04-17 14:56:39 +08:00
1c414a5f8c feat(configs): 更新 StdItems.json 道具配置
- 将道具 id 为 36303 的可叠加数量从 0 修改为 9999
- 新增道具 id 为 1395 的"天赐机缘盒"配置项
2025-04-17 14:41:20 +08:00
96ea0c4a4c build: 更新物品配置并调整数据处理顺序
- 新增 StdItems.xlsx 文件,用于物品配置
- 修改 json2excel.js 中的处理顺序:
  - 注释掉 SpecialRingConfig 的处理
  - 解除 StdItems 处理的注释
2025-04-17 14:17:03 +08:00
dbcd06b2b2 fix: 修改文件名大小写 2025-02-23 18:38:31 +08:00
ee500c51be feat(config): 设置四大内功装备的可叠加数量为 999
- 将银针[四方]、心决[四方]、金印[四方]和檀珠[四方]的可叠加数量从 0 修改为 999
- 此修改提高了玩家携带这些重要装备的数量,便于内功宝石的激活和使用
2025-02-23 18:11:03 +08:00
10 changed files with 1877 additions and 34 deletions

File diff suppressed because one or more lines are too long

View File

@@ -967,7 +967,7 @@
"Eid": 57,
"second_index": 7,
"table": [
{ "id": 365, "type": 0, "count": 5 },
{ "id": 365, "type": 0, "count": 3 },
{ "id": 2, "type": 2, "count": 1000 }
],
"openserverday": 1,
@@ -985,7 +985,7 @@
"Eid": 58,
"second_index": 7,
"table": [
{ "id": 366, "type": 0, "count": 5 },
{ "id": 366, "type": 0, "count": 3 },
{ "id": 2, "type": 2, "count": 3000 }
],
"openserverday": 1,
@@ -1003,7 +1003,7 @@
"Eid": 59,
"second_index": 7,
"table": [
{ "id": 367, "type": 0, "count": 5 },
{ "id": 367, "type": 0, "count": 3 },
{ "id": 2, "type": 2, "count": 5000 }
],
"openserverday": 1,
@@ -1021,7 +1021,7 @@
"Eid": 60,
"second_index": 7,
"table": [
{ "id": 368, "type": 0, "count": 5 },
{ "id": 368, "type": 0, "count": 3 },
{ "id": 2, "type": 2, "count": 8000 }
],
"openserverday": 1,
@@ -1037,7 +1037,7 @@
"Eid": 61,
"second_index": 7,
"table": [
{ "id": 369, "type": 0, "count": 5 },
{ "id": 369, "type": 0, "count": 3 },
{ "id": 2, "type": 2, "count": 15000 }
],
"openserverday": 1,
@@ -1053,7 +1053,7 @@
"Eid": 62,
"second_index": 7,
"table": [
{ "id": 370, "type": 0, "count": 5 },
{ "id": 370, "type": 0, "count": 3 },
{ "id": 2, "type": 2, "count": 30000 }
],
"openserverday": 1,
@@ -1069,7 +1069,7 @@
"Eid": 63,
"second_index": 7,
"table": [
{ "id": 371, "type": 0, "count": 5 },
{ "id": 371, "type": 0, "count": 3 },
{ "id": 2, "type": 2, "count": 50000 }
],
"openserverday": 1,
@@ -1085,7 +1085,7 @@
"Eid": 64,
"second_index": 7,
"table": [
{ "id": 863, "type": 0, "count": 5 },
{ "id": 863, "type": 0, "count": 3 },
{ "id": 2, "type": 2, "count": 80000 }
],
"openserverday": 1,
@@ -1101,7 +1101,7 @@
"Eid": 65,
"second_index": 7,
"table": [
{ "id": 864, "type": 0, "count": 5 },
{ "id": 864, "type": 0, "count": 3 },
{ "id": 2, "type": 2, "count": 120000 }
],
"openserverday": 1,
@@ -2252,6 +2252,19 @@
}
},
"2": {
"72": {
"circle": 0,
"compose": { "id": 840, "type": 0, "count": 1 },
"index": 3,
"text": "兑换",
"buttontxt10": "合成10次",
"mergebutton10": 1,
"Eid": 72,
"second_index": 2,
"table": [{ "id": 838, "type": 0, "count": 10 }],
"openserverday": 1,
"level": 1
},
"73": {
"circle": 0,
"compose": { "id": 838, "type": 0, "count": 10 },

View File

@@ -71,7 +71,7 @@
{ "id": 927, "type": 0, "count": 1 }
],
"pictures": ["tq_p_2_2", "tq_p_2_1", "tq_p_2_3"],
"consume": { "id": 1242, "type": 0, "count": 6 }
"consume": { "id": 1242, "type": 0, "count": 10 }
},
"7": {
"idx": 7,
@@ -89,7 +89,7 @@
{ "id": 928, "type": 0, "count": 1 }
],
"pictures": ["tq_p_4_3", "tq_p_3_1", "tq_p_3_3"],
"consume": { "id": 1242, "type": 0, "count": 16 }
"consume": { "id": 1242, "type": 0, "count": 20 }
},
"8": {
"idx": 8,
@@ -107,7 +107,7 @@
{ "id": 854, "type": 0, "count": 450 }
],
"pictures": ["tq_p_4_2", "tq_p_4_1", "tq_p_3_2"],
"consume": { "id": 1242, "type": 0, "count": 40 }
"consume": { "id": 1242, "type": 0, "count": 70 }
},
"9": {
"idx": 9,
@@ -126,7 +126,7 @@
{ "id": 250, "type": 0, "count": 10 }
],
"pictures": ["tq_p_5_2", "tq_p_5_1", "tq_p_5_3"],
"consume": { "id": 1242, "type": 0, "count": 100 }
"consume": { "id": 1242, "type": 0, "count": 220 }
},
"10": { "idx": 10, "name": "首充卡", "superRightLV": -1 },
"11": { "idx": 11, "name": "白卡" },

View File

@@ -9,7 +9,7 @@
"shop": {
"id": 4,
"type": 4,
"count": 5
"count": 100
},
"buytype": [],
"daylimit": 0,
@@ -205,7 +205,7 @@
"price": {
"id": 4,
"type": 4,
"count": 500
"count": 88
}
},
"94": {
@@ -235,7 +235,7 @@
"price": {
"id": 3,
"type": 3,
"count": 88888
"count": 188
}
}
},

View File

@@ -28778,7 +28778,7 @@
"desc": "可在【合成-换真充-银两兑换】中兑换银两。游戏内BOSS、夺宝有几率爆出参加各类玩法活动均有机会获得",
"dropBroadcast": 1,
"dropEffect": 3,
"dup": 9999,
"dup": 99999,
"existScenes": [-1],
"icon": 13131,
"id": 829,
@@ -28809,7 +28809,7 @@
"desc": "可在【合成-换真充-银两兑换】中兑换银两。游戏内BOSS、夺宝有几率爆出参加各类玩法活动均有机会获得",
"dropBroadcast": -1,
"dropEffect": 14,
"dup": 9999,
"dup": 99999,
"existScenes": [-1],
"icon": 13131,
"id": 830,
@@ -28840,7 +28840,7 @@
"desc": "可在【合成-换真充-银两兑换】中兑换银两。游戏内BOSS、夺宝有几率爆出参加各类玩法活动均有机会获得",
"dropBroadcast": -1,
"dropEffect": 11,
"dup": 9999,
"dup": 99999,
"existScenes": [-1],
"icon": 13131,
"id": 831,
@@ -28871,7 +28871,7 @@
"desc": "可在【合成-换真充-银两兑换】中兑换银两。游戏内BOSS、夺宝有几率爆出参加各类玩法活动均有机会获得",
"dropBroadcast": -1,
"dropEffect": 12,
"dup": 9999,
"dup": 99999,
"existScenes": [-1],
"icon": 13131,
"id": 832,
@@ -36303,7 +36303,7 @@
"desc": "该道具不可交易开服第8天可以开启。使用后立即返还5元宝、并随机抽取一件永久时装包含红玫瑰、紫玫瑰、黄金裁决、黄金屠龙、黄金嗜魂、黄金羽扇",
"dropBroadcast": 0,
"dropGroupid": 151016,
"dup": 0,
"dup": 9999,
"existScenes": [-1],
"fashionTips": "bx_show_001",
"icon": 13532,
@@ -40463,7 +40463,7 @@
"desc": "银针[四方],四大内功装备之一,可以激活内功宝石【银花簪】的共鸣效果",
"dropBroadcast": -1,
"dropEffect": 11,
"dup": 0,
"dup": 999,
"existScenes": [-1],
"icon": 13611,
"id": 1170,
@@ -40688,7 +40688,7 @@
"desc": "心决[四方],四大内功装备之一,可以激活内功宝石【养心玉】的共鸣效果",
"dropBroadcast": -1,
"dropEffect": 11,
"dup": 0,
"dup": 999,
"existScenes": [-1],
"icon": 13606,
"id": 1175,
@@ -40911,7 +40911,7 @@
"desc": "金印[四方],四大内功装备之一,可以激活内功宝石【金曜珠】的共鸣效果",
"dropBroadcast": -1,
"dropEffect": 11,
"dup": 0,
"dup": 999,
"existScenes": [-1],
"icon": 13601,
"id": 1180,
@@ -41134,7 +41134,7 @@
"desc": "檀珠[四方],四大内功装备之一,可以激活内功宝石【黑檀石】的共鸣效果",
"dropBroadcast": -1,
"dropEffect": 11,
"dup": 0,
"dup": 999,
"existScenes": [-1],
"icon": 13596,
"id": 1185,
@@ -48382,5 +48382,37 @@
"time": 0,
"trade": 3,
"type": 131
},
"1395": {
"cdTime": 0,
"colGroup": 0,
"conds": [],
"dealPrice": 10,
"dealType": 0,
"denyDeal": 1,
"denyDestroy": 1,
"denySell": 1,
"desc": "打开后随机获得三阶魔器中的任意一件,获得随机奖励",
"dropBroadcast": 0,
"dropGroupid": 100882,
"dup": 9999,
"existScenes": [-1],
"icon": 13509,
"id": 1395,
"isShowUseBtn": 1,
"iseffect": 127,
"itemlvl": 3,
"name": "天赐机缘盒",
"packageType": 2,
"recordLog": 1,
"recoverid": 0,
"shape": 0,
"showQuality": 5,
"staitcAttrs": [],
"suggVocation": 0,
"suitId": 0,
"time": 0,
"trade": 3,
"type": 131
}
}

BIN
excels/StdItems.xlsx Normal file

Binary file not shown.

View File

@@ -6,7 +6,7 @@
* @wx 123456
* @qq 123456
-->
<?php
<?php
include 'config.php';
@@ -98,10 +98,14 @@ $stmt->store_result();
我已阅读并同意 <a href="javascript:void(0);" id="agree_btn">用户协议及隐私协议<a/>
</div>
<a href="javascript:process_login();" id="submitButton" class="button fit">登 录</a>
<div style="display:flex;justify-content:center" id="linuxdoConnect">
<div style="display:flex;align-items:center;flex-direction:column;gap:4px;cursor:pointer">
<div style="display:flex;justify-content:center;gap:8px;font-size:12px" >
<div style="display:flex;align-items:center;flex-direction:column;gap:4px;cursor:pointer" id="linuxdoConnect">
<img src="static/img/linuxdo_logo.png" style="width:60px;height:60px" alt="Linux.Do登录"/>
<div>Linux.do登录</div>
<div>Linux.do</div>
</div>
<div style="display:flex;align-items:center;flex-direction:column;gap:4px;cursor:pointer" id="naixiConnect">
<img src="https://forum.naixi.net/favicon.ico" style="width:60px;height:60px" alt="奶昔登录"/>
<div>奶昔登录</div>
</div>
</div>
<div class="forget_password">
@@ -127,8 +131,13 @@ $stmt->store_result();
switchBtn = $('#switchBtn');
const linuxdoConnect = $("#linuxdoConnect")
linuxdoConnect.click(()=>{
location.href="https://connect.linux.do/oauth2/authorize?response_type=code&client_id=tfKevot5lSwB5A5gcqPQMMhaXDLjib0P"
location.href="https://connect.linux.do/oauth2/authorize?response_type=code&client_id=fqAFU2cQVWtM3CiSLWZEzHb1nFw6evlY"
})
const naixiConnect = $("#naixiConnect")
naixiConnect.click(()=>{
location.href="https://auth.naixi.net/login/oauth/authorize?client_id=6c597d1551b868dce9fe&redirect_uri=http://cq.eb.cx/naixi_callback&response_type=code&scope=profile&state=STATE"
})
var isPhone = isMobile(),
agent_id = getQueryString('agent_id'),
codeOpen = <?=$_CONFIG['code_open']?>,

183
naixi_callback.php Normal file
View File

@@ -0,0 +1,183 @@
<?php
// 奶昔论坛三方登录
$_LINUXDO_CONNECT = [
'base'=>'https://auth.naixi.net',
'client_id' => '6c597d1551b868dce9fe',
'client_secret' => '065b759106ce704cb49082b9ebc790266f4e7105'
];
// cURL 函数
function get_curl($url, $post = 0, $referer = 0, $cookie = 0, $header = 0, $ua = 0, $nobaody = 0, $addheader = 0)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
$httpheader[] = "Accept: */*";
$httpheader[] = "Accept-Encoding: gzip,deflate,sdch";
$httpheader[] = "Accept-Language: zh-CN,zh;q=0.8";
$httpheader[] = "Connection: close";
if ($header) {
$httpheader = array_merge($httpheader, $header);
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader);
if ($post) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
}
if ($header) {
curl_setopt($ch, CURLOPT_HEADER, false);
}
if ($cookie) {
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
}
if ($referer) {
if ($referer == 1) {
curl_setopt($ch, CURLOPT_REFERER, '');
} else {
curl_setopt($ch, CURLOPT_REFERER, $referer);
}
}
if ($ua) {
curl_setopt($ch, CURLOPT_USERAGENT, $ua);
} else {
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36");
}
if ($nobaody) {
curl_setopt($ch, CURLOPT_NOBODY, 1);
}
curl_setopt($ch, CURLOPT_ENCODING, "gzip");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$ret = curl_exec($ch);
curl_close($ch);
return $ret;
}
$code = $_GET['code'];
$header = [];
$post = http_build_query([
'grant_type' => 'authorization_code',
'code' => $code,
"client_id"=> $_LINUXDO_CONNECT["client_id"],
"client_secret"=> $_LINUXDO_CONNECT["client_secret"],
]);
$getTokenRes = get_curl($_LINUXDO_CONNECT["base"].'/api/login/oauth/access_token', $post, 0, 0, $header);
$getTokenArr = json_decode($getTokenRes, true);
if (isset($getTokenArr['access_token'])) {
$access_token = $getTokenArr['access_token'];
$header = [
'Authorization: Bearer ' . $access_token
];
$getUserRes = get_curl($_LINUXDO_CONNECT["base"].'/api/userinfo', 0, 0, 0, $header);
$getUserArr = json_decode($getUserRes, true);
} else {
$err = json_encode($getTokenArr);
}
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport"
content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta name="applicable-device" content="mobile">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="full-screen" content="yes" />
<meta name="x5-fullscreen" content="true" />
<meta name="360-fullscreen" content="true" />
<meta name="screen-orientation" content="portrait">
<meta name="x5-orientation" content="portrait">
<meta name="x5-page-mode" content="app">
<title><?= $_CONFIG['game_name'] ?> <?= $_CONFIG['game_description'] ?></title>
<meta name="description" content="<?= $_CONFIG['game_name'] ?> <?= $_CONFIG['game_description'] ?>">
<meta name="keywords" content="<?= $_CONFIG['game_name'] ?>,<?= $_CONFIG['game_description'] ?>">
<link rel="stylesheet" href="static/css/login.css?v=1.1.6" />
<script>
const initPasswd = "H0CE3sheqe8sp"
function request(url, params) {
return fetch(url, params).then(res => res.json())
}
function handleBind(account, linuxdo_account) {
return request("/api?act=bind&account=" + account + "&connect_id=" + linuxdo_account+"&type=naixi").then(res => {
if (res.password) {
alert("绑定成功,请点击确定开始游戏!")
location.href = "/play?account=" + account + "&token=" + res.password;
}
})
}
function processLogin(params = {}, connect_id) {
const formData = new FormData();
formData.append("serverId", "1");
Object.entries(params).forEach(([key, value]) => formData.append(key, value));
request("/api?act=reg", { method: "POST", body: formData }).then(res => {
if (res.code == '0') {
handleBind(params.account, connect_id)
} else {
console.error(res)
document.body.innerHTML = "授权失败"
return
}
}).catch(err=>console.error(err))
}
function registerDirect() {
const linuxdo_account = document.getElementById("linuxdo").value;
processLogin({ type: "1", account: linuxdo_account, password: initPasswd, password2: initPasswd }, linuxdo_account)
}
function linkAccount() {
const account = document.getElementById("account").value;
const password = document.getElementById("password").value;
const linuxdo_account = document.getElementById("linuxdo").value;
processLogin({ type: "0", account, password, }, linuxdo_account)
}
</script>
</head>
<body>
<input type="hidden" id="linuxdo" value="<?= $getUserArr['email'] ?>">
<?php if (!empty($getUserArr['email'])) { ?>
<script>
const connectId = document.getElementById('linuxdo').value
request("/api?act=link&connect_id=" + connectId, { method: "POST" }).then(res => {
if (res.code == '0') {
location.href = "/play?account=" + res.data.username + "&token=" + res.data.password;
} else {
document.getElementById("bindBox").style.display = "block"
const linkAccountBtn = document.getElementById("linkAccount");
linkAccountBtn.addEventListener("click", linkAccount)
const registerDirectBtn = document.getElementById("registerDirect");
registerDirectBtn.addEventListener("click", registerDirect)
}
})
</script>
<div id="bindBox"
style="width:400px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);display:flex;justify-content:center;align-items:center;flex-direction:column;display:none;">
<!-- <div>当前尚未有你的游戏账号,请选择</div><br> -->
<button id="registerDirect" onclick="registerDirect" style="cursor:pointer;font-weight:bold">奶昔论坛账号登录</a><br>
<!-- <div>如果已有账号,请输入账号和密码</div><br>
<input type="text" id="account" placeholder="请输入账号" onKeyUp="value = value.replace(/[\W]/g, '')"
autocomplete="off" disableautocomplete><br>
<input type="password" id="password" placeholder="请输入密码"><br>
<button id="linkAccount">绑定并登录</button> -->
</div>
<?php } ?>
<?php if (!empty($err)) { ?>
授权发生异常:<?= $err ?>
<?php } ?>
</body>
</html>

View File

@@ -5,8 +5,8 @@ const { json } = require("stream/consumers");
const { log } = require("console");
const folderPath = "./configs";
const scope = [
"SpecialRingConfig",
// "StdItems",
// "SpecialRingConfig",
"StdItems",
// "Monster",
// "ItemMergeConfig",
// "MergeConfig",

View File

@@ -12,7 +12,6 @@ const scope = [
"ActivitiesConf",
"UpstarPriceConfig",
"UpstarConfig",
"MonthCardConfig",
// "GuildDonateConfig",
"ShopConfig",
// "NpcTransConf"