sunny 2 år sedan
förälder
incheckning
34be51310f
14 ändrade filer med 583 tillägg och 4 borttagningar
  1. BIN
      dist.zip
  2. 4 0
      package.json
  3. 1 1
      src/App.vue
  4. 50 0
      src/api/allApi.js
  5. 14 0
      src/permission.js
  6. 1 1
      src/router/index.js
  7. 22 0
      src/utils/auth.js
  8. 61 0
      src/utils/https.js
  9. 267 0
      src/utils/index.js
  10. 26 0
      src/utils/openWindow.js
  11. 66 0
      src/utils/request.js
  12. 38 0
      src/utils/validate.js
  13. 13 0
      src/views/HomeView/PointsMall.vue
  14. 20 2
      yarn.lock

BIN
dist.zip


+ 4 - 0
package.json

@@ -10,6 +10,9 @@
   "dependencies": {
     "core-js": "^3.8.3",
     "vue": "^2.6.14",
+    "vuex": "3.0.1",
+    "axios": "0.17.1",
+    "element-ui": "^2.15.12",
     "vue-router": "^3.5.1"
   },
   "devDependencies": {
@@ -22,6 +25,7 @@
     "eslint": "^7.32.0",
     "eslint-plugin-vue": "^8.0.3",
     "vue-template-compiler": "^2.6.14",
+    "axios": "0.17.1",
     "element-ui": "^2.15.12"
   },
   "eslintConfig": {

+ 1 - 1
src/App.vue

@@ -69,4 +69,4 @@ nav a.route-active {
   font-size: 30px;
   margin-bottom: 5px;
 }
-</style>
+</style>

+ 50 - 0
src/api/allApi.js

@@ -0,0 +1,50 @@
+import request from '@/utils/request'
+import https from '@/utils/https'
+
+export function authorize(query) {
+  return https({
+    url: '/oauth2api/authorize.if',
+    method: 'post',
+    data: query
+  })
+}
+
+export function list(query) {
+  return request({
+    url: '/admin/mall-sku/festival/user/list',
+    method: 'post',
+    data: query
+  })
+}
+
+export function createNews(data) {
+  return request({
+    url: '/news/createForDGTSiteNews',
+    method: 'post',
+    data
+  })
+}
+
+export function updateNews(data) {
+  return request({
+    url: '/news/update',
+    method: 'post',
+    data
+  })
+}
+
+export function deleteNews(data) {
+  return request({
+    url: '/news/delete',
+    method: 'post',
+    data
+  })
+}
+
+export function deleteAllNews(data) {
+  return request({
+    url: '/news/deleteQuantity',
+    method: 'post',
+    params: data
+  })
+}

+ 14 - 0
src/permission.js

@@ -0,0 +1,14 @@
+import router from './router'
+
+import { getToken } from '@/utils/auth' // getToken from cookie
+
+//路由跳转之前
+router.beforeEach((to, from, next) => {
+  console.log(getToken);
+  if (!getToken()) {
+    return next('http://dgt.dgtis.com/oneportal/login');
+  }
+   next()
+})
+
+router.afterEach(() => {})

+ 1 - 1
src/router/index.js

@@ -12,7 +12,7 @@ const routes = [
   {
     path: '/home',
     component: HomeView,
-    redirect:'/home/employeeDynamics',
+    redirect:'home/employeeDynamics',
     children: [
       {
         path: '/home/employeeDynamics',

+ 22 - 0
src/utils/auth.js

@@ -0,0 +1,22 @@
+import { authorize } from "@/api/allApi";
+
+import Cookies from 'js-cookie'
+
+const TokenKey = 'Admin-Token'
+
+export function getToken() {
+  return Cookies.get(TokenKey)
+}
+
+export function setToken() {
+  authorize({ clientId:'',response_type:'',redirect_uri:'http://192.168.100.137:8080/#/home/employeeDynamics'}).then(response => {
+    const token = response.data.data;
+    return Cookies.set(TokenKey, token);
+  }).catch(() => { 
+    return Cookies.set(TokenKey, '');
+  })
+}
+
+export function removeToken() {
+  return Cookies.remove(TokenKey)
+}

+ 61 - 0
src/utils/https.js

@@ -0,0 +1,61 @@
+import axios from 'axios'
+import { Message, MessageBox } from 'element-ui'
+
+// create an axios instance
+const service = axios.create({
+  baseURL: 'http://dgt.dgtis.com/oneportal/', // api的base_url
+  timeout: 10000 // request timeout
+})
+
+// request interceptor
+service.interceptors.request.use(config => {
+  return config
+}, error => {
+  // Do something with request error
+  console.log(error) // for debug
+  Promise.reject(error)
+})
+
+// respone interceptor
+service.interceptors.response.use(
+  response => {
+    const res = response.data
+    let errmsg = res.errmsg;
+    if (res.errno !== 0) {
+      if(res.errno==303){
+        MessageBox.alert('没有权限登录系统,请输入重新登录', '已退出', {
+          confirmButtonText: '重新登录',
+          type: 'error'
+        }).then(() => {
+            location.reload()
+        })
+      }else if(errmsg !="" && errmsg !=null && res.errno != 401){//401是未登录
+        MessageBox.alert(errmsg,errmsg, {
+          confirmButtonText: '确定',
+          type: 'warning'
+        }).then(() => {
+          location.reload()
+        })
+      }else{
+        MessageBox.alert('超时自动退出系统,请重新登录', '已退出', {
+          confirmButtonText: '重新登录',
+          type: 'error'
+        }).then(() => {
+            location.reload()
+        })
+      }
+      return Promise.reject('error')
+    } else {
+      return response
+    }
+  }, error => {
+    console.log('err' + error)// for debug
+    Message({
+      message: '登录连接超时(后台不能连接,请联系系统管理员)',
+      type: 'error',
+      duration: 5 * 1000
+    })
+    return Promise.reject(error)
+  })
+
+export default service

+ 267 - 0
src/utils/index.js

@@ -0,0 +1,267 @@
+/**
+ * Created by jiachenpan on 16/11/18.
+ */
+
+export function parseTime(time, cFormat) {
+  if (arguments.length === 0) {
+    return null
+  }
+  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
+  let date
+  if (typeof time === 'object') {
+    date = time
+  } else {
+    if (('' + time).length === 10) time = parseInt(time) * 1000
+    date = new Date(time)
+  }
+  const formatObj = {
+    y: date.getFullYear(),
+    m: date.getMonth() + 1,
+    d: date.getDate(),
+    h: date.getHours(),
+    i: date.getMinutes(),
+    s: date.getSeconds(),
+    a: date.getDay()
+  }
+  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
+    let value = formatObj[key]
+    if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1]
+    if (result.length > 0 && value < 10) {
+      value = '0' + value
+    }
+    return value || 0
+  })
+  return time_str
+}
+
+export function formatTime(time, option) {
+  time = +time * 1000
+  const d = new Date(time)
+  const now = Date.now()
+
+  const diff = (now - d) / 1000
+
+  if (diff < 30) {
+    return '刚刚'
+  } else if (diff < 3600) { // less 1 hour
+    return Math.ceil(diff / 60) + '分钟前'
+  } else if (diff < 3600 * 24) {
+    return Math.ceil(diff / 3600) + '小时前'
+  } else if (diff < 3600 * 24 * 2) {
+    return '1天前'
+  }
+  if (option) {
+    return parseTime(time, option)
+  } else {
+    return d.getMonth() + 1 + '月' + d.getDate() + '日' + d.getHours() + '时' + d.getMinutes() + '分'
+  }
+}
+
+// 格式化时间
+export function getQueryObject(url) {
+  url = url == null ? window.location.href : url
+  const search = url.substring(url.lastIndexOf('?') + 1)
+  const obj = {}
+  const reg = /([^?&=]+)=([^?&=]*)/g
+  search.replace(reg, (rs, $1, $2) => {
+    const name = decodeURIComponent($1)
+    let val = decodeURIComponent($2)
+    val = String(val)
+    obj[name] = val
+    return rs
+  })
+  return obj
+}
+
+/**
+ *get getByteLen
+ * @param {Sting} val input value
+ * @returns {number} output value
+ */
+export function getByteLen(val) {
+  let len = 0
+  for (let i = 0; i < val.length; i++) {
+    if (val[i].match(/[^\x00-\xff]/ig) != null) {
+      len += 1
+    } else { len += 0.5 }
+  }
+  return Math.floor(len)
+}
+
+export function cleanArray(actual) {
+  const newArray = []
+  for (let i = 0; i < actual.length; i++) {
+    if (actual[i]) {
+      newArray.push(actual[i])
+    }
+  }
+  return newArray
+}
+
+export function param(json) {
+  if (!json) return ''
+  return cleanArray(Object.keys(json).map(key => {
+    if (json[key] === undefined) return ''
+    return encodeURIComponent(key) + '=' +
+            encodeURIComponent(json[key])
+  })).join('&')
+}
+
+export function param2Obj(url) {
+  const search = url.split('?')[1]
+  if (!search) {
+    return {}
+  }
+  return JSON.parse('{"' + decodeURIComponent(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"') + '"}')
+}
+
+export function html2Text(val) {
+  const div = document.createElement('div')
+  div.innerHTML = val
+  return div.textContent || div.innerText
+}
+
+export function objectMerge(target, source) {
+  /* Merges two  objects,
+     giving the last one precedence */
+
+  if (typeof target !== 'object') {
+    target = {}
+  }
+  if (Array.isArray(source)) {
+    return source.slice()
+  }
+  for (const property in source) {
+    if (source.hasOwnProperty(property)) {
+      const sourceProperty = source[property]
+      if (typeof sourceProperty === 'object') {
+        target[property] = objectMerge(target[property], sourceProperty)
+        continue
+      }
+      target[property] = sourceProperty
+    }
+  }
+  return target
+}
+
+export function scrollTo(element, to, duration) {
+  if (duration <= 0) return
+  const difference = to - element.scrollTop
+  const perTick = difference / duration * 10
+  setTimeout(() => {
+    console.log(new Date())
+    element.scrollTop = element.scrollTop + perTick
+    if (element.scrollTop === to) return
+    scrollTo(element, to, duration - 10)
+  }, 10)
+}
+
+export function toggleClass(element, className) {
+  if (!element || !className) {
+    return
+  }
+  let classString = element.className
+  const nameIndex = classString.indexOf(className)
+  if (nameIndex === -1) {
+    classString += '' + className
+  } else {
+    classString = classString.substr(0, nameIndex) + classString.substr(nameIndex + className.length)
+  }
+  element.className = classString
+}
+
+export const pickerOptions = [
+  {
+    text: '今天',
+    onClick(picker) {
+      const end = new Date()
+      const start = new Date(new Date().toDateString())
+      end.setTime(start.getTime())
+      picker.$emit('pick', [start, end])
+    }
+  }, {
+    text: '最近一周',
+    onClick(picker) {
+      const end = new Date(new Date().toDateString())
+      const start = new Date()
+      start.setTime(end.getTime() - 3600 * 1000 * 24 * 7)
+      picker.$emit('pick', [start, end])
+    }
+  }, {
+    text: '最近一个月',
+    onClick(picker) {
+      const end = new Date(new Date().toDateString())
+      const start = new Date()
+      start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
+      picker.$emit('pick', [start, end])
+    }
+  }, {
+    text: '最近三个月',
+    onClick(picker) {
+      const end = new Date(new Date().toDateString())
+      const start = new Date()
+      start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
+      picker.$emit('pick', [start, end])
+    }
+  }]
+
+export function getTime(type) {
+  if (type === 'start') {
+    return new Date().getTime() - 3600 * 1000 * 24 * 90
+  } else {
+    return new Date(new Date().toDateString())
+  }
+}
+
+export function debounce(func, wait, immediate) {
+  let timeout, args, context, timestamp, result
+
+  const later = function() {
+    // 据上一次触发时间间隔
+    const last = +new Date() - timestamp
+
+    // 上次被包装函数被调用时间间隔last小于设定时间间隔wait
+    if (last < wait && last > 0) {
+      timeout = setTimeout(later, wait - last)
+    } else {
+      timeout = null
+      // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
+      if (!immediate) {
+        result = func.apply(context, args)
+        if (!timeout) context = args = null
+      }
+    }
+  }
+
+  return function(...args) {
+    context = this
+    timestamp = +new Date()
+    const callNow = immediate && !timeout
+    // 如果延时不存在,重新设定延时
+    if (!timeout) timeout = setTimeout(later, wait)
+    if (callNow) {
+      result = func.apply(context, args)
+      context = args = null
+    }
+
+    return result
+  }
+}
+
+export function deepClone(source) {
+  if (!source && typeof source !== 'object') {
+    throw new Error('error arguments', 'shallowClone')
+  }
+  const targetObj = source.constructor === Array ? [] : {}
+  for (const keys in source) {
+    if (source.hasOwnProperty(keys)) {
+      if (source[keys] && typeof source[keys] === 'object') {
+        targetObj[keys] = source[keys].constructor === Array ? [] : {}
+        targetObj[keys] = deepClone(source[keys])
+      } else {
+        targetObj[keys] = source[keys]
+      }
+    }
+  }
+  return targetObj
+}

+ 26 - 0
src/utils/openWindow.js

@@ -0,0 +1,26 @@
+/**
+ *Created by jiachenpan on 16/11/29.
+ * @param {Sting} url
+ * @param {Sting} title
+ * @param {Number} w
+ * @param {Number} h
+ */
+
+export default function openWindow(url, title, w, h) {
+  // Fixes dual-screen position                            Most browsers       Firefox
+  const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left
+  const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top
+
+  const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width
+  const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height
+
+  const left = ((width / 2) - (w / 2)) + dualScreenLeft
+  const top = ((height / 2) - (h / 2)) + dualScreenTop
+  const newWindow = window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left)
+
+  // Puts focus on the newWindow
+  if (window.focus) {
+    newWindow.focus()
+  }
+}
+

+ 66 - 0
src/utils/request.js

@@ -0,0 +1,66 @@
+import axios from 'axios'
+import { Message, MessageBox } from 'element-ui'
+
+// create an axios instance
+const service = axios.create({
+  baseURL: 'http://192.168.100.208:9083/', // api的base_url
+  timeout: 10000 // request timeout
+})
+
+// request interceptor
+service.interceptors.request.use(config => {
+  // Do something before request is sent
+  return config
+}, error => {
+  // Do something with request error
+  console.log(error) // for debug
+  Promise.reject(error)
+})
+
+// respone interceptor
+service.interceptors.response.use(
+  response => {
+    const res = response.data
+    let errmsg = res.errmsg;
+    if (res.errno !== 0) {
+      if(res.errno==303){
+        MessageBox.alert('没有权限登录系统,请输入重新登录', '已退出', {
+          confirmButtonText: '重新登录',
+          type: 'error'
+        }).then(() => {
+        
+            location.reload()
+         
+        })
+      }else if(errmsg !="" && errmsg !=null && res.errno != 401){//401是未登录
+        MessageBox.alert(errmsg,errmsg, {
+          confirmButtonText: '确定',
+          type: 'warning'
+        }).then(() => {
+
+        })
+      }else{
+        MessageBox.alert('超时自动退出系统,请重新登录', '已退出', {
+          confirmButtonText: '重新登录',
+          type: 'error'
+        }).then(() => {
+          
+            location.reload()
+         
+        })
+      }
+      return Promise.reject('error')
+    } else {
+      return response
+    }
+  }, error => {
+    console.log('err' + error)// for debug
+    Message({
+      message: '登录连接超时(后台不能连接,请联系系统管理员)',
+      type: 'error',
+      duration: 5 * 1000
+    })
+    return Promise.reject(error)
+  })
+
+export default service

+ 38 - 0
src/utils/validate.js

@@ -0,0 +1,38 @@
+/**
+ * Created by jiachenpan on 16/11/18.
+ */
+
+/* 合法uri*/
+export function validateURL(textval) {
+  const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
+  return urlregex.test(textval)
+}
+
+/* 小写字母*/
+export function validateLowerCase(str) {
+  const reg = /^[a-z]+$/
+  return reg.test(str)
+}
+
+/* 大写字母*/
+export function validateUpperCase(str) {
+  const reg = /^[A-Z]+$/
+  return reg.test(str)
+}
+
+/* 大小写字母*/
+export function validatAlphabets(str) {
+  const reg = /^[A-Za-z]+$/
+  return reg.test(str)
+}
+
+/**
+ * validate email
+ * @param email
+ * @returns {boolean}
+ */
+export function validateEmail(email) {
+  const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
+  return re.test(email)
+}
+

+ 13 - 0
src/views/HomeView/PointsMall.vue

@@ -55,6 +55,7 @@
     </div>
 </template>
 <script>
+  import { list } from "@/api/allApi";
   export default {
     data() {
       return {
@@ -96,7 +97,19 @@
         ]        
       };
     },
+    created() {
+        this.getList()
+    },
     methods: {
+      getList() {
+        list(this.listQuery).then(response => {
+            console.log(response.data.data);
+            // this.goodsList = response.data.data
+        }).catch(() => {
+            this.goodsList = []
+        })
+      },
+
       handleClick(tab, event) {
         console.log(tab, event);
       },

+ 20 - 2
yarn.lock

@@ -1914,6 +1914,14 @@ autoprefixer@^10.2.4:
     picocolors "^1.0.0"
     postcss-value-parser "^4.2.0"
 
+axios@0.17.1:
+  version "0.17.1"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-0.17.1.tgz#2d8e3e5d0bdbd7327f91bc814f5c57660f81824d"
+  integrity sha512-mZzWRyJeJ0rtK7e1/6iYBUzmeXjzei+1h1IvbedyU0sB52++tU5AU6r6TLXpwNVR0ebXIpvTVW+9CpWNyc1n8w==
+  dependencies:
+    follow-redirects "^1.2.5"
+    is-buffer "^1.1.5"
+
 babel-helper-vue-jsx-merge-props@^2.0.0:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6"
@@ -3217,9 +3225,9 @@ flatted@^3.1.0:
   resolved "https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
   integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
 
-follow-redirects@^1.0.0:
+follow-redirects@^1.0.0, follow-redirects@^1.2.5:
   version "1.15.2"
-  resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
   integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
 
 forwarded@0.2.0:
@@ -3629,6 +3637,11 @@ is-binary-path@~2.1.0:
   dependencies:
     binary-extensions "^2.0.0"
 
+is-buffer@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+  integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
 is-ci@^1.0.10:
   version "1.2.1"
   resolved "https://registry.npmmirror.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
@@ -5804,6 +5817,11 @@ vue@^2.6.14:
     "@vue/compiler-sfc" "2.7.14"
     csstype "^3.1.0"
 
+vuex@3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.0.1.tgz#e761352ebe0af537d4bb755a9b9dc4be3df7efd2"
+  integrity sha512-wLoqz0B7DSZtgbWL1ShIBBCjv22GV5U+vcBFox658g6V0s4wZV9P4YjCNyoHSyIBpj1f29JBoNQIqD82cR4O3w==
+
 watchpack@^2.4.0:
   version "2.4.0"
   resolved "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d"