From b6cc8046dbc4a82e6af95121d281ef10c2eac096 Mon Sep 17 00:00:00 2001 From: hupeng Date: Tue, 7 Jan 2020 23:32:27 +0800 Subject: [PATCH] =?UTF-8?q?yshop1.7=E5=8F=91=E5=B8=83,=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E5=8D=87=E7=B4=9Aeladmin2.4(=E5=89=8D=E7=AB=AF,=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E6=9D=83=E9=99=90,=E4=BB=A3=E7=A0=81=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=99=A8=E7=AD=89=E9=87=8D=E6=9E=84),=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=95=86=E5=93=81=E5=88=86=E7=B1=BB=E7=AD=89=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .babelrc | 17 - .editorconfig | 2 +- .env.development | 8 + .env.production | 5 + .eslintignore | 3 +- .eslintrc.js | 8 +- .gitignore | 11 +- .postcssrc.js | 10 - .travis.yml | 2 +- LICENSE | 4 +- README.md | 6 + babel.config.js | 11 + build/build.js | 67 -- build/check-versions.js | 62 -- build/utils.js | 108 --- build/vue-loader.conf.js | 5 - build/webpack.base.conf.js | 122 --- build/webpack.dev.conf.js | 98 --- build/webpack.prod.conf.js | 188 ----- config/dev.env.js | 9 - config/index.js | 106 --- config/prod.env.js | 5 - debug.log | 1 - index.html | 22 - jest.config.js | 24 + package.json | 146 ++-- plopfile.js | 7 + postcss.config.js | 5 + favicon.ico => public/favicon.ico | Bin public/index.html | 15 + src/App.vue | 2 +- src/api/data.js | 12 +- src/api/generator.js | 9 - src/api/{ => generator}/genConfig.js | 4 +- src/api/generator/generator.js | 33 + src/api/log.js | 8 - src/api/login.js | 9 +- src/api/{redis.js => mnt/app.js} | 22 +- src/api/mnt/connect.js | 17 + src/api/mnt/database.js | 35 + src/api/mnt/deploy.js | 77 ++ src/api/mnt/deployHistory.js | 21 + src/api/mnt/serverDeploy.js | 27 + src/api/monitor/log.js | 22 + src/api/monitor/online.js | 9 + src/api/monitor/server.js | 27 + src/api/monitor/visits.js | 22 + src/api/picture.js | 16 - src/api/{ => system}/code.js | 0 src/api/{ => system}/dept.js | 9 +- src/api/{ => system}/dict.js | 9 + src/api/{ => system}/dictDetail.js | 2 + src/api/{ => system}/job.js | 9 +- src/api/{ => system}/menu.js | 10 +- src/api/{ => system}/role.js | 17 +- src/api/{ => system}/timing.js | 9 +- src/api/{ => system}/user.js | 35 +- src/api/{ => tools}/alipay.js | 0 src/api/{ => tools}/email.js | 0 src/api/{ => tools}/localStorage.js | 11 +- src/api/tools/picture.js | 18 + src/api/{ => tools}/qiniu.js | 17 +- src/api/visits.js | 1 - src/api/yxCache.js | 2 +- src/api/yxExpress.js | 1 - .../{permission.js => yxStoreBargainUser.js} | 14 +- src/api/yxStoreCategory.js | 2 + src/api/yxStoreOrder.js | 18 +- src/api/yxStoreProduct.js | 10 +- src/api/yxStoreSeckill.js | 48 +- src/api/yxSystemConfig.js | 2 +- src/api/yxWechatReply.js | 2 +- src/api/yxWechatTemplate.js | 2 +- src/assets/avatar/avatar.png | Bin 4097 -> 0 bytes src/{ => assets}/icons/index.js | 4 +- src/{ => assets}/icons/svg/Sign.svg | 0 src/{ => assets}/icons/svg/Steve-Jobs.svg | 0 src/{ => assets}/icons/svg/add.svg | 0 src/{ => assets}/icons/svg/alipay.svg | 0 src/{ => assets}/icons/svg/anq.svg | 0 src/assets/icons/svg/app.svg | 1 + src/{ => assets}/icons/svg/article.svg | 0 src/assets/icons/svg/backup.svg | 1 + src/{ => assets}/icons/svg/banner.svg | 0 src/{ => assets}/icons/svg/bargain.svg | 0 src/{ => assets}/icons/svg/button.svg | 0 src/{ => assets}/icons/svg/chain.svg | 0 src/assets/icons/svg/chart.svg | 1 + src/{ => assets}/icons/svg/codeConsole.svg | 0 src/{ => assets}/icons/svg/comment.svg | 0 src/{ => assets}/icons/svg/configure.svg | 0 src/{ => assets}/icons/svg/coupon.svg | 0 src/{ => assets}/icons/svg/coupon2.svg | 0 .../icons/svg/dashboard.svg} | 0 src/assets/icons/svg/database.svg | 1 + src/{ => assets}/icons/svg/date.svg | 0 src/{ => assets}/icons/svg/dengji.svg | 0 src/assets/icons/svg/deploy.svg | 1 + src/{ => assets}/icons/svg/dept.svg | 0 src/{ => assets}/icons/svg/dev.svg | 0 src/{ => assets}/icons/svg/develop.svg | 0 src/{ => assets}/icons/svg/dictionary.svg | 0 src/assets/icons/svg/edit.svg | 1 + src/assets/icons/svg/education.svg | 1 + src/{ => assets}/icons/svg/email.svg | 0 src/{ => assets}/icons/svg/error.svg | 0 src/assets/icons/svg/exit-fullscreen.svg | 1 + src/{ => assets}/icons/svg/express.svg | 0 src/{ => assets}/icons/svg/fenxiao.svg | 0 src/assets/icons/svg/fullscreen.svg | 1 + src/{ => assets}/icons/svg/fwb.svg | 0 src/{ => assets}/icons/svg/github.svg | 0 src/{ => assets}/icons/svg/gonggao.svg | 0 src/{ => assets}/icons/svg/ic-yesterday.svg | 0 src/{ => assets}/icons/svg/icon.svg | 0 src/{ => assets}/icons/svg/image.svg | 0 src/assets/icons/svg/index.svg | 1 + src/assets/icons/svg/international.svg | 1 + src/{ => assets}/icons/svg/ipvisits.svg | 0 src/{ => assets}/icons/svg/java.svg | 0 src/assets/icons/svg/link.svg | 1 + src/{ => assets}/icons/svg/list.svg | 0 src/{ => assets}/icons/svg/lock.svg | 0 src/{ => assets}/icons/svg/log.svg | 0 src/assets/icons/svg/login.svg | 1 + src/{ => assets}/icons/svg/markdown.svg | 0 src/{ => assets}/icons/svg/menu.svg | 0 src/assets/icons/svg/message.svg | 1 + src/assets/icons/svg/mnt.svg | 1 + src/{ => assets}/icons/svg/money.svg | 0 src/{ => assets}/icons/svg/monitor.svg | 0 src/{ => assets}/icons/svg/monthlyview.svg | 0 src/assets/icons/svg/nested.svg | 1 + src/{ => assets}/icons/svg/news.svg | 0 src/{ => assets}/icons/svg/order.svg | 0 src/{ => assets}/icons/svg/password.svg | 0 src/assets/icons/svg/people.svg | 1 + src/{ => assets}/icons/svg/peoples.svg | 0 src/{ => assets}/icons/svg/permission.svg | 0 src/{ => assets}/icons/svg/phone.svg | 0 src/{ => assets}/icons/svg/points.svg | 0 src/{ => assets}/icons/svg/pt.svg | 0 src/{ => assets}/icons/svg/qiniu.svg | 0 src/{ => assets}/icons/svg/redis.svg | 0 src/{ => assets}/icons/svg/reply.svg | 0 src/{ => assets}/icons/svg/role.svg | 0 src/{ => assets}/icons/svg/run.svg | 0 src/{ => assets}/icons/svg/running.svg | 0 src/{ => assets}/icons/svg/search.svg | 0 src/{ => assets}/icons/svg/seckill.svg | 0 src/assets/icons/svg/server.svg | 1 + src/{ => assets}/icons/svg/seven.svg | 0 src/{ => assets}/icons/svg/shop.svg | 0 src/{ => assets}/icons/svg/sign2.svg | 0 src/assets/icons/svg/size.svg | 1 + src/assets/icons/svg/skill.svg | 1 + src/assets/icons/svg/source.svg | 1 + src/{ => assets}/icons/svg/sqlMonitor.svg | 0 src/{ => assets}/icons/svg/swagger.svg | 0 src/{ => assets}/icons/svg/sys-tools.svg | 0 src/{ => assets}/icons/svg/system.svg | 0 src/assets/icons/svg/tab.svg | 1 + src/{ => assets}/icons/svg/task manege.svg | 0 src/{ => assets}/icons/svg/temp.svg | 0 src/assets/icons/svg/theme.svg | 1 + src/{ => assets}/icons/svg/timing.svg | 0 src/{ => assets}/icons/svg/tixian.svg | 0 src/{ => assets}/icons/svg/today.svg | 0 src/{ => assets}/icons/svg/tools.svg | 0 src/assets/icons/svg/tree-table.svg | 1 + src/assets/icons/svg/tree.svg | 1 + src/{ => assets}/icons/svg/unlock.svg | 0 src/{ => assets}/icons/svg/user.svg | 0 src/{ => assets}/icons/svg/user1.svg | 0 src/{ => assets}/icons/svg/validCode.svg | 0 src/{ => assets}/icons/svg/visits.svg | 0 src/assets/icons/svg/web.svg | 1 + src/{ => assets}/icons/svg/wechat.svg | 0 src/{ => assets}/icons/svg/weixin.svg | 0 src/{ => assets}/icons/svg/wxapp.svg | 0 src/{ => assets}/icons/svg/wxpay.svg | 0 src/{ => assets}/icons/svg/yingxiao.svg | 0 src/{ => assets}/icons/svg/zujian.svg | 0 src/{ => assets}/icons/svgo.yml | 0 src/assets/images/avatar.png | Bin 0 -> 1865 bytes src/assets/images/logo.png | Bin 0 -> 49551 bytes src/assets/logo/logo.png | Bin 16291 -> 0 bytes src/assets/styles/btn.scss | 99 +++ src/{ => assets}/styles/description.scss | 0 src/assets/styles/eladmin.scss | 100 +++ src/assets/styles/element-ui.scss | 79 ++ .../styles/element-variables.scss | 2 +- src/assets/styles/index.scss | 182 +++++ src/assets/styles/mixin.scss | 66 ++ src/assets/styles/sidebar.scss | 209 +++++ src/{ => assets}/styles/transition.scss | 10 +- src/{ => assets}/styles/variables.scss | 16 +- src/components/Breadcrumb/index.vue | 49 +- src/components/Crud/CRUD.operation.vue | 179 ++++ src/components/Crud/Pagination.vue | 18 + src/components/Crud/RR.operation.vue | 22 + src/components/Crud/UD.operation.vue | 71 ++ src/components/Crud/crud.js | 773 ++++++++++++++++++ src/components/Dict/Dict.js | 29 + src/components/Dict/index.js | 29 + src/components/Echarts/BarChart.vue | 106 +++ src/components/Echarts/Category.vue | 438 ++++++++++ src/components/Echarts/Funnel.vue | 120 +++ src/components/Echarts/Gauge.vue | 74 ++ src/components/Echarts/Graph.vue | 101 +++ src/components/Echarts/HeatMap.vue | 105 +++ src/components/Echarts/Line3D.vue | 96 +++ src/components/Echarts/PieChart.vue | 84 ++ src/components/Echarts/Point.vue | 149 ++++ src/components/Echarts/RadarChart.vue | 120 +++ src/components/Echarts/Rich.vue | 149 ++++ src/components/Echarts/Sankey.vue | 100 +++ src/components/Echarts/Scatter.vue | 143 ++++ src/components/Echarts/Sunburst.vue | 107 +++ src/components/Echarts/ThemeRiver.vue | 148 ++++ src/components/Echarts/WordCloud.vue | 192 +++++ src/components/Github/index.vue | 16 + src/components/Hamburger/index.vue | 29 +- src/components/HeaderSearch/index.vue | 180 ++++ src/components/IconSelect/index.vue | 2 +- src/components/IconSelect/requireIcons.js | 2 +- src/components/JavaEdit/index.vue | 78 ++ src/components/Pagination/index.vue | 101 +++ src/components/PanThumb/index.vue | 2 +- src/components/RightPanel/index.vue | 132 ++- src/components/Screenfull/index.vue | 58 +- src/components/SizeSelect/index.vue | 57 ++ src/components/SvgIcon/index.vue | 23 +- src/components/TextHoverEffect/Mallki.vue | 113 --- src/components/ThemePicker/index.vue | 175 ++++ src/components/TreeTable/index.vue | 20 +- src/components/YamlEdit/index.vue | 4 +- src/components/file-upload/index.vue | 71 -- src/components/iframe/index.vue | 2 +- src/components/mul-pic-upload/index.vue | 129 +-- src/components/permission/permission.js | 3 +- src/components/pic-upload-two/index.vue | 9 +- src/components/pic-upload/index.vue | 9 +- src/layout/components/AppMain.vue | 45 +- src/layout/components/Navbar.vue | 177 ++-- src/layout/components/Settings/index.vue | 56 +- src/layout/components/Sidebar/FixiOSBug.js | 10 +- src/layout/components/Sidebar/Link.vue | 11 +- src/layout/components/Sidebar/Logo.vue | 85 +- src/layout/components/Sidebar/SidebarItem.vue | 54 +- src/layout/components/Sidebar/index.vue | 51 +- .../components/TagsView/ScrollPane.vue} | 35 +- .../{TagsView.vue => TagsView/index.vue} | 61 +- src/layout/components/index.js | 6 +- src/layout/{Layout.vue => index.vue} | 20 +- src/layout/mixin/ResizeHandler.js | 30 +- src/main.js | 43 +- src/mixins/crud.js | 337 ++++++++ src/mixins/initData.js | 55 -- src/mixins/initDict.js | 41 - src/router/index.js | 10 +- src/router/routers.js | 26 +- src/{config/index.js => settings.js} | 45 +- src/store/getters.js | 3 + src/store/index.js | 28 +- src/store/modules/api.js | 8 +- src/store/modules/app.js | 81 +- src/store/modules/permission.js | 7 +- src/store/modules/settings.js | 60 +- src/store/modules/tagsView.js | 287 +++---- src/store/modules/user.js | 27 +- src/styles/element-ui.scss | 29 - src/styles/index.scss | 173 ---- src/styles/mixin.scss | 27 - src/styles/sidebar.scss | 133 --- src/utils/auth.js | 2 +- src/utils/clipboard.js | 4 +- src/utils/export2Excel.js | 206 ----- src/utils/export2Zip.js | 24 - src/utils/get-page-title.js | 10 + src/utils/index.js | 322 ++++++-- src/utils/open-window.js | 25 + src/utils/permission.js | 3 +- src/utils/request.js | 66 +- src/utils/scroll-to.js | 58 ++ src/utils/upload.js | 11 + src/utils/validate.js | 165 +++- src/views/activity/bargain/form.vue | 86 +- src/views/activity/bargain/index.vue | 50 +- .../bargain_user}/form.vue | 82 +- src/views/activity/bargain_user/index.vue | 131 +++ src/views/activity/combination/form.vue | 64 +- src/views/activity/combination/index.vue | 46 +- src/views/activity/combinlist/form.vue | 60 +- src/views/activity/combinlist/index.vue | 21 +- src/views/activity/coupon/form.vue | 26 +- src/views/activity/coupon/index.vue | 50 +- src/views/activity/couponissue/form.vue | 24 +- src/views/activity/couponissue/formt.vue | 4 +- src/views/activity/couponissue/index.vue | 26 +- src/views/activity/couponuser/form.vue | 12 +- src/views/activity/couponuser/index.vue | 33 +- src/views/activity/extract/form.vue | 14 +- src/views/activity/extract/index.vue | 47 +- src/views/activity/seckill/form.vue | 62 +- src/views/activity/seckill/index.vue | 38 +- src/views/activity/storecouponuser/form.vue | 44 +- src/views/activity/storecouponuser/index.vue | 35 +- src/views/components/Echarts.vue | 124 +++ src/views/components/Editor.vue | 9 +- src/views/components/IconSelect.vue | 70 -- src/views/components/MarkDown.vue | 40 +- src/views/components/YamlEdit.vue | 2 +- src/views/components/icons/element-icons.js | 74 ++ src/views/components/icons/index.vue | 91 +++ src/views/components/icons/svg-icons.js | 10 + src/views/dashboard/BarChart.vue | 24 +- src/views/dashboard/BarChartT.vue | 24 +- src/views/dashboard/LineChart.vue | 2 +- src/views/dashboard/PanelGroup.vue | 10 +- src/views/dashboard/PanelGroupT.vue | 10 +- src/views/dashboard/PieChart.vue | 2 +- src/views/dashboard/RaddarChart.vue | 2 +- src/views/features/401.vue | 28 +- src/views/features/404.vue | 3 - src/views/features/redirect.vue | 2 +- src/views/generator/config.vue | 325 ++++++++ src/views/generator/generator.vue | 182 ----- src/views/generator/index.vue | 148 ++-- src/views/generator/preview.vue | 30 + src/views/home.vue | 19 +- src/views/login.vue | 30 +- src/views/mnt/app/index.vue | 155 ++++ src/views/mnt/database/execute.vue | 86 ++ src/views/mnt/database/index.vue | 152 ++++ src/views/mnt/deploy/deploy.vue | 190 +++++ src/views/mnt/deploy/index.vue | 232 ++++++ src/views/mnt/deploy/sysRestore.vue | 120 +++ src/views/mnt/deployHistory/index.vue | 105 +++ src/views/mnt/server/index.vue | 147 ++++ src/views/monitor/log/errorLog.vue | 137 +++- src/views/monitor/log/index.vue | 121 ++- src/views/monitor/log/mlog.vue | 4 +- src/views/monitor/log/search.vue | 36 +- src/views/monitor/online/index.vue | 129 +++ src/views/monitor/redis/index.vue | 125 --- src/views/monitor/server/index.vue | 193 +++++ src/views/monitor/sql/index.vue | 4 +- src/views/nested/menu1/index.vue | 2 +- src/views/nested/menu1/menu1-1/index.vue | 4 +- src/views/nested/menu1/menu1-2/index.vue | 2 +- src/views/nested/menu2/index.vue | 2 +- src/views/shop/cate/form.vue | 12 +- src/views/shop/cate/index.vue | 191 ++--- src/views/shop/express/form.vue | 12 +- src/views/shop/express/index.vue | 31 +- src/views/shop/goods/attr.vue | 283 +++---- src/views/shop/goods/form.vue | 64 +- src/views/shop/goods/index.vue | 83 +- src/views/shop/goods/index2.vue | 41 +- src/views/shop/goods/index3.vue | 37 +- src/views/shop/goods/tab.vue | 10 +- src/views/shop/order/detail.vue | 51 +- src/views/shop/order/edit.vue | 196 ----- src/views/shop/order/form-bak.vue | 200 ++--- src/views/shop/order/form.vue | 21 +- src/views/shop/order/index.vue | 216 ++--- src/views/shop/order/refund.vue | 10 +- src/views/shop/order/remark.vue | 193 ----- src/views/shop/reply/form.vue | 56 +- src/views/shop/reply/index.vue | 32 +- src/views/shop/set/act.vue | 36 +- src/views/shop/set/actform.vue | 16 +- src/views/shop/set/form.vue | 12 +- src/views/shop/set/hot.vue | 32 +- src/views/shop/set/hotform.vue | 4 +- src/views/shop/set/index.vue | 34 +- src/views/shop/set/menu.vue | 34 +- src/views/shop/set/menuform.vue | 12 +- src/views/shop/set/roll.vue | 34 +- src/views/shop/set/rollform.vue | 10 +- src/views/shop/set/seckill.vue | 32 +- src/views/shop/set/seckillform.vue | 8 +- src/views/shop/set/sign.vue | 32 +- src/views/shop/set/signform.vue | 8 +- src/views/shop/set/usermenu.vue | 34 +- src/views/shop/set/usermenuform.vue | 12 +- src/views/shop/user/aindex.vue | 61 +- src/views/shop/user/bill.vue | 35 +- src/views/shop/user/form.vue | 24 +- src/views/shop/user/formp.vue | 10 +- src/views/shop/user/index.vue | 54 +- src/views/shop/userlevel/form.vue | 32 +- src/views/shop/userlevel/index.vue | 41 +- src/views/shop/usertask/form.vue | 26 +- src/views/shop/usertask/index.vue | 21 +- src/views/system/dept/form.vue | 125 --- src/views/system/dept/index.vue | 233 +++--- src/views/system/dict/dictDetail.vue | 110 +++ src/views/system/dict/form.vue | 101 --- src/views/system/dict/index.vue | 125 +-- src/views/system/dictDetail/index.vue | 123 --- src/views/system/job/form.vue | 140 ---- src/views/system/job/index.vue | 190 ++--- src/views/system/job/module/form.vue | 149 ++++ src/views/system/job/module/header.vue | 43 + src/views/system/menu/form.vue | 161 ---- src/views/system/menu/index.vue | 269 +++--- src/views/system/permission/form.vue | 112 --- src/views/system/permission/index.vue | 140 ---- src/views/system/role/form.vue | 142 ---- src/views/system/role/index.vue | 377 +++++---- src/views/system/timing/index.vue | 246 ++---- src/views/system/timing/log.vue | 84 +- src/views/system/user/center.vue | 173 ++-- src/views/system/user/center/updateEmail.vue | 17 +- src/views/system/user/center/updatePass.vue | 8 +- src/views/system/user/form.vue | 216 ----- src/views/system/user/index.vue | 492 +++++++---- src/views/tools/aliPay/config.vue | 16 +- src/views/tools/aliPay/index.vue | 5 +- src/views/tools/aliPay/toPay.vue | 8 +- src/views/tools/email/config.vue | 12 +- src/views/tools/email/index.vue | 5 +- src/views/tools/email/send.vue | 53 +- src/views/tools/picture/index.vue | 211 ++--- src/views/tools/storage/index.vue | 9 +- src/views/tools/storage/local/form.vue | 122 --- src/views/tools/storage/local/index.vue | 287 +++---- src/views/tools/storage/qiniu/form.vue | 18 +- src/views/tools/storage/qiniu/index.vue | 234 ++---- src/views/tools/swagger/index.vue | 4 +- src/views/wechat/article/form.vue | 18 +- src/views/wechat/article/index.vue | 36 +- src/views/wechat/config/form.vue | 56 +- src/views/wechat/config/index.vue | 51 +- src/views/wechat/config/pay.vue | 39 +- src/views/wechat/config/point.vue | 24 +- src/views/wechat/config/promoter.vue | 42 +- src/views/wechat/config/wxapp.vue | 27 +- src/views/wechat/menu/form.vue | 8 +- src/views/wechat/menu/index-bak.vue | 31 +- src/views/wechat/menu/index.vue | 339 ++++---- src/views/wechat/reply/form.vue | 20 +- src/views/wechat/reply/index.vue | 272 +++--- src/views/wechat/template/form.vue | 18 +- src/views/wechat/template/index.vue | 35 +- src/views/wechat/user/form.vue | 92 +-- src/views/wechat/user/index.vue | 73 +- static/.gitkeep | 0 vue.config.js | 131 +++ 451 files changed, 13838 insertions(+), 8853 deletions(-) delete mode 100644 .babelrc create mode 100644 .env.development create mode 100644 .env.production delete mode 100644 .postcssrc.js create mode 100644 babel.config.js delete mode 100644 build/build.js delete mode 100644 build/check-versions.js delete mode 100644 build/utils.js delete mode 100644 build/vue-loader.conf.js delete mode 100644 build/webpack.base.conf.js delete mode 100644 build/webpack.dev.conf.js delete mode 100644 build/webpack.prod.conf.js delete mode 100644 config/dev.env.js delete mode 100644 config/index.js delete mode 100644 config/prod.env.js delete mode 100644 debug.log delete mode 100644 index.html create mode 100644 jest.config.js create mode 100644 plopfile.js create mode 100644 postcss.config.js rename favicon.ico => public/favicon.ico (100%) create mode 100644 public/index.html delete mode 100644 src/api/generator.js rename src/api/{ => generator}/genConfig.js (73%) create mode 100644 src/api/generator/generator.js delete mode 100644 src/api/log.js rename src/api/{redis.js => mnt/app.js} (52%) create mode 100644 src/api/mnt/connect.js create mode 100644 src/api/mnt/database.js create mode 100644 src/api/mnt/deploy.js create mode 100644 src/api/mnt/deployHistory.js create mode 100644 src/api/mnt/serverDeploy.js create mode 100644 src/api/monitor/log.js create mode 100644 src/api/monitor/online.js create mode 100644 src/api/monitor/server.js create mode 100644 src/api/monitor/visits.js delete mode 100644 src/api/picture.js rename src/api/{ => system}/code.js (100%) rename src/api/{ => system}/dept.js (75%) rename src/api/{ => system}/dict.js (72%) rename src/api/{ => system}/dictDetail.js (95%) rename src/api/{ => system}/job.js (79%) rename src/api/{ => system}/menu.js (78%) rename src/api/{ => system}/role.js (78%) rename src/api/{ => system}/timing.js (77%) rename src/api/{ => system}/user.js (50%) rename src/api/{ => tools}/alipay.js (100%) rename src/api/{ => tools}/email.js (100%) rename src/api/{ => tools}/localStorage.js (72%) create mode 100644 src/api/tools/picture.js rename src/api/{ => tools}/qiniu.js (68%) rename src/api/{permission.js => yxStoreBargainUser.js} (54%) delete mode 100644 src/assets/avatar/avatar.png rename src/{ => assets}/icons/index.js (79%) rename src/{ => assets}/icons/svg/Sign.svg (100%) rename src/{ => assets}/icons/svg/Steve-Jobs.svg (100%) rename src/{ => assets}/icons/svg/add.svg (100%) rename src/{ => assets}/icons/svg/alipay.svg (100%) rename src/{ => assets}/icons/svg/anq.svg (100%) create mode 100644 src/assets/icons/svg/app.svg rename src/{ => assets}/icons/svg/article.svg (100%) create mode 100644 src/assets/icons/svg/backup.svg rename src/{ => assets}/icons/svg/banner.svg (100%) rename src/{ => assets}/icons/svg/bargain.svg (100%) rename src/{ => assets}/icons/svg/button.svg (100%) rename src/{ => assets}/icons/svg/chain.svg (100%) create mode 100644 src/assets/icons/svg/chart.svg rename src/{ => assets}/icons/svg/codeConsole.svg (100%) rename src/{ => assets}/icons/svg/comment.svg (100%) rename src/{ => assets}/icons/svg/configure.svg (100%) rename src/{ => assets}/icons/svg/coupon.svg (100%) rename src/{ => assets}/icons/svg/coupon2.svg (100%) rename src/{icons/svg/index.svg => assets/icons/svg/dashboard.svg} (100%) create mode 100644 src/assets/icons/svg/database.svg rename src/{ => assets}/icons/svg/date.svg (100%) rename src/{ => assets}/icons/svg/dengji.svg (100%) create mode 100644 src/assets/icons/svg/deploy.svg rename src/{ => assets}/icons/svg/dept.svg (100%) rename src/{ => assets}/icons/svg/dev.svg (100%) rename src/{ => assets}/icons/svg/develop.svg (100%) rename src/{ => assets}/icons/svg/dictionary.svg (100%) create mode 100644 src/assets/icons/svg/edit.svg create mode 100644 src/assets/icons/svg/education.svg rename src/{ => assets}/icons/svg/email.svg (100%) rename src/{ => assets}/icons/svg/error.svg (100%) create mode 100644 src/assets/icons/svg/exit-fullscreen.svg rename src/{ => assets}/icons/svg/express.svg (100%) rename src/{ => assets}/icons/svg/fenxiao.svg (100%) create mode 100644 src/assets/icons/svg/fullscreen.svg rename src/{ => assets}/icons/svg/fwb.svg (100%) rename src/{ => assets}/icons/svg/github.svg (100%) rename src/{ => assets}/icons/svg/gonggao.svg (100%) rename src/{ => assets}/icons/svg/ic-yesterday.svg (100%) rename src/{ => assets}/icons/svg/icon.svg (100%) rename src/{ => assets}/icons/svg/image.svg (100%) create mode 100644 src/assets/icons/svg/index.svg create mode 100644 src/assets/icons/svg/international.svg rename src/{ => assets}/icons/svg/ipvisits.svg (100%) rename src/{ => assets}/icons/svg/java.svg (100%) create mode 100644 src/assets/icons/svg/link.svg rename src/{ => assets}/icons/svg/list.svg (100%) rename src/{ => assets}/icons/svg/lock.svg (100%) rename src/{ => assets}/icons/svg/log.svg (100%) create mode 100644 src/assets/icons/svg/login.svg rename src/{ => assets}/icons/svg/markdown.svg (100%) rename src/{ => assets}/icons/svg/menu.svg (100%) create mode 100644 src/assets/icons/svg/message.svg create mode 100644 src/assets/icons/svg/mnt.svg rename src/{ => assets}/icons/svg/money.svg (100%) rename src/{ => assets}/icons/svg/monitor.svg (100%) rename src/{ => assets}/icons/svg/monthlyview.svg (100%) create mode 100644 src/assets/icons/svg/nested.svg rename src/{ => assets}/icons/svg/news.svg (100%) rename src/{ => assets}/icons/svg/order.svg (100%) rename src/{ => assets}/icons/svg/password.svg (100%) create mode 100644 src/assets/icons/svg/people.svg rename src/{ => assets}/icons/svg/peoples.svg (100%) rename src/{ => assets}/icons/svg/permission.svg (100%) rename src/{ => assets}/icons/svg/phone.svg (100%) rename src/{ => assets}/icons/svg/points.svg (100%) rename src/{ => assets}/icons/svg/pt.svg (100%) rename src/{ => assets}/icons/svg/qiniu.svg (100%) rename src/{ => assets}/icons/svg/redis.svg (100%) rename src/{ => assets}/icons/svg/reply.svg (100%) rename src/{ => assets}/icons/svg/role.svg (100%) rename src/{ => assets}/icons/svg/run.svg (100%) rename src/{ => assets}/icons/svg/running.svg (100%) rename src/{ => assets}/icons/svg/search.svg (100%) rename src/{ => assets}/icons/svg/seckill.svg (100%) create mode 100644 src/assets/icons/svg/server.svg rename src/{ => assets}/icons/svg/seven.svg (100%) rename src/{ => assets}/icons/svg/shop.svg (100%) rename src/{ => assets}/icons/svg/sign2.svg (100%) create mode 100644 src/assets/icons/svg/size.svg create mode 100644 src/assets/icons/svg/skill.svg create mode 100644 src/assets/icons/svg/source.svg rename src/{ => assets}/icons/svg/sqlMonitor.svg (100%) rename src/{ => assets}/icons/svg/swagger.svg (100%) rename src/{ => assets}/icons/svg/sys-tools.svg (100%) rename src/{ => assets}/icons/svg/system.svg (100%) create mode 100644 src/assets/icons/svg/tab.svg rename src/{ => assets}/icons/svg/task manege.svg (100%) rename src/{ => assets}/icons/svg/temp.svg (100%) create mode 100644 src/assets/icons/svg/theme.svg rename src/{ => assets}/icons/svg/timing.svg (100%) rename src/{ => assets}/icons/svg/tixian.svg (100%) rename src/{ => assets}/icons/svg/today.svg (100%) rename src/{ => assets}/icons/svg/tools.svg (100%) create mode 100644 src/assets/icons/svg/tree-table.svg create mode 100644 src/assets/icons/svg/tree.svg rename src/{ => assets}/icons/svg/unlock.svg (100%) rename src/{ => assets}/icons/svg/user.svg (100%) rename src/{ => assets}/icons/svg/user1.svg (100%) rename src/{ => assets}/icons/svg/validCode.svg (100%) rename src/{ => assets}/icons/svg/visits.svg (100%) create mode 100644 src/assets/icons/svg/web.svg rename src/{ => assets}/icons/svg/wechat.svg (100%) rename src/{ => assets}/icons/svg/weixin.svg (100%) rename src/{ => assets}/icons/svg/wxapp.svg (100%) rename src/{ => assets}/icons/svg/wxpay.svg (100%) rename src/{ => assets}/icons/svg/yingxiao.svg (100%) rename src/{ => assets}/icons/svg/zujian.svg (100%) rename src/{ => assets}/icons/svgo.yml (100%) create mode 100644 src/assets/images/avatar.png create mode 100644 src/assets/images/logo.png delete mode 100644 src/assets/logo/logo.png create mode 100644 src/assets/styles/btn.scss rename src/{ => assets}/styles/description.scss (100%) create mode 100644 src/assets/styles/eladmin.scss create mode 100644 src/assets/styles/element-ui.scss rename src/{ => assets}/styles/element-variables.scss (90%) create mode 100644 src/assets/styles/index.scss create mode 100644 src/assets/styles/mixin.scss create mode 100644 src/assets/styles/sidebar.scss rename src/{ => assets}/styles/transition.scss (87%) rename src/{ => assets}/styles/variables.scss (75%) create mode 100644 src/components/Crud/CRUD.operation.vue create mode 100644 src/components/Crud/Pagination.vue create mode 100644 src/components/Crud/RR.operation.vue create mode 100644 src/components/Crud/UD.operation.vue create mode 100644 src/components/Crud/crud.js create mode 100644 src/components/Dict/Dict.js create mode 100644 src/components/Dict/index.js create mode 100644 src/components/Echarts/BarChart.vue create mode 100644 src/components/Echarts/Category.vue create mode 100644 src/components/Echarts/Funnel.vue create mode 100644 src/components/Echarts/Gauge.vue create mode 100644 src/components/Echarts/Graph.vue create mode 100644 src/components/Echarts/HeatMap.vue create mode 100644 src/components/Echarts/Line3D.vue create mode 100644 src/components/Echarts/PieChart.vue create mode 100644 src/components/Echarts/Point.vue create mode 100644 src/components/Echarts/RadarChart.vue create mode 100644 src/components/Echarts/Rich.vue create mode 100644 src/components/Echarts/Sankey.vue create mode 100644 src/components/Echarts/Scatter.vue create mode 100644 src/components/Echarts/Sunburst.vue create mode 100644 src/components/Echarts/ThemeRiver.vue create mode 100644 src/components/Echarts/WordCloud.vue create mode 100644 src/components/Github/index.vue create mode 100644 src/components/HeaderSearch/index.vue create mode 100644 src/components/JavaEdit/index.vue create mode 100644 src/components/Pagination/index.vue create mode 100644 src/components/SizeSelect/index.vue delete mode 100644 src/components/TextHoverEffect/Mallki.vue create mode 100644 src/components/ThemePicker/index.vue delete mode 100644 src/components/file-upload/index.vue rename src/{components/ScrollPane/index.vue => layout/components/TagsView/ScrollPane.vue} (73%) rename src/layout/components/{TagsView.vue => TagsView/index.vue} (83%) rename src/layout/{Layout.vue => index.vue} (84%) create mode 100644 src/mixins/crud.js delete mode 100644 src/mixins/initData.js delete mode 100644 src/mixins/initDict.js rename src/{config/index.js => settings.js} (79%) delete mode 100644 src/styles/element-ui.scss delete mode 100644 src/styles/index.scss delete mode 100644 src/styles/mixin.scss delete mode 100644 src/styles/sidebar.scss delete mode 100644 src/utils/export2Excel.js delete mode 100644 src/utils/export2Zip.js create mode 100644 src/utils/get-page-title.js create mode 100644 src/utils/open-window.js create mode 100644 src/utils/scroll-to.js create mode 100644 src/utils/upload.js rename src/views/{system/dictDetail => activity/bargain_user}/form.vue (52%) create mode 100644 src/views/activity/bargain_user/index.vue create mode 100644 src/views/components/Echarts.vue delete mode 100644 src/views/components/IconSelect.vue create mode 100644 src/views/components/icons/element-icons.js create mode 100644 src/views/components/icons/index.vue create mode 100644 src/views/components/icons/svg-icons.js create mode 100644 src/views/generator/config.vue delete mode 100644 src/views/generator/generator.vue create mode 100644 src/views/generator/preview.vue create mode 100644 src/views/mnt/app/index.vue create mode 100644 src/views/mnt/database/execute.vue create mode 100644 src/views/mnt/database/index.vue create mode 100644 src/views/mnt/deploy/deploy.vue create mode 100644 src/views/mnt/deploy/index.vue create mode 100644 src/views/mnt/deploy/sysRestore.vue create mode 100644 src/views/mnt/deployHistory/index.vue create mode 100644 src/views/mnt/server/index.vue create mode 100644 src/views/monitor/online/index.vue delete mode 100644 src/views/monitor/redis/index.vue create mode 100644 src/views/monitor/server/index.vue delete mode 100644 src/views/shop/order/edit.vue delete mode 100644 src/views/shop/order/remark.vue delete mode 100644 src/views/system/dept/form.vue create mode 100644 src/views/system/dict/dictDetail.vue delete mode 100644 src/views/system/dict/form.vue delete mode 100644 src/views/system/dictDetail/index.vue delete mode 100644 src/views/system/job/form.vue create mode 100644 src/views/system/job/module/form.vue create mode 100644 src/views/system/job/module/header.vue delete mode 100644 src/views/system/menu/form.vue delete mode 100644 src/views/system/permission/form.vue delete mode 100644 src/views/system/permission/index.vue delete mode 100644 src/views/system/role/form.vue delete mode 100644 src/views/system/user/form.vue delete mode 100644 src/views/tools/storage/local/form.vue delete mode 100644 static/.gitkeep create mode 100644 vue.config.js diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 26c173e..0000000 --- a/.babelrc +++ /dev/null @@ -1,17 +0,0 @@ -{ - "presets": [ - ["env", { - "modules": false, - "targets": { - "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] - } - }], - "stage-2" - ], - "plugins":["transform-vue-jsx", "transform-runtime"], - "env": { - "development":{ - "plugins": ["dynamic-import-node"] - } - } -} diff --git a/.editorconfig b/.editorconfig index ea6e20f..3454886 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,4 +1,4 @@ -# http://editorconfig.org +# https://editorconfig.org root = true [*] diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..d9a2132 --- /dev/null +++ b/.env.development @@ -0,0 +1,8 @@ +ENV = 'development' + +# 接口地址 +VUE_APP_BASE_API = 'http://localhost:8000' +VUE_APP_WS_API = 'ws://localhost:8000' + +# 是否启用 babel-plugin-dynamic-import-node插件 +VUE_CLI_BABEL_TRANSPILE_MODULES = true diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..3556336 --- /dev/null +++ b/.env.production @@ -0,0 +1,5 @@ +ENV = 'production' + +# 接口地址 +VUE_APP_BASE_API = 'https://yshopapi.dayouqiantu.cn' +VUE_APP_WS_API = 'ws://yshopapi.dayouqiantu.cn' diff --git a/.eslintignore b/.eslintignore index e3a4037..e6529fc 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,4 @@ build/*.js -config/*.js src/assets +public +dist diff --git a/.eslintrc.js b/.eslintrc.js index 0e5c28a..c977505 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -21,7 +21,10 @@ module.exports = { "allowFirstLine": false } }], + "vue/singleline-html-element-content-newline": "off", + "vue/multiline-html-element-content-newline":"off", "vue/name-property-casing": ["error", "PascalCase"], + "vue/no-v-html": "off", 'accessor-pairs': 2, 'arrow-spacing': [2, { 'before': true, @@ -44,7 +47,7 @@ module.exports = { 'curly': [2, 'multi-line'], 'dot-location': [2, 'property'], 'eol-last': 2, - 'eqeqeq': [2, 'allow-null'], + 'eqeqeq': ["error", "always", {"null": "ignore"}], 'generator-star-spacing': [2, { 'before': true, 'after': true @@ -73,7 +76,7 @@ module.exports = { 'no-class-assign': 2, 'no-cond-assign': 2, 'no-const-assign': 2, - 'no-control-regex': 2, + 'no-control-regex': 0, 'no-delete-var': 2, 'no-dupe-args': 2, 'no-dupe-class-members': 2, @@ -193,4 +196,3 @@ module.exports = { 'array-bracket-spacing': [2, 'never'] } } - diff --git a/.gitignore b/.gitignore index 571f0a6..78a752d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,8 +4,11 @@ dist/ npm-debug.log* yarn-debug.log* yarn-error.log* -package-lock.json -yarn.lock +**/*.log + +tests/**/coverage/ +tests/e2e/reports +selenium-debug.log # Editor directories and files .idea @@ -14,3 +17,7 @@ yarn.lock *.ntvs* *.njsproj *.sln +*.local + +package-lock.json +yarn.lock diff --git a/.postcssrc.js b/.postcssrc.js deleted file mode 100644 index eee3e92..0000000 --- a/.postcssrc.js +++ /dev/null @@ -1,10 +0,0 @@ -// https://github.com/michael-ciniawsky/postcss-load-config - -module.exports = { - "plugins": { - "postcss-import": {}, - "postcss-url": {}, - // to edit target browsers: use "browserslist" field in package.json - "autoprefixer": {} - } -} diff --git a/.travis.yml b/.travis.yml index 16574d9..f4be7a0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: node_js -node_js: stable +node_js: 10 script: npm run test notifications: email: false diff --git a/LICENSE b/LICENSE index 91e3c25..78a36cb 100644 --- a/LICENSE +++ b/LICENSE @@ -176,7 +176,7 @@ recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2018 Elune + Copyright 2019 Zheng Jie Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -188,4 +188,4 @@ third-party archives. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. diff --git a/README.md b/README.md index 7f2c822..eee5fee 100644 --- a/README.md +++ b/README.md @@ -147,6 +147,12 @@ yshop基于当前流行技术组合的前后端分离商城系统: SpringBoot2 - 2.订单新增快递查询 - 1.4.3版本,后台图标更新,后台模块重新拆分,物流快递单独管理,导出最新sql - 1.4.4版本,新增模板消息通知、H5端商家管理发货修改及其列表时间显示修复 +- yshop1.7 发布更新如下: + - 1.后台升級eladmin2.4(前端,后台权限,代码生成器等重构,新增服务器监控等) + - 2.修复商品分类一些问题 + - 3.修复redis缓存问题 + - 4.修复菜单控制台报error问题 + #### 反馈交流 diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..804632a --- /dev/null +++ b/babel.config.js @@ -0,0 +1,11 @@ +const plugins = ['@vue/babel-plugin-transform-vue-jsx'] +// 生产环境移除console +if (process.env.NODE_ENV === 'production') { + plugins.push('transform-remove-console') +} +module.exports = { + plugins: plugins, + presets: [ + '@vue/app' + ] +} diff --git a/build/build.js b/build/build.js deleted file mode 100644 index 34c71a5..0000000 --- a/build/build.js +++ /dev/null @@ -1,67 +0,0 @@ -'use strict' -require('./check-versions')() - -const ora = require('ora') -const rm = require('rimraf') -const path = require('path') -const chalk = require('chalk') -const webpack = require('webpack') -const config = require('../config') -const webpackConfig = require('./webpack.prod.conf') -var connect = require('connect') -var serveStatic = require('serve-static') - -const spinner = ora( - 'building for ' + process.env.env_config + ' environment...' -) -spinner.start() - -rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { - if (err) throw err - webpack(webpackConfig, (err, stats) => { - spinner.stop() - if (err) throw err - process.stdout.write( - stats.toString({ - colors: true, - modules: false, - children: false, - chunks: false, - chunkModules: false - }) + '\n\n' - ) - - if (stats.hasErrors()) { - console.log(chalk.red(' Build failed with errors.\n')) - process.exit(1) - } - - console.log(chalk.cyan(' Build complete.\n')) - console.log( - chalk.yellow( - ' Tip: built files are meant to be served over an HTTP server.\n' + - " Opening index.html over file:// won't work.\n" - ) - ) - - if (process.env.npm_config_preview) { - const port = 9526 - const host = 'http://localhost:' + port - const basePath = config.build.assetsPublicPath - const app = connect() - - app.use( - basePath, - serveStatic('./dist', { - index: ['index.html', '/'] - }) - ) - - app.listen(port, function() { - console.log( - chalk.green(`> Listening at http://localhost:${port}${basePath}`) - ) - }) - } - }) -}) diff --git a/build/check-versions.js b/build/check-versions.js deleted file mode 100644 index c29c7e7..0000000 --- a/build/check-versions.js +++ /dev/null @@ -1,62 +0,0 @@ -'use strict' -const chalk = require('chalk') -const semver = require('semver') -const packageConfig = require('../package.json') -const shell = require('shelljs') - -function exec(cmd) { - return require('child_process') - .execSync(cmd) - .toString() - .trim() -} - -const versionRequirements = [ - { - name: 'node', - currentVersion: semver.clean(process.version), - versionRequirement: packageConfig.engines.node - } -] - -if (shell.which('npm')) { - versionRequirements.push({ - name: 'npm', - currentVersion: exec('npm --version'), - versionRequirement: packageConfig.engines.npm - }) -} - -module.exports = function() { - const warnings = [] - - for (let i = 0; i < versionRequirements.length; i++) { - const mod = versionRequirements[i] - - if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { - warnings.push( - mod.name + - ': ' + - chalk.red(mod.currentVersion) + - ' should be ' + - chalk.green(mod.versionRequirement) - ) - } - } - - if (warnings.length) { - console.log('') - console.log( - chalk.yellow( - 'To use this template, you must update following to modules:' - ) - ) - - for (let i = 0; i < warnings.length; i++) { - const warning = warnings[i] - console.log(' ' + warning) - } - - process.exit(1) - } -} diff --git a/build/utils.js b/build/utils.js deleted file mode 100644 index c96d093..0000000 --- a/build/utils.js +++ /dev/null @@ -1,108 +0,0 @@ -'use strict' -const path = require('path') -const config = require('../config') -const MiniCssExtractPlugin = require('mini-css-extract-plugin') -const packageConfig = require('../package.json') - -exports.assetsPath = function(_path) { - const assetsSubDirectory = - process.env.NODE_ENV === 'production' - ? config.build.assetsSubDirectory - : config.dev.assetsSubDirectory - - return path.posix.join(assetsSubDirectory, _path) -} - -exports.cssLoaders = function(options) { - options = options || {} - - const cssLoader = { - loader: 'css-loader', - options: { - sourceMap: options.sourceMap - } - } - - const postcssLoader = { - loader: 'postcss-loader', - options: { - sourceMap: options.sourceMap - } - } - - // generate loader string to be used with extract text plugin - function generateLoaders(loader, loaderOptions) { - const loaders = [] - - // Extract CSS when that option is specified - // (which is the case during production build) - if (options.extract) { - loaders.push(MiniCssExtractPlugin.loader) - } else { - loaders.push('vue-style-loader') - } - - loaders.push(cssLoader) - - if (options.usePostCSS) { - loaders.push(postcssLoader) - } - - if (loader) { - loaders.push({ - loader: loader + '-loader', - options: Object.assign({}, loaderOptions, { - sourceMap: options.sourceMap - }) - }) - } - - return loaders - } - // https://vue-loader.vuejs.org/en/configurations/extract-css.html - return { - css: generateLoaders(), - postcss: generateLoaders(), - less: generateLoaders('less'), - sass: generateLoaders('sass', { - indentedSyntax: true - }), - scss: generateLoaders('sass'), - stylus: generateLoaders('stylus'), - styl: generateLoaders('stylus') - } -} - -// Generate loaders for standalone style files (outside of .vue) -exports.styleLoaders = function(options) { - const output = [] - const loaders = exports.cssLoaders(options) - - for (const extension in loaders) { - const loader = loaders[extension] - output.push({ - test: new RegExp('\\.' + extension + '$'), - use: loader - }) - } - - return output -} - -exports.createNotifierCallback = () => { - const notifier = require('node-notifier') - - return (severity, errors) => { - if (severity !== 'error') return - - const error = errors[0] - const filename = error.file && error.file.split('!').pop() - - notifier.notify({ - title: packageConfig.name, - message: severity + ': ' + error.name, - subtitle: filename || '', - icon: path.join(__dirname, 'logo.png') - }) - } -} diff --git a/build/vue-loader.conf.js b/build/vue-loader.conf.js deleted file mode 100644 index 5496c93..0000000 --- a/build/vue-loader.conf.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict' - -module.exports = { - //You can set the vue-loader configuration by yourself. -} diff --git a/build/webpack.base.conf.js b/build/webpack.base.conf.js deleted file mode 100644 index cdfb054..0000000 --- a/build/webpack.base.conf.js +++ /dev/null @@ -1,122 +0,0 @@ -'use strict' -const path = require('path') -const utils = require('./utils') -const config = require('../config') -const { VueLoaderPlugin } = require('vue-loader') - -const os = require('os'); -const HappyPack = require('happypack'); -const happThreadPool = HappyPack.ThreadPool({size: os.cpus().length}); - -function resolve(dir) { - return path.join(__dirname, '..', dir) -} - -const createLintingRule = () => ({ - // test: /\.(js|vue)$/, - // loader: 'eslint-loader', - // enforce: 'pre', - // include: [resolve('src'), resolve('test')], - // options: { - // formatter: require('eslint-friendly-formatter'), - // emitWarning: !config.dev.showEslintErrorsInOverlay - // } -}) - -module.exports = { - cache: true, - context: path.resolve(__dirname, '../'), - entry:["babel-polyfill","./src/main.js"], - output: { - path: config.build.assetsRoot, - filename: '[name].js', - publicPath: - process.env.NODE_ENV === 'production' - ? config.build.assetsPublicPath - : config.dev.assetsPublicPath - }, - resolve: { - modules: [path.resolve(__dirname, '../node_modules')], - extensions: ['.js', '.vue', '.json'], - alias: { - '@': resolve('src'), - api: path.resolve(__dirname, '../src/api') - } - }, - module: { - rules: [ - ...(config.dev.useEslint ? [createLintingRule()] : []), - { - test: /\.vue$/, - loader: 'vue-loader', - options: { - loaders: { - js: 'happypack/loader?id=js' // 将loader换成happypack - } - } - }, - { - test: /\.js$/, - loader: ['happypack/loader?id=js'], // 将loader换成happypack - include: [ - resolve('src') - ], // src是项目开发的目录 - exclude: [path.resolve('../node_modules')] // 不需要编译node_modules下的js - }, - { - test: /\.svg$/, - loader: 'svg-sprite-loader', - include: [resolve('src/icons')], - options: { - symbolId: 'icon-[name]' - } - }, - { - test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, - loader: 'url-loader', - exclude: [resolve('src/icons')], - options: { - limit: 10000, - name: utils.assetsPath('img/[name].[hash:7].[ext]') - } - }, - { - test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, - loader: 'url-loader', - options: { - limit: 10000, - name: utils.assetsPath('media/[name].[hash:7].[ext]') - } - }, - { - test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, - loader: 'url-loader', - options: { - limit: 10000, - name: utils.assetsPath('fonts/[name].[hash:7].[ext]') - } - } - ] - }, - plugins: [ - new VueLoaderPlugin(), - new HappyPack({ - id: 'js', - cache: true, - loaders: ['babel-loader?cacheDirectory=true'], - threadPool: happThreadPool - }) - ], - node: { - // prevent webpack from injecting useless setImmediate polyfill because Vue - // source contains it (although only uses it if it's native). - setImmediate: false, - // prevent webpack from injecting mocks to Node native modules - // that does not make sense for the client - dgram: 'empty', - fs: 'empty', - net: 'empty', - tls: 'empty', - child_process: 'empty' - } -} diff --git a/build/webpack.dev.conf.js b/build/webpack.dev.conf.js deleted file mode 100644 index 26a5584..0000000 --- a/build/webpack.dev.conf.js +++ /dev/null @@ -1,98 +0,0 @@ -'use strict' -const path = require('path') -const utils = require('./utils') -const webpack = require('webpack') -const config = require('../config') -const merge = require('webpack-merge') -const baseWebpackConfig = require('./webpack.base.conf') -const HtmlWebpackPlugin = require('html-webpack-plugin') -const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') -const portfinder = require('portfinder') - -function resolve(dir) { - return path.join(__dirname, '..', dir) -} - -const HOST = process.env.HOST -const PORT = process.env.PORT && Number(process.env.PORT) - -const devWebpackConfig = merge(baseWebpackConfig, { - mode: 'development', - module: { - rules: utils.styleLoaders({ - sourceMap: config.dev.cssSourceMap, - usePostCSS: true - }) - }, - // cheap-module-eval-source-map is faster for development - devtool: config.dev.devtool, - - // these devServer options should be customized in /config/index.js - devServer: { - clientLogLevel: 'warning', - historyApiFallback: true, - hot: true, - compress: true, - host: HOST || config.dev.host, - port: PORT || config.dev.port, - open: config.dev.autoOpenBrowser, - overlay: config.dev.errorOverlay - ? { warnings: false, errors: true } - : false, - publicPath: config.dev.assetsPublicPath, - proxy: config.dev.proxyTable, - quiet: true, // necessary for FriendlyErrorsPlugin - watchOptions: { - poll: config.dev.poll - } - }, - plugins: [ - new webpack.DefinePlugin({ - 'process.env': require('../config/dev.env') - }), - new webpack.HotModuleReplacementPlugin(), - // https://github.com/ampedandwired/html-webpack-plugin - new HtmlWebpackPlugin({ - filename: 'index.html', - template: 'index.html', - inject: true, - favicon: resolve('favicon.ico'), - title: 'vue-element-admin', - templateParameters: { - BASE_URL: config.dev.assetsPublicPath + config.dev.assetsSubDirectory, - }, - }), - ] -}) - -module.exports = new Promise((resolve, reject) => { - portfinder.basePort = process.env.PORT || config.dev.port - portfinder.getPort((err, port) => { - if (err) { - reject(err) - } else { - // publish the new Port, necessary for e2e tests - process.env.PORT = port - // add port to devServer config - devWebpackConfig.devServer.port = port - - // Add FriendlyErrorsPlugin - devWebpackConfig.plugins.push( - new FriendlyErrorsPlugin({ - compilationSuccessInfo: { - messages: [ - `Your application is running here: http://${ - devWebpackConfig.devServer.host - }:${port}` - ] - }, - onErrors: config.dev.notifyOnErrors - ? utils.createNotifierCallback() - : undefined - }) - ) - - resolve(devWebpackConfig) - } - }) -}) diff --git a/build/webpack.prod.conf.js b/build/webpack.prod.conf.js deleted file mode 100644 index 946a134..0000000 --- a/build/webpack.prod.conf.js +++ /dev/null @@ -1,188 +0,0 @@ -'use strict' -const path = require('path') -const utils = require('./utils') -const webpack = require('webpack') -const config = require('../config') -const merge = require('webpack-merge') -const baseWebpackConfig = require('./webpack.base.conf') -const CopyWebpackPlugin = require('copy-webpack-plugin') -const HtmlWebpackPlugin = require('html-webpack-plugin') -const ScriptExtHtmlWebpackPlugin = require('script-ext-html-webpack-plugin') -const MiniCssExtractPlugin = require('mini-css-extract-plugin') -const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin') -const UglifyJsPlugin = require('uglifyjs-webpack-plugin') - -function resolve(dir) { - return path.join(__dirname, '..', dir) -} - -const env = require('../config/' + process.env.env_config + '.env') - -// For NamedChunksPlugin -const seen = new Set() -const nameLength = 4 - -const webpackConfig = merge(baseWebpackConfig, { - mode: 'production', - module: { - rules: utils.styleLoaders({ - sourceMap: config.build.productionSourceMap, - extract: true, - usePostCSS: true - }) - }, - devtool: config.build.productionSourceMap ? config.build.devtool : false, - output: { - path: config.build.assetsRoot, - filename: utils.assetsPath('js/[name].[chunkhash:8].js'), - chunkFilename: utils.assetsPath('js/[name].[chunkhash:8].js') - }, - plugins: [ - // http://vuejs.github.io/vue-loader/en/workflow/production.html - new webpack.DefinePlugin({ - 'process.env': env - }), - // extract css into its own file - new MiniCssExtractPlugin({ - filename: utils.assetsPath('css/[name].[contenthash:8].css'), - chunkFilename: utils.assetsPath('css/[name].[contenthash:8].css') - }), - // generate dist index.html with correct asset hash for caching. - // you can customize output by editing /index.html - // see https://github.com/ampedandwired/html-webpack-plugin - new HtmlWebpackPlugin({ - filename: config.build.index, - template: 'index.html', - inject: true, - favicon: resolve('favicon.ico'), - title: 'vue-element-admin', - templateParameters: { - BASE_URL: config.build.assetsPublicPath + config.build.assetsSubDirectory, - }, - minify: { - removeComments: true, - collapseWhitespace: true, - removeAttributeQuotes: true - // more options: - // https://github.com/kangax/html-minifier#options-quick-reference - } - // default sort mode uses toposort which cannot handle cyclic deps - // in certain cases, and in webpack 4, chunk order in HTML doesn't - // matter anyway - }), - new ScriptExtHtmlWebpackPlugin({ - //`runtime` must same as runtimeChunk name. default is `runtime` - inline: /runtime\..*\.js$/ - }), - // keep chunk.id stable when chunk has no name - new webpack.NamedChunksPlugin(chunk => { - if (chunk.name) { - return chunk.name - } - const modules = Array.from(chunk.modulesIterable) - if (modules.length > 1) { - const hash = require('hash-sum') - const joinedHash = hash(modules.map(m => m.id).join('_')) - let len = nameLength - while (seen.has(joinedHash.substr(0, len))) len++ - seen.add(joinedHash.substr(0, len)) - return `chunk-${joinedHash.substr(0, len)}` - } else { - return modules[0].id - } - }), - // keep module.id stable when vender modules does not change - new webpack.HashedModuleIdsPlugin(), - // copy custom static assets - new CopyWebpackPlugin([ - { - from: path.resolve(__dirname, '../static'), - to: config.build.assetsSubDirectory, - ignore: ['.*'] - } - ]) - ], - optimization: { - splitChunks: { - chunks: 'all', - cacheGroups: { - libs: { - name: 'chunk-libs', - test: /[\\/]node_modules[\\/]/, - priority: 10, - chunks: 'initial' // 只打包初始时依赖的第三方 - }, - elementUI: { - name: 'chunk-elementUI', // 单独将 elementUI 拆包 - priority: 20, // 权重要大于 libs 和 app 不然会被打包进 libs 或者 app - test: /[\\/]node_modules[\\/]element-ui[\\/]/ - }, - commons: { - name: 'chunk-commons', - test: resolve('src/components'), // 可自定义拓展你的规则 - minChunks: 3, // 最小公用次数 - priority: 5, - reuseExistingChunk: true - } - } - }, - runtimeChunk: 'single', - minimizer: [ - new UglifyJsPlugin({ - uglifyOptions: { - mangle: { - safari10: true - } - }, - sourceMap: config.build.productionSourceMap, - cache: true, - parallel: true - }), - // Compress extracted CSS. We are using this plugin so that possible - // duplicated CSS from different components can be deduped. - new OptimizeCSSAssetsPlugin() - ] - } -}) - -if (config.build.productionGzip) { - const CompressionWebpackPlugin = require('compression-webpack-plugin') - - webpackConfig.plugins.push( - new CompressionWebpackPlugin({ - asset: '[path].gz[query]', - algorithm: 'gzip', - test: new RegExp( - '\\.(' + config.build.productionGzipExtensions.join('|') + ')$' - ), - threshold: 10240, - minRatio: 0.8 - }) - ) -} - -if (config.build.generateAnalyzerReport || config.build.bundleAnalyzerReport) { - const BundleAnalyzerPlugin = require('webpack-bundle-analyzer') - .BundleAnalyzerPlugin - - if (config.build.bundleAnalyzerReport) { - webpackConfig.plugins.push( - new BundleAnalyzerPlugin({ - analyzerPort: 8080, - generateStatsFile: false - }) - ) - } - - if (config.build.generateAnalyzerReport) { - webpackConfig.plugins.push( - new BundleAnalyzerPlugin({ - analyzerMode: 'static', - reportFilename: 'bundle-report.html', - openAnalyzer: false - }) - ) - } -} - -module.exports = webpackConfig diff --git a/config/dev.env.js b/config/dev.env.js deleted file mode 100644 index 413a7e8..0000000 --- a/config/dev.env.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict' -const merge = require('webpack-merge') -const prodEnv = require('./prod.env') - -module.exports = merge(prodEnv, { - NODE_ENV: '"development"', - BASE_API: '"http://localhost:8000"' - //BASE_API: '"https://yshopapi.dayouqiantu.cn"' -}) diff --git a/config/index.js b/config/index.js deleted file mode 100644 index 48350f5..0000000 --- a/config/index.js +++ /dev/null @@ -1,106 +0,0 @@ -'use strict' -// Template version: 1.2.6 -const devEnv = require('./dev.env') -// 获取接口地址 -const base_url = devEnv.BASE_API.replace(/"/g,'') -const path = require('path') -module.exports = { - dev: { - // Paths - assetsSubDirectory: 'static', - assetsPublicPath: '/', - // 配置代理 - proxyTable: { - '/auth': { - // 测试环境 - target: base_url, - secure: true, - changeOrigin: true, - pathRewrite: { - '^/auth': 'auth' - } - }, - '/api': { - // 测试环境 - target: base_url, - secure: true, - changeOrigin: true, - pathRewrite: { - '^/api': 'api' - } - } - }, - - // Various Dev Server settings - host: 'localhost', // can be overwritten by process.env.HOST - port: 8013, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined - autoOpenBrowser: true, - errorOverlay: true, - notifyOnErrors: false, - poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- - - // Use Eslint Loader? - // If true, your code will be linted during bundling and - // linting errors and warnings will be shown in the console. - useEslint: true, - // If true, eslint errors and warnings will also be shown in the error overlay - // in the browser. - showEslintErrorsInOverlay: false, - - /** - * Source Maps - */ - - // https://webpack.js.org/configuration/devtool/#development - devtool: 'cheap-source-map', - - // CSS Sourcemaps off by default because relative paths are "buggy" - // with this option, according to the CSS-Loader README - // (https://github.com/webpack/css-loader#sourcemaps) - // In our experience, they generally work as expected, - // just be aware of this issue when enabling this option. - cssSourceMap: false - }, - - build: { - // Template for index.html - index: path.resolve(__dirname, '../dist/index.html'), - - // Paths - assetsRoot: path.resolve(__dirname, '../dist'), - assetsSubDirectory: 'static', - - /** - * You can set by youself according to actual condition - * You will need to set this if you plan to deploy your site under a sub path, - * for example GitHub pages. If you plan to deploy your site to https://foo.github.io/bar/, - * then assetsPublicPath should be set to "/bar/". - * In most cases please use '/' !!! - */ - assetsPublicPath: '/', - - /** - * Source Maps - */ - - productionSourceMap: false, - // https://webpack.js.org/configuration/devtool/#production - devtool: 'source-map', - - // Gzip off by default as many popular static hosts such as - // Surge or Netlify already gzip all static assets for you. - // Before setting to `true`, make sure to: - // npm install --save-dev compression-webpack-plugin - productionGzip: false, - productionGzipExtensions: ['js', 'css'], - - // Run the build command with an extra argument to - // View the bundle analyzer report after build finishes: - // `npm run build --report` - // Set to `true` or `false` to always turn it on or off - bundleAnalyzerReport: process.env.npm_config_report || false, - - // `npm run build:prod --generate_report` - generateAnalyzerReport: process.env.npm_config_generate_report || false - } -} diff --git a/config/prod.env.js b/config/prod.env.js deleted file mode 100644 index 6ba67bb..0000000 --- a/config/prod.env.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict' -module.exports = { - NODE_ENV: '"production"', - BASE_API: '"https://yshopapi.dayouqiantu.cn"' -} diff --git a/debug.log b/debug.log deleted file mode 100644 index b241ab3..0000000 --- a/debug.log +++ /dev/null @@ -1 +0,0 @@ -[1110/193651.524:ERROR:crashpad_client_win.cc(491)] CreateProcess: ҳļ̫С޷ɲ (0x5AF) diff --git a/index.html b/index.html deleted file mode 100644 index c6b6210..0000000 --- a/index.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - -
-
-
- - - - -
-
-
- - diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..143cdc8 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,24 @@ +module.exports = { + moduleFileExtensions: ['js', 'jsx', 'json', 'vue'], + transform: { + '^.+\\.vue$': 'vue-jest', + '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': + 'jest-transform-stub', + '^.+\\.jsx?$': 'babel-jest' + }, + moduleNameMapper: { + '^@/(.*)$': '/src/$1' + }, + snapshotSerializers: ['jest-serializer-vue'], + testMatch: [ + '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' + ], + collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'], + coverageDirectory: '/tests/unit/coverage', + // 'collectCoverage': true, + 'coverageReporters': [ + 'lcov', + 'text-summary' + ], + testURL: 'http://localhost/' +} diff --git a/package.json b/package.json index 2b8fb1b..148d1ab 100644 --- a/package.json +++ b/package.json @@ -1,30 +1,49 @@ { - "name": "YSHOP", - "version": "2.2.0", + "name": "yshop-web", + "version": "2.4.0", + "description": "yshop 前端源码", + "author": "Zheng Jie", "license": "Apache-2.0", - "description": "YSHOP 前端代码", - "author": "hupeng <610796224@qq.com>", "scripts": { - "dev": "cross-env BABEL_ENV=development webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", - "build": "cross-env NODE_ENV=production env_config=prod node build/build.js", - "lint": "eslint --ext .js,.vue src", - "test": "npm run lint", - "precommit": "lint-staged", - "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml" + "dev": "vue-cli-service serve", + "build:prod": "vue-cli-service build", + "build:stage": "vue-cli-service build --mode staging", + "preview": "node build/index.js --preview", + "lint": "eslint --fix --ext .js,.vue src", + "test:unit": "jest --clearCache && vue-cli-service test:unit", + "svgo": "svgo -f src/assets/icons/svg --config=src/assets/icons/svgo.yml", + "new": "plop" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "src/**/*.{js,vue}": [ + "eslint --fix", + "git add" + ] }, "repository": { "type": "git", - "url": "https://github.com/elunez/eladmin-qd" + "url": "https://gitee.com/guchengwuyue/yshopmall" + }, + "bugs": { + "url": "https://gitee.com/guchengwuyue/yshopmall/issues" }, "dependencies": { - "@riophae/vue-treeselect": "0.0.38", - "axios": "^0.19.0", - "clipboard": "1.7.1", - "codemirror": "^5.38.0", + "@riophae/vue-treeselect": "0.1.0", + "axios": "0.18.1", + "clipboard": "2.0.4", + "codemirror": "^5.49.2", "connect": "3.6.6", - "echarts": "4.1.0", + "echarts": "4.2.1", + "echarts-gl": "^1.1.1", + "echarts-wordcloud": "^1.1.3", "element-ui": "^2.12.0", "file-saver": "1.3.8", + "fuse.js": "3.4.4", "js-cookie": "2.2.0", "jsencrypt": "^3.0.0-rc.1", "jszip": "3.1.5", @@ -32,75 +51,56 @@ "normalize.css": "7.0.0", "nprogress": "0.2.0", "path-to-regexp": "2.4.0", - "screenfull": "3.3.3", - "vue": "2.5.17", + "qs": "^6.9.1", + "screenfull": "4.2.0", + "vue": "2.6.10", "vue-count-to": "1.0.13", - "vue-router": "3.1.3", - "vuex": "3.0.1", + "vue-cropper": "0.4.9", + "vue-highlightjs": "^1.3.3", + "vue-router": "3.0.2", + "vue-splitpane": "1.0.4", + "vuex": "3.1.0", "wangeditor": ">=3.0.0", "xlsx": "^0.11.16" }, "devDependencies": { - "autoprefixer": "8.5.0", - "babel-core": "6.26.3", + "@babel/core": "7.0.0", + "@babel/register": "7.0.0", + "@vue/cli-plugin-babel": "3.5.3", + "@vue/cli-plugin-eslint": "3.5.1", + "@vue/cli-plugin-unit-jest": "3.5.3", + "@vue/cli-service": "3.5.3", + "@vue/test-utils": "1.0.0-beta.29", + "autoprefixer": "^9.5.1", + "babel-core": "7.0.0-bridge.0", "babel-eslint": "8.2.6", - "babel-helper-vue-jsx-merge-props": "2.0.3", - "babel-loader": "7.1.5", - "babel-plugin-dynamic-import-node": "2.0.0", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-plugin-transform-runtime": "6.23.0", - "babel-plugin-transform-vue-jsx": "3.7.0", - "babel-polyfill": "^6.26.0", - "babel-preset-env": "1.7.0", - "babel-preset-stage-2": "6.24.1", - "chalk": "2.4.1", - "copy-webpack-plugin": "4.5.2", - "cross-env": "5.2.0", - "css-loader": "1.0.0", - "eslint": "4.19.1", - "eslint-friendly-formatter": "4.0.1", - "eslint-loader": "2.0.0", - "eslint-plugin-vue": "4.7.1", - "eventsource-polyfill": "0.9.6", - "file-loader": "1.1.11", - "friendly-errors-webpack-plugin": "1.7.0", - "happypack": "^5.0.1", - "html-webpack-plugin": "4.0.0-alpha", - "mini-css-extract-plugin": "0.4.1", - "node-notifier": "5.2.1", - "node-sass": "^4.7.2", - "optimize-css-assets-webpack-plugin": "5.0.0", - "ora": "3.0.0", - "portfinder": "1.0.16", - "postcss-import": "12.0.0", - "postcss-loader": "2.1.6", - "postcss-url": "7.3.2", - "rimraf": "2.6.2", - "sass-loader": "7.0.3", - "script-ext-html-webpack-plugin": "2.0.1", + "babel-jest": "23.6.0", + "babel-plugin-transform-remove-console": "^6.9.4", + "chalk": "2.4.2", + "chokidar": "2.1.5", + "connect": "3.6.6", + "eslint": "5.15.3", + "eslint-plugin-vue": "5.2.2", + "html-webpack-plugin": "3.2.0", + "husky": "1.3.1", + "lint-staged": "8.1.5", + "node-sass": "^4.13.0", + "plop": "2.3.0", + "runjs": "^4.3.2", + "sass-loader": "^7.1.0", + "script-ext-html-webpack-plugin": "2.1.3", "script-loader": "0.7.2", - "semver": "5.5.0", - "shelljs": "^0.8.3", - "svg-sprite-loader": "3.8.0", - "svgo": "1.2.2", - "uglifyjs-webpack-plugin": "1.2.7", - "url-loader": "1.0.1", - "vue-loader": "15.3.0", - "vue-style-loader": "4.1.2", - "vue-template-compiler": "2.5.17", - "webpack": "4.16.5", - "webpack-bundle-analyzer": "3.3.2", - "webpack-cli": "3.1.0", - "webpack-dev-server": "3.3.1", - "webpack-merge": "4.1.4" + "serve-static": "^1.13.2", + "svg-sprite-loader": "4.1.3", + "svgo": "1.2.0", + "vue-template-compiler": "2.6.10" }, "engines": { - "node": ">= 6.0.0", + "node": ">=8.9", "npm": ">= 3.0.0" }, "browserslist": [ "> 1%", - "last 2 versions", - "not ie <= 8" + "last 2 versions" ] } diff --git a/plopfile.js b/plopfile.js new file mode 100644 index 0000000..9f3147e --- /dev/null +++ b/plopfile.js @@ -0,0 +1,7 @@ +const viewGenerator = require('./plop-templates/view/prompt') +const componentGenerator = require('./plop-templates/component/prompt') + +module.exports = function(plop) { + plop.setGenerator('view', viewGenerator) + plop.setGenerator('component', componentGenerator) +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..961986e --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,5 @@ +module.exports = { + plugins: { + autoprefixer: {} + } +} diff --git a/favicon.ico b/public/favicon.ico similarity index 100% rename from favicon.ico rename to public/favicon.ico diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..e918500 --- /dev/null +++ b/public/index.html @@ -0,0 +1,15 @@ + + + + + + + + + <%= webpackConfig.name %> + + +
+ + + diff --git a/src/App.vue b/src/App.vue index 721d3a3..ec9032c 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,6 +1,6 @@ diff --git a/src/api/data.js b/src/api/data.js index 7a91ac6..d975d75 100644 --- a/src/api/data.js +++ b/src/api/data.js @@ -1,9 +1,17 @@ import request from '@/utils/request' +import qs from 'qs' export function initData(url, params) { return request({ - url: url, + url: url + '?' + qs.stringify(params, { indices: false }), + method: 'get' + }) +} + +export function download(url, params) { + return request({ + url: url + '?' + qs.stringify(params, { indices: false }), method: 'get', - params + responseType: 'blob' }) } diff --git a/src/api/generator.js b/src/api/generator.js deleted file mode 100644 index c9302d6..0000000 --- a/src/api/generator.js +++ /dev/null @@ -1,9 +0,0 @@ -import request from '@/utils/request' - -export function generator(data, tableName) { - return request({ - url: 'api/generator?tableName=' + tableName, - data, - method: 'post' - }) -} diff --git a/src/api/genConfig.js b/src/api/generator/genConfig.js similarity index 73% rename from src/api/genConfig.js rename to src/api/generator/genConfig.js index 5535d37..e15b200 100644 --- a/src/api/genConfig.js +++ b/src/api/generator/genConfig.js @@ -1,8 +1,8 @@ import request from '@/utils/request' -export function get() { +export function get(tableName) { return request({ - url: 'api/genConfig', + url: 'api/genConfig/' + tableName, method: 'get' }) } diff --git a/src/api/generator/generator.js b/src/api/generator/generator.js new file mode 100644 index 0000000..0c49718 --- /dev/null +++ b/src/api/generator/generator.js @@ -0,0 +1,33 @@ +import request from '@/utils/request' + +export function getAllTable() { + return request({ + url: 'api/generator/tables/all', + method: 'get' + }) +} + +export function generator(tableName, type) { + return request({ + url: 'api/generator/' + tableName + '/' + type, + method: 'post', + responseType: type === 2 ? 'blob' : '' + }) +} + +export function save(data) { + return request({ + url: 'api/generator', + data, + method: 'put' + }) +} + +export function sync(tables) { + return request({ + url: 'api/generator/sync', + method: 'post', + data: tables + }) +} + diff --git a/src/api/log.js b/src/api/log.js deleted file mode 100644 index d776e7a..0000000 --- a/src/api/log.js +++ /dev/null @@ -1,8 +0,0 @@ -import request from '@/utils/request' - -export function getErrDetail(id) { - return request({ - url: 'api/logs/error/' + id, - method: 'get' - }) -} diff --git a/src/api/login.js b/src/api/login.js index fd55a3b..fe257d2 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -22,7 +22,14 @@ export function getInfo() { export function getCodeImg() { return request({ - url: 'auth/vCode', + url: 'auth/code', method: 'get' }) } + +export function logout() { + return request({ + url: 'auth/logout', + method: 'delete' + }) +} diff --git a/src/api/redis.js b/src/api/mnt/app.js similarity index 52% rename from src/api/redis.js rename to src/api/mnt/app.js index b16adc4..2a27054 100644 --- a/src/api/redis.js +++ b/src/api/mnt/app.js @@ -2,34 +2,26 @@ import request from '@/utils/request' export function add(data) { return request({ - url: 'api/redis', + url: 'api/app', method: 'post', data }) } -export function del(key) { - const data = { - key - } +export function del(ids) { return request({ - url: 'api/redis/', + url: 'api/app', method: 'delete', - data - }) -} - -export function delAll() { - return request({ - url: 'api/redis/all', - method: 'delete' + data: ids }) } export function edit(data) { return request({ - url: 'api/redis', + url: 'api/app', method: 'put', data }) } + +export default { add, edit, del } diff --git a/src/api/mnt/connect.js b/src/api/mnt/connect.js new file mode 100644 index 0000000..1bbe90b --- /dev/null +++ b/src/api/mnt/connect.js @@ -0,0 +1,17 @@ +import request from '@/utils/request' + +export function testDbConnect(data) { + return request({ + url: 'api/database/testConnect', + method: 'post', + data + }) +} + +export function testServerConnect(data) { + return request({ + url: 'api/serverDeploy/testConnect', + method: 'post', + data + }) +} diff --git a/src/api/mnt/database.js b/src/api/mnt/database.js new file mode 100644 index 0000000..91797fb --- /dev/null +++ b/src/api/mnt/database.js @@ -0,0 +1,35 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/database', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/database', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/database', + method: 'put', + data + }) +} + +export function testDbConnection(data) { + return request({ + url: 'api/database/testConnect', + method: 'post', + data + }) +} + +export default { add, edit, del, testDbConnection } diff --git a/src/api/mnt/deploy.js b/src/api/mnt/deploy.js new file mode 100644 index 0000000..c1475ea --- /dev/null +++ b/src/api/mnt/deploy.js @@ -0,0 +1,77 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/deploy', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/deploy', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/deploy', + method: 'put', + data + }) +} + +export function getApps() { + return request({ + url: 'api/app', + method: 'get' + }) +} + +export function getServers() { + return request({ + url: 'api/serverDeploy', + method: 'get' + }) +} + +/** + * 启动服务 + * @param data 选中行 + */ +export function startServer(data) { + return request({ + url: 'api/deploy/startServer', + method: 'post', + data + }) +} + +/** + * 停止服务 + * @param data 选中行 + */ +export function stopServer(data) { + return request({ + url: 'api/deploy/stopServer', + method: 'post', + data + }) +} + +/** + * 停止服务 + * @param data 选中行 + */ +export function serverStatus(data) { + return request({ + url: 'api/deploy/serverStatus', + method: 'post', + data + }) +} + +export default { add, edit, del, stopServer, serverStatus, startServer, getServers, getApps } diff --git a/src/api/mnt/deployHistory.js b/src/api/mnt/deployHistory.js new file mode 100644 index 0000000..30335e4 --- /dev/null +++ b/src/api/mnt/deployHistory.js @@ -0,0 +1,21 @@ +import request from '@/utils/request' + +export function del(ids) { + return request({ + url: 'api/deployHistory', + method: 'delete', + data: ids + }) +} + +/** + * 版本回退 + * @param data 选中行 + */ +export function reducte(data) { + return request({ + url: 'api/deploy/serverReduction', + method: 'post', + data + }) +} diff --git a/src/api/mnt/serverDeploy.js b/src/api/mnt/serverDeploy.js new file mode 100644 index 0000000..e796114 --- /dev/null +++ b/src/api/mnt/serverDeploy.js @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/serverDeploy', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/serverDeploy', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/serverDeploy', + method: 'put', + data + }) +} + +export default { add, edit, del } diff --git a/src/api/monitor/log.js b/src/api/monitor/log.js new file mode 100644 index 0000000..13f0d39 --- /dev/null +++ b/src/api/monitor/log.js @@ -0,0 +1,22 @@ +import request from '@/utils/request' + +export function getErrDetail(id) { + return request({ + url: 'api/logs/error/' + id, + method: 'get' + }) +} + +export function delAllError() { + return request({ + url: 'api/logs/del/error', + method: 'delete' + }) +} + +export function delAllInfo() { + return request({ + url: 'api/logs/del/info', + method: 'delete' + }) +} diff --git a/src/api/monitor/online.js b/src/api/monitor/online.js new file mode 100644 index 0000000..057275b --- /dev/null +++ b/src/api/monitor/online.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +export function del(keys) { + return request({ + url: 'auth/online', + method: 'delete', + data: keys + }) +} diff --git a/src/api/monitor/server.js b/src/api/monitor/server.js new file mode 100644 index 0000000..2ade356 --- /dev/null +++ b/src/api/monitor/server.js @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/server', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/server', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/server', + method: 'put', + data + }) +} + +export default { add, edit, del } diff --git a/src/api/monitor/visits.js b/src/api/monitor/visits.js new file mode 100644 index 0000000..147ae7c --- /dev/null +++ b/src/api/monitor/visits.js @@ -0,0 +1,22 @@ +import request from '@/utils/request' + +export function count() { + return request({ + url: 'api/visits', + method: 'post' + }) +} + +export function get() { + return request({ + url: 'api/visits', + method: 'get' + }) +} + +export function getChartData() { + return request({ + url: 'api/visits/chartData', + method: 'get' + }) +} diff --git a/src/api/picture.js b/src/api/picture.js deleted file mode 100644 index e3ddd86..0000000 --- a/src/api/picture.js +++ /dev/null @@ -1,16 +0,0 @@ -import request from '@/utils/request' - -export function del(id) { - return request({ - url: 'api/pictures/' + id, - method: 'delete' - }) -} - -export function delAll(ids) { - return request({ - url: 'api/pictures/', - method: 'delete', - data: ids - }) -} diff --git a/src/api/code.js b/src/api/system/code.js similarity index 100% rename from src/api/code.js rename to src/api/system/code.js diff --git a/src/api/dept.js b/src/api/system/dept.js similarity index 75% rename from src/api/dept.js rename to src/api/system/dept.js index 2ca7b29..59998ba 100644 --- a/src/api/dept.js +++ b/src/api/system/dept.js @@ -16,10 +16,11 @@ export function add(data) { }) } -export function del(id) { +export function del(ids) { return request({ - url: 'api/dept/' + id, - method: 'delete' + url: 'api/dept', + method: 'delete', + data: ids }) } @@ -30,3 +31,5 @@ export function edit(data) { data }) } + +export default { add, edit, del, getDepts } diff --git a/src/api/dict.js b/src/api/system/dict.js similarity index 72% rename from src/api/dict.js rename to src/api/system/dict.js index 7d37a9c..11911cf 100644 --- a/src/api/dict.js +++ b/src/api/system/dict.js @@ -1,5 +1,12 @@ import request from '@/utils/request' +export function getDicts() { + return request({ + url: 'api/dict/all', + method: 'get' + }) +} + export function add(data) { return request({ url: 'api/dict', @@ -22,3 +29,5 @@ export function edit(data) { data }) } + +export default { add, edit, del } diff --git a/src/api/dictDetail.js b/src/api/system/dictDetail.js similarity index 95% rename from src/api/dictDetail.js rename to src/api/system/dictDetail.js index b03d1cc..e8dc512 100644 --- a/src/api/dictDetail.js +++ b/src/api/system/dictDetail.js @@ -48,3 +48,5 @@ export function edit(data) { data }) } + +export default { add, edit, del } diff --git a/src/api/job.js b/src/api/system/job.js similarity index 79% rename from src/api/job.js rename to src/api/system/job.js index b887eae..2888c05 100644 --- a/src/api/job.js +++ b/src/api/system/job.js @@ -21,10 +21,11 @@ export function add(data) { }) } -export function del(id) { +export function del(ids) { return request({ - url: 'api/job/' + id, - method: 'delete' + url: 'api/job', + method: 'delete', + data: ids }) } @@ -35,3 +36,5 @@ export function edit(data) { data }) } + +export default { add, edit, del } diff --git a/src/api/menu.js b/src/api/system/menu.js similarity index 78% rename from src/api/menu.js rename to src/api/system/menu.js index 52a3737..4e8ac90 100644 --- a/src/api/menu.js +++ b/src/api/system/menu.js @@ -1,6 +1,5 @@ import request from '@/utils/request' -// 获取所有的菜单树 export function getMenusTree() { return request({ url: 'api/menus/tree', @@ -23,10 +22,11 @@ export function add(data) { }) } -export function del(id) { +export function del(ids) { return request({ - url: 'api/menus/' + id, - method: 'delete' + url: 'api/menus', + method: 'delete', + data: ids }) } @@ -37,3 +37,5 @@ export function edit(data) { data }) } + +export default { add, edit, del, getMenusTree } diff --git a/src/api/role.js b/src/api/system/role.js similarity index 78% rename from src/api/role.js rename to src/api/system/role.js index baf5124..1f7bc1e 100644 --- a/src/api/role.js +++ b/src/api/system/role.js @@ -30,10 +30,11 @@ export function getLevel() { }) } -export function del(id) { +export function del(ids) { return request({ - url: 'api/roles/' + id, - method: 'delete' + url: 'api/roles', + method: 'delete', + data: ids }) } @@ -45,14 +46,6 @@ export function edit(data) { }) } -export function editPermission(data) { - return request({ - url: 'api/roles/permission', - method: 'put', - data - }) -} - export function editMenu(data) { return request({ url: 'api/roles/menu', @@ -60,3 +53,5 @@ export function editMenu(data) { data }) } + +export default { add, edit, del, get, editMenu, getLevel } diff --git a/src/api/timing.js b/src/api/system/timing.js similarity index 77% rename from src/api/timing.js rename to src/api/system/timing.js index cdbfddc..613e15f 100644 --- a/src/api/timing.js +++ b/src/api/system/timing.js @@ -8,10 +8,11 @@ export function add(data) { }) } -export function del(id) { +export function del(ids) { return request({ - url: 'api/jobs/' + id, - method: 'delete' + url: 'api/jobs', + method: 'delete', + data: ids }) } @@ -36,3 +37,5 @@ export function execution(id) { method: 'put' }) } + +export default { del, updateIsPause, execution, add, edit } diff --git a/src/api/user.js b/src/api/system/user.js similarity index 50% rename from src/api/user.js rename to src/api/system/user.js index 49e2777..6cd91a5 100644 --- a/src/api/user.js +++ b/src/api/system/user.js @@ -1,4 +1,5 @@ import request from '@/utils/request' +import { encrypt } from '@/utils/rsaEncrypt' export function add(data) { return request({ @@ -7,24 +8,26 @@ export function add(data) { data }) } -export function downloadUser() { + +export function del(ids) { return request({ - url: 'api/users/download', - method: 'get', - responseType: 'blob' + url: 'api/users', + method: 'delete', + data: ids }) } -export function del(id) { +export function edit(data) { return request({ - url: 'api/users/' + id, - method: 'delete' + url: 'api/users', + method: 'put', + data }) } -export function edit(data) { +export function editUser(data) { return request({ - url: 'api/users', + url: 'api/users/center', method: 'put', data }) @@ -32,8 +35,8 @@ export function edit(data) { export function updatePass(user) { const data = { - oldPass: user.oldPass, - newPass: user.newPass + oldPass: encrypt(user.oldPass), + newPass: encrypt(user.newPass) } return request({ url: 'api/users/updatePass/', @@ -42,11 +45,17 @@ export function updatePass(user) { }) } -export function updateEmail(code, data) { +export function updateEmail(form) { + const data = { + password: encrypt(form.pass), + email: form.email + } return request({ - url: 'api/users/updateEmail/' + code, + url: 'api/users/updateEmail/' + form.code, method: 'post', data }) } +export default { add, edit, del } + diff --git a/src/api/alipay.js b/src/api/tools/alipay.js similarity index 100% rename from src/api/alipay.js rename to src/api/tools/alipay.js diff --git a/src/api/email.js b/src/api/tools/email.js similarity index 100% rename from src/api/email.js rename to src/api/tools/email.js diff --git a/src/api/localStorage.js b/src/api/tools/localStorage.js similarity index 72% rename from src/api/localStorage.js rename to src/api/tools/localStorage.js index b2e1bdb..63ebe2b 100644 --- a/src/api/localStorage.js +++ b/src/api/tools/localStorage.js @@ -8,14 +8,7 @@ export function add(data) { }) } -export function del(id) { - return request({ - url: 'api/localStorage/' + id, - method: 'delete' - }) -} - -export function delAll(ids) { +export function del(ids) { return request({ url: 'api/localStorage/', method: 'delete', @@ -30,3 +23,5 @@ export function edit(data) { data }) } + +export default { add, edit, del } diff --git a/src/api/tools/picture.js b/src/api/tools/picture.js new file mode 100644 index 0000000..237d5f5 --- /dev/null +++ b/src/api/tools/picture.js @@ -0,0 +1,18 @@ +import request from '@/utils/request' + +export function del(ids) { + return request({ + url: 'api/pictures', + method: 'delete', + data: ids + }) +} + +export function sync() { + return request({ + url: 'api/pictures/synchronize', + method: 'post' + }) +} + +export default { del, sync } diff --git a/src/api/qiniu.js b/src/api/tools/qiniu.js similarity index 68% rename from src/api/qiniu.js rename to src/api/tools/qiniu.js index d5b979b..6d56771 100644 --- a/src/api/qiniu.js +++ b/src/api/tools/qiniu.js @@ -2,26 +2,19 @@ import request from '@/utils/request' export function get() { return request({ - url: 'api/qiNiuConfig', + url: 'api/qiNiuContent/config', method: 'get' }) } export function update(data) { return request({ - url: 'api/qiNiuConfig', + url: 'api/qiNiuContent/config', data, method: 'put' }) } -export function del(id) { - return request({ - url: 'api/qiNiuContent/' + id, - method: 'delete' - }) -} - export function download(id) { return request({ url: 'api/qiNiuContent/download/' + id, @@ -36,10 +29,12 @@ export function sync() { }) } -export function delAll(ids) { +export function del(ids) { return request({ - url: 'api/qiNiuContent/', + url: 'api/qiNiuContent', method: 'delete', data: ids }) } + +export default { del, download, sync } diff --git a/src/api/visits.js b/src/api/visits.js index 9d04510..ce1165e 100644 --- a/src/api/visits.js +++ b/src/api/visits.js @@ -21,7 +21,6 @@ export function getChartData() { }) } - export function gett() { return request({ url: 'api/data/count', diff --git a/src/api/yxCache.js b/src/api/yxCache.js index 1d0e0e5..09e14fa 100644 --- a/src/api/yxCache.js +++ b/src/api/yxCache.js @@ -26,6 +26,6 @@ export function edit(data) { export function get() { return request({ url: 'api/yxCache', - method: 'get', + method: 'get' }) } diff --git a/src/api/yxExpress.js b/src/api/yxExpress.js index d01e44a..5e7635e 100644 --- a/src/api/yxExpress.js +++ b/src/api/yxExpress.js @@ -23,4 +23,3 @@ export function edit(data) { }) } - diff --git a/src/api/permission.js b/src/api/yxStoreBargainUser.js similarity index 54% rename from src/api/permission.js rename to src/api/yxStoreBargainUser.js index b8683e8..85c2a03 100644 --- a/src/api/permission.js +++ b/src/api/yxStoreBargainUser.js @@ -1,16 +1,8 @@ import request from '@/utils/request' -// 获取所有的权限树 -export function getPermissionTree() { - return request({ - url: 'api/permissions/tree', - method: 'get' - }) -} - export function add(data) { return request({ - url: 'api/permissions', + url: 'api/yxStoreBargainUser', method: 'post', data }) @@ -18,14 +10,14 @@ export function add(data) { export function del(id) { return request({ - url: 'api/permissions/' + id, + url: 'api/yxStoreBargainUser/' + id, method: 'delete' }) } export function edit(data) { return request({ - url: 'api/permissions', + url: 'api/yxStoreBargainUser', method: 'put', data }) diff --git a/src/api/yxStoreCategory.js b/src/api/yxStoreCategory.js index 6755cfe..60588fb 100644 --- a/src/api/yxStoreCategory.js +++ b/src/api/yxStoreCategory.js @@ -30,3 +30,5 @@ export function edit(data) { data }) } + +export default { add, edit, del, getCates } diff --git a/src/api/yxStoreOrder.js b/src/api/yxStoreOrder.js index 70e0116..986ba50 100644 --- a/src/api/yxStoreOrder.js +++ b/src/api/yxStoreOrder.js @@ -31,25 +31,9 @@ export function refund(data) { }) } -export function editOrder(data) { - return request({ - url: 'api/yxStoreOrder/edit', - method: 'post', - data - }) -} - -export function remark(data) { - return request({ - url: 'api/yxStoreOrder/remark', - method: 'post', - data - }) -} - export function get() { return request({ url: 'api/yxExpress', - method: 'get', + method: 'get' }) } diff --git a/src/api/yxStoreProduct.js b/src/api/yxStoreProduct.js index 5b8e1ea..8f01cf3 100644 --- a/src/api/yxStoreProduct.js +++ b/src/api/yxStoreProduct.js @@ -38,7 +38,7 @@ export function recovery(id) { }) } -export function isFormatAttr(id,data) { +export function isFormatAttr(id, data) { return request({ url: 'api/yxStoreProduct/isFormatAttr/' + id, method: 'post', @@ -46,7 +46,7 @@ export function isFormatAttr(id,data) { }) } -export function setAttr(id,data) { +export function setAttr(id, data) { return request({ url: 'api/yxStoreProduct/setAttr/' + id, method: 'post', @@ -54,19 +54,17 @@ export function setAttr(id,data) { }) } - export function clearAttr(id) { return request({ url: 'api/yxStoreProduct/clearAttr/' + id, - method: 'post', + method: 'post' }) } export function getAttr(id) { return request({ url: 'api/yxStoreProduct/attr/' + id, - method: 'get', + method: 'get' }) } - diff --git a/src/api/yxStoreSeckill.js b/src/api/yxStoreSeckill.js index 28fd6dc..38f8b03 100644 --- a/src/api/yxStoreSeckill.js +++ b/src/api/yxStoreSeckill.js @@ -1,24 +1,24 @@ -import request from '@/utils/request' - -export function add(data) { - return request({ - url: 'api/yxStoreSeckill', - method: 'post', - data - }) -} - -export function del(id) { - return request({ - url: 'api/yxStoreSeckill/' + id, - method: 'delete' - }) -} - -export function edit(data) { - return request({ - url: 'api/yxStoreSeckill', - method: 'put', - data - }) -} +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/yxStoreSeckill', + method: 'post', + data + }) +} + +export function del(id) { + return request({ + url: 'api/yxStoreSeckill/' + id, + method: 'delete' + }) +} + +export function edit(data) { + return request({ + url: 'api/yxStoreSeckill', + method: 'put', + data + }) +} diff --git a/src/api/yxSystemConfig.js b/src/api/yxSystemConfig.js index f7486a8..0d06a85 100644 --- a/src/api/yxSystemConfig.js +++ b/src/api/yxSystemConfig.js @@ -26,7 +26,7 @@ export function edit(data) { export function get() { return request({ url: 'api/yxSystemConfig?size=50', - method: 'get', + method: 'get' }) } diff --git a/src/api/yxWechatReply.js b/src/api/yxWechatReply.js index ce6c5eb..e6db3e9 100644 --- a/src/api/yxWechatReply.js +++ b/src/api/yxWechatReply.js @@ -26,7 +26,7 @@ export function edit(data) { export function get() { return request({ url: 'api/yxWechatReply', - method: 'get', + method: 'get' }) } diff --git a/src/api/yxWechatTemplate.js b/src/api/yxWechatTemplate.js index aa3baec..4935309 100644 --- a/src/api/yxWechatTemplate.js +++ b/src/api/yxWechatTemplate.js @@ -26,7 +26,7 @@ export function edit(data) { export function get() { return request({ url: 'api/yxWechatTemplate', - method: 'get', + method: 'get' }) } diff --git a/src/assets/avatar/avatar.png b/src/assets/avatar/avatar.png deleted file mode 100644 index e16488e4534d25626ac002e04ce9c64cd834ade2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4097 zcmV+c5dQCpP)Px^yGcYrRCodHU0rM(#T}p7yR)4S=hJa)5<4-$`5=7x1IRfzaZ@Bflp2H^go(VkSwe2zf9S0@8`mxUjS#f%rblWo1;)5=c~I>5a{#~+~T%=1(fcga^T zJc?9w4+?|7(35QcFgz)!tq>OT{-NQ!Qzn0v3DFsr3`+QNJ{&W|)7{C=PnGb?W1<}3 z!NITA&4}rjiSa?owaWSD>96E3CS_|?PrOq$M)ZK>zSZs z4IJRUf#C;D#@<}AxwaUBl$)vR?TLMRJ3lBEMaFZf-Fw*rQErVN{bc0#)DQfA1>9`Q zWbVmL!8VqS$W{enNO=@U4jvr*V$-Zh{h2^cN|ADr6QLq|D8XZobamZvR<^3r0k#GL zQsQH(K{Ux0b}`c1>nAc+ST-bES~e{b$ID~i zKG^!&NFZVwSWVE2LW?Nw9E%x0_1l;23t;#Q6e*RQ8_Z`#W6nRsV*JPV?CCgGE{C!K zMr|3Df{M>A*Yqyap?lNd-R0J<%ksf!=Q3&vRls!#lAmbkwJXMd!^yY2V>v>{inptQ#!9g$&A0M zb|tG@zlPPWT+XVh60Dkj2-jw2*$n-rF8{zTPF`aFo4PEMZ6LHT#7J|wAM!Fl;Tk9m z`H9(Uqfzj?WC*tThI;yKv_N%ZZGipXZ_d;20!=cZLQ&U%N>`$~&FxU5t0LOUu{53= z1#ppD@9MaP-MDqLYjA-jayQZ-Eof*PQ0YpKt-H#ct|A>BJpPn0&DXS5IwRQD<{Q|S zrba1Z{^!gD`}gT@q|ge22sey_`@7m-ccSeGaC#2a)l<6X-d)>USp9}|PWpO!f8pEj z*ojl)p3*3bOht7SU$)(8j+bK*jR|tPgNvLi8(aVdnxL&^prYEs#zDA}IT%x0O_LAl zTx*8E+`V&~gPQ(cfAz1gt(vw!D)LjKR&5v}S!zmd$sCM%%Q}OL+VZxR;O7;92YBfg zfQ>b`yo6vy0k%eoG@q1?rch0FRSEUvyaEsK(lQW6rN)no0*vJ(S}K$!6xz9}f=XUq zb)sxcYq|=Df&gP77-fI0*9xJB3T;0U>1ZyLMY6bk_6%siMIMbCdKi)Y&cVeqthySWy^ zE(c(2n?U{SkGdfib{utI@o*2>DHX&OLHTOCXGNmmb)}%4K zZjT&*spkCn^;de|VLVrLn3+}2)2oj87|sKXt%|UljaPzU#mD%q>JSD`&pHx@7M7WW z^8jNXDk_51H7q?#o|^zOF;s`C%U4vh^vn+!T6>CRQqBX6O~yP^3o!wv*{BW|C%;$C zvOIoSSk41Xy&;hT7;~sp7Mb7`g?U@}BC@fx0JfHVhPORnd0#1|!W=49K_xEd z?U52bOITF4FhMS;0NP$jK|pLxL6 ziVAGwv|4Rr#2Nse^hEDdRC=I1Ddr+Fu%*fsj-084#c2UvO8^T!rwT4ki!0VjtTbpr zcO?faHoGczz!o_;k^mb9XAK+cSjQc^*xEI#0<+ojnMSi+)~Dp{P4ev3{u z3o{!xHEv*y8#k~-BE2Wc&h1;-$QLK14bEbavufYJQz#Q30BK zFb->eY`d8?Z*Eust}XeR)wNRB@?u>uXl4f#)sW%Nw%u&q+SS>ww7dtlXeMb3 za6BGoJ6pH1+jh6IWi{1~MuhQY_+!ujtzrR1_pLYI#I|p1reh4rgxUr^MO76&bMUfd zHLU&ioor*h`vY3Ah8OqtyLr^sCX_nleycxcC$qUH4+Fa@?&Hw-!B5w8UN#;0S@**4nURaMCM$1?qHDIHq2Y@(vt zGIObD(%;#bra5zVL^=ltf?Jz6v1$dIm}QG$`{N+|ZZ@Cndz2JgnnKv`GJ|QlX2aRx zY@vd_U$K0dHRKmGpF;FY^)VNUFXP#!#(Fk!{vx}2by@~FcQi7XS~)m#WXm~sDgDRV zTwuu0KUH@W;E(ZB88A7ag+`|ohI95YJoCT(Yotgc-V zh&X~93(iqm0C3OVw$G`UJ|tU$V2dW%(gsU!RUpMQKa|EUSM~(}<27}TznB}%|3B6J z&i*A1jzSQ_qs1^Q2yl0@t(S_DL76K0nM5a34jpL8?$H8Pz^ssN1p!7xVel6UB`Eiq zY^BPTLx*&-ZBYuVq5$_K+drgQ(XcFo$W}_0Tw&0WTAC3?7FIPL<_7^+x=5>=1U=P((rY8CDl z284whaA7T103+i5yKX&0k)Lo&7-=d&t_5IwU;r%KQg#h62=3e4`2kh7{@|8)C7xsp zknJrDJdkzegR|+8AC8kh?xSlm`+4O)SPM|@9U{NGkFIlGIC;v!APfcx9(#no4A;ek z7lA5q7g_+ewruVZTu|~1FcNij-Eo%1_&Y*aBj^%LGY8wk#(s471uz(6 zB!jm4`xV_*K=y+~ZrVB6wA3h3ZuH{+JlCR&k?I{f{s1@4ztCpu>d#&;CR7BUqgY1H zl>si)mj*D1eR6DM&s<9U&F{bjXf4S=6)N~#zr}L4?W6(>!q%C2De*B4A~$6-s@#{h z0GdLmE&HiZ72@FA2j>%ofC(d>M8iD)UFCma3&2*enQU;uO?nQtRj_)z29Cc(9DYmp zf$_2VMe$0&VykZIer*38I*@|UA#lU@4Gcd>TllQvmTYdOT#K0) z`;u*MSjBS@P-H$<2Cyyk;NVy5X2kT%#Q5M+@y!5}S{1Khew&+VHny!~T$KZC3*A37 ze0R#^uTs|Tw4W`?E6rQR)Yk4~=ci%l7aG8}vgsZ$@jT_`F8kSHxKgei#EJu1JyPY` zBy@mn!TX0sdr~R$Ir7%`+RvhS<%h5ktk_y1)jDYdu&sFS!04TvndG0@qXf2gTd3P| z=3eO+1PYpV+_;mnPz_MdhD+v<;vja5%vn0knc?#CGy_Y>gh1B~nlAzum5S!`NE zMe$qMHX(myeaPa?v)2~jc?s!eczC$(%8c?ww= zin4dJkAF(oh!m6mnS$;^HKJAT9rO%Aw zm+8qA#W_#LIEiiWu~RxW({7>tmh*W requireContext.keys().map(requireContext) const req = require.context('./svg', false, /\.svg$/) +const requireAll = requireContext => requireContext.keys().map(requireContext) requireAll(req) diff --git a/src/icons/svg/Sign.svg b/src/assets/icons/svg/Sign.svg similarity index 100% rename from src/icons/svg/Sign.svg rename to src/assets/icons/svg/Sign.svg diff --git a/src/icons/svg/Steve-Jobs.svg b/src/assets/icons/svg/Steve-Jobs.svg similarity index 100% rename from src/icons/svg/Steve-Jobs.svg rename to src/assets/icons/svg/Steve-Jobs.svg diff --git a/src/icons/svg/add.svg b/src/assets/icons/svg/add.svg similarity index 100% rename from src/icons/svg/add.svg rename to src/assets/icons/svg/add.svg diff --git a/src/icons/svg/alipay.svg b/src/assets/icons/svg/alipay.svg similarity index 100% rename from src/icons/svg/alipay.svg rename to src/assets/icons/svg/alipay.svg diff --git a/src/icons/svg/anq.svg b/src/assets/icons/svg/anq.svg similarity index 100% rename from src/icons/svg/anq.svg rename to src/assets/icons/svg/anq.svg diff --git a/src/assets/icons/svg/app.svg b/src/assets/icons/svg/app.svg new file mode 100644 index 0000000..0796da3 --- /dev/null +++ b/src/assets/icons/svg/app.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/article.svg b/src/assets/icons/svg/article.svg similarity index 100% rename from src/icons/svg/article.svg rename to src/assets/icons/svg/article.svg diff --git a/src/assets/icons/svg/backup.svg b/src/assets/icons/svg/backup.svg new file mode 100644 index 0000000..a3272a4 --- /dev/null +++ b/src/assets/icons/svg/backup.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/banner.svg b/src/assets/icons/svg/banner.svg similarity index 100% rename from src/icons/svg/banner.svg rename to src/assets/icons/svg/banner.svg diff --git a/src/icons/svg/bargain.svg b/src/assets/icons/svg/bargain.svg similarity index 100% rename from src/icons/svg/bargain.svg rename to src/assets/icons/svg/bargain.svg diff --git a/src/icons/svg/button.svg b/src/assets/icons/svg/button.svg similarity index 100% rename from src/icons/svg/button.svg rename to src/assets/icons/svg/button.svg diff --git a/src/icons/svg/chain.svg b/src/assets/icons/svg/chain.svg similarity index 100% rename from src/icons/svg/chain.svg rename to src/assets/icons/svg/chain.svg diff --git a/src/assets/icons/svg/chart.svg b/src/assets/icons/svg/chart.svg new file mode 100644 index 0000000..27728fb --- /dev/null +++ b/src/assets/icons/svg/chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/codeConsole.svg b/src/assets/icons/svg/codeConsole.svg similarity index 100% rename from src/icons/svg/codeConsole.svg rename to src/assets/icons/svg/codeConsole.svg diff --git a/src/icons/svg/comment.svg b/src/assets/icons/svg/comment.svg similarity index 100% rename from src/icons/svg/comment.svg rename to src/assets/icons/svg/comment.svg diff --git a/src/icons/svg/configure.svg b/src/assets/icons/svg/configure.svg similarity index 100% rename from src/icons/svg/configure.svg rename to src/assets/icons/svg/configure.svg diff --git a/src/icons/svg/coupon.svg b/src/assets/icons/svg/coupon.svg similarity index 100% rename from src/icons/svg/coupon.svg rename to src/assets/icons/svg/coupon.svg diff --git a/src/icons/svg/coupon2.svg b/src/assets/icons/svg/coupon2.svg similarity index 100% rename from src/icons/svg/coupon2.svg rename to src/assets/icons/svg/coupon2.svg diff --git a/src/icons/svg/index.svg b/src/assets/icons/svg/dashboard.svg similarity index 100% rename from src/icons/svg/index.svg rename to src/assets/icons/svg/dashboard.svg diff --git a/src/assets/icons/svg/database.svg b/src/assets/icons/svg/database.svg new file mode 100644 index 0000000..7fbad9b --- /dev/null +++ b/src/assets/icons/svg/database.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/date.svg b/src/assets/icons/svg/date.svg similarity index 100% rename from src/icons/svg/date.svg rename to src/assets/icons/svg/date.svg diff --git a/src/icons/svg/dengji.svg b/src/assets/icons/svg/dengji.svg similarity index 100% rename from src/icons/svg/dengji.svg rename to src/assets/icons/svg/dengji.svg diff --git a/src/assets/icons/svg/deploy.svg b/src/assets/icons/svg/deploy.svg new file mode 100644 index 0000000..f4a1c56 --- /dev/null +++ b/src/assets/icons/svg/deploy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/dept.svg b/src/assets/icons/svg/dept.svg similarity index 100% rename from src/icons/svg/dept.svg rename to src/assets/icons/svg/dept.svg diff --git a/src/icons/svg/dev.svg b/src/assets/icons/svg/dev.svg similarity index 100% rename from src/icons/svg/dev.svg rename to src/assets/icons/svg/dev.svg diff --git a/src/icons/svg/develop.svg b/src/assets/icons/svg/develop.svg similarity index 100% rename from src/icons/svg/develop.svg rename to src/assets/icons/svg/develop.svg diff --git a/src/icons/svg/dictionary.svg b/src/assets/icons/svg/dictionary.svg similarity index 100% rename from src/icons/svg/dictionary.svg rename to src/assets/icons/svg/dictionary.svg diff --git a/src/assets/icons/svg/edit.svg b/src/assets/icons/svg/edit.svg new file mode 100644 index 0000000..d26101f --- /dev/null +++ b/src/assets/icons/svg/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/education.svg b/src/assets/icons/svg/education.svg new file mode 100644 index 0000000..7bfb01d --- /dev/null +++ b/src/assets/icons/svg/education.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/email.svg b/src/assets/icons/svg/email.svg similarity index 100% rename from src/icons/svg/email.svg rename to src/assets/icons/svg/email.svg diff --git a/src/icons/svg/error.svg b/src/assets/icons/svg/error.svg similarity index 100% rename from src/icons/svg/error.svg rename to src/assets/icons/svg/error.svg diff --git a/src/assets/icons/svg/exit-fullscreen.svg b/src/assets/icons/svg/exit-fullscreen.svg new file mode 100644 index 0000000..485c128 --- /dev/null +++ b/src/assets/icons/svg/exit-fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/express.svg b/src/assets/icons/svg/express.svg similarity index 100% rename from src/icons/svg/express.svg rename to src/assets/icons/svg/express.svg diff --git a/src/icons/svg/fenxiao.svg b/src/assets/icons/svg/fenxiao.svg similarity index 100% rename from src/icons/svg/fenxiao.svg rename to src/assets/icons/svg/fenxiao.svg diff --git a/src/assets/icons/svg/fullscreen.svg b/src/assets/icons/svg/fullscreen.svg new file mode 100644 index 0000000..0e86b6f --- /dev/null +++ b/src/assets/icons/svg/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/fwb.svg b/src/assets/icons/svg/fwb.svg similarity index 100% rename from src/icons/svg/fwb.svg rename to src/assets/icons/svg/fwb.svg diff --git a/src/icons/svg/github.svg b/src/assets/icons/svg/github.svg similarity index 100% rename from src/icons/svg/github.svg rename to src/assets/icons/svg/github.svg diff --git a/src/icons/svg/gonggao.svg b/src/assets/icons/svg/gonggao.svg similarity index 100% rename from src/icons/svg/gonggao.svg rename to src/assets/icons/svg/gonggao.svg diff --git a/src/icons/svg/ic-yesterday.svg b/src/assets/icons/svg/ic-yesterday.svg similarity index 100% rename from src/icons/svg/ic-yesterday.svg rename to src/assets/icons/svg/ic-yesterday.svg diff --git a/src/icons/svg/icon.svg b/src/assets/icons/svg/icon.svg similarity index 100% rename from src/icons/svg/icon.svg rename to src/assets/icons/svg/icon.svg diff --git a/src/icons/svg/image.svg b/src/assets/icons/svg/image.svg similarity index 100% rename from src/icons/svg/image.svg rename to src/assets/icons/svg/image.svg diff --git a/src/assets/icons/svg/index.svg b/src/assets/icons/svg/index.svg new file mode 100644 index 0000000..5317d37 --- /dev/null +++ b/src/assets/icons/svg/index.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/international.svg b/src/assets/icons/svg/international.svg new file mode 100644 index 0000000..e9b56ee --- /dev/null +++ b/src/assets/icons/svg/international.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/ipvisits.svg b/src/assets/icons/svg/ipvisits.svg similarity index 100% rename from src/icons/svg/ipvisits.svg rename to src/assets/icons/svg/ipvisits.svg diff --git a/src/icons/svg/java.svg b/src/assets/icons/svg/java.svg similarity index 100% rename from src/icons/svg/java.svg rename to src/assets/icons/svg/java.svg diff --git a/src/assets/icons/svg/link.svg b/src/assets/icons/svg/link.svg new file mode 100644 index 0000000..48197ba --- /dev/null +++ b/src/assets/icons/svg/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/list.svg b/src/assets/icons/svg/list.svg similarity index 100% rename from src/icons/svg/list.svg rename to src/assets/icons/svg/list.svg diff --git a/src/icons/svg/lock.svg b/src/assets/icons/svg/lock.svg similarity index 100% rename from src/icons/svg/lock.svg rename to src/assets/icons/svg/lock.svg diff --git a/src/icons/svg/log.svg b/src/assets/icons/svg/log.svg similarity index 100% rename from src/icons/svg/log.svg rename to src/assets/icons/svg/log.svg diff --git a/src/assets/icons/svg/login.svg b/src/assets/icons/svg/login.svg new file mode 100644 index 0000000..cc5a854 --- /dev/null +++ b/src/assets/icons/svg/login.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/markdown.svg b/src/assets/icons/svg/markdown.svg similarity index 100% rename from src/icons/svg/markdown.svg rename to src/assets/icons/svg/markdown.svg diff --git a/src/icons/svg/menu.svg b/src/assets/icons/svg/menu.svg similarity index 100% rename from src/icons/svg/menu.svg rename to src/assets/icons/svg/menu.svg diff --git a/src/assets/icons/svg/message.svg b/src/assets/icons/svg/message.svg new file mode 100644 index 0000000..14ca817 --- /dev/null +++ b/src/assets/icons/svg/message.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/mnt.svg b/src/assets/icons/svg/mnt.svg new file mode 100644 index 0000000..502a7c0 --- /dev/null +++ b/src/assets/icons/svg/mnt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/money.svg b/src/assets/icons/svg/money.svg similarity index 100% rename from src/icons/svg/money.svg rename to src/assets/icons/svg/money.svg diff --git a/src/icons/svg/monitor.svg b/src/assets/icons/svg/monitor.svg similarity index 100% rename from src/icons/svg/monitor.svg rename to src/assets/icons/svg/monitor.svg diff --git a/src/icons/svg/monthlyview.svg b/src/assets/icons/svg/monthlyview.svg similarity index 100% rename from src/icons/svg/monthlyview.svg rename to src/assets/icons/svg/monthlyview.svg diff --git a/src/assets/icons/svg/nested.svg b/src/assets/icons/svg/nested.svg new file mode 100644 index 0000000..06713a8 --- /dev/null +++ b/src/assets/icons/svg/nested.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/news.svg b/src/assets/icons/svg/news.svg similarity index 100% rename from src/icons/svg/news.svg rename to src/assets/icons/svg/news.svg diff --git a/src/icons/svg/order.svg b/src/assets/icons/svg/order.svg similarity index 100% rename from src/icons/svg/order.svg rename to src/assets/icons/svg/order.svg diff --git a/src/icons/svg/password.svg b/src/assets/icons/svg/password.svg similarity index 100% rename from src/icons/svg/password.svg rename to src/assets/icons/svg/password.svg diff --git a/src/assets/icons/svg/people.svg b/src/assets/icons/svg/people.svg new file mode 100644 index 0000000..2bd54ae --- /dev/null +++ b/src/assets/icons/svg/people.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/peoples.svg b/src/assets/icons/svg/peoples.svg similarity index 100% rename from src/icons/svg/peoples.svg rename to src/assets/icons/svg/peoples.svg diff --git a/src/icons/svg/permission.svg b/src/assets/icons/svg/permission.svg similarity index 100% rename from src/icons/svg/permission.svg rename to src/assets/icons/svg/permission.svg diff --git a/src/icons/svg/phone.svg b/src/assets/icons/svg/phone.svg similarity index 100% rename from src/icons/svg/phone.svg rename to src/assets/icons/svg/phone.svg diff --git a/src/icons/svg/points.svg b/src/assets/icons/svg/points.svg similarity index 100% rename from src/icons/svg/points.svg rename to src/assets/icons/svg/points.svg diff --git a/src/icons/svg/pt.svg b/src/assets/icons/svg/pt.svg similarity index 100% rename from src/icons/svg/pt.svg rename to src/assets/icons/svg/pt.svg diff --git a/src/icons/svg/qiniu.svg b/src/assets/icons/svg/qiniu.svg similarity index 100% rename from src/icons/svg/qiniu.svg rename to src/assets/icons/svg/qiniu.svg diff --git a/src/icons/svg/redis.svg b/src/assets/icons/svg/redis.svg similarity index 100% rename from src/icons/svg/redis.svg rename to src/assets/icons/svg/redis.svg diff --git a/src/icons/svg/reply.svg b/src/assets/icons/svg/reply.svg similarity index 100% rename from src/icons/svg/reply.svg rename to src/assets/icons/svg/reply.svg diff --git a/src/icons/svg/role.svg b/src/assets/icons/svg/role.svg similarity index 100% rename from src/icons/svg/role.svg rename to src/assets/icons/svg/role.svg diff --git a/src/icons/svg/run.svg b/src/assets/icons/svg/run.svg similarity index 100% rename from src/icons/svg/run.svg rename to src/assets/icons/svg/run.svg diff --git a/src/icons/svg/running.svg b/src/assets/icons/svg/running.svg similarity index 100% rename from src/icons/svg/running.svg rename to src/assets/icons/svg/running.svg diff --git a/src/icons/svg/search.svg b/src/assets/icons/svg/search.svg similarity index 100% rename from src/icons/svg/search.svg rename to src/assets/icons/svg/search.svg diff --git a/src/icons/svg/seckill.svg b/src/assets/icons/svg/seckill.svg similarity index 100% rename from src/icons/svg/seckill.svg rename to src/assets/icons/svg/seckill.svg diff --git a/src/assets/icons/svg/server.svg b/src/assets/icons/svg/server.svg new file mode 100644 index 0000000..db6dcdf --- /dev/null +++ b/src/assets/icons/svg/server.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/seven.svg b/src/assets/icons/svg/seven.svg similarity index 100% rename from src/icons/svg/seven.svg rename to src/assets/icons/svg/seven.svg diff --git a/src/icons/svg/shop.svg b/src/assets/icons/svg/shop.svg similarity index 100% rename from src/icons/svg/shop.svg rename to src/assets/icons/svg/shop.svg diff --git a/src/icons/svg/sign2.svg b/src/assets/icons/svg/sign2.svg similarity index 100% rename from src/icons/svg/sign2.svg rename to src/assets/icons/svg/sign2.svg diff --git a/src/assets/icons/svg/size.svg b/src/assets/icons/svg/size.svg new file mode 100644 index 0000000..ddb25b8 --- /dev/null +++ b/src/assets/icons/svg/size.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/skill.svg b/src/assets/icons/svg/skill.svg new file mode 100644 index 0000000..a3b7312 --- /dev/null +++ b/src/assets/icons/svg/skill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/source.svg b/src/assets/icons/svg/source.svg new file mode 100644 index 0000000..1c3a038 --- /dev/null +++ b/src/assets/icons/svg/source.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/sqlMonitor.svg b/src/assets/icons/svg/sqlMonitor.svg similarity index 100% rename from src/icons/svg/sqlMonitor.svg rename to src/assets/icons/svg/sqlMonitor.svg diff --git a/src/icons/svg/swagger.svg b/src/assets/icons/svg/swagger.svg similarity index 100% rename from src/icons/svg/swagger.svg rename to src/assets/icons/svg/swagger.svg diff --git a/src/icons/svg/sys-tools.svg b/src/assets/icons/svg/sys-tools.svg similarity index 100% rename from src/icons/svg/sys-tools.svg rename to src/assets/icons/svg/sys-tools.svg diff --git a/src/icons/svg/system.svg b/src/assets/icons/svg/system.svg similarity index 100% rename from src/icons/svg/system.svg rename to src/assets/icons/svg/system.svg diff --git a/src/assets/icons/svg/tab.svg b/src/assets/icons/svg/tab.svg new file mode 100644 index 0000000..b4b48e4 --- /dev/null +++ b/src/assets/icons/svg/tab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/task manege.svg b/src/assets/icons/svg/task manege.svg similarity index 100% rename from src/icons/svg/task manege.svg rename to src/assets/icons/svg/task manege.svg diff --git a/src/icons/svg/temp.svg b/src/assets/icons/svg/temp.svg similarity index 100% rename from src/icons/svg/temp.svg rename to src/assets/icons/svg/temp.svg diff --git a/src/assets/icons/svg/theme.svg b/src/assets/icons/svg/theme.svg new file mode 100644 index 0000000..5982a2f --- /dev/null +++ b/src/assets/icons/svg/theme.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/timing.svg b/src/assets/icons/svg/timing.svg similarity index 100% rename from src/icons/svg/timing.svg rename to src/assets/icons/svg/timing.svg diff --git a/src/icons/svg/tixian.svg b/src/assets/icons/svg/tixian.svg similarity index 100% rename from src/icons/svg/tixian.svg rename to src/assets/icons/svg/tixian.svg diff --git a/src/icons/svg/today.svg b/src/assets/icons/svg/today.svg similarity index 100% rename from src/icons/svg/today.svg rename to src/assets/icons/svg/today.svg diff --git a/src/icons/svg/tools.svg b/src/assets/icons/svg/tools.svg similarity index 100% rename from src/icons/svg/tools.svg rename to src/assets/icons/svg/tools.svg diff --git a/src/assets/icons/svg/tree-table.svg b/src/assets/icons/svg/tree-table.svg new file mode 100644 index 0000000..8aafdb8 --- /dev/null +++ b/src/assets/icons/svg/tree-table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/tree.svg b/src/assets/icons/svg/tree.svg new file mode 100644 index 0000000..dd4b7dd --- /dev/null +++ b/src/assets/icons/svg/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/unlock.svg b/src/assets/icons/svg/unlock.svg similarity index 100% rename from src/icons/svg/unlock.svg rename to src/assets/icons/svg/unlock.svg diff --git a/src/icons/svg/user.svg b/src/assets/icons/svg/user.svg similarity index 100% rename from src/icons/svg/user.svg rename to src/assets/icons/svg/user.svg diff --git a/src/icons/svg/user1.svg b/src/assets/icons/svg/user1.svg similarity index 100% rename from src/icons/svg/user1.svg rename to src/assets/icons/svg/user1.svg diff --git a/src/icons/svg/validCode.svg b/src/assets/icons/svg/validCode.svg similarity index 100% rename from src/icons/svg/validCode.svg rename to src/assets/icons/svg/validCode.svg diff --git a/src/icons/svg/visits.svg b/src/assets/icons/svg/visits.svg similarity index 100% rename from src/icons/svg/visits.svg rename to src/assets/icons/svg/visits.svg diff --git a/src/assets/icons/svg/web.svg b/src/assets/icons/svg/web.svg new file mode 100644 index 0000000..9c57415 --- /dev/null +++ b/src/assets/icons/svg/web.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/wechat.svg b/src/assets/icons/svg/wechat.svg similarity index 100% rename from src/icons/svg/wechat.svg rename to src/assets/icons/svg/wechat.svg diff --git a/src/icons/svg/weixin.svg b/src/assets/icons/svg/weixin.svg similarity index 100% rename from src/icons/svg/weixin.svg rename to src/assets/icons/svg/weixin.svg diff --git a/src/icons/svg/wxapp.svg b/src/assets/icons/svg/wxapp.svg similarity index 100% rename from src/icons/svg/wxapp.svg rename to src/assets/icons/svg/wxapp.svg diff --git a/src/icons/svg/wxpay.svg b/src/assets/icons/svg/wxpay.svg similarity index 100% rename from src/icons/svg/wxpay.svg rename to src/assets/icons/svg/wxpay.svg diff --git a/src/icons/svg/yingxiao.svg b/src/assets/icons/svg/yingxiao.svg similarity index 100% rename from src/icons/svg/yingxiao.svg rename to src/assets/icons/svg/yingxiao.svg diff --git a/src/icons/svg/zujian.svg b/src/assets/icons/svg/zujian.svg similarity index 100% rename from src/icons/svg/zujian.svg rename to src/assets/icons/svg/zujian.svg diff --git a/src/icons/svgo.yml b/src/assets/icons/svgo.yml similarity index 100% rename from src/icons/svgo.yml rename to src/assets/icons/svgo.yml diff --git a/src/assets/images/avatar.png b/src/assets/images/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..997732a452cdf6273ec7cd444dab69f1a4db4e48 GIT binary patch literal 1865 zcmZ`)c{tQtAODTza*@X1N<*aVWTtDs?k%!jYoY}WLiX#HElY(Ex>s3Bwz^c7C|g8? z;b+D&Gxl}JF!ptZGRzore|q14-ap>wIp_QRe3#GXoaa2}IVai9#_Wi|aRC4Tj#!u* z+e7}&;pFFrtneos1#&#zhSr7vQ1w`F-<=nVWj)O8tpOlX0RUp+0e}gmVwM0P6a@e) zZUCVF8~`N#%=>iF003aFc2*81P{Z`}G!{o_>mXq}h^-w&$bKIL2)A|+4l$mH#r-!= zAP}%P5*8%1f&?;|j0K@Q)Y%JxR*=|^?}cnDp45&%q~mbI{}JSHIN0t%NUE)aaEL*u z)OV;162Q(w1!#3h5DLF1ziWa7QvcZO+|nj(>)Q@ve}5k;O-)nx_Lz{u(C8#%caJi= zu)MO)V(rh)EwO(}N?EEEcPqIJCY&TU)1% zO-#4rNxQpy)cNHe(lDESu(-UovbxdH)i*Ug$6)Nzx4v#|f9oF{pPrfD+Wy)}8067L z2}4KxbBMjoC4gVuA*!&xV_X2x>YyQew!>{XkiHnIhi8sMb%8Z5G#cQ99jChoe)cI+=tDU$U#pbw*z+#CC8P=$~EobKL z=6ZU6$+Z$o5Lef3Y+t_pF>ZCMx;fa2` zW7kY|HT}}U2o-W?N)FJfO;ph&q$qW*DMJMTgr=v3sUS>^;Hg$sG#j%tlyR}-ZLAO? zN%GH~=ZvI z%3ipaV_Ex(faW=BW~>Y$cTlJk##zBHsnU!qe2@Kd7ND;W@gMtlm8a0)YTv~* zuUQ~+tkg92wzP86iLl@TH${)%UPs#?DefE99ukizBJlGmODZDaHT>EKPp-X%J<~ME zu%EL<$WOkF(hx<5J2gG{Xx`MRkgAt(Ub0!P>fyy_+ZHd+8l(&iVEy>-fSB6mslu_b zcjl>#yN@cXc>L}ex+338UtY^H5xm6xaQ1@_TkUzBlkQX9^tgJ&(+g6LPV?}OXYof3 zX-WZJFYvjxTf2(3FRR33Gqn?4gMPhV;7fKMGb67yNGBFd97_skgaju9mn9EG{UQWX zN=Xv@^eQQn8jYDtMSP)y~~w$$XsMrgg@)x+Kd)0m`id< zCn(vd&gN^;W7$)m#3d+K@QR@3*b@cYFR;WA!*sCdkIt6bp1h#w@|K6Ee~ff87(k~` z?`8W-)VJ-!p8Qm5M4_D;ub{XPnTns_|5&_a$C)~W-&xNpFcR(FfN z9jeTdW$_E7nXqiMpbO4Br^zw;wM^dqlVtl~a?Y>CKSmZNG{`nwP|vDy;@+~iB45cj zFV8sPdcxic*;Rz`mD)9}D&_HL4sN>;y_bK3z`jgC@tjk7!@oV-qa|}I);=1ot~0M? zBbC-;T{IKj}RiTaFBbVESTn0$!I z)eukj5HEd?+g^|Z&Z5wI>Sz=+98hQVwe<8gbyZO)eH1Fd=cU8{5CVfdeQ!qme}c4@ SBJ}40fQ5;T@p~h;xPJj%?#LPd literal 0 HcmV?d00001 diff --git a/src/assets/images/logo.png b/src/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b7371a5070ace402cedefb81b7a1a1164e314895 GIT binary patch literal 49551 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⁡aP|>b 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ν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 diff --git a/src/assets/styles/btn.scss b/src/assets/styles/btn.scss new file mode 100644 index 0000000..8f47f2c --- /dev/null +++ b/src/assets/styles/btn.scss @@ -0,0 +1,99 @@ +@import 'variables'; + +@mixin colorBtn($color) { + background: $color; + + &:hover { + color: $color; + + &:before, + &:after { + background: $color; + } + } +} + +.blue-btn { + @include colorBtn($blue) +} + +.light-blue-btn { + @include colorBtn($light-blue) +} + +.red-btn { + @include colorBtn($red) +} + +.pink-btn { + @include colorBtn($pink) +} + +.green-btn { + @include colorBtn($green) +} + +.tiffany-btn { + @include colorBtn($tiffany) +} + +.yellow-btn { + @include colorBtn($yellow) +} + +.pan-btn { + font-size: 14px; + color: #fff; + padding: 14px 36px; + border-radius: 8px; + border: none; + outline: none; + transition: 600ms ease all; + position: relative; + display: inline-block; + + &:hover { + background: #fff; + + &:before, + &:after { + width: 100%; + transition: 600ms ease all; + } + } + + &:before, + &:after { + content: ''; + position: absolute; + top: 0; + right: 0; + height: 2px; + width: 0; + transition: 400ms ease all; + } + + &::after { + right: inherit; + top: inherit; + left: 0; + bottom: 0; + } +} + +.custom-button { + display: inline-block; + line-height: 1; + white-space: nowrap; + cursor: pointer; + background: #fff; + color: #fff; + -webkit-appearance: none; + text-align: center; + box-sizing: border-box; + outline: 0; + margin: 0; + padding: 10px 15px; + font-size: 14px; + border-radius: 4px; +} diff --git a/src/styles/description.scss b/src/assets/styles/description.scss similarity index 100% rename from src/styles/description.scss rename to src/assets/styles/description.scss diff --git a/src/assets/styles/eladmin.scss b/src/assets/styles/eladmin.scss new file mode 100644 index 0000000..338cbba --- /dev/null +++ b/src/assets/styles/eladmin.scss @@ -0,0 +1,100 @@ +.head-container { + padding-bottom: 10px; + .filter-item { + display: inline-block; + vertical-align: middle; + margin: 0 2px 10px 0; + input { + height: 30.5px; + line-height: 30.5px; + } + } + .el-select__caret.el-input__icon.el-icon-arrow-up{ + line-height: 30.5px; + } + .date-item { + display: inline-block; + vertical-align: middle; + margin-bottom: 10px; + height: 30.5px; + width: 223px; + } +} +.el-avatar { + display: inline-block; + text-align: center; + background: #ccc; + color: #fff; + white-space: nowrap; + position: relative; + overflow: hidden; + vertical-align: middle; + width: 32px; + height: 32px; + line-height: 32px; + border-radius: 16px; +} + +.logo-con{ + height: 60px; + padding: 13px 0 0; + img{ + height: 32px; + width: 135px; + display: block; + //margin: 0 auto; + } +} + +#el-login-footer { + height: 40px; + line-height: 40px; + position: fixed; + bottom: 0; + width: 100%; + text-align: center; + color: #fff; + font-family: Arial, serif; + font-size: 12px; + letter-spacing: 1px; +} + +#el-main-footer { + background: none repeat scroll 0 0 white; + border-top: 1px solid #e7eaec; + overflow: hidden; + padding: 10px 6px 0 6px; + height: 33px; + font-size: 0.7rem !important; + color: #7a8b9a; + letter-spacing: 0.8px; + font-family: Arial, sans-serif !important; + position: fixed; + bottom: 0; + z-index: 99; + width: 100%; +} +.eladmin-upload { + border: 1px dashed #c0ccda; + border-radius: 5px; + height: 45px; + line-height: 45px; + width: 368px; +} +.my-blockquote{ + margin: 0 0 10px; + padding: 15px; + line-height: 22px; + border-left: 5px solid #00437B; + border-radius: 0 2px 2px 0; + background-color: #f2f2f2; +} +.my-code{ + position: relative; + padding: 15px; + line-height: 20px; + border-left: 5px solid #ddd; + color: #333; + font-family: Courier New, serif; + font-size: 12px +} diff --git a/src/assets/styles/element-ui.scss b/src/assets/styles/element-ui.scss new file mode 100644 index 0000000..8f7881c --- /dev/null +++ b/src/assets/styles/element-ui.scss @@ -0,0 +1,79 @@ +// cover some element-ui styles + +.el-breadcrumb__inner, +.el-breadcrumb__inner a { + font-weight: 400 !important; +} + +.el-upload { + input[type="file"] { + display: none !important; + } +} + +.el-upload__input { + display: none; +} + +.cell { + .el-tag { + margin-right: 0; + } +} + +.small-padding { + .cell { + padding-left: 5px; + padding-right: 5px; + } +} + +.fixed-width { + .el-button--mini { + padding: 7px 10px; + width: 60px; + } +} + +.status-col { + .cell { + padding: 0 10px; + text-align: center; + + .el-tag { + margin-right: 0; + } + } +} + +// to fixed https://github.com/ElemeFE/element/issues/2461 +.el-dialog { + transform: none; + left: 0; + position: relative; + margin: 0 auto; +} + +// refine element ui upload +.upload-container { + .el-upload { + width: 100%; + + .el-upload-dragger { + width: 100%; + height: 200px; + } + } +} + +// dropdown +.el-dropdown-menu { + a { + display: block + } +} + +// fix date-picker ui bug in filter-item +.el-range-editor.el-input__inner { + display: inline-flex !important; +} diff --git a/src/styles/element-variables.scss b/src/assets/styles/element-variables.scss similarity index 90% rename from src/styles/element-variables.scss rename to src/assets/styles/element-variables.scss index 30a0e6b..a4f8c4a 100644 --- a/src/styles/element-variables.scss +++ b/src/assets/styles/element-variables.scss @@ -22,7 +22,7 @@ $--table-border:1px solid#dfe6ec; /* icon font path, required */ $--font-path: '~element-ui/lib/theme-chalk/fonts'; -@import "~element-ui/packages/theme-chalk/src/index"; +@import "../../../node_modules/element-ui/packages/theme-chalk/src/index"; // the :export directive is the magic sauce for webpack // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss new file mode 100644 index 0000000..21fbda1 --- /dev/null +++ b/src/assets/styles/index.scss @@ -0,0 +1,182 @@ +@import 'variables'; +@import 'mixin'; +@import 'transition'; +@import 'element-ui'; +@import 'sidebar'; +@import 'btn'; +@import 'eladmin'; + +body { + height: 100%; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; +} + +label { + font-weight: 700; +} + +html { + height: 100%; + box-sizing: border-box; +} + +#app { + height: 100%; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +.no-padding { + padding: 0 !important; +} + +.padding-content { + padding: 4px 0; +} + +a:focus, +a:active { + outline: none; +} + +a, +a:focus, +a:hover { + cursor: pointer; + color: inherit; + text-decoration: none; +} + +div:focus { + outline: none; +} + +.fr { + float: right; +} + +.fl { + float: left; +} + +.pr-5 { + padding-right: 5px; +} + +.pl-5 { + padding-left: 5px; +} + +.block { + display: block; +} + +.pointer { + cursor: pointer; +} + +.inlineBlock { + display: block; +} + +.clearfix { + &:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; + } +} + +aside { + background: #eef1f6; + padding: 8px 24px; + margin-bottom: 20px; + border-radius: 2px; + display: block; + line-height: 32px; + font-size: 16px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + color: #2c3e50; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + a { + color: #337ab7; + cursor: pointer; + + &:hover { + color: rgb(32, 160, 255); + } + } +} + +//main-container全局样式 +.app-container { + padding: 20px 20px 45px 20px; +} + +.components-container { + margin: 30px 50px; + position: relative; +} + +.pagination-container { + margin-top: 30px; +} + +.text-center { + text-align: center +} + +.sub-navbar { + height: 50px; + line-height: 50px; + position: relative; + width: 100%; + text-align: right; + padding-right: 20px; + transition: 600ms ease position; + background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%); + + .subtitle { + font-size: 20px; + color: #fff; + } + + &.draft { + background: #d0d0d0; + } + + &.deleted { + background: #d0d0d0; + } +} + +.link-type, +.link-type:focus { + color: #337ab7; + cursor: pointer; + + &:hover { + color: rgb(32, 160, 255); + } +} + +//refine vue-multiselect plugin +.multiselect { + line-height: 16px; +} + +.multiselect--active { + z-index: 1000 !important; +} diff --git a/src/assets/styles/mixin.scss b/src/assets/styles/mixin.scss new file mode 100644 index 0000000..06fa061 --- /dev/null +++ b/src/assets/styles/mixin.scss @@ -0,0 +1,66 @@ +@mixin clearfix { + &:after { + content: ""; + display: table; + clear: both; + } +} + +@mixin scrollBar { + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } +} + +@mixin relative { + position: relative; + width: 100%; + height: 100%; +} + +@mixin pct($pct) { + width: #{$pct}; + position: relative; + margin: 0 auto; +} + +@mixin triangle($width, $height, $color, $direction) { + $width: $width/2; + $color-border-style: $height solid $color; + $transparent-border-style: $width solid transparent; + height: 0; + width: 0; + + @if $direction==up { + border-bottom: $color-border-style; + border-left: $transparent-border-style; + border-right: $transparent-border-style; + } + + @else if $direction==right { + border-left: $color-border-style; + border-top: $transparent-border-style; + border-bottom: $transparent-border-style; + } + + @else if $direction==down { + border-top: $color-border-style; + border-left: $transparent-border-style; + border-right: $transparent-border-style; + } + + @else if $direction==left { + border-right: $color-border-style; + border-top: $transparent-border-style; + border-bottom: $transparent-border-style; + } +} diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss new file mode 100644 index 0000000..17381fc --- /dev/null +++ b/src/assets/styles/sidebar.scss @@ -0,0 +1,209 @@ +#app { + + .main-container { + min-height: 100%; + transition: margin-left .28s; + margin-left: $sideBarWidth; + position: relative; + } + + .sidebar-container { + transition: width 0.28s; + width: $sideBarWidth !important; + background-color: $menuBg; + height: 100%; + position: fixed; + font-size: 0; + top: 0; + bottom: 0; + left: 0; + z-index: 1001; + overflow: hidden; + + // reset element-ui css + .horizontal-collapse-transition { + transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; + } + + .scrollbar-wrapper { + overflow-x: hidden !important; + } + + .el-scrollbar__bar.is-vertical { + right: 0; + } + + .el-scrollbar { + height: 100%; + } + + &.has-logo { + .el-scrollbar { + height: calc(100% - 50px); + } + } + + .is-horizontal { + display: none; + } + + a { + display: inline-block; + width: 100%; + overflow: hidden; + } + + .svg-icon { + margin-right: 16px; + } + + .el-menu { + border: none; + height: 100%; + width: 100% !important; + } + + // menu hover + .submenu-title-noDropdown, + .el-submenu__title { + &:hover { + background-color: $menuHover !important; + } + } + + .is-active>.el-submenu__title { + color: $subMenuActiveText !important; + } + + & .nest-menu .el-submenu>.el-submenu__title, + & .el-submenu .el-menu-item { + min-width: $sideBarWidth !important; + background-color: $subMenuBg !important; + + &:hover { + background-color: $subMenuHover !important; + } + } + } + + .hideSidebar { + .sidebar-container { + width: 54px !important; + } + + .main-container { + margin-left: 54px; + } + + .submenu-title-noDropdown { + padding: 0 !important; + position: relative; + + .el-tooltip { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + } + } + + .el-submenu { + overflow: hidden; + + &>.el-submenu__title { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + .el-submenu__icon-arrow { + display: none; + } + } + } + + .el-menu--collapse { + .el-submenu { + &>.el-submenu__title { + &>span { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + } + } + } + } + + .el-menu--collapse .el-menu .el-submenu { + min-width: $sideBarWidth !important; + } + + // mobile responsive + .mobile { + .main-container { + margin-left: 0; + } + + .sidebar-container { + transition: transform .28s; + width: $sideBarWidth !important; + } + + &.hideSidebar { + .sidebar-container { + pointer-events: none; + transition-duration: 0.3s; + transform: translate3d(-$sideBarWidth, 0, 0); + } + } + } + + .withoutAnimation { + + .main-container, + .sidebar-container { + transition: none; + } + } +} + +// when menu collapsed +.el-menu--vertical { + &>.el-menu { + .svg-icon { + margin-right: 16px; + } + } + + .nest-menu .el-submenu>.el-submenu__title, + .el-menu-item { + &:hover { + // you can use $subMenuHover + background-color: $menuHover !important; + } + } + + // the scroll bar appears when the subMenu is too long + >.el-menu--popup { + max-height: 100vh; + overflow-y: auto; + + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } + } +} diff --git a/src/styles/transition.scss b/src/assets/styles/transition.scss similarity index 87% rename from src/styles/transition.scss rename to src/assets/styles/transition.scss index 8dd9b04..4cb27cc 100644 --- a/src/styles/transition.scss +++ b/src/assets/styles/transition.scss @@ -1,6 +1,6 @@ -//globl transition css +// global transition css -/*fade*/ +/* fade */ .fade-enter-active, .fade-leave-active { transition: opacity 0.28s; @@ -11,21 +11,23 @@ opacity: 0; } -/*fade-transform*/ +/* fade-transform */ .fade-transform-leave-active, .fade-transform-enter-active { transition: all .5s; } + .fade-transform-enter { opacity: 0; transform: translateX(-30px); } + .fade-transform-leave-to { opacity: 0; transform: translateX(30px); } -/*fade*/ +/* breadcrumb transition */ .breadcrumb-enter-active, .breadcrumb-leave-active { transition: all .5s; diff --git a/src/styles/variables.scss b/src/assets/styles/variables.scss similarity index 75% rename from src/styles/variables.scss rename to src/assets/styles/variables.scss index 2130ff5..41de79c 100644 --- a/src/styles/variables.scss +++ b/src/assets/styles/variables.scss @@ -1,4 +1,14 @@ -//sidebar +// base color +$blue:#324157; +$light-blue:#3A71A8; +$red:#C03639; +$pink: #E65D6E; +$green: #30B08F; +$tiffany: #4AB7BD; +$yellow:#FEC171; +$panGreen: #30B08F; + +// sidebar $menuText:#bfcbd9; $menuActiveText:#409EFF; $subMenuActiveText:#f4f4f5; // https://github.com/ElemeFE/element/issues/12951 @@ -9,9 +19,7 @@ $menuHover:#263445; $subMenuBg:#1f2d3d; $subMenuHover:#001528; -$sideBarWidth: 180px; - -$hideSidebarWidth: 38px; +$sideBarWidth: 205px; // the :export directive is the magic sauce for webpack // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue index 96b78dc..204ea59 100644 --- a/src/components/Breadcrumb/index.vue +++ b/src/components/Breadcrumb/index.vue @@ -1,7 +1,7 @@