&hb{Zvw$$FefR5rS*UK9dvW*rc&n(qC4G
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
literal 0
HcmV?d00001
diff --git a/src/assets/sub_logo.png b/src/assets/sub_logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..ca7f4dfe21fe62ca66f59e8d03c61b72bdd54bee
GIT binary patch
literal 4566
zcmV;{5h?D8P)Px#1am@3R0s$N2z&@+hyVZ)fJsC_RCt`loq3R4MIFaKvpbt?Hra$^0#fP^EU
z+=$2(C
@$I%Gp04EsbcL8VDXnQpF^Sua611e37YZTDhM0*dzz=sXA`x-FSD8CPQpqT*~
z*bVrzbMNcb-)sowg7tO=b~MVz6l{MOun|y-%7%ffShK_oLU`8L|5c#vC!O+VX^xly
zeg*8`WFHo81HRoryVHT`M)}E%JV8$dK5mo`0jrwnxF|tybtP5aixAbs
z0)13~9^`@RMVC|leu1`IIpzOtU>q8s0yZ6iel*(D_Y$@wsE~f28#w*FH4=kTSl1~Z
z0G2h=aZJ$DfJxE!A>fhf=k=ZTU5NO27kCw$+inZ&X_R*Yk2-BMDu|e$Q~jNK;4Q`_
z1=?=wl>evBF=(^`A8WD?5AUh(I{<$)>Rk(bull)-^xVgI!zu3sK99Vk&N|1qgHv7x
z&PAAA9KN=r}}p+V${{b6yS11?>r|ew-1HP)t
zE+u(rOT1N(=j%k&Aq!my;aS)R*u}Y5K_u2K_?%`H!rcI_L!Lq70^rw9`+DGs_n4FC
zF_w4L_ZbL>>}Y0CO=3~?Z$_OA1l>-SSVE(ER$(i`L2m^9SuHyrIF>YVXoISv%GLpn
zG5TL>lZT3e3c?eV*df
z(FWm`2m`TjA8;k<1+blx>kk<#|+QV(YGVAzXSSu!&P1ze|sc
zzp1|OMs{96RI9@fj=naLncqN!TeFlnAR3LLzJ?4&f}UMnHo>>O+{{1D<})zIVX
z1Ny6XC(cWK|gu<(N!%ylg11Ckk)TBjV(Fh*9h`RU
zRjT(cB_U7^%b(j5)%S?9)UUZ7bL+iuXJ5STw%ql+UNOx-kjc71~2uhwa3U=4yuH
z*-6^9xsFpWexK8Ty;!q`;|55mK7;U5v<^5#La?3>I(Qr`4vXm@4
z@d*NC+Oosy#(0L`OUR~)gD3jlZaJs^@fMF2-*r-v>?XgX~1^)j{F$2
zfeV2bocosl^gWVE^^CQ*o$`Qgv2|PhYhjA+3%1hXm9Rf
z-MAe;(x+7p?UN3eju^7_1j^O~t_eh?IZPiy&}Dq02oI}QcL-VpbO1*p(Y1NNr%8x;
z5b>1E1Wq-6V>IwX{1tDhN^xYX)?)N9%_(0+)^%9MpGYqnc>wl;d68nd3>#p-lQ&6A
zgegwFm@wP117~_3J&Xtb!beNYE0M_M(Sbv24zm)OJjq?nNGG
zUHpd)#)syT!^niRASsgDMfWPey}*wVLXNQ#(a&_A>{#F=;9JHxtO*N5lqX7SaUPGL
zUo^_{l8mh1nS>wE=>UF|(_bxUW6v8~EX6vo4aYue2T8U^2wF3%J|utsmKyCx9D%cF
zqFjs+<~Zy~+e#9{OD~2BB9`08PTZr2L8ys2U;#q#8gsByEiI!jaJRA8V~5&C;bu;`
z71+tkRas<|4bhmNz6f+8k!S3^t?F3%crW<|`Doy`)xR32@(~a-i2m0}HX;@{OD8r_
z1W!UcFhSkxMOJ7RS>3FgWFcHgmT;~`63u^3cGb^9IDQOEzYoOPiT$z%utVrEtn4%p
z@uuNyR~W0vEF;I@T#?lhxfHMhuL--65x8B~FExF#(&Pd$5Bk
z0psvRwUr0$aY69C9A_a?Y7a(^s4Kuz(f3yDx$P%yc;;o}4LbL_fb+2p&aHueU|4~
zfG48wUOsiO;3tyZy#cie+Vk;Nfai^J&(|I2lxPeflXksvZ#2Hw!80-~v|&rIeni3s
zc;nBrGtR@0Pc(xP!X)P)<2np^?yV3trq&+J@nviuYIqorQ^iE1S4<#i%fm3cdU-gh
zdRe#}_-6EdG})Bb3JDQ;i*YjfJ7vb;=Rx03)>`*|rv(wc^Qq6!I||``8Y}SkI9eEm
z9p&vOou}<_Xm5L68>0TLX&j1pb8bTxPoWLPWo*I=#*DXm<2(<|&4S4HTxN|zbEkH)
zy8lv=u(8KMM&s+qc_`uUF|^Qvh+j)e+Oo1#u9ZVcZKEf+tO9kyf9~tyhq!9JTi2
zS)3#g-g!utoQ0W48fJ_h#2EBAgC^*)WG5`Pjy-~Y7I@6L*M@9b(A;7eaYNNhoFM8=
zJ@68M@(9d=7bVmS!;_?z%P~fa)BjL`I>RKY+c0TkHb#&n9*55KZG~-PW5#pogqLD*
z_drzd;~PcRiu({Tx{B_2uskgBBzR+=j|6rs?1F^pHF}Wju0{x2V=w&BI-~YV!nXlx`ReDBJ;!4OvJ*QH;91yNaR-q;3c^!e!u$3JI-^&Y$)2)P
zMp8mw#Sfk4sU+dvG<^Nh(qV_lKd0h((rzScB4X}SWI{D&IOWffyxg7168#FqkjwL)
z1e}Z?`p(0i*vCPDL~iF&EXO%E_9o&Rz5HUL1fQ2~&wXidobveO
zpgx2sW3{9o;aFC_iN;88{ResHTIzYvUu5f5p34!$on|eBJEPB2vA5zqK-RzQNz)+h
zJsmpZUTs0Ll=R@IB8fsChdl++ku|3cKHkopwvAu~*{GGZSYm>@KRpM7`q
z`FXNjzMW#hpuFtGW}x$+A%8DufTusdM}BzTI>Kxd
zkfn?e^ASkc*)vFrVmb0)-j0e!VQ~w~=nLF;9R67%o_}?^)20{M&loU-95JAE!vo10
zx*8Sa;2rNwz;%)EzIFd};3cQsQnCc-(-6H4Nkw7
z-mAq_IBUbY7uWH;D7#`W!Y9e@3w(eqLC-+mS)Nflgs5^Jw#Lu>UO<|=)`GP)Zjdz5
zdFoG|hhs}@b!H)n6m3KHhibf!eNKtDu!73*9`fuu4lsk-`!6XW9O77#17PCoei9$B
zzVhPi0qsfbFeM~!+iG*MQGZip;p)2D7O5A(L!kTZ
zr#`=W3rP-gd}--)zEP)wBu{xb)oBx-%`%O79p<-MGR
zRroLPb!xlTI`9Jo9oVW(KfX@aOE%eD*NyXcJ#o7TTNf)M#H3L{5~ei5xpUg+IT%T5
zZxmhF5wlwPCmOB5cgZeZ9c}dV`8=QZzDC&)$dVQY(V+-a1p+}@6L7u$XUe}XY9k?
z`&R<4HtN4lv2y@De8U;{%M?G0yB=KU{GN3{JctDDG3q}}n$R9J>I`6ernbSR2OVrF
zIsN`Du9RoEd8;?*vzwC5dA+N8e=_wOnARyp0a_xo8~w)#>0VNmcf8hq*qrfAr%mA8
z+8;d`;TjKRS`>pf?vUL$lE^##)ia#;$6l~El5o@YkbR>X&tTg^o>bO3(G}niNXl)D
zIfzZR3i1isGZ=zVHJkL7_F=@RS;EM>rnCsOjMb2%4ZgbM89QFU;vRe-=)Fc+88K8E
zC1{TcEM?>gdKC5Njm&h)W68HWHgmck`x&f5j=*-W-ijEA@%&Fh&N!I|K0y~*y;f8&
zxYusO=Z4#p{eLYzh$`a|&m-#lTVy9c7#83!M(aeUGQ|Qa8r=w?>BVyhcKT-#cnfg}
zw(j2y#$z*vLG1U`hOIv@A)TkbC-%973!QOz9w|$YUySJCItBSi#He=<&mWEW6)pX0
zM_>!YFw$0Ok(||&j6PprWVa(d>5Tm=M%_J-2&b;Qn%Yslc}BZI?Eh6#1lK#`Zsf?{
zJWK?xz}8(CV@udAustVtkjz~xqEB14h();DAiIF9XP)DXeLtga50S0&h;coJ5UBM-
z-6WBl__B6HTlk65_5nujw4G6i2f`Zr3`GCF2@!!0BD%NtoVB8zM>}m-RQuL}fcZ}S
zX0Bdr0_;LIGuPYS)y}he2J82uI#aM+aKnf+i?0?`ZHo@k=dDolx
zgf!QvKTO(4J7I*L=_2FZ#W=%g^L%JC5(8L_h>s$;*=T=RZj1Ub1u+oyZ}cN}!RFNF
zTubo(VNi??#Co^-uxyBzYW!{^m$efe_JqK
zA5!eS^dTYs%McGwYzJ6I&25bQshr-wnCnNR;UGdN;cvKxtABftz{ErNNB{1MZ9v{i
zl72jaZ1!alR1gOANOin7Q2X4HR}jXifA4_*0R-fCiOo+40ssI207*qoM6N<$f{*yj
A6#xJL
literal 0
HcmV?d00001
diff --git a/src/layouts/AdminLayout.vue b/src/layouts/AdminLayout.vue
new file mode 100644
index 0000000..af96641
--- /dev/null
+++ b/src/layouts/AdminLayout.vue
@@ -0,0 +1,141 @@
+
+
+
+
+
+
蜂快·运营商平台
+ 蜂快
+
+
+ $router.push('/dashboard')">
+
+ 仪表盘
+
+ $router.push('/user')">
+
+ 用户管理
+
+ $router.push('/settings')">
+
+ 系统设置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 蜂快·运营商平台 ©2025 Created by Admin
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main.js b/src/main.js
new file mode 100644
index 0000000..b80cb2d
--- /dev/null
+++ b/src/main.js
@@ -0,0 +1,14 @@
+import { createApp } from 'vue';
+import Antd from 'ant-design-vue';
+import App from './App.vue';
+import router from './router';
+import store from './store';
+import 'ant-design-vue/dist/antd.css';
+
+const app = createApp(App);
+
+app.use(Antd);
+app.use(router);
+app.use(store);
+
+app.mount('#app');
\ No newline at end of file
diff --git a/src/router/index.js b/src/router/index.js
new file mode 100644
index 0000000..8c75e87
--- /dev/null
+++ b/src/router/index.js
@@ -0,0 +1,54 @@
+import { createRouter, createWebHistory } from 'vue-router';
+import AdminLayout from '../layouts/AdminLayout.vue';
+
+const routes = [
+ {
+ path: '/',
+ component: AdminLayout,
+ redirect: '/dashboard',
+ children: [
+ {
+ path: 'dashboard',
+ name: 'Dashboard',
+ component: () => import('../views/Dashboard.vue'),
+ meta: { title: '仪表盘', icon: 'dashboard' }
+ },
+ {
+ path: 'user',
+ name: 'User',
+ component: () => import('../views/User.vue'),
+ meta: { title: '用户管理', icon: 'user' }
+ },
+ {
+ path: 'settings',
+ name: 'Settings',
+ component: () => import('../views/Settings.vue'),
+ meta: { title: '系统设置', icon: 'setting' }
+ }
+ ]
+ },
+ {
+ path: '/login',
+ name: 'Login',
+ component: () => import('../views/Login.vue')
+ },
+ {
+ path: '/:pathMatch(.*)*',
+ name: 'NotFound',
+ component: () => import('../views/NotFound.vue')
+ }
+];
+
+const router = createRouter({
+ history: createWebHistory(),
+ routes
+});
+
+// 路由守卫
+router.beforeEach((to, from, next) => {
+ // 这里可以添加身份验证逻辑
+ document.title = to.meta.title ? `${to.meta.title} - 蜂快·运营商平台` : '蜂快·运营商平台';
+ next();
+});
+
+export default router;
\ No newline at end of file
diff --git a/src/store/index.js b/src/store/index.js
new file mode 100644
index 0000000..e39807c
--- /dev/null
+++ b/src/store/index.js
@@ -0,0 +1,52 @@
+import { createStore } from 'vuex';
+
+export default createStore({
+ state: {
+ user: null,
+ token: localStorage.getItem('token') || '',
+ sidebar: {
+ collapsed: false
+ }
+ },
+ mutations: {
+ SET_TOKEN(state, token) {
+ state.token = token;
+ localStorage.setItem('token', token);
+ },
+ CLEAR_TOKEN(state) {
+ state.token = '';
+ localStorage.removeItem('token');
+ },
+ SET_USER(state, user) {
+ state.user = user;
+ },
+ TOGGLE_SIDEBAR(state) {
+ state.sidebar.collapsed = !state.sidebar.collapsed;
+ }
+ },
+ actions: {
+ login({ commit }, userInfo) {
+ // 这里应该有实际的登录API调用
+ return new Promise((resolve) => {
+ // 模拟登录成功
+ const token = 'mock-token-' + Date.now();
+ commit('SET_TOKEN', token);
+ commit('SET_USER', {
+ name: userInfo.username,
+ avatar: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png',
+ roles: ['admin']
+ });
+ resolve();
+ });
+ },
+ logout({ commit }) {
+ commit('CLEAR_TOKEN');
+ commit('SET_USER', null);
+ }
+ },
+ getters: {
+ isAuthenticated: state => !!state.token,
+ userInfo: state => state.user,
+ sidebarCollapsed: state => state.sidebar.collapsed
+ }
+});
\ No newline at end of file
diff --git a/src/views/Dashboard.vue b/src/views/Dashboard.vue
new file mode 100644
index 0000000..2e13454
--- /dev/null
+++ b/src/views/Dashboard.vue
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+ 用户总数
+
+
+
+
+
+
+
+ 订单总数
+
+
+
+
+
+
+
+ 销售额
+
+
+
+
+
+
+
+ 新增会员
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+ {{ item.description }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/Login.vue b/src/views/Login.vue
new file mode 100644
index 0000000..649a9ab
--- /dev/null
+++ b/src/views/Login.vue
@@ -0,0 +1,280 @@
+
+
+
+
+
+

+
蜂快到家
+
+
+
+
+ 高效管理配送
+
+
+
+ 实时监控订单
+
+
+
+ 便捷数据分析
+
+
+
+
+
+
欢迎使用 蜂快·运营商平台
+
请使用您的手机号和密码登录
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 登 录
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/NotFound.vue b/src/views/NotFound.vue
new file mode 100644
index 0000000..9f01718
--- /dev/null
+++ b/src/views/NotFound.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/Settings.vue b/src/views/Settings.vue
new file mode 100644
index 0000000..f0082df
--- /dev/null
+++ b/src/views/Settings.vue
@@ -0,0 +1,253 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存设置
+
+
+
+
+
+
+
+
+ 简单 (至少6位)
+ 中等 (至少8位,包含字母和数字)
+ 强 (至少10位,包含大小写字母、数字和特殊字符)
+
+
+
+
+
+
+
+
+
+ 次
+
+
+
+
+ 分钟
+
+
+
+
+ 分钟
+
+
+
+ 保存设置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存设置
+ 测试连接
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/User.vue b/src/views/User.vue
new file mode 100644
index 0000000..d0e5a90
--- /dev/null
+++ b/src/views/User.vue
@@ -0,0 +1,383 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加用户
+
+
+
+
+
+
+
+
+
+
+ {{ record.status === 'active' ? '正常' : '禁用' }}
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 管理员
+ 普通用户
+ 访客
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/webpack.config.js b/webpack.config.js
new file mode 100644
index 0000000..86f96f3
--- /dev/null
+++ b/webpack.config.js
@@ -0,0 +1,54 @@
+const path = require('path');
+const { VueLoaderPlugin } = require('vue-loader');
+const HtmlWebpackPlugin = require('html-webpack-plugin');
+
+module.exports = {
+ mode: 'development',
+ entry: './src/main.js',
+ output: {
+ path: path.resolve(__dirname, 'dist'),
+ filename: 'bundle.js',
+ publicPath: '/'
+ },
+ module: {
+ rules: [
+ {
+ test: /\.vue$/,
+ loader: 'vue-loader'
+ },
+ {
+ test: /\.js$/,
+ loader: 'babel-loader',
+ exclude: /node_modules/
+ },
+ {
+ test: /\.css$/,
+ use: ['style-loader', 'css-loader']
+ },
+ {
+ test: /\.(png|jpg|gif|svg)$/,
+ type: 'asset/resource'
+ }
+ ]
+ },
+ plugins: [
+ new VueLoaderPlugin(),
+ new HtmlWebpackPlugin({
+ template: './public/index.html'
+ })
+ ],
+ resolve: {
+ extensions: ['.js', '.vue', '.json'],
+ alias: {
+ '@': path.resolve(__dirname, 'src')
+ }
+ },
+ devServer: {
+ static: {
+ directory: path.join(__dirname, 'public'),
+ },
+ historyApiFallback: true,
+ port: 8080,
+ hot: true
+ }
+};
\ No newline at end of file