Merge branch 'master' into deploy
This commit is contained in:
		@@ -9,7 +9,7 @@ const CopyWebpackPlugin = require('copy-webpack-plugin')
 | 
				
			|||||||
const HtmlWebpackPlugin = require('html-webpack-plugin')
 | 
					const HtmlWebpackPlugin = require('html-webpack-plugin')
 | 
				
			||||||
const ScriptExtHtmlWebpackPlugin = require('script-ext-html-webpack-plugin')
 | 
					const ScriptExtHtmlWebpackPlugin = require('script-ext-html-webpack-plugin')
 | 
				
			||||||
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
 | 
					const MiniCssExtractPlugin = require('mini-css-extract-plugin')
 | 
				
			||||||
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
 | 
					// const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
 | 
				
			||||||
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
 | 
					const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function resolve(dir) {
 | 
					function resolve(dir) {
 | 
				
			||||||
@@ -140,7 +140,7 @@ const webpackConfig = merge(baseWebpackConfig, {
 | 
				
			|||||||
      }),
 | 
					      }),
 | 
				
			||||||
      // Compress extracted CSS. We are using this plugin so that possible
 | 
					      // Compress extracted CSS. We are using this plugin so that possible
 | 
				
			||||||
      // duplicated CSS from different components can be deduped.
 | 
					      // duplicated CSS from different components can be deduped.
 | 
				
			||||||
      new OptimizeCSSAssetsPlugin()
 | 
					      // new OptimizeCSSAssetsPlugin()
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "vue-element-admin",
 | 
					  "name": "vue-element-admin",
 | 
				
			||||||
  "version": "3.9.1",
 | 
					  "version": "3.9.2",
 | 
				
			||||||
  "description": "A magical vue admin. Typical templates for enterprise applications. Newest development stack of vue. Lots of awesome features",
 | 
					  "description": "A magical vue admin. Typical templates for enterprise applications. Newest development stack of vue. Lots of awesome features",
 | 
				
			||||||
  "author": "Pan <panfree23@gmail.com>",
 | 
					  "author": "Pan <panfree23@gmail.com>",
 | 
				
			||||||
  "license": "MIT",
 | 
					  "license": "MIT",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										99
									
								
								src/components/Pagination/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								src/components/Pagination/index.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,99 @@
 | 
				
			|||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div :class="{'hidden':hidden}" class="pagination-container">
 | 
				
			||||||
 | 
					    <el-pagination
 | 
				
			||||||
 | 
					      :background="background"
 | 
				
			||||||
 | 
					      :current-page.sync="currentPage"
 | 
				
			||||||
 | 
					      :page-size.sync="pageSize"
 | 
				
			||||||
 | 
					      :layout="layout"
 | 
				
			||||||
 | 
					      :total="total"
 | 
				
			||||||
 | 
					      v-bind="$attrs"
 | 
				
			||||||
 | 
					      @size-change="handleSizeChange"
 | 
				
			||||||
 | 
					      @current-change="handleCurrentChange"/>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import { scrollTo } from '@/utils/scrollTo'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: 'Pagination',
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    total: {
 | 
				
			||||||
 | 
					      required: true,
 | 
				
			||||||
 | 
					      type: Number
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    page: {
 | 
				
			||||||
 | 
					      type: Number,
 | 
				
			||||||
 | 
					      default: 1
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    limit: {
 | 
				
			||||||
 | 
					      type: Number,
 | 
				
			||||||
 | 
					      default: 20
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    pageSizes: {
 | 
				
			||||||
 | 
					      type: Array,
 | 
				
			||||||
 | 
					      default() {
 | 
				
			||||||
 | 
					        return [10, 20, 30, 50]
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    layout: {
 | 
				
			||||||
 | 
					      type: String,
 | 
				
			||||||
 | 
					      default: 'total, sizes, prev, pager, next, jumper'
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    background: {
 | 
				
			||||||
 | 
					      type: Boolean,
 | 
				
			||||||
 | 
					      default: true
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    autoScroll: {
 | 
				
			||||||
 | 
					      type: Boolean,
 | 
				
			||||||
 | 
					      default: true
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    hidden: {
 | 
				
			||||||
 | 
					      type: Boolean,
 | 
				
			||||||
 | 
					      default: false
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {
 | 
				
			||||||
 | 
					    currentPage: {
 | 
				
			||||||
 | 
					      get() {
 | 
				
			||||||
 | 
					        return this.page
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      set(val) {
 | 
				
			||||||
 | 
					        this.$emit('update:page', val)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    pageSize: {
 | 
				
			||||||
 | 
					      get() {
 | 
				
			||||||
 | 
					        return this.limit
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      set(val) {
 | 
				
			||||||
 | 
					        this.$emit('update:limit', val)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  methods: {
 | 
				
			||||||
 | 
					    handleSizeChange(val) {
 | 
				
			||||||
 | 
					      this.$emit('pagination', { page: this.currentPage, limit: val })
 | 
				
			||||||
 | 
					      if (this.autoScroll) {
 | 
				
			||||||
 | 
					        scrollTo(0, 800)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    handleCurrentChange(val) {
 | 
				
			||||||
 | 
					      this.$emit('pagination', { page: val, limit: this.pageSize })
 | 
				
			||||||
 | 
					      if (this.autoScroll) {
 | 
				
			||||||
 | 
					        scrollTo(0, 800)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped>
 | 
				
			||||||
 | 
					.pagination-container {
 | 
				
			||||||
 | 
					  background: #fff;
 | 
				
			||||||
 | 
					  padding: 32px 16px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					.pagination-container.hidden {
 | 
				
			||||||
 | 
					  display: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
@@ -164,17 +164,6 @@ export function objectMerge(target, source) {
 | 
				
			|||||||
  return target
 | 
					  return target
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function scrollTo(element, to, duration) {
 | 
					 | 
				
			||||||
  if (duration <= 0) return
 | 
					 | 
				
			||||||
  const difference = to - element.scrollTop
 | 
					 | 
				
			||||||
  const perTick = (difference / duration) * 10
 | 
					 | 
				
			||||||
  setTimeout(() => {
 | 
					 | 
				
			||||||
    element.scrollTop = element.scrollTop + perTick
 | 
					 | 
				
			||||||
    if (element.scrollTop === to) return
 | 
					 | 
				
			||||||
    scrollTo(element, to, duration - 10)
 | 
					 | 
				
			||||||
  }, 10)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export function toggleClass(element, className) {
 | 
					export function toggleClass(element, className) {
 | 
				
			||||||
  if (!element || !className) {
 | 
					  if (!element || !className) {
 | 
				
			||||||
    return
 | 
					    return
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										50
									
								
								src/utils/scrollTo.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								src/utils/scrollTo.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
				
			|||||||
 | 
					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
 | 
				
			||||||
 | 
					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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -143,7 +143,8 @@ export default {
 | 
				
			|||||||
        title: [{ validator: validateRequire }],
 | 
					        title: [{ validator: validateRequire }],
 | 
				
			||||||
        content: [{ validator: validateRequire }],
 | 
					        content: [{ validator: validateRequire }],
 | 
				
			||||||
        source_uri: [{ validator: validateSourceUri, trigger: 'blur' }]
 | 
					        source_uri: [{ validator: validateSourceUri, trigger: 'blur' }]
 | 
				
			||||||
      }
 | 
					      },
 | 
				
			||||||
 | 
					      tempRoute: {}
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  computed: {
 | 
					  computed: {
 | 
				
			||||||
@@ -161,6 +162,11 @@ export default {
 | 
				
			|||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      this.postForm = Object.assign({}, defaultForm)
 | 
					      this.postForm = Object.assign({}, defaultForm)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Why need to make a copy of this.$route here?
 | 
				
			||||||
 | 
					    // Because if you enter this page and quickly switch tag, may be in the execution of the setTagsViewTitle function, this.$route is no longer pointing to the current page
 | 
				
			||||||
 | 
					    // https://github.com/PanJiaChen/vue-element-admin/issues/1221
 | 
				
			||||||
 | 
					    this.tempRoute = Object.assign({}, this.$route)
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  methods: {
 | 
					  methods: {
 | 
				
			||||||
    fetchData(id) {
 | 
					    fetchData(id) {
 | 
				
			||||||
@@ -178,7 +184,7 @@ export default {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    setTagsViewTitle() {
 | 
					    setTagsViewTitle() {
 | 
				
			||||||
      const title = this.lang === 'zh' ? '编辑文章' : 'Edit Article'
 | 
					      const title = this.lang === 'zh' ? '编辑文章' : 'Edit Article'
 | 
				
			||||||
      const route = Object.assign({}, this.$route, { title: `${title}-${this.postForm.id}` })
 | 
					      const route = Object.assign({}, this.tempRoute, { title: `${title}-${this.postForm.id}` })
 | 
				
			||||||
      this.$store.dispatch('updateVisitedView', route)
 | 
					      this.$store.dispatch('updateVisitedView', route)
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    submitForm() {
 | 
					    submitForm() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,26 +50,18 @@
 | 
				
			|||||||
      </el-table-column>
 | 
					      </el-table-column>
 | 
				
			||||||
    </el-table>
 | 
					    </el-table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <div class="pagination-container">
 | 
					    <pagination v-show="total>0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" />
 | 
				
			||||||
      <el-pagination
 | 
					 | 
				
			||||||
        :current-page="listQuery.page"
 | 
					 | 
				
			||||||
        :page-sizes="[10,20,30, 50]"
 | 
					 | 
				
			||||||
        :page-size="listQuery.limit"
 | 
					 | 
				
			||||||
        :total="total"
 | 
					 | 
				
			||||||
        background
 | 
					 | 
				
			||||||
        layout="total, sizes, prev, pager, next, jumper"
 | 
					 | 
				
			||||||
        @size-change="handleSizeChange"
 | 
					 | 
				
			||||||
        @current-change="handleCurrentChange"/>
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
import { fetchList } from '@/api/article'
 | 
					import { fetchList } from '@/api/article'
 | 
				
			||||||
 | 
					import Pagination from '@/components/Pagination' // Secondary package based on el-pagination
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
  name: 'ArticleList',
 | 
					  name: 'ArticleList',
 | 
				
			||||||
 | 
					  components: { Pagination },
 | 
				
			||||||
  filters: {
 | 
					  filters: {
 | 
				
			||||||
    statusFilter(status) {
 | 
					    statusFilter(status) {
 | 
				
			||||||
      const statusMap = {
 | 
					      const statusMap = {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -80,9 +80,7 @@
 | 
				
			|||||||
      </el-table-column>
 | 
					      </el-table-column>
 | 
				
			||||||
    </el-table>
 | 
					    </el-table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <div class="pagination-container">
 | 
					    <pagination v-show="total>0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" />
 | 
				
			||||||
      <el-pagination v-show="total>0" :current-page="listQuery.page" :page-sizes="[10,20,30, 50]" :page-size="listQuery.limit" :total="total" background layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange" @current-change="handleCurrentChange"/>
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible">
 | 
					    <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible">
 | 
				
			||||||
      <el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="70px" style="width: 400px; margin-left:50px;">
 | 
					      <el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="70px" style="width: 400px; margin-left:50px;">
 | 
				
			||||||
@@ -130,8 +128,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
import { fetchList, fetchPv, createArticle, updateArticle } from '@/api/article'
 | 
					import { fetchList, fetchPv, createArticle, updateArticle } from '@/api/article'
 | 
				
			||||||
import waves from '@/directive/waves' // 水波纹指令
 | 
					import waves from '@/directive/waves' // Waves directive
 | 
				
			||||||
import { parseTime } from '@/utils'
 | 
					import { parseTime } from '@/utils'
 | 
				
			||||||
 | 
					import Pagination from '@/components/Pagination' // Secondary package based on el-pagination
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const calendarTypeOptions = [
 | 
					const calendarTypeOptions = [
 | 
				
			||||||
  { key: 'CN', display_name: 'China' },
 | 
					  { key: 'CN', display_name: 'China' },
 | 
				
			||||||
@@ -148,9 +147,8 @@ const calendarTypeKeyValue = calendarTypeOptions.reduce((acc, cur) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
  name: 'ComplexTable',
 | 
					  name: 'ComplexTable',
 | 
				
			||||||
  directives: {
 | 
					  components: { Pagination },
 | 
				
			||||||
    waves
 | 
					  directives: { waves },
 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  filters: {
 | 
					  filters: {
 | 
				
			||||||
    statusFilter(status) {
 | 
					    statusFilter(status) {
 | 
				
			||||||
      const statusMap = {
 | 
					      const statusMap = {
 | 
				
			||||||
@@ -168,7 +166,7 @@ export default {
 | 
				
			|||||||
    return {
 | 
					    return {
 | 
				
			||||||
      tableKey: 0,
 | 
					      tableKey: 0,
 | 
				
			||||||
      list: null,
 | 
					      list: null,
 | 
				
			||||||
      total: null,
 | 
					      total: 0,
 | 
				
			||||||
      listLoading: true,
 | 
					      listLoading: true,
 | 
				
			||||||
      listQuery: {
 | 
					      listQuery: {
 | 
				
			||||||
        page: 1,
 | 
					        page: 1,
 | 
				
			||||||
@@ -228,14 +226,6 @@ export default {
 | 
				
			|||||||
      this.listQuery.page = 1
 | 
					      this.listQuery.page = 1
 | 
				
			||||||
      this.getList()
 | 
					      this.getList()
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    handleSizeChange(val) {
 | 
					 | 
				
			||||||
      this.listQuery.limit = val
 | 
					 | 
				
			||||||
      this.getList()
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    handleCurrentChange(val) {
 | 
					 | 
				
			||||||
      this.listQuery.page = val
 | 
					 | 
				
			||||||
      this.getList()
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    handleModifyStatus(row, status) {
 | 
					    handleModifyStatus(row, status) {
 | 
				
			||||||
      this.$message({
 | 
					      this.$message({
 | 
				
			||||||
        message: '操作成功',
 | 
					        message: '操作成功',
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user