first commit
This commit is contained in:
parent
dffb88bf1c
commit
509773ccbf
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-row class="wrapper">
|
<el-row class="wrapper">
|
||||||
<el-col :xs="24" :sm="24" :xl="24" style="margin: 0 auto;">
|
<el-col :xs="24" :sm="24" :xl="24" style="margin: 0 auto;">
|
||||||
<el-col v-for="article in articles" :key="article.idArticle" style="padding-bottom: 1rem;">
|
<el-col v-for="article in articles.data" :key="article.idArticle" style="padding-bottom: 1rem;">
|
||||||
<el-card>
|
<el-card>
|
||||||
<div class="card-body d-flex flex-column">
|
<div class="card-body d-flex flex-column">
|
||||||
<el-link @click="onRouter('article',article.articleLink)" :underline="false" style="margin-bottom: .5rem;">
|
<el-link @click="onRouter('article',article.articleLink)" :underline="false" style="margin-bottom: .5rem;">
|
||||||
@ -49,52 +49,29 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
export default {
|
import Vue from 'vue';
|
||||||
name: "AsideMain",
|
import { mapState } from 'vuex';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
name: "PcAside",
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
articles: [],
|
|
||||||
pagination: {
|
|
||||||
currentPage: 1,
|
|
||||||
pageSize: 10,
|
|
||||||
total: 0
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
...mapState({
|
||||||
|
articles: state => state.article.list.data,
|
||||||
|
pagination: state => state.article.list.data.pagination
|
||||||
|
})
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
currentChange(val){
|
currentChange(p) {
|
||||||
this.getData(val);
|
console.log(p);
|
||||||
},
|
|
||||||
async getData(p){
|
|
||||||
let _ts = this;
|
|
||||||
const responseTopData = await this.axios.get('/console/articles?page='+p);
|
|
||||||
if (responseTopData) {
|
|
||||||
responseTopData.pagination.currentPage = p;
|
|
||||||
_ts.$set(_ts, 'articles', responseTopData.articles);
|
|
||||||
_ts.$set(_ts, 'pagination', responseTopData.pagination);
|
|
||||||
window.scrollTo(0, 0);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onRouter (name, data) {
|
|
||||||
if (name === 'article') {
|
|
||||||
this.$router.push({
|
|
||||||
path: data
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
this.$router.push(
|
|
||||||
{
|
|
||||||
path: '/user/' + data
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted () {
|
mounted () {
|
||||||
this.$store.commit('setActiveMenu', 'home');
|
|
||||||
const p = this.pagination.currentPage;
|
|
||||||
this.getData(p);
|
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import { mapState } from 'vuex'
|
||||||
import HeaderView from "./header";
|
import HeaderView from "./header";
|
||||||
import FooterView from "./footer";
|
import FooterView from "./footer";
|
||||||
import AsideView from './aside/main';
|
import AsideView from './aside/main';
|
||||||
@ -23,6 +24,9 @@
|
|||||||
HeaderView,
|
HeaderView,
|
||||||
FooterView,
|
FooterView,
|
||||||
AsideView
|
AsideView
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
...mapState('global', [])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
15
environment.js
Normal file
15
environment.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* @file Environment / ES module
|
||||||
|
* @module environment
|
||||||
|
* @author Surmon <https://github.com/surmon-china>
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const environment = process.env
|
||||||
|
export const NODE_ENV = environment.NODE_ENV
|
||||||
|
export const isDevMode = Object.is(NODE_ENV, 'development')
|
||||||
|
export const isProdMode = Object.is(NODE_ENV, 'production')
|
||||||
|
|
||||||
|
export const isStatic = process && process.static
|
||||||
|
export const isServer = process && process.server
|
||||||
|
export const isBrowser = process && process.browser
|
||||||
|
export const isModern = process && process.modern
|
@ -1,8 +1,30 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<nuxt />
|
<pc-main-view v-if="!isMobile"/>
|
||||||
|
<mobile-main-view v-else/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
<script>
|
||||||
|
import Vue from 'vue';
|
||||||
|
import PcMainView from '~/components/layouts/pc/main.vue';
|
||||||
|
import MobileMainView from '~/components/layouts/mobile/main.vue';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
name: 'App',
|
||||||
|
components: {
|
||||||
|
PcMainView,
|
||||||
|
MobileMainView
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
theme() {
|
||||||
|
return this.$store.state.global.theme
|
||||||
|
},
|
||||||
|
isMobile() {
|
||||||
|
return this.$store.state.global.isMobile
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
body {
|
body {
|
||||||
@ -15,11 +37,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
a, li {
|
a, li {
|
||||||
text-decoration:none !important;
|
text-decoration: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1 a, h2 a, h3 a, h4 a, h5 a, h6 a, .h1 a, .h2 a, .h3 a, .h4 a, .h5 a, .h6 a {
|
h1 a, h2 a, h3 a, h4 a, h5 a, h6 a, .h1 a, .h2 a, .h3 a, .h4 a, .h5 a, .h6 a {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
h4, .h4 {
|
h4, .h4 {
|
||||||
font-size: 1.125rem;
|
font-size: 1.125rem;
|
||||||
}
|
}
|
||||||
@ -81,38 +105,38 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.article-summary-md {
|
.article-summary-md {
|
||||||
position:relative;
|
position: relative;
|
||||||
line-height:1.4em;
|
line-height: 1.4em;
|
||||||
/* 3 times the line-height to show 3 lines */
|
/* 3 times the line-height to show 3 lines */
|
||||||
height:4.2em;
|
height: 4.2em;
|
||||||
overflow:hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.article-summary-md::after {
|
.article-summary-md::after {
|
||||||
content:"...";
|
content: "...";
|
||||||
font-weight:bold;
|
font-weight: bold;
|
||||||
position:absolute;
|
position: absolute;
|
||||||
bottom:0;
|
bottom: 0;
|
||||||
right:0;
|
right: 0;
|
||||||
padding:0 20px 1px 45px;
|
padding: 0 20px 1px 45px;
|
||||||
/*background:url(http://newimg88.b0.upaiyun.com/newimg88/2014/09/ellipsis_bg.png) repeat-y;*/
|
/*background:url(http://newimg88.b0.upaiyun.com/newimg88/2014/09/ellipsis_bg.png) repeat-y;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
.article-summary-sd {
|
.article-summary-sd {
|
||||||
position:relative;
|
position: relative;
|
||||||
line-height:1.4em;
|
line-height: 1.4em;
|
||||||
/* 1 times the line-height to show 1 lines */
|
/* 1 times the line-height to show 1 lines */
|
||||||
height:1.4em;
|
height: 1.4em;
|
||||||
overflow:hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.article-summary-sd::after {
|
.article-summary-sd::after {
|
||||||
content:"...";
|
content: "...";
|
||||||
font-weight:bold;
|
font-weight: bold;
|
||||||
position:absolute;
|
position: absolute;
|
||||||
bottom:0;
|
bottom: 0;
|
||||||
right:0;
|
right: 0;
|
||||||
padding:0 20px 1px 45px;
|
padding: 0 20px 1px 45px;
|
||||||
/*background:url(http://newimg88.b0.upaiyun.com/newimg88/2014/09/ellipsis_bg.png) repeat-y;*/
|
/*background:url(http://newimg88.b0.upaiyun.com/newimg88/2014/09/ellipsis_bg.png) repeat-y;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -154,6 +178,7 @@
|
|||||||
.text-left {
|
.text-left {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
.text-right {
|
.text-right {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
@ -6,11 +6,23 @@ export default {
|
|||||||
*/
|
*/
|
||||||
mode: 'universal',
|
mode: 'universal',
|
||||||
/*
|
/*
|
||||||
|
** Render configuration
|
||||||
|
*/
|
||||||
|
render: {
|
||||||
|
csp: true
|
||||||
|
},
|
||||||
|
/*
|
||||||
|
** Environment variable configuration
|
||||||
|
*/
|
||||||
|
env: {
|
||||||
|
baseUrl: 'http://127.0.0.1:8099'
|
||||||
|
},
|
||||||
|
/*
|
||||||
** Headers of the page
|
** Headers of the page
|
||||||
** See https://nuxtjs.org/api/configuration-head
|
** See https://nuxtjs.org/api/configuration-head
|
||||||
*/
|
*/
|
||||||
head: {
|
head: {
|
||||||
title: process.env.npm_package_name || '',
|
title: 'RYMCU - 嵌入式知识学习交流平台',
|
||||||
meta: [
|
meta: [
|
||||||
{ charset: 'utf-8' },
|
{ charset: 'utf-8' },
|
||||||
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
|
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
|
||||||
@ -32,7 +44,7 @@ export default {
|
|||||||
*/
|
*/
|
||||||
plugins: [
|
plugins: [
|
||||||
'@/plugins/element-ui',
|
'@/plugins/element-ui',
|
||||||
'@/plugins/axios'
|
// '@/plugins/axios'
|
||||||
],
|
],
|
||||||
/*
|
/*
|
||||||
** Nuxt.js dev-modules
|
** Nuxt.js dev-modules
|
||||||
@ -43,6 +55,7 @@ export default {
|
|||||||
** Nuxt.js modules
|
** Nuxt.js modules
|
||||||
*/
|
*/
|
||||||
modules: [
|
modules: [
|
||||||
|
'@nuxtjs/axios'
|
||||||
],
|
],
|
||||||
/*
|
/*
|
||||||
** Build configuration
|
** Build configuration
|
||||||
@ -52,6 +65,9 @@ export default {
|
|||||||
transpile: [/^element-ui/],
|
transpile: [/^element-ui/],
|
||||||
},
|
},
|
||||||
proxy: {
|
proxy: {
|
||||||
'/api': 'http://localhost:8099/vertical/'
|
'/api': {
|
||||||
|
target: 'http://localhost:8099/vertical/',
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
127
package-lock.json
generated
127
package-lock.json
generated
@ -1404,6 +1404,27 @@
|
|||||||
"webpackbar": "^4.0.0"
|
"webpackbar": "^4.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@nuxtjs/axios": {
|
||||||
|
"version": "5.11.0",
|
||||||
|
"resolved": "https://registry.npm.taobao.org/@nuxtjs/axios/download/@nuxtjs/axios-5.11.0.tgz",
|
||||||
|
"integrity": "sha1-J9cpemnhHDkDm5ysrGHi4NDgDx8=",
|
||||||
|
"requires": {
|
||||||
|
"@nuxtjs/proxy": "^2.0.0",
|
||||||
|
"axios": "^0.19.2",
|
||||||
|
"axios-retry": "^3.1.8",
|
||||||
|
"consola": "^2.11.3",
|
||||||
|
"defu": "^2.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@nuxtjs/proxy": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npm.taobao.org/@nuxtjs/proxy/download/@nuxtjs/proxy-2.0.0.tgz",
|
||||||
|
"integrity": "sha1-zxmJTqxyGirYlik/JBNx8Ebbcec=",
|
||||||
|
"requires": {
|
||||||
|
"consola": "^2.11.3",
|
||||||
|
"http-proxy-middleware": "^1.0.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@nuxtjs/youch": {
|
"@nuxtjs/youch": {
|
||||||
"version": "4.2.3",
|
"version": "4.2.3",
|
||||||
"resolved": "https://registry.npm.taobao.org/@nuxtjs/youch/download/@nuxtjs/youch-4.2.3.tgz",
|
"resolved": "https://registry.npm.taobao.org/@nuxtjs/youch/download/@nuxtjs/youch-4.2.3.tgz",
|
||||||
@ -1436,6 +1457,14 @@
|
|||||||
"resolved": "https://registry.npm.taobao.org/@types/html-minifier-terser/download/@types/html-minifier-terser-5.1.0.tgz",
|
"resolved": "https://registry.npm.taobao.org/@types/html-minifier-terser/download/@types/html-minifier-terser-5.1.0.tgz",
|
||||||
"integrity": "sha1-VRpFibbuLMnB3/CAVhKK7Cm5SIA="
|
"integrity": "sha1-VRpFibbuLMnB3/CAVhKK7Cm5SIA="
|
||||||
},
|
},
|
||||||
|
"@types/http-proxy": {
|
||||||
|
"version": "1.17.4",
|
||||||
|
"resolved": "https://registry.npm.taobao.org/@types/http-proxy/download/@types/http-proxy-1.17.4.tgz",
|
||||||
|
"integrity": "sha1-58kuPb4+E6p5lED/QubToXqdBFs=",
|
||||||
|
"requires": {
|
||||||
|
"@types/node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@types/json-schema": {
|
"@types/json-schema": {
|
||||||
"version": "7.0.5",
|
"version": "7.0.5",
|
||||||
"resolved": "https://registry.npm.taobao.org/@types/json-schema/download/@types/json-schema-7.0.5.tgz?cache=0&sync_timestamp=1591720889158&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fjson-schema%2Fdownload%2F%40types%2Fjson-schema-7.0.5.tgz",
|
"resolved": "https://registry.npm.taobao.org/@types/json-schema/download/@types/json-schema-7.0.5.tgz?cache=0&sync_timestamp=1591720889158&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fjson-schema%2Fdownload%2F%40types%2Fjson-schema-7.0.5.tgz",
|
||||||
@ -2081,6 +2110,14 @@
|
|||||||
"follow-redirects": "1.5.10"
|
"follow-redirects": "1.5.10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"axios-retry": {
|
||||||
|
"version": "3.1.8",
|
||||||
|
"resolved": "https://registry.npm.taobao.org/axios-retry/download/axios-retry-3.1.8.tgz",
|
||||||
|
"integrity": "sha1-/8/tdX4fq4y/gy+FBbsOCvR8Ugw=",
|
||||||
|
"requires": {
|
||||||
|
"is-retry-allowed": "^1.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"babel-helper-vue-jsx-merge-props": {
|
"babel-helper-vue-jsx-merge-props": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
"resolved": "https://registry.npm.taobao.org/babel-helper-vue-jsx-merge-props/download/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
|
"resolved": "https://registry.npm.taobao.org/babel-helper-vue-jsx-merge-props/download/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
|
||||||
@ -3196,6 +3233,14 @@
|
|||||||
"resolved": "https://registry.npm.taobao.org/create-require/download/create-require-1.0.2.tgz",
|
"resolved": "https://registry.npm.taobao.org/create-require/download/create-require-1.0.2.tgz",
|
||||||
"integrity": "sha1-A/l60IIoJuUGll84X9kDiPUFFiQ="
|
"integrity": "sha1-A/l60IIoJuUGll84X9kDiPUFFiQ="
|
||||||
},
|
},
|
||||||
|
"cross-env": {
|
||||||
|
"version": "7.0.2",
|
||||||
|
"resolved": "https://registry.npm.taobao.org/cross-env/download/cross-env-7.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcross-env%2Fdownload%2Fcross-env-7.0.2.tgz",
|
||||||
|
"integrity": "sha1-vV7TEzmpOjQYrE88qco0Awgq5fk=",
|
||||||
|
"requires": {
|
||||||
|
"cross-spawn": "^7.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"cross-spawn": {
|
"cross-spawn": {
|
||||||
"version": "7.0.3",
|
"version": "7.0.3",
|
||||||
"resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz",
|
"resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz",
|
||||||
@ -3956,6 +4001,11 @@
|
|||||||
"resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz",
|
"resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz",
|
||||||
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
|
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
|
||||||
},
|
},
|
||||||
|
"eventemitter3": {
|
||||||
|
"version": "4.0.4",
|
||||||
|
"resolved": "https://registry.npm.taobao.org/eventemitter3/download/eventemitter3-4.0.4.tgz?cache=0&sync_timestamp=1589283150629&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feventemitter3%2Fdownload%2Feventemitter3-4.0.4.tgz",
|
||||||
|
"integrity": "sha1-tUY6zmNaCD0Bi9x8kXtMXxCoU4Q="
|
||||||
|
},
|
||||||
"events": {
|
"events": {
|
||||||
"version": "3.1.0",
|
"version": "3.1.0",
|
||||||
"resolved": "https://registry.npm.taobao.org/events/download/events-3.1.0.tgz",
|
"resolved": "https://registry.npm.taobao.org/events/download/events-3.1.0.tgz",
|
||||||
@ -5040,6 +5090,68 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"http-proxy": {
|
||||||
|
"version": "1.18.1",
|
||||||
|
"resolved": "https://registry.npm.taobao.org/http-proxy/download/http-proxy-1.18.1.tgz",
|
||||||
|
"integrity": "sha1-QBVB8FNIhLv5UmAzTnL4juOXZUk=",
|
||||||
|
"requires": {
|
||||||
|
"eventemitter3": "^4.0.0",
|
||||||
|
"follow-redirects": "^1.0.0",
|
||||||
|
"requires-port": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"http-proxy-middleware": {
|
||||||
|
"version": "1.0.4",
|
||||||
|
"resolved": "https://registry.npm.taobao.org/http-proxy-middleware/download/http-proxy-middleware-1.0.4.tgz?cache=0&sync_timestamp=1589915551464&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-proxy-middleware%2Fdownload%2Fhttp-proxy-middleware-1.0.4.tgz",
|
||||||
|
"integrity": "sha1-Ql6hd5hqDNo0+cgeyWHHGa22wqk=",
|
||||||
|
"requires": {
|
||||||
|
"@types/http-proxy": "^1.17.4",
|
||||||
|
"http-proxy": "^1.18.1",
|
||||||
|
"is-glob": "^4.0.1",
|
||||||
|
"lodash": "^4.17.15",
|
||||||
|
"micromatch": "^4.0.2"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"braces": {
|
||||||
|
"version": "3.0.2",
|
||||||
|
"resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz",
|
||||||
|
"integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=",
|
||||||
|
"requires": {
|
||||||
|
"fill-range": "^7.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fill-range": {
|
||||||
|
"version": "7.0.1",
|
||||||
|
"resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz",
|
||||||
|
"integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=",
|
||||||
|
"requires": {
|
||||||
|
"to-regex-range": "^5.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"is-number": {
|
||||||
|
"version": "7.0.0",
|
||||||
|
"resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz",
|
||||||
|
"integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss="
|
||||||
|
},
|
||||||
|
"micromatch": {
|
||||||
|
"version": "4.0.2",
|
||||||
|
"resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.2.tgz?cache=0&sync_timestamp=1588851826089&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmicromatch%2Fdownload%2Fmicromatch-4.0.2.tgz",
|
||||||
|
"integrity": "sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk=",
|
||||||
|
"requires": {
|
||||||
|
"braces": "^3.0.1",
|
||||||
|
"picomatch": "^2.0.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"to-regex-range": {
|
||||||
|
"version": "5.0.1",
|
||||||
|
"resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz",
|
||||||
|
"integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=",
|
||||||
|
"requires": {
|
||||||
|
"is-number": "^7.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"https-browserify": {
|
"https-browserify": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz",
|
"resolved": "https://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz",
|
||||||
@ -5417,6 +5529,11 @@
|
|||||||
"resolved": "https://registry.npm.taobao.org/is-resolvable/download/is-resolvable-1.1.0.tgz",
|
"resolved": "https://registry.npm.taobao.org/is-resolvable/download/is-resolvable-1.1.0.tgz",
|
||||||
"integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg="
|
"integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg="
|
||||||
},
|
},
|
||||||
|
"is-retry-allowed": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npm.taobao.org/is-retry-allowed/download/is-retry-allowed-1.2.0.tgz",
|
||||||
|
"integrity": "sha1-13hIi9CkZmo76KFIK58rqv7eqLQ="
|
||||||
|
},
|
||||||
"is-ssh": {
|
"is-ssh": {
|
||||||
"version": "1.3.1",
|
"version": "1.3.1",
|
||||||
"resolved": "https://registry.npm.taobao.org/is-ssh/download/is-ssh-1.3.1.tgz",
|
"resolved": "https://registry.npm.taobao.org/is-ssh/download/is-ssh-1.3.1.tgz",
|
||||||
@ -8079,6 +8196,11 @@
|
|||||||
"resolved": "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz",
|
"resolved": "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz",
|
||||||
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
|
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
|
||||||
},
|
},
|
||||||
|
"requires-port": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
|
||||||
|
},
|
||||||
"resize-observer-polyfill": {
|
"resize-observer-polyfill": {
|
||||||
"version": "1.5.1",
|
"version": "1.5.1",
|
||||||
"resolved": "https://registry.npm.taobao.org/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz",
|
"resolved": "https://registry.npm.taobao.org/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz",
|
||||||
@ -9421,11 +9543,6 @@
|
|||||||
"resolved": "https://registry.npm.taobao.org/vue/download/vue-2.6.11.tgz",
|
"resolved": "https://registry.npm.taobao.org/vue/download/vue-2.6.11.tgz",
|
||||||
"integrity": "sha1-dllNh31LEiNEBuhONSdcbVFBJcU="
|
"integrity": "sha1-dllNh31LEiNEBuhONSdcbVFBJcU="
|
||||||
},
|
},
|
||||||
"vue-axios": {
|
|
||||||
"version": "2.1.5",
|
|
||||||
"resolved": "https://registry.npm.taobao.org/vue-axios/download/vue-axios-2.1.5.tgz",
|
|
||||||
"integrity": "sha1-GvS/EhjtcTCcdq+zjQ9oPjEsJKc="
|
|
||||||
},
|
|
||||||
"vue-client-only": {
|
"vue-client-only": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npm.taobao.org/vue-client-only/download/vue-client-only-2.0.0.tgz",
|
"resolved": "https://registry.npm.taobao.org/vue-client-only/download/vue-client-only-2.0.0.tgz",
|
||||||
|
@ -9,11 +9,11 @@
|
|||||||
"generate": "nuxt generate"
|
"generate": "nuxt generate"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^0.19.2",
|
"@nuxtjs/axios": "^5.11.0",
|
||||||
|
"cross-env": "^7.0.2",
|
||||||
"element-ui": "^2.13.2",
|
"element-ui": "^2.13.2",
|
||||||
"nuxt": "^2.13.0",
|
"nuxt": "^2.13.0",
|
||||||
"vditor": "^3.3.2",
|
"vditor": "^3.3.2"
|
||||||
"vue-axios": "^2.1.5"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {}
|
"devDependencies": {}
|
||||||
}
|
}
|
||||||
|
@ -1,30 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<pc-main-view v-if="!isMobile"/>
|
|
||||||
<mobile-main-view v-else/>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
|
||||||
import PcMainView from '~/components/layouts/pc/main.vue'
|
|
||||||
import MobileMainView from '~/components/layouts/mobile/main.vue'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
PcMainView,
|
|
||||||
MobileMainView
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
theme() {
|
|
||||||
return this.$store.state.theme
|
|
||||||
},
|
|
||||||
isMobile() {
|
|
||||||
return this.$store.state.isMobile
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.el-header {
|
.el-header {
|
||||||
padding-bottom: 1rem;
|
padding-bottom: 1rem;
|
||||||
|
102
plugins/axios.js
102
plugins/axios.js
@ -1,88 +1,16 @@
|
|||||||
import axios from 'axios'
|
export default function ({ app: { $axios, $cookies } }) {
|
||||||
import VueAxios from 'vue-axios'
|
$axios.defaults.baseURL = process.env.baseUrl
|
||||||
import Vue from 'vue'
|
$axios.defaults.timeout = 30000
|
||||||
|
$axios.interceptors.request.use(config => {
|
||||||
// eslint-disable-next-line no-unused-vars
|
config.headers['X-Token'] = $cookies.get('token') || ''
|
||||||
export default (ctx) => {
|
config.headers['X-Device-Id'] = $cookies.get('clientId') || ''
|
||||||
const customAxios = axios.create({
|
config.headers['X-Uid'] = $cookies.get('userId') || ''
|
||||||
baseURL: '/api',
|
return config
|
||||||
timeout:'10000',
|
})
|
||||||
withCredentials: true
|
$axios.interceptors.response.use(response => {
|
||||||
});
|
if (/^[4|5]/.test(response.status)) {
|
||||||
|
return Promise.reject(response.statusText)
|
||||||
customAxios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
|
}
|
||||||
customAxios.defaults.headers.common['x-requested-with'] = 'XMLHttpRequest';
|
return response.data
|
||||||
|
})
|
||||||
Vue.use(VueAxios, customAxios);
|
|
||||||
|
|
||||||
customAxios.interceptors.request.use((config) => {
|
|
||||||
if(config.url){
|
|
||||||
let token = localStorage.getItem("x-auth-token");
|
|
||||||
if (token) { // 判断是否存在token,如果存在的话,则每个http header都加上token
|
|
||||||
if (!(config.url.indexOf('console') > -1)){
|
|
||||||
config.headers.Authorization = `${token}`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
config.url = '/console/heartbeat'
|
|
||||||
}
|
|
||||||
|
|
||||||
// clear cache
|
|
||||||
// if (config.method === 'get') {
|
|
||||||
// let char = '?'
|
|
||||||
// if (config.url.split('?').length > 1) {
|
|
||||||
// char = '&'
|
|
||||||
// }
|
|
||||||
// config.url += `${char}${(new Date()).getTime()}`
|
|
||||||
// }
|
|
||||||
return config
|
|
||||||
}, function (error) {
|
|
||||||
return Promise.reject(error);
|
|
||||||
});
|
|
||||||
|
|
||||||
customAxios.interceptors.response.use((response) => {
|
|
||||||
let message;
|
|
||||||
if (typeof(response.data.data) !== 'undefined') {
|
|
||||||
message = response.data.data.message
|
|
||||||
} else if (typeof(response.data) !== 'undefined') {
|
|
||||||
message = response.data.message
|
|
||||||
}
|
|
||||||
if (response.data.success) {
|
|
||||||
return response.data.data
|
|
||||||
} else {
|
|
||||||
if(response.data.code === 0){
|
|
||||||
window.app.$message(message);
|
|
||||||
}else if(response.data.code === 401){
|
|
||||||
window.app.$store.commit('logout');
|
|
||||||
window.app.$router.push({
|
|
||||||
name: 'login',
|
|
||||||
query: {
|
|
||||||
historyUrl: window.location.href
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}else if(response.data.code === 402){
|
|
||||||
window.app.$store.commit('logout');
|
|
||||||
window.app.$router.push({
|
|
||||||
name: 'login',
|
|
||||||
query: {
|
|
||||||
historyUrl: window.location.href
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}else if(response.data.code === 404){
|
|
||||||
window.app.$message('操作失败,请稍后再试......')
|
|
||||||
}else if(response.data.code === 500){
|
|
||||||
window.app.$message('服务器正在开小差,请稍后再试......')
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}, (error) => {
|
|
||||||
/*console.log(ctx.app.store.state.locale)
|
|
||||||
ctx.store.commit('setSnackBar', {
|
|
||||||
snackBar: true,
|
|
||||||
snackMsg: ctx.app.i18n.t('requestError', ctx.app.store.state.locale)
|
|
||||||
})*/
|
|
||||||
return Promise.reject(error)
|
|
||||||
})
|
|
||||||
|
|
||||||
return customAxios
|
|
||||||
}
|
}
|
||||||
|
69
store/article.js
Normal file
69
store/article.js
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
import Vue from 'vue';
|
||||||
|
import { isBrowser } from '~/environment';
|
||||||
|
|
||||||
|
const ARTICLE_API_PATH = 'article';
|
||||||
|
|
||||||
|
const getDefaultListData = () => {
|
||||||
|
return {
|
||||||
|
data: [],
|
||||||
|
pagination: {
|
||||||
|
total: 0,
|
||||||
|
currentPage: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export const state = () => ({
|
||||||
|
list: {
|
||||||
|
fetching: false,
|
||||||
|
data: getDefaultListData()
|
||||||
|
},
|
||||||
|
detail: {
|
||||||
|
fetching: false,
|
||||||
|
data: {}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
export const mutations = () => ({
|
||||||
|
// 文章列表
|
||||||
|
updateListFetching(state, action) {
|
||||||
|
state.list.fetching = action
|
||||||
|
},
|
||||||
|
updateListData(state, action) {
|
||||||
|
state.list.data = action
|
||||||
|
},
|
||||||
|
|
||||||
|
// 文章详情
|
||||||
|
updateDetailFetching(state, action) {
|
||||||
|
state.detail.fetching = action
|
||||||
|
},
|
||||||
|
updateDetailData(state, action) {
|
||||||
|
state.detail.data = action
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
export const actions = () => ({
|
||||||
|
// 获取文章列表
|
||||||
|
fetchList({commit}, params = {}) {
|
||||||
|
const isRestart = !params.page || params.page === 1
|
||||||
|
const isLoadMore = params.page && params.page > 1
|
||||||
|
console.log(isRestart, isLoadMore)
|
||||||
|
// 清空已有数据
|
||||||
|
isRestart && commit('updateListData', getDefaultListData())
|
||||||
|
commit('updateListFetching', true)
|
||||||
|
|
||||||
|
return this.$axios
|
||||||
|
.$get(ARTICLE_API_PATH, {params})
|
||||||
|
.then(response => {
|
||||||
|
commit('updateListFetching', false)
|
||||||
|
isLoadMore
|
||||||
|
? commit('updateExistingListData', response.result)
|
||||||
|
: commit('updateListData', response.result)
|
||||||
|
if (isLoadMore && isBrowser) {
|
||||||
|
Vue.nextTick(() => {
|
||||||
|
window.scrollTo(0, 0);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => commit('updateListFetching', false))
|
||||||
|
}
|
||||||
|
})
|
21
store/global.js
Normal file
21
store/global.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
export const state = () => ({
|
||||||
|
theme: 'default',
|
||||||
|
isMobile: false,
|
||||||
|
// ua
|
||||||
|
userAgent: '',
|
||||||
|
// 默认语言
|
||||||
|
language: '',
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
export const getters = () => ({
|
||||||
|
isMobile: state => state.isMobile
|
||||||
|
})
|
||||||
|
|
||||||
|
export const mutations = () => ({
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
export const actions = () => ({
|
||||||
|
|
||||||
|
})
|
148
store/index.js
148
store/index.js
@ -1,142 +1,10 @@
|
|||||||
export const state = () => ({
|
export const actions = () => ({
|
||||||
locale: 'zh_CN',
|
nuxtServerInit(store, {req}) {
|
||||||
version: '1.0.0',
|
// 初始化时的全局任务
|
||||||
isInit: false,
|
const initFetchAppData = [
|
||||||
isLogin: false,
|
// 内容数据
|
||||||
token: '',
|
store.dispatch('article/fetchList')
|
||||||
nickname: '',
|
]
|
||||||
idUser: '',
|
return Promise.all(initFetchAppData)
|
||||||
blogTitle: '',
|
|
||||||
avatarURL: '',
|
|
||||||
blogURL: '/',
|
|
||||||
role: 0, // 0-no login, 1-admin, 2-blog admin, 3-blog author, 4-blog user, 5-visitor
|
|
||||||
blogs: [{
|
|
||||||
title: '',
|
|
||||||
id: ''
|
|
||||||
}],
|
|
||||||
snackMsg: '',
|
|
||||||
snackBar: false,
|
|
||||||
snackModify: 'error',
|
|
||||||
menu: [],
|
|
||||||
tagsItems: [],
|
|
||||||
bodySide: '',
|
|
||||||
login: false,
|
|
||||||
activeMenu: 'home',
|
|
||||||
activeAdminMenu: 'admin-dashboard',
|
|
||||||
activeTopic: '51mcu',
|
|
||||||
activeTag: 'news',
|
|
||||||
uploadHeaders: '',
|
|
||||||
theme: '',
|
|
||||||
isMobile: false
|
|
||||||
})
|
|
||||||
|
|
||||||
export const mutations = () => ({
|
|
||||||
setLogin(state, data) {
|
|
||||||
state.login = data
|
|
||||||
},
|
|
||||||
setActiveMenu(state, data) {
|
|
||||||
state.activeMenu = data
|
|
||||||
},
|
|
||||||
setActiveAdminMenu(state, data) {
|
|
||||||
state.activeAdminMenu = data
|
|
||||||
},
|
|
||||||
setActiveTopic(state, data) {
|
|
||||||
state.activeTopic = data
|
|
||||||
},
|
|
||||||
setActiveTag(state, data) {
|
|
||||||
state.activeTag = data
|
|
||||||
},
|
|
||||||
setUserInfo(state, data) {
|
|
||||||
state.avatarURL = data.avatarUrl;
|
|
||||||
state.nickname = data.nickname;
|
|
||||||
localStorage.setItem('avatarURL', data.avatarUrl);
|
|
||||||
localStorage.setItem('nickname', data.nickname);
|
|
||||||
},
|
|
||||||
initLogin(state, data) {
|
|
||||||
state.isLogin = true;
|
|
||||||
state.avatarURL = data.avatarUrl;
|
|
||||||
state.nickname = data.nickname;
|
|
||||||
state.token = data.token;
|
|
||||||
state.account = data.account;
|
|
||||||
state.role = data.weights;
|
|
||||||
state.idUser = data.idUser;
|
|
||||||
localStorage.setItem('isLogin', 'true');
|
|
||||||
localStorage.setItem('avatarURL', data.avatarUrl);
|
|
||||||
localStorage.setItem('nickname', data.nickname);
|
|
||||||
localStorage.setItem('account', data.account);
|
|
||||||
localStorage.setItem('idUser', data.idUser);
|
|
||||||
localStorage.setItem('x-auth-token', data.token);
|
|
||||||
localStorage.setItem('role', data.weights);
|
|
||||||
},
|
|
||||||
logout(state) {
|
|
||||||
state.isLogin = false;
|
|
||||||
state.avatarURL = '';
|
|
||||||
state.nickname = '';
|
|
||||||
state.token = '';
|
|
||||||
state.account = '';
|
|
||||||
state.role = '';
|
|
||||||
state.idUser = '';
|
|
||||||
localStorage.removeItem('isLogin');
|
|
||||||
localStorage.removeItem('avatarURL');
|
|
||||||
localStorage.removeItem('nickname');
|
|
||||||
localStorage.removeItem('account');
|
|
||||||
localStorage.removeItem('idUser');
|
|
||||||
localStorage.removeItem('x-auth-token');
|
|
||||||
localStorage.removeItem('role');
|
|
||||||
},
|
|
||||||
setUploadHeaders(state, data) {
|
|
||||||
state.uploadHeaders = data
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
export const actions = () => ({})
|
|
||||||
|
|
||||||
export const getters = () => ({
|
|
||||||
uploadHeaders(state) {
|
|
||||||
return state.uploadHeaders;
|
|
||||||
},
|
|
||||||
isLogin(state) {
|
|
||||||
if (!state.isLogin) {
|
|
||||||
state.isLogin = localStorage.getItem('isLogin'); //从localStorage中读取状态
|
|
||||||
state.nickname = localStorage.getItem('nickname');
|
|
||||||
state.avatarURL = localStorage.getItem('avatarURL') !== 'undefined' ? localStorage.getItem('avatarURL') : "";
|
|
||||||
state.token = localStorage.getItem('x-auth-token');
|
|
||||||
state.account = localStorage.getItem('account');
|
|
||||||
state.idUser = localStorage.getItem('idUser');
|
|
||||||
state.role = Number(localStorage.getItem('role'));
|
|
||||||
}
|
|
||||||
return state.isLogin
|
|
||||||
},
|
|
||||||
hasPermissions: (state) => (scenes) => {
|
|
||||||
let hasPermissions = false;
|
|
||||||
if (state.role) {
|
|
||||||
switch (scenes) {
|
|
||||||
case 'user':
|
|
||||||
hasPermissions = state.role < 5;
|
|
||||||
break;
|
|
||||||
case 'role':
|
|
||||||
hasPermissions = state.role < 2;
|
|
||||||
break;
|
|
||||||
case 'topic':
|
|
||||||
hasPermissions = state.role < 3;
|
|
||||||
break;
|
|
||||||
case 'tag':
|
|
||||||
hasPermissions = state.role < 3;
|
|
||||||
break;
|
|
||||||
case 'admin':
|
|
||||||
hasPermissions = state.role < 2;
|
|
||||||
break;
|
|
||||||
case 'blog_admin':
|
|
||||||
hasPermissions = state.role < 3;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
hasPermissions = false;
|
|
||||||
window.app.$store.commit('logout');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return hasPermissions;
|
|
||||||
},
|
|
||||||
isAuthor: (state) => (scenes) => {
|
|
||||||
return state.nickname === scenes ? true : false;
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user