修正了大量谬误,增加了《我的世界》相关服务功能等

This commit is contained in:
TermiNexus committed 2026-07-30 00:02:19 +08:00
1 parent 17e3a11a73
commit fd591a0c94
10451 files changed
+140600 -2938

No files matched your search

+70 -1
View File
@@ -34,7 +34,8 @@ SQL_IP = _secret_get('database', 'host', fallback='127.0.0.1')
WHITE_HOSTS = [
"www.gvsds.com", "gvsds.com", "api.gvsds.com", "127.0.0.1", "localhost", SQL_IP,
"gvsds.dev", "yc8z.org", "ycbz.org", "gvsds.org", "gvsds.studio", "114.66.59.25"
"gvsds.dev", "yc8z.org", "ycbz.org", "gvsds.org", "gvsds.studio", "114.66.59.25",
"librok.gvsds.com"
]
BAN_IPS = [
"www.kanglaohui.com", "www.best-loving.cn", "11.4.5.14", "185.223.152.189"
@@ -43,6 +44,11 @@ BAN_IPS = [
PIRACY_DIR = Path("TempLate") / "Errors" / "Piracy"
PIRACY_LIST = os.listdir(PIRACY_DIR) if PIRACY_DIR.exists() else []
# 静态站点:host -> 站点根目录
STATIC_SITES = {
"librok.gvsds.com": Path("TempLate") / "rok" / "lib",
}
LOG_CONFIG = {
'disable_static_success': False,
'disable_favicon': False,
@@ -381,8 +387,71 @@ class SecurityMiddleware:
start_response('403 Forbidden', [('Content-Type', 'text/plain')])
return [b'Server does not support this type of page.']
# 静态站点路由:将指定 host 的请求直接映射到本地目录
if host in STATIC_SITES:
return self._serve_static_site(environ, start_response, host, path)
return self.app(environ, start_response)
def _serve_static_site(self, environ, start_response, host, path):
"""为静态站点(host -> 目录)提供文件服务
- 默认入口:目录请求 / 返回 index.html
- 仅允许访问站点根目录内的文件(防止 ../ 越权)
"""
import mimetypes
mimetypes.add_type('application/javascript', '.js')
mimetypes.add_type('text/css', '.css')
mimetypes.add_type('image/svg+xml', '.svg')
site_root = STATIC_SITES[host].resolve()
# 清理路径:去掉前导 /,URL 反解码,过滤 ..
rel_path = path.lstrip('/')
if not rel_path:
rel_path = 'index.html'
try:
from urllib.parse import unquote
rel_path = unquote(rel_path)
except Exception:
pass
# 防止目录越权
if '..' in rel_path.split('/'):
start_response('403 Forbidden', [('Content-Type', 'text/plain')])
return [b'Forbidden']
target = (site_root / rel_path).resolve()
try:
target.relative_to(site_root)
except ValueError:
start_response('403 Forbidden', [('Content-Type', 'text/plain')])
return [b'Forbidden']
# 目录则尝试 index.html
if target.is_dir():
target = target / 'index.html'
if not target.is_file():
start_response('404 Not Found', [('Content-Type', 'text/html')])
try:
content = open(Path("TempLate") / "Errors" / "404.html", encoding="utf-8").read().encode('utf-8')
except Exception:
content = b'404 Not Found'
return [content]
try:
data = target.read_bytes()
except Exception as e:
start_response('500 Internal Server Error', [('Content-Type', 'text/plain')])
return [f'Read error: {e}'.encode('utf-8')]
ctype, _ = mimetypes.guess_type(str(target))
if not ctype:
ctype = 'application/octet-stream'
start_response('200 OK', [
('Content-Type', ctype),
('Content-Length', str(len(data))),
('Cache-Control', 'no-cache'),
])
return [data]
def SetupLogging():
global logger
+204 -115
View File
@@ -1,115 +1,204 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>银河锋锐 - GC 分享钱包</title>
<style>
body {
font-family: 'Arial', sans-serif;
margin: 0;
padding: 0;
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
transition: background-color 0.5s, color 0.5s;
padding: 20px; /* 避免内容贴边 */
box-sizing: border-box;
}
.wallet-container {
text-align: center;
width: 100%;
max-width: 500px;
padding: 30px 20px; /* 减少垂直内边距,增加水平适配 */
border-radius: 15px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
}
.logo {
width: 100px; /* 缩小logo适应手机屏幕 */
height: 100px;
margin: 0 auto 20px; /* 居中显示 */
display: block;
}
h1 {
margin: 0 0 10px;
font-size: 22px; /* 稍小字体更适合手机 */
}
.balance {
font-size: 42px; /* 调整字号避免溢出 */
font-weight: bold;
margin: 15px 0;
font-family: 'Courier New', monospace;
line-height: 1.2; /* 优化行高 */
}
.currency {
font-size: 18px;
margin-left: 5px;
}
.address {
font-family: 'Courier New', monospace;
color: #666;
word-break: break-all;
margin: 15px 0;
font-size: 13px;
padding: 0 10px; /* 增加内边距避免内容贴边 */
}
/* 主题样式保持不变 */
.default-theme {
background-color: white;
color: #333;
}
.green-theme {
background-color: #e8f5e9;
color: #2e7d32;
}
.blue-theme {
background-color: #e3f2fd;
color: #1565c0;
}
.gold-theme {
background-color: #212121;
color: #ffd700;
}
.corporate-theme {
background-color: #1976d2;
color: white;
}
</style>
</head>
<body class="default-theme">
<div class="wallet-container">
<h1>银河锋锐 GC 钱包</h1>
<p>您的游戏货币余额</p>
<div class="balance">
<span id="gc-amount">数据加载中...</span>
<span class="currency">GC</span>
</div>
</div>
<script>
let gcAmount = 0;
const urlParams = new URLSearchParams(window.location.search);
const demoGC = urlParams.get('gc');
if (demoGC) {
gcAmount = parseInt(demoGC);
}
document.getElementById('gc-amount').textContent = gcAmount.toLocaleString();
function setThemeByGC(amount) {
const body = document.body;
body.className = 'default-theme';
if (amount === 0) {
body.classList.add('default-theme');
} else if (amount > 0 && amount <= 9999) {
body.classList.add('green-theme');
} else if (amount > 9999 && amount <= 999999) {
body.classList.add('blue-theme');
} else if (amount > 999999 && amount <= 9999999) {
body.classList.add('gold-theme');
} else if (amount > 9999999) {
body.classList.add('corporate-theme');
}
}
setThemeByGC(gcAmount);
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>枢机信用储备银行 - 分享钱包</title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
margin: 0;
padding: 0;
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
transition: background-color 0.5s, color 0.5s;
padding: 20px;
box-sizing: border-box;
}
.wallet-container {
text-align: center;
width: 100%;
max-width: 500px;
padding: 30px 24px;
border-radius: 15px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
}
h1 {
margin: 0 0 8px;
font-size: 22px;
font-weight: 600;
}
.subtitle {
font-size: 13px;
opacity: 0.7;
margin-bottom: 20px;
}
.balance-card {
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px 16px;
border-radius: 10px;
background-color: rgba(255, 255, 255, 0.08);
margin-bottom: 8px;
}
.balance-info {
display: flex;
flex-direction: column;
gap: 2px;
text-align: left;
}
.balance-type {
font-size: 15px;
font-weight: 600;
}
.balance-symbol {
font-size: 12px;
opacity: 0.6;
}
.balance-amount {
font-size: 20px;
font-weight: bold;
font-family: 'Courier New', monospace;
letter-spacing: 1px;
}
.expire-info {
margin-top: 18px;
font-size: 12px;
opacity: 0.6;
}
.error-box {
padding: 16px;
border-radius: 8px;
background-color: rgba(239, 68, 68, 0.1);
color: #dc2626;
font-size: 14px;
margin: 20px 0;
}
.empty-text {
opacity: 0.6;
padding: 20px;
font-size: 14px;
}
/* 主题样式 */
.default-theme { background-color: #f5f5f5; color: #333; }
.default-theme .wallet-container { background-color: white; }
.green-theme { background-color: #e8f5e9; color: #2e7d32; }
.green-theme .wallet-container { background-color: #ffffff; }
.blue-theme { background-color: #e3f2fd; color: #1565c0; }
.blue-theme .wallet-container { background-color: #ffffff; }
.gold-theme { background-color: #212121; color: #ffd700; }
.gold-theme .wallet-container { background-color: #333333; }
.corporate-theme { background-color: #0d47a1; color: white; }
.corporate-theme .wallet-container { background-color: #1565c0; }
</style>
</head>
<body class="default-theme">
<div class="wallet-container">
<h1>枢机信用储备银行</h1>
<div class="subtitle">分享钱包余额</div>
<div id="balances-list">
<div class="empty-text">数据加载中...</div>
</div>
<div id="expire-info" class="expire-info" style="display:none;"></div>
</div>
<script>
// 格式化数字显示(保留三位小数,添加千分位)
function FormatAmount(n) {
if (n === null || n === undefined || isNaN(n)) return '0.000';
return Number(n).toLocaleString(undefined, {
minimumFractionDigits: 3,
maximumFractionDigits: 3
});
}
// 根据 GC 数量设置主题
function SetThemeByGC(amount) {
const body = document.body;
body.className = '';
if (amount === 0) {
body.classList.add('default-theme');
} else if (amount > 0 && amount <= 9999) {
body.classList.add('green-theme');
} else if (amount > 9999 && amount <= 999999) {
body.classList.add('blue-theme');
} else if (amount > 999999 && amount <= 9999999) {
body.classList.add('gold-theme');
} else if (amount > 9999999) {
body.classList.add('corporate-theme');
} else {
body.classList.add('default-theme');
}
}
// 解析 token 参数
const urlParams = new URLSearchParams(window.location.search);
const token = urlParams.get('token');
const listEl = document.getElementById('balances-list');
const expireEl = document.getElementById('expire-info');
if (!token) {
listEl.innerHTML = '<div class="error-box">缺少分享码参数,请通过有效的二维码链接访问。</div>';
} else {
fetch(`/API/Wallet/SharedBalance?token=${encodeURIComponent(token)}`)
.then(r => r.json())
.then(data => {
if (data.status !== 0) {
listEl.innerHTML = `<div class="error-box">${data.msg || '查询失败'}</div>`;
return;
}
const balances = data.Balances || [];
if (!balances.length) {
listEl.innerHTML = '<div class="empty-text">暂无资产</div>';
} else {
listEl.innerHTML = balances.map(b => `
<div class="balance-card">
<div class="balance-info">
<div class="balance-type">${b.Type}</div>
<div class="balance-symbol">${b.Symbol || ''}</div>
</div>
<div class="balance-amount">${FormatAmount(b.Balance)}</div>
</div>
`).join('');
}
// 显示剩余有效期
const ttl = data.ExpiresIn || 0;
if (ttl > 0) {
const h = Math.floor(ttl / 3600);
const m = Math.floor((ttl % 3600) / 60);
const s = ttl % 60;
expireEl.textContent = `分享码剩余有效:${h}时${m}分${s}秒`;
expireEl.style.display = 'block';
// 倒计时
let remain = ttl;
const timer = setInterval(() => {
remain = Math.max(0, remain - 1);
if (remain <= 0) {
clearInterval(timer);
expireEl.textContent = '分享码已过期';
listEl.innerHTML = '<div class="error-box">分享码已过期,请向钱包主人索取新的二维码。</div>';
return;
}
const hh = Math.floor(remain / 3600);
const mm = Math.floor((remain % 3600) / 60);
const ss = remain % 60;
expireEl.textContent = `分享码剩余有效:${hh}时${mm}分${ss}秒`;
}, 1000);
}
// 根据主币种(GC)设置主题
const gc = balances.find(x => x.Type === 'GC');
SetThemeByGC(gc ? gc.Balance : 0);
})
.catch(err => {
console.error('查询失败:', err);
listEl.innerHTML = '<div class="error-box">网络错误,查询失败</div>';
});
}
</script>
</body>
</html>
+1 -1
View File
@@ -457,7 +457,7 @@
<span class="bg-netherite/10 text-netherite dark:bg-netherite/20 px-3 py-1 rounded-full text-sm font-medium">至尊级</span>
</div>
<div class="mb-6">
<span class="text-3xl font-bold text-primary dark:text-secondary">10</span>%</span>
<span class="text-3xl font-bold text-primary dark:text-secondary">10%</span>
<span class="text-gray-500 dark:text-gray-500">/ 游戏年</span>
</div>
<ul class="space-y-3 mb-6">
+103 -52
View File
@@ -1,68 +1,119 @@
<div class="min-h-screen flex flex-col">
<main class="flex-grow py-12 md:py-20 px-4 md:px-8 lg:px-16">
<div class="max-w-7xl mx-auto">
<!-- 头部介绍 -->
<div class="text-center mb-16">
<h5 class="text-accent uppercase tracking-wider text-sm md:text-base mb-3">Get In Touch</h5>
<h1 class="text-[clamp(2rem,5vw,3.5rem)] font-bold text-dark leading-tight text-balance">联系我们</h1>
<div class="w-20 h-1 bg-primary mx-auto mt-6"></div>
<p class="mt-6 text-accent max-w-2xl mx-auto text-balance">无论您有任何问题、建议或合作意向,我们的团队都将竭诚为您提供专业、高效的解决方案</p>
</div>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12">
<div class="space-y-8">
<div class="bg-white rounded-xl p-8 shadow-elevated hover:shadow-hover transition-all-300">
<div class="w-14 h-14 bg-primary/10 rounded-full flex items-center justify-center mb-6"><i class="fa fa-map-marker text-primary text-2xl"></i></div>
<h3 class="text-xl font-semibold mb-3">公司地址</h3>
<p class="text-accent">无物理地址</p>
</div>
<div class="bg-white rounded-xl p-8 shadow-elevated hover:shadow-hover transition-all-300">
<div class="w-14 h-14 bg-primary/10 rounded-full flex items-center justify-center mb-6"><i class="fa fa-phone text-primary text-2xl"></i></div>
<h3 class="text-xl font-semibold mb-3">联系电话</h3>
<p class="text-accent mb-2">182-2215-2539</p>
<p class="text-accent text-sm">周末 9:00 - 22:00</p>
</div>
<div class="bg-white rounded-xl p-8 shadow-elevated hover:shadow-hover transition-all-300">
<div class="w-14 h-14 bg-primary/10 rounded-full flex items-center justify-center mb-6"><i class="fa fa-envelope text-primary text-2xl"></i></div>
<h3 class="text-xl font-semibold mb-3">电子邮箱</h3>
<p class="text-accent">support@gvsds.com</p>
<p class="text-accent text-sm mt-2">48 小时内回复</p>
<!-- 联系方式卡片 -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-12">
<div class="bg-white rounded-xl p-8 shadow-elevated hover:shadow-hover transition-all-300">
<div class="w-14 h-14 bg-primary/10 rounded-full flex items-center justify-center mb-6">
<i class="fa fa-map-marker text-primary text-2xl"></i>
</div>
<h3 class="text-xl font-semibold mb-3">公司地址</h3>
<p class="text-accent">无物理地址</p>
</div>
<div class="bg-white rounded-xl p-8 md:p-10 shadow-elevated">
<h3 class="text-2xl font-semibold mb-8">发送消息</h3>
<form class="space-y-6">
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<label for="name" class="block text-sm font-medium text-accent mb-2">姓名</label>
<input type="text" id="name" class="w-full px-4 py-3 rounded-lg border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary/20 outline-none transition-all-300" placeholder="请输入您的姓名">
</div>
<div>
<label for="phone" class="block text-sm font-medium text-accent mb-2">电话</label>
<input type="tel" id="phone" class="w-full px-4 py-3 rounded-lg border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary/20 outline-none transition-all-300" placeholder="请输入您的联系电话">
</div>
</div>
<div>
<label for="email" class="block text-sm font-medium text-accent mb-2">电子邮箱</label>
<input type="email" id="email" class="w-full px-4 py-3 rounded-lg border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary/20 outline-none transition-all-300" placeholder="请输入您的电子邮箱">
</div>
<div>
<label for="subject" class="block text-sm font-medium text-accent mb-2">主题</label>
<select id="subject" class="w-full px-4 py-3 rounded-lg border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary/20 outline-none transition-all-300 bg-white">
<option value="" disabled selected>请选择咨询主题</option>
<option value="project">项目咨询</option>
<option value="service">服务资讯</option>
<option value="cooperation">相关合作</option>
<option value="invite">加入申请</option>
<option value="other">其他问题</option>
</select>
</div>
<div>
<label for="message" class="block text-sm font-medium text-accent mb-2">留言内容</label>
<textarea id="message" rows="5" class="w-full px-4 py-3 rounded-lg border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary/20 outline-none transition-all-300 resize-none"placeholder="请描述您的问题或建议..."></textarea>
</div>
<button type="submit" class="w-full bg-primary hover:bg-primary/90 text-white font-medium py-3 px-6 rounded-lg transition-all-300 flex items-center justify-center gap-2"><span>提交留言</span><i class="fa fa-paper-plane"></i></button>
</form>
<div class="bg-white rounded-xl p-8 shadow-elevated hover:shadow-hover transition-all-300">
<div class="w-14 h-14 bg-primary/10 rounded-full flex items-center justify-center mb-6">
<i class="fa fa-phone text-primary text-2xl"></i>
</div>
<h3 class="text-xl font-semibold mb-3">联系电话</h3>
<p class="text-accent mb-2">182-2215-2539</p>
<p class="text-accent text-sm">周末 9:00 - 22:00</p>
</div>
<div class="bg-white rounded-xl p-8 shadow-elevated hover:shadow-hover transition-all-300">
<div class="w-14 h-14 bg-primary/10 rounded-full flex items-center justify-center mb-6">
<i class="fa fa-envelope text-primary text-2xl"></i>
</div>
<h3 class="text-xl font-semibold mb-3">电子邮箱</h3>
<p class="text-accent">support@gvsds.com</p>
<p class="text-accent text-sm mt-2">48 小时内回复</p>
</div>
</div>
<!-- 扫码咨询区域 -->
<section class="bg-white p-8 md:p-12 rounded-xl shadow-elevated mb-20">
<h2 class="text-2xl md:text-[1.8rem] font-semibold mb-3 pb-4 border-b border-gray-200 inline-block">咨询报价</h2>
<p class="text-accent max-w-[800px] mb-4 leading-[1.8]">
有定制开发需求?我们随时为您服务。无论您需要定制开发、开源项目二次开发,还是长期的运营维护,我们都能提供高性价比的解决方案。
</p>
<p class="text-accent max-w-[800px] mb-12 leading-[1.8]">
注意:添加企业微信或微信,请备注"咨询报价"明确来意。
</p>
<div class="flex justify-center gap-8 md:gap-16 flex-wrap">
<!-- 企业微信 -->
<div class="w-[260px] p-8 bg-gray-50 rounded-xl text-center transition-all duration-300 ease-[cubic-bezier(0.25,0.8,0.25,1)] hover:-translate-y-1.5 hover:shadow-[0_10px_15px_-3px_rgba(0,0,0,0.08),0_4px_6px_-2px_rgba(0,0,0,0.04)] hover:bg-white">
<h3 class="text-base font-medium mb-6 tracking-[0.3px]">企业微信</h3>
<div class="w-[180px] h-[180px] mx-auto mb-6 border border-gray-200 p-3 bg-white rounded-lg flex items-center justify-center">
<img src="/Project/Service/ContactInfo/wecom.jpg" alt="企业微信二维码" class="w-full h-full object-contain">
</div>
<p class="text-sm text-accent leading-[1.6]">扫码添加企业微信,一对一沟通报价</p>
</div>
<!-- 微信 -->
<div class="w-[260px] p-8 bg-gray-50 rounded-xl text-center transition-all duration-300 ease-[cubic-bezier(0.25,0.8,0.25,1)] hover:-translate-y-1.5 hover:shadow-[0_10px_15px_-3px_rgba(0,0,0,0.08),0_4px_6px_-2px_rgba(0,0,0,0.04)] hover:bg-white">
<h3 class="text-base font-medium mb-6 tracking-[0.3px]">微信</h3>
<div class="w-[180px] h-[180px] mx-auto mb-6 border border-gray-200 p-3 bg-white rounded-lg flex items-center justify-center">
<img src="/Project/Service/ContactInfo/wx.jpg" alt="微信二维码" class="w-full h-full object-contain">
</div>
<p class="text-sm text-accent leading-[1.6]">微信:GVSADS,备注咨询报价</p>
</div>
<!-- QQ -->
<div class="w-[260px] p-8 bg-gray-50 rounded-xl text-center transition-all duration-300 ease-[cubic-bezier(0.25,0.8,0.25,1)] hover:-translate-y-1.5 hover:shadow-[0_10px_15px_-3px_rgba(0,0,0,0.08),0_4px_6px_-2px_rgba(0,0,0,0.04)] hover:bg-white">
<h3 class="text-base font-medium mb-6 tracking-[0.3px]">QQ</h3>
<div class="w-[180px] h-[180px] mx-auto mb-6 border border-gray-200 p-3 bg-white rounded-lg flex items-center justify-center">
<img src="/Project/Service/ContactInfo/qq.png" alt="QQ二维码" class="w-full h-full object-contain">
</div>
<p class="text-sm text-accent leading-[1.6]">扫码添加QQ,获取详细报价方案</p>
</div>
</div>
</section>
<!-- 服务流程 -->
<section class="mb-12">
<h2 class="text-2xl md:text-[1.8rem] font-semibold text-center mb-16">标准化交付流程</h2>
<div class="flex justify-between relative px-4 md:px-8 flex-wrap">
<!-- 流程连接线 -->
<div class="absolute top-5 left-[8%] right-[8%] h-0.5 bg-gray-200 hidden md:block"></div>
<div class="flex-1 min-w-[150px] text-center relative px-3 mb-8">
<div class="w-10 h-10 bg-slate-800 text-white rounded-full flex items-center justify-center mx-auto mb-6 text-sm">1</div>
<h4 class="text-[0.95rem] font-medium mb-3">需求沟通与评估</h4>
<p class="text-sm text-accent leading-[1.7]">深入沟通企业需求,评估技术方案与开发成本,提供详细报价与排期。</p>
</div>
<div class="flex-1 min-w-[150px] text-center relative px-3 mb-8">
<div class="w-10 h-10 bg-slate-800 text-white rounded-full flex items-center justify-center mx-auto mb-6 text-sm">2</div>
<h4 class="text-[0.95rem] font-medium mb-3">方案设计与确认</h4>
<p class="text-sm text-accent leading-[1.7]">输出技术方案、原型设计、功能清单,确认后签订合同启动开发。</p>
</div>
<div class="flex-1 min-w-[150px] text-center relative px-3 mb-8">
<div class="w-10 h-10 bg-slate-800 text-white rounded-full flex items-center justify-center mx-auto mb-6 text-sm">3</div>
<h4 class="text-[0.95rem] font-medium mb-3">开发与阶段性交付</h4>
<p class="text-sm text-accent leading-[1.7]">分阶段开发与交付,定期同步进度,支持中途需求微调。</p>
</div>
<div class="flex-1 min-w-[150px] text-center relative px-3 mb-8">
<div class="w-10 h-10 bg-slate-800 text-white rounded-full flex items-center justify-center mx-auto mb-6 text-sm">4</div>
<h4 class="text-[0.95rem] font-medium mb-3">测试与上线部署</h4>
<p class="text-sm text-accent leading-[1.7]">全面功能测试、性能测试,完成后部署上线,提供操作培训。</p>
</div>
<div class="flex-1 min-w-[150px] text-center relative px-3 mb-8">
<div class="w-10 h-10 bg-slate-800 text-white rounded-full flex items-center justify-center mx-auto mb-6 text-sm">5</div>
<h4 class="text-[0.95rem] font-medium mb-3">售后维护与迭代</h4>
<p class="text-sm text-accent leading-[1.7]">提供 7×24h 售后支持,定期系统维护,按需进行功能迭代。</p>
</div>
</div>
</section>
</div>
</main>
</div>
Binary file not shown.
+7 -2
View File
@@ -1142,7 +1142,7 @@ body.GERPSidebarOpen .GERPSidebar {
align-items: center;
gap: 12px;
padding: 16px 20px;
background-color: rgba(37, 99, 235, 0.05);
background-color: var(--PrimaryAlpha10);
}
.GERPUserDropdownHeader > div:last-child {
@@ -1194,13 +1194,18 @@ body.GERPSidebarOpen .GERPSidebar {
}
.GERPUserDropdownItem:hover {
background-color: var(--BackgroundColor);
background-color: var(--HoverBackground);
}
.GERPUserDropdownItem.Danger {
color: var(--DangerColor);
}
/* Danger 项的图标也使用红色(覆盖通用 i 规则的 TextSecondary) */
.GERPUserDropdownItem.Danger i {
color: var(--DangerColor);
}
.GERPUserDropdownItem i {
width: 20px;
text-align: center;
+21 -1
View File
@@ -47,6 +47,14 @@ window.GERPThemeSync = {
if (themeColors) {
try {
const colors = JSON.parse(themeColors);
// 向后兼容:旧主题数据可能缺少 HoverBackground,根据 BackgroundColor 亮度推断并回填
// 深色背景用白色 8% 透明(hover 变浅),浅色背景用黑色 4% 透明
if (!colors.HoverBackground && colors.BackgroundColor) {
colors.HoverBackground = this.IsColorDark(colors.BackgroundColor)
? 'rgba(255, 255, 255, 0.08)'
: 'rgba(0, 0, 0, 0.04)';
localStorage.setItem('gerp-theme-colors', JSON.stringify(colors));
}
Object.entries(colors).forEach(([key, value]) => {
root.style.setProperty(`--${key}`, value);
});
@@ -54,5 +62,17 @@ window.GERPThemeSync = {
console.warn('无法解析主题颜色:', e);
}
}
},
// 辅助:判断颜色亮度(YIQ 公式),<128 视为深色
IsColorDark(Hex) {
if (!Hex || typeof Hex !== 'string') return false;
const M = Hex.replace('#', '').trim();
if (M.length !== 6) return false;
const R = parseInt(M.substr(0, 2), 16);
const G = parseInt(M.substr(2, 2), 16);
const B = parseInt(M.substr(4, 2), 16);
if (isNaN(R) || isNaN(G) || isNaN(B)) return false;
return (R * 299 + G * 587 + B * 114) / 1000 < 128;
}
};
};
+22 -7
View File
@@ -1486,14 +1486,13 @@ class GERPUI {
data-id="${tab.Id}"
draggable="true"
title="${tab.Title}">
<i class="fas ${tab.Icon}"></i>
${this.WrapIcon(tab.Icon)}
<span class="GERPTabText">${tab.Title}</span>
<span class="GERPTabClose" data-tab="${tab.Id}">
<i class="fas fa-times"></i>
</span>
</div>
`).join('');
container.innerHTML = html;
}
this.BindPanelTabEvents(panel);
@@ -2089,7 +2088,7 @@ class GERPUI {
html += `
<li class="GERPMenuItem ${isActive ? 'Active' : ''} ${hasChildren ? 'HasChildren' : ''}" data-id="${item.Id}">
<div class="GERPMenuLink" style="padding-left: ${paddingLeft}px" data-page="${item.Page || ''}" draggable="true">
<span class="GERPMenuIcon">${item.Icon || '<i class="fas fa-file"></i>'}</span>
<span class="GERPMenuIcon">${this.WrapIcon(item.Icon || 'fa-file')}</span>
<span class="GERPMenuText">${item.Title}</span>
${hasChildren ? `<span class="GERPMenuArrow ${isExpanded ? 'Expanded' : ''}"><i class="fas fa-chevron-right"></i></span>` : ''}
</div>
@@ -3006,10 +3005,26 @@ class GERPUI {
this.LoadPanelFrame('main', url);
}
ExtractIconClass(iconHtml) {
if (!iconHtml) return 'fa-file';
const match = iconHtml.match(/fa-[a-z-]+/);
return match ? match[0] : 'fa-file';
ExtractIconClass(iconStr) {
// 兼容两种输入:
// 1. 完整 HTML 片段(旧数据):<i class="fas fa-wallet"></i> → "fas fa-wallet"
// 2. 纯 class 字符串(新机制):fas fa-wallet 或 fa-wallet → 原样返回
if (!iconStr) return 'fa-file';
const str = String(iconStr).trim();
if (str.startsWith('<')) {
// 含 HTML 标签,提取 class 属性
const m = str.match(/class\s*=\s*["']([^"']+)["']/);
return m ? m[1].trim() : 'fa-file';
}
// 纯 class 直接返回
return str;
}
WrapIcon(iconStr) {
// 统一包裹 <i> 标签:输入 HTML 片段或纯 class,输出 <i class="..."></i>
// 已含 <i> 标签的旧数据原样返回(兼容)
const cls = this.ExtractIconClass(iconStr);
return `<i class="${cls}"></i>`;
}
// ==================== Toast 提示层组件 ====================
File diff suppressed because it is too large. Load diff
@@ -7,7 +7,7 @@
<h1 class="PageTitle">
<i class="fas fa-building icon-primary icon-left-lg"></i>
<span id="page-title">公司详情</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> 特权模式</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> <span id="admin-badge-text">特权模式</span></span>
</h1>
<button class="GERPBtn Primary" onclick="handleEdit()" style="margin-left:auto;"><i class="fas fa-edit"></i> 编辑</button>
</div>
@@ -46,16 +46,6 @@
return qs ? `${path}?${qs}` : path;
}
async function checkAdmin() {
try {
const resp = await fetch(buildApiUrl('/API/FormAPI/CheckAdmin'), { credentials: 'include' });
const result = await resp.json();
return result.code === 0 && result.data && result.data.is_admin;
} catch (e) {
return false;
}
}
async function init() {
const containerEl = document.getElementById('detailContainer');
@@ -65,9 +55,8 @@
}
// 先检查管理员特权,决定是否关闭公司隔离(仅当 URL 带 admin_verify=1 时启用)
_isAdminMode = CompanyUtils.hasAdminVerifyArg() ? await checkAdmin() : false;
const badge = document.getElementById('admin-badge');
if (badge) badge.style.display = _isAdminMode ? '' : 'none';
const _adminData = CompanyUtils.hasAdminVerifyArg() ? await GERP.CheckAdmin() : null;
_isAdminMode = GERP.ApplyAdminBadge(_adminData);
try {
const dataResp = await fetch(buildApiUrl('/API/FormAPI/Get/Company', { CompanyUUID: companyUUID, PageSize: '1' }), { credentials: 'include' });
+1 -1
View File
@@ -6,7 +6,7 @@
<h1 class="PageTitle">
<i class="fas fa-building icon-primary icon-left-lg"></i>
<span id="page-title">公司管理</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> 特权模式</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> <span id="admin-badge-text">特权模式</span></span>
</h1>
</div>
<div class="cp-container" id="TableContainer"></div>
+262
View File
@@ -0,0 +1,262 @@
<script src="/assets/gerp/CompanyCommon.js?v=20260627c"></script>
<style>
.PermPage { padding: 20px; height: 100%; display: flex; flex-direction: column; box-sizing: border-box; gap: 16px; }
.PermHeader { display: flex; align-items: center; gap: 12px; flex-shrink: 0; }
.PermHeader h1 { margin: 0; flex: 1; }
.PermToolbar { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; padding: 10px 12px; background: var(--CardBackground, #fff); border: 1px solid var(--BorderColor, #e2e8f0); border-radius: 8px; flex-shrink: 0; }
.PermToolbar label { font-size: 13px; color: var(--TextSecondary, #64748b); margin-right: 4px; font-weight: 600; }
.PermToolbar select { padding: 6px 10px; border: 1px solid var(--BorderColor, #e2e8f0); border-radius: 6px; font-size: 13px; min-width: 200px; background: var(--CardBackground, #fff); color: var(--TextPrimary, #1e293b); }
.PermToolbar .Stat { margin-left: auto; font-size: 13px; color: var(--TextSecondary, #64748b); }
.PermToolbar .Stat strong { color: var(--PrimaryColor, #2563eb); }
.PermSection { background: var(--CardBackground, #fff); border: 1px solid var(--BorderColor, #e2e8f0); border-radius: 8px; padding: 12px; display: flex; flex-direction: column; min-height: 0; }
.PermSection h3 { font-size: 14px; font-weight: 600; margin: 0 0 10px 0; padding-bottom: 8px; border-bottom: 1px solid var(--BorderColor, #e2e8f0); display: flex; align-items: center; gap: 8px; }
.PermSection h3 i { color: var(--PrimaryColor, #2563eb); }
.PermSection h3 .Hint { font-size: 12px; color: var(--TextSecondary, #64748b); font-weight: normal; margin-left: 8px; }
.PermSplit { flex: 1; min-height: 0; display: grid; grid-template-rows: 1fr 1fr; gap: 16px; overflow: hidden; }
.PermTableWrap { flex: 1; min-height: 0; overflow: hidden; }
#DeniedState { text-align: center; padding: 60px 20px; color: var(--TextSecondary, #64748b); }
#DeniedState i { font-size: 48px; margin-bottom: 12px; display: block; color: var(--DangerColor, #ef4444); }
#DeniedState .Title { font-size: 16px; font-weight: 600; color: var(--TextPrimary, #1e293b); margin-bottom: 6px; }
</style>
<div class="GERPPage">
<div class="PermPage">
<div class="PermHeader">
<h1 class="PageTitle">
<i class="fas fa-key icon-primary icon-left-lg"></i>
<span>权限管理</span>
</h1>
<span id="AdminBadge" style="display:none;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;">
<i class="fas fa-shield-alt"></i> <span id="AdminBadgeText">特权模式</span>
</span>
</div>
<div class="PermToolbar">
<label>角色:</label>
<select id="RoleFilter" onchange="OnFilterChange()"></select>
<label>公司:</label>
<select id="CompanyFilter" onchange="OnFilterChange()"></select>
<div class="Stat" id="PermStat">权限 <strong>0</strong> 项,角色权限关联 <strong>0</strong> 条</div>
</div>
<div class="PermSplit" id="MainSplit">
<!-- 全局权限定义表 -->
<div class="PermSection">
<h3>
<i class="fas fa-list-check"></i> 全局权限定义
<span class="Hint">权限码命名规范:模块:操作(如 User:create),分类用于分组显示</span>
</h3>
<div class="PermTableWrap" id="PermissionTableContainer" style="height:100%;"></div>
</div>
<!-- 角色权限多对多关联表 -->
<div class="PermSection">
<h3>
<i class="fas fa-link"></i> 角色权限关联
<span class="Hint">多对多表:选择角色+公司后筛选,添加时通过权限/角色实体搜索</span>
</h3>
<div class="PermTableWrap" id="RolePermTableContainer" style="height:100%;"></div>
</div>
</div>
<div id="DeniedState" style="display:none;">
<i class="fas fa-lock"></i>
<div class="Title">无权访问</div>
<div>该页面仅管理员可查看,请切换至管理员角色或联系管理员。</div>
</div>
</div>
</div>
<script>
const CurrentServer = CompanyUtils.getServer();
const UrlParams = new URLSearchParams(window.location.search);
const InitRoleUUID = UrlParams.get('RoleUUID') || '';
const InitCompanyUUID = UrlParams.get('CompanyUUID') || '';
let PermissionTable = null;
let RolePermTable = null;
let RoleList = [];
let CompanyList = [];
let IsAdminMode = false;
CompanyUtils.setPageTitle('权限管理');
/** 构造带 server / admin_verify 的 FormAPI URL */
function BuildApiUrl(Path, Params = {}) {
const All = {};
if (CurrentServer !== 'gvsds-master') All.server = CurrentServer;
if (IsAdminMode) All.admin_verify = '1';
Object.assign(All, Params);
const Qs = new URLSearchParams(All).toString();
return Qs ? `${Path}?${Qs}` : Path;
}
/** 入口校验:仅管理员可访问权限管理页 */
async function VerifyAccess() {
try {
const AdminData = await GERP.CheckAdmin();
const IsAdmin = GERP.ApplyAdminBadge(AdminData);
if (!IsAdmin) {
document.getElementById('MainSplit').style.display = 'none';
document.querySelector('.PermToolbar').style.display = 'none';
document.getElementById('DeniedState').style.display = 'block';
return false;
}
IsAdminMode = true;
const Badge = document.getElementById('AdminBadge');
Badge.style.display = 'inline-block';
return true;
} catch (_) {
return false;
}
}
/** 加载角色列表(用于筛选下拉) */
async function LoadRoles() {
try {
const Resp = await fetch(BuildApiUrl('/API/FormAPI/Get/Role', { PageSize: '500' }), { credentials: 'include' });
const Result = await Resp.json();
if (Result.code === 0) {
RoleList = Result.data || [];
}
} catch (_) { RoleList = []; }
}
/** 加载公司列表(用于筛选下拉) */
async function LoadCompanies() {
try {
const Resp = await fetch(BuildApiUrl('/API/FormAPI/CompanySearch', { keyword: '', limit: '500' }), { credentials: 'include' });
const Result = await Resp.json();
if (Result.code === 0) {
CompanyList = Result.data || [];
}
} catch (_) { CompanyList = []; }
}
/** 初始化筛选下拉 */
function InitFilters() {
const RoleSel = document.getElementById('RoleFilter');
const CompSel = document.getElementById('CompanyFilter');
RoleSel.innerHTML = '<option value="">全部角色</option>' + RoleList.map(r =>
`<option value="${r.RoleUUID}"${r.RoleUUID === InitRoleUUID ? ' selected' : ''}>${CompanyUtils.esc(r.RoleName || '')}</option>`
).join('');
CompSel.innerHTML = '<option value="">全部公司</option>' + CompanyList.map(c =>
`<option value="${c.CompanyUUID}"${c.CompanyUUID === InitCompanyUUID ? ' selected' : ''}>${CompanyUtils.esc(c.CompanyName || '')}</option>`
).join('');
}
/** 初始化 Permission 全局表(管理员可 CRUD) */
function InitPermissionTable() {
PermissionTable = new TableEngine({
container: '#PermissionTableContainer',
height: '100%',
tableName: 'Permission',
columns: [
{ field: 'PermUUID', title: '权限UUID', primaryKey: true, editable: false, hideInForm: true, width: 140 },
{ field: 'PermName', title: '权限名称', type: 'text', width: 180, required: true },
{ field: 'PermCode', title: '权限码', type: 'text', width: 200, required: true },
{ field: 'PermCategory', title: '分类', type: 'text', width: 120 },
{ field: 'PermStatus', title: '状态', type: 'select', width: 80, options: [{ value: 0, label: '禁用' }, { value: 1, label: '启用' }] },
{ field: 'PermDesc', title: '描述', type: 'text', width: 260 },
{ field: 'CreateTime', title: '创建时间', type: 'datetime', editable: false, width: 160 },
],
data: [],
pageSize: 20,
columnDistribution: 'equal',
showPagination: true,
showCheckbox: true,
editable: true,
sortable: true,
filterable: true,
striped: true,
hoverable: true,
bordered: true,
api: {
get: BuildApiUrl('/API/FormAPI/Get/Permission'),
add: BuildApiUrl('/API/FormAPI/Add/Permission'),
edit: BuildApiUrl('/API/FormAPI/Modify/Permission/<id>'),
modify: BuildApiUrl('/API/FormAPI/ModifyItem/Permission/<id>'),
delete: BuildApiUrl('/API/FormAPI/Delete/Permission/<id>'),
},
});
}
/** 初始化 RolePermission 多对多关联表(带实体搜索) */
function InitRolePermTable() {
RolePermTable = new TableEngine({
container: '#RolePermTableContainer',
height: '100%',
tableName: 'RolePermission',
columns: [
{ field: 'RolePermUUID', title: '关联UUID', primaryKey: true, editable: false, hideInForm: true, width: 140 },
CompanyUtils.epColumn('RoleUUID', '角色', 'Role', { width: 200, required: true }),
CompanyUtils.epColumn('PermUUID', '权限', 'Permission', { width: 220, required: true }),
CompanyUtils.epColumn('CompanyUUID', '公司', 'Company', { width: 200, required: true }),
{ field: 'CreateTime', title: '创建时间', type: 'datetime', editable: false, width: 160 },
],
data: [],
pageSize: 20,
columnDistribution: 'equal',
showPagination: true,
showCheckbox: true,
editable: true,
sortable: true,
filterable: true,
striped: true,
hoverable: true,
bordered: true,
api: {
get: BuildApiUrl('/API/FormAPI/Get/RolePermission'),
add: BuildApiUrl('/API/FormAPI/Add/RolePermission'),
edit: BuildApiUrl('/API/FormAPI/Modify/RolePermission/<id>'),
modify: BuildApiUrl('/API/FormAPI/ModifyItem/RolePermission/<id>'),
delete: BuildApiUrl('/API/FormAPI/Delete/RolePermission/<id>'),
},
});
}
/** 筛选变化时,按角色/公司重新加载 RolePermission */
function OnFilterChange() {
const RoleUUID = document.getElementById('RoleFilter').value;
const CompanyUUID = document.getElementById('CompanyFilter').value;
// TableEngine 通过 api.get 拉取数据,附加 query 参数需要重新设置 URL
// 这里通过重新构建 get URL 触发刷新
const Params = {};
if (RoleUUID) Params.RoleUUID = RoleUUID;
if (CompanyUUID) Params.CompanyUUID = CompanyUUID;
if (RolePermTable) {
RolePermTable.Config.api.get = BuildApiUrl('/API/FormAPI/Get/RolePermission', Params);
RolePermTable.Reload();
}
UpdateStat();
}
/** 更新统计信息 */
async function UpdateStat() {
try {
const [PermResp, RolePermResp] = await Promise.all([
fetch(BuildApiUrl('/API/FormAPI/Get/Permission', { PageSize: '1' }), { credentials: 'include' }).then(r => r.json()),
fetch(BuildApiUrl('/API/FormAPI/Get/RolePermission', { PageSize: '1' }), { credentials: 'include' }).then(r => r.json()),
]);
const PermCount = PermResp.code === 0 ? (PermResp.total || (PermResp.data || []).length || 0) : 0;
const RolePermCount = RolePermResp.code === 0 ? (RolePermResp.total || (RolePermResp.data || []).length || 0) : 0;
document.getElementById('PermStat').innerHTML = `权限 <strong>${PermCount}</strong> 项,角色权限关联 <strong>${RolePermCount}</strong> 条`;
} catch (_) { /* 静默 */ }
}
/** 入口 */
async function Init() {
const Ok = await VerifyAccess();
if (!Ok) return;
await Promise.all([LoadRoles(), LoadCompanies()]);
InitFilters();
InitPermissionTable();
InitRolePermTable();
OnFilterChange();
}
Init();
</script>
+3 -14
View File
@@ -7,7 +7,7 @@
<h1 class="PageTitle">
<i class="fas fa-shield-alt icon-primary icon-left-lg"></i>
<span id="page-title">角色详情</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> 特权模式</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> <span id="admin-badge-text">特权模式</span></span>
</h1>
<button class="GERPBtn Primary" onclick="handleEdit()" style="margin-left:auto;"><i class="fas fa-edit"></i> 编辑</button>
</div>
@@ -47,16 +47,6 @@
return qs ? `${path}?${qs}` : path;
}
async function checkAdmin() {
try {
const resp = await fetch(buildApiUrl('/API/FormAPI/CheckAdmin'), { credentials: 'include' });
const result = await resp.json();
return result.code === 0 && result.data && result.data.is_admin;
} catch (e) {
return false;
}
}
function roleTypeText(t) {
const map = { 0: '组员', 1: '组长', 2: '其他' };
return map[t] ?? '-';
@@ -71,9 +61,8 @@
}
// 先检查管理员特权,决定是否关闭公司隔离(仅当 URL 带 admin_verify=1 时启用)
_isAdminMode = CompanyUtils.hasAdminVerifyArg() ? await checkAdmin() : false;
const badge = document.getElementById('admin-badge');
if (badge) badge.style.display = _isAdminMode ? '' : 'none';
const _adminData = CompanyUtils.hasAdminVerifyArg() ? await GERP.CheckAdmin() : null;
_isAdminMode = GERP.ApplyAdminBadge(_adminData);
try {
const dataResp = await fetch(buildApiUrl('/API/FormAPI/Get/Role', { RoleUUID: roleUUID, PageSize: '1' }), { credentials: 'include' });
+1 -1
View File
@@ -6,7 +6,7 @@
<h1 class="PageTitle">
<i class="fas fa-shield-alt icon-primary icon-left-lg"></i>
<span id="page-title">角色管理</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> 特权模式</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> <span id="admin-badge-text">特权模式</span></span>
</h1>
</div>
<div class="cp-container" id="TableContainer"></div>
+3 -14
View File
@@ -7,7 +7,7 @@
<h1 class="PageTitle">
<i class="fas fa-layer-group icon-primary icon-left-lg"></i>
<span id="page-title">租户详情</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> 特权模式</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> <span id="admin-badge-text">特权模式</span></span>
</h1>
<button class="GERPBtn Primary" onclick="handleEdit()" style="margin-left:auto;"><i class="fas fa-edit"></i> 编辑</button>
</div>
@@ -46,16 +46,6 @@
return qs ? `${path}?${qs}` : path;
}
async function checkAdmin() {
try {
const resp = await fetch(buildApiUrl('/API/FormAPI/CheckAdmin'), { credentials: 'include' });
const result = await resp.json();
return result.code === 0 && result.data && result.data.is_admin;
} catch (e) {
return false;
}
}
function tenantStatusTag(status) {
if (status === 1) return '<span style="display:inline-block;padding:2px 8px;border-radius:4px;font-size:11px;font-weight:600;background:#dcfce7;color:#166534;">启用</span>';
return '<span style="display:inline-block;padding:2px 8px;border-radius:4px;font-size:11px;font-weight:600;background:#fee2e2;color:#991b1b;">禁用</span>';
@@ -81,9 +71,8 @@
}
// 先检查管理员特权(仅当 URL 带 admin_verify=1 时启用)
_isAdminMode = CompanyUtils.hasAdminVerifyArg() ? await checkAdmin() : false;
const badge = document.getElementById('admin-badge');
if (badge) badge.style.display = _isAdminMode ? '' : 'none';
const _adminData = CompanyUtils.hasAdminVerifyArg() ? await GERP.CheckAdmin() : null;
_isAdminMode = GERP.ApplyAdminBadge(_adminData);
try {
const dataResp = await fetch(buildApiUrl('/API/FormAPI/Get/Tenant', { TenantUUID: tenantUUID, PageSize: '1' }), { credentials: 'include' });
+1 -1
View File
@@ -6,7 +6,7 @@
<h1 class="PageTitle">
<i class="fas fa-layer-group icon-primary icon-left-lg"></i>
<span id="page-title">租户管理</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> 特权模式</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> <span id="admin-badge-text">特权模式</span></span>
</h1>
</div>
<div class="cp-container" id="TableContainer"></div>
+6 -22
View File
@@ -16,7 +16,7 @@
<h1 class="PageTitle">
<i class="fas fa-box icon-primary icon-left-lg"></i>
<span id="page-title">产品管理</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> 特权模式</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> <span id="admin-badge-text">特权模式</span></span>
</h1>
</div>
<div id="scopeBanner" class="product-scope-banner normal" style="display:none;"></div>
@@ -32,19 +32,6 @@
let isAdminMode = false;
let _roleScope = null;
/** 检查当前用户是否具有管理员特权,并填充 _roleScope */
async function checkAdmin() {
try {
const resp = await fetch('/API/FormAPI/CheckAdmin', { credentials: 'include' });
const result = await resp.json();
if (result.code === 0 && result.data) {
_roleScope = result.data.role_scope || null;
return result.data.is_admin;
}
return false;
} catch (e) { return false; }
}
function buildApiUrl(path, params = {}) {
const allParams = {};
if (currentServer !== 'gvsds-master') allParams.server = currentServer;
@@ -93,13 +80,10 @@
async function initTable() {
const containerEl = document.getElementById('TableContainer');
const isAdmin = await checkAdmin();
const _adminData = await GERP.CheckAdmin();
_roleScope = _adminData ? (_adminData.role_scope || null) : null;
applyScopeUI();
if (isAdmin) {
isAdminMode = true;
const badge = document.getElementById('admin-badge');
if (badge) badge.style.display = 'inline-block';
}
isAdminMode = GERP.ApplyAdminBadge(_adminData);
try {
let columns;
@@ -122,8 +106,8 @@
data: [],
pageSize: 20,
showPagination: true,
showCheckbox: isAdmin,
editable: isAdmin,
showCheckbox: isAdminMode,
editable: isAdminMode,
sortable: true,
filterable: true,
striped: true,
+5 -21
View File
@@ -16,7 +16,7 @@
<h1 class="PageTitle">
<i class="fas fa-shopping-cart icon-primary icon-left-lg"></i>
<span id="page-title">销售订单</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> 特权模式</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> <span id="admin-badge-text">特权模式</span></span>
</h1>
</div>
<div id="scopeBanner" class="order-scope-banner normal" style="display:none;"></div>
@@ -32,19 +32,6 @@
let isAdminMode = false;
let _roleScope = null;
/** 检查当前用户是否具有管理员特权,并填充 _roleScope */
async function checkAdmin() {
try {
const resp = await fetch('/API/FormAPI/CheckAdmin', { credentials: 'include' });
const result = await resp.json();
if (result.code === 0 && result.data) {
_roleScope = result.data.role_scope || null;
return result.data.is_admin;
}
return false;
} catch (e) { return false; }
}
function buildApiUrl(path, params = {}) {
const allParams = {};
if (currentServer !== 'gvsds-master') allParams.server = currentServer;
@@ -96,13 +83,10 @@
async function initTable() {
const containerEl = document.getElementById('TableContainer');
const isAdmin = await checkAdmin();
const _adminData = await GERP.CheckAdmin();
_roleScope = _adminData ? (_adminData.role_scope || null) : null;
applyScopeUI();
if (isAdmin) {
isAdminMode = true;
const badge = document.getElementById('admin-badge');
if (badge) badge.style.display = 'inline-block';
}
isAdminMode = GERP.ApplyAdminBadge(_adminData);
try {
let columns;
@@ -126,7 +110,7 @@
pageSize: 20,
showPagination: true,
showCheckbox: true,
editable: isAdmin,
editable: isAdminMode,
sortable: true,
filterable: true,
striped: true,
+1 -9
View File
@@ -119,14 +119,6 @@
GERP.SetTitle('操作审计日志');
async function checkAdmin() {
try {
const resp = await fetch('/API/FormAPI/CheckAdmin', { credentials: 'include' });
const result = await resp.json();
return result.code === 0 && result.data && result.data.is_admin;
} catch (e) { return false; }
}
function buildFilters() {
const params = new URLSearchParams();
const table = document.getElementById('filterTable').value;
@@ -155,7 +147,7 @@
try {
// 仅管理员可见
const isAdmin = await checkAdmin();
const isAdmin = !!(await GERP.CheckAdmin())?.is_admin;
if (!isAdmin) {
loadingEl.style.display = 'none';
errorEl.textContent = '无权访问审计日志,仅管理员可查看';
+3 -14
View File
@@ -34,7 +34,7 @@
<h1 class="PageTitle">
<i class="fas fa-database icon-primary icon-left-lg"></i>
<span id="page-title">数据库管理</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> 特权模式</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> <span id="admin-badge-text">特权模式</span></span>
</h1>
</div>
@@ -62,15 +62,6 @@
const isSubServer = !!serverName;
let isAdminMode = false;
/** 检查当前用户是否具有管理员特权 */
async function checkAdmin() {
try {
const resp = await fetch('/API/FormAPI/CheckAdmin', { credentials: 'include' });
const result = await resp.json();
return result.code === 0 && result.data && result.data.is_admin;
} catch (e) { return false; }
}
function buildApiUrl(path, params = {}) {
const allParams = {};
if (isSubServer) allParams.server = serverName;
@@ -82,16 +73,14 @@
async function init() {
// 入口校验:仅管理员可访问数据库管理页
const isAdmin = await checkAdmin();
if (!isAdmin) {
const adminData = await GERP.CheckAdmin();
if (!GERP.ApplyAdminBadge(adminData)) {
document.getElementById('section-static').style.display = 'none';
document.getElementById('section-dynamic').style.display = 'none';
document.getElementById('deniedState').style.display = 'block';
return;
}
isAdminMode = true;
const badge = document.getElementById('admin-badge');
if (badge) badge.style.display = 'inline-block';
if (isSubServer) {
document.getElementById('back-nav').style.display = 'flex';
document.getElementById('section-static').style.display = 'none';
+3 -14
View File
@@ -19,7 +19,7 @@
<h1 class="PageTitle">
<i class="fas fa-table icon-primary icon-left-lg"></i>
<span id="table-title">未选择表</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> 特权模式</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> <span id="admin-badge-text">特权模式</span></span>
</h1>
</div>
@@ -44,15 +44,6 @@
let _helper = null;
let isAdminMode = false;
/** 检查当前用户是否具有管理员特权 */
async function checkAdmin() {
try {
const resp = await fetch('/API/FormAPI/CheckAdmin', { credentials: 'include' });
const result = await resp.json();
return result.code === 0 && result.data && result.data.is_admin;
} catch (e) { return false; }
}
function showDenied() {
document.getElementById('TableContainer').style.display = 'none';
document.getElementById('table-info').style.display = 'none';
@@ -68,14 +59,12 @@
}
// 入口校验:仅管理员可访问数据库表浏览页
const isAdmin = await checkAdmin();
if (!isAdmin) {
const adminData = await GERP.CheckAdmin();
if (!GERP.ApplyAdminBadge(adminData)) {
showDenied();
return;
}
isAdminMode = true;
const badge = document.getElementById('admin-badge');
if (badge) badge.style.display = 'inline-block';
if (isSubServer) {
GERP.SetTitle(`${serverName} / ${tableTitle}`);
+21 -15
View File
@@ -96,7 +96,7 @@
<h1 class="PageTitle">
<i class="fas fa-bars icon-primary icon-left-lg"></i>
<span>菜单编辑器</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> 特权模式</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> <span id="admin-badge-text">特权模式</span></span>
</h1>
<div class="company-search-wrap" id="companySearchWrap">
<input type="text" class="GERPInput company-search-input" id="companySearchInput" placeholder="搜索公司添加标签页...">
@@ -221,15 +221,6 @@
let _accessVerified = false; // 入口校验是否已通过
const currentServer = new URLSearchParams(window.location.search).get('server') || 'gvsds-master';
/** 检查当前用户是否具有管理员特权 */
async function checkAdmin() {
try {
const resp = await fetch(buildApiUrl('/API/FormAPI/CheckAdmin'), { credentials: 'include' });
const result = await resp.json();
return result.code === 0 && result.data && result.data.is_admin;
} catch (e) { return false; }
}
function buildApiUrl(path, params = {}) {
const allParams = {};
if (currentServer !== 'gvsds-master') allParams.server = currentServer;
@@ -253,15 +244,14 @@
}
// 同步先隐藏关键交互,待异步校验通过后再启用
const _pendingVerify = checkAdmin().then(r => {
if (!r) {
const _pendingVerify = GERP.CheckAdmin().then(_adminData => {
const _isAdmin = GERP.ApplyAdminBadge(_adminData);
if (!_isAdmin) {
showDenied();
return false;
}
_accessVerified = true;
isAdminMode = true;
const badge = document.getElementById('admin-badge');
if (badge) badge.style.display = 'inline-block';
return true;
});
@@ -553,6 +543,17 @@
}
}
function wrapIcon(iconStr) {
// 统一包裹 <i> 标签:输入纯 class(fas fa-xxx)或已含 <i> 的 HTML,输出 <i class="..."></i>
if (!iconStr) return '<i class="fas fa-circle" style="font-size:6px;"></i>';
const s = String(iconStr).trim();
if (s.startsWith('<')) {
// 已含 HTML 标签,原样返回(兼容旧数据)
return s;
}
return `<i class="${s}"></i>`;
}
function renderNodes(nodes) {
let html = '';
const selUUID = getActiveSelectedUUID();
@@ -563,7 +564,7 @@
const visBadge = node.CompanyUUID ? '<span class="menu-badge private">私有</span>' : '<span class="menu-badge public">公有</span>';
const permBadge = node.PermissionAttr ? `<span class="menu-badge perm" title="${node.PermissionAttr}">${node.PermissionAttr}</span>` : '';
html += `<div class="menu-node ${isSelected ? 'selected' : ''}" data-uuid="${node.MenuUUID}">
<span class="menu-node-icon">${node.MenuIcon || '<i class="fas fa-circle" style="font-size:6px;"></i>'}</span>
<span class="menu-node-icon">${wrapIcon(node.MenuIcon)}</span>
<span class="menu-node-title">${node.MenuTitle || node.MenuName}</span>
${visBadge}${typeBadge}${disabledBadge}${permBadge}
<span class="menu-node-actions">
@@ -889,6 +890,10 @@
fIcon.addEventListener('input', updateIconPreview);
function getFormData() {
// 保留当前选中菜单的 ParentMenuUUID——表单不编辑父菜单,
// 必须回传原值,否则后端会将 ParentMenuUUID 置空导致菜单变成根菜单(野菜单)
const tab = getActiveTab();
const selectedMenu = tab && tab.selectedUUID ? tab.menus.find(m => m.MenuUUID === tab.selectedUUID) : null;
return {
MenuTitle: fTitle.value.trim(), MenuName: fName.value.trim(),
MenuIcon: fIcon.value.trim(), MenuLink: fLink.value.trim(),
@@ -896,6 +901,7 @@
PermissionLevel: parseFloat(fPermLevel.value) || 1.0,
PermissionAttr: fPermAttr.value.trim(), MenuStatus: fStatusValue,
CompanyUUID: fVisibilityValue === 'public' ? '' : getActiveCompanyUUID(),
ParentMenuUUID: selectedMenu ? (selectedMenu.ParentMenuUUID || '') : '',
};
}
+3 -15
View File
@@ -145,7 +145,7 @@
<h1 class="PageTitle">
<i class="fas fa-network-wired icon-primary icon-left-lg"></i>
MSYNC 服务器管理
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> 特权模式</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> <span id="admin-badge-text">特权模式</span></span>
</h1>
<div style="display:flex;align-items:center;gap:12px;">
<span class="msync-timezone-badge" id="tz-badge">
@@ -168,15 +168,6 @@
const API_BASE = '/api/gerp/msync/servers/';
let isAdminMode = false;
/** 检查当前用户是否具有管理员特权 */
async function checkAdmin() {
try {
const resp = await fetch('/API/FormAPI/CheckAdmin', { credentials: 'include' });
const result = await resp.json();
return result.code === 0 && result.data && result.data.is_admin;
} catch (e) { return false; }
}
function buildApiUrl(path, params = {}) {
const allParams = {};
if (isAdminMode) allParams.admin_verify = '1';
@@ -235,11 +226,8 @@
// 检查管理员特权(每次刷新时检查,仅当 URL 带 admin_verify=1 时启用)
if (!isAdminMode) {
const _hasAdminVerify = new URLSearchParams(window.location.search).get('admin_verify') === '1';
isAdminMode = _hasAdminVerify ? await checkAdmin() : false;
if (isAdminMode) {
const badge = document.getElementById('admin-badge');
if (badge) badge.style.display = 'inline-block';
}
const _adminData = _hasAdminVerify ? await GERP.CheckAdmin() : null;
isAdminMode = GERP.ApplyAdminBadge(_adminData);
}
try {
@@ -141,14 +141,6 @@
'wechat': '微信支付', 'alipay': '支付宝', 'bank': '银行直连', 'other': '其他',
};
async function checkAdmin() {
try {
const resp = await fetch('/API/FormAPI/CheckAdmin', { credentials: 'include' });
const result = await resp.json();
return result.code === 0 && result.data && result.data.is_admin;
} catch (e) { return false; }
}
async function loadConfigs() {
const gridEl = document.getElementById('configGrid');
const emptyEl = document.getElementById('emptyState');
@@ -162,7 +154,7 @@
errorEl.style.display = 'none';
loadingEl.style.display = 'block';
const isAdmin = await checkAdmin();
const isAdmin = !!(await GERP.CheckAdmin())?.is_admin;
if (!isAdmin) {
loadingEl.style.display = 'none';
errorEl.textContent = '无权访问:仅管理员可查看支付网关配置';
+3 -17
View File
@@ -8,7 +8,7 @@
<i class="fas fa-user-tag icon-primary icon-left-lg"></i>
<span id="page-title">角色详情</span>
</h1>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> 特权模式</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> <span id="admin-badge-text">特权模式</span></span>
<button class="GERPBtn Primary" onclick="handleEdit()" style="margin-left:auto;"><i class="fas fa-edit"></i> 编辑</button>
<button class="GERPBtn Secondary" onclick="goPermissionTree()" title="按权限组勾选分配权限"><i class="fas fa-sitemap"></i> 权限树分配</button>
</div>
@@ -37,17 +37,6 @@
let permTable = null;
let isAdminMode = false;
/** 检查当前用户是否具有管理员特权 */
async function checkAdmin() {
try {
const resp = await fetch(buildApiUrl('/API/FormAPI/CheckAdmin'), { credentials: 'include' });
const result = await resp.json();
return result.code === 0 && result.data && result.data.is_admin;
} catch (e) {
return false;
}
}
function buildApiUrl(path, params = {}) {
const allParams = {};
if (currentServer !== 'gvsds-master') allParams.server = currentServer;
@@ -79,11 +68,8 @@
}
// 先检查管理员特权(仅当 URL 带 admin_verify=1 时启用)
isAdminMode = CompanyUtils.hasAdminVerifyArg() ? await checkAdmin() : false;
const adminBadge = document.getElementById('admin-badge');
if (isAdminMode) {
adminBadge.style.display = 'inline-block';
}
const _adminData = CompanyUtils.hasAdminVerifyArg() ? await GERP.CheckAdmin() : null;
isAdminMode = GERP.ApplyAdminBadge(_adminData);
try {
const dataResp = await fetch(buildApiUrl('/API/FormAPI/Get/Role', { RoleUUID: roleUUID, PageSize: '1' }), { credentials: 'include' });
@@ -40,7 +40,7 @@
<i class="fas fa-shield-alt icon-primary icon-left-lg"></i>
<span>角色权限分配</span>
</h1>
<span id="admin-badge" style="display:none;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> 特权模式</span>
<span id="admin-badge" style="display:none;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> <span id="admin-badge-text">特权模式</span></span>
</div>
<div class="rp-toolbar">
@@ -105,14 +105,6 @@
}
}
async function checkAdmin() {
try {
const resp = await fetch('/API/FormAPI/CheckAdmin', { credentials: 'include' });
const result = await resp.json();
return result.code === 0 && result.data && result.data.is_admin;
} catch (e) { return false; }
}
function apiQs(extra = {}) {
const params = {};
if (_isAdminMode) params.admin_verify = '1';
@@ -123,7 +115,8 @@
async function init() {
// 入口校验:仅管理员可访问角色权限分配页
const isAdmin = await checkAdmin();
const _adminData = await GERP.CheckAdmin();
const isAdmin = GERP.ApplyAdminBadge(_adminData);
if (!isAdmin) {
document.querySelector('.rp-toolbar').style.display = 'none';
document.querySelector('.rp-tree-wrap').style.display = 'none';
@@ -132,7 +125,6 @@
return;
}
_isAdminMode = true;
document.getElementById('admin-badge').style.display = 'inline-block';
await Promise.all([loadRoles(), loadCompanies()]);
+1 -11
View File
@@ -37,22 +37,12 @@
return qs ? `${path}?${qs}` : path;
}
async function checkAdmin() {
try {
const resp = await fetch(buildApiUrl('/API/FormAPI/CheckAdmin'), { credentials: 'include' });
const result = await resp.json();
return result.code === 0 && result.data && result.data.is_admin;
} catch (e) {
return false;
}
}
async function initTable() {
const containerEl = document.getElementById('TableContainer');
// 先检查管理员特权(仅当 URL 带 admin_verify=1 时启用)
const _hasAdminVerify = new URLSearchParams(window.location.search).get('admin_verify') === '1';
_isAdminMode = _hasAdminVerify ? await checkAdmin() : false;
_isAdminMode = _hasAdminVerify ? !!(await GERP.CheckAdmin())?.is_admin : false;
try {
let columns;
+3 -17
View File
@@ -8,7 +8,7 @@
<i class="fas fa-user-circle icon-primary icon-left-lg"></i>
<span id="page-title">用户详情</span>
</h1>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> 特权模式</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> <span id="admin-badge-text">特权模式</span></span>
<button class="GERPBtn Primary" onclick="handleEdit()" style="margin-left:auto;"><i class="fas fa-edit"></i> 编辑</button>
</div>
<div class="cp-container" id="detailContainer" style="overflow:auto;">
@@ -36,17 +36,6 @@
let deptTable = null;
let isAdminMode = false;
/** 检查当前用户是否具有管理员特权 */
async function checkAdmin() {
try {
const resp = await fetch(buildApiUrl('/API/FormAPI/CheckAdmin'), { credentials: 'include' });
const result = await resp.json();
return result.code === 0 && result.data && result.data.is_admin;
} catch (e) {
return false;
}
}
function buildApiUrl(path, params = {}) {
const allParams = {};
if (currentServer !== 'gvsds-master') allParams.server = currentServer;
@@ -75,11 +64,8 @@
}
// 先检查管理员特权,决定是否启用无隔离模式(仅当 URL 带 admin_verify=1 时启用)
isAdminMode = CompanyUtils.hasAdminVerifyArg() ? await checkAdmin() : false;
const adminBadge = document.getElementById('admin-badge');
if (isAdminMode) {
adminBadge.style.display = 'inline-block';
}
const _adminData = CompanyUtils.hasAdminVerifyArg() ? await GERP.CheckAdmin() : null;
isAdminMode = GERP.ApplyAdminBadge(_adminData);
try {
const dataResp = await fetch(buildApiUrl('/API/FormAPI/Get/User', { UserUUID: userUUID, PageSize: '1' }), { credentials: 'include' });
@@ -109,14 +109,6 @@
return qs ? `${path}?${qs}` : path;
}
async function checkAdmin() {
try {
const resp = await fetch(buildApiUrl('/API/FormAPI/CheckAdmin'), { credentials: 'include' });
const result = await resp.json();
return result.code === 0 && result.data && result.data.is_admin;
} catch (e) { return false; }
}
async function loadContext() {
try {
const resp = await fetch(buildApiUrl('/API/FormAPI/CheckAdmin'), { credentials: 'include' });
@@ -134,7 +126,7 @@
async function initTable() {
// 入口校验:仅管理员可访问 UserRole 调试页
const isAdmin = await checkAdmin();
const isAdmin = !!(await GERP.CheckAdmin())?.is_admin;
if (!isAdmin) {
document.querySelectorAll('.section').forEach(el => el.style.display = 'none');
document.getElementById('ctxBar').style.display = 'none';
+4 -20
View File
@@ -18,7 +18,7 @@
<h1 class="PageTitle">
<i class="fas fa-users icon-primary icon-left-lg"></i>
<span id="page-title">用户管理</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> 特权模式</span>
<span id="admin-badge" style="display:none;margin-left:8px;padding:2px 10px;border-radius:4px;background:#1e40af;color:#fff;font-size:12px;font-weight:600;"><i class="fas fa-shield-alt"></i> <span id="admin-badge-text">特权模式</span></span>
</h1>
</div>
<div id="scopeBanner" class="user-scope-banner admin" style="display:none;"></div>
@@ -34,19 +34,6 @@
let isAdminMode = false;
let _roleScope = null; // {Type, TypeLabel, IsAdmin, IsDeptManager, IsWorkgroupLead, IsMember, DeptUUID, WorkgroupUUID}
/** 检查当前用户是否具有管理员特权,并填充 _roleScope */
async function checkAdmin() {
try {
const resp = await fetch('/API/FormAPI/CheckAdmin', { credentials: 'include' });
const result = await resp.json();
if (result.code === 0 && result.data) {
_roleScope = result.data.role_scope || null;
return result.data.is_admin;
}
return false;
} catch (e) { return false; }
}
function buildApiUrl(path, params = {}) {
const allParams = {};
if (currentServer !== 'gvsds-master') allParams.server = currentServer;
@@ -93,13 +80,10 @@
const containerEl = document.getElementById('TableContainer');
// 入口校验:获取 role_scope 并差异化显示
const isAdmin = await checkAdmin();
const _adminData = await GERP.CheckAdmin();
_roleScope = _adminData ? (_adminData.role_scope || null) : null;
applyScopeUI();
if (isAdmin) {
isAdminMode = true;
const badge = document.getElementById('admin-badge');
if (badge) badge.style.display = 'inline-block';
}
isAdminMode = GERP.ApplyAdminBadge(_adminData);
try {
let columns;
+23 -6
View File
@@ -143,7 +143,7 @@
<img src="/assets/mien_notresize/10.png" alt="Minecraft服务器游戏场景" class="rounded-lg shadow-2xl">
<div class="absolute -bottom-6 -right-6 bg-primary/90 p-4 rounded-lg shadow-lg">
<p class="font-bold text-white">SERVER</p>
<p class="text-2xl font-bold text-white" id="player-count">1.21.8</p>
<p class="text-2xl font-bold text-white" id="player-count">1.21.10</p>
</div>
</div>
<div class="mt-12 space-y-4">
@@ -316,7 +316,19 @@
activateBtn.innerHTML = '<i class="fa fa-spinner fa-spin mr-2"></i><span>绑定中...</span>';
try {
// 3. 发起fetch请求
// 3. 先刷新 AccessToken Cookie(避免 access token 过期导致 401)
// RefreshToken Cookie 跨子域共享(domain=.gvsds.com),AllowAny 权限
try {
await fetch('/Auth/RefreshToken', {
method: 'POST',
credentials: 'include',
});
} catch (refreshErr) {
// 刷新失败不阻断流程,继续尝试绑定(后端会返回 401)
console.warn('刷新 AccessToken 失败:', refreshErr);
}
// 4. 发起绑定请求
const response = await fetch('/API/UserBind.api', {
method: 'POST', // 根据接口要求调整请求方法(GET/POST)
headers: {
@@ -330,13 +342,18 @@
credentials: 'include' // 如需携带Cookie(如登录态),添加此配置
});
// 4. 处理响应(确保响应为JSON格式)
// 5. 处理响应(确保响应为JSON格式)
if (!response.ok) {
// 401 时跳转登录页(refresh token 也已失效)
if (response.status === 401) {
window.location.href = 'https://www.gvsds.com/login.html?return=' + encodeURIComponent(window.location.href);
return;
}
throw new Error(`请求失败:${response.status} ${response.statusText}`);
}
const result = await response.json();
// 5. 根据返回状态处理
// 6. 根据返回状态处理
if (result.status === 0) {
// 成功:跳转到redirect指定的地址
if (result.redirect && typeof result.redirect === 'string') {
@@ -353,11 +370,11 @@
}
} catch (error) {
// 6. 捕获网络错误或其他异常
// 7. 捕获网络错误或其他异常
errorContainer.innerHTML = `<p class="error-msg"><i class="fa fa-exclamation-circle mr-1"></i>网络错误:${error.message}</p>`;
console.error('绑定请求异常:', error); // 控制台打印错误,便于调试
} finally {
// 7. 无论成功/失败,都重新启用按钮并恢复文本
// 8. 无论成功/失败,都重新启用按钮并恢复文本
activateBtn.disabled = false;
activateBtn.innerHTML = '<span>绑定</span><i class="fa fa-arrow-right ml-2"></i>';
}
+3 -3
View File
@@ -425,10 +425,10 @@
<p class="text-gray-300 mb-3">需先注册GVSDS账户,再将GVSDS账户与我的世界账户关联</p>
<div class="flex items-center text-accent">
<i class="fa fa-exclamation-circle mr-2"></i>
<span>激活关联请联系 TermiNexus(自动化流程待开发)</span>
<span>自动化流程完成(确保已登录 GVSDS 账户)</span>
</div>
<a href="https://www.gvsds.com/enroll.html" target="_blank" class="mt-4 inline-block bg-primary/20 hover:bg-primary/30 text-accent px-4 py-2 rounded-lg transition-colors">
<i class="fa fa-external-link mr-1"></i> 前往注册账户
<a href="https://mc.gvsds.com/bind.html" target="_blank" class="mt-4 inline-block bg-primary/20 hover:bg-primary/30 text-accent px-4 py-2 rounded-lg transition-colors">
<i class="fa fa-external-link mr-1"></i> 前往绑定账户
</a>
</div>
@@ -0,0 +1,64 @@
{
"sources": [
{
"type": "minecraft:paletted_permutations",
"palette_key": "minecraft:trims/color_palettes/trim_palette",
"permutations": {
"amethyst": "minecraft:trims/color_palettes/amethyst",
"copper": "minecraft:trims/color_palettes/copper",
"copper_darker": "minecraft:trims/color_palettes/copper_darker",
"diamond": "minecraft:trims/color_palettes/diamond",
"diamond_darker": "minecraft:trims/color_palettes/diamond_darker",
"emerald": "minecraft:trims/color_palettes/emerald",
"gold": "minecraft:trims/color_palettes/gold",
"gold_darker": "minecraft:trims/color_palettes/gold_darker",
"iron": "minecraft:trims/color_palettes/iron",
"iron_darker": "minecraft:trims/color_palettes/iron_darker",
"lapis": "minecraft:trims/color_palettes/lapis",
"netherite": "minecraft:trims/color_palettes/netherite",
"netherite_darker": "minecraft:trims/color_palettes/netherite_darker",
"quartz": "minecraft:trims/color_palettes/quartz",
"redstone": "minecraft:trims/color_palettes/redstone",
"resin": "minecraft:trims/color_palettes/resin"
},
"textures": [
"minecraft:trims/entity/humanoid/sentry",
"minecraft:trims/entity/humanoid_leggings/sentry",
"minecraft:trims/entity/humanoid/dune",
"minecraft:trims/entity/humanoid_leggings/dune",
"minecraft:trims/entity/humanoid/coast",
"minecraft:trims/entity/humanoid_leggings/coast",
"minecraft:trims/entity/humanoid/wild",
"minecraft:trims/entity/humanoid_leggings/wild",
"minecraft:trims/entity/humanoid/ward",
"minecraft:trims/entity/humanoid_leggings/ward",
"minecraft:trims/entity/humanoid/eye",
"minecraft:trims/entity/humanoid_leggings/eye",
"minecraft:trims/entity/humanoid/vex",
"minecraft:trims/entity/humanoid_leggings/vex",
"minecraft:trims/entity/humanoid/tide",
"minecraft:trims/entity/humanoid_leggings/tide",
"minecraft:trims/entity/humanoid/snout",
"minecraft:trims/entity/humanoid_leggings/snout",
"minecraft:trims/entity/humanoid/rib",
"minecraft:trims/entity/humanoid_leggings/rib",
"minecraft:trims/entity/humanoid/spire",
"minecraft:trims/entity/humanoid_leggings/spire",
"minecraft:trims/entity/humanoid/wayfinder",
"minecraft:trims/entity/humanoid_leggings/wayfinder",
"minecraft:trims/entity/humanoid/shaper",
"minecraft:trims/entity/humanoid_leggings/shaper",
"minecraft:trims/entity/humanoid/silence",
"minecraft:trims/entity/humanoid_leggings/silence",
"minecraft:trims/entity/humanoid/raiser",
"minecraft:trims/entity/humanoid_leggings/raiser",
"minecraft:trims/entity/humanoid/host",
"minecraft:trims/entity/humanoid_leggings/host",
"minecraft:trims/entity/humanoid/flow",
"minecraft:trims/entity/humanoid_leggings/flow",
"minecraft:trims/entity/humanoid/bolt",
"minecraft:trims/entity/humanoid_leggings/bolt"
]
}
]
}
@@ -0,0 +1,13 @@
{
"sources": [
{
"type": "minecraft:single",
"resource": "minecraft:entity/banner_base"
},
{
"type": "minecraft:directory",
"prefix": "entity/banner/",
"source": "entity/banner"
}
]
}
+9
View File
@@ -0,0 +1,9 @@
{
"sources": [
{
"type": "minecraft:directory",
"prefix": "entity/bed/",
"source": "entity/bed"
}
]
}
+22
View File
@@ -0,0 +1,22 @@
{
"sources": [
{
"type": "minecraft:directory",
"prefix": "block/",
"source": "block"
},
{
"type": "minecraft:directory",
"prefix": "entity/conduit/",
"source": "entity/conduit"
},
{
"type": "minecraft:single",
"resource": "minecraft:entity/bell/bell_body"
},
{
"type": "minecraft:single",
"resource": "minecraft:entity/enchanting_table_book"
}
]
}
@@ -0,0 +1,9 @@
{
"sources": [
{
"type": "minecraft:directory",
"prefix": "",
"source": "environment/celestial"
}
]
}
@@ -0,0 +1,9 @@
{
"sources": [
{
"type": "minecraft:directory",
"prefix": "entity/chest/",
"source": "entity/chest"
}
]
}
@@ -0,0 +1,9 @@
{
"sources": [
{
"type": "minecraft:directory",
"prefix": "entity/decorated_pot/",
"source": "entity/decorated_pot"
}
]
}
+14
View File
@@ -0,0 +1,14 @@
{
"sources": [
{
"type": "minecraft:directory",
"prefix": "",
"source": "gui/sprites"
},
{
"type": "minecraft:directory",
"prefix": "mob_effect/",
"source": "mob_effect"
}
]
}
+37
View File
@@ -0,0 +1,37 @@
{
"sources": [
{
"type": "minecraft:directory",
"prefix": "item/",
"source": "item"
},
{
"type": "minecraft:paletted_permutations",
"palette_key": "minecraft:trims/color_palettes/trim_palette",
"permutations": {
"amethyst": "minecraft:trims/color_palettes/amethyst",
"copper": "minecraft:trims/color_palettes/copper",
"copper_darker": "minecraft:trims/color_palettes/copper_darker",
"diamond": "minecraft:trims/color_palettes/diamond",
"diamond_darker": "minecraft:trims/color_palettes/diamond_darker",
"emerald": "minecraft:trims/color_palettes/emerald",
"gold": "minecraft:trims/color_palettes/gold",
"gold_darker": "minecraft:trims/color_palettes/gold_darker",
"iron": "minecraft:trims/color_palettes/iron",
"iron_darker": "minecraft:trims/color_palettes/iron_darker",
"lapis": "minecraft:trims/color_palettes/lapis",
"netherite": "minecraft:trims/color_palettes/netherite",
"netherite_darker": "minecraft:trims/color_palettes/netherite_darker",
"quartz": "minecraft:trims/color_palettes/quartz",
"redstone": "minecraft:trims/color_palettes/redstone",
"resin": "minecraft:trims/color_palettes/resin"
},
"textures": [
"minecraft:trims/items/helmet_trim",
"minecraft:trims/items/chestplate_trim",
"minecraft:trims/items/leggings_trim",
"minecraft:trims/items/boots_trim"
]
}
]
}
@@ -0,0 +1,9 @@
{
"sources": [
{
"type": "minecraft:directory",
"prefix": "",
"source": "map/decorations"
}
]
}
@@ -0,0 +1,9 @@
{
"sources": [
{
"type": "minecraft:directory",
"prefix": "",
"source": "painting"
}
]
}
@@ -0,0 +1,9 @@
{
"sources": [
{
"type": "minecraft:directory",
"prefix": "",
"source": "particle"
}
]
}
@@ -0,0 +1,17 @@
{
"sources": [
{
"type": "minecraft:single",
"resource": "minecraft:entity/shield_base"
},
{
"type": "minecraft:single",
"resource": "minecraft:entity/shield_base_nopattern"
},
{
"type": "minecraft:directory",
"prefix": "entity/shield/",
"source": "entity/shield"
}
]
}
@@ -0,0 +1,9 @@
{
"sources": [
{
"type": "minecraft:directory",
"prefix": "entity/shulker/",
"source": "entity/shulker"
}
]
}
+9
View File
@@ -0,0 +1,9 @@
{
"sources": [
{
"type": "minecraft:directory",
"prefix": "entity/signs/",
"source": "entity/signs"
}
]
}
Binary file not shown.
@@ -0,0 +1,118 @@
{
"variants": {
"face=ceiling,facing=east,powered=false": {
"model": "minecraft:block/acacia_button",
"x": 180,
"y": 270
},
"face=ceiling,facing=east,powered=true": {
"model": "minecraft:block/acacia_button_pressed",
"x": 180,
"y": 270
},
"face=ceiling,facing=north,powered=false": {
"model": "minecraft:block/acacia_button",
"x": 180,
"y": 180
},
"face=ceiling,facing=north,powered=true": {
"model": "minecraft:block/acacia_button_pressed",
"x": 180,
"y": 180
},
"face=ceiling,facing=south,powered=false": {
"model": "minecraft:block/acacia_button",
"x": 180
},
"face=ceiling,facing=south,powered=true": {
"model": "minecraft:block/acacia_button_pressed",
"x": 180
},
"face=ceiling,facing=west,powered=false": {
"model": "minecraft:block/acacia_button",
"x": 180,
"y": 90
},
"face=ceiling,facing=west,powered=true": {
"model": "minecraft:block/acacia_button_pressed",
"x": 180,
"y": 90
},
"face=floor,facing=east,powered=false": {
"model": "minecraft:block/acacia_button",
"y": 90
},
"face=floor,facing=east,powered=true": {
"model": "minecraft:block/acacia_button_pressed",
"y": 90
},
"face=floor,facing=north,powered=false": {
"model": "minecraft:block/acacia_button"
},
"face=floor,facing=north,powered=true": {
"model": "minecraft:block/acacia_button_pressed"
},
"face=floor,facing=south,powered=false": {
"model": "minecraft:block/acacia_button",
"y": 180
},
"face=floor,facing=south,powered=true": {
"model": "minecraft:block/acacia_button_pressed",
"y": 180
},
"face=floor,facing=west,powered=false": {
"model": "minecraft:block/acacia_button",
"y": 270
},
"face=floor,facing=west,powered=true": {
"model": "minecraft:block/acacia_button_pressed",
"y": 270
},
"face=wall,facing=east,powered=false": {
"model": "minecraft:block/acacia_button",
"uvlock": true,
"x": 90,
"y": 90
},
"face=wall,facing=east,powered=true": {
"model": "minecraft:block/acacia_button_pressed",
"uvlock": true,
"x": 90,
"y": 90
},
"face=wall,facing=north,powered=false": {
"model": "minecraft:block/acacia_button",
"uvlock": true,
"x": 90
},
"face=wall,facing=north,powered=true": {
"model": "minecraft:block/acacia_button_pressed",
"uvlock": true,
"x": 90
},
"face=wall,facing=south,powered=false": {
"model": "minecraft:block/acacia_button",
"uvlock": true,
"x": 90,
"y": 180
},
"face=wall,facing=south,powered=true": {
"model": "minecraft:block/acacia_button_pressed",
"uvlock": true,
"x": 90,
"y": 180
},
"face=wall,facing=west,powered=false": {
"model": "minecraft:block/acacia_button",
"uvlock": true,
"x": 90,
"y": 270
},
"face=wall,facing=west,powered=true": {
"model": "minecraft:block/acacia_button_pressed",
"uvlock": true,
"x": 90,
"y": 270
}
}
}
@@ -0,0 +1,124 @@
{
"variants": {
"facing=east,half=lower,hinge=left,open=false": {
"model": "minecraft:block/acacia_door_bottom_left"
},
"facing=east,half=lower,hinge=left,open=true": {
"model": "minecraft:block/acacia_door_bottom_left_open",
"y": 90
},
"facing=east,half=lower,hinge=right,open=false": {
"model": "minecraft:block/acacia_door_bottom_right"
},
"facing=east,half=lower,hinge=right,open=true": {
"model": "minecraft:block/acacia_door_bottom_right_open",
"y": 270
},
"facing=east,half=upper,hinge=left,open=false": {
"model": "minecraft:block/acacia_door_top_left"
},
"facing=east,half=upper,hinge=left,open=true": {
"model": "minecraft:block/acacia_door_top_left_open",
"y": 90
},
"facing=east,half=upper,hinge=right,open=false": {
"model": "minecraft:block/acacia_door_top_right"
},
"facing=east,half=upper,hinge=right,open=true": {
"model": "minecraft:block/acacia_door_top_right_open",
"y": 270
},
"facing=north,half=lower,hinge=left,open=false": {
"model": "minecraft:block/acacia_door_bottom_left",
"y": 270
},
"facing=north,half=lower,hinge=left,open=true": {
"model": "minecraft:block/acacia_door_bottom_left_open"
},
"facing=north,half=lower,hinge=right,open=false": {
"model": "minecraft:block/acacia_door_bottom_right",
"y": 270
},
"facing=north,half=lower,hinge=right,open=true": {
"model": "minecraft:block/acacia_door_bottom_right_open",
"y": 180
},
"facing=north,half=upper,hinge=left,open=false": {
"model": "minecraft:block/acacia_door_top_left",
"y": 270
},
"facing=north,half=upper,hinge=left,open=true": {
"model": "minecraft:block/acacia_door_top_left_open"
},
"facing=north,half=upper,hinge=right,open=false": {
"model": "minecraft:block/acacia_door_top_right",
"y": 270
},
"facing=north,half=upper,hinge=right,open=true": {
"model": "minecraft:block/acacia_door_top_right_open",
"y": 180
},
"facing=south,half=lower,hinge=left,open=false": {
"model": "minecraft:block/acacia_door_bottom_left",
"y": 90
},
"facing=south,half=lower,hinge=left,open=true": {
"model": "minecraft:block/acacia_door_bottom_left_open",
"y": 180
},
"facing=south,half=lower,hinge=right,open=false": {
"model": "minecraft:block/acacia_door_bottom_right",
"y": 90
},
"facing=south,half=lower,hinge=right,open=true": {
"model": "minecraft:block/acacia_door_bottom_right_open"
},
"facing=south,half=upper,hinge=left,open=false": {
"model": "minecraft:block/acacia_door_top_left",
"y": 90
},
"facing=south,half=upper,hinge=left,open=true": {
"model": "minecraft:block/acacia_door_top_left_open",
"y": 180
},
"facing=south,half=upper,hinge=right,open=false": {
"model": "minecraft:block/acacia_door_top_right",
"y": 90
},
"facing=south,half=upper,hinge=right,open=true": {
"model": "minecraft:block/acacia_door_top_right_open"
},
"facing=west,half=lower,hinge=left,open=false": {
"model": "minecraft:block/acacia_door_bottom_left",
"y": 180
},
"facing=west,half=lower,hinge=left,open=true": {
"model": "minecraft:block/acacia_door_bottom_left_open",
"y": 270
},
"facing=west,half=lower,hinge=right,open=false": {
"model": "minecraft:block/acacia_door_bottom_right",
"y": 180
},
"facing=west,half=lower,hinge=right,open=true": {
"model": "minecraft:block/acacia_door_bottom_right_open",
"y": 90
},
"facing=west,half=upper,hinge=left,open=false": {
"model": "minecraft:block/acacia_door_top_left",
"y": 180
},
"facing=west,half=upper,hinge=left,open=true": {
"model": "minecraft:block/acacia_door_top_left_open",
"y": 270
},
"facing=west,half=upper,hinge=right,open=false": {
"model": "minecraft:block/acacia_door_top_right",
"y": 180
},
"facing=west,half=upper,hinge=right,open=true": {
"model": "minecraft:block/acacia_door_top_right_open",
"y": 90
}
}
}
@@ -0,0 +1,48 @@
{
"multipart": [
{
"apply": {
"model": "minecraft:block/acacia_fence_post"
}
},
{
"apply": {
"model": "minecraft:block/acacia_fence_side",
"uvlock": true
},
"when": {
"north": "true"
}
},
{
"apply": {
"model": "minecraft:block/acacia_fence_side",
"uvlock": true,
"y": 90
},
"when": {
"east": "true"
}
},
{
"apply": {
"model": "minecraft:block/acacia_fence_side",
"uvlock": true,
"y": 180
},
"when": {
"south": "true"
}
},
{
"apply": {
"model": "minecraft:block/acacia_fence_side",
"uvlock": true,
"y": 270
},
"when": {
"west": "true"
}
}
]
}
@@ -0,0 +1,80 @@
{
"variants": {
"facing=east,in_wall=false,open=false": {
"model": "minecraft:block/acacia_fence_gate",
"uvlock": true,
"y": 270
},
"facing=east,in_wall=false,open=true": {
"model": "minecraft:block/acacia_fence_gate_open",
"uvlock": true,
"y": 270
},
"facing=east,in_wall=true,open=false": {
"model": "minecraft:block/acacia_fence_gate_wall",
"uvlock": true,
"y": 270
},
"facing=east,in_wall=true,open=true": {
"model": "minecraft:block/acacia_fence_gate_wall_open",
"uvlock": true,
"y": 270
},
"facing=north,in_wall=false,open=false": {
"model": "minecraft:block/acacia_fence_gate",
"uvlock": true,
"y": 180
},
"facing=north,in_wall=false,open=true": {
"model": "minecraft:block/acacia_fence_gate_open",
"uvlock": true,
"y": 180
},
"facing=north,in_wall=true,open=false": {
"model": "minecraft:block/acacia_fence_gate_wall",
"uvlock": true,
"y": 180
},
"facing=north,in_wall=true,open=true": {
"model": "minecraft:block/acacia_fence_gate_wall_open",
"uvlock": true,
"y": 180
},
"facing=south,in_wall=false,open=false": {
"model": "minecraft:block/acacia_fence_gate",
"uvlock": true
},
"facing=south,in_wall=false,open=true": {
"model": "minecraft:block/acacia_fence_gate_open",
"uvlock": true
},
"facing=south,in_wall=true,open=false": {
"model": "minecraft:block/acacia_fence_gate_wall",
"uvlock": true
},
"facing=south,in_wall=true,open=true": {
"model": "minecraft:block/acacia_fence_gate_wall_open",
"uvlock": true
},
"facing=west,in_wall=false,open=false": {
"model": "minecraft:block/acacia_fence_gate",
"uvlock": true,
"y": 90
},
"facing=west,in_wall=false,open=true": {
"model": "minecraft:block/acacia_fence_gate_open",
"uvlock": true,
"y": 90
},
"facing=west,in_wall=true,open=false": {
"model": "minecraft:block/acacia_fence_gate_wall",
"uvlock": true,
"y": 90
},
"facing=west,in_wall=true,open=true": {
"model": "minecraft:block/acacia_fence_gate_wall_open",
"uvlock": true,
"y": 90
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/acacia_hanging_sign"
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/acacia_leaves"
}
}
}
@@ -0,0 +1,16 @@
{
"variants": {
"axis=x": {
"model": "minecraft:block/acacia_log_horizontal",
"x": 90,
"y": 90
},
"axis=y": {
"model": "minecraft:block/acacia_log"
},
"axis=z": {
"model": "minecraft:block/acacia_log_horizontal",
"x": 90
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/acacia_planks"
}
}
}
@@ -0,0 +1,10 @@
{
"variants": {
"powered=false": {
"model": "minecraft:block/acacia_pressure_plate"
},
"powered=true": {
"model": "minecraft:block/acacia_pressure_plate_down"
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/acacia_sapling"
}
}
}
@@ -0,0 +1,402 @@
{
"multipart": [
{
"apply": {
"model": "minecraft:block/acacia_shelf"
},
"when": {
"facing": "north"
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf",
"y": 90
},
"when": {
"facing": "east"
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf",
"y": 180
},
"when": {
"facing": "south"
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf",
"y": 270
},
"when": {
"facing": "west"
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_unpowered"
},
"when": {
"AND": [
{
"facing": "north"
},
{
"powered": "false"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_unpowered",
"y": 90
},
"when": {
"AND": [
{
"facing": "east"
},
{
"powered": "false"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_unpowered",
"y": 180
},
"when": {
"AND": [
{
"facing": "south"
},
{
"powered": "false"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_unpowered",
"y": 270
},
"when": {
"AND": [
{
"facing": "west"
},
{
"powered": "false"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_unconnected"
},
"when": {
"AND": [
{
"facing": "north"
},
{
"powered": "true"
},
{
"side_chain": "unconnected"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_unconnected",
"y": 90
},
"when": {
"AND": [
{
"facing": "east"
},
{
"powered": "true"
},
{
"side_chain": "unconnected"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_unconnected",
"y": 180
},
"when": {
"AND": [
{
"facing": "south"
},
{
"powered": "true"
},
{
"side_chain": "unconnected"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_unconnected",
"y": 270
},
"when": {
"AND": [
{
"facing": "west"
},
{
"powered": "true"
},
{
"side_chain": "unconnected"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_left"
},
"when": {
"AND": [
{
"facing": "north"
},
{
"powered": "true"
},
{
"side_chain": "left"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_left",
"y": 90
},
"when": {
"AND": [
{
"facing": "east"
},
{
"powered": "true"
},
{
"side_chain": "left"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_left",
"y": 180
},
"when": {
"AND": [
{
"facing": "south"
},
{
"powered": "true"
},
{
"side_chain": "left"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_left",
"y": 270
},
"when": {
"AND": [
{
"facing": "west"
},
{
"powered": "true"
},
{
"side_chain": "left"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_center"
},
"when": {
"AND": [
{
"facing": "north"
},
{
"powered": "true"
},
{
"side_chain": "center"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_center",
"y": 90
},
"when": {
"AND": [
{
"facing": "east"
},
{
"powered": "true"
},
{
"side_chain": "center"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_center",
"y": 180
},
"when": {
"AND": [
{
"facing": "south"
},
{
"powered": "true"
},
{
"side_chain": "center"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_center",
"y": 270
},
"when": {
"AND": [
{
"facing": "west"
},
{
"powered": "true"
},
{
"side_chain": "center"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_right"
},
"when": {
"AND": [
{
"facing": "north"
},
{
"powered": "true"
},
{
"side_chain": "right"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_right",
"y": 90
},
"when": {
"AND": [
{
"facing": "east"
},
{
"powered": "true"
},
{
"side_chain": "right"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_right",
"y": 180
},
"when": {
"AND": [
{
"facing": "south"
},
{
"powered": "true"
},
{
"side_chain": "right"
}
]
}
},
{
"apply": {
"model": "minecraft:block/acacia_shelf_right",
"y": 270
},
"when": {
"AND": [
{
"facing": "west"
},
{
"powered": "true"
},
{
"side_chain": "right"
}
]
}
}
]
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/acacia_sign"
}
}
}
@@ -0,0 +1,13 @@
{
"variants": {
"type=bottom": {
"model": "minecraft:block/acacia_slab"
},
"type=double": {
"model": "minecraft:block/acacia_planks"
},
"type=top": {
"model": "minecraft:block/acacia_slab_top"
}
}
}
@@ -0,0 +1,209 @@
{
"variants": {
"facing=east,half=bottom,shape=inner_left": {
"model": "minecraft:block/acacia_stairs_inner",
"uvlock": true,
"y": 270
},
"facing=east,half=bottom,shape=inner_right": {
"model": "minecraft:block/acacia_stairs_inner"
},
"facing=east,half=bottom,shape=outer_left": {
"model": "minecraft:block/acacia_stairs_outer",
"uvlock": true,
"y": 270
},
"facing=east,half=bottom,shape=outer_right": {
"model": "minecraft:block/acacia_stairs_outer"
},
"facing=east,half=bottom,shape=straight": {
"model": "minecraft:block/acacia_stairs"
},
"facing=east,half=top,shape=inner_left": {
"model": "minecraft:block/acacia_stairs_inner",
"uvlock": true,
"x": 180
},
"facing=east,half=top,shape=inner_right": {
"model": "minecraft:block/acacia_stairs_inner",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=east,half=top,shape=outer_left": {
"model": "minecraft:block/acacia_stairs_outer",
"uvlock": true,
"x": 180
},
"facing=east,half=top,shape=outer_right": {
"model": "minecraft:block/acacia_stairs_outer",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=east,half=top,shape=straight": {
"model": "minecraft:block/acacia_stairs",
"uvlock": true,
"x": 180
},
"facing=north,half=bottom,shape=inner_left": {
"model": "minecraft:block/acacia_stairs_inner",
"uvlock": true,
"y": 180
},
"facing=north,half=bottom,shape=inner_right": {
"model": "minecraft:block/acacia_stairs_inner",
"uvlock": true,
"y": 270
},
"facing=north,half=bottom,shape=outer_left": {
"model": "minecraft:block/acacia_stairs_outer",
"uvlock": true,
"y": 180
},
"facing=north,half=bottom,shape=outer_right": {
"model": "minecraft:block/acacia_stairs_outer",
"uvlock": true,
"y": 270
},
"facing=north,half=bottom,shape=straight": {
"model": "minecraft:block/acacia_stairs",
"uvlock": true,
"y": 270
},
"facing=north,half=top,shape=inner_left": {
"model": "minecraft:block/acacia_stairs_inner",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=north,half=top,shape=inner_right": {
"model": "minecraft:block/acacia_stairs_inner",
"uvlock": true,
"x": 180
},
"facing=north,half=top,shape=outer_left": {
"model": "minecraft:block/acacia_stairs_outer",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=north,half=top,shape=outer_right": {
"model": "minecraft:block/acacia_stairs_outer",
"uvlock": true,
"x": 180
},
"facing=north,half=top,shape=straight": {
"model": "minecraft:block/acacia_stairs",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=south,half=bottom,shape=inner_left": {
"model": "minecraft:block/acacia_stairs_inner"
},
"facing=south,half=bottom,shape=inner_right": {
"model": "minecraft:block/acacia_stairs_inner",
"uvlock": true,
"y": 90
},
"facing=south,half=bottom,shape=outer_left": {
"model": "minecraft:block/acacia_stairs_outer"
},
"facing=south,half=bottom,shape=outer_right": {
"model": "minecraft:block/acacia_stairs_outer",
"uvlock": true,
"y": 90
},
"facing=south,half=bottom,shape=straight": {
"model": "minecraft:block/acacia_stairs",
"uvlock": true,
"y": 90
},
"facing=south,half=top,shape=inner_left": {
"model": "minecraft:block/acacia_stairs_inner",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=south,half=top,shape=inner_right": {
"model": "minecraft:block/acacia_stairs_inner",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=south,half=top,shape=outer_left": {
"model": "minecraft:block/acacia_stairs_outer",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=south,half=top,shape=outer_right": {
"model": "minecraft:block/acacia_stairs_outer",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=south,half=top,shape=straight": {
"model": "minecraft:block/acacia_stairs",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=west,half=bottom,shape=inner_left": {
"model": "minecraft:block/acacia_stairs_inner",
"uvlock": true,
"y": 90
},
"facing=west,half=bottom,shape=inner_right": {
"model": "minecraft:block/acacia_stairs_inner",
"uvlock": true,
"y": 180
},
"facing=west,half=bottom,shape=outer_left": {
"model": "minecraft:block/acacia_stairs_outer",
"uvlock": true,
"y": 90
},
"facing=west,half=bottom,shape=outer_right": {
"model": "minecraft:block/acacia_stairs_outer",
"uvlock": true,
"y": 180
},
"facing=west,half=bottom,shape=straight": {
"model": "minecraft:block/acacia_stairs",
"uvlock": true,
"y": 180
},
"facing=west,half=top,shape=inner_left": {
"model": "minecraft:block/acacia_stairs_inner",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=west,half=top,shape=inner_right": {
"model": "minecraft:block/acacia_stairs_inner",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=west,half=top,shape=outer_left": {
"model": "minecraft:block/acacia_stairs_outer",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=west,half=top,shape=outer_right": {
"model": "minecraft:block/acacia_stairs_outer",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=west,half=top,shape=straight": {
"model": "minecraft:block/acacia_stairs",
"uvlock": true,
"x": 180,
"y": 180
}
}
}
@@ -0,0 +1,68 @@
{
"variants": {
"facing=east,half=bottom,open=false": {
"model": "minecraft:block/acacia_trapdoor_bottom",
"y": 90
},
"facing=east,half=bottom,open=true": {
"model": "minecraft:block/acacia_trapdoor_open",
"y": 90
},
"facing=east,half=top,open=false": {
"model": "minecraft:block/acacia_trapdoor_top",
"y": 90
},
"facing=east,half=top,open=true": {
"model": "minecraft:block/acacia_trapdoor_open",
"x": 180,
"y": 270
},
"facing=north,half=bottom,open=false": {
"model": "minecraft:block/acacia_trapdoor_bottom"
},
"facing=north,half=bottom,open=true": {
"model": "minecraft:block/acacia_trapdoor_open"
},
"facing=north,half=top,open=false": {
"model": "minecraft:block/acacia_trapdoor_top"
},
"facing=north,half=top,open=true": {
"model": "minecraft:block/acacia_trapdoor_open",
"x": 180,
"y": 180
},
"facing=south,half=bottom,open=false": {
"model": "minecraft:block/acacia_trapdoor_bottom",
"y": 180
},
"facing=south,half=bottom,open=true": {
"model": "minecraft:block/acacia_trapdoor_open",
"y": 180
},
"facing=south,half=top,open=false": {
"model": "minecraft:block/acacia_trapdoor_top",
"y": 180
},
"facing=south,half=top,open=true": {
"model": "minecraft:block/acacia_trapdoor_open",
"x": 180
},
"facing=west,half=bottom,open=false": {
"model": "minecraft:block/acacia_trapdoor_bottom",
"y": 270
},
"facing=west,half=bottom,open=true": {
"model": "minecraft:block/acacia_trapdoor_open",
"y": 270
},
"facing=west,half=top,open=false": {
"model": "minecraft:block/acacia_trapdoor_top",
"y": 270
},
"facing=west,half=top,open=true": {
"model": "minecraft:block/acacia_trapdoor_open",
"x": 180,
"y": 90
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/acacia_hanging_sign"
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/acacia_sign"
}
}
}
@@ -0,0 +1,16 @@
{
"variants": {
"axis=x": {
"model": "minecraft:block/acacia_wood",
"x": 90,
"y": 90
},
"axis=y": {
"model": "minecraft:block/acacia_wood"
},
"axis=z": {
"model": "minecraft:block/acacia_wood",
"x": 90
}
}
}
@@ -0,0 +1,46 @@
{
"variants": {
"powered=false,shape=ascending_east": {
"model": "minecraft:block/activator_rail_raised_ne",
"y": 90
},
"powered=false,shape=ascending_north": {
"model": "minecraft:block/activator_rail_raised_ne"
},
"powered=false,shape=ascending_south": {
"model": "minecraft:block/activator_rail_raised_sw"
},
"powered=false,shape=ascending_west": {
"model": "minecraft:block/activator_rail_raised_sw",
"y": 90
},
"powered=false,shape=east_west": {
"model": "minecraft:block/activator_rail",
"y": 90
},
"powered=false,shape=north_south": {
"model": "minecraft:block/activator_rail"
},
"powered=true,shape=ascending_east": {
"model": "minecraft:block/activator_rail_on_raised_ne",
"y": 90
},
"powered=true,shape=ascending_north": {
"model": "minecraft:block/activator_rail_on_raised_ne"
},
"powered=true,shape=ascending_south": {
"model": "minecraft:block/activator_rail_on_raised_sw"
},
"powered=true,shape=ascending_west": {
"model": "minecraft:block/activator_rail_on_raised_sw",
"y": 90
},
"powered=true,shape=east_west": {
"model": "minecraft:block/activator_rail_on",
"y": 90
},
"powered=true,shape=north_south": {
"model": "minecraft:block/activator_rail_on"
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/air"
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/allium"
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/amethyst_block"
}
}
}
@@ -0,0 +1,30 @@
{
"variants": {
"facing=down": {
"model": "minecraft:block/amethyst_cluster",
"x": 180
},
"facing=east": {
"model": "minecraft:block/amethyst_cluster",
"x": 90,
"y": 90
},
"facing=north": {
"model": "minecraft:block/amethyst_cluster",
"x": 90
},
"facing=south": {
"model": "minecraft:block/amethyst_cluster",
"x": 90,
"y": 180
},
"facing=up": {
"model": "minecraft:block/amethyst_cluster"
},
"facing=west": {
"model": "minecraft:block/amethyst_cluster",
"x": 90,
"y": 270
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/ancient_debris"
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/andesite"
}
}
}
@@ -0,0 +1,13 @@
{
"variants": {
"type=bottom": {
"model": "minecraft:block/andesite_slab"
},
"type=double": {
"model": "minecraft:block/andesite"
},
"type=top": {
"model": "minecraft:block/andesite_slab_top"
}
}
}
@@ -0,0 +1,209 @@
{
"variants": {
"facing=east,half=bottom,shape=inner_left": {
"model": "minecraft:block/andesite_stairs_inner",
"uvlock": true,
"y": 270
},
"facing=east,half=bottom,shape=inner_right": {
"model": "minecraft:block/andesite_stairs_inner"
},
"facing=east,half=bottom,shape=outer_left": {
"model": "minecraft:block/andesite_stairs_outer",
"uvlock": true,
"y": 270
},
"facing=east,half=bottom,shape=outer_right": {
"model": "minecraft:block/andesite_stairs_outer"
},
"facing=east,half=bottom,shape=straight": {
"model": "minecraft:block/andesite_stairs"
},
"facing=east,half=top,shape=inner_left": {
"model": "minecraft:block/andesite_stairs_inner",
"uvlock": true,
"x": 180
},
"facing=east,half=top,shape=inner_right": {
"model": "minecraft:block/andesite_stairs_inner",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=east,half=top,shape=outer_left": {
"model": "minecraft:block/andesite_stairs_outer",
"uvlock": true,
"x": 180
},
"facing=east,half=top,shape=outer_right": {
"model": "minecraft:block/andesite_stairs_outer",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=east,half=top,shape=straight": {
"model": "minecraft:block/andesite_stairs",
"uvlock": true,
"x": 180
},
"facing=north,half=bottom,shape=inner_left": {
"model": "minecraft:block/andesite_stairs_inner",
"uvlock": true,
"y": 180
},
"facing=north,half=bottom,shape=inner_right": {
"model": "minecraft:block/andesite_stairs_inner",
"uvlock": true,
"y": 270
},
"facing=north,half=bottom,shape=outer_left": {
"model": "minecraft:block/andesite_stairs_outer",
"uvlock": true,
"y": 180
},
"facing=north,half=bottom,shape=outer_right": {
"model": "minecraft:block/andesite_stairs_outer",
"uvlock": true,
"y": 270
},
"facing=north,half=bottom,shape=straight": {
"model": "minecraft:block/andesite_stairs",
"uvlock": true,
"y": 270
},
"facing=north,half=top,shape=inner_left": {
"model": "minecraft:block/andesite_stairs_inner",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=north,half=top,shape=inner_right": {
"model": "minecraft:block/andesite_stairs_inner",
"uvlock": true,
"x": 180
},
"facing=north,half=top,shape=outer_left": {
"model": "minecraft:block/andesite_stairs_outer",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=north,half=top,shape=outer_right": {
"model": "minecraft:block/andesite_stairs_outer",
"uvlock": true,
"x": 180
},
"facing=north,half=top,shape=straight": {
"model": "minecraft:block/andesite_stairs",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=south,half=bottom,shape=inner_left": {
"model": "minecraft:block/andesite_stairs_inner"
},
"facing=south,half=bottom,shape=inner_right": {
"model": "minecraft:block/andesite_stairs_inner",
"uvlock": true,
"y": 90
},
"facing=south,half=bottom,shape=outer_left": {
"model": "minecraft:block/andesite_stairs_outer"
},
"facing=south,half=bottom,shape=outer_right": {
"model": "minecraft:block/andesite_stairs_outer",
"uvlock": true,
"y": 90
},
"facing=south,half=bottom,shape=straight": {
"model": "minecraft:block/andesite_stairs",
"uvlock": true,
"y": 90
},
"facing=south,half=top,shape=inner_left": {
"model": "minecraft:block/andesite_stairs_inner",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=south,half=top,shape=inner_right": {
"model": "minecraft:block/andesite_stairs_inner",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=south,half=top,shape=outer_left": {
"model": "minecraft:block/andesite_stairs_outer",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=south,half=top,shape=outer_right": {
"model": "minecraft:block/andesite_stairs_outer",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=south,half=top,shape=straight": {
"model": "minecraft:block/andesite_stairs",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=west,half=bottom,shape=inner_left": {
"model": "minecraft:block/andesite_stairs_inner",
"uvlock": true,
"y": 90
},
"facing=west,half=bottom,shape=inner_right": {
"model": "minecraft:block/andesite_stairs_inner",
"uvlock": true,
"y": 180
},
"facing=west,half=bottom,shape=outer_left": {
"model": "minecraft:block/andesite_stairs_outer",
"uvlock": true,
"y": 90
},
"facing=west,half=bottom,shape=outer_right": {
"model": "minecraft:block/andesite_stairs_outer",
"uvlock": true,
"y": 180
},
"facing=west,half=bottom,shape=straight": {
"model": "minecraft:block/andesite_stairs",
"uvlock": true,
"y": 180
},
"facing=west,half=top,shape=inner_left": {
"model": "minecraft:block/andesite_stairs_inner",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=west,half=top,shape=inner_right": {
"model": "minecraft:block/andesite_stairs_inner",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=west,half=top,shape=outer_left": {
"model": "minecraft:block/andesite_stairs_outer",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=west,half=top,shape=outer_right": {
"model": "minecraft:block/andesite_stairs_outer",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=west,half=top,shape=straight": {
"model": "minecraft:block/andesite_stairs",
"uvlock": true,
"x": 180,
"y": 180
}
}
}
@@ -0,0 +1,90 @@
{
"multipart": [
{
"apply": {
"model": "minecraft:block/andesite_wall_post"
},
"when": {
"up": "true"
}
},
{
"apply": {
"model": "minecraft:block/andesite_wall_side",
"uvlock": true
},
"when": {
"north": "low"
}
},
{
"apply": {
"model": "minecraft:block/andesite_wall_side",
"uvlock": true,
"y": 90
},
"when": {
"east": "low"
}
},
{
"apply": {
"model": "minecraft:block/andesite_wall_side",
"uvlock": true,
"y": 180
},
"when": {
"south": "low"
}
},
{
"apply": {
"model": "minecraft:block/andesite_wall_side",
"uvlock": true,
"y": 270
},
"when": {
"west": "low"
}
},
{
"apply": {
"model": "minecraft:block/andesite_wall_side_tall",
"uvlock": true
},
"when": {
"north": "tall"
}
},
{
"apply": {
"model": "minecraft:block/andesite_wall_side_tall",
"uvlock": true,
"y": 90
},
"when": {
"east": "tall"
}
},
{
"apply": {
"model": "minecraft:block/andesite_wall_side_tall",
"uvlock": true,
"y": 180
},
"when": {
"south": "tall"
}
},
{
"apply": {
"model": "minecraft:block/andesite_wall_side_tall",
"uvlock": true,
"y": 270
},
"when": {
"west": "tall"
}
}
]
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=east": {
"model": "minecraft:block/anvil",
"y": 270
},
"facing=north": {
"model": "minecraft:block/anvil",
"y": 180
},
"facing=south": {
"model": "minecraft:block/anvil"
},
"facing=west": {
"model": "minecraft:block/anvil",
"y": 90
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=east": {
"model": "minecraft:block/attached_melon_stem",
"y": 180
},
"facing=north": {
"model": "minecraft:block/attached_melon_stem",
"y": 90
},
"facing=south": {
"model": "minecraft:block/attached_melon_stem",
"y": 270
},
"facing=west": {
"model": "minecraft:block/attached_melon_stem"
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=east": {
"model": "minecraft:block/attached_pumpkin_stem",
"y": 180
},
"facing=north": {
"model": "minecraft:block/attached_pumpkin_stem",
"y": 90
},
"facing=south": {
"model": "minecraft:block/attached_pumpkin_stem",
"y": 270
},
"facing=west": {
"model": "minecraft:block/attached_pumpkin_stem"
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/azalea"
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/azalea_leaves"
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/azure_bluet"
}
}
}
@@ -0,0 +1,58 @@
{
"multipart": [
{
"apply": [
{
"model": "minecraft:block/bamboo1_age0"
},
{
"model": "minecraft:block/bamboo2_age0"
},
{
"model": "minecraft:block/bamboo3_age0"
},
{
"model": "minecraft:block/bamboo4_age0"
}
],
"when": {
"age": "0"
}
},
{
"apply": [
{
"model": "minecraft:block/bamboo1_age1"
},
{
"model": "minecraft:block/bamboo2_age1"
},
{
"model": "minecraft:block/bamboo3_age1"
},
{
"model": "minecraft:block/bamboo4_age1"
}
],
"when": {
"age": "1"
}
},
{
"apply": {
"model": "minecraft:block/bamboo_small_leaves"
},
"when": {
"leaves": "small"
}
},
{
"apply": {
"model": "minecraft:block/bamboo_large_leaves"
},
"when": {
"leaves": "large"
}
}
]
}
@@ -0,0 +1,13 @@
{
"variants": {
"axis=x": {
"model": "minecraft:block/bamboo_block_x"
},
"axis=y": {
"model": "minecraft:block/bamboo_block_y"
},
"axis=z": {
"model": "minecraft:block/bamboo_block_z"
}
}
}
@@ -0,0 +1,118 @@
{
"variants": {
"face=ceiling,facing=east,powered=false": {
"model": "minecraft:block/bamboo_button",
"x": 180,
"y": 270
},
"face=ceiling,facing=east,powered=true": {
"model": "minecraft:block/bamboo_button_pressed",
"x": 180,
"y": 270
},
"face=ceiling,facing=north,powered=false": {
"model": "minecraft:block/bamboo_button",
"x": 180,
"y": 180
},
"face=ceiling,facing=north,powered=true": {
"model": "minecraft:block/bamboo_button_pressed",
"x": 180,
"y": 180
},
"face=ceiling,facing=south,powered=false": {
"model": "minecraft:block/bamboo_button",
"x": 180
},
"face=ceiling,facing=south,powered=true": {
"model": "minecraft:block/bamboo_button_pressed",
"x": 180
},
"face=ceiling,facing=west,powered=false": {
"model": "minecraft:block/bamboo_button",
"x": 180,
"y": 90
},
"face=ceiling,facing=west,powered=true": {
"model": "minecraft:block/bamboo_button_pressed",
"x": 180,
"y": 90
},
"face=floor,facing=east,powered=false": {
"model": "minecraft:block/bamboo_button",
"y": 90
},
"face=floor,facing=east,powered=true": {
"model": "minecraft:block/bamboo_button_pressed",
"y": 90
},
"face=floor,facing=north,powered=false": {
"model": "minecraft:block/bamboo_button"
},
"face=floor,facing=north,powered=true": {
"model": "minecraft:block/bamboo_button_pressed"
},
"face=floor,facing=south,powered=false": {
"model": "minecraft:block/bamboo_button",
"y": 180
},
"face=floor,facing=south,powered=true": {
"model": "minecraft:block/bamboo_button_pressed",
"y": 180
},
"face=floor,facing=west,powered=false": {
"model": "minecraft:block/bamboo_button",
"y": 270
},
"face=floor,facing=west,powered=true": {
"model": "minecraft:block/bamboo_button_pressed",
"y": 270
},
"face=wall,facing=east,powered=false": {
"model": "minecraft:block/bamboo_button",
"uvlock": true,
"x": 90,
"y": 90
},
"face=wall,facing=east,powered=true": {
"model": "minecraft:block/bamboo_button_pressed",
"uvlock": true,
"x": 90,
"y": 90
},
"face=wall,facing=north,powered=false": {
"model": "minecraft:block/bamboo_button",
"uvlock": true,
"x": 90
},
"face=wall,facing=north,powered=true": {
"model": "minecraft:block/bamboo_button_pressed",
"uvlock": true,
"x": 90
},
"face=wall,facing=south,powered=false": {
"model": "minecraft:block/bamboo_button",
"uvlock": true,
"x": 90,
"y": 180
},
"face=wall,facing=south,powered=true": {
"model": "minecraft:block/bamboo_button_pressed",
"uvlock": true,
"x": 90,
"y": 180
},
"face=wall,facing=west,powered=false": {
"model": "minecraft:block/bamboo_button",
"uvlock": true,
"x": 90,
"y": 270
},
"face=wall,facing=west,powered=true": {
"model": "minecraft:block/bamboo_button_pressed",
"uvlock": true,
"x": 90,
"y": 270
}
}
}
@@ -0,0 +1,124 @@
{
"variants": {
"facing=east,half=lower,hinge=left,open=false": {
"model": "minecraft:block/bamboo_door_bottom_left"
},
"facing=east,half=lower,hinge=left,open=true": {
"model": "minecraft:block/bamboo_door_bottom_left_open",
"y": 90
},
"facing=east,half=lower,hinge=right,open=false": {
"model": "minecraft:block/bamboo_door_bottom_right"
},
"facing=east,half=lower,hinge=right,open=true": {
"model": "minecraft:block/bamboo_door_bottom_right_open",
"y": 270
},
"facing=east,half=upper,hinge=left,open=false": {
"model": "minecraft:block/bamboo_door_top_left"
},
"facing=east,half=upper,hinge=left,open=true": {
"model": "minecraft:block/bamboo_door_top_left_open",
"y": 90
},
"facing=east,half=upper,hinge=right,open=false": {
"model": "minecraft:block/bamboo_door_top_right"
},
"facing=east,half=upper,hinge=right,open=true": {
"model": "minecraft:block/bamboo_door_top_right_open",
"y": 270
},
"facing=north,half=lower,hinge=left,open=false": {
"model": "minecraft:block/bamboo_door_bottom_left",
"y": 270
},
"facing=north,half=lower,hinge=left,open=true": {
"model": "minecraft:block/bamboo_door_bottom_left_open"
},
"facing=north,half=lower,hinge=right,open=false": {
"model": "minecraft:block/bamboo_door_bottom_right",
"y": 270
},
"facing=north,half=lower,hinge=right,open=true": {
"model": "minecraft:block/bamboo_door_bottom_right_open",
"y": 180
},
"facing=north,half=upper,hinge=left,open=false": {
"model": "minecraft:block/bamboo_door_top_left",
"y": 270
},
"facing=north,half=upper,hinge=left,open=true": {
"model": "minecraft:block/bamboo_door_top_left_open"
},
"facing=north,half=upper,hinge=right,open=false": {
"model": "minecraft:block/bamboo_door_top_right",
"y": 270
},
"facing=north,half=upper,hinge=right,open=true": {
"model": "minecraft:block/bamboo_door_top_right_open",
"y": 180
},
"facing=south,half=lower,hinge=left,open=false": {
"model": "minecraft:block/bamboo_door_bottom_left",
"y": 90
},
"facing=south,half=lower,hinge=left,open=true": {
"model": "minecraft:block/bamboo_door_bottom_left_open",
"y": 180
},
"facing=south,half=lower,hinge=right,open=false": {
"model": "minecraft:block/bamboo_door_bottom_right",
"y": 90
},
"facing=south,half=lower,hinge=right,open=true": {
"model": "minecraft:block/bamboo_door_bottom_right_open"
},
"facing=south,half=upper,hinge=left,open=false": {
"model": "minecraft:block/bamboo_door_top_left",
"y": 90
},
"facing=south,half=upper,hinge=left,open=true": {
"model": "minecraft:block/bamboo_door_top_left_open",
"y": 180
},
"facing=south,half=upper,hinge=right,open=false": {
"model": "minecraft:block/bamboo_door_top_right",
"y": 90
},
"facing=south,half=upper,hinge=right,open=true": {
"model": "minecraft:block/bamboo_door_top_right_open"
},
"facing=west,half=lower,hinge=left,open=false": {
"model": "minecraft:block/bamboo_door_bottom_left",
"y": 180
},
"facing=west,half=lower,hinge=left,open=true": {
"model": "minecraft:block/bamboo_door_bottom_left_open",
"y": 270
},
"facing=west,half=lower,hinge=right,open=false": {
"model": "minecraft:block/bamboo_door_bottom_right",
"y": 180
},
"facing=west,half=lower,hinge=right,open=true": {
"model": "minecraft:block/bamboo_door_bottom_right_open",
"y": 90
},
"facing=west,half=upper,hinge=left,open=false": {
"model": "minecraft:block/bamboo_door_top_left",
"y": 180
},
"facing=west,half=upper,hinge=left,open=true": {
"model": "minecraft:block/bamboo_door_top_left_open",
"y": 270
},
"facing=west,half=upper,hinge=right,open=false": {
"model": "minecraft:block/bamboo_door_top_right",
"y": 180
},
"facing=west,half=upper,hinge=right,open=true": {
"model": "minecraft:block/bamboo_door_top_right_open",
"y": 90
}
}
}
@@ -0,0 +1,41 @@
{
"multipart": [
{
"apply": {
"model": "minecraft:block/bamboo_fence_post"
}
},
{
"apply": {
"model": "minecraft:block/bamboo_fence_side_north"
},
"when": {
"north": "true"
}
},
{
"apply": {
"model": "minecraft:block/bamboo_fence_side_east"
},
"when": {
"east": "true"
}
},
{
"apply": {
"model": "minecraft:block/bamboo_fence_side_south"
},
"when": {
"south": "true"
}
},
{
"apply": {
"model": "minecraft:block/bamboo_fence_side_west"
},
"when": {
"west": "true"
}
}
]
}
@@ -0,0 +1,64 @@
{
"variants": {
"facing=east,in_wall=false,open=false": {
"model": "minecraft:block/bamboo_fence_gate",
"y": 270
},
"facing=east,in_wall=false,open=true": {
"model": "minecraft:block/bamboo_fence_gate_open",
"y": 270
},
"facing=east,in_wall=true,open=false": {
"model": "minecraft:block/bamboo_fence_gate_wall",
"y": 270
},
"facing=east,in_wall=true,open=true": {
"model": "minecraft:block/bamboo_fence_gate_wall_open",
"y": 270
},
"facing=north,in_wall=false,open=false": {
"model": "minecraft:block/bamboo_fence_gate",
"y": 180
},
"facing=north,in_wall=false,open=true": {
"model": "minecraft:block/bamboo_fence_gate_open",
"y": 180
},
"facing=north,in_wall=true,open=false": {
"model": "minecraft:block/bamboo_fence_gate_wall",
"y": 180
},
"facing=north,in_wall=true,open=true": {
"model": "minecraft:block/bamboo_fence_gate_wall_open",
"y": 180
},
"facing=south,in_wall=false,open=false": {
"model": "minecraft:block/bamboo_fence_gate"
},
"facing=south,in_wall=false,open=true": {
"model": "minecraft:block/bamboo_fence_gate_open"
},
"facing=south,in_wall=true,open=false": {
"model": "minecraft:block/bamboo_fence_gate_wall"
},
"facing=south,in_wall=true,open=true": {
"model": "minecraft:block/bamboo_fence_gate_wall_open"
},
"facing=west,in_wall=false,open=false": {
"model": "minecraft:block/bamboo_fence_gate",
"y": 90
},
"facing=west,in_wall=false,open=true": {
"model": "minecraft:block/bamboo_fence_gate_open",
"y": 90
},
"facing=west,in_wall=true,open=false": {
"model": "minecraft:block/bamboo_fence_gate_wall",
"y": 90
},
"facing=west,in_wall=true,open=true": {
"model": "minecraft:block/bamboo_fence_gate_wall_open",
"y": 90
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/bamboo_hanging_sign"
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/bamboo_mosaic"
}
}
}
@@ -0,0 +1,13 @@
{
"variants": {
"type=bottom": {
"model": "minecraft:block/bamboo_mosaic_slab"
},
"type=double": {
"model": "minecraft:block/bamboo_mosaic"
},
"type=top": {
"model": "minecraft:block/bamboo_mosaic_slab_top"
}
}
}
@@ -0,0 +1,209 @@
{
"variants": {
"facing=east,half=bottom,shape=inner_left": {
"model": "minecraft:block/bamboo_mosaic_stairs_inner",
"uvlock": true,
"y": 270
},
"facing=east,half=bottom,shape=inner_right": {
"model": "minecraft:block/bamboo_mosaic_stairs_inner"
},
"facing=east,half=bottom,shape=outer_left": {
"model": "minecraft:block/bamboo_mosaic_stairs_outer",
"uvlock": true,
"y": 270
},
"facing=east,half=bottom,shape=outer_right": {
"model": "minecraft:block/bamboo_mosaic_stairs_outer"
},
"facing=east,half=bottom,shape=straight": {
"model": "minecraft:block/bamboo_mosaic_stairs"
},
"facing=east,half=top,shape=inner_left": {
"model": "minecraft:block/bamboo_mosaic_stairs_inner",
"uvlock": true,
"x": 180
},
"facing=east,half=top,shape=inner_right": {
"model": "minecraft:block/bamboo_mosaic_stairs_inner",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=east,half=top,shape=outer_left": {
"model": "minecraft:block/bamboo_mosaic_stairs_outer",
"uvlock": true,
"x": 180
},
"facing=east,half=top,shape=outer_right": {
"model": "minecraft:block/bamboo_mosaic_stairs_outer",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=east,half=top,shape=straight": {
"model": "minecraft:block/bamboo_mosaic_stairs",
"uvlock": true,
"x": 180
},
"facing=north,half=bottom,shape=inner_left": {
"model": "minecraft:block/bamboo_mosaic_stairs_inner",
"uvlock": true,
"y": 180
},
"facing=north,half=bottom,shape=inner_right": {
"model": "minecraft:block/bamboo_mosaic_stairs_inner",
"uvlock": true,
"y": 270
},
"facing=north,half=bottom,shape=outer_left": {
"model": "minecraft:block/bamboo_mosaic_stairs_outer",
"uvlock": true,
"y": 180
},
"facing=north,half=bottom,shape=outer_right": {
"model": "minecraft:block/bamboo_mosaic_stairs_outer",
"uvlock": true,
"y": 270
},
"facing=north,half=bottom,shape=straight": {
"model": "minecraft:block/bamboo_mosaic_stairs",
"uvlock": true,
"y": 270
},
"facing=north,half=top,shape=inner_left": {
"model": "minecraft:block/bamboo_mosaic_stairs_inner",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=north,half=top,shape=inner_right": {
"model": "minecraft:block/bamboo_mosaic_stairs_inner",
"uvlock": true,
"x": 180
},
"facing=north,half=top,shape=outer_left": {
"model": "minecraft:block/bamboo_mosaic_stairs_outer",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=north,half=top,shape=outer_right": {
"model": "minecraft:block/bamboo_mosaic_stairs_outer",
"uvlock": true,
"x": 180
},
"facing=north,half=top,shape=straight": {
"model": "minecraft:block/bamboo_mosaic_stairs",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=south,half=bottom,shape=inner_left": {
"model": "minecraft:block/bamboo_mosaic_stairs_inner"
},
"facing=south,half=bottom,shape=inner_right": {
"model": "minecraft:block/bamboo_mosaic_stairs_inner",
"uvlock": true,
"y": 90
},
"facing=south,half=bottom,shape=outer_left": {
"model": "minecraft:block/bamboo_mosaic_stairs_outer"
},
"facing=south,half=bottom,shape=outer_right": {
"model": "minecraft:block/bamboo_mosaic_stairs_outer",
"uvlock": true,
"y": 90
},
"facing=south,half=bottom,shape=straight": {
"model": "minecraft:block/bamboo_mosaic_stairs",
"uvlock": true,
"y": 90
},
"facing=south,half=top,shape=inner_left": {
"model": "minecraft:block/bamboo_mosaic_stairs_inner",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=south,half=top,shape=inner_right": {
"model": "minecraft:block/bamboo_mosaic_stairs_inner",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=south,half=top,shape=outer_left": {
"model": "minecraft:block/bamboo_mosaic_stairs_outer",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=south,half=top,shape=outer_right": {
"model": "minecraft:block/bamboo_mosaic_stairs_outer",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=south,half=top,shape=straight": {
"model": "minecraft:block/bamboo_mosaic_stairs",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=west,half=bottom,shape=inner_left": {
"model": "minecraft:block/bamboo_mosaic_stairs_inner",
"uvlock": true,
"y": 90
},
"facing=west,half=bottom,shape=inner_right": {
"model": "minecraft:block/bamboo_mosaic_stairs_inner",
"uvlock": true,
"y": 180
},
"facing=west,half=bottom,shape=outer_left": {
"model": "minecraft:block/bamboo_mosaic_stairs_outer",
"uvlock": true,
"y": 90
},
"facing=west,half=bottom,shape=outer_right": {
"model": "minecraft:block/bamboo_mosaic_stairs_outer",
"uvlock": true,
"y": 180
},
"facing=west,half=bottom,shape=straight": {
"model": "minecraft:block/bamboo_mosaic_stairs",
"uvlock": true,
"y": 180
},
"facing=west,half=top,shape=inner_left": {
"model": "minecraft:block/bamboo_mosaic_stairs_inner",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=west,half=top,shape=inner_right": {
"model": "minecraft:block/bamboo_mosaic_stairs_inner",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=west,half=top,shape=outer_left": {
"model": "minecraft:block/bamboo_mosaic_stairs_outer",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=west,half=top,shape=outer_right": {
"model": "minecraft:block/bamboo_mosaic_stairs_outer",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=west,half=top,shape=straight": {
"model": "minecraft:block/bamboo_mosaic_stairs",
"uvlock": true,
"x": 180,
"y": 180
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/bamboo_planks"
}
}
}
@@ -0,0 +1,10 @@
{
"variants": {
"powered=false": {
"model": "minecraft:block/bamboo_pressure_plate"
},
"powered=true": {
"model": "minecraft:block/bamboo_pressure_plate_down"
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/bamboo_sapling"
}
}
}
@@ -0,0 +1,402 @@
{
"multipart": [
{
"apply": {
"model": "minecraft:block/bamboo_shelf"
},
"when": {
"facing": "north"
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf",
"y": 90
},
"when": {
"facing": "east"
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf",
"y": 180
},
"when": {
"facing": "south"
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf",
"y": 270
},
"when": {
"facing": "west"
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_unpowered"
},
"when": {
"AND": [
{
"facing": "north"
},
{
"powered": "false"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_unpowered",
"y": 90
},
"when": {
"AND": [
{
"facing": "east"
},
{
"powered": "false"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_unpowered",
"y": 180
},
"when": {
"AND": [
{
"facing": "south"
},
{
"powered": "false"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_unpowered",
"y": 270
},
"when": {
"AND": [
{
"facing": "west"
},
{
"powered": "false"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_unconnected"
},
"when": {
"AND": [
{
"facing": "north"
},
{
"powered": "true"
},
{
"side_chain": "unconnected"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_unconnected",
"y": 90
},
"when": {
"AND": [
{
"facing": "east"
},
{
"powered": "true"
},
{
"side_chain": "unconnected"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_unconnected",
"y": 180
},
"when": {
"AND": [
{
"facing": "south"
},
{
"powered": "true"
},
{
"side_chain": "unconnected"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_unconnected",
"y": 270
},
"when": {
"AND": [
{
"facing": "west"
},
{
"powered": "true"
},
{
"side_chain": "unconnected"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_left"
},
"when": {
"AND": [
{
"facing": "north"
},
{
"powered": "true"
},
{
"side_chain": "left"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_left",
"y": 90
},
"when": {
"AND": [
{
"facing": "east"
},
{
"powered": "true"
},
{
"side_chain": "left"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_left",
"y": 180
},
"when": {
"AND": [
{
"facing": "south"
},
{
"powered": "true"
},
{
"side_chain": "left"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_left",
"y": 270
},
"when": {
"AND": [
{
"facing": "west"
},
{
"powered": "true"
},
{
"side_chain": "left"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_center"
},
"when": {
"AND": [
{
"facing": "north"
},
{
"powered": "true"
},
{
"side_chain": "center"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_center",
"y": 90
},
"when": {
"AND": [
{
"facing": "east"
},
{
"powered": "true"
},
{
"side_chain": "center"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_center",
"y": 180
},
"when": {
"AND": [
{
"facing": "south"
},
{
"powered": "true"
},
{
"side_chain": "center"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_center",
"y": 270
},
"when": {
"AND": [
{
"facing": "west"
},
{
"powered": "true"
},
{
"side_chain": "center"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_right"
},
"when": {
"AND": [
{
"facing": "north"
},
{
"powered": "true"
},
{
"side_chain": "right"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_right",
"y": 90
},
"when": {
"AND": [
{
"facing": "east"
},
{
"powered": "true"
},
{
"side_chain": "right"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_right",
"y": 180
},
"when": {
"AND": [
{
"facing": "south"
},
{
"powered": "true"
},
{
"side_chain": "right"
}
]
}
},
{
"apply": {
"model": "minecraft:block/bamboo_shelf_right",
"y": 270
},
"when": {
"AND": [
{
"facing": "west"
},
{
"powered": "true"
},
{
"side_chain": "right"
}
]
}
}
]
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "minecraft:block/bamboo_sign"
}
}
}
@@ -0,0 +1,13 @@
{
"variants": {
"type=bottom": {
"model": "minecraft:block/bamboo_slab"
},
"type=double": {
"model": "minecraft:block/bamboo_planks"
},
"type=top": {
"model": "minecraft:block/bamboo_slab_top"
}
}
}
@@ -0,0 +1,209 @@
{
"variants": {
"facing=east,half=bottom,shape=inner_left": {
"model": "minecraft:block/bamboo_stairs_inner",
"uvlock": true,
"y": 270
},
"facing=east,half=bottom,shape=inner_right": {
"model": "minecraft:block/bamboo_stairs_inner"
},
"facing=east,half=bottom,shape=outer_left": {
"model": "minecraft:block/bamboo_stairs_outer",
"uvlock": true,
"y": 270
},
"facing=east,half=bottom,shape=outer_right": {
"model": "minecraft:block/bamboo_stairs_outer"
},
"facing=east,half=bottom,shape=straight": {
"model": "minecraft:block/bamboo_stairs"
},
"facing=east,half=top,shape=inner_left": {
"model": "minecraft:block/bamboo_stairs_inner",
"uvlock": true,
"x": 180
},
"facing=east,half=top,shape=inner_right": {
"model": "minecraft:block/bamboo_stairs_inner",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=east,half=top,shape=outer_left": {
"model": "minecraft:block/bamboo_stairs_outer",
"uvlock": true,
"x": 180
},
"facing=east,half=top,shape=outer_right": {
"model": "minecraft:block/bamboo_stairs_outer",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=east,half=top,shape=straight": {
"model": "minecraft:block/bamboo_stairs",
"uvlock": true,
"x": 180
},
"facing=north,half=bottom,shape=inner_left": {
"model": "minecraft:block/bamboo_stairs_inner",
"uvlock": true,
"y": 180
},
"facing=north,half=bottom,shape=inner_right": {
"model": "minecraft:block/bamboo_stairs_inner",
"uvlock": true,
"y": 270
},
"facing=north,half=bottom,shape=outer_left": {
"model": "minecraft:block/bamboo_stairs_outer",
"uvlock": true,
"y": 180
},
"facing=north,half=bottom,shape=outer_right": {
"model": "minecraft:block/bamboo_stairs_outer",
"uvlock": true,
"y": 270
},
"facing=north,half=bottom,shape=straight": {
"model": "minecraft:block/bamboo_stairs",
"uvlock": true,
"y": 270
},
"facing=north,half=top,shape=inner_left": {
"model": "minecraft:block/bamboo_stairs_inner",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=north,half=top,shape=inner_right": {
"model": "minecraft:block/bamboo_stairs_inner",
"uvlock": true,
"x": 180
},
"facing=north,half=top,shape=outer_left": {
"model": "minecraft:block/bamboo_stairs_outer",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=north,half=top,shape=outer_right": {
"model": "minecraft:block/bamboo_stairs_outer",
"uvlock": true,
"x": 180
},
"facing=north,half=top,shape=straight": {
"model": "minecraft:block/bamboo_stairs",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=south,half=bottom,shape=inner_left": {
"model": "minecraft:block/bamboo_stairs_inner"
},
"facing=south,half=bottom,shape=inner_right": {
"model": "minecraft:block/bamboo_stairs_inner",
"uvlock": true,
"y": 90
},
"facing=south,half=bottom,shape=outer_left": {
"model": "minecraft:block/bamboo_stairs_outer"
},
"facing=south,half=bottom,shape=outer_right": {
"model": "minecraft:block/bamboo_stairs_outer",
"uvlock": true,
"y": 90
},
"facing=south,half=bottom,shape=straight": {
"model": "minecraft:block/bamboo_stairs",
"uvlock": true,
"y": 90
},
"facing=south,half=top,shape=inner_left": {
"model": "minecraft:block/bamboo_stairs_inner",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=south,half=top,shape=inner_right": {
"model": "minecraft:block/bamboo_stairs_inner",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=south,half=top,shape=outer_left": {
"model": "minecraft:block/bamboo_stairs_outer",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=south,half=top,shape=outer_right": {
"model": "minecraft:block/bamboo_stairs_outer",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=south,half=top,shape=straight": {
"model": "minecraft:block/bamboo_stairs",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=west,half=bottom,shape=inner_left": {
"model": "minecraft:block/bamboo_stairs_inner",
"uvlock": true,
"y": 90
},
"facing=west,half=bottom,shape=inner_right": {
"model": "minecraft:block/bamboo_stairs_inner",
"uvlock": true,
"y": 180
},
"facing=west,half=bottom,shape=outer_left": {
"model": "minecraft:block/bamboo_stairs_outer",
"uvlock": true,
"y": 90
},
"facing=west,half=bottom,shape=outer_right": {
"model": "minecraft:block/bamboo_stairs_outer",
"uvlock": true,
"y": 180
},
"facing=west,half=bottom,shape=straight": {
"model": "minecraft:block/bamboo_stairs",
"uvlock": true,
"y": 180
},
"facing=west,half=top,shape=inner_left": {
"model": "minecraft:block/bamboo_stairs_inner",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=west,half=top,shape=inner_right": {
"model": "minecraft:block/bamboo_stairs_inner",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=west,half=top,shape=outer_left": {
"model": "minecraft:block/bamboo_stairs_outer",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=west,half=top,shape=outer_right": {
"model": "minecraft:block/bamboo_stairs_outer",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=west,half=top,shape=straight": {
"model": "minecraft:block/bamboo_stairs",
"uvlock": true,
"x": 180,
"y": 180
}
}
}
@@ -0,0 +1,68 @@
{
"variants": {
"facing=east,half=bottom,open=false": {
"model": "minecraft:block/bamboo_trapdoor_bottom",
"y": 90
},
"facing=east,half=bottom,open=true": {
"model": "minecraft:block/bamboo_trapdoor_open",
"y": 90
},
"facing=east,half=top,open=false": {
"model": "minecraft:block/bamboo_trapdoor_top",
"y": 90
},
"facing=east,half=top,open=true": {
"model": "minecraft:block/bamboo_trapdoor_open",
"x": 180,
"y": 270
},
"facing=north,half=bottom,open=false": {
"model": "minecraft:block/bamboo_trapdoor_bottom"
},
"facing=north,half=bottom,open=true": {
"model": "minecraft:block/bamboo_trapdoor_open"
},
"facing=north,half=top,open=false": {
"model": "minecraft:block/bamboo_trapdoor_top"
},
"facing=north,half=top,open=true": {
"model": "minecraft:block/bamboo_trapdoor_open",
"x": 180,
"y": 180
},
"facing=south,half=bottom,open=false": {
"model": "minecraft:block/bamboo_trapdoor_bottom",
"y": 180
},
"facing=south,half=bottom,open=true": {
"model": "minecraft:block/bamboo_trapdoor_open",
"y": 180
},
"facing=south,half=top,open=false": {
"model": "minecraft:block/bamboo_trapdoor_top",
"y": 180
},
"facing=south,half=top,open=true": {
"model": "minecraft:block/bamboo_trapdoor_open",
"x": 180
},
"facing=west,half=bottom,open=false": {
"model": "minecraft:block/bamboo_trapdoor_bottom",
"y": 270
},
"facing=west,half=bottom,open=true": {
"model": "minecraft:block/bamboo_trapdoor_open",
"y": 270
},
"facing=west,half=top,open=false": {
"model": "minecraft:block/bamboo_trapdoor_top",
"y": 270
},
"facing=west,half=top,open=true": {
"model": "minecraft:block/bamboo_trapdoor_open",
"x": 180,
"y": 90
}
}
}
Loaded 100 of 10451 files, more files were not shown because too many files have changed in this diff. Show more