yumeng 1 年之前
父节点
当前提交
bb2b2db8ef
共有 100 个文件被更改,包括 4367 次插入0 次删除
  1. 95 0
      out/production/adsp-vue/App.vue
  2. 30 0
      out/production/adsp-vue/api/GroupRequest.js
  3. 201 0
      out/production/adsp-vue/api/actor.js
  4. 162 0
      out/production/adsp-vue/api/api.js
  5. 29 0
      out/production/adsp-vue/api/appium.js
  6. 10 0
      out/production/adsp-vue/api/index.js
  7. 72 0
      out/production/adsp-vue/api/login.js
  8. 246 0
      out/production/adsp-vue/api/manage.js
  9. 117 0
      out/production/adsp-vue/api/music.js
  10. 102 0
      out/production/adsp-vue/api/statistics.js
  11. 132 0
      out/production/adsp-vue/api/video.js
  12. 57 0
      out/production/adsp-vue/api/yard.js
  13. 121 0
      out/production/adsp-vue/assets/background.svg
  14. 二进制
      out/production/adsp-vue/assets/background/bg-1.jpg
  15. 二进制
      out/production/adsp-vue/assets/background/bg-2.jpg
  16. 二进制
      out/production/adsp-vue/assets/checkcode.png
  17. 二进制
      out/production/adsp-vue/assets/daiban.png
  18. 二进制
      out/production/adsp-vue/assets/down.png
  19. 二进制
      out/production/adsp-vue/assets/duban.png
  20. 二进制
      out/production/adsp-vue/assets/feishu.png
  21. 二进制
      out/production/adsp-vue/assets/feishuGray.png
  22. 二进制
      out/production/adsp-vue/assets/greendown.png
  23. 二进制
      out/production/adsp-vue/assets/guaz.png
  24. 二进制
      out/production/adsp-vue/assets/img/album_cover_player.png
  25. 二进制
      out/production/adsp-vue/assets/img/default.png
  26. 二进制
      out/production/adsp-vue/assets/img/head_bg.png
  27. 二进制
      out/production/adsp-vue/assets/img/huichuanglogo.png
  28. 二进制
      out/production/adsp-vue/assets/img/img-1.jpg
  29. 二进制
      out/production/adsp-vue/assets/img/img-2.jpg
  30. 二进制
      out/production/adsp-vue/assets/img/img-3.jpg
  31. 二进制
      out/production/adsp-vue/assets/img/img-4.jpg
  32. 二进制
      out/production/adsp-vue/assets/img/img-l-1.jpg
  33. 二进制
      out/production/adsp-vue/assets/img/img-l-2.jpg
  34. 二进制
      out/production/adsp-vue/assets/img/login-bg.jpg
  35. 二进制
      out/production/adsp-vue/assets/img/logo.png
  36. 二进制
      out/production/adsp-vue/assets/img/logo_vmeditor.png
  37. 二进制
      out/production/adsp-vue/assets/img/noImg.png
  38. 二进制
      out/production/adsp-vue/assets/img/photo.jpg
  39. 二进制
      out/production/adsp-vue/assets/img/player_cover.png
  40. 二进制
      out/production/adsp-vue/assets/img/spLbLAbh.jpg
  41. 二进制
      out/production/adsp-vue/assets/img/test.jpg
  42. 6 0
      out/production/adsp-vue/assets/img/u2.svg
  43. 6 0
      out/production/adsp-vue/assets/img/u3.svg
  44. 6 0
      out/production/adsp-vue/assets/img/u4.svg
  45. 二进制
      out/production/adsp-vue/assets/img/wangge2.png
  46. 二进制
      out/production/adsp-vue/assets/img/wave.gif
  47. 280 0
      out/production/adsp-vue/assets/jwps.es6.js
  48. 259 0
      out/production/adsp-vue/assets/less/JAreaLinkage.less
  49. 15 0
      out/production/adsp-vue/assets/less/TableExpand.less
  50. 59 0
      out/production/adsp-vue/assets/less/common.less
  51. 34 0
      out/production/adsp-vue/assets/less/index.less
  52. 二进制
      out/production/adsp-vue/assets/logo-white.png
  53. 二进制
      out/production/adsp-vue/assets/logo.png
  54. 174 0
      out/production/adsp-vue/assets/logo.svg
  55. 二进制
      out/production/adsp-vue/assets/logo1.png
  56. 二进制
      out/production/adsp-vue/assets/logoNew.png
  57. 二进制
      out/production/adsp-vue/assets/logoNew1.png
  58. 二进制
      out/production/adsp-vue/assets/noImg.png
  59. 二进制
      out/production/adsp-vue/assets/nodata.png
  60. 二进制
      out/production/adsp-vue/assets/orderIcon.png
  61. 二进制
      out/production/adsp-vue/assets/pdf4.jpg
  62. 二进制
      out/production/adsp-vue/assets/success.png
  63. 二进制
      out/production/adsp-vue/assets/touxiang.png
  64. 二进制
      out/production/adsp-vue/assets/up.png
  65. 二进制
      out/production/adsp-vue/assets/upred.png
  66. 二进制
      out/production/adsp-vue/assets/work.png
  67. 二进制
      out/production/adsp-vue/assets/zaiban.png
  68. 230 0
      out/production/adsp-vue/base/mm-dialog/mm-dialog.vue
  69. 53 0
      out/production/adsp-vue/base/mm-icon/mm-icon.vue
  70. 86 0
      out/production/adsp-vue/base/mm-loading/mm-loading.vue
  71. 34 0
      out/production/adsp-vue/base/mm-no-result/mm-no-result.vue
  72. 178 0
      out/production/adsp-vue/base/mm-progress/mm-progress.vue
  73. 39 0
      out/production/adsp-vue/base/mm-toast/index.js
  74. 73 0
      out/production/adsp-vue/base/mm-toast/mm-toast.vue
  75. 73 0
      out/production/adsp-vue/cas/sso.js
  76. 46 0
      out/production/adsp-vue/components/AvatarList/Item.vue
  77. 100 0
      out/production/adsp-vue/components/AvatarList/List.vue
  78. 4 0
      out/production/adsp-vue/components/AvatarList/index.js
  79. 60 0
      out/production/adsp-vue/components/AvatarList/index.less
  80. 146 0
      out/production/adsp-vue/components/ChartCard.vue
  81. 103 0
      out/production/adsp-vue/components/CountDown/CountDown.vue
  82. 3 0
      out/production/adsp-vue/components/CountDown/index.js
  83. 215 0
      out/production/adsp-vue/components/DatePicker.vue
  84. 71 0
      out/production/adsp-vue/components/Ellipsis/Ellipsis.vue
  85. 3 0
      out/production/adsp-vue/components/Ellipsis/index.js
  86. 54 0
      out/production/adsp-vue/components/NumberInfo/NumberInfo.vue
  87. 3 0
      out/production/adsp-vue/components/NumberInfo/index.js
  88. 58 0
      out/production/adsp-vue/components/NumberInfo/index.less
  89. 43 0
      out/production/adsp-vue/components/README.md
  90. 41 0
      out/production/adsp-vue/components/Trend/Trend.vue
  91. 3 0
      out/production/adsp-vue/components/Trend/index.js
  92. 44 0
      out/production/adsp-vue/components/Trend/index.less
  93. 79 0
      out/production/adsp-vue/components/_util/Area.js
  94. 35 0
      out/production/adsp-vue/components/_util/StringUtil.js
  95. 12 0
      out/production/adsp-vue/components/_util/util.js
  96. 36 0
      out/production/adsp-vue/components/bigImg.vue
  97. 35 0
      out/production/adsp-vue/components/bpm/DynamicComponent.vue
  98. 73 0
      out/production/adsp-vue/components/bpm/FormCommonModal.vue
  99. 121 0
      out/production/adsp-vue/components/bpm/ProcNodeInfoModel.vue
  100. 0 0
      out/production/adsp-vue/components/bpm/ProcessInstPicModal.vue

+ 95 - 0
out/production/adsp-vue/App.vue

@@ -0,0 +1,95 @@
+<template>
+  <a-locale-provider :locale="locale">
+    <div id="app">
+      <router-view v-if="isRouterAlive"/>
+      <audio ref="mmPlayer"></audio>
+    </div>
+  </a-locale-provider>
+</template>
+<script>
+import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN'
+import enquireScreen from '@/utils/device'
+import { mapGetters, mapMutations, mapActions } from 'vuex'
+
+export default {
+  provide(){
+    return {
+      reload:this.reload
+    }
+  },
+  data() {
+    return {
+      locale: zhCN,
+      isRouterAlive:true
+    }
+  },
+  created() {
+    let that = this
+    enquireScreen((deviceType) => {
+      // tablet
+      if (deviceType === 0) {
+        that.$store.commit('TOGGLE_DEVICE', 'mobile')
+        that.$store.dispatch('setSidebar', true)
+      }
+      // mobile
+      else if (deviceType === 1) {
+        that.$store.commit('TOGGLE_DEVICE', 'mobile')
+        that.$store.dispatch('setSidebar', false)
+      } else {
+        that.$store.commit('TOGGLE_DEVICE', 'desktop')
+        that.$store.dispatch('setSidebar', true)
+      }
+    })
+
+    this.$nextTick(() => {
+      this.setAudioele(this.$refs.mmPlayer)
+
+    })
+  },
+  methods: {
+    ...mapMutations({
+      setPlaying: 'SET_PLAYING',
+      setPlay: 'SET_PLAYLIST',
+      setCurrentIndex: 'SET_CURRENTINDEX',
+      setAudioele: 'SET_AUDIOELE',
+    }),
+    ...mapGetters(['userInfo']),
+    reload(){
+      this.isRouterAlive = false
+      this.$nextTick(()=>{
+        this.isRouterAlive = true
+      })
+    }
+  },
+}
+</script>
+<style>
+#app {
+  height: 100%;
+  min-width: 1280px;
+}
+
+body {
+  -webkit-user-select: text !important;
+}
+
+* {
+  -webkit-user-select: text !important;
+  -moz-user-select: text !important;
+  -ms-user-select: text !important;
+  user-select: text !important;
+}
+
+.ant-tabs.ant-tabs-card .ant-tabs-card-bar .ant-tabs-tab {
+  height: 39px !important;
+}
+
+.ant-tabs.ant-tabs-card .ant-tabs-card-bar .ant-tabs-tab-active {
+  height: 39px !important;
+  border-bottom: 1px solid #1890ff !important;
+}
+.layout .header {
+  background-color: #0b2040 !important;
+  background: #0b2040 !important;
+}
+</style>

+ 30 - 0
out/production/adsp-vue/api/GroupRequest.js

@@ -0,0 +1,30 @@
+import Vue from 'vue'
+
+/**
+ * 将一个请求分组
+ *
+ * @param getPromise 传入一个可以获取到Promise对象的方法
+ * @param groupId 分组ID,如果不传或者为空则不分组
+ * @param expire 过期时间,默认 半分钟
+ */
+export function httpGroupRequest(getPromise, groupId, expire = 1000 * 30) {
+  if (groupId == null || groupId === '') {
+    console.log("--------popup----------getFrom  DB-------with---no--groupId ")
+    return getPromise()
+  }
+
+  if (Vue.ls.get(groupId)) {
+    console.log("---------popup--------getFrom  Cache--------groupId = " + groupId)
+    return Promise.resolve(Vue.ls.get(groupId));
+  } else {
+    console.log("--------popup----------getFrom  DB---------groupId = " + groupId)
+  }
+
+  // 还没有发出请求,就发出第一次的请求
+  return getPromise().then(res => {
+    Vue.ls.set(groupId, res, expire);
+    return Promise.resolve(res);
+  })
+}
+
+

+ 201 - 0
out/production/adsp-vue/api/actor.js

@@ -0,0 +1,201 @@
+
+import {axios} from '@/utils/request'
+
+export function actorList(parameter) {
+    return axios({
+      url: "/ctop/actor/list",
+      method: 'get',
+      params: parameter
+    })
+}export function getCityList(parameter) {
+    return axios({
+      url: "/ctop/actor/getCityList",
+      method: 'get',
+      params: parameter
+    })
+}
+
+export function propList(parameter) {
+    return axios({
+      url: "/ctop/prop/list",
+      method: 'get',
+      params: parameter
+    })
+}
+
+export function actorPhotoList(parameter) {
+    return axios({
+      url: "/ctop/actor/photo/list",
+      method: 'get',
+      params: parameter
+    })
+}
+
+export function actorPhotoDelete(parameter) {
+    return axios({
+      url: "/ctop/actor/photo/delete",
+      method: 'delete',
+      params: parameter
+    })
+}
+export function actorListDelete(parameter) {
+    return axios({
+      url: "/ctop/actor/delete",
+      method: 'delete',
+      params: parameter
+    })
+}
+export function propListDelete(parameter) {
+    return axios({
+      url: "/ctop/prop/delete",
+      method: 'delete',
+      params: parameter
+    })
+}
+
+export function actorPhotoAdd(parameter) {
+    return axios({
+      url: "/ctop/actor/photo/add",
+      method: 'post',
+      params: parameter
+    })
+}
+
+export function actorVideoDelete(parameter) {
+    return axios({
+      url: "/ctop/actor/video/delete",
+      method: 'delete',
+      params: parameter
+    })
+}
+
+export function actorVideoAdd(parameter) {
+    return axios({
+      url: "/ctop/actor/video/add",
+      method: 'post',
+      params: parameter
+    })
+}
+
+export function actorDetail(parameter) {
+    return axios({
+        url: "/ctop/actor/detail",
+        method: 'get',
+        params: parameter
+    })
+}
+export function propDetail(parameter) {
+    return axios({
+        url: "/ctop/prop/detail",
+        method: 'get',
+        params: parameter
+    })
+}
+
+
+export function actorCommentList(parameter) {
+    return axios({
+        url: "/ctop/actor/comment/list",
+        method: 'get',
+        params: parameter
+    })
+}
+
+export function actorCommentAdd(parameter) {
+    return axios({
+        url: "/ctop/actor/comment/add",
+        method: 'post',
+        params: parameter
+    })
+}
+
+export function actorCommentDetele(parameter) {
+    return axios({
+        url: "/ctop/actor/comment/delete",
+        method: 'delete',
+        params: parameter
+    })
+}
+
+
+export function actorVideoList(parameter) {
+    return axios({
+        url: "/ctop/actor/video/list",
+        method: 'get',
+        params: parameter
+    })
+}
+
+
+export function fileCheck(parameter) {
+    return axios({
+        url: "/file/check",
+        method: 'get',
+        params: parameter
+    })
+}
+
+
+export function fileCheckImage(parameter) {
+    return axios({
+        url: "/file/imageCheck",
+        method: 'get',
+        params: parameter
+    })
+}
+
+export function fileInsert(parameter) {
+    return axios({
+        url: "/file/insert",
+        method: 'post',
+        data: parameter
+    })
+}
+
+export function fileInsertV2(parameter) {
+    return axios({
+        url: "/insertV2",
+        method: 'post',
+        data: parameter
+    })
+}
+export function orderFileInsert(parameter) {
+    return axios({
+        url: "/platform/file/uploadVideo",
+        method: 'post',
+        data: parameter
+    })
+}
+
+
+export function fileEdit(parameter) {
+    return axios({
+        url: "/ctop/materialInfo/edit",
+        method: 'put',
+        data: parameter
+    })
+}
+
+export function fileEditUpdate(parameter) {
+    return axios({
+        url: "/ctop/materialInfo/bytedance/edit",
+        method: 'put',
+        data: parameter
+    })
+}
+
+export function fileEditUpdateBatch(parameter) {
+    return axios({
+        url: "/ctop/materialInfo/bytedance/batchedit",
+        method: 'put',
+        data: parameter
+    })
+}
+
+export function fileEditAll(parameter) {
+    return axios({
+        url: "/ctop/materialAscription/update",
+        method: 'put',
+        data: parameter
+    })
+}

+ 162 - 0
out/production/adsp-vue/api/api.js

@@ -0,0 +1,162 @@
+import { getAction, deleteAction, putAction, postAction, httpAction } from '@/api/manage'
+import Vue from 'vue'
+import {UI_CACHE_DB_DICT_DATA } from "@/store/mutation-types"
+
+
+//角色管理
+const addRole = (params)=>postAction("/sys/role/add",params);
+const editRole = (params)=>putAction("/sys/role/edit",params);
+const checkRoleCode = (params)=>getAction("/sys/role/checkRoleCode",params);
+const queryall = (params)=>getAction("/sys/role/queryall",params);
+
+//用户管理
+const addUser = (params)=>postAction("/sys/user/add",params);
+const editUser = (params)=>putAction("/sys/user/edit",params);
+const queryUserRole = (params)=>getAction("/sys/user/queryUserRole",params);
+const getUserList = (params)=>getAction("/sys/user/list",params);
+const frozenBatch = (params)=>putAction("/sys/user/frozenBatch",params);
+//验证用户是否存在
+const checkOnlyUser = (params)=>getAction("/sys/user/checkOnlyUser",params);
+// 查询用户角色表里的所有信息
+const queryUserRoleMap = (params) => getAction("/sys/user/queryUserRoleMap", params);
+//改变密码
+const changePassword = (params)=>putAction("/sys/user/changePassword",params);
+
+//行业管理
+const getIndustryList = (params) => getAction("/industry/industry/list", params);
+const getIndustryTreeList = (params) => getAction("/industry/industry/queryTreeList", params);
+
+//权限管理
+const addPermission= (params)=>postAction("/sys/permission/add",params);
+const editPermission= (params)=>putAction("/sys/permission/edit",params);
+const getPermissionList = (params)=>getAction("/sys/permission/list",params);
+const getSystemMenuList = (params)=>getAction("/sys/permission/getSystemMenuList",params);
+const getSystemSubmenu = (params)=>getAction("/sys/permission/getSystemSubmenu",params);
+const getSystemSubmenuBatch = (params) => getAction('/sys/permission/getSystemSubmenuBatch', params)
+
+const queryTreeList = (params)=>getAction("/sys/permission/queryTreeList",params);
+const queryTreeListForRole = (params)=>getAction("/sys/role/queryTreeList",params);
+const queryListAsync = (params)=>getAction("/sys/permission/queryListAsync",params);
+const queryRolePermission = (params)=>getAction("/sys/permission/queryRolePermission",params);
+const saveRolePermission = (params)=>postAction("/sys/permission/saveRolePermission",params);
+const queryPermissionsByUser = (params)=>getAction("/sys/permission/getUserPermissionByToken",params);
+const loadAllRoleIds = (params)=>getAction("/sys/permission/loadAllRoleIds",params);
+const getPermissionRuleList = (params)=>getAction("/sys/permission/getPermRuleListByPermId",params);
+const queryPermissionRule = (params)=>getAction("/sys/permission/queryPermissionRule",params);
+
+// 部门管理
+const queryDepartTreeList = (params)=>getAction("/sys/sysDepart/queryTreeList",params);
+const queryIdTree = (params)=>getAction("/sys/sysDepart/queryIdTree",params);
+const queryParentName   = (params)=>getAction("/sys/sysDepart/queryParentName",params);
+const searchByKeywords   = (params)=>getAction("/sys/sysDepart/searchBy",params);
+const deleteByDepartId   = (params)=>deleteAction("/sys/sysDepart/delete",params);
+
+//二级部门管理
+const queryDepartPermission = (params)=>getAction("/sys/permission/queryDepartPermission",params);
+const saveDepartPermission = (params)=>postAction("/sys/permission/saveDepartPermission",params);
+const queryTreeListForDeptRole = (params)=>getAction("/sys/sysDepartPermission/queryTreeListForDeptRole",params);
+const queryDeptRolePermission = (params)=>getAction("/sys/sysDepartPermission/queryDeptRolePermission",params);
+const saveDeptRolePermission = (params)=>postAction("/sys/sysDepartPermission/saveDeptRolePermission",params);
+const queryMyDepartTreeList = (params)=>getAction("/sys/sysDepart/queryMyDeptTreeList",params);
+
+//日志管理
+const deleteLog = (params)=>deleteAction("/sys/log/delete",params);
+const deleteLogList = (params)=>deleteAction("/sys/log/deleteBatch",params);
+
+//数据字典
+const addDict = (params)=>postAction("/sys/dict/add",params);
+const editDict = (params)=>putAction("/sys/dict/edit",params);
+const treeList = (params)=>getAction("/sys/dict/treeList",params);
+const addDictItem = (params)=>postAction("/sys/dictItem/add",params);
+const editDictItem = (params)=>putAction("/sys/dictItem/edit",params);
+
+//字典标签专用(通过code获取字典数组)
+export const ajaxGetDictItems = (code, params)=>getAction(`/sys/dict/getDictItems/${code}`,params);
+//从缓存中获取字典配置
+function getDictItemsFromCache(dictCode) {
+  if (Vue.ls.get(UI_CACHE_DB_DICT_DATA) && Vue.ls.get(UI_CACHE_DB_DICT_DATA)[dictCode]) {
+    let dictItems = Vue.ls.get(UI_CACHE_DB_DICT_DATA)[dictCode];
+    // console.log("-----------getDictItemsFromCache----------dictCode="+dictCode+"---- dictItems=",dictItems)
+    return dictItems;
+  }
+}
+
+//系统通告
+const doReleaseData = (params)=>getAction("/sys/annountCement/doReleaseData",params);
+const doReovkeData = (params)=>getAction("/sys/annountCement/doReovkeData",params);
+//获取系统访问量
+const getLoginfo = (params)=>getAction("/sys/loginfo",params);
+const getVisitInfo = (params)=>getAction("/sys/visitInfo",params);
+
+// 根据部门主键查询用户信息
+const queryUserByDepId = (params)=>getAction("/sys/user/queryUserByDepId",params);
+// 重复校验
+const duplicateCheck = (params)=>getAction("/sys/duplicate/check",params);
+// 加载分类字典
+const loadCategoryData = (params)=>getAction("/sys/category/loadAllData",params);
+const checkRuleByCode = (params) => getAction('/sys/checkRule/checkByCode', params)
+//我的通告
+const getUserNoticeInfo= (params)=>getAction("/sys/sysAnnouncementSend/getMyAnnouncementSend",params);
+
+export {
+  addRole,
+  editRole,
+  checkRoleCode,
+  addUser,
+  editUser,
+  queryUserRole,
+  getUserList,
+  queryall,
+  frozenBatch,
+  checkOnlyUser,
+  changePassword,
+  getPermissionList,
+  addPermission,
+  editPermission,
+  queryTreeList,
+  queryListAsync,
+  queryRolePermission,
+  saveRolePermission,
+  queryPermissionsByUser,
+  loadAllRoleIds,
+  getPermissionRuleList,
+  queryPermissionRule,
+  queryDepartTreeList,
+  queryIdTree,
+  queryParentName,
+  searchByKeywords,
+  deleteByDepartId,
+  deleteLog,
+  deleteLogList,
+  addDict,
+  editDict,
+  treeList,
+  addDictItem,
+  editDictItem,
+  doReleaseData,
+  doReovkeData,
+  getLoginfo,
+  getVisitInfo,
+  queryUserByDepId,
+  duplicateCheck,
+  queryTreeListForRole,
+  getSystemMenuList,
+  getSystemSubmenu,
+  getSystemSubmenuBatch,
+  loadCategoryData,
+  checkRuleByCode,
+  getIndustryList,
+  getIndustryTreeList,
+  queryDepartPermission,
+  saveDepartPermission,
+  queryTreeListForDeptRole,
+  queryDeptRolePermission,
+  saveDeptRolePermission,
+  queryMyDepartTreeList,
+  getUserNoticeInfo,
+  queryUserRoleMap,
+  getDictItemsFromCache
+}
+
+
+

+ 29 - 0
out/production/adsp-vue/api/appium.js

@@ -0,0 +1,29 @@
+import {axios} from '@/utils/request'
+
+// 群控管理,任务列表
+export function appiumTaskList(parameter) {
+    return axios({
+      url: "/appium/appiumTask/list",
+      method: 'get',
+      data: parameter
+    })
+}
+
+// 群控管理,任务项列表
+export function appiumTaskItemList(parameter) {
+    return axios({
+      url: "/appium/appiumTaskItem/list",
+      method: 'get',
+      data: parameter
+    })
+}
+
+// http://127.0.0.1:8080/jeecg-boot/appium/appiumTask/run?taskId=1&deviceId=2
+// 群控管理,任务列表,开始任务
+export function appiumTaskRun(parameter) {
+    return axios({
+      url: "/appium/appiumTask/run",
+      method: 'get',
+      params: parameter
+    })
+}

+ 10 - 0
out/production/adsp-vue/api/index.js

@@ -0,0 +1,10 @@
+const api = {
+  Login: '/sys/login',
+  Logout: '/sys/logout',
+  ForgePassword: '/auth/forge-password',
+  Register: '/auth/register',
+  SendSms: '/account/sms',
+  // get my info
+  UserInfo: '/user/info'
+}
+export default api

+ 72 - 0
out/production/adsp-vue/api/login.js

@@ -0,0 +1,72 @@
+import api from './index'
+import {axios} from '@/utils/request'
+
+/**
+ * login func
+ * parameter: {
+ *     username: '',
+ *     password: '',
+ *     remember_me: true,
+ *     captcha: '12345'
+ * }
+ * @param parameter
+ * @returns {*}
+ */
+export function login(parameter) {
+  return axios({
+    url: '/sys/login',
+    method: 'post',
+    data: parameter
+  })
+}
+
+export function phoneLogin(parameter) {
+  return axios({
+    url: '/sys/phoneLogin',
+    method: 'post',
+    data: parameter
+  })
+}
+
+export function getSmsCaptcha(parameter) {
+  return axios({
+    url: api.SendSms,
+    method: 'post',
+    data: parameter
+  })
+}
+
+export function getInfo() {
+  return axios({
+    url: '/api/user/info',
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    }
+  })
+}
+
+export function logout(logoutToken) {
+  return axios({
+    url: '/sys/logout',
+    method: 'post',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8',
+      'X-Access-Token': logoutToken
+    }
+  })
+}
+/**
+ * 第三方登录
+ * @param token
+ * @returns {*}
+ */
+export function thirdLogin(token) {
+  return axios({
+    url: `/thirdLogin/getLoginUser/${token}`,
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    }
+  })
+}

+ 246 - 0
out/production/adsp-vue/api/manage.js

@@ -0,0 +1,246 @@
+import Vue from 'vue'
+import { axios } from '@/utils/request'
+
+const api = {
+  user: '/api/user',
+  role: '/api/role',
+  service: '/api/service',
+  permission: '/api/permission',
+  permissionNoPager: '/api/permission/no-pager'
+}
+
+export default api
+export function postNoCacheAction(url, parameter) {
+  return axios({
+    url: url,
+    method: 'post',
+    data: parameter,
+    headers: {
+      'Cache-Control': 'no-cache'
+    }
+  })
+}
+// post---文件
+export function postFileAction(url, parameter) {
+  return axios({
+    headers: {
+      'Content-Type': 'multipart/form-data'
+    },
+    url: url,
+    method: 'post',
+    data: parameter
+  })
+}
+//post
+export function postAction(url, parameter) {
+  return axios({
+    url: url,
+    method: 'post',
+    data: parameter,
+
+  })
+
+}
+
+export function getAction(url, parameter) {
+  return axios({
+    url: url,
+    method: 'get',
+    params: parameter
+  })
+}
+export function postFormAction(url, parameter) {
+  return axios({
+    url: url,
+    method: 'post',
+    params: parameter
+  })
+}
+//deleteAction
+export function deleteAction(url, parameter) {
+  return axios({
+    url: url,
+    method: 'delete',
+    params: parameter
+  })
+}
+//post method= {post | put}
+export function httpAction(url, parameter, method) {
+  return axios({
+    url: url,
+    method: method,
+    data: parameter
+  })
+}
+
+export function getUserList(parameter) {
+  return axios({
+    url: api.user,
+    method: 'get',
+    params: parameter
+  })
+}
+
+export function getRoleList(parameter) {
+  return axios({
+    url: api.role,
+    method: 'get',
+    params: parameter
+  })
+}
+
+export function getPermissions(parameter) {
+  return axios({
+    url: api.permissionNoPager,
+    method: 'get',
+    params: parameter
+  })
+}
+
+// id == 0 add     post
+// id != 0 update  put
+export function saveService(parameter) {
+  return axios({
+    url: api.service,
+    method: parameter.id == 0 ? 'post' : 'put',
+    data: parameter
+  })
+}
+
+//put
+export function putAction(url, parameter) {
+  return axios({
+    url: url,
+    method: 'put',
+    data: parameter
+  })
+}
+
+/**
+ * 下载文件 用于excel导出
+ * @param url
+ * @param parameter
+ * @returns {*}
+ */
+export function downFilePost(url, parameter, type) {
+  return axios({
+    url: url,
+    data: parameter,
+    method: type || 'post',
+    responseType: 'blob'
+  })
+}
+
+
+export function getServiceList(parameter) {
+  return axios({
+    url: api.service,
+    method: 'get',
+    params: parameter
+  })
+}
+
+/**
+ * 下载文件 用于excel导出
+ * @param url
+ * @param parameter
+ * @returns {*}
+ */
+export function downFile(url, parameter) {
+  return axios({
+    url: url,
+    params: parameter,
+    method: 'get',
+    responseType: 'blob',
+    timeout: 12000000, // 请求超时时间
+  })
+}
+export function getProvince(url, parameter) {
+  return axios({
+    url: url,
+    method: 'get',
+    params: parameter
+  })
+}
+
+export function getPackage(parameter) {
+  return axios({
+    url: "/template/creative/words/get",
+    method: 'get',
+    params: parameter
+  })
+}
+
+
+/**
+ * 下载文件
+ * @param url 文件路径
+ * @param fileName 文件名
+ * @param parameter
+ * @returns {*}
+ */
+export function downloadFile(url, fileName, parameter) {
+  return downFile(url, parameter).then((data) => {
+    if (!data || data.size === 0) {
+      Vue.prototype['$message'].warning('文件下载失败')
+      return
+    }
+    if (typeof window.navigator.msSaveBlob !== 'undefined') {
+      window.navigator.msSaveBlob(new Blob([data]), fileName)
+    } else {
+      let url = window.URL.createObjectURL(new Blob([data]))
+      let link = document.createElement('a')
+      link.style.display = 'none'
+      link.href = url
+      link.setAttribute('download', fileName)
+      document.body.appendChild(link)
+      link.click()
+      document.body.removeChild(link) //下载完成移除元素
+      window.URL.revokeObjectURL(url) //释放掉blob对象
+    }
+  })
+}
+
+/**
+ * 文件上传 用于富文本上传图片
+ * @param url
+ * @param parameter
+ * @returns {*}
+ */
+export function uploadAction(url, parameter) {
+  return axios({
+    url: url,
+    data: parameter,
+    method: 'post',
+    headers: {
+      'Content-Type': 'multipart/form-data',  // 文件上传
+    },
+  })
+}
+
+/**
+ * 获取文件服务访问路径
+ * @param avatar
+ * @param subStr
+ * @returns {*}
+ */
+export function getFileAccessHttpUrl(avatar, subStr) {
+  if (!subStr) subStr = 'http'
+  if (avatar && avatar.startsWith(subStr)) {
+    return avatar;
+  } else {
+    if (avatar && avatar.length > 0 && avatar.indexOf('[') == -1) {
+      return window._CONFIG['staticDomainURL'] + "/" + avatar;
+    }
+  }
+}
+export function postFile(URL, parameter) {
+  return axios({
+    url: URL,
+    method: 'post',
+    // headers: {
+    //     'Content-Type': 'multipart/form-data;charset=utf-8',
+    // },
+    data: parameter
+  })
+}

+ 117 - 0
out/production/adsp-vue/api/music.js

@@ -0,0 +1,117 @@
+import axios from '@/utils/axiosMusic'
+import { defaultLimit } from '@/config'
+import { formatTopSongs } from '@/utils/song'
+
+axios.defaults.baseURL = process.env.VUE_APP_BASE_API_URL
+
+// 排行榜列表
+export function getToplistDetail() {
+  return axios.get('/toplist/detail')
+}
+
+// 推荐歌单
+export function getPersonalized() {
+  return axios.get('/personalized')
+}
+
+// 歌单详情
+export function getPlaylistDetail(id) {
+  return new Promise((resolve, reject) => {
+    axios
+      .get('/playlist/detail', {
+        params: { id }
+      })
+      .then(({ playlist }) => playlist)
+      .then(playlist => {
+        const { trackIds, tracks } = playlist
+        // 过滤完整歌单 如排行榜
+        if (tracks.length === trackIds.length) {
+          playlist.tracks = formatTopSongs(playlist.tracks)
+          resolve(playlist)
+          return
+        }
+        // 限制歌单详情最大 500
+        const ids = trackIds
+          .slice(0, 500)
+          .map(v => v.id)
+          .toString()
+        getMusicDetail(ids).then(({ songs }) => {
+          playlist.tracks = formatTopSongs(songs)
+          resolve(playlist)
+        })
+      })
+  })
+}
+
+// 搜索
+export function search(keywords, page = 0, limit = defaultLimit) {
+  return axios.get('/search', {
+    params: {
+      offset: page * limit,
+      limit: limit,
+      keywords
+    }
+  })
+}
+
+// 热搜
+export function searchHot() {
+  return axios.get('/search/hot')
+}
+
+// 获取用户歌单详情
+export function getUserPlaylist(uid) {
+  return axios.get('/user/playlist', {
+    params: {
+      uid
+    }
+  })
+}
+
+// 获取歌曲详情
+export function getMusicDetail(ids) {
+  return axios.get('/song/detail', {
+    params: {
+      ids
+    }
+  })
+}
+
+// 获取音乐是否可以用
+export function getCheckMusic(id) {
+  return axios.get('/check/music', {
+    params: {
+      id
+    }
+  })
+}
+
+// 获取音乐地址
+export function getMusicUrl(id) {
+  return axios.get('/song/url', {
+    params: {
+      id
+    }
+  })
+}
+
+// 获取歌词
+export function getLyric(id) {
+  const url = '/lyric'
+  return axios.get(url, {
+    params: {
+      id
+    }
+  })
+}
+
+// 获取音乐评论
+export function getComment(id, page, limit = defaultLimit) {
+  return axios.get('/comment/music', {
+    params: {
+      offset: page * limit,
+      limit: limit,
+      id
+    }
+  })
+}

+ 102 - 0
out/production/adsp-vue/api/statistics.js

@@ -0,0 +1,102 @@
+
+import {axios} from '@/utils/request'
+
+// 获取所有账户
+export function getAdvertiserList() {
+    return axios({
+      url: "/ctop/accountReport/getAdvertiserList",
+      method: 'post',
+    //   data: parameter
+    })
+}
+
+// getReportList 
+export function getReportList(parameter) {
+    return axios({
+      url: "/ctop/accountReport/getReportList",
+      method: 'post',
+      data: parameter
+    })
+}
+
+
+// getReportList 
+export function getStatistics(parameter) {
+    return axios({
+      url: "/ctop/accountReport/getStatistics",
+      method: 'post',
+      data: parameter
+    })
+}
+
+
+
+// getDailyReport 
+export function getDailyReport(parameter) {
+    return axios({
+      url: "/ctop/daily/getDailyReport",
+      method: 'post',
+      data: parameter
+    })
+}
+
+// /materialReport/getKuaiShouMaterialMarket
+//素材大盘
+export function getKuaiShouMaterialMarket(parameter) {
+    return axios({
+      url: "/materialReport/getKuaiShouMaterialMarket",
+      method: 'post',
+      data: parameter
+    })
+}
+
+
+// /materialReport/getKuaiShouMaterialMarket
+//素材大盘分时
+export function getKuaiShouChainRatio(parameter) {
+    return axios({
+      url: "/materialReport/getKuaiShouChainRatio",
+      method: 'post',
+      data: parameter
+    })
+}
+
+
+// /materialReport/getMaterialReportByAccount
+// userId:
+// 分账户
+export function getMaterialReportByAccount(parameter) {
+    return axios({
+      url: "/materialReport/getMaterialReportByAccount",
+      method: 'post',
+      data: parameter
+    })
+}
+
+//  /MaterialRefuse/getRefuseCreative
+export function getRefuseCreative(parameter) {
+    return axios({
+      url: "/MaterialRefuse/getRefuseCreative",
+      method: 'post',
+      data: parameter
+    })
+}
+
+//  /MaterialRefuse/updateCreative
+// 修改
+export function updateCreative(parameter) {
+    return axios({
+      url: "/MaterialRefuse/updateCreative",
+      method: 'post',
+      data: parameter
+    })
+}
+
+//  /MaterialRefuse/selectByCreateName
+export function selectByCreateName(parameter) {
+    return axios({
+      url: "/MaterialRefuse/selectByCreateName",
+      method: 'post',
+      data: parameter
+    })
+}

+ 132 - 0
out/production/adsp-vue/api/video.js

@@ -0,0 +1,132 @@
+
+import {axios} from '@/utils/request'
+
+
+//获取登录账户已经绑定过的快手账户列表
+export function getUserList() {
+    return axios({
+      url: "/ks/web/user/list",
+      method: 'post',
+      //   params: parameter
+    })
+}
+
+// 获取登录二维码
+export function getLoginQr() {
+    return axios({
+      url: "/ks/web/login/qr",
+      method: 'post',
+      //   params: parameter
+    })
+}
+
+// 获取登录状态
+// /ks/web/login/status
+// 参数 String requestId
+export function getLoginStatus(parameter) {
+    return axios({
+      url: "/ks/web/login/status",
+      method: 'post',
+      params: parameter
+    })
+}
+
+// 获取视频列表
+// /ks/web/video/list
+// 参数 String ksid,String pcursor
+export function getVideoList(parameter) {
+    return axios({
+      url: "/ks/web/video/list",
+      method: 'post',
+      params: parameter
+    })
+}
+
+// 获取评论列表
+// /ks/web/comment/list
+// 参数 String ksid,String photoId,String pcursor
+export function getCommentList(parameter) {
+    return axios({
+      url: "/ks/web/comment/list",
+      method: 'post',
+      params: parameter
+    })
+}
+
+// 删除单条评论
+// /ks/web/comment/delete
+// 参数 String ksid,String photoId,Long commentId
+export function commentDelete(parameter) {
+    return axios({
+      url: "/ks/web/comment/delete",
+      method: 'post',
+      params: parameter
+    })
+}
+
+// 获取子评论列表
+// /ks/web/subcomment/list
+// 参数 String ksid,String photoId,Long rootCommentId,String pcursor
+export function getSubcommentList(parameter) {
+    return axios({
+      url: "/ks/web/subcomment/list",
+      method: 'post',
+      params: parameter
+    })
+}
+
+//评论添加接口
+///ks/web/comment/add
+// String ksid, String photoId,String content, Long replyToCommentId,Long repltTo
+export function commentAdd(parameter) {
+    return axios({
+      url: "/ks/web/comment/add",
+      method: 'post',
+      params: parameter
+    })
+}
+
+
+
+//头条当前账号下的数据集合
+// /ctop/report/accountReport
+export function getAccountReport() {
+    return axios({
+      url: "/ctop/report/accountReport",
+      method: 'get',
+    //   params: parameter
+    })
+}
+
+
+//快手当前账号下的数据集合
+export function getKsAccountReport(parameter) {
+    return axios({
+      url: "/ctop/report/kuaiShou/accountReport",
+      method: 'post',
+      data: parameter
+    })
+}
+
+// 当日明细
+// /accountReport/kuaiShou/accountDetailReport
+//快手当前账号下的数据集合
+export function getKsDetail(parameter) {
+    return axios({
+      url: "/ctop/report/kuaiShou/accountDetailReport",
+      method: 'post',
+      data: parameter
+    })
+}
+
+
+// 当日明细
+// /accountReport/kuaiShou/accountDetailReport
+//快手当前账号下的数据集合
+export function getReportList(parameter) {
+    return axios({
+      url: "/ctop/report/kuaiShou/getReportList",
+      method: 'post',
+      data: parameter
+    })
+}

+ 57 - 0
out/production/adsp-vue/api/yard.js

@@ -0,0 +1,57 @@
+
+import {axios} from '@/utils/request'
+
+export function yardPhotoList(parameter) {
+    return axios({
+      url: "/ctop/yard/photo/list",
+      method: 'get',
+      params: parameter
+    })
+}
+export function yardListDelete(parameter) {
+    return axios({
+      url: "/ctop/yard/delete",
+      method: 'delete',
+      params: parameter
+    })
+}
+
+export function yardVideoList(parameter) {
+    return axios({
+      url: "/ctop/yard/video/list",
+      method: 'get',
+      params: parameter
+    })
+}
+
+export function yardPhotoDelete(parameter) {
+    return axios({
+      url: "/ctop/yard/photo/delete",
+      method: 'delete',
+      params: parameter
+    })
+}
+
+export function yardVideoDelete(parameter) {
+    return axios({
+      url: "/ctop/yard/video/delete",
+      method: 'delete',
+      params: parameter
+    })
+}
+
+export function yardPhotoAdd(parameter) {
+    return axios({
+      url: "/ctop/yard/photo/add",
+      method: 'post',
+      params: parameter
+    })
+}
+
+export function yardVideoAdd(parameter) {
+    return axios({
+      url: "/ctop/yard/video/add",
+      method: 'post',
+      params: parameter
+    })
+}

+ 121 - 0
out/production/adsp-vue/assets/background.svg

@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="1361px" height="609px" viewBox="0 0 1361 609" version="1.1" xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink">
+  <!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
+  <title>Group 21</title>
+  <desc>Created with Sketch.</desc>
+  <defs></defs>
+  <g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="账户密码登录-校验" transform="translate(-79.000000, -82.000000)">
+      <g id="Group-21" transform="translate(77.000000, 73.000000)">
+        <g id="Group-18" opacity="0.8"
+           transform="translate(74.901416, 569.699158) rotate(-7.000000) translate(-74.901416, -569.699158) translate(4.901416, 525.199158)">
+          <ellipse id="Oval-11" fill="#CFDAE6" opacity="0.25" cx="63.5748792" cy="32.468367" rx="21.7830479"
+                   ry="21.766008"></ellipse>
+          <ellipse id="Oval-3" fill="#CFDAE6" opacity="0.599999964" cx="5.98746479" cy="13.8668601" rx="5.2173913"
+                   ry="5.21330997"></ellipse>
+          <path
+            d="M38.1354514,88.3520215 C43.8984227,88.3520215 48.570234,83.6838647 48.570234,77.9254015 C48.570234,72.1669383 43.8984227,67.4987816 38.1354514,67.4987816 C32.3724801,67.4987816 27.7006688,72.1669383 27.7006688,77.9254015 C27.7006688,83.6838647 32.3724801,88.3520215 38.1354514,88.3520215 Z"
+            id="Oval-3-Copy" fill="#CFDAE6" opacity="0.45"></path>
+          <path d="M64.2775582,33.1704963 L119.185836,16.5654915" id="Path-12" stroke="#CFDAE6"
+                stroke-width="1.73913043" stroke-linecap="round" stroke-linejoin="round"></path>
+          <path d="M42.1431708,26.5002681 L7.71190162,14.5640702" id="Path-16" stroke="#E0B4B7"
+                stroke-width="0.702678964" opacity="0.7" stroke-linecap="round" stroke-linejoin="round"
+                stroke-dasharray="1.405357899873153,2.108036953469981"></path>
+          <path d="M63.9262187,33.521561 L43.6721326,69.3250951" id="Path-15" stroke="#BACAD9"
+                stroke-width="0.702678964" stroke-linecap="round" stroke-linejoin="round"
+                stroke-dasharray="1.405357899873153,2.108036953469981"></path>
+          <g id="Group-17"
+             transform="translate(126.850922, 13.543654) rotate(30.000000) translate(-126.850922, -13.543654) translate(117.285705, 4.381889)"
+             fill="#CFDAE6">
+            <ellipse id="Oval-4" opacity="0.45" cx="9.13482653" cy="9.12768076" rx="9.13482653"
+                     ry="9.12768076"></ellipse>
+            <path
+              d="M18.2696531,18.2553615 C18.2696531,13.2142826 14.1798519,9.12768076 9.13482653,9.12768076 C4.08980114,9.12768076 0,13.2142826 0,18.2553615 L18.2696531,18.2553615 Z"
+              id="Oval-4"
+              transform="translate(9.134827, 13.691521) scale(-1, -1) translate(-9.134827, -13.691521) "></path>
+          </g>
+        </g>
+        <g id="Group-14"
+           transform="translate(216.294700, 123.725600) rotate(-5.000000) translate(-216.294700, -123.725600) translate(106.294700, 35.225600)">
+          <ellipse id="Oval-2" fill="#CFDAE6" opacity="0.25" cx="29.1176471" cy="29.1402439" rx="29.1176471"
+                   ry="29.1402439"></ellipse>
+          <ellipse id="Oval-2" fill="#CFDAE6" opacity="0.3" cx="29.1176471" cy="29.1402439" rx="21.5686275"
+                   ry="21.5853659"></ellipse>
+          <ellipse id="Oval-2-Copy" stroke="#CFDAE6" opacity="0.4" cx="179.019608" cy="138.146341" rx="23.7254902"
+                   ry="23.7439024"></ellipse>
+          <ellipse id="Oval-2" fill="#BACAD9" opacity="0.5" cx="29.1176471" cy="29.1402439" rx="10.7843137"
+                   ry="10.7926829"></ellipse>
+          <path
+            d="M29.1176471,39.9329268 L29.1176471,18.347561 C23.1616351,18.347561 18.3333333,23.1796097 18.3333333,29.1402439 C18.3333333,35.1008781 23.1616351,39.9329268 29.1176471,39.9329268 Z"
+            id="Oval-2" fill="#BACAD9"></path>
+          <g id="Group-9" opacity="0.45" transform="translate(172.000000, 131.000000)" fill="#E6A1A6">
+            <ellipse id="Oval-2-Copy-2" cx="7.01960784" cy="7.14634146" rx="6.47058824" ry="6.47560976"></ellipse>
+            <path
+              d="M0.549019608,13.6219512 C4.12262681,13.6219512 7.01960784,10.722722 7.01960784,7.14634146 C7.01960784,3.56996095 4.12262681,0.670731707 0.549019608,0.670731707 L0.549019608,13.6219512 Z"
+              id="Oval-2-Copy-2"
+              transform="translate(3.784314, 7.146341) scale(-1, 1) translate(-3.784314, -7.146341) "></path>
+          </g>
+          <ellipse id="Oval-10" fill="#CFDAE6" cx="218.382353" cy="138.685976" rx="1.61764706"
+                   ry="1.61890244"></ellipse>
+          <ellipse id="Oval-10-Copy-2" fill="#E0B4B7" opacity="0.35" cx="179.558824" cy="175.381098" rx="1.61764706"
+                   ry="1.61890244"></ellipse>
+          <ellipse id="Oval-10-Copy" fill="#E0B4B7" opacity="0.35" cx="180.098039" cy="102.530488" rx="2.15686275"
+                   ry="2.15853659"></ellipse>
+          <path d="M28.9985381,29.9671598 L171.151018,132.876024" id="Path-11" stroke="#CFDAE6" opacity="0.8"></path>
+        </g>
+        <g id="Group-10" opacity="0.799999952"
+           transform="translate(1054.100635, 36.659317) rotate(-11.000000) translate(-1054.100635, -36.659317) translate(1026.600635, 4.659317)">
+          <ellipse id="Oval-7" stroke="#CFDAE6" stroke-width="0.941176471" cx="43.8135593" cy="32" rx="11.1864407"
+                   ry="11.2941176"></ellipse>
+          <g id="Group-12" transform="translate(34.596774, 23.111111)" fill="#BACAD9">
+            <ellipse id="Oval-7" opacity="0.45" cx="9.18534718" cy="8.88888889" rx="8.47457627"
+                     ry="8.55614973"></ellipse>
+            <path
+              d="M9.18534718,17.4450386 C13.8657264,17.4450386 17.6599235,13.6143199 17.6599235,8.88888889 C17.6599235,4.16345787 13.8657264,0.332739156 9.18534718,0.332739156 L9.18534718,17.4450386 Z"
+              id="Oval-7"></path>
+          </g>
+          <path d="M34.6597385,24.809694 L5.71666084,4.76878945" id="Path-2" stroke="#CFDAE6"
+                stroke-width="0.941176471"></path>
+          <ellipse id="Oval" stroke="#CFDAE6" stroke-width="0.941176471" cx="3.26271186" cy="3.29411765" rx="3.26271186"
+                   ry="3.29411765"></ellipse>
+          <ellipse id="Oval-Copy" fill="#F7E1AD" cx="2.79661017" cy="61.1764706" rx="2.79661017"
+                   ry="2.82352941"></ellipse>
+          <path d="M34.6312443,39.2922712 L5.06366663,59.785082" id="Path-10" stroke="#CFDAE6"
+                stroke-width="0.941176471"></path>
+        </g>
+        <g id="Group-19" opacity="0.33"
+           transform="translate(1282.537219, 446.502867) rotate(-10.000000) translate(-1282.537219, -446.502867) translate(1142.537219, 327.502867)">
+          <g id="Group-17"
+             transform="translate(141.333539, 104.502742) rotate(275.000000) translate(-141.333539, -104.502742) translate(129.333539, 92.502742)"
+             fill="#BACAD9">
+            <circle id="Oval-4" opacity="0.45" cx="11.6666667" cy="11.6666667" r="11.6666667"></circle>
+            <path
+              d="M23.3333333,23.3333333 C23.3333333,16.8900113 18.1099887,11.6666667 11.6666667,11.6666667 C5.22334459,11.6666667 0,16.8900113 0,23.3333333 L23.3333333,23.3333333 Z"
+              id="Oval-4"
+              transform="translate(11.666667, 17.500000) scale(-1, -1) translate(-11.666667, -17.500000) "></path>
+          </g>
+          <circle id="Oval-5-Copy-6" fill="#CFDAE6" cx="201.833333" cy="87.5" r="5.83333333"></circle>
+          <path d="M143.5,88.8126685 L155.070501,17.6038544" id="Path-17" stroke="#BACAD9"
+                stroke-width="1.16666667"></path>
+          <path d="M17.5,37.3333333 L127.466252,97.6449735" id="Path-18" stroke="#BACAD9"
+                stroke-width="1.16666667"></path>
+          <polyline id="Path-19" stroke="#CFDAE6" stroke-width="1.16666667"
+                    points="143.902597 120.302281 174.935455 231.571342 38.5 147.510847 126.366941 110.833333"></polyline>
+          <path d="M159.833333,99.7453842 L195.416667,89.25" id="Path-20" stroke="#E0B4B7" stroke-width="1.16666667"
+                opacity="0.6"></path>
+          <path d="M205.333333,82.1372105 L238.719406,36.1666667" id="Path-24" stroke="#BACAD9"
+                stroke-width="1.16666667"></path>
+          <path d="M266.723424,132.231988 L207.083333,90.4166667" id="Path-25" stroke="#CFDAE6"
+                stroke-width="1.16666667"></path>
+          <circle id="Oval-5" fill="#C1D1E0" cx="156.916667" cy="8.75" r="8.75"></circle>
+          <circle id="Oval-5-Copy-3" fill="#C1D1E0" cx="39.0833333" cy="148.75" r="5.25"></circle>
+          <circle id="Oval-5-Copy-2" fill-opacity="0.6" fill="#D1DEED" cx="8.75" cy="33.25" r="8.75"></circle>
+          <circle id="Oval-5-Copy-4" fill-opacity="0.6" fill="#D1DEED" cx="243.833333" cy="30.3333333"
+                  r="5.83333333"></circle>
+          <circle id="Oval-5-Copy-5" fill="#E0B4B7" cx="175.583333" cy="232.75" r="5.25"></circle>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

二进制
out/production/adsp-vue/assets/background/bg-1.jpg


二进制
out/production/adsp-vue/assets/background/bg-2.jpg


二进制
out/production/adsp-vue/assets/checkcode.png


二进制
out/production/adsp-vue/assets/daiban.png


二进制
out/production/adsp-vue/assets/down.png


二进制
out/production/adsp-vue/assets/duban.png


二进制
out/production/adsp-vue/assets/feishu.png


二进制
out/production/adsp-vue/assets/feishuGray.png


二进制
out/production/adsp-vue/assets/greendown.png


二进制
out/production/adsp-vue/assets/guaz.png


二进制
out/production/adsp-vue/assets/img/album_cover_player.png


二进制
out/production/adsp-vue/assets/img/default.png


二进制
out/production/adsp-vue/assets/img/head_bg.png


二进制
out/production/adsp-vue/assets/img/huichuanglogo.png


二进制
out/production/adsp-vue/assets/img/img-1.jpg


二进制
out/production/adsp-vue/assets/img/img-2.jpg


二进制
out/production/adsp-vue/assets/img/img-3.jpg


二进制
out/production/adsp-vue/assets/img/img-4.jpg


二进制
out/production/adsp-vue/assets/img/img-l-1.jpg


二进制
out/production/adsp-vue/assets/img/img-l-2.jpg


二进制
out/production/adsp-vue/assets/img/login-bg.jpg


二进制
out/production/adsp-vue/assets/img/logo.png


二进制
out/production/adsp-vue/assets/img/logo_vmeditor.png


二进制
out/production/adsp-vue/assets/img/noImg.png


二进制
out/production/adsp-vue/assets/img/photo.jpg


二进制
out/production/adsp-vue/assets/img/player_cover.png


二进制
out/production/adsp-vue/assets/img/spLbLAbh.jpg


二进制
out/production/adsp-vue/assets/img/test.jpg


+ 6 - 0
out/production/adsp-vue/assets/img/u2.svg

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="739px" height="357px" xmlns="http://www.w3.org/2000/svg">
+  <g transform="matrix(1 0 0 1 -590 -298 )">
+    <path d="M 959.5 298  C 1166.42 298  1329 376.54  1329 476.5  C 1329 576.46  1166.42 655  959.5 655  C 752.58 655  590 576.46  590 476.5  C 590 376.54  752.58 298  959.5 298  Z " fill-rule="nonzero" fill="#6633ff" stroke="none" fill-opacity="0.0980392156862745" />
+  </g>
+</svg>

+ 6 - 0
out/production/adsp-vue/assets/img/u3.svg

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="639px" height="309px" xmlns="http://www.w3.org/2000/svg">
+  <g transform="matrix(1 0 0 1 -640 -302 )">
+    <path d="M 959.5 302  C 1138.42 302  1279 369.98  1279 456.5  C 1279 543.02  1138.42 611  959.5 611  C 780.58 611  640 543.02  640 456.5  C 640 369.98  780.58 302  959.5 302  Z " fill-rule="nonzero" fill="#6633ff" stroke="none" fill-opacity="0.0980392156862745" />
+  </g>
+</svg>

+ 6 - 0
out/production/adsp-vue/assets/img/u4.svg

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="480px" height="232px" xmlns="http://www.w3.org/2000/svg">
+  <g transform="matrix(1 0 0 1 -720 -330 )">
+    <path d="M 960 330  C 1094.4 330  1200 381.04  1200 446  C 1200 510.96  1094.4 562  960 562  C 825.6 562  720 510.96  720 446  C 720 381.04  825.6 330  960 330  Z " fill-rule="nonzero" fill="#6633ff" stroke="none" fill-opacity="0.0980392156862745" />
+  </g>
+</svg>

二进制
out/production/adsp-vue/assets/img/wangge2.png


二进制
out/production/adsp-vue/assets/img/wave.gif


+ 280 - 0
out/production/adsp-vue/assets/jwps.es6.js

@@ -0,0 +1,280 @@
+var e, t, n = function () {
+    return (n = Object.assign || function (e) {
+        for (var t, n = 1, o = arguments.length; n < o; n++) for (var r in t = arguments[n]) Object.prototype.hasOwnProperty.call(t, r) && (e[r] = t[r]);
+        return e
+    }).apply(this, arguments)
+}, o = function () {
+    function e() {
+    }
+
+    return e.add = function (t) {
+        e._handleList.push(t), window.addEventListener("message", t, !1)
+    }, e.remove = function (t) {
+        var n = e._handleList.indexOf(t);
+        n >= 0 && e._handleList.splice(n, 1), window.removeEventListener("message", t, !1)
+    }, e.empty = function () {
+        for (; e._handleList.length;) window.removeEventListener("message", e._handleList.shift(), !1)
+    }, e.parse = function (e) {
+        return "object" == typeof e ? e : JSON.parse(e)
+    }, e._handleList = [], e
+}();
+!function (e) {
+    e.unknown = "unknown", e.spreadsheet = "s", e.writer = "w", e.presentation = "p", e.pdf = "f"
+}(e || (e = {})), function (e) {
+    e.wps = "w", e.et = "s", e.presentation = "p", e.pdf = "f"
+}(t || (t = {}));
+var r, i, a, p, c, s, u, d = (r = 0, function () {
+        return ++r
+    }), f = (i = null, function (e, t) {
+        if (!i) {
+            i = document.createElement("iframe");
+            var n = {
+                id: "wps-iframe",
+                src: e,
+                scrolling: "no",
+                frameborder: "0",
+                allowfullscreen: "allowfullscreen",
+                webkitallowfullscreen: "true",
+                mozallowfullscreen: "true",
+                height: 'auto',
+                width: '100%'
+            };
+            for (var o in n) i.setAttribute(o, n[o]);
+            t ? t.appendChild(i) : document.body.appendChild(i), i.destroy = function () {
+                i.parentNode.removeChild(i), i = null
+            }
+        }
+        return i
+    }), l = function (e) {
+        f().contentWindow.postMessage(JSON.stringify(e), "*")
+    }, m = function (e) {
+        return new Promise(function (t) {
+            var n = d();
+            e.type = y();
+            var r = function (e) {
+                var i = o.parse(e.data);
+                "wps.api.reply" === i.eventName && i.msgId === n && (t(i.data), o.remove(r))
+            };
+            o.add(r), l({eventName: "wps.jssdk.api", data: e, msgId: n})
+        })
+    }, v = function (e) {
+        var t = n({}, e), o = t.headers, r = void 0 === o ? {} : o, i = t.subscriptions, a = void 0 === i ? {} : i,
+            p = (t.wpsUrl, r.backBtn), c = void 0 === p ? {} : p, s = r.shareBtn, u = void 0 === s ? {} : s,
+            d = r.otherMenuBtn, f = void 0 === d ? {} : d, l = function (e, t) {
+                e.subscribe && "function" == typeof e.subscribe && (e.callback = t, a[t] = e.subscribe, delete e.subscribe)
+            };
+        if (l(c, "wpsconfig_back_btn"), l(u, "wpsconfig_share_btn"), l(f, "wpsconfig_other_menu_btn"), f.items && Array.isArray(f.items)) {
+            var m = [];
+            f.items.forEach(function (e, t) {
+                switch (void 0 === e && (e = {}), e.type) {
+                    case"export_img":
+                        e.type = 1, e.callback = "export_img";
+                        break;
+                    case"export_pdf":
+                        e.type = 1, e.callback = "export_pdf";
+                        break;
+                    case"save_version":
+                        e.type = 1, e.callback = "save_version";
+                        break;
+                    case"about_wps":
+                        e.type = 1, e.callback = "about_wps";
+                        break;
+                    case"split_line":
+                        e.type = 2;
+                        break;
+                    case"custom":
+                        e.type = 3, l(e, "wpsconfig_other_menu_btn_" + t), m.push(e)
+                }
+            }), m.length && (x || b) && (f.items = m)
+        }
+        if ("object" == typeof a.print) {
+            var v = "wpsconfig_print";
+            "function" == typeof a.print.subscribe && (a[v] = a.print.subscribe, t.print = {callback: v}, void 0 !== a.print.custom && (t.print.custom = a.print.custom)), delete a.print
+        }
+        "function" == typeof a.exportPdf && (a[v = "wpsconfig_export_pdf"] = a.exportPdf, t.exportPdf = {callback: v}, delete a.exportPdf);
+        return n({}, t, {subscriptions: a})
+    }, y = (a = "", function (n) {
+        if (void 0 === n && (n = ""), !a && n) {
+            var o = n.toLowerCase();
+            -1 !== o.indexOf("/office/s/") && (a = e.spreadsheet), -1 !== o.indexOf("/office/w/") && (a = e.writer), -1 !== o.indexOf("/office/p/") && (a = e.presentation), -1 !== o.indexOf("/office/f/") && (a = e.pdf)
+        }
+        if (!a) {
+            var r = n.match(/[\\?&]type=([a-z]+)/) || [];
+            a = t[r[1]] || ""
+        }
+        return a
+    }), w = window.navigator.userAgent.toLowerCase(), x = /Android|webOS|iPhone|iPod|BlackBerry|iPad/i.test(w),
+    b = function () {
+        try {
+            return -1 !== window._parent.location.search.indexOf("from=wxminiprogram")
+        } catch (e) {
+            return !1
+        }
+    }();
+!function (e) {
+    e[e.wdExportFormatPDF = 17] = "wdExportFormatPDF", e[e.wdExportFormatXPS = 18] = "wdExportFormatXPS"
+}(p || (p = {})), function (e) {
+    e[e.wdExportAllDocument = 0] = "wdExportAllDocument", e[e.wdExportSelection = 1] = "wdExportSelection", e[e.wdExportCurrentPage = 2] = "wdExportCurrentPage", e[e.wdExportFromTo = 3] = "wdExportFromTo"
+}(c || (c = {})), function (e) {
+    e[e.wdExportDocumentContent = 0] = "wdExportDocumentContent", e[e.wdExportDocumentWithMarkup = 7] = "wdExportDocumentWithMarkup"
+}(s || (s = {})), function (e) {
+    e[e.title = 1] = "title", e[e.tag = 2] = "tag"
+}(u || (u = {}));
+var F;
+!function (e) {
+    e[e.xlTypePDF = 0] = "xlTypePDF", e[e.xlTypeXPS = 1] = "xlTypeXPS"
+}(F || (F = {}));
+var A, g, E;
+!function (e) {
+    e[e.ppFixedFormatTypePDF = 2] = "ppFixedFormatTypePDF", e[e.ppFixedFormatTypeXPS = 1] = "ppFixedFormatTypeXPS"
+}(A || (A = {})), function (e) {
+    e[e.ppPrintAll = 1] = "ppPrintAll", e[e.ppPrintCurrent = 3] = "ppPrintCurrent"
+}(g || (g = {})), function (e) {
+    e[e.msoFalse = 0] = "msoFalse", e[e.msoTrue = -1] = "msoTrue"
+}(E || (E = {}));
+var h;
+
+function P(e) {
+    return e = e || Object.create(null), {
+        on: function (t, n) {
+            (e[t] || (e[t] = [])).push(n)
+        }, off: function (t, n) {
+            e[t] && e[t].splice(e[t].indexOf(n) >>> 0, 1)
+        }, emit: function (t, n) {
+            (e[t] || []).slice().map(function (e) {
+                e(n)
+            }), (e["*"] || []).slice().map(function (e) {
+                e(t, n)
+            })
+        }
+    }
+}
+
+var k = "fileOpen", D = function (e) {
+    return "wps.advanced.api.ready" === e || "web_loaded" === e
+}, _ = function (e, t) {
+    void 0 === e && (e = {});
+    o.add(function (n) {
+        var r = o.parse(n.data), i = r.eventName, a = void 0 === i ? "" : i, p = r.data, c = void 0 === p ? null : p,
+            s = r.url, u = void 0 === s ? null : s;
+        -1 === ["wps.jssdk.api"].indexOf(a) && ("ready" === a ? (l({
+            eventName: "setConfig",
+            data: e
+        }), h.tokenData && l({
+            eventName: "setToken",
+            data: h.tokenData
+        }), h.iframeReady = !0) : "open.result" === a && h.emit(k, c), D(a) && T(), "function" == typeof t[a] && t[a](h, u || c))
+    })
+}, T = function () {
+    var t = y(h.url);
+    t === e.writer && function (e) {
+        e.WpsApplication = function () {
+            return {
+                ActiveDocument: {
+                    ExportAsFixedFormatAsync: function (e) {
+                        var t = {
+                            api: "WpsApplication().ActiveDocument.ExportAsFixedFormatAsync",
+                            args: n({
+                                ExportFormat: p.wdExportFormatPDF,
+                                Range: c.wdExportAllDocument,
+                                From: 1,
+                                To: 1,
+                                Item: s.wdExportDocumentWithMarkup,
+                                IncludeDocProps: !0
+                            }, "object" == typeof e ? e : {})
+                        };
+                        return m(t)
+                    }, ImportDataIntoFieldsAsync: function (e) {
+                        var t = {
+                            api: "WpsApplication().ActiveDocument.ImportDataIntoFieldsAsync",
+                            args: {Data: e.Data, Options: e.Options}
+                        };
+                        return m(t)
+                    }, ReplaceTextAsync: function (e) {
+                        var t = {api: "WpsApplication().ActiveDocument.ReplaceTextAsync", args: {Data: e.Data}};
+                        return m(t)
+                    }
+                }, Enum: n({}, p, c, s)
+            }
+        }
+    }(h), t === e.spreadsheet && function (e) {
+        e.EtApplication = function () {
+            return {
+                ActiveWorkbook: {
+                    ExportAsFixedFormatAsync: function (e) {
+                        var t = {
+                            api: "EtApplication().ActiveWorkbook.ExportAsFixedFormatAsync",
+                            args: n({Type: F.xlTypePDF, IncludeDocProps: !0}, "object" == typeof e ? e : {})
+                        };
+                        return m(t)
+                    }, ActiveSheet: {
+                        ExportAsFixedFormatAsync: function (e) {
+                            var t = {
+                                api: "EtApplication().ActiveWorkbook.ActiveSheet.ExportAsFixedFormatAsync",
+                                args: n({Type: F.xlTypePDF, IncludeDocProps: !0}, "object" == typeof e ? e : {})
+                            };
+                            return m(t)
+                        }
+                    }
+                }, Enum: n({}, F)
+            }
+        }
+    }(h), t === e.presentation && function (e) {
+        e.WppApplication = function () {
+            return {
+                ActivePresentation: {
+                    ExportAsFixedFormatAsync: function (e) {
+                        var t = {
+                            api: "WppApplication().ActivePresentation.ExportAsFixedFormatAsync",
+                            args: n({
+                                FixedFormatType: A.ppFixedFormatTypePDF,
+                                RangeType: g.ppPrintAll,
+                                FrameSlides: E.msoTrue
+                            }, "object" == typeof e ? e : {})
+                        };
+                        return m(t)
+                    }
+                }, Enum: n({}, A, g)
+            }
+        }
+    }(h)
+};
+// console.log("WPS WebOffice JS-SDK V1.0.11");
+var O = function (e) {
+    void 0 === e && (e = {}), h && h.destroy();
+    try {
+        var t, r = v(e), i = r.wpsUrl, a = r.subscriptions, p = void 0 === a ? {} : a, c = r.mount,
+            s = f(i, void 0 === c ? null : c);
+        return delete r.mount, delete r.wpsUrl, delete r.subscriptions, h = {
+            url: i,
+            version: "1.0.11",
+            iframe: s,
+            Enum: n({}, E),
+            iframeReady: !1,
+            tokenData: null,
+            setToken: function (e) {
+                h.tokenData = e, h.iframeReady && l({eventName: "setToken", data: e})
+            },
+            ready: function () {
+                return t || (t = new Promise(function (e) {
+                    var t = function (n) {
+                        var r = o.parse(n.data).eventName;
+                        D(r) && (e(), o.remove(t))
+                    };
+                    o.add(t)
+                }))
+            },
+            destroy: function () {
+                s.destroy(), o.empty(), h = null
+            },
+            save: function () {
+                return m({api: "save"})
+            }
+        }, Object.assign(h, new P.prototype.constructor), _(r, p), h.ready(), h
+    } catch (e) {
+        // console.error(e)
+    }
+};
+export default {config: O};
+export {O as config};
+//# sourceMappingURL=jwps.es6.js.map

+ 259 - 0
out/production/adsp-vue/assets/less/JAreaLinkage.less

@@ -0,0 +1,259 @@
+.area-zoom-in-top-enter-active,
+.area-zoom-in-top-leave-active {
+  opacity: 1;
+  transform: scaleY(1);
+}
+
+.area-zoom-in-top-enter,
+.area-zoom-in-top-leave-active {
+  opacity: 0;
+  transform: scaleY(0);
+}
+
+.area-select {
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  color: rgba(0, 0, 0, 0.65);
+  font-size: 14px;
+  font-variant: tabular-nums;
+  line-height: 1.5;
+  list-style: none;
+  font-feature-settings: 'tnum';
+  position: relative;
+  outline: 0;
+  display: block;
+  background-color: #fff;
+  border: 1px solid #d9d9d9;
+  border-top-width: 1.02px;
+  border-radius: 4px;
+  outline: none;
+  transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+  -webkit-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+
+.area-select-wrap .area-select {
+  display: inline-block;
+}
+
+.area-select * {
+  box-sizing: border-box;
+}
+
+.area-select:hover {
+  border-color: #40a9ff;
+  border-right-width: 1px !important;
+  outline: 0;
+}
+
+
+.area-select:active {
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+}
+
+.area-select.small {
+  width: 126px;
+}
+
+.area-select.medium {
+  width: 160px;
+}
+
+.area-select.large {
+  width: 194px;
+}
+
+.area-select.is-disabled {
+  background: #eceff5;
+  cursor: not-allowed;
+}
+
+.area-select.is-disabled:hover {
+  border-color: #e1e2e6;
+}
+
+.area-select.is-disabled .area-selected-trigger {
+  cursor: not-allowed;
+}
+
+.area-select .area-selected-trigger {
+  position: relative;
+  display: block;
+  font-size: 14px;
+  cursor: pointer;
+  margin: 0;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  height: 100%;
+  padding: 8px 20px 7px 12px;
+}
+
+.area-select .area-select-icon {
+  position: absolute;
+  top: 50%;
+  margin-top: -2px;
+  right: 6px;
+  content: "";
+  width: 0;
+  height: 0;
+  border: 6px solid transparent;
+  border-top-color: rgba(0, 0, 0, 0.25);
+  transition: all .3s linear;
+  transform-origin: center;
+}
+
+.area-select .area-select-icon.active {
+  margin-top: -8px;
+  transform: rotate(180deg);
+}
+
+.area-selectable-list-wrap {
+  position: absolute;
+  width: 100%;
+  max-height: 275px;
+  z-index: 15000;
+  background-color: #fff;
+  box-sizing: border-box;
+  overflow-x: auto;
+  margin: 2px 0;
+  border-radius: 4px;
+  outline: none;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+
+  transition: opacity 0.15s, transform 0.3s !important;
+  transform-origin: center top !important;
+}
+
+.area-selectable-list {
+  position: relative;
+  margin: 0;
+  padding: 6px 0;
+  width: 100%;
+  font-size: 14px;
+  color: #565656;
+  list-style: none;
+}
+
+.area-selectable-list .area-select-option {
+  position: relative;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  cursor: pointer;
+  padding: 0 15px 0 10px;
+  height: 32px;
+  line-height: 32px;
+}
+
+.area-selectable-list .area-select-option.hover {
+  background-color: #e6f7ff;
+}
+
+.area-selectable-list .area-select-option.selected {
+  color: rgba(0, 0, 0, 0.65);
+  font-weight: 600;
+  background-color: #efefef;
+}
+
+.cascader-menu-list-wrap {
+  position: absolute;
+  white-space: nowrap;
+  z-index: 15000;
+  background-color: #fff;
+  box-sizing: border-box;
+  overflow: hidden;
+  font-size: 0;
+  margin: 2px 0;
+  border-radius: 4px;
+  outline: none;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+
+  transition: opacity 0.15s, transform 0.3s !important;
+  transform-origin: center top !important;
+}
+
+.cascader-menu-list {
+  position: relative;
+  margin: 0;
+  font-size: 14px;
+  color: #565656;
+  padding: 6px 0;
+  list-style: none;
+  display: inline-block;
+  height: 204px;
+  overflow-x: hidden;
+  overflow-y: auto;
+  min-width: 160px;
+  vertical-align: top;
+  background-color: #fff;
+  border-right: 1px solid #e4e7ed;
+}
+
+.cascader-menu-list:last-child {
+  border-right: none;
+}
+
+.cascader-menu-list .cascader-menu-option {
+  position: relative;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  cursor: pointer;
+  padding: 0 15px 0 10px;
+  height: 32px;
+  line-height: 32px;
+}
+
+.cascader-menu-list .cascader-menu-option.hover,
+.cascader-menu-list .cascader-menu-option:hover {
+  background-color: #e6f7ff;
+}
+
+.cascader-menu-list .cascader-menu-option.selected {
+  color: rgba(0, 0, 0, 0.65);
+  font-weight: 600;
+  background-color: #efefef;
+}
+
+.cascader-menu-list .cascader-menu-option.cascader-menu-extensible:after {
+  position: absolute;
+  top: 50%;
+  margin-top: -4px;
+  right: 5px;
+  content: "";
+  width: 0;
+  height: 0;
+  border: 4px solid transparent;
+  border-left-color: #a1a4ad;
+}
+
+.cascader-menu-list::-webkit-scrollbar,
+.area-selectable-list-wrap::-webkit-scrollbar {
+  width: 8px;
+  background: transparent;
+}
+
+.area-selectable-list-wrap::-webkit-scrollbar-button:vertical:decremen,
+.area-selectable-list-wrap::-webkit-scrollbar-button:vertical:end:decrement,
+.area-selectable-list-wrap::-webkit-scrollbar-button:vertical:increment,
+.area-selectable-list-wrap::-webkit-scrollbar-button:vertical:start:increment,
+.cascader-menu-list::-webkit-scrollbar-button:vertical:decremen,
+.cascader-menu-list::-webkit-scrollbar-button:vertical:end:decrement,
+.cascader-menu-list::-webkit-scrollbar-button:vertical:increment,
+.cascader-menu-list::-webkit-scrollbar-button:vertical:start:increment {
+  display: none;
+}
+
+.cascader-menu-list::-webkit-scrollbar-thumb:vertical,
+.area-selectable-list-wrap::-webkit-scrollbar-thumb:vertical {
+  background-color: #b8b8b8;
+  border-radius: 4px;
+}
+
+.cascader-menu-list::-webkit-scrollbar-thumb:vertical:hover,
+.area-selectable-list-wrap::-webkit-scrollbar-thumb:vertical:hover {
+  background-color: #777;
+}

+ 15 - 0
out/production/adsp-vue/assets/less/TableExpand.less

@@ -0,0 +1,15 @@
+/** [表格主题样式一] 表格强制列不换行 */
+.j-table-force-nowrap {
+  td, th {
+    white-space: nowrap;
+  }
+
+  .ant-table-selection-column {
+    padding: 12px 22px !important;
+  }
+
+  /** 列自适应,弊端会导致列宽失效 */
+  &.ant-table-wrapper .ant-table-content {
+    overflow-x: auto;
+  }
+}

+ 59 - 0
out/production/adsp-vue/assets/less/common.less

@@ -0,0 +1,59 @@
+
+/*列表上方操作按钮区域*/
+.ant-card-body .table-operator {
+  margin-bottom: 8px;
+}
+/** Button按钮间距 */
+.table-operator .ant-btn {
+  margin: 0 8px 8px 0;
+}
+.table-operator .ant-btn-group .ant-btn {
+  margin: 0;
+}
+
+.table-operator .ant-btn-group .ant-btn:last-child {
+  margin: 0 8px 8px 0;
+}
+/*列表td的padding设置 可以控制列表大小*/
+.ant-table-tbody .ant-table-row td {
+  padding-top: 15px;
+  padding-bottom: 15px;
+}
+
+/*列表页面弹出modal*/
+.ant-modal-cust-warp {
+  height: 100%
+}
+
+/*弹出modal Y轴滚动条*/
+.ant-modal-cust-warp .ant-modal-body {
+  height: calc(100% - 110px) !important;
+  overflow-y: auto
+}
+
+/*弹出modal 先有content后有body 故滚动条控制在body上*/
+.ant-modal-cust-warp .ant-modal-content {
+  height: 90% !important;
+  overflow-y: hidden
+}
+
+/*列表中有图片的加这个样式 参考用户管理*/
+.anty-img-wrap {
+  height: 25px;
+  position: relative;
+}
+.anty-img-wrap > img {
+  max-height: 100%;
+}
+/*列表中范围查询样式*/
+.query-group-cust{width: calc(50% - 10px)}
+.query-group-split-cust:before{content:"~";width: 20px;display: inline-block;text-align: center}
+
+
+/*erp风格子表外框padding设置*/
+.ant-card-wider-padding.cust-erp-sub-tab>.ant-card-body{padding:5px 12px}
+
+/* 内嵌子表背景颜色 */
+.j-inner-table-wrapper ::v-deep .ant-table-expanded-row .ant-table-wrapper .ant-table-tbody .ant-table-row {
+  background-color: #FFFFFF;
+}

+ 34 - 0
out/production/adsp-vue/assets/less/index.less

@@ -0,0 +1,34 @@
+/**
+ * 列表查询通用样式,移动端自适应
+ */
+.search {
+  margin-bottom: 54px;
+}
+
+.fold {
+  width: calc(100% - 216px);
+  display: inline-block
+}
+
+.operator {
+  margin-bottom: 18px;
+}
+
+@media screen and (max-width: 900px) {
+  .fold {
+    width: 100%;
+  }
+}
+
+.operator button {
+  margin-right: 5px;
+}
+
+i {
+  cursor: pointer;
+}
+
+.trcolor {
+  background-color: rgba(255, 192, 203, 0.31);
+  color: red;
+}

二进制
out/production/adsp-vue/assets/logo-white.png


二进制
out/production/adsp-vue/assets/logo.png


+ 174 - 0
out/production/adsp-vue/assets/logo.svg

@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
+     y="0px" width="293px" height="293px" viewBox="0 0 293 293" enable-background="new 0 0 293 293"
+     xml:space="preserve">  <image id="image0" width="293" height="293" x="0" y="0"
+                                   href="data:image/png;base64,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
+OjAwP26CAAAAAABJRU5ErkJggg=="/>
+</svg>

二进制
out/production/adsp-vue/assets/logo1.png


二进制
out/production/adsp-vue/assets/logoNew.png


二进制
out/production/adsp-vue/assets/logoNew1.png


二进制
out/production/adsp-vue/assets/noImg.png


二进制
out/production/adsp-vue/assets/nodata.png


二进制
out/production/adsp-vue/assets/orderIcon.png


二进制
out/production/adsp-vue/assets/pdf4.jpg


二进制
out/production/adsp-vue/assets/success.png


二进制
out/production/adsp-vue/assets/touxiang.png


二进制
out/production/adsp-vue/assets/up.png


二进制
out/production/adsp-vue/assets/upred.png


二进制
out/production/adsp-vue/assets/work.png


二进制
out/production/adsp-vue/assets/zaiban.png


+ 230 - 0
out/production/adsp-vue/base/mm-dialog/mm-dialog.vue

@@ -0,0 +1,230 @@
+<template>
+  <!--对话框-->
+  <transition name="mm-dialog-fade">
+    <div v-show="dialogShow" class="mm-dialog-box">
+      <div class="mm-dialog-wrapper">
+        <div class="mm-dialog-content">
+          <div class="mm-dialog-head" v-text="headText"></div>
+          <slot>
+            <!-- eslint-disable-next-line vue/no-v-html -->
+            <div class="mm-dialog-text" v-html="bodyText"></div>
+          </slot>
+          <div class="mm-dialog-btns">
+            <div
+              v-if="dialogType!=='alert'"
+              class="mm-btn-cancel"
+              @click="cancel"
+              v-text="cancelBtnText"
+            ></div>
+            <slot name="btn"></slot>
+            <div
+              class="mm-btn-confirm"
+              @click="confirm"
+              v-text="confirmBtnText"
+            ></div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </transition>
+</template>
+
+<script>
+export default {
+  name: 'MmDialog',
+  props: {
+    // type:confirm、alert
+    type: {
+      type: String,
+      default: 'confirm'
+    },
+    // 标题文本
+    headText: {
+      type: String,
+      default: '提示'
+    },
+    // 内容文本(可以是html)
+    bodyText: {
+      type: String,
+      default: ''
+    },
+    // 取消按钮文本
+    cancelBtnText: {
+      type: String,
+      default: '取消'
+    },
+    // 确定按钮文本
+    confirmBtnText: {
+      type: String,
+      default: '确定'
+    },
+    // Dialog 是否插入至 body 元素下
+    appendToBody: {
+      type: Boolean,
+      default: true
+    }
+  },
+  data() {
+    return {
+      dialogShow: false // 是否显示对话框
+    }
+  },
+  computed: {
+    dialogType() {
+      return this.type.toLowerCase()
+    }
+  },
+  watch: {
+    dialogShow(val) {
+      if (val && this.appendToBody) {
+        document.body.appendChild(this.$el)
+      }
+    }
+  },
+  mounted() {
+    if (this.dialogShow && this.appendToBody) {
+      document.body.appendChild(this.$el)
+    }
+  },
+  destroyed() {
+    if (this.appendToBody && this.$el && this.$el.parentNode) {
+      this.$el.parentNode.removeChild(this.$el)
+    }
+  },
+  methods: {
+    // 显示事件
+    show() {
+      this.dialogShow = true
+    },
+    // 隐藏事件
+    hide() {
+      this.dialogShow = false
+    },
+    // 取消事件
+    cancel() {
+      this.hide()
+      this.$emit('cancel')
+    },
+    // 确定事件
+    confirm() {
+      this.hide()
+      this.$emit('confirm')
+    }
+  }
+}
+</script>
+
+<style lang="less">
+@dialog-prefix-cls: mm-dialog;
+
+.@{dialog-prefix-cls}-box {
+  position: fixed;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  z-index: 1996;
+  background-color: @dialog_bg_color;
+  user-select: none;
+  &.@{dialog-prefix-cls}-fade-enter-active {
+    animation: mm-dialog-fadein 0.3s;
+    .@{dialog-prefix-cls}-content {
+      animation: mm-dialog-zoom 0.3s;
+    }
+  }
+  .@{dialog-prefix-cls}-wrapper {
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    z-index: 1996;
+    .@{dialog-prefix-cls}-content {
+      width: 420px;
+      border-radius: 5px;
+      background: @dialog_content_bg_color;
+      @media (max-width: 767px) {
+        width: 270px;
+        border-radius: 10px;
+        text-align: center;
+      }
+      .@{dialog-prefix-cls}-head {
+        padding: 15px;
+        padding-bottom: 0;
+        font-size: @font_size_large;
+        color: @text_color_active;
+      }
+      .@{dialog-prefix-cls}-text {
+        padding: 20px 15px;
+        line-height: 22px;
+        font-size: @font_size_medium;
+        color: @dialog_text_color;
+      }
+      .@{dialog-prefix-cls}-btns {
+        display: flex;
+        align-items: center;
+        padding: 0 15px 10px;
+        text-align: center;
+        color: @dialog_text_color;
+        @media (min-width: 768px) {
+          justify-content: flex-end;
+          div {
+            display: block;
+            padding: 8px 15px;
+            border-radius: 3px;
+            border: 1px solid @btn_color;
+            font-size: @font_size_medium;
+            cursor: pointer;
+            &:not(:nth-of-type(1)) {
+              margin-left: 10px;
+            }
+            &.mm-btn-confirm {
+              border-style: @btn_color_active;
+            }
+            &:hover {
+              color: @text_color_active;
+              border: 1px solid @btn_color_active;
+            }
+          }
+        }
+        @media (max-width: 767px) {
+          & {
+            padding: 0;
+            justify-content: center;
+            div {
+              flex: 1;
+              line-height: 22px;
+              padding: 10px 0;
+              border-top: 1px solid @dialog_line_color;
+              font-size: @font_size_large;
+              &:not(:nth-of-type(1)) {
+                border-left: 1px solid @dialog_line_color;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+@keyframes mm-dialog-fadein {
+  0% {
+    opacity: 0;
+  }
+  100% {
+    opacity: 1;
+  }
+}
+
+@keyframes mm-dialog-zoom {
+  0% {
+    transform: scale(0);
+  }
+  50% {
+    transform: scale(1.1);
+  }
+  100% {
+    transform: scale(1);
+  }
+}
+</style>

+ 53 - 0
out/production/adsp-vue/base/mm-icon/mm-icon.vue

@@ -0,0 +1,53 @@
+<!-- icon 组件 -->
+<script>
+export default {
+  name: 'MmIcon',
+  props: {
+    type: {
+      type: String,
+      required: true
+    },
+    size: {
+      type: Number,
+      default: 16
+    }
+  },
+  methods: {
+    getIconCls() {
+      return `icon-${this.type}`
+    },
+    getIconStyle() {
+      return { fontSize: this.size + 'px' }
+    },
+    onClick(e) {
+      this.$emit('click', e)
+    }
+  },
+  render() {
+    const Icon = (
+      <i
+        onClick={this.onClick}
+        class={`iconfont ${this.getIconCls()}`}
+        style={this.getIconStyle()}
+      />
+    )
+    return Icon
+  }
+}
+</script>
+
+<style lang="less">
+.iconfont {
+  display: inline-block;
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  line-height: 1;
+  vertical-align: baseline;
+  text-transform: none;
+  speak: none;
+  /* Better Font Rendering =========== */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+</style>

+ 86 - 0
out/production/adsp-vue/base/mm-loading/mm-loading.vue

@@ -0,0 +1,86 @@
+<template>
+  <!--加载动画-->
+  <div
+    v-show="value"
+    class="mm-loading"
+    :style="{backgroundColor:loadingBgColor}"
+  >
+    <div class="mm-loading-content">
+      <svg class="circular" viewBox="25 25 50 50">
+        <circle class="path" cx="50" cy="50" r="20" fill="none" />
+      </svg>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'MmLoading',
+  props: {
+    // 是否显示
+    value: {
+      type: Boolean,
+      default: true
+    },
+    // 加载动画背景颜色
+    loadingBgColor: {
+      type: String,
+      default: ''
+    }
+  }
+}
+</script>
+
+<style lang="less">
+.mm-loading {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  z-index: 1996;
+  background: @load_bg_color;
+  .mm-loading-content {
+    position: absolute;
+    top: 50%;
+    width: 100%;
+    transform: translateY(-50%);
+    text-align: center;
+    .circular {
+      height: 50px;
+      width: 50px;
+      animation: loading-rotate 2s linear infinite;
+      .path {
+        animation: loading-dash 1.5s ease-in-out infinite;
+        stroke-dasharray: 90, 150;
+        stroke-dashoffset: 0;
+        stroke-width: 2;
+        stroke: @text_color;
+        stroke-linecap: round;
+      }
+    }
+  }
+}
+
+//动画函数
+@keyframes loading-rotate {
+  100% {
+    transform: rotate(360deg);
+  }
+}
+
+@keyframes loading-dash {
+  0% {
+    stroke-dasharray: 1, 200;
+    stroke-dashoffset: 0;
+  }
+  50% {
+    stroke-dasharray: 90, 150;
+    stroke-dashoffset: -40px;
+  }
+  100% {
+    stroke-dasharray: 90, 150;
+    stroke-dashoffset: -120px;
+  }
+}
+</style>

+ 34 - 0
out/production/adsp-vue/base/mm-no-result/mm-no-result.vue

@@ -0,0 +1,34 @@
+<template>
+  <!--暂无数据提示-->
+  <div class="mm-no-result">
+    <p class="mm-no-result-text">{{ title }}</p>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'MmNoResult',
+  props: {
+    // 无数据提示文本
+    title: {
+      type: String,
+      default: ''
+    }
+  }
+}
+</script>
+
+<style lang="less">
+.mm-no-result {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  width: 100%;
+  height: 100%;
+  &-text {
+    margin-top: 30px;
+    font-size: @font_size_medium;
+    color: @text_color;
+  }
+}
+</style>

+ 178 - 0
out/production/adsp-vue/base/mm-progress/mm-progress.vue

@@ -0,0 +1,178 @@
+<template>
+  <!--进度条拖动-->
+  <div ref="mmProgress" class="mmProgress" @click="barClick">
+    <div class="mmProgress-bar"></div>
+    <div ref="mmPercentProgress" class="mmProgress-outer"></div>
+    <div ref="mmProgressInner" class="mmProgress-inner">
+      <div
+        class="mmProgress-dot"
+        @mousedown="barDown"
+        @touchstart.prevent="barDown"
+      ></div>
+    </div>
+  </div>
+</template>
+
+<script>
+const dotWidth = 10
+export default {
+  name: 'MmProgress',
+  props: {
+    // 进度值一
+    percent: {
+      type: [Number],
+      default: 0
+    },
+    // 进度值二(歌曲缓冲进度用)
+    percentProgress: {
+      type: [Number],
+      default: 0
+    }
+  },
+  data() {
+    return {
+      move: {
+        status: false, // 是否可拖动
+        startX: 0, // 记录最开始点击的X坐标
+        left: 0 // 记录当前已经移动的距离
+      }
+    }
+  },
+  watch: {
+    percent(newPercent) {
+      if (newPercent >= 0 && !this.move.status) {
+        const barWidth = this.$refs.mmProgress.clientWidth - dotWidth
+        const offsetWidth = newPercent * barWidth
+        this.moveSilde(offsetWidth)
+      }
+    },
+    percentProgress(newValue) {
+      let offsetWidth = this.$refs.mmProgress.clientWidth * newValue
+      this.$refs.mmPercentProgress.style.width = `${offsetWidth}px`
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.bindEvents()
+      const barWidth = this.$refs.mmProgress.clientWidth - dotWidth
+      const offsetWidth = this.percent * barWidth
+      this.moveSilde(offsetWidth)
+    })
+  },
+  beforeDestroy() {
+    this.unbindEvents()
+  },
+  methods: {
+    // 添加绑定事件
+    bindEvents() {
+      document.addEventListener('mousemove', this.barMove)
+      document.addEventListener('mouseup', this.barUp)
+
+      document.addEventListener('touchmove', this.barMove)
+      document.addEventListener('touchend', this.barUp)
+    },
+    // 移除绑定事件
+    unbindEvents() {
+      document.removeEventListener('mousemove', this.barMove)
+      document.removeEventListener('mouseup', this.barUp)
+
+      document.removeEventListener('touchmove', this.barMove)
+      document.removeEventListener('touchend', this.barUp)
+    },
+    // 点击事件
+    barClick(e) {
+      let rect = this.$refs.mmProgress.getBoundingClientRect()
+      let offsetWidth = Math.min(
+        this.$refs.mmProgress.clientWidth - dotWidth,
+        Math.max(0, e.clientX - rect.left)
+      )
+      this.moveSilde(offsetWidth)
+      this.commitPercent(true)
+    },
+    // 鼠标按下事件
+    barDown(e) {
+      this.move.status = true
+      this.move.startX = e.clientX || e.touches[0].pageX
+      this.move.left = this.$refs.mmProgressInner.clientWidth
+    },
+    // 鼠标/触摸移动事件
+    barMove(e) {
+      if (!this.move.status) {
+        return false
+      }
+      e.preventDefault()
+      let endX = e.clientX || e.touches[0].pageX
+      let dist = endX - this.move.startX
+      let offsetWidth = Math.min(
+        this.$refs.mmProgress.clientWidth - dotWidth,
+        Math.max(0, this.move.left + dist)
+      )
+      this.moveSilde(offsetWidth)
+      this.commitPercent()
+    },
+    // 鼠标/触摸释放事件
+    barUp(e) {
+      if (this.move.status) {
+        this.commitPercent(true)
+        this.move.status = false
+      }
+    },
+    // 移动滑块
+    moveSilde(offsetWidth) {
+      this.$refs.mmProgressInner.style.width = `${offsetWidth}px`
+    },
+    // 修改 percent
+    commitPercent(isEnd = false) {
+      const { mmProgress, mmProgressInner } = this.$refs
+      const lineWidth = mmProgress.clientWidth - dotWidth
+      const percent = mmProgressInner.clientWidth / lineWidth
+      this.$emit(isEnd ? 'percentChangeEnd' : 'percentChange', percent)
+    }
+  }
+}
+</script>
+
+<style lang="less">
+.mmProgress {
+  position: relative;
+  padding: 5px;
+  user-select: none;
+  cursor: pointer;
+  overflow: hidden;
+  .mmProgress-bar {
+    height: 2px;
+    width: 100%;
+    background: @bar_color;
+  }
+  .mmProgress-outer {
+    position: absolute;
+    top: 50%;
+    left: 5px;
+    display: inline-block;
+    width: 0;
+    height: 2px;
+    margin-top: -1px;
+    background: rgba(255, 255, 255, 0.2);
+  }
+  .mmProgress-inner {
+    position: absolute;
+    top: 50%;
+    left: 5px;
+    display: inline-block;
+    width: 0;
+    height: 2px;
+    margin-top: -1px;
+    background: @line_color;
+    .mmProgress-dot {
+      position: absolute;
+      top: 50%;
+      right: -5px;
+      width: 10px;
+      height: 10px;
+      border-radius: 50%;
+      background-color: @dot_color;
+      transform: translateY(-50%);
+    }
+  }
+}
+</style>

+ 39 - 0
out/production/adsp-vue/base/mm-toast/index.js

@@ -0,0 +1,39 @@
+import TempToast from './mm-toast.vue'
+
+let instance
+let showToast = false
+let time // 存储toast显示状态
+const mmToast = {
+  install(Vue, options = {}) {
+    let opt = TempToast.data() // 获取组件中的默认配置
+    Object.assign(opt, options) // 合并配置
+    Vue.prototype.$mmToast = (message, position) => {
+      if (showToast) {
+        clearTimeout(time)
+        instance.vm.visible = showToast = false
+        document.body.removeChild(instance.vm.$el)
+        // return;// 如果toast还在,则不再执行
+      }
+      if (message) {
+        opt.message = message // 如果有传message,则使用所传的message
+      }
+      if (position) {
+        opt.position = position // 如果有传type,则使用所传的type
+      }
+      let TempToastConstructor = Vue.extend(TempToast)
+      instance = new TempToastConstructor({
+        data: opt
+      })
+      instance.vm = instance.$mount()
+      document.body.appendChild(instance.vm.$el)
+      instance.vm.visible = showToast = true
+
+      time = setTimeout(function() {
+        instance.vm.visible = showToast = false
+        document.body.removeChild(instance.vm.$el)
+      }, opt.duration)
+    }
+  }
+}
+
+export default mmToast

+ 73 - 0
out/production/adsp-vue/base/mm-toast/mm-toast.vue

@@ -0,0 +1,73 @@
+<template>
+  <!--弹出层提示-->
+  <transition name="toast-fade">
+    <div v-show="visible" class="mm-toast" :class="positionClasss">{{ message }}</div>
+  </transition>
+</template>
+
+<script>
+export default {
+  name: 'MmToast',
+  data() {
+    return {
+      position: 'center', // 默认显示位置
+      message: '', // 默认显示文本
+      duration: 1500, // 显示时间, 毫秒
+      visible: false // 是否显示
+    }
+  },
+  computed: {
+    positionClasss() {
+      return 'mm-toast-' + this.position
+    }
+  }
+}
+</script>
+
+<style lang="less">
+@prefix-cls: mm-toast;
+
+.@{prefix-cls} {
+  position: fixed;
+  left: 50%;
+  z-index: 1996;
+  max-width: 80%;
+  box-sizing: border-box;
+  border-radius: 5px;
+  padding: 10px 20px;
+  overflow: hidden;
+  text-align: center;
+  min-height: 40px;
+  line-height: 20px;
+  font-size: 14px;
+  color: #fff;
+  background: rgba(0, 0, 0, 0.5);
+  user-select: none;
+  transform: translateX(-50%);
+  &&-top {
+    top: 10%;
+  }
+  &&-center {
+    top: 50%;
+    margin-top: -20px;
+  }
+  &&-bottom {
+    bottom: 10%;
+  }
+}
+
+.toast-fade-enter {
+  opacity: 0;
+  transform: translate3d(-50%, -10px, 0);
+}
+
+.toast-fade-enter-active {
+  will-change: transform;
+  transition: all 0.2s;
+}
+
+.toast-fade-enter-to {
+  opacity: 1;
+  transform: translate3d(-50%, 0, 0);
+}
+</style>

+ 73 - 0
out/production/adsp-vue/cas/sso.js

@@ -0,0 +1,73 @@
+import Vue from 'vue'
+import { ACCESS_TOKEN } from "@/store/mutation-types"
+import store from '@/store'
+/**
+ * 单点登录
+ */
+const init = (callback) => {
+  console.log("-------单点登录开始-------");
+  let token = Vue.ls.get(ACCESS_TOKEN);
+  let st = getUrlParam("ticket");
+  let sevice = "http://"+window.location.host+"/";
+  if(token){
+    loginSuccess(callback);
+  }else{
+    if(st){
+      validateSt(st,sevice,callback);
+    }else{
+      let serviceUrl = encodeURIComponent(sevice);
+      window.location.href = window._CONFIG['casPrefixUrl']+"/login?service="+serviceUrl;
+    }
+  }
+  console.log("-------单点登录结束-------");
+};
+const SSO = {
+  init: init
+};
+
+function getUrlParam(paraName) {
+  let url = document.location.toString();
+  let arrObj = url.split("?");
+
+  if (arrObj.length > 1) {
+    let arrPara = arrObj[1].split("&");
+    let arr;
+
+    for (let i = 0; i < arrPara.length; i++) {
+      arr = arrPara[i].split("=");
+
+      if (arr != null && arr[0] == paraName) {
+        return arr[1];
+      }
+    }
+    return "";
+  }
+  else {
+    return "";
+  }
+}
+
+function validateSt(ticket,service,callback){
+  let params = {
+    ticket: ticket,
+    service:service
+  };
+  store.dispatch('ValidateLogin',params).then(res => {
+    //this.departConfirm(res)
+    if(res.success){
+      loginSuccess(callback);
+    }else{
+      let sevice = "http://"+window.location.host+"/";
+      let serviceUrl = encodeURIComponent(sevice);
+      window.location.href = window._CONFIG['casPrefixUrl']+"/login?service="+serviceUrl;
+    }
+  }).catch((err) => {
+    console.log(err);
+    //that.requestFailed(err);
+  });
+}
+
+function loginSuccess (callback) {
+  callback();
+}
+export default SSO;

+ 46 - 0
out/production/adsp-vue/components/AvatarList/Item.vue

@@ -0,0 +1,46 @@
+<template>
+  <tooltip v-if="tips !== ''">
+    <template slot="title">{{ tips }}</template>
+    <avatar :size="avatarSize" :src="src"/>
+  </tooltip>
+  <avatar v-else :size="avatarSize" :src="src"/>
+</template>
+
+<script>
+  import Avatar from 'ant-design-vue/es/avatar'
+  import Tooltip from 'ant-design-vue/es/tooltip'
+
+  export default {
+    name: "AvatarItem",
+    components: {
+      Avatar,
+      Tooltip
+    },
+    props: {
+      tips: {
+        type: String,
+        default: '',
+        required: false
+      },
+      src: {
+        type: String,
+        default: ''
+      }
+    },
+    data() {
+      return {
+        size: this.$parent.size
+      }
+    },
+    computed: {
+      avatarSize() {
+        return this.size !== 'mini' && this.size || 20
+      }
+    },
+    watch: {
+      '$parent.size'(val) {
+        this.size = val
+      }
+    }
+  }
+</script>

+ 100 - 0
out/production/adsp-vue/components/AvatarList/List.vue

@@ -0,0 +1,100 @@
+<!--
+<template>
+  <div :class="[prefixCls]">
+    <ul>
+      <slot></slot>
+      <template v-for="item in filterEmpty($slots.default).slice(0, 3)"></template>
+
+
+      <template v-if="maxLength > 0 && filterEmpty($slots.default).length > maxLength">
+        <avatar-item :size="size">
+          <avatar :size="size !== 'mini' && size || 20" :style="excessItemsStyle">{{ `+${maxLength}` }}</avatar>
+        </avatar-item>
+      </template>
+    </ul>
+  </div>
+</template>
+-->
+
+<script>
+  import Avatar from 'ant-design-vue/es/avatar'
+  import AvatarItem from './Item'
+  import { filterEmpty } from '@/components/_util/util'
+
+  export default {
+    AvatarItem,
+    name: "AvatarList",
+    components: {
+      Avatar,
+      AvatarItem
+    },
+    props: {
+      prefixCls: {
+        type: String,
+        default: 'ant-pro-avatar-list'
+      },
+      /**
+       * 头像大小 类型: large、small 、mini, default
+       * 默认值: default
+       */
+      size: {
+        type: [String, Number],
+        default: 'default'
+      },
+      /**
+       * 要显示的最大项目
+       */
+      maxLength: {
+        type: Number,
+        default: 0
+      },
+      /**
+       * 多余的项目风格
+       */
+      excessItemsStyle: {
+        type: Object,
+        default: () => {
+          return {
+            color: '#f56a00',
+            backgroundColor: '#fde3cf'
+          }
+        }
+      }
+    },
+    data () {
+      return {}
+    },
+    methods: {
+      getItems(items) {
+        const classString = {
+          [`${this.prefixCls}-item`]: true,
+          [`${this.size}`]: true
+        }
+
+        if (this.maxLength > 0) {
+          items = items.slice(0, this.maxLength)
+          items.push((<Avatar size={ this.size } style={ this.excessItemsStyle }>{`+${this.maxLength}`}</Avatar>))
+        }
+        const itemList = items.map((item) => (
+          <li class={ classString }>{ item }</li>
+        ))
+        return itemList
+      }
+    },
+    render () {
+      const { prefixCls, size } = this.$props
+      const classString = {
+        [`${prefixCls}`]: true,
+        [`${size}`]: true,
+      }
+      const items = filterEmpty(this.$slots.default)
+      const itemsDom = items && items.length ? <ul class={`${prefixCls}-items`}>{ this.getItems(items) }</ul> : null
+
+      return (
+        <div class={ classString }>
+          { itemsDom }
+        </div>
+      )
+    }
+  }
+</script>

+ 4 - 0
out/production/adsp-vue/components/AvatarList/index.js

@@ -0,0 +1,4 @@
+import AvatarList from './List'
+import "./index.less"
+
+export default AvatarList

+ 60 - 0
out/production/adsp-vue/components/AvatarList/index.less

@@ -0,0 +1,60 @@
+@import "../index";
+
+@avatar-list-prefix-cls: ~"@{ant-pro-prefix}-avatar-list";
+@avatar-list-item-prefix-cls: ~"@{ant-pro-prefix}-avatar-list-item";
+
+.@{avatar-list-prefix-cls} {
+  display: inline-block;
+
+  ul {
+    list-style: none;
+    display: inline-block;
+    padding: 0;
+    margin: 0 0 0 8px;
+    font-size: 0;
+  }
+}
+
+.@{avatar-list-item-prefix-cls} {
+  display: inline-block;
+  font-size: @font-size-base;
+  margin-left: -8px;
+  width: @avatar-size-base;
+  height: @avatar-size-base;
+
+  :global {
+    .ant-avatar {
+      border: 1px solid #fff;
+      cursor: pointer;
+    }
+  }
+
+  &.large {
+    width: @avatar-size-lg;
+    height: @avatar-size-lg;
+  }
+
+  &.small {
+    width: @avatar-size-sm;
+    height: @avatar-size-sm;
+  }
+
+  &.mini {
+    width: 20px;
+    height: 20px;
+
+    :global {
+      .ant-avatar {
+        width: 20px;
+        height: 20px;
+        line-height: 20px;
+
+        .ant-avatar-string {
+          font-size: 12px;
+          line-height: 18px;
+        }
+      }
+    }
+  }
+}
+

+ 146 - 0
out/production/adsp-vue/components/ChartCard.vue

@@ -0,0 +1,146 @@
+<template>
+  <a-card :loading="loading" :body-style="{ padding: '20px 24px 8px' }" :bordered="false">
+    <div class="chart-card-header">
+      <div class="meta">
+        <span class="chart-card-title">{{ title }}</span>
+        <span class="chart-card-action">
+          <slot name="action"></slot>
+        </span>
+      </div>
+      <div class="total" style="display: flex; justify-content: space-between">
+        <span>{{ total }}</span>
+        <span>
+          <slot name="percentage"></slot>
+        </span>
+      </div>
+    </div>
+    <div class="chart-card-content">
+      <div class="content-fix">
+        <slot></slot>
+      </div>
+    </div>
+    <div class="chart-card-footer">
+      <div class="field">
+        <slot name="footer"></slot>
+      </div>
+    </div>
+  </a-card>
+</template>
+
+<script>
+export default {
+  name: 'ChartCard',
+  props: {
+    title: {
+      type: String,
+      default: '',
+    },
+    total: {
+      type: String,
+      default: '',
+    },
+    loading: {
+      type: Boolean,
+      default: false,
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.chart-card-header {
+  position: relative;
+  overflow: hidden;
+  width: 100%;
+
+  .meta {
+    position: relative;
+    overflow: hidden;
+    width: 100%;
+    color: rgba(0, 0, 0, 0.45);
+    font-size: 14px;
+    line-height: 22px;
+  }
+}
+
+.chart-card-action {
+  cursor: pointer;
+  position: absolute;
+  top: 0;
+  right: 0;
+}
+
+.chart-card-footer {
+  border-top: 1px solid #e8e8e8;
+  padding-top: 9px;
+  margin-top: 8px;
+
+  > * {
+    position: relative;
+  }
+
+  .field {
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    margin: 0;
+  }
+}
+
+.chart-card-content {
+  margin-bottom: 12px;
+  position: relative;
+  height: 46px;
+  width: 100%;
+
+  .content-fix {
+    position: absolute;
+    left: 0;
+    bottom: 0;
+    width: 100%;
+  }
+}
+
+.total {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  white-space: nowrap;
+  color: #000;
+  margin-top: 4px;
+  margin-bottom: 0;
+  font-size: 30px;
+  line-height: 38px;
+  height: 38px;
+}
+
+@media (min-width: 1600px) {
+  .total {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    word-break: break-all;
+    white-space: nowrap;
+    color: #000;
+    margin-top: 4px;
+    margin-bottom: 0;
+    font-size: 30px;
+    line-height: 38px;
+    height: 38px;
+  }
+}
+
+@media (max-width: 1599px) {
+  .total {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    word-break: break-all;
+    white-space: nowrap;
+    color: #000;
+    margin-top: 4px;
+    margin-bottom: 0;
+    font-size: 18px;
+    line-height: 38px;
+    height: 38px;
+  }
+}
+</style>

+ 103 - 0
out/production/adsp-vue/components/CountDown/CountDown.vue

@@ -0,0 +1,103 @@
+<template>
+  <span>
+    {{ lastTime | format }}
+  </span>
+</template>
+
+<script>
+
+  function fixedZero(val) {
+    return val * 1 < 10 ? `0${val}` : val;
+  }
+
+  export default {
+    name: "CountDown",
+    props: {
+      format: {
+        type: Function,
+        default: undefined
+      },
+      target: {
+        type: [Date, Number],
+        required: true,
+      },
+      onEnd: {
+        type: Function,
+        default: () => {
+        }
+      }
+    },
+    data() {
+      return {
+        dateTime: '0',
+        originTargetTime: 0,
+        lastTime: 0,
+        timer: 0,
+        interval: 1000
+      }
+    },
+    filters: {
+      format(time) {
+        const hours = 60 * 60 * 1000;
+        const minutes = 60 * 1000;
+
+        const h = Math.floor(time / hours);
+        const m = Math.floor((time - h * hours) / minutes);
+        const s = Math.floor((time - h * hours - m * minutes) / 1000);
+        return `${fixedZero(h)}:${fixedZero(m)}:${fixedZero(s)}`
+      }
+    },
+    created() {
+      this.initTime()
+      this.tick()
+    },
+    methods: {
+      initTime() {
+        let lastTime = 0;
+        let targetTime = 0;
+        this.originTargetTime = this.target
+        try {
+          if (Object.prototype.toString.call(this.target) === '[object Date]') {
+            targetTime = this.target
+          } else {
+            targetTime = new Date(this.target).getTime()
+          }
+        } catch (e) {
+          throw new Error('invalid target prop')
+        }
+
+        lastTime = targetTime - new Date().getTime();
+
+        this.lastTime = lastTime < 0 ? 0 : lastTime
+      },
+      tick() {
+        const {onEnd} = this
+
+        this.timer = setTimeout(() => {
+          if (this.lastTime < this.interval) {
+            clearTimeout(this.timer)
+            this.lastTime = 0
+            if (typeof onEnd === 'function') {
+              onEnd();
+            }
+          } else {
+            this.lastTime -= this.interval
+            this.tick()
+          }
+        }, this.interval)
+      }
+    },
+    beforeUpdate() {
+      if (this.originTargetTime !== this.target) {
+        this.initTime()
+      }
+    },
+    beforeDestroy() {
+      clearTimeout(this.timer)
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 3 - 0
out/production/adsp-vue/components/CountDown/index.js

@@ -0,0 +1,3 @@
+import CountDown from './CountDown'
+
+export default CountDown

+ 215 - 0
out/production/adsp-vue/components/DatePicker.vue

@@ -0,0 +1,215 @@
+<template>
+  <!-- 组件使用时 需要传入属性 openOptions:true|false 控制是否打开
+    left :string|0  left为侧边的按钮的定位 0 表示不改变 或者传入字符串 如-100px 表示css中left:-100px
+  -->
+  <div class="datePicker" >
+    <a-range-picker v-clickoutside="handleClose"
+      v-model="dateValue"
+      style="width:250px;"
+      :allowClear=false
+      :open="openOptions"
+      :disabled-date="disabledDate"
+      :openChange="openChange"
+      @change="onChange"
+    />
+    <div class="pickOptions" v-show="openOptions" ref="pickOptions">
+      <div v-for="item in pickOptions" :key="item.key" @click="changeDate(item)" class="btn">{{item.title}}</div>
+    </div>
+  </div>
+</template>
+
+
+<script>
+const clickoutside = {
+  // 初始化指令
+  bind(el, binding, vnode) {
+    function documentHandler(e) {
+      // 这里判断点击的元素是否是本身,是本身,则返回
+      if (el.contains(e.target)) {
+        return false
+      }
+      // 判断指令中是否绑定了函数
+      if (binding.expression) {
+        // 如果绑定了函数 则调用那个函数,此处binding.value就是handleClose方法
+        binding.value(e)
+      }
+    }
+    // 给当前元素绑定个私有变量,方便在unbind中可以解除事件监听
+    el.__vueClickOutside__ = documentHandler
+    document.addEventListener('click', documentHandler)
+  },
+  update() {},
+  unbind(el, binding) {
+    // 解除事件监听
+    document.removeEventListener('click', el.__vueClickOutside__)
+    delete el.__vueClickOutside__
+  }
+}
+import moment from 'moment'
+let pickOptions = [
+  {
+    title: '今天',
+    key: '1',
+    value: 1,
+    dateValue: [moment(), moment()]
+  },
+  {
+    title: '昨天',
+    key: '2',
+    value: 2,
+    dateValue: [moment().subtract(1, 'days'), moment().subtract(1, 'days')]
+  },
+  {
+    title: '一周',
+    key: '3',
+    value: 3,
+    dateValue: [moment().subtract(7, 'days'), moment().subtract(1, 'days')]
+  },
+  {
+    title: '一个月',
+    key: '5',
+    value: 5,
+    dateValue: [
+      moment()
+        .subtract(1, 'days')
+        .subtract(1, 'months'),
+      moment().subtract(1, 'days')
+    ]
+  },
+  {
+    title: '三个月',
+    key: '6',
+    value: 6,
+    dateValue: [
+      moment()
+        .subtract(1, 'days')
+        .subtract(3, 'months'),
+      moment().subtract(1, 'days')
+    ]
+  },
+  {
+    title: '六个月',
+    key: '7',
+    value: 7,
+    dateValue: [
+      moment()
+        .subtract(1, 'days')
+        .subtract(6, 'months'),
+      moment().subtract(1, 'days')
+    ]
+  },
+  {
+    title: '一年',
+    key: '8',
+    value: 8,
+    dateValue: [
+      moment().subtract(1, 'days').subtract(1, 'years'),
+      moment().subtract(1, 'days')
+    ]
+  }
+]
+
+export default {
+  props: ['openOptions', 'left','parentDate', 'typemain'],
+  data() {
+    return {
+      moment,
+      dateValue: [moment(),moment()],
+      type: 0,
+      pickOptions
+      // pickOptions:JSON.parse(JSON.stringify(pickOptions))
+    }
+  },
+  directives: { clickoutside },
+  watch: {
+    parentDate(n,o){
+        if(n[0].format('YYYY-MM-DD')!=this.dateValue[0].format('YYYY-MM-DD')){
+              this.dateValue=n
+        } 
+    }
+  },
+  methods: {
+    //日期改变事件
+    onChange(date, dateString) {
+      this.dateValue = date
+      // console.log(this.dateValue)
+      if (dateString.length == 2) {
+        this.$parent.opendate()
+        this.$parent.type = 9
+        this.$parent.dateValue = date
+      }
+    },
+    //侧边的按钮点击事件
+    changeDate(val) {
+      this.type = val.value
+      this.dateValue = val.dateValue
+      //  console.log(this.dateValue)
+      this.$parent.type = val.value
+      this.$parent.dateValue = val.dateValue
+    },
+    handleClose(e) {
+        // console.log(e)
+        if(e.target.className){
+            if(e.target.className.indexOf('ant-calendar')==-1){
+                this.$parent.opendateClose()
+            }
+        }
+            
+      
+    },
+    disabledDate(current) {
+      // console.log(current)
+      // moment().subtract(1, 'quarters')
+      if (this.typemain && this.typemain === 'ksVideo') {
+        return (current && current < moment().subtract(1, 'quarters')) || (current && current > moment().subtract(1, 'day'))
+      }
+      else {
+        return current && current > moment().subtract(1, 'day')
+      }
+      
+    },
+    openChange(open) {
+      // console.log(open)
+    }
+  },
+  mounted() {
+    this.dateValue = [moment(), moment()]
+    if (this.left) {
+      this.$refs.pickOptions.style.left = this.left
+    }
+    if(this.parentDate){
+      this.dateValue=this.parentDate
+    }
+    if (this.typemain && this.typemain === 'ksVideo') {
+      this.pickOptions = this.pickOptions.slice(0, 4);
+    }
+    // console.log(this.$refs.pickOptions.style.left)
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.datePicker {
+  position: relative;
+  .pickOptions {
+    width: 100px;
+    background-color: #fff;
+    height: 302px;
+    position: absolute;
+    top: -2px;
+    left: -402px;
+    border-right: 1px solid #999;
+    box-shadow: 0 0 15px rgba(0, 0, 0, 0.1);
+    cursor: pointer;
+    z-index: 3;
+    div {
+      height: 43px;
+      padding: 10px 15px;
+      box-sizing: border-box;
+    }
+    .btn:hover{
+        color: #1890ff;
+    }
+  }
+}
+</style>

+ 71 - 0
out/production/adsp-vue/components/Ellipsis/Ellipsis.vue

@@ -0,0 +1,71 @@
+<script>
+  import Tooltip from 'ant-design-vue/es/tooltip'
+  import {cutStrByFullLength, getStrFullLength} from '@/components/_util/StringUtil'
+  /*
+    const isSupportLineClamp = document.body.style.webkitLineClamp !== undefined;
+
+    const TooltipOverlayStyle = {
+      overflowWrap: 'break-word',
+      wordWrap: 'break-word',
+    };
+  */
+
+  export default {
+    name: 'Ellipsis',
+    components: {
+      Tooltip
+    },
+    props: {
+      prefixCls: {
+        type: String,
+        default: 'ant-pro-ellipsis'
+      },
+      tooltip: {
+        type: Boolean
+      },
+      length: {
+        type: Number,
+        required: true
+      },
+      lines: {
+        type: Number,
+        default: 1
+      },
+      fullWidthRecognition: {
+        type: Boolean,
+        default: false
+      }
+    },
+    methods: {
+      getStrDom(str) {
+        return (
+          < span > {cutStrByFullLength(str, this.length
+      )
+        +'...'
+      }<
+        /span>
+      )
+      },
+      getTooltip(fullStr) {
+        return (
+          < Tooltip >
+          < template
+        slot = "title" > {fullStr} < /template>
+        {
+          this.getStrDom(fullStr)
+        }
+      <
+        /Tooltip>
+      )
+      }
+    },
+    render() {
+      const {tooltip, length} = this.$props
+      let str = this.$slots.default.map(vNode => vNode.text).join("")
+      const strDom = tooltip && getStrFullLength(str) > length ? this.getTooltip(str) : this.getStrDom(str);
+      return (
+        strDom
+      )
+    }
+  }
+</script>

+ 3 - 0
out/production/adsp-vue/components/Ellipsis/index.js

@@ -0,0 +1,3 @@
+import Ellipsis from './Ellipsis'
+
+export default Ellipsis

+ 54 - 0
out/production/adsp-vue/components/NumberInfo/NumberInfo.vue

@@ -0,0 +1,54 @@
+<template>
+  <div :class="[prefixCls]">
+    <slot name="subtitle">
+      <div :class="[`${prefixCls}-subtitle`]">{{ typeof subTitle === 'string' ? subTitle : subTitle() }}</div>
+    </slot>
+    <div class="number-info-value">
+      <span>{{ total }}</span>
+      <span class="sub-total">
+        {{ subTotal }}
+        <icon :type="`caret-${status}`"/>
+      </span>
+    </div>
+  </div>
+</template>
+
+<script>
+  import Icon from 'ant-design-vue/es/icon'
+
+  export default {
+    name: 'NumberInfo',
+    props: {
+      prefixCls: {
+        type: String,
+        default: 'ant-pro-number-info'
+      },
+      total: {
+        type: Number,
+        required: true
+      },
+      subTotal: {
+        type: Number,
+        required: true
+      },
+      subTitle: {
+        type: [String, Function],
+        default: ''
+      },
+      status: {
+        type: String,
+        default: 'up'
+      }
+    },
+    components: {
+      Icon
+    },
+    data() {
+      return {}
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+ // @import "index";
+</style>

+ 3 - 0
out/production/adsp-vue/components/NumberInfo/index.js

@@ -0,0 +1,3 @@
+import NumberInfo from './NumberInfo'
+
+export default NumberInfo

+ 58 - 0
out/production/adsp-vue/components/NumberInfo/index.less

@@ -0,0 +1,58 @@
+@import "../index";
+
+@numberInfo-prefix-cls: ~"@{ant-pro-prefix}-number-info";
+
+.@{numberInfo-prefix-cls} {
+
+  .ant-pro-number-info-subtitle {
+    color: @text-color-secondary;
+    font-size: @font-size-base;
+    height: 22px;
+    line-height: 22px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    word-break: break-all;
+    white-space: nowrap;
+  }
+
+  .number-info-value {
+    margin-top: 4px;
+    font-size: 0;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    word-break: break-all;
+    white-space: nowrap;
+
+    & > span {
+      color: @heading-color;
+      display: inline-block;
+      line-height: 32px;
+      height: 32px;
+      font-size: 24px;
+      margin-right: 32px;
+    }
+
+    .sub-total {
+      color: @text-color-secondary;
+      font-size: @font-size-lg;
+      vertical-align: top;
+      margin-right: 0;
+
+      i {
+        font-size: 12px;
+        transform: scale(0.82);
+        margin-left: 4px;
+      }
+
+      :global {
+        .anticon-caret-up {
+          color: @red-6;
+        }
+
+        .anticon-caret-down {
+          color: @green-6;
+        }
+      }
+    }
+  }
+}

+ 43 - 0
out/production/adsp-vue/components/README.md

@@ -0,0 +1,43 @@
+####1._util包:存放自定义函数 详细见代码注释
+####2.AvatarList:显示头像群并支持tip,用法参考src\views\Home.vue(如下图)
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12181253_O0Xi.png "在这里输入图片标题")
+####3.chart包:存放各种图表相关的组件,条形图柱形图折线图等等 具体用法参考首页
+####4.countDown包:一个倒计时组件,用法参考home页,简单描述,该组件有3个属性,
+target(时间/毫秒数)必填,
+format(function,该方法接收一个毫秒数的参数,用于格式化显示当前倒计时时间)非必填,
+onEnd倒计时结束触发函数
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12182046_mwqJ.png "在这里输入图片标题")
+####5.dict包:数据字典专用,用法参考文件夹下readme文件
+####6.Ellipsis包:字符串截取组件,可以指定字符串的显示长度,并将全部内容显示到tip中,简单使用参考src\views\system\PermissionList.vue
+####7.jeecg包:该包下自定义了很多列表/表单中用到的组件 参考包下readme文件
+####8.jeecgbiz包:该包下定义了一些业务相关的组件,比如选择用户弹框,根据部门选择用户等等
+####9.layouts+page包:系统页面布局相关组件,比如登录进去之后页面顶部显示什么,底部显示什么,菜单点击触发多个tab的布局等等 一般情况不需要修改
+####10.menun包:菜单组件,俩个,一个折叠菜单一个正常显示的菜单
+####11.NumberInfo:数字信息显示组件 如下图
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12185858_uvJ5.png "在这里输入图片标题")
+####12.online包:该包下封装了online表单的相关组件,用于展示表单各种控件,验证表单等等,相关用法参考readme
+####13.setting包:该包下封装了首页风格切换等功能如下图
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12190520_jySG.png "在这里输入图片标题")
+####14.table包:一个二次封装的table组件,用于展示列表,参考readme
+####15.tools包:
+Breadcrumb.vue:面包屑二次封装,支持路由跳转
+DetailList.vue:详情展示用法参考src\views\profile\advanced\Advanced.vue(效果如下图)
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12193954_Uar6.png "在这里输入图片标题")
+````
+个人认为该页面代码有两点值得学习:
+1.vue provide/inject的使用
+2.该页面css定义方式,只定义一个顶层class,其余样式都定义在其下,这样只要顶层class不和别的页面冲突,整个页面的样式都是唯一生效的
+````
+FooterToolBar.vue:fixed定位的底部,通过是否定义内部控件的属性slot="extra"决定是左浮动或是右浮动
+HeaderNotice.vue:首页通知(如下图)
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12195340_fPe0.png "在这里输入图片标题")
+HeaderInfo.vue:上下文字布局(如下图)
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12195638_dG5o.png "在这里输入图片标题")
+Logo.vue:首页左上侧的log图
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12200908_ihv3.png "在这里输入图片标题")
+UserMenu.vue:首页右上侧的内容
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12201226_laQK.png "在这里输入图片标题")
+####16.trend包 趋势显示组件(如下图)
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12201600_Wo8K.png "在这里输入图片标题")
+![corn表达式](https://oscimg.oschina.net/oscnet/661f9ac09016395f9f49286143af3241623.jpg)
+![corn控件添加清除按钮](https://oscimg.oschina.net/oscnet/15096e49f2e29bd829e304d56770025d03c.jpg)

+ 41 - 0
out/production/adsp-vue/components/Trend/Trend.vue

@@ -0,0 +1,41 @@
+<template>
+  <div :class="[prefixCls, reverseColor && 'reverse-color' ]">
+    <span>
+      <slot name="term"></slot>
+      <span class="item-text">
+        <slot></slot>
+      </span>
+    </span>
+    <span :class="[flag]"><a-icon :type="`caret-${flag}`"/></span>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: "Trend",
+    props: {
+      prefixCls: {
+        type: String,
+        default: 'ant-pro-trend'
+      },
+      /**
+       * 上升下降标识:up|down
+       */
+      flag: {
+        type: String,
+        required: true
+      },
+      /**
+       * 颜色反转
+       */
+      reverseColor: {
+        type: Boolean,
+        default: false
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+  @import "index";
+</style>

+ 3 - 0
out/production/adsp-vue/components/Trend/index.js

@@ -0,0 +1,3 @@
+import Trend from './Trend.vue'
+
+export default Trend

+ 44 - 0
out/production/adsp-vue/components/Trend/index.less

@@ -0,0 +1,44 @@
+@import "../index";
+
+@trend-prefix-cls: ~"@{ant-pro-prefix}-trend";
+
+.@{trend-prefix-cls} {
+  display: inline-block;
+  font-size: @font-size-base;
+  line-height: 22px;
+
+  .up,
+  .down {
+    margin-left: 4px;
+    position: relative;
+    top: 1px;
+
+    i {
+      font-size: 12px;
+      transform: scale(0.83);
+    }
+  }
+
+  .item-text {
+    display: inline-block;
+    margin-left: 8px;
+    color: rgba(0, 0, 0, .85);
+  }
+
+  .up {
+    color: @red-6;
+  }
+
+  .down {
+    color: @green-6;
+    top: -1px;
+  }
+
+  &.reverse-color .up {
+    color: @green-6;
+  }
+
+  &.reverse-color .down {
+    color: @red-6;
+  }
+}

+ 79 - 0
out/production/adsp-vue/components/_util/Area.js

@@ -0,0 +1,79 @@
+import { pcaa } from 'area-data'
+
+/**
+ * 省市区
+ */
+export default class Area {
+  /**
+   * 构造器
+   * @param express
+   */
+  constructor() {
+    let arr = []
+    const province = pcaa['86']
+    Object.keys(province).map(key=>{
+      arr.push({id:key, text:province[key], pid:'86'});
+      const city = pcaa[key];
+      Object.keys(city).map(key2=>{
+        arr.push({id:key2, text:city[key2], pid:key});
+        const qu = pcaa[key2];
+        Object.keys(qu).map(key3=>{
+          arr.push({id:key3, text:qu[key3], pid:key2});
+        })
+      })
+    })
+    this.all = arr;
+  }
+
+  get pca(){
+    return this.all;
+  }
+
+  getCode(text){
+    if(!text || text.length==0){
+      return ''
+    }
+    for(let item of this.all){
+      if(item.text === text){
+        return item.id;
+      }
+    }
+  }
+
+  getText(code){
+    if(!code || code.length==0){
+      return ''
+    }
+    let arr = []
+    this.getAreaBycode(code,arr);
+    return arr.join('/')
+  }
+
+  getRealCode(code){
+    let arr = []
+    this.getPcode(code, arr)
+    return arr;
+  }
+
+  getPcode(id, arr){
+    for(let item of this.all){
+      if(item.id === id){
+        arr.unshift(id)
+        if(item.pid != '86'){
+          this.getPcode(item.pid,arr)
+        }
+      }
+    }
+  }
+
+  getAreaBycode(code,arr){
+    //console.log("this.all.length",this.all)
+    for(let item of this.all){
+      if(item.id === code){
+        arr.unshift(item.text);
+        this.getAreaBycode(item.pid,arr)
+      }
+    }
+  }
+
+}

+ 35 - 0
out/production/adsp-vue/components/_util/StringUtil.js

@@ -0,0 +1,35 @@
+/**
+ * 获取字符串的长度ascii长度为1 中文长度为2
+ * @param str
+ * @returns {number}
+ */
+export const getStrFullLength = (str = '') =>
+  str.split('').reduce((pre, cur) => {
+    const charCode = cur.charCodeAt(0)
+    if (charCode >= 0 && charCode <= 128) {
+      return pre + 1
+    }
+    return pre + 2
+  }, 0)
+
+/**
+ * 给定一个字符串和一个长度,将此字符串按指定长度截取
+ * @param str
+ * @param maxLength
+ * @returns {string}
+ */
+export const cutStrByFullLength = (str = '', maxLength) => {
+  let showLength = 0
+  return str.split('').reduce((pre, cur) => {
+    const charCode = cur.charCodeAt(0)
+    if (charCode >= 0 && charCode <= 128) {
+      showLength += 1
+    } else {
+      showLength += 2
+    }
+    if (showLength <= maxLength) {
+      return pre + cur
+    }
+    return pre
+  }, '')
+}

+ 12 - 0
out/production/adsp-vue/components/_util/util.js

@@ -0,0 +1,12 @@
+/**
+ * components util
+ */
+
+/**
+ * 清理空值,对象
+ * @param children
+ * @returns {*[]}
+ */
+export function filterEmpty(children = []) {
+  return children.filter(c => c.tag || (c.text && c.text.trim() !== ''))
+}

+ 36 - 0
out/production/adsp-vue/components/bigImg.vue

@@ -0,0 +1,36 @@
+<template>
+  <!-- 过渡动画 -->
+  <a-modal title="查看封面" v-model="showImageChouzhen" :width="400" :footer="null">
+    <img :src="showImageStr" style="width: 100%" v-if="showType == 'inage'" />
+    <video class="video" :src="showImageStr" controls="controls" style="width: 100%" v-else>
+      您的浏览器不支持 video 标签。
+    </video>
+  </a-modal>
+</template>
+<script>
+export default {
+  props: {
+    imgSrc: {
+      type: String,
+      default: '',
+    },
+  },
+  data() {
+    return {
+      scale: 1,
+      showType: 'image',
+      showImageChouzhen: false,
+      showImageStr:''
+    }
+  },
+  methods: {
+    showImg(type,url) {
+      this.showType = type
+      this.showImageStr = url
+      this.showImageChouzhen = true
+    },
+  },
+}
+</script>
+
+

+ 35 - 0
out/production/adsp-vue/components/bpm/DynamicComponent.vue

@@ -0,0 +1,35 @@
+<template>
+  <component ref="compModel" :is="comp" :formData="formData" v-if="comp" @ok="callBackOk"
+             @close="callBackClose"></component>
+</template>
+<script>
+  export default {
+    name: 'DynamicComponent',
+    data() {
+      return {
+        compName: this.path
+      }
+    },
+    computed: {
+      comp: function () {
+        return () => import(`@/views/${this.compName}.vue`)
+      }
+    },
+    props: ['path', 'formData'],
+    methods: {
+      add() {
+        this.$refs.compModel.add();
+      },
+      callBackClose() {
+        this.$emit('close');
+      },
+      handleOk() {
+        this.$refs.compModel.handleOk();
+      },
+      callBackOk() {
+        this.$emit('ok');
+        this.close();
+      },
+    }
+  }
+</script>

+ 73 - 0
out/production/adsp-vue/components/bpm/FormCommonModal.vue

@@ -0,0 +1,73 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    destroyOnClose
+    cancelText="关闭">
+    <a-spin :spinning="confirmLoading">
+      <dynamic-component ref="dynamiclink" :path="path" :formData="formData" @ok="callBackOk"
+                         @close="callBackClose"></dynamic-component>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+
+  import DynamicComponent from "./DynamicComponent";
+
+  export default {
+    name: "FormCommonModal",
+    props: ['path'],
+    components: {
+      DynamicComponent
+    },
+    data() {
+      return {
+        title: "操作",
+        width: "80%",
+        visible: false,
+        confirmLoading: false,
+        formData: {},
+      }
+    },
+    created() {
+    },
+    methods: {
+      add() {
+        this.formData = [];
+        this.title = "新增";
+        this.visible = true;
+        this.$refs.dynamiclink.add();
+      },
+      edit(record) {
+        var data = {
+          dataId: record.id,
+        }
+        this.formData = data;
+        this.visible = true;
+      },
+      callBackClose() {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk() {
+        this.$refs.dynamiclink.handleOk();
+      },
+      callBackOk() {
+        this.$emit('ok');
+        this.callBackClose();
+      },
+      handleCancel() {
+        this.callBackClose()
+      },
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 121 - 0
out/production/adsp-vue/components/bpm/ProcNodeInfoModel.vue

@@ -0,0 +1,121 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="280"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    :bodyStyle="bodyStyle"
+    :mask="false"
+    destroyOnClose
+    :footer="null"
+    @cancel="handleCancel"
+    cancelText="关闭">
+
+    <a-spin :spinning="confirmLoading">
+      <div style="height: 300px;overflow: hidden;overflow-y: auto;overflow-x: auto;">
+        <template v-for="(item, key, index) in nodeInfos">
+          <table class="gridtable">
+            <tbody>
+            <tr>
+              <th width="90">任务名称</th>
+              <td width="150">{{ item.taskName}}</td>
+            </tr>
+            <tr>
+              <th width="90">执行人</th>
+              <td width="150">{{ item.taskAssigneeId}}</td>
+            </tr>
+            <tr>
+              <th width="90">开始时间</th>
+              <td width="150">{{ item.taskBeginTime }}</td>
+            </tr>
+            <tr>
+              <th width="90">结束时间</th>
+              <td width="150">{{ item.taskEndTime }}</td>
+            </tr>
+            <tr>
+              <th width="90">耗时</th>
+              <td width="150">{{ item.durationStr }}</td>
+            </tr>
+            <tr>
+              <th width="90">意见</th>
+              <td width="150">{{ item.remarks }}</td>
+            </tr>
+            </tbody>
+          </table>
+        </template>
+      </div>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+  import {httpAction} from '@/api/manage'
+  import pick from 'lodash.pick'
+
+  export default {
+    name: "ProcNodeInfoModel",
+    data() {
+      return {
+        title: "任务审批详情",
+        visible: false,
+        bodyStyle: {
+          padding: "0",
+        },
+        confirmLoading: false,
+        validatorRules: {},
+        nodeInfos: [],
+      }
+    },
+    created() {
+    },
+    methods: {
+      showInfo(record, taskId) {
+        this.nodeInfos = [];
+        for (var item of record) {
+          if (item.taskId == taskId) {
+            this.nodeInfos.push(item);
+          }
+        }
+        this.visible = true;
+      },
+      close() {
+        this.nodeInfos = [];
+        this.visible = false;
+      },
+      handleCancel() {
+        this.nodeInfos = [];
+        this.visible = false;
+      },
+
+    }
+  }
+</script>
+
+<style scoped>
+  table.gridtable {
+    margin: 0 auto;
+    margin-top: 10px;
+    font-family: verdana, arial, sans-serif;
+    font-size: 12px;
+    color: #333333;
+    border-width: 1px;
+    border-color: #ddd;
+    border-collapse: collapse;
+  }
+
+  table.gridtable th {
+    border-width: 1px;
+    padding: 8px;
+    border-style: solid;
+    border-color: #ddd;
+    background-color: #eee;
+  }
+
+  table.gridtable td {
+    border-width: 1px;
+    padding: 8px;
+    border-style: solid;
+    border-color: #ddd;
+    background-color: #ffffff;
+  }
+</style>

+ 0 - 0
out/production/adsp-vue/components/bpm/ProcessInstPicModal.vue


部分文件因为文件数量过多而无法显示