feat: 初始化雄戈商城服务端代码与Webhook自动部署配置

这个提交包含在:
wikiboss
2026-09-12 16:40:24 +08:00
当前提交 e90ec58e61
共有 6438 个文件被更改,包括 1136083 次插入 和 0 次删除

查看文件

@@ -0,0 +1,56 @@
<!DOCTYPE html>
<html>
<head>
<!-- 加载样式及META信息 -->
{include file="common/meta" /}
</head>
<body class="hold-transition {$Think.config.fastadmin.adminskin|default='skin-black-blue'} sidebar-mini {:$Think.cookie.sidebar_collapse?'sidebar-collapse':''} fixed {:$Think.config.fastadmin.multipletab?'multipletab':''} {:$Think.config.fastadmin.multiplenav?'multiplenav':''}" id="tabs">
<div class="wrapper">
<!-- 头部区域 -->
<header id="header" class="main-header">
{if preg_match('/\/admin\/|\/admin\.php|\/admin_d75KABNWt\.php/i', url())}
<div class="alert alert-danger-light text-center" style="margin-bottom:0;border:none;">
{:__('Security tips')}
</div>
{/if}
{include file='common/header' /}
</header>
<!-- 左侧菜单栏 -->
<aside class="main-sidebar">
{include file='common/menu' /}
</aside>
<!-- 主体内容区域 -->
<div class="content-wrapper tab-content tab-addtabs">
{if $fixedmenu}
<div role="tabpanel" class="tab-pane {:$referermenu?'':'active'}" id="con_{$fixedmenu.id}">
<iframe src="{$fixedmenu.url}?addtabs=1" width="100%" height="100%" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling-x="no" scrolling-y="auto" allowtransparency="yes"></iframe>
</div>
{/if}
{if $referermenu}
<div role="tabpanel" class="tab-pane active" id="con_{$referermenu.id}">
<iframe src="{$referermenu.url}?addtabs=1" width="100%" height="100%" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling-x="no" scrolling-y="auto" allowtransparency="yes"></iframe>
</div>
{/if}
</div>
<!-- 底部链接,默认隐藏 -->
<footer class="main-footer hide">
<div class="pull-right hidden-xs">
</div>
<strong>Copyright &copy; 2017-{:date("Y")} <a href="__PUBLIC__">{$site.name}</a>.</strong> All rights reserved.
</footer>
<!-- 右侧控制栏 -->
<div class="control-sidebar-bg"></div>
{include file="common/control" /}
</div>
<!-- 加载JS脚本 -->
{include file="common/script" /}
</body>
</html>

查看文件

@@ -0,0 +1,223 @@
<html lang="zh-CN" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1">
<title>雄戈小酒商城后台登录</title>
<link href="/assets/login/css/app.31d95eba.css?a=3" rel="stylesheet">
<link href="/assets/login/css/chunk-2b82f2e7.d5b819d1.css?a=2" rel="stylesheet">
<link href="/assets/login/css/login.css?a=5" rel="stylesheet">
<link href="/assets/css/sweetalert.css" rel="stylesheet">
<link rel="stylesheet" href="/assets/element-ui-2.15.14/css/index.css">
</head>
<body class="dark-layout">
<div id="app" class="h-100">
<div class="xg-login-e">
<aside class="xg-login-e__brand-panel">
<div class="xg-login-e__brand-inner">
<img
class="xg-login-e__logo"
src="/uploads/demo/xiongge/xiongge-brand-emblem.png"
alt="雄戈小酒"
>
<div class="xg-login-e__gold-rule" aria-hidden="true"></div>
<h1 class="xg-login-e__title">雄戈小酒</h1>
<p class="xg-login-e__subtitle">商城后台</p>
<p class="xg-login-e__tagline">传承匠心酿造 · 数字赋能酒业运营</p>
<div class="xg-login-e__culture-row">
<div class="xg-login-e__culture-item">
<span class="xg-login-e__culture-key">匠心</span>
<span class="xg-login-e__culture-val">品质为先</span>
</div>
<div class="xg-login-e__culture-item">
<span class="xg-login-e__culture-key">臻酿</span>
<span class="xg-login-e__culture-val">一男人的朋友</span>
</div>
<div class="xg-login-e__culture-item">
<span class="xg-login-e__culture-key">智管</span>
<span class="xg-login-e__culture-val">高效运营</span>
</div>
</div>
<p class="xg-login-e__motto">— 一男人的朋友一 —</p>
</div>
</aside>
<main class="xg-login-e__form-panel">
<div class="xg-login-e__card-wrap">
<div class="xg-login-e__card">
<div class="xg-login-e__card-head">
<img
class="xg-login-e__card-logo"
src="/uploads/demo/xiongge/xiongge-brand-emblem.png"
alt="雄戈小酒"
>
<h2 class="xg-login-e__card-title">欢迎登录</h2>
<p class="xg-login-e__card-desc">雄戈小酒商城后台管理系统</p>
</div>
{:token()}
<div role="group" class="form-group">
<label for="login-email">用户名</label>
<input
id="login-email"
v-model="formData.username"
type="text"
autocomplete="username"
placeholder="请输入用户名"
class="form-control"
>
</div>
<fieldset class="form-group">
<label for="login-password">密码</label>
<input
id="login-password"
name="login-password"
type="password"
autocomplete="current-password"
placeholder="请输入密码"
v-model="formData.password"
class="form-control-merge form-control"
>
</fieldset>
{if $Think.config.fastadmin.login_captcha}
<fieldset class="form-group">
<label for="login-verify">验证码</label>
<div class="verify-row">
<input
id="login-verify"
name="login-verify"
type="text"
autocomplete="off"
placeholder="请输入验证码"
v-model="formData.verify"
class="form-control-merge form-control"
>
<div class="verify">
<img
id="verify-img"
src="{:rtrim('__PUBLIC__', '/')}/captcha"
width="120"
height="46"
alt="验证码"
onclick="this.src = '{:rtrim('__PUBLIC__', '/')}/captcha&r=' + Math.random();"
>
</div>
</div>
</fieldset>
{/if}
<fieldset class="form-group">
<div class="custom-control custom-checkbox">
<input id="keeplogin" type="checkbox" name="keeplogin" class="custom-control-input" checked value="1">
<label for="keeplogin" class="custom-control-label">保持会话(24 小时内免重复登录)</label>
</div>
</fieldset>
<button type="button" @click="handleLoginAdmin" class="btn btn-primary btn-block">登 录 后 台</button>
<div class="xg-login-e__footer">雄戈小酒 · 一男人的朋友一</div>
</div>
</div>
</main>
</div>
</div>
<script src="/assets/js/jquery-2.1.1.min.js"></script>
<script src="/assets/element-ui-2.15.14/js/vue.js"></script>
<script src="/assets/element-ui-2.15.14/js/index.js"></script>
<script src="/assets/js/sweetalert.min.js"></script>
<script>
var vue = new Vue({
el: '#app',
data: {
formData: {
username: '',
password: '',
verify: ''
},
loginLoading: ''
},
methods: {
handleLoginAdmin() {
let formData = this.formData;
if (formData.username === '') {
this._sweetMsg({ type: 'warning', title: '请您输入用户名' });
return false;
}
if (formData.password === '') {
this._sweetMsg({ type: 'warning', title: '请您输入密码' });
return false;
}
$.ajax({
type: 'POST',
url: '{:url("login")}',
dataType: 'json',
data: {
username: formData.username,
password: formData.password,
captcha: formData.verify,
'__token__': $('input[name="__token__"]').val(),
keeplogin: $("input[type='checkbox']").prop("checked") ? 1 : 0
},
beforeSend: () => {
this.loginLoading = this.$loading({
lock: true,
text: '正在登录中...',
spinner: 'el-icon-loading',
background: 'rgba(6, 24, 51, 0.35)'
});
},
complete: (xhr) => {
var token = xhr.getResponseHeader('__token__');
if (token) {
$('input[name="__token__"]').val(token);
}
},
success: res => {
this.loginLoading.close();
if (res.data && res.data.token) {
$('input[name="__token__"]').val(res.data.token);
}
if (res.code === 0) {
{if $Think.config.fastadmin.login_captcha}
$('#verify-img').trigger('click');
{/if}
this._sweetMsg({ type: 'error', title: res.msg });
return false;
}
this._sweetMsg({ type: 'success', title: res.msg });
$('.sa-button-container button.confirm').click(() => {
window.location.href = res.url;
});
setTimeout(() => {
window.location.href = res.url;
}, 2500);
},
error: () => {
this.loginLoading.close();
this._sweetMsg({ type: 'error', title: '网络异常,请稍后重试' });
}
});
},
_sweetMsg(obj) {
swal({
title: obj.title || '',
text: obj.content || '温馨提示',
type: obj.type || 'success',
confirmButtonColor: '#0A2463',
confirmButtonText: '确定'
});
}
}
});
</script>
</body>
</html>