diff --git a/package-lock.json b/package-lock.json index 6c7f68686dc0f07e2e7791b07578e6d8dc6c6044..4077b863c3cdee7b2b6867863b8a4b009f7cb491 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2912,11 +2912,11 @@ } }, "buefy": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/buefy/-/buefy-0.9.4.tgz", - "integrity": "sha512-LRSIYVNrKTPQhmNRegASkntX+ObtZ7aSSA/3cybDKXzGtPNy8g8cl2tp79Rl8/LBVH/KkRT5rmmzJ21nxz9IcQ==", + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/buefy/-/buefy-0.9.5.tgz", + "integrity": "sha512-0LBY4XfvT/dgAg8AQBh2pdjTgDj5lpqBkmG4C2wWUAwZZ9UG75UxiH+wyct+b1DjkcuvQDzT4I3hlZvbduVdww==", "requires": { - "bulma": "0.9.1" + "bulma": "0.9.2" } }, "buffer": { @@ -2961,9 +2961,9 @@ "dev": true }, "bulma": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/bulma/-/bulma-0.9.1.tgz", - "integrity": "sha512-LSF69OumXg2HSKl2+rN0/OEXJy7WFEb681wtBlNS/ulJYR27J3rORHibdXZ6GVb/vyUzzYK/Arjyh56wjbFedA==" + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/bulma/-/bulma-0.9.2.tgz", + "integrity": "sha512-e14EF+3VSZ488yL/lJH0tR8mFWiEQVCMi/BQUMi2TGMBOk+zrDg4wryuwm/+dRSHJw0gMawp2tsW7X1JYUCE3A==" }, "bytes": { "version": "3.1.0", @@ -4171,6 +4171,11 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, + "darkreader": { + "version": "4.9.31", + "resolved": "https://registry.npmjs.org/darkreader/-/darkreader-4.9.31.tgz", + "integrity": "sha512-l4Z5WgErakkt7nDcDvicB8ynTtAIZIA5qhkbQUdewALaX1QiAg+SKZ+R1FuyO3I/g/DnNd3yYyrzLYjZgLP/YQ==" + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz?cache=0&sync_timestamp=1601073714105&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdashdash%2Fdownload%2Fdashdash-1.14.1.tgz", @@ -11211,6 +11216,87 @@ } } }, + "vue-loader-v16": { + "version": "npm:vue-loader@16.2.0", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.2.0.tgz", + "integrity": "sha512-TitGhqSQ61RJljMmhIGvfWzJ2zk9m1Qug049Ugml6QP3t0e95o0XJjk29roNEiPKJQBEi8Ord5hFuSuELzSp8Q==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "optional": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "vue-router": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.1.tgz", diff --git a/package.json b/package.json index 0ad988c4cccb62d37158e3051851d95ac7c1bfbe..05ffdac1729c0ba0f474eea66a50907a0c1b6b03 100644 --- a/package.json +++ b/package.json @@ -9,10 +9,14 @@ }, "dependencies": { "axios": "^0.21.1", - "buefy": "^0.9.4", + "buefy": "^0.9.5", + "bulma": "^0.9.2", "core-js": "^3.6.5", + "darkreader": "^4.9.31", + "dayjs": "^1.10.4", "element-ui": "^2.15.1", "js-cookie": "^2.2.1", + "nprogress": "^0.2.0", "vue": "^2.6.11", "vue-router": "^3.5.1", "vuex": "^3.6.2" diff --git a/src/App.vue b/src/App.vue index b0c844ecb475b4fe5d5af2c2ccfb81702d120800..d1909a0dbac02d64dcc64fb7b6eb625639ad0d67 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,10 +1,29 @@ + + diff --git a/src/api/auth/auth.js b/src/api/auth/auth.js index ff112f86967c6e7749b58fda87ea9c84e07b7c16..301ea5399f2947f69e1dbcf88db01bd8c3b7ca25 100644 --- a/src/api/auth/auth.js +++ b/src/api/auth/auth.js @@ -21,4 +21,10 @@ export function getUserInfo() { url: '/user/info', method: 'get' }) +} + +export function logout() { + return request({ + url: '/user/logout' + }) } \ No newline at end of file diff --git a/src/api/post.js b/src/api/post.js new file mode 100644 index 0000000000000000000000000000000000000000..08574a3633187a7b3fce216de55e21e44e88d879 --- /dev/null +++ b/src/api/post.js @@ -0,0 +1,9 @@ +import request from '@/util/request' + +export function getList(pageNo, size, tab){ + return request(({ + url:'/post/list', + method:'get', + params:{pageNo : pageNo,size : size,tab : tab} + })) +} \ No newline at end of file diff --git a/src/api/tip.js b/src/api/tip.js index 18ead22d58dd97381455da0a2e4790f34011d863..fe381549ceed60bdc1ed05ce8dd2152514aa4fa5 100644 --- a/src/api/tip.js +++ b/src/api/tip.js @@ -1,6 +1,6 @@ import request from '@/util/request' -export function getTip() { +export function getTip(){ return request({ url: '/tip/random', method: 'get' diff --git a/src/assets/app.css b/src/assets/app.css index ff7e0ec45d675c713aeaa4def506b440b42dd037..1fe06abbe320b9bfb8189aa2f014902a9ddac4c8 100644 --- a/src/assets/app.css +++ b/src/assets/app.css @@ -1,21 +1,151 @@ * { margin: 0; padding: 0; -} - -body, -html { - background-color: #f6f6f6; + } + + body, + html { + background-color: #F0F8FF; color: black; width: 100%; font-size: 14px; letter-spacing: 0.03em; font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, - Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, WenQuanYi Micro Hei, - sans-serif, Apple Color Emoji, Segoe UI Emoji, Noto Color Emoji, - Segoe UI Symbol, Android Emoji, EmojiSymbols; -} - -.el-card { + Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, WenQuanYi Micro Hei, + sans-serif, Apple Color Emoji, Segoe UI Emoji, Noto Color Emoji, + Segoe UI Symbol, Android Emoji, EmojiSymbols; + } + + /*背景图*/ + /*body { + background-image: url('./../assets/image/Leimu.png'); + background-repeat:no-repeat; + background-position:center; + }*/ + + @media (min-width: 768px) { + .container { + width: 760px; + } + } + + @media (min-width: 992px) { + .container { + width: 980px; + } + } + + @media (min-width: 1200px) { + .container { + width: 1080px; + } + } + + /*滚动条*/ + ::-webkit-scrollbar { + width: 10px; + height: 10px; + /**/ + } + + ::-webkit-scrollbar-track { + background: rgb(239, 239, 239); + border-radius: 2px; + } + + ::-webkit-scrollbar-thumb { + background: #bfbfbf; + border-radius: 10px; + } + + ::-webkit-scrollbar-corner { + background: #179a16; + } + + .header { + position: fixed; + z-index: 89; + top: 0; + width: 100%; + min-width: 1032px; + background: #fff; + box-shadow: 0 1px 0px rgba(26, 26, 26, 0.1); + height: 53px; + font-size: 16px; + } + + a { + color: #1d1d1d; + text-decoration: none; + } + + a:hover { + color: #f60; + text-decoration: none !important; + } + + .shadow-1 { + box-shadow: 0 0.5em 1em -0.125em rgba(10, 10, 10, 0.1), + 0 0 0 1px rgba(10, 10, 10, 0.02); + } + + .navbar-dropdown { + font-size: 15px; + } + + /*统一卡片样式*/ + .el-card { + /*border-radius: 3px !important;*/ margin-bottom: 16px; -} \ No newline at end of file + /*border: none;*/ + } + + .my-card { + cursor: pointer; + transition: all 0.1s ease-in-out; + position: relative; + overflow: hidden; + } + + .my-card:hover { + transform: scale(1.03); + } + + ::selection { + text-shadow: none; + background: rgba(67, 135, 244, 0.56); + } + + /* 搜索框 */ + .search-bar input { + border: none; + box-shadow: none; + } + + /*按钮居中*/ + .button-center { + display: block; + margin: 0 auto; + } + + .ellipsis { + display: block; + display: -webkit-box; + margin: 0 auto; + line-height: 1.4; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; + } + + .is-ellipsis-1 { + -webkit-line-clamp: 1; + } + + .is-ellipsis-2 { + -webkit-line-clamp: 2; + } + + .is-ellipsis-3 { + -webkit-line-clamp: 3; + } \ No newline at end of file diff --git a/src/assets/image/logo-2.png b/src/assets/image/logo-2.png new file mode 100644 index 0000000000000000000000000000000000000000..c2e7bcd64593ac6cb9dc1ed484a5a4b9a6b4ea5c Binary files /dev/null and b/src/assets/image/logo-2.png differ diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c2e7bcd64593ac6cb9dc1ed484a5a4b9a6b4ea5c Binary files /dev/null and b/src/assets/logo.png differ diff --git a/src/components/BackTop/BackTop.vue b/src/components/BackTop/BackTop.vue new file mode 100644 index 0000000000000000000000000000000000000000..5ec176a8a9d9904fcdb8888df2139cdc0986214c --- /dev/null +++ b/src/components/BackTop/BackTop.vue @@ -0,0 +1,27 @@ + + + + + \ No newline at end of file diff --git a/src/components/Layout/Footer.vue b/src/components/Layout/Footer.vue new file mode 100644 index 0000000000000000000000000000000000000000..3444be266ee95d483cee14c414c1fb43bd320afd --- /dev/null +++ b/src/components/Layout/Footer.vue @@ -0,0 +1,57 @@ + + + + + \ No newline at end of file diff --git a/src/components/Layout/Header.vue b/src/components/Layout/Header.vue new file mode 100644 index 0000000000000000000000000000000000000000..326f8b094757836cbd76601e6bef342004cc0cf4 --- /dev/null +++ b/src/components/Layout/Header.vue @@ -0,0 +1,180 @@ + + + + + \ No newline at end of file diff --git a/src/components/Pagination/index.vue b/src/components/Pagination/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..f4d64e053fb3f8bc0274dc9756374cd506321831 --- /dev/null +++ b/src/components/Pagination/index.vue @@ -0,0 +1,101 @@ + + + + + \ No newline at end of file diff --git a/src/main.js b/src/main.js index 39ff84e95706addf239f9d23673a430e4a9fb4e1..d41decbb1327b2a295da64c8d781391f05354a81 100644 --- a/src/main.js +++ b/src/main.js @@ -6,19 +6,31 @@ import 'buefy/dist/buefy.css' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' - import '@/assets/app.css' import router from './router' import store from './store' +import '@/permission' +import relativeTime from 'dayjs/plugin/relativeTime' + +import 'dayjs/locale/zh-cn' +const dayjs = require('dayjs'); + +dayjs.extend(relativeTime) + +dayjs.locale('zh-cn') +dayjs().locale('zh-cn').format() + +Vue.prototype.dayjs = dayjs; + Vue.use(Buefy) Vue.use(ElementUI) Vue.config.productionTip = false new Vue({ - router, - store, - render: h => h(App) + router, + store, + render: h => h(App), }).$mount('#app') diff --git a/src/permission.js b/src/permission.js new file mode 100644 index 0000000000000000000000000000000000000000..590360c57cc9dcb23067a29671d2eda9c7a56f02 --- /dev/null +++ b/src/permission.js @@ -0,0 +1,38 @@ +import router from './router' +import store from './store' +import getPageTitle from '@/util/get-page-title' +import NProgress from 'nprogress' +import 'nprogress/nprogress.css' +import {getToken} from "@/util/auth"; + +NProgress.configure({showSpinner: false}) + +router.beforeEach(async (to, from, next) => { + + NProgress.start() + + document.title = getPageTitle(to.meta.title) + + const hasToken = getToken(); + + next() + if (hasToken) { + if (to.path === '/login') { + next({path: '/'}) + NProgress.done() + } else { + await store.dispatch('user/getInfo') + next() + } + } else if (!to.meta.requireAuth) + { + next() + } + else { + next('/login') + } +}) + +router.afterEach(() => { + NProgress.done() +}) \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js index 8bafe17abf16af524455907da1b382b9fefcc1a3..736f45a0b8ea10bbf341b160b8c754ccd5883d27 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,47 +1,150 @@ -import Vue from 'vue' -import VueRouter from 'vue-router' - -Vue.use(VueRouter) - -const routes = [{ - path: '/', - name: 'Home', - component: () => - import('@/view/Home') - }, - { - path: '/register', - name: 'Register', - component: () => - import('@/view/auth/Register') - }, - { - path: '/404', - name: '404', - component: () => - import('@/view/error/404'), - meta: { - title: "404 not found" - } - }, - { - path: '/login', - name: 'Login', - component: () => - import('@/view/auth/Login'), - meta: { - title: "登录" - } - }, - { - path: '*', - redirect: '/404', - hidden: true - } +// import Vue from 'vue' +// import VueRouter from 'vue-router' + +// Vue.use(VueRouter) + +// const routes = [{ +// path: '/', +// name: 'Home', +// component: () => +// import ('@/view/Home') +// }] + +// const router = new VueRouter({ routes }) + +// export default router + + +import Vue from "vue"; +import VueRouter from "vue-router"; + +Vue.use(VueRouter); + +// const routes = [ +// { +// path: "/", +// name: "Home", +// component: () => import("@/view/Home"), +// }, +// { +// path: "/register", +// name: "register", +// component: () => import("@/view/auth/Register"), +// meta: { title: "注册" }, +// }, +// // 登录 +// { +// name: "login", +// path: "/login", +// component: () => import("@/view/auth/Login"), +// meta: { title: "登录" }, +// }, +// // 发布 +// { +// name: "post-create", +// path: "/post/create", +// //component: () => import("@/views/post/Create"), +// meta: { title: "信息发布", requireAuth: true }, +// }, +// // 编辑 +// { +// name: 'topic-edit', +// path: '/topic/edit/:id', +// //component: () => import('@/views/post/Edit'), +// meta: { +// title: '编辑', +// requireAuth: true +// } +// }, +// // 详情 +// { +// name: "post-detail", +// path: "/post/:id", +// //component: () => import("@/views/post/Detail"), +// meta: { title: "详情" }, +// }, +// { +// name: 'tag', +// path: '/tag/:name', +// //component: () => import('@/views/tag/Tag'), +// meta: { title: '主题列表' } +// }, +// // 检索 +// { +// name: 'search', +// path: '/search', +// //component: () => import('@/views/Search'), +// meta: { title: '检索' } +// }, +// // 用户主页 +// { +// name: 'user', +// path: '/member/:username/home', +// //component: () => import('@/views/user/Profile'), +// meta: { title: '用户主页' } +// }, +// // 用户设置 +// { +// name: 'user-setting', +// path: '/member/:username/setting', +// //component: () => import('@/views/user/Setting'), +// meta: { title: '设置', requireAuth: true } +// }, +// { +// path: "/404", +// name: "404", +// component: () => import("@/view/error/404"), +// meta: { title: "404-NotFound" }, +// }, +// { +// path: "*", +// redirect: "/404", +// hidden: true, +// }, +// ]; + +const routes = [ + { + path: '/', + name: 'Home', + component: () => + import ('@/view/Home') + }, + { + path: '/register', + name: 'register', + component: () => + import ('@/view/auth/Register'), + meta : {title : "注册"} + }, + { + path: '/404', + name: '404', + component: () => + import ('@/view/error/404'), + meta : {title : "404 not found"} + }, + { + path: '/login', + name: 'login', + component: () => + import ('@/view/auth/Login'), + meta : {title : "登录"} + }, + { + path: '*', + redirect: '/404', + hidden : true + } ] +const originalPush = VueRouter.prototype.push; +VueRouter.prototype.push = function push(location) { + return originalPush.call(this, location).catch((err) => err); +}; + const router = new VueRouter({ - routes -}) + routes, +}); -export default router \ No newline at end of file +export default router; diff --git a/src/store/getters.js b/src/store/getters.js index 4de3c24fbf80e48b1beb1860c778da12c39a8fe9..6936f444f0e2cec5017182f0204cfe5010da5b69 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -1,5 +1,5 @@ const getters = { - token: state => state.user.token, // token - user: state => state.user.user, // 用户对象 -} -export default getters \ No newline at end of file + token: state => state.user.token, // token + user: state => state.user.user, // 用户对象 + } + export default getters diff --git a/src/store/index.js b/src/store/index.js index 9fcf90c45e9dfc0081b1171022040373b73a39d1..ec4b60e7b3f379c9f97dbaab78eaf4665b0126bd 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1,7 +1,8 @@ import Vue from 'vue' import Vuex from 'vuex' -import user from './module/user' import getters from './getters' +import user from './module/user' + Vue.use(Vuex) const store = new Vuex.Store({ diff --git a/src/store/module/user.js b/src/store/module/user.js index 63db356193340dc82b9b4bc5ee18d7c21897a932..315f7f389e5854fa55ad37dff542d1ed5851fb31 100644 --- a/src/store/module/user.js +++ b/src/store/module/user.js @@ -1,6 +1,7 @@ import { login, - getUserInfo + getUserInfo, + logout } from "@/api/auth/auth"; import { getToken, @@ -73,6 +74,22 @@ const actions = { }); }); }, + + logout({ commit, state }) { + return new Promise((resolve, reject) => { + logout(state.token) + .then((response) => { + console.log(response); + commit("SET_TOKEN_STATE", ""); + commit("SET_USER_STATE", ""); + removeToken(); + resolve(); + }) + .catch((error) => { + reject(error); + }); + }); + }, } export default { diff --git a/src/util/auth.js b/src/util/auth.js index 83d644ee4be9a54e0711fe86862c037707bcfa34..bedb03179f3af2ee68aed5b0d616d73207f4b498 100644 --- a/src/util/auth.js +++ b/src/util/auth.js @@ -10,9 +10,7 @@ export function getToken() { // 设置Token,1天,与后端同步 export function setToken(token) { - return Cookies.set(uToken, token, { - expires: 1 - }) + return Cookies.set(uToken, token, {expires: 1}) } // 删除Token @@ -25,9 +23,7 @@ export function removeAll() { } export function setDarkMode(mode) { - return Cookies.set(darkMode, mode, { - expires: 365 - }) + return Cookies.set(darkMode, mode, {expires: 365}) } export function getDarkMode() { diff --git a/src/util/get-page-title.js b/src/util/get-page-title.js new file mode 100644 index 0000000000000000000000000000000000000000..b2463e9d1b0a01703e87614357f6ac7e4bd21ad3 --- /dev/null +++ b/src/util/get-page-title.js @@ -0,0 +1,8 @@ +const title = "长安南论坛——西电智慧论坛" + +export default function getPageTitle(pageTitle){ + if(pageTitle){ + return `${pageTitle} - ${title}` + } + return `${title}` +} \ No newline at end of file diff --git a/src/util/request.js b/src/util/request.js index 2a36ae4c616be9661d295032b4ce12d74aa2abf5..7d93cf0b45107c6887c8e996d519094b21b5adf6 100644 --- a/src/util/request.js +++ b/src/util/request.js @@ -1,16 +1,16 @@ import axios from 'axios' import { Message, MessageBox } from 'element-ui' - import store from '@/store' - import { getToken } from '@/util/auth' +import store from '@/store' +import { getToken } from '@/util/auth' // 1.创建axios实例 const service = axios.create({ - // 公共接口--这里注意后面会讲,url = base url + request url - baseURL: process.env.VUE_APP_SERVER_URL, + // 公共接口--这里注意后面会讲,url = base url + request url + baseURL: process.env.VUE_APP_SERVER_URL, - // baseURL: 'https://api.example.com', - // 超时时间 单位是ms,这里设置了5s的超时时间 - timeout: 5 * 1000 + // baseURL: 'https://api.example.com', + // 超时时间 单位是ms,这里设置了5s的超时时间 + timeout: 5 * 1000 }) // 2.请求拦截器request interceptor @@ -37,46 +37,45 @@ service.interceptors.request.use( service.defaults.withCredentials = false service.interceptors.response.use( - // 接收到响应数据并成功后的一些共有的处理,关闭loading等 - response => { - const res = response.data - // 如果自定义代码不是200,则将其判断为错误。 - if (res.code !== 200) { - // 50008: 非法Token; 50012: 异地登录; 50014: Token失效; - if (res.code === 401 || res.code === 50012 || res.code === 50014) { - // 重新登录 - MessageBox.confirm('会话失效,您可以留在当前页面,或重新登录', '权限不足', { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - center: true - }).then(() => { - window.location.href = '#/login' - }) - } else { // 其他异常直接提示 - Message({ - showClose: true, - message: '⚠' + res.message || 'Error', - type: 'error', - duration: 3 * 1000 - }) - } - return Promise.reject(new Error(res.message || 'Error')) - } else { - return res - } - }, - error => { - /** *** 接收到异常响应的处理开始 *****/ - // console.log('err' + error) // for debug + // 接收到响应数据并成功后的一些共有的处理,关闭loading等 + response => { + const res = response.data + // 如果自定义代码不是200,则将其判断为错误。 + if (res.code !== 200) { + // 50008: 非法Token; 50012: 异地登录; 50014: Token失效; + if (res.code === 401 || res.code === 50012 || res.code === 50014) { + // 重新登录 + MessageBox.confirm('会话失效,您可以留在当前页面,或重新登录', '权限不足', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + center: true + }).then(() => { + window.location.href = '#/login' + }) + } else { // 其他异常直接提示 Message({ - showClose: true, - message: error.message, - type: 'error', - duration: 5 * 1000 + showClose: true, + message: '⚠' + res.message || 'Error', + type: 'error', + duration: 3 * 1000 }) - return Promise.reject(error) + } + return Promise.reject(new Error(res.message || 'Error')) + } else { + return res } + }, + error => { + /** *** 接收到异常响应的处理开始 *****/ + // console.log('err' + error) // for debug + Message({ + showClose: true, + message: error.message, + type: 'error', + duration: 5 * 1000 + }) + return Promise.reject(error) + } ) - export default service \ No newline at end of file diff --git a/src/util/scroll-to.js b/src/util/scroll-to.js new file mode 100644 index 0000000000000000000000000000000000000000..331ef4762e5172acbdd17a4ab56ce83dfa847471 --- /dev/null +++ b/src/util/scroll-to.js @@ -0,0 +1,58 @@ +Math.easeInOutQuad = function(t, b, c, d) { + t /= d / 2 + if (t < 1) { + return c / 2 * t * t + b + } + t-- + return -c / 2 * (t * (t - 2) - 1) + b + } + + // requestAnimationFrame for Smart Animating http://goo.gl/sx5sts + var requestAnimFrame = (function() { + return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) } + })() + + /** + * Because it's so fucking difficult to detect the scrolling element, just move them all + * @param {number} amount + */ + function move(amount) { + document.documentElement.scrollTop = amount + document.body.parentNode.scrollTop = amount + document.body.scrollTop = amount + } + + function position() { + return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop + } + + /** + * @param {number} to + * @param {number} duration + * @param {Function} callback + */ + export function scrollTo(to, duration, callback) { + const start = position() + const change = to - start + const increment = 20 + let currentTime = 0 + duration = (typeof (duration) === 'undefined') ? 500 : duration + var animateScroll = function() { + // increment the time + currentTime += increment + // find the value with the quadratic in-out easing function + var val = Math.easeInOutQuad(currentTime, start, change, duration) + // move the document.body + move(val) + // do the animation unless its over + if (currentTime < duration) { + requestAnimFrame(animateScroll) + } else { + if (callback && typeof (callback) === 'function') { + // the animation is done so lets callback + callback() + } + } + } + animateScroll() + } \ No newline at end of file diff --git a/src/view/Home.vue b/src/view/Home.vue index 9443b3b464d80e2b792fac0f210ccbccce6a9e52..c61c0a25aac09791c645179b314fe9d67079a27e 100644 --- a/src/view/Home.vue +++ b/src/view/Home.vue @@ -1,44 +1,46 @@ \ No newline at end of file diff --git a/src/view/card/LoginWelcome.vue b/src/view/card/LoginWelcome.vue new file mode 100644 index 0000000000000000000000000000000000000000..fc55741c67dc76f5340f0166c6e00235a87e615f --- /dev/null +++ b/src/view/card/LoginWelcome.vue @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/src/view/card/Promotion.vue b/src/view/card/Promotion.vue new file mode 100644 index 0000000000000000000000000000000000000000..6d58c03e25fb29df3f76b80d92f97532d32e311e --- /dev/null +++ b/src/view/card/Promotion.vue @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/src/view/card/Tip.vue b/src/view/card/Tip.vue index 33b8492c450c8ae0d5ec20ee704cdc62a52140a3..25a7204a4811d5138b0875316b8bf70ae878a7c0 100644 --- a/src/view/card/Tip.vue +++ b/src/view/card/Tip.vue @@ -1,29 +1,34 @@ + + \ No newline at end of file diff --git a/src/view/error/404.vue b/src/view/error/404.vue index 8e20d0bbf1fc346b1933124dd769d81cf9bc6348..4b3783a66ebb2eed69528ee0546a02585ede939d 100644 --- a/src/view/error/404.vue +++ b/src/view/error/404.vue @@ -1,3 +1,46 @@ + +