From f9c38ed1b72fc96b96c1d3ffdcc1a66b03bd3b73 Mon Sep 17 00:00:00 2001 From: inleft <inleft@qq.com> Date: Fri, 21 Jan 2022 18:03:07 +0800 Subject: [PATCH] 布局修改,小工具添加,mock数据接入,接口模拟请求 --- src/mock/util.js | 38 ++ .env | 3 src/components/mini/tagInfo.vue | 27 + src/mock/test/article.js | 89 ++++++ src/components/group/tool.vue | 28 + src/components/mini/box-friend.vue | 225 ++++++++++------- src/utils/request.js | 109 ++++++++ src/mock/index.js | 28 ++ src/components/group/boxRight.vue | 1 src/components/mini/box4-minibox.vue | 14 src/components/mini/Aplayer.vue | 2 src/main.js | 1 src/components/group/tempFriendBox.vue | 1 src/utils/axios.js | 35 ++ package.json | 1 src/components/swichLabel/main1-show.vue | 30 + src/api/appManage.js | 91 +++++++ src/components/layouts/baseLayout.vue | 6 src/App.vue | 7 src/components/mini/box1-info.vue | 7 20 files changed, 617 insertions(+), 126 deletions(-) diff --git a/.env b/.env new file mode 100644 index 0000000..154a510 --- /dev/null +++ b/.env @@ -0,0 +1,3 @@ +NODE_ENV=dev +VUE_APP_PREVIEW=true +VUE_APP_API_BASE_URL=http://localhost:82 \ No newline at end of file diff --git a/package.json b/package.json index 0d554fc..828db2c 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "core-js": "^2.6.5", "jsdom": "^18.1.1", "location": "0.0.1", + "mockjs2": "^1.0.8", "navigator": "^1.0.1", "text-loader": "^0.0.1", "vue": "^2.6.14", diff --git a/src/App.vue b/src/App.vue index c01b988..428e466 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,6 +1,6 @@ <template> - <div id="app" class="app" > - <router-view class="" ></router-view> + <div id="app" class="app"> + <router-view class=""></router-view> </div> </template> @@ -14,8 +14,7 @@ computed: {}, created() {}, watch: {}, - methods: { - } + methods: {} } </script> diff --git a/src/api/appManage.js b/src/api/appManage.js new file mode 100644 index 0000000..d03bcc0 --- /dev/null +++ b/src/api/appManage.js @@ -0,0 +1,91 @@ +/** + * 系统应用 + * + * @author yubaoshan + * @date 2020年4月23日12:10:57 + */ +import { axios } from '@/utils/request' + +/** + * 系统应用列表 + * + * @author yubaoshan + * @date 2020年7月9日15:05:01 + */ +export function getAppPage () { + return axios({ + url: '/list/article', + method: 'get', + }) +} + +/** + * 系统应用列表 + * + * @author yubaoshan + * @date 2020年7月9日15:05:01 + */ +export function getAppList (parameter) { + return axios({ + url: '/sysApp/list', + method: 'get', + params: parameter + }) +} + +/** + * 新增系统应用 + * + * @author yubaoshan + * @date 2020年7月9日15:05:01 + */ +export function sysAppAdd (parameter) { + return axios({ + url: '/sysApp/add', + method: 'post', + data: parameter + }) +} + +/** + * 编辑系统应用 + * + * @author yubaoshan + * @param parameter + * @returns {*} + */ +export function sysAppEdit (parameter) { + return axios({ + url: '/sysApp/edit', + method: 'post', + data: parameter + }) +} + +/** + * 删除系统应用 + * + * @author yubaoshan + * @date 2020年7月9日15:05:01 + */ +export function sysAppDelete (parameter) { + return axios({ + url: '/sysApp/delete', + method: 'post', + data: parameter + }) +} + +/** + * 设为默认应用 + * + * @author yubaoshan + * @date 2020年7月9日15:05:01 + */ +export function sysAppSetAsDefault (parameter) { + return axios({ + url: '/sysApp/setAsDefault', + method: 'post', + data: parameter + }) +} diff --git a/src/components/group/boxRight.vue b/src/components/group/boxRight.vue index e6bbe27..2d521a2 100644 --- a/src/components/group/boxRight.vue +++ b/src/components/group/boxRight.vue @@ -55,6 +55,7 @@ }] }, vo3: { + "link":"/main4", title: "友情链接", isShowRemark:true, list: [{ diff --git a/src/components/group/tempFriendBox.vue b/src/components/group/tempFriendBox.vue index aa097bd..77b5928 100644 --- a/src/components/group/tempFriendBox.vue +++ b/src/components/group/tempFriendBox.vue @@ -36,7 +36,6 @@ </template> <script> - export default {} </script> </script> diff --git a/src/components/group/tool.vue b/src/components/group/tool.vue index 88b4c2b..05d4ea7 100644 --- a/src/components/group/tool.vue +++ b/src/components/group/tool.vue @@ -2,21 +2,25 @@ <a-affix :offset-top="600"> <div style="padding-left:5px;"> - <a-button @click="showDrawer1"> + <!-- <a-button @click="showDrawer1"> 抽屉1 - </a-button> + </a-button> --> <!-- <a-button @click="showDrawer2"> 抽屉2 </a-button> --> <a-button @click="showModal"> 日志 - <a-icon type="plus-circle" style="margin-left: 0px;" /> + <a-icon type="plus-circle" /> + </a-button> + <a-button @click="showScreen"> + {{screenModel}} + <a-icon type="arrows-alt" /> </a-button> - <a-button> + <!-- <a-button> 工具 <a-icon type="tool" style="margin-left: 0px;" /> - </a-button> + </a-button> --> </div> </a-affix> </template> @@ -24,7 +28,10 @@ <script> export default { data() { - return {} + return { + screen: false, + screenModel: "拉伸" + } }, methods: { showDrawer1() { @@ -32,6 +39,15 @@ }, showModal() { this.$emit('showModal') + }, + showScreen() { + this.$emit('showScreen') + if (this.screen) { + this.screenModel = "拉伸"; + }else{ + this.screenModel = "缩小"; + } + this.screen=!this.screen; } }, } diff --git a/src/components/layouts/baseLayout.vue b/src/components/layouts/baseLayout.vue index a168c40..88e4f70 100644 --- a/src/components/layouts/baseLayout.vue +++ b/src/components/layouts/baseLayout.vue @@ -11,7 +11,7 @@ <AplayerBox /> <tagFooter /> </a-layout-footer> - + <a-back-top> <a-icon type="up" />回到顶部 </a-back-top> @@ -90,6 +90,10 @@ } } + .ant-timeline-item-head { + background-color: transparent !important; + } + } span, diff --git a/src/components/mini/Aplayer.vue b/src/components/mini/Aplayer.vue index 10f36e1..9612478 100644 --- a/src/components/mini/Aplayer.vue +++ b/src/components/mini/Aplayer.vue @@ -1,5 +1,5 @@ <template> - <div > + <div class="fade"> <aplayer :audio="audio" fixed style="z-index: 10;" :preload="preload"/> </div> </template> diff --git a/src/components/mini/box-friend.vue b/src/components/mini/box-friend.vue index 74aa7e3..a5a5805 100644 --- a/src/components/mini/box-friend.vue +++ b/src/components/mini/box-friend.vue @@ -1,8 +1,10 @@ <template> - <div style="display: flex;" class="link-box"> - <div v-for="temp in [1,2,1,1,1,1]"> + <div class="myFriend"> + <h1>朋友们</h1> + <hr> + <div class="link-box"> <!-- <a href="#" target="_blank" class="no-underline"> --> - <a href="#" class="no-underline"> + <a href="#" class="no-underline" v-for="temp in [1,2,1,1,1,1,1,1,1]"> <div class="thumb"> <img width="200" height="200" src="https://cdn.jsdelivr.net/gh/Musenxi/CDN/长野.jpg" alt="长野 の BLOG"> </div> @@ -24,89 +26,116 @@ <style lang="less"> .myFriend { - a { - padding: 10px; + box-shadow: 0 12px 15px 0 rgba(0, 0, 0, 0.24), 0 17px 50px 0 rgba(0, 0, 0, 0.19); + padding: 10px 30px 0px; + + h1 { + margin: .67em 0; + padding-bottom: .3rem; + font-size: 1.8em; + line-height: 1.2; + position: relative; + font-weight: bold; + } + + hr { + overflow: hidden; + margin: 1rem 0; + padding: 0; + height: .125rem; + border: none; + background: #bcbfc3 repeating-linear-gradient(-45deg, #fff, #fff 0.25rem, transparent 0.25rem, transparent 0.5rem); } } - .link-box a { - width: 33.75rem; - background: #fff; - float: left; - margin: 0 0 4.375rem; - color: #2E2E2E; - text-decoration: none; - border-bottom: none; - border-radius: .25rem; + .link-box { + padding: 4.375rem 2.1875rem 2.1875rem; overflow: hidden; - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - // -moz-box-shadow: 0 0.0625rem 0.0625rem rgba(0, 0, 0, 0.1); - -webkit-box-shadow: 0 3px.0625rem 0.0625rem #0000001a; - -moz-box-shadow: 0 3px 0.0625rem #0000001a; - box-shadow: 0 3px 0.0625rem #0000001a; - -webkit-transform: translate3d(0, 0, 0); - -moz-transform: translate3d(0, 0, 0); - -ms-transform: translate3d(0, 0, 0); - -o-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - -webkit-transition: .3s; - -moz-transition: .3s; - -ms-transition: .3s; - -o-transition: .3s; - transition: .3s; + margin: -3.125rem; + display: flex; + flex-direction: row; + flex-wrap: wrap; + + a { + width: 33.75rem; + background: #fff; + float: left; + margin: 0 0 4.375rem; + color: #2E2E2E; + text-decoration: none; + border-bottom: none; + border-radius: .25rem; + overflow: hidden; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + // -moz-box-shadow: 0 0.0625rem 0.0625rem rgba(0, 0, 0, 0.1); + -webkit-box-shadow: 0 3px.0625rem 0.0625rem #0000001a; + -moz-box-shadow: 0 3px 0.0625rem #0000001a; + box-shadow: 0 3px 0.0625rem #0000001a; + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + -webkit-transition: .3s; + -moz-transition: .3s; + -ms-transition: .3s; + -o-transition: .3s; + transition: .3s; + + .content { + text-align: center; + background-color: #fff; + + .title { + text-align: center; + padding: 1rem .25rem; + font-weight: 500; + color: #333; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin: 0; + } + } + } + + .thumb { + font-size: 0; + overflow: hidden; + background-color: #fff; + margin: 0; + border-top-left-radius: .25rem; + border-top-right-radius: .25rem; + + img { + width: 100%; + height: auto; + position: relative; + margin: 0; + padding: 0; + -webkit-transition: .4s; + -moz-transition: .4s; + -ms-transition: .4s; + -o-transition: .4s; + transition: .4s; + } + } } - .link-box a:hover:after { - left: 0; - width: 100%; - -webkit-transition: width 350ms; - -moz-transition: width 350ms; - -ms-transition: width 350ms; - -o-transition: width 350ms; - transition: width 350ms; - } + // .link-box a:hover:after { + // left: 0; + // width: 100%; + // -webkit-transition: width 350ms; + // -moz-transition: width 350ms; + // -ms-transition: width 350ms; + // -o-transition: width 350ms; + // transition: width 350ms; + // } - .link-box a .thumb { - font-size: 0; - overflow: hidden; - background-color: #fff; - margin: 0; - border-top-left-radius: .25rem; - border-top-right-radius: .25rem; - } - - .link-box a .thumb img { - width: 100%; - height: auto; - position: relative; - margin: 0; - padding: 0; - -webkit-transition: .4s; - -moz-transition: .4s; - -ms-transition: .4s; - -o-transition: .4s; - transition: .4s; - } - - .link-box a .content { - text-align: center; - background-color: #fff; - } - - .link-box a .content .title { - text-align: center; - padding: 1rem .25rem; - font-weight: 500; - color: #333; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - margin: 0; - } .link-box a:hover, .link-box a:active { @@ -121,29 +150,30 @@ -moz-transform: none; } + @media screen and (max-width: 710px) and (min-width: 319px) { + .link-box { + padding: 4.375rem 3.125rem 3.125rem; + margin: -3.125rem; + } + + .myFriend { + padding: 10px 15px 0px; + } + } + @media screen and (min-width: 1600px) { .link-box a { margin: 0 0.9375rem 3.75rem; - width: -webkit-calc(500% / 5 - 1.875rem); - width: calc(500% / 5 - 1.875rem); + width: -webkit-calc(120% / 5 - 1.875rem); + width: calc(120% / 5 - 1.875rem); } } @media screen and (max-width: 1599px) and (min-width: 768px) { .link-box a { margin: 0 0.9375rem 3.75rem; - width: -webkit-calc(150% / 4 - 1.875rem); - width: calc(150% / 4 - 1.875rem); - } - } - - - - @media screen and (max-width: 500px) and (min-width: 319px) { - .link-box a { - margin: 0 0.75rem 1.5rem; - width: -webkit-calc(50% - 1.5rem); - width: calc(50% - 1.5rem); + width: -webkit-calc(130% / 4 - 1.875rem); + width: calc(130% / 4 - 1.875rem); } } @@ -154,4 +184,13 @@ width: calc(100% / 3 - 1.875rem); } } + + + @media screen and (max-width: 500px) and (min-width: 319px) { + .link-box a { + margin: 0 0.75rem 1.5rem; + width: -webkit-calc(50% - 1.5rem); + width: calc(50% - 1.5rem); + } + } </style> diff --git a/src/components/mini/box1-info.vue b/src/components/mini/box1-info.vue index ea66ad9..4e14603 100644 --- a/src/components/mini/box1-info.vue +++ b/src/components/mini/box1-info.vue @@ -17,6 +17,7 @@ </template> <script> + import { getAppPage } from '/src/api/appManage.js' export default { name: "box", data() { @@ -26,6 +27,12 @@ sentence: "十里寒塘路,烟花一半醒", location: "广州" } + }, + created() { + console.log(getAppPage().then((res) => { + console.log(res); + return res + })); } } </script> diff --git a/src/components/mini/box4-minibox.vue b/src/components/mini/box4-minibox.vue index 1da9efa..1e42eca 100644 --- a/src/components/mini/box4-minibox.vue +++ b/src/components/mini/box4-minibox.vue @@ -1,7 +1,11 @@ <template> <div class="blog-container "> <div> - <span class="blog-right-side-portion-title " v-bind:class="{'title-remark':isShowRemark}">{{title}}</span> + <span class="blog-right-side-portion-title " v-bind:class="{'title-remark':isShowRemark}"> + <router-link :to="link"> + {{title}} + </router-link> + </span> </div> <div class="blog-scroll show-line "> <div class="blog-right-side-meta " v-for="item in list"> @@ -19,6 +23,9 @@ <script> export default { props: { + link: { + default:"#" + }, title: "", list: "", isShowRemark: false @@ -37,10 +44,13 @@ /*右边的部分*/ .blog-right-side-portion-title { + a { + color: black; + } + display: block; font-size: 15px; padding-bottom: 8px; - } span.title-remark::after { diff --git a/src/components/mini/tagInfo.vue b/src/components/mini/tagInfo.vue index 364c2a8..d42c433 100644 --- a/src/components/mini/tagInfo.vue +++ b/src/components/mini/tagInfo.vue @@ -1,12 +1,10 @@ <template> - <div class="swichTag"> - <a-page-header style="padding: 0px;" title=" " @back="() => this.$router.go(-1)"> - </a-page-header> - <a-divider :dashed="true" orientation="left">关于我的一些..<span class="myTip">小故事</span></a-divider> - + <div class="swichTag "> + <a-page-header title="关于我的一些..小故事" style="padding: 10px 0px 20px 0px;" @back="() => this.$router.go(-1)" /> + <a-timeline pending="..."> <p slot="pendingDot" style="font-size: 18px;" /> - <a-timeline-item color="white"> + <a-timeline-item color=""> <a-icon slot="dot" type="form" style="font-size: 18px;" /> <br> <p> @@ -15,19 +13,24 @@ <li> 喜欢钢琴~喜欢吉他 </li> <li> 爱音乐,也爱看番 </li> <li> B界的白嫖怪</li> - <li> PC单机的<!-- <span class="myTip">伪</span> --><span class="myTip" style="text-decoration:line-through">硬核</span>玩家 </li> + <li> PC单机的 + <!-- <span class="myTip">伪</span> --><span class="myTip" + style="text-decoration:line-through">硬核</span>玩家 + </li> <li> - <img src="http://t.inleft.com/share/media_photo/xm.jpg" style="width: 35px;border-radius: 20px;" /> + <img src="http://t.inleft.com/share/media_photo/xm.jpg" + style="width: 35px;border-radius: 20px;" /> 我的小老弟&御用暖床袋 - <img src="http://t.inleft.com/share/media_photo/IMG_20220117_145633.jpg" style="width: 50px;border-radius: 30px" /> + <img src="http://t.inleft.com/share/media_photo/IMG_20220117_145633.jpg" + style="width: 50px;border-radius: 30px" /> <span style="font-size: 10px;color: #999">(小乖)</span> </li> </ul> </p> </a-timeline-item> - <a-timeline-item color="white"> + <a-timeline-item color=""> <a-icon slot="dot" type="clock-circle-o" style="font-size: 18px;" /> <h4 class="layui-timeline-title">202108</h4> <p>到我提笔准备写下篇类日记的时候,时间已经来到了16号, @@ -54,7 +57,7 @@ <br>end..希望我们的故事还没有终点.. </a-timeline-item> - <a-timeline-item color="<white></white>"> + <a-timeline-item color=""> <a-icon slot="dot" type="align-left" style="font-size: 18px;" /> <br><em>爱她所爱,思她所思,为她承担伤痛</em> @@ -72,5 +75,5 @@ </script> <style lang="less"> - + </style> diff --git a/src/components/swichLabel/main1-show.vue b/src/components/swichLabel/main1-show.vue index 4e0c085..af389a3 100644 --- a/src/components/swichLabel/main1-show.vue +++ b/src/components/swichLabel/main1-show.vue @@ -4,7 +4,7 @@ <div class="blog-drawer"> <a-drawer placement="left" :closable="false" :visible="visible1" :getContainer="'body'" - :after-visible-change="afterVisibleChange" @close="onClose1" :zIndex="90" :width=270 + :after-visible-change="afterVisibleChange" @close="onClose1" :zIndex="90" :width=300 :bodyStyle="{padding:'0px'}" :wrapStyle="{padding:'0px',top:'60px !important','height':'calc(100% - 60px) !important'}"> <boxLeft></boxLeft> @@ -34,7 +34,7 @@ <a-col v-bind="colApiRight" ref="myDrawer"> <!-- <boxRight></boxRight> --> - <tool @showModal="showModal" @showDrawer1="showDrawer1"></tool> + <tool @showModal="showModal" @showDrawer1="showDrawer1" @showScreen="showScreen"></tool> </a-col> </a-row> </div> @@ -43,7 +43,6 @@ </template> <script> - import tempFriendBox from "../group/tempFriendBox.vue" import boxLeft from "../group/boxLeft.vue" import boxRight from "../group/boxRight.vue" import articleListScorll from "../group/articleListScorll.vue" @@ -53,7 +52,6 @@ export default { components: { - tempFriendBox, boxLeft, boxRight, articleListScorll, @@ -61,6 +59,25 @@ MyModal, }, methods: { + showScreen() { + if (this.screen) { + //缩小 + this.colApiLeft.xxl.span = 0; + this.colApiLeft.xxl.offset = 0; + + this.colApiMain.xxl.span = 17; + this.colApiMain.xxl.offset = 4; + } else { + //放大 + this.colApiLeft.xxl.span = 4; + this.colApiLeft.xxl.offset = 3; + + this.colApiMain.xxl.span = 11; + this.colApiMain.xxl.offset = 2; + } + this.screen = !this.screen; + + }, showModal() { this.$refs.myModal.showModal(); }, @@ -75,6 +92,7 @@ }, data() { return { + screen: true, visible1: false, visible2: false, colMini: { @@ -135,7 +153,6 @@ offset: 2, }, } - } } } @@ -145,8 +162,9 @@ .swichTag { min-height: 750px; padding: 30px 30px 10px; - background-color: white; border-radius: 15px; + box-shadow: 0 12px 15px 0 rgba(0, 0, 0, 0.24), 0 17px 50px 0 rgba(0, 0, 0, 0.19); + padding: 20px 30px 0px; } .holdHeight { diff --git a/src/main.js b/src/main.js index 824ba66..99eee08 100644 --- a/src/main.js +++ b/src/main.js @@ -14,6 +14,7 @@ import APlayer from '@moefe/vue-aplayer'; Vue.use(APlayer,{productionTip:false}) +import './mock/' Vue.prototype.$axios = axios diff --git a/src/mock/index.js b/src/mock/index.js new file mode 100644 index 0000000..125db81 --- /dev/null +++ b/src/mock/index.js @@ -0,0 +1,28 @@ + +function isIE() { + const bw = window.navigator.userAgent + const compare = (s) => bw.indexOf(s) >= 0 + const ie11 = (() => 'ActiveXObject' in window)() + return compare('MSIE') || ie11 +} +// 判断环境不是 prod 或者 preview 是 true 时,加载 mock 服务 +if (process.env.NODE_ENV !== 'production' || process.env.VUE_APP_PREVIEW === 'true') { + if (isIE()) { + console.error('[antd-pro] ERROR: `mockjs` NOT SUPPORT `IE` PLEASE DO NOT USE IN `production` ENV.') + } + // 使用同步加载依赖 + // 防止 vuex 中的 GetInfo 早于 mock 运行,导致无法 mock 请求返回结果 + console.log('[antd-pro] mock mounting') + const Mock = require('mockjs2') + // require('./services/auth') + // require('./services/user') + // require('./services/manage') + // require('./services/other') + // require('./services/tagCloud') + require('./test/article.js') + + Mock.setup({ + timeout: 800 // setter delay time + }) + console.log('[antd-pro] mock mounted') +} diff --git a/src/mock/test/article.js b/src/mock/test/article.js new file mode 100644 index 0000000..37057f7 --- /dev/null +++ b/src/mock/test/article.js @@ -0,0 +1,89 @@ +import Mock from 'mockjs2' +import { builder, getQueryParameters } from '../util' + +const titles = [ + 'Alipay', + 'Angular', + 'Ant Design', + 'XiaoNuo', + 'Bootstrap', + 'React', + 'Vue', + 'Webpack' +] + +const avatar = ['https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', + 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', + 'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', + 'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', + 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png' +] + +const covers = [ + 'https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png', + 'https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png', + 'https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png', + 'https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png' +] + +const owner = [ + '付小小', + '吴加好', + '周星星', + '林东东', + '曲丽丽' +] + +const content = '段落示意:蚂蚁金服设计平台 ant.design,用最小的工作量,无缝接入蚂蚁金服生态,提供跨越设计与开发的体验解决方案。蚂蚁金服设计平台 ant.design,用最小的工作量,无缝接入蚂蚁金服生态,提供跨越设计与开发的体验解决方案。' +const description = '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。' +const href = 'https://ant.design' + +const article = (options) => { + const queryParameters = getQueryParameters(options) + console.log('queryParameters', queryParameters) + if (queryParameters && !queryParameters.count) { + queryParameters.count = 5 + } + const data = [] + for (let i = 0; i < queryParameters.count; i++) { + const tmpKey = i + 1 + const num = parseInt(Math.random() * (4 + 1), 10) + data.push({ + id: tmpKey, + avatar: avatar[num], + owner: owner[num], + content: content, + star: Mock.mock('@integer(1, 999)'), + percent: Mock.mock('@integer(1, 999)'), + like: Mock.mock('@integer(1, 999)'), + message: Mock.mock('@integer(1, 999)'), + description: description, + href: href, + title: titles[ i % 8 ], + updatedAt: Mock.mock('@datetime'), + members: [ + { + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png', + name: '曲丽丽', + id: 'member1' + }, + { + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png', + name: '王昭君', + id: 'member2' + }, + { + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png', + name: '董娜娜', + id: 'member3' + } + ], + activeUser: Math.ceil(Math.random() * 100000) + 100000, + newUser: Math.ceil(Math.random() * 1000) + 1000, + cover: parseInt(i / 4, 10) % 2 === 0 ? covers[i % 4] : covers[3 - (i % 4)] + }) + } + return builder(data) +} + +Mock.mock(/\/list\/article/, 'get', article) diff --git a/src/mock/util.js b/src/mock/util.js new file mode 100644 index 0000000..a4be036 --- /dev/null +++ b/src/mock/util.js @@ -0,0 +1,38 @@ +const responseBody = { + message: '', + timestamp: 0, + result: null, + code: 0 +} + +export const builder = (data, message, code = 0, headers = {}) => { + responseBody.result = data + if (message !== undefined && message !== null) { + responseBody.message = message + } + if (code !== undefined && code !== 0) { + responseBody.code = code + responseBody._status = code + } + if (headers !== null && typeof headers === 'object' && Object.keys(headers).length > 0) { + responseBody._headers = headers + } + responseBody.timestamp = new Date().getTime() + return responseBody +} + +export const getQueryParameters = (options) => { + const url = options.url + const search = url.split('?')[1] + if (!search) { + return {} + } + return JSON.parse('{"' + decodeURIComponent(search) + .replace(/"/g, '\\"') + .replace(/&/g, '","') + .replace(/=/g, '":"') + '"}') +} + +export const getBody = (options) => { + return options.body && JSON.parse(options.body) +} diff --git a/src/utils/axios.js b/src/utils/axios.js new file mode 100644 index 0000000..3b91f6b --- /dev/null +++ b/src/utils/axios.js @@ -0,0 +1,35 @@ +const VueAxios = { + vm: {}, + // eslint-disable-next-line no-unused-vars + install (Vue, instance) { + if (this.installed) { + return + } + this.installed = true + + if (!instance) { + // eslint-disable-next-line no-console + console.error('You have to install axios') + return + } + + Vue.axios = instance + + Object.defineProperties(Vue.prototype, { + axios: { + get: function get () { + return instance + } + }, + $http: { + get: function get () { + return instance + } + } + }) + } +} + +export { + VueAxios +} diff --git a/src/utils/request.js b/src/utils/request.js new file mode 100644 index 0000000..b9e2a46 --- /dev/null +++ b/src/utils/request.js @@ -0,0 +1,109 @@ +import Vue from 'vue' +import axios from 'axios' +// import store from '@/store' +import { + message, + Modal, + notification +} from 'ant-design-vue' /// es/notification +import { + VueAxios +} from './axios' +// import { ACCESS_TOKEN } from '@/store/mutation-types' + +// 创建 axios 实例 +const service = axios.create({ + baseURL: '/api', // api base_url + timeout: 6000 // 请求超时时间 +}) + +const err = (error) => { + if (error.response) { + + + const data = error.response.data + // const token = Vue.ls.get(ACCESS_TOKEN) + if (error.response.status === 404) { + notification.error({ + message: '404', + description: "找不到请求地址" + }) + } + + if (error.response.status === 403) { + console.log('服务器403啦,要重新登录!') + notification.error({ + message: 'Forbidden', + description: data.message + }) + } + if (error.response.status === 500) { + if (data.message.length > 0) { + message.error(data.message) + } + } + if (error.response.status === 401 && !(data.result && data.result.isLogin)) { + notification.error({ + message: 'Unauthorized', + description: 'Authorization verification failed' + }) + // if (token) { + // store.dispatch('Logout').then(() => { + // setTimeout(() => { + // window.location.reload() + // }, 1500) + // }) + // } + } + } + return Promise.reject(error) +} + +// request interceptor +service.interceptors.request.use(config => { + // const token = Vue.ls.get(ACCESS_TOKEN) + // if (token) { + // config.headers['Authorization'] = 'Bearer ' + token + // } + config.headers['Authorization'] = 'Bearer '; + return config +}, err) + +/** + * response interceptor + * 所有请求统一返回 + */ +service.interceptors.response.use((response) => { + if (response.request.responseType === 'blob') { + return response + } + const code = response.data.code + if (code === 1011006 || code === 1011007 || code === 1011008 || code === 1011009) { + Modal.error({ + title: '提示:', + content: response.data.message, + okText: '重新登录', + onOk: () => { + Vue.ls.remove(ACCESS_TOKEN) + window.location.reload() + } + }) + } else if (code === 1013002 || code === 1016002 || code === 1015002) { + message.error(response.data.message) + return response.data + } else { + return response.data + } +}, err) + +const installer = { + vm: {}, + install(Vue) { + Vue.use(VueAxios, service) + } +} + +export { + installer as VueAxios, + service as axios +} -- Gitblit v1.9.1