From 8a0801b2ab3a50bfcc884df1e8cff3c625c27adc Mon Sep 17 00:00:00 2001 From: aaron <> Date: Sat, 8 Mar 2025 20:28:16 +0800 Subject: [PATCH] first commit --- .gitignore | 73 +++++++ README.md | 69 +++++++ babel.config.js | 5 + package.json | 39 ++++ public/index.html | 12 ++ src/App.vue | 24 +++ src/assets/logo.png | Bin 0 -> 4407 bytes src/assets/sub_logo.png | Bin 0 -> 4566 bytes src/layouts/AdminLayout.vue | 141 +++++++++++++ src/main.js | 14 ++ src/router/index.js | 54 +++++ src/store/index.js | 52 +++++ src/views/Dashboard.vue | 145 ++++++++++++++ src/views/Login.vue | 280 ++++++++++++++++++++++++++ src/views/NotFound.vue | 31 +++ src/views/Settings.vue | 253 ++++++++++++++++++++++++ src/views/User.vue | 383 ++++++++++++++++++++++++++++++++++++ webpack.config.js | 54 +++++ 18 files changed, 1629 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 babel.config.js create mode 100644 package.json create mode 100644 public/index.html create mode 100644 src/App.vue create mode 100644 src/assets/logo.png create mode 100644 src/assets/sub_logo.png create mode 100644 src/layouts/AdminLayout.vue create mode 100644 src/main.js create mode 100644 src/router/index.js create mode 100644 src/store/index.js create mode 100644 src/views/Dashboard.vue create mode 100644 src/views/Login.vue create mode 100644 src/views/NotFound.vue create mode 100644 src/views/Settings.vue create mode 100644 src/views/User.vue create mode 100644 webpack.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2a867d2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,73 @@ +# 依赖包 +/node_modules +/.pnp +.pnp.js + +# 构建输出 +/dist +/build + +# 测试覆盖率 +/coverage + +# 本地环境文件 +.env.local +.env.*.local + +# 日志文件 +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +logs +*.log + +# 编辑器目录和文件 +.idea +.vscode/* +!.vscode/extensions.json +!.vscode/settings.json +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +.DS_Store +Thumbs.db + +# 缓存文件 +.cache +.npm +.eslintcache +.stylelintcache +.temp +.cache-loader + +# 临时文件 +.tmp +temp +tmp + +# 打包文件 +*.tgz +*.tar.gz +*.zip + +# 自动生成的文件 +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +desktop.ini + +# 本地配置文件 +.env +.env.development +.env.test +.env.production + +# 其他 +.history +.sass-cache \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..368cd4c --- /dev/null +++ b/README.md @@ -0,0 +1,69 @@ +# 蜂快·运营商平台 + +基于Vue 3和Ant Design Vue的蜂快·运营商平台。 + +## 功能特点 + +- 基于Vue 3、Vuex 4和Vue Router 4 +- 使用Ant Design Vue 3作为UI组件库 +- 响应式布局,适配不同屏幕尺寸 +- 包含常见的后台功能模块: + - 用户管理 + - 系统设置 + - 仪表盘数据展示 + +## 开发环境 + +- Node.js >= 18.0.0 +- npm >= 8.6.0 + +## 安装与运行 + +1. 安装依赖 + +```bash +npm install +``` + +2. 开发模式运行 + +```bash +npm run dev +``` + +3. 构建生产版本 + +```bash +npm run build +``` + +## 项目结构 + +``` +├── public/ # 静态资源 +├── src/ # 源代码 +│ ├── assets/ # 资源文件 +│ ├── components/ # 公共组件 +│ ├── layouts/ # 布局组件 +│ ├── router/ # 路由配置 +│ ├── store/ # Vuex存储 +│ ├── utils/ # 工具函数 +│ ├── views/ # 页面组件 +│ ├── App.vue # 根组件 +│ └── main.js # 入口文件 +├── .babelrc # Babel配置 +├── package.json # 项目依赖 +├── webpack.config.js # Webpack配置 +└── README.md # 项目说明 +``` + +## 登录信息 + +默认用户名和密码: + +- 用户名:admin +- 密码:admin123 + +## 许可证 + +ISC \ No newline at end of file diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..cdefadf --- /dev/null +++ b/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + '@babel/preset-env' + ] +}; \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..00ccda2 --- /dev/null +++ b/package.json @@ -0,0 +1,39 @@ +{ + "name": "partner-admin", + "version": "1.0.0", + "description": "基于Ant Design Vue的蜂快·运营商平台", + "main": "index.js", + "scripts": { + "dev": "webpack serve --mode development", + "build": "webpack --mode production", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "vue", + "ant-design-vue", + "admin", + "dashboard" + ], + "author": "", + "license": "ISC", + "dependencies": { + "ant-design-vue": "^3.0.0", + "axios": "^1.6.0", + "vue": "^3.0.0", + "vue-router": "^4.0.0", + "vuex": "^4.0.0" + }, + "devDependencies": { + "@babel/core": "^7.0.0", + "@babel/preset-env": "^7.0.0", + "@vue/compiler-sfc": "^3.0.0", + "babel-loader": "^10.0.0", + "css-loader": "^7.1.2", + "html-webpack-plugin": "^5.0.0", + "style-loader": "^4.0.0", + "vue-loader": "^17.0.0", + "webpack": "^5.0.0", + "webpack-cli": "^6.0.1", + "webpack-dev-server": "^5.2.0" + } +} diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..a5da4fa --- /dev/null +++ b/public/index.html @@ -0,0 +1,12 @@ + + + + + + 蜂快·运营商平台 + + + +
+ + \ No newline at end of file diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..6b82631 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d77e852b7f8a06703e323928a84a22583e5d7e58 GIT binary patch literal 4407 zcmV-75yPx#1am@3R0s$N2z&@+hyVZ(;Ymb6RCt{2oq2p*)pf_e@6DN6; zykU%sZEO=DKx{C?P(zxQ5bE%ufz*&s3+;!dG*Aj9O$cU--IgUGAt9vf#5n9=z-->| zisfKyx8%__n&tM7GlQhjdrxmhGb0)JeLnXO>E3tmxo7S>_uRAG2id~{;BBBCH~>5Z zoDaCOIA$ss4_ptt4zvP|z*?YiIEhLX6M@5kN-9y{Jzx=_4-;+qz|FuB2GXa1dxnXw zv~WGflSq^huns87F+XkVn3;8jQ3fzVDWD?~gpe6_O=)iSA*d|?5azIl?@Hg0- zkOB??)3Qj54%~r=Ej#qo1CA`xlTj1`uVJ6r2gu$kx*mwwq$3P`I~zo3+2}M5FK{EU z0w_Qx(T+^I5RuO%eQ4MOECxC0MF3$l$n@KwY1{{|A^6rzP>@>Ofw+WOLDFw{x2)2c89HA}ekM@PB>k zeaMD61vmzIJ9I>IX##cuJAi!%LjgR%Q@~Q>4O#>IS9Ygybf5}op;um)151EM5N29w z3o%3tY(+%Xcw{q9Y<`b2d^-DxL|@&z0b!us&9rX`A}76s22qyFNgNHBgMB^MZuuP| zM!rHED}ZK(##Ey>AO>szN^>`rk&EvE-3)#8euk)LL4&#vfl0ZV&`5&@e3$fPu~B&t zn2j(txo#V>$$sgu6giw^QYMFh(~-l_{~FZ4hUn2>8dL%Y$t;r-Tk`# z{6-AcksT%{%Ch)4I`FUb7f(IF{4CFJL|`8FjXdd=r|3QPdJy|X-};U8Hwk>&hb{Zvw$$FefR5rS*UK9dvW*rc&n(qC4G zfKgeQ=b6{=K|F@DOMmuvcNF2jyXK)}Mnq&uX z!e^*U!DislxGMpL4-2l#Qkgj0IbCbGro z(ZKykn69lcGz~7S@pIY9e&$zsaXCOQ^r9E#*``u2>LOOz!sf%xJn^*R;m4q<**47z zcpCT);?&J3vcc%-h#kRJh?l0pX;mJ6w4|7sW8I%qr3doR177Qg&HD8B;F*4qP|*=? z|C!>xbx_}6`|+K?Un1ef8AGNSeGU?fQEaENLx(%gE@9PlKQ2cvDS99ey(m2<_v^nR zi1(CQn%X1Wd@J0$4q`D|kG2ArAuBv1$W+v%2K*foc4bSA8|8QK=*n`IP4(f>`!G4* zgIleVv+Tdk!}Z$GQY@^Od+BZsVzqLg{hg-#o1qj=QqIN)`&H$fGA=2uMb~gt6rj0!fBVKG5nkEZPD^`)a0J3pMOQdRD6GhH zYj|BcE{BH8sWG9{&HTxJd~OpmbcJWeXSj}SX4f8Ax(sR$*qUPuSPxvu5KfRoVYD0g zZ&ENdI(3bEmzA>Og#OYc9D}Vv*xVdt`@wGB+TF>HL)}E8sm)8%!0pgDb&{W&$~@*& z`Q5bPYPfikJ6w^M@UsytJpAmaZt#A-$Z&a62_d6*^fyvxrOQ6;m_8Md0k+=mjC} zT?ebLv)z>f9tT#DC0*MH_mg7a%dw>{wg38Y>ZxyyR)0M+UzPdvoLliU4K=yKt8Tcg zK<$1X6>dhIae7L9#1IdD*5N?%K~kRNg(vvbX;q%#GLsrI{i5ZlpWKGh^^~8#i!A54 z{4JS}_#AeIYg)?Bg^`%Stl%7S?;#nlmw9$KvTEQ>a%8;MG${5t@p&|=%RS6G z#)sFXe_oeB!fJQ8Bf{HzJ85VO)7BNGy*mrLsxcao_>f(LHMGO%eBdP{P&{kMbL(6* zr-<1TeVkO4$8n=Q1bnH9L8aheYnXkFJ-oiNop<(j^8Cj~vPALc*o>HhgI0~~F!~PQ z?=9+&0B-+=C86g&C;`~Vj%sh}u7H*U+sYJcR77Vdhk zAyx76pTPIA=EDW_&nD{!D@GR}ro!V)>J^d&bt@7?xO5O=nOx@Ly3-0-aiSlW+kvxk zcy4TH>x{Dg)n?ZIv5AANw$2_GA{hg>VZO5WAaN^(vdT&b-h!-DGrRy?jWGNMEH=s# zpUw|Y5AeVRWlS6G#-V}caiaT&=jslxOXt){ey&(lN^4h?9ray=BbJXm2|R%8Q4I>`4;AHc@M&u_meBkUW1!3XR-pWp_j>~2zYfKzPM}vlL0h6 z8_u0{pmEX(8W%6OY?Lr0wIFtPWzx(p^N!R^!u1m0Gy1PE*Q;xh>lnGrzLz(p>3- zUn25&qCuUG@bn*{moYA23+BrB)mYyL=RjiE#wS-4dUW3T-WbaLNxz|{@n?^h`(JM1 zg)KpL)rE*3iJQiq@NyOh7(b&&2;DA zrZA8~Hig?#c*YcE1x}XF3Q#@D!{jj@s!H8>T{^l3nx>(YBBr1#9OKi*9(LA+*j?Yv zlkc_B+L>B#viH6+P# zi9uxtqHWlVP!niz;%s||D+(N}I;Du!=TuN$=**})ODQd)ZQlHL0EG*)}8Xv`e2hPgCz*9{I z(cB*4vA0{f{pmWIgM*5eJCN()Qh@_mltyY^t%d|$2Mj7dK#WZ3;2A{h7~<^X@>sj9 zlp=5MTc#I!(TlU2ji#4$apZ*E%sVT_r~6Ht1rc+E{TzW_yn}JtbB9jvC8){hOkVVWYE?aQd)KlNx#hM$jvZ1tLZlSaTvy_r9oq@L21V&>l zQtUt>4qG$hIKOx|$ZxhJ-C!Jv5pC{(4D;GCs-0MMJ>OmpwblyTZHNIa9TWg#P3oF- zMA0@vA?eF#5GLPfRvA_BgJ)WJ^FV(unCc1>ZRyMyvo&82-cxJ2-06?EYe@iCm^S1Gx@xSJ|By?25SRLJ=RWJBWS<`MDcGNq<;mdiN#K}Y4uoj z_@*k=a#NLh8e&ew{5rUV*{#1-lVF zc{6gqXgJQ?iHO@K@xg+l8Ewe?wjy?qE@Yz{iMGkAt@3=z48U%^;I_OG-2GL$Ir zLyI2)7jiNhZbFatvKE_npWaUPR(1q2I?V$f&f(;H5Ubo%S)SXSb{L$1j_8F(pUNA` zL|+2_f?mbmg`CE+o$VDyG%GDW_G!r7|2-KT<1p|o(#$`cgxoAXl-$AwB%)_F#yhzS zIjUzXf3XAOv=1##)17e|hw>vng!wrnCDb6Y`xDF^xrx$_sEQ9F?jXCr@MRc(2w^Ct z4mi`s*bd~1&2@3wgIK3vhvK}r2V+0s0Hms*dl5Z)D)KcTf1Jn=5~RHwv3@louVt#3 zi`Ygcr15Mrwjuib_7tCUA!#Dxk;wjHWZqHa?Klwc`w*h)9<``MzMVCcuUR}s?!W$d zRKkS>#CMUpJieB%zKxX{6C^~^`K!ni2wiq002ovPDHLkV1lYMc4Pnm 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 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 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 @@ + + + + + \ 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 @@ + + + + + \ 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 @@ + + + + + \ 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 @@ + + + + + \ 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