Browse Source

创建仓库

zhangyuanyuan 1 year ago
commit
0761fb88bd
100 changed files with 9176 additions and 0 deletions
  1. 4 0
      .env.development
  2. 4 0
      .env.production
  3. 4 0
      .env.testing
  4. 8 0
      .gitignore
  5. 35 0
      README.md
  6. 0 0
      VERSION.md
  7. 14 0
      index.html
  8. 39 0
      package.json
  9. BIN
      public/favicon.ico
  10. 30 0
      src/App.vue
  11. BIN
      src/assets/AYN.png
  12. 116 0
      src/assets/iconfont/iconfont.css
  13. 1 0
      src/assets/iconfont/iconfont.js
  14. 184 0
      src/assets/iconfont/iconfont.json
  15. 69 0
      src/assets/iconfont/iconfont.svg
  16. BIN
      src/assets/iconfont/iconfont.ttf
  17. BIN
      src/assets/iconfont/iconfont.woff
  18. BIN
      src/assets/iconfont/iconfont.woff2
  19. BIN
      src/assets/images/401.gif
  20. BIN
      src/assets/images/404.png
  21. BIN
      src/assets/images/404_cloud.png
  22. BIN
      src/assets/images/account.png
  23. BIN
      src/assets/images/default.png
  24. BIN
      src/assets/images/file.png
  25. BIN
      src/assets/images/getSelf.png
  26. BIN
      src/assets/images/item.png
  27. BIN
      src/assets/images/loginBg/downBg.png
  28. BIN
      src/assets/images/loginBg/upImg.gif
  29. BIN
      src/assets/images/loginBg/upImg2.gif
  30. BIN
      src/assets/images/logo.png
  31. BIN
      src/assets/images/marketItem.png
  32. BIN
      src/assets/images/mengniu.png
  33. BIN
      src/assets/images/offlinePay.png
  34. BIN
      src/assets/images/order-icons.png
  35. BIN
      src/assets/images/tasklogo.png
  36. BIN
      src/assets/noclassify.png
  37. BIN
      src/assets/nodata.png
  38. 91 0
      src/assets/style/common.scss
  39. 37 0
      src/assets/style/transition.scss
  40. 12 0
      src/components/menu/index.vue
  41. 102 0
      src/components/table/index.vue
  42. 5 0
      src/config/index.js
  43. 61 0
      src/layout/Header/Breadcrumb.vue
  44. 31 0
      src/layout/Header/functionList/fullscreen.vue
  45. 62 0
      src/layout/Header/functionList/sizeChange.vue
  46. 173 0
      src/layout/Header/functionList/theme.vue
  47. 77 0
      src/layout/Header/functionList/theme/theme-color.vue
  48. 130 0
      src/layout/Header/functionList/theme/theme-icon.vue
  49. 152 0
      src/layout/Header/index.vue
  50. 47 0
      src/layout/Logo/index.vue
  51. 41 0
      src/layout/Menu/Link.vue
  52. 100 0
      src/layout/Menu/MenuItem.vue
  53. 120 0
      src/layout/Menu/index.vue
  54. 159 0
      src/layout/Menu/menu.js
  55. 265 0
      src/layout/Tabs/index.vue
  56. 100 0
      src/layout/Tabs/item.vue
  57. 9 0
      src/layout/Tabs/tabsHook.js
  58. 134 0
      src/layout/index.vue
  59. 24 0
      src/main.js
  60. 20 0
      src/request/api.js
  61. 46 0
      src/request/apiConfig.js
  62. 41 0
      src/request/modules/apiContent.js
  63. 462 0
      src/request/modules/apiItem.js
  64. 178 0
      src/request/modules/apiManager.js
  65. 39 0
      src/request/modules/apiMarket.js
  66. 19 0
      src/request/modules/apiMnp.js
  67. 291 0
      src/request/modules/apiOrder.js
  68. 106 0
      src/request/modules/apiShop.js
  69. 52 0
      src/request/modules/apiSku.js
  70. 315 0
      src/request/modules/apiUser.js
  71. 46 0
      src/router/createNode.js
  72. 59 0
      src/router/index.js
  73. 166 0
      src/router/modules/pages.js
  74. 43 0
      src/router/modules/system.js
  75. 116 0
      src/router/reload.vue
  76. 29 0
      src/store/index.js
  77. 44 0
      src/store/modules/app.js
  78. 41 0
      src/store/modules/keepAlive.js
  79. 57 0
      src/store/modules/order.js
  80. 79 0
      src/store/modules/user.js
  81. 14 0
      src/store/mutation-types.js
  82. 39 0
      src/store/plugins/persistent.js
  83. 99 0
      src/theme/index.js
  84. 51 0
      src/theme/index.scss
  85. 23 0
      src/theme/modules/dark.scss
  86. 283 0
      src/utils/system/filters.js
  87. 12 0
      src/utils/system/nprogress.js
  88. 98 0
      src/utils/system/request.js
  89. 39 0
      src/utils/system/time.js
  90. 6 0
      src/utils/system/title.js
  91. 32 0
      src/utils/system/uploadCompress.js
  92. 355 0
      src/views/manager/ecommerceManager/ecommerceList.vue
  93. 506 0
      src/views/manager/ecommerceManager/logoffManage.vue
  94. 163 0
      src/views/manager/orderManager/afterChange.vue
  95. 576 0
      src/views/manager/orderManager/cargoLogisticsAudit.vue
  96. 493 0
      src/views/manager/orderManager/orderAdminList.vue
  97. 516 0
      src/views/manager/orderManager/orderDetail.vue
  98. 513 0
      src/views/manager/orderManager/orderList.vue
  99. 669 0
      src/views/manager/roleManager/roleList.vue
  100. 0 0
      src/views/manager/roleManager/roleManager.vue

+ 4 - 0
.env.development

@@ -0,0 +1,4 @@
+ENV = 'development'
+
+VITE_BASE_URL = '/dev-api'
+outputDir = 'building for developing please wait...'

+ 4 - 0
.env.production

@@ -0,0 +1,4 @@
+NODE_ENV = 'production'
+
+VITE_BASE_URL = '/pro-api'
+outputDir = 'building for production please wait...'

+ 4 - 0
.env.testing

@@ -0,0 +1,4 @@
+NODE_ENV = 'testing'
+
+VITE_BASE_URL = '/test-api'
+outputDir = 'building for testing please wait...'

+ 8 - 0
.gitignore

@@ -0,0 +1,8 @@
+pastureFinancial*
+node_modules
+.DS_Store
+dist-ssr
+*.local
+yarn.lock
+yarn-error.log
+.vscode

+ 35 - 0
README.md

@@ -0,0 +1,35 @@
+
+#### 主要技术栈
+
+- MVVM框架:vue v3
+- 工程化管理:vite v2
+- UI框架:element-plus
+- 路由管理:vue-router v4
+- 状态管理:vuex v4
+- 数据请求:axios
+- 实用工具库:@vueuse/core
+
+
+2. 安装依赖,国内推荐使用cnpm或tyarn,国外推荐使用npm或yarn
+
+   ```
+   npm install
+   ```
+
+   
+
+3. 运行
+
+   ```
+   npm run dev 或 npm run start
+   ```
+
+   
+
+4. 打包
+
+   ```
+   npm run build
+   ```
+   
+

+ 0 - 0
VERSION.md


+ 14 - 0
index.html

@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" href="/favicon.ico" />
+    <link rel="stylesheet" href="//at.alicdn.com/t/font_2570680_2fgczr3435f.css">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title></title>
+  </head>
+  <body>
+    <div id="app"></div>
+    <script type="module" src="/src/main.js"></script>
+  </body>
+</html>

+ 39 - 0
package.json

@@ -0,0 +1,39 @@
+{
+  "name": "manager-vue3",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build --mode production",
+    "test": "vue-cli-service build --mode testing",
+    "lint": "vue-cli-service lint"
+  },
+  "dependencies": {
+    "@element-plus/icons-vue": "^2.1.0",
+    "@vueuse/core": "^9.1.1",
+    "axios": "^0.21.1",
+    "element-plus": "^2.2.25",
+    "image-conversion": "^2.1.1",
+    "lodash": "^4.17.21",
+    "moment": "^2.29.4",
+    "normalize.css": "^8.0.1",
+    "qs": "^6.11.0",
+    "throttle-debounce": "^3.0.1",
+    "url-template": "^3.1.0",
+    "view-ui-plus": "^1.3.1",
+    "vue": "^3.1.2",
+    "vue-router": "4",
+    "vuex": "^4.0.0"
+  },
+  "devDependencies": {
+    "@types/node": "^15.0.3",
+    "@vue/cli-plugin-babel": "~4.5.0",
+    "@vue/cli-plugin-router": "~4.5.0",
+    "@vue/cli-plugin-vuex": "~4.5.0",
+    "@vue/cli-service": "~4.5.0",
+    "@vue/compiler-sfc": "^3.0.5",
+    "vue-tsc": "^0.0.24",
+    "sass-loader": "^8.0.2",
+    "sass": "^1.32.12"
+  }
+}

BIN
public/favicon.ico


+ 30 - 0
src/App.vue

@@ -0,0 +1,30 @@
+<template>
+  <el-config-provider :locale="locale">
+    <router-view></router-view>
+  </el-config-provider>
+</template>
+
+<script>
+import { defineComponent } from 'vue'
+import locale from 'element-plus/lib/locale/lang/zh-cn'
+export default defineComponent({
+  name: 'App',
+  setup() {
+    return {
+      locale
+    }
+  }
+})
+</script>
+
+<style>
+#app {
+  font-family: Avenir, Helvetica, Arial, sans-serif;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  /* text-align: center; */
+  color: #2c3e50;
+  width: 100%;
+  height: 100vh;
+}
+</style>

BIN
src/assets/AYN.png


+ 116 - 0
src/assets/iconfont/iconfont.css

@@ -0,0 +1,116 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 3621431 */
+  src: url('iconfont.woff2?t=1691567958301') format('woff2'),
+       url('iconfont.woff?t=1691567958301') format('woff'),
+       url('iconfont.ttf?t=1691567958301') format('truetype'),
+       url('iconfont.svg?t=1691567958301#iconfont') format('svg');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-tuoguanguanli:before {
+  content: "\e606";
+}
+
+.icon-shenhe:before {
+  content: "\e6d8";
+}
+
+.icon-huankuanguanli:before {
+  content: "\e651";
+}
+
+.icon-diyu:before {
+  content: "\e616";
+}
+
+.icon-gaoyu:before {
+  content: "\e617";
+}
+
+.icon-fenlei:before {
+  content: "\e658";
+}
+
+.icon-zoushi:before {
+  content: "\e63c";
+}
+
+.icon-daochu:before {
+  content: "\e6d5";
+}
+
+.icon--nainiu:before {
+  content: "\e612";
+}
+
+.icon-bingtutongji:before {
+  content: "\e662";
+}
+
+.icon-xialajiantouxiao:before {
+  content: "\e87e";
+}
+
+.icon-shezhi:before {
+  content: "\e614";
+}
+
+.icon-fontsize:before {
+  content: "\e732";
+}
+
+.icon-tuichuquanping:before {
+  content: "\e792";
+}
+
+.icon-quanping1:before {
+  content: "\e62f";
+}
+
+.icon-31pinpai:before {
+  content: "\e600";
+}
+
+.icon-guanliwenzhang:before {
+  content: "\e671";
+}
+
+.icon-duowenjian:before {
+  content: "\e60d";
+}
+
+.icon-shu:before {
+  content: "\e607";
+}
+
+.icon-shezhixitongshezhigongnengshezhishuxing:before {
+  content: "\e795";
+}
+
+.icon-xialazhankai:before {
+  content: "\e6b5";
+}
+
+.icon-guanbi1:before {
+  content: "\e723";
+}
+
+.icon-shuaxin:before {
+  content: "\e613";
+}
+
+.icon-caidanshouqi:before {
+  content: "\e611";
+}
+
+.icon-caidanzhankai:before {
+  content: "\e615";
+}
+

File diff suppressed because it is too large
+ 1 - 0
src/assets/iconfont/iconfont.js


+ 184 - 0
src/assets/iconfont/iconfont.json

@@ -0,0 +1,184 @@
+{
+  "id": "3621431",
+  "name": "vue3-TEM",
+  "font_family": "iconfont",
+  "css_prefix_text": "icon-",
+  "description": "vue3-TEM 新框架使用",
+  "glyphs": [
+    {
+      "icon_id": "8551949",
+      "name": "托管管理",
+      "font_class": "tuoguanguanli",
+      "unicode": "e606",
+      "unicode_decimal": 58886
+    },
+    {
+      "icon_id": "9874516",
+      "name": "KHCFDC_审核 2",
+      "font_class": "shenhe",
+      "unicode": "e6d8",
+      "unicode_decimal": 59096
+    },
+    {
+      "icon_id": "18202730",
+      "name": "还款管理",
+      "font_class": "huankuanguanli",
+      "unicode": "e651",
+      "unicode_decimal": 58961
+    },
+    {
+      "icon_id": "12502345",
+      "name": "低于",
+      "font_class": "diyu",
+      "unicode": "e616",
+      "unicode_decimal": 58902
+    },
+    {
+      "icon_id": "12502349",
+      "name": "高于",
+      "font_class": "gaoyu",
+      "unicode": "e617",
+      "unicode_decimal": 58903
+    },
+    {
+      "icon_id": "809965",
+      "name": "分类",
+      "font_class": "fenlei",
+      "unicode": "e658",
+      "unicode_decimal": 58968
+    },
+    {
+      "icon_id": "8580567",
+      "name": "走势",
+      "font_class": "zoushi",
+      "unicode": "e63c",
+      "unicode_decimal": 58940
+    },
+    {
+      "icon_id": "11341472",
+      "name": "导出",
+      "font_class": "daochu",
+      "unicode": "e6d5",
+      "unicode_decimal": 59093
+    },
+    {
+      "icon_id": "9251668",
+      "name": "02-奶牛",
+      "font_class": "-nainiu",
+      "unicode": "e612",
+      "unicode_decimal": 58898
+    },
+    {
+      "icon_id": "5651356",
+      "name": "饼图统计",
+      "font_class": "bingtutongji",
+      "unicode": "e662",
+      "unicode_decimal": 58978
+    },
+    {
+      "icon_id": "2076220",
+      "name": " 下拉箭头小",
+      "font_class": "xialajiantouxiao",
+      "unicode": "e87e",
+      "unicode_decimal": 59518
+    },
+    {
+      "icon_id": "1106434",
+      "name": "设置",
+      "font_class": "shezhi",
+      "unicode": "e614",
+      "unicode_decimal": 58900
+    },
+    {
+      "icon_id": "586897",
+      "name": "font-size",
+      "font_class": "fontsize",
+      "unicode": "e732",
+      "unicode_decimal": 59186
+    },
+    {
+      "icon_id": "22530095",
+      "name": "退出全屏",
+      "font_class": "tuichuquanping",
+      "unicode": "e792",
+      "unicode_decimal": 59282
+    },
+    {
+      "icon_id": "5650911",
+      "name": "全屏",
+      "font_class": "quanping1",
+      "unicode": "e62f",
+      "unicode_decimal": 58927
+    },
+    {
+      "icon_id": "213312",
+      "name": "3.1-品牌",
+      "font_class": "31pinpai",
+      "unicode": "e600",
+      "unicode_decimal": 58880
+    },
+    {
+      "icon_id": "1876336",
+      "name": "管理文章",
+      "font_class": "guanliwenzhang",
+      "unicode": "e671",
+      "unicode_decimal": 58993
+    },
+    {
+      "icon_id": "1973044",
+      "name": "多文件",
+      "font_class": "duowenjian",
+      "unicode": "e60d",
+      "unicode_decimal": 58893
+    },
+    {
+      "icon_id": "2012069",
+      "name": "书",
+      "font_class": "shu",
+      "unicode": "e607",
+      "unicode_decimal": 58887
+    },
+    {
+      "icon_id": "6129178",
+      "name": "138设置、系统设置、功能设置、属性",
+      "font_class": "shezhixitongshezhigongnengshezhishuxing",
+      "unicode": "e795",
+      "unicode_decimal": 59285
+    },
+    {
+      "icon_id": "1486990",
+      "name": "下拉展开",
+      "font_class": "xialazhankai",
+      "unicode": "e6b5",
+      "unicode_decimal": 59061
+    },
+    {
+      "icon_id": "577309",
+      "name": "关闭1",
+      "font_class": "guanbi1",
+      "unicode": "e723",
+      "unicode_decimal": 59171
+    },
+    {
+      "icon_id": "2152145",
+      "name": "刷新",
+      "font_class": "shuaxin",
+      "unicode": "e613",
+      "unicode_decimal": 58899
+    },
+    {
+      "icon_id": "11556685",
+      "name": "菜单收起",
+      "font_class": "caidanshouqi",
+      "unicode": "e611",
+      "unicode_decimal": 58897
+    },
+    {
+      "icon_id": "11556695",
+      "name": "菜单展开",
+      "font_class": "caidanzhankai",
+      "unicode": "e615",
+      "unicode_decimal": 58901
+    }
+  ]
+}

File diff suppressed because it is too large
+ 69 - 0
src/assets/iconfont/iconfont.svg


BIN
src/assets/iconfont/iconfont.ttf


BIN
src/assets/iconfont/iconfont.woff


BIN
src/assets/iconfont/iconfont.woff2


BIN
src/assets/images/401.gif


BIN
src/assets/images/404.png


BIN
src/assets/images/404_cloud.png


BIN
src/assets/images/account.png


BIN
src/assets/images/default.png


BIN
src/assets/images/file.png


BIN
src/assets/images/getSelf.png


BIN
src/assets/images/item.png


BIN
src/assets/images/loginBg/downBg.png


BIN
src/assets/images/loginBg/upImg.gif


BIN
src/assets/images/loginBg/upImg2.gif


BIN
src/assets/images/logo.png


BIN
src/assets/images/marketItem.png


BIN
src/assets/images/mengniu.png


BIN
src/assets/images/offlinePay.png


BIN
src/assets/images/order-icons.png


BIN
src/assets/images/tasklogo.png


BIN
src/assets/noclassify.png


BIN
src/assets/nodata.png


+ 91 - 0
src/assets/style/common.scss

@@ -0,0 +1,91 @@
+@import "./transition.scss";
+@import "@/theme/index.scss";
+.layout-container {
+  background-color: var(--system-container-main-background);
+  width: calc(100% - 30px);
+  height: calc(100% - 30px);
+  margin: 15px;
+  display: flex;
+  flex-direction: column;
+  overflow-y: auto;
+  &-form {
+    display: flex;
+    justify-content: space-between;
+    padding: 15px 15px 0;
+    &-handle {
+      display: flex;
+      justify-content: flex-start;
+    }
+    &-search {
+      display: flex;
+      justify-content: flex-end;
+      .search-btn {
+        margin-left: 15px;
+      }
+    }
+    .el-form-item {
+      margin-bottom: 0;
+    }
+  }
+  &-table {
+    flex: 1;
+    height: 100%;
+    padding: 15px;
+    overflow: auto;
+  }
+}
+.flex-box {
+  display: flex;
+  flex-direction: column;
+  width: 100%;
+  height: 100%;
+  padding: 15px;
+  box-sizing: border-box;
+}
+.flex {
+  display: flex;
+}
+.center {
+  justify-content: center;
+  align-items: center;
+  text-align: center;
+}
+a {
+  text-decoration: none;
+}
+
+/** element-plus **/
+.el-icon{
+  text-align: center;
+}
+
+/** 用于提示信息 **/
+.my-tip {
+  background-color: #f1f1f1;
+  padding: 5px 10px;
+  text-align: left;
+  border-radius: 4px;
+}
+.system-scrollbar {
+  &::-webkit-scrollbar {
+    display: none;
+    width: 6px;
+  }
+  &::-webkit-scrollbar-thumb {
+    border-radius: 10px;
+    background: rgba(144, 147, 153, 0.3);
+  }
+  &:hover {
+    &::-webkit-scrollbar {
+      display: block;
+    }
+    &::-webkit-scrollbar-thumb {
+      border-radius: 10px;
+      background: rgba(144, 147, 153, 0.3);
+      &:hover {
+        background: rgba(144, 147, 153, 0.5);
+      }
+    }
+  }
+ 
+}

+ 37 - 0
src/assets/style/transition.scss

@@ -0,0 +1,37 @@
+/* fade-transform */
+.fade-transform-leave-active,
+.fade-transform-enter-active {
+  transition: all .2s;
+}
+
+.fade-transform-enter-from {
+  opacity: 0;
+  transform: translateX(-30px);
+  transition: all .2s;
+}
+
+.fade-transform-leave-to {
+  opacity: 0;
+  transform: translateX(30px);
+  transition: all .2s;
+}
+
+/* breadcrumb transition */
+.breadcrumb-enter-active,
+.breadcrumb-leave-active {
+  transition: all .2s;
+}
+
+.breadcrumb-enter,
+.breadcrumb-leave-active {
+  opacity: 0;
+  transform: translateX(80px);
+}
+
+.breadcrumb-move {
+  transition: all .5s;
+}
+
+.breadcrumb-leave-active {
+  position: absolute;
+}

+ 12 - 0
src/components/menu/index.vue

@@ -0,0 +1,12 @@
+<template>
+  <router-view></router-view>
+</template>
+
+<script>
+import { defineComponent } from 'vue'
+export default defineComponent({
+  setup() {
+
+  }
+})
+</script>

+ 102 - 0
src/components/table/index.vue

@@ -0,0 +1,102 @@
+<template>
+  <div class="system-table-box">
+    <el-table
+      v-bind="$attrs"
+      class="system-table"
+      border
+      height="100%"
+      :data="data"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" align="center" width="50" v-if="showSelection" />
+      <el-table-column label="序号" width="60" align="center" v-if="showIndex">
+        <template #default="scope">
+          {{ (page.index - 1) * page.size + scope.$index + 1 }}
+        </template>
+      </el-table-column>
+      <slot></slot>
+    </el-table>
+    <el-pagination
+      v-if="showPage"
+      v-model:current-page="page.index"
+      class="system-page"
+      background
+      :layout="pageLayout"
+      :total="page.total"
+      :page-size="page.size"
+      :page-sizes="pageSizes"
+      @current-change="handleCurrentChange"
+      @size-change="handleSizeChange"
+    >
+    </el-pagination>
+  </div>
+</template>
+
+<script>
+import { defineComponent } from 'vue'
+export default defineComponent({
+  props: {
+    data: { type: Array, default: () => [] }, // 数据源
+    select: { type: Array, default: () => [] }, // 已选择的数据,与selection结合使用
+    showIndex: { type: Boolean, default: false }, // 是否展示index选择,默认否
+    showSelection: { type: Boolean, default: false }, // 是否展示选择框,默认否
+    showPage: { type: Boolean, default: true }, // 是否展示页级组件,默认是
+    page: { // 分页参数
+      type: Object,
+      default: () => {
+        return { index: 1, size: 20, total: 0 }
+      }
+    },
+    pageLayout: { type: String, default: "total, sizes, prev, pager, next, jumper" }, // 分页需要显示的东西,默认全部
+    pageSizes: { type: Array, default: [10, 20, 50, 100] }
+  },
+  setup(props, context) {
+    let timer = null
+    // 分页相关:监听页码切换事件
+    const handleCurrentChange = (val) => {
+      if (timer) {
+        props.page.index = 1
+      } else {
+        props.page.index = val
+        context.emit("getTableData")
+      }
+    }
+    // 分页相关:监听单页显示数量切换事件
+    const handleSizeChange = (val) => {
+      timer = 'work'
+      setTimeout(() => {
+        timer = null
+      }, 100)
+      props.page.size = val
+      context.emit("getTableData", true)
+    }
+    // 选择监听器
+    const handleSelectionChange = (val) =>{
+      context.emit("selection-change", val)
+    }
+    return {
+      handleCurrentChange,
+      handleSizeChange,
+      handleSelectionChange
+    }
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+  .system-table-box {
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: flex-start;
+    height: 100%;
+    .system-table {
+      flex: 1;
+      height: 100%;
+    }
+    
+    .system-page {
+      margin-top: 20px;
+    }
+  }
+</style>

+ 5 - 0
src/config/index.js

@@ -0,0 +1,5 @@
+const showLogo = false; // 是否显示Logo顶部模块
+const systemTitle = '爱养牛后台管理' // 系统名称,用于显示在左上角模块,以及浏览器标题上使用,使用配置项
+export {
+  systemTitle
+}

+ 61 - 0
src/layout/Header/Breadcrumb.vue

@@ -0,0 +1,61 @@
+<template>
+  <el-breadcrumb class="app-breadcrumb hidden-sm-and-down" separator="/">
+    <transition-group appear name="breadcrumb">
+      <el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path">
+        <span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">{{  item.meta.title }}</span>
+        <a v-else @click.prevent="handleLink(item)">
+          {{ item.meta.title }}
+        </a>
+      </el-breadcrumb-item>
+    </transition-group>
+  </el-breadcrumb>
+</template>
+
+<script>
+import { defineComponent, ref, watch } from "vue";
+import { useRoute, useRouter } from "vue-router";
+export default defineComponent({
+  name: "BreadCrumb",
+  setup() {
+    const levelList = ref([]);
+    const route = useRoute();
+    const router = useRouter();
+    const getBreadcrumb = () => {
+      let matched = route.matched.filter(item => item.meta && item.meta.title);
+      const first = matched[0];
+      levelList.value = matched.filter(
+        item => item.meta && item.meta.title && item.meta.breadcrumb !== false
+      );
+    };
+    getBreadcrumb();
+    watch(
+      () => route.path,
+      () => getBreadcrumb()
+    );
+    const handleLink = (item) => {
+      const { redirect, path } = item;
+      if (redirect) {
+        router.push(redirect.toString());
+        return;
+      }
+      router.push(path);
+    };
+    return { levelList, handleLink };
+  }
+});
+</script>
+
+<style lang="scss" scoped >
+.app-breadcrumb.el-breadcrumb {
+  display: inline-block;
+  font-size: 14px;
+  line-height: 50px;
+  .no-redirect {
+    color: var(--system-header-breadcrumb-text-color);
+    cursor: text;
+  }
+  a {
+    color: var(--system-header-text-color);
+  }
+}
+</style>

+ 31 - 0
src/layout/Header/functionList/fullscreen.vue

@@ -0,0 +1,31 @@
+<template>
+  <div :title="isFullscreen ? '退出全屏' : '全屏'">
+    <i class="iconfont" :class="isFullscreen ? 'icon-tuichuquanping':'icon-quanping1'" @click="toggle"></i>
+  </div>
+</template>
+
+<script>
+import { defineComponent } from 'vue'
+import { useFullscreen } from '@vueuse/core'
+
+export default defineComponent({
+  name: 'fullscreen',
+  setup() {
+    const { isFullscreen, toggle } = useFullscreen()
+    return {
+      isFullscreen,
+      toggle
+    }
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+  i {
+    cursor: pointer;
+    font-size: 18px;
+    &:focus {
+      outline: none;
+    }
+  }
+</style>

+ 62 - 0
src/layout/Header/functionList/sizeChange.vue

@@ -0,0 +1,62 @@
+<template>
+  <el-dropdown @command="handleCommand">
+    <div class="el-dropdown-link">
+      <i class="iconfont icon-fontsize"></i>
+    </div>
+    <template #dropdown>
+      <el-dropdown-menu>
+        <el-dropdown-item
+          v-for="d in list"
+          :key="d.size"
+          :command="d.size"
+          :disabled=" elementSize === d.size "
+        >
+          {{ d.name }}
+        </el-dropdown-item>
+      </el-dropdown-menu>
+    </template>
+  </el-dropdown>
+</template>
+
+<script>
+import { defineComponent, computed, unref } from 'vue'
+import { useRoute } from 'vue-router'
+import { useStore } from 'vuex'
+export default defineComponent({
+  setup() {
+    const store = useStore()
+    const route = useRoute()
+    const elementSize = computed(() => store.state.app.elementSize)
+    const list = [
+      { size: 'default', name: '默认' },
+      { size: 'large ', name: '大' },
+      { size: 'small', name: '小' },
+    ]
+    const { fullPath } = unref(route)
+    return {
+      list,
+      elementSize,
+      fullPath
+    }
+  },
+  methods: {
+    handleCommand(command) {
+      this.$store.commit('app/stateChange', {
+        name: 'elementSize',
+        value: command
+      })
+      this.setElementSize()
+    },
+    setElementSize() {
+      this.$ELEMENT.size = this.elementSize
+      this.$router.replace({
+        path: "/redirect" + this.fullPath
+      })
+    }
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+  
+</style>

+ 173 - 0
src/layout/Header/functionList/theme.vue

@@ -0,0 +1,173 @@
+<template>
+  <div title="系统设置" @click="drawerChange(true)">
+    <i class="iconfont icon-shezhi"></i>
+  </div>
+  <el-drawer
+    title="系统设置"
+    v-model="drawer"
+    size="300px"
+    :show-close="false"
+    direction="rtl">
+      <h3>整体风格设置</h3>
+      <div class="theme-box">
+        <theme-icon
+          v-model:active="state.style"
+          v-for="(row, index) in style"
+          :key="index"
+          :name="index"
+          :tip="row.name"
+          :logo="row.logo.background"
+          :menu="row.menu.background"
+          :header="row.header.background"
+          :main="row.container.background"
+          :activeColor="row.page.color"
+        ></theme-icon>
+      </div>
+      <h3>主题色</h3>
+      <div class="theme-box">
+        <theme-color v-for="(item, key) in themeColorArr"
+          v-model:active="state.primaryColor"
+          v-model:activeTextColor="state.primaryTextColor"
+          :key="key"
+          :color="item.color"
+          :textColor="item.textColor"
+          :tip="item.tip">
+        </theme-color>
+      </div>
+      <h3>其他设置</h3>
+      <div class="list">
+        <div class="list-item" v-for="option in options" :key="option.name">
+          <span>{{ option.name }}</span>
+          <el-switch
+            v-model="option.value"
+            active-color="#13ce66"
+            inactive-color="#ff4949"
+            @change="change(option)"
+          >
+          </el-switch>
+        </div>
+      </div>
+  </el-drawer>
+</template>
+
+<script>
+import { defineComponent, ref, reactive, computed, watch } from 'vue'
+import { useStore } from 'vuex'
+import themeIcon from './theme/theme-icon.vue'
+import themeColor from './theme/theme-color.vue'
+import { style } from '@/theme/index'
+
+export default defineComponent({
+  components: {
+    themeIcon,
+    themeColor
+  },
+  setup() {
+    const store = useStore()
+    // 只取值,不做computed
+    const state = reactive({
+      style: store.state.app.theme.state.style,
+      primaryColor: store.state.app.theme.state.primaryColor,
+      primaryTextColor: store.state.app.theme.state.primaryTextColor,
+      menuType: store.state.app.theme.state.menuType
+    })
+    const themeColorArr = [
+      { color: '#409eff', textColor: '#fff', tip: '默认蓝' },
+      { color: '#d60f20', textColor: '#fff', tip: '玫瑰红' },
+      { color: '#ac25e6', textColor: '#fff', tip: '优雅紫' },
+      { color: '#4dc86f', textColor: '#fff', tip: '故事绿' },
+      { color: '#13c2c2', textColor: '#fff', tip: '明青' },
+      { color: '#333', textColor: '#fff', tip: '极客黑' }
+    ]
+    const setTheme = () => {
+      const userTheme = style[state.style]
+      const body = document.getElementsByTagName('body')[0]
+      // 设置全局顶部body上的class名称,即为主题名称,便于自定义配置符合当前主题的样式统一入口
+      body.className = state.style
+      // 需要设置的颜色参照theme.scss,位置:assets/style/theme.scss
+      // 设置主题色
+      body.style.setProperty('--system-primary-color', state.primaryColor)
+      for (let i in userTheme) {
+        const item = userTheme[i]
+        for (let y in item) {
+          let cssVarName = '--system-' + i + '-' + y.replace(/([A-Z])/g, "-$1").toLowerCase()
+          body.style.setProperty(cssVarName, item[y])
+        }
+      }
+    }
+    // 监听数据的变化
+    watch(state, (newVal) => {
+      const theme = {
+        state: {
+          ...state
+        }
+      }
+      store.commit('app/stateChange', {
+        name: 'theme',
+        value: theme
+      })
+      setTheme()
+    })
+    let drawer = ref(false)
+    const options = reactive([
+      { name: '是否显示LOGO', value: store.state.app.showLogo, store: 'showLogo' },
+      { name: '显示面包屑导航', value: store.state.app.showTabs, store: 'showTabs' },
+      { name: '保持一个菜单展开', value: store.state.app.expandOneMenu, store: 'expandOneMenu' }
+    ])
+    const drawerChange = (value) => {
+      drawer.value = value
+    }
+    const change = (option) => {
+      store.commit(`app/stateChange`, { name: option.store, value: option.value })
+    }
+    setTheme()
+    return {
+      drawer,
+      options,
+      state,
+      style,
+      themeColorArr,
+      drawerChange,
+      change
+    }
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+  i {
+    cursor: pointer;
+    &:focus {
+      outline: none;
+    }
+  }
+  
+  .list {
+    padding: 0 20px;
+    &-item {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      margin-bottom: 15px;
+      span {
+        font-size: 16px;
+      }
+    }
+  }
+  h3 {
+    margin-top: 40px;
+    margin-bottom: 20px;
+    color: rgba(0,0,0,.85);
+    font-size: 14px;
+    line-height: 22px;
+    text-align: left;
+    padding: 0 20px;
+    &:first-child {
+      margin-top: 0;
+    }
+  }
+  .theme-box {
+    text-align: left;
+    padding-left: 20px;
+  }
+</style>

+ 77 - 0
src/layout/Header/functionList/theme/theme-color.vue

@@ -0,0 +1,77 @@
+<template>
+  <el-tooltip class="item" effect="dark" :content="tip" placement="top">
+    <div class="theme-color" :style="{ 'background-color': color }" @click="handleClick">
+      <div class="active" v-if="active === color">
+        <i class="el-icon-check" :style="{'color': textColor}"></i>
+      </div>
+    </div>
+  </el-tooltip>
+</template>
+
+<script>
+import { defineComponent } from 'vue'
+export default defineComponent({
+  props: {
+    active: {
+      type: String,
+      default: ''
+    },
+    activeTextColor: {
+      type: String,
+      default: ''
+    },
+    tip: {
+      type: String,
+      default: '默认蓝'
+    },
+    color: {
+      type: String,
+      default: '#409eff'
+    },
+    textColor: {
+      type: String,
+      default: '#fff'
+    }
+  },
+  setup(props, ctx) {
+    // 点击事件,触发v-model修改active值
+    const handleClick = () => {
+      ctx.emit('update:active', props.color)
+      ctx.emit('update:activeTextColor', props.textColor)
+    }
+    return {
+      handleClick
+    }
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+  .theme-color {
+    border-radius: 4px;
+    width: 20px;
+    height: 20px;
+    display: inline-block;
+    cursor: pointer;
+    outline: none;
+    position:relative;
+    .active {
+      position: absolute;
+      width: 100%;
+      height: 100%;
+      top: 0;
+      left: 0;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      i {
+        color: #fff;
+        font-weight: bold;
+        font-size: 12px;
+      }
+    }
+    &+.theme-color{
+      margin-left: 10px;
+    }
+  }
+</style>

+ 130 - 0
src/layout/Header/functionList/theme/theme-icon.vue

@@ -0,0 +1,130 @@
+<template>
+  <el-tooltip class="item" effect="dark" :content="tip" placement="top">
+    <div class="theme-icon" @click="handleClick">
+      <div class="theme-icon-sidebar">
+        <div class="theme-icon-sidebar-logo" :style="{ 'background-color': logo }"></div>
+        <div class="theme-icon-sidebar-menu" :style="{ 'background-color': menu }"></div>
+      </div>
+      <div class="theme-icon-content">
+        <div class="theme-icon-content-header" :style="{ 'background-color': header }"></div>
+        <div class="theme-icon-content-main" :style="{ 'background-color': main }">
+          <div class="active" v-if="active === name">
+            <i class="el-icon-check" :style="{'color': activeColor}"></i>
+          </div>
+        </div>
+      </div>
+      
+    </div>
+  </el-tooltip> 
+  
+</template>
+
+<script>
+import { defineComponent } from 'vue'
+export default defineComponent({
+  props: {
+    name: {
+      type: String,
+      default: 'default'
+    },
+    active: {
+      type: String,
+      default: ''
+    },
+    menu: {
+      type: String,
+      defualt: ''
+    },
+    logo: {
+      type: String,
+      defualt: ''
+    },
+    header: {
+      type: String,
+      defualt: ''
+    },
+    main: {
+      type: String,
+      defualt: ''
+    },
+    tip: {
+      type: String,
+      default: '默认菜单风格'
+    },
+    activeColor: {
+      type: String,
+      default: ''
+    }
+  },
+  setup(props, ctx) {
+    // 点击事件,触发v-model修改active值
+    const handleClick = () => {
+      ctx.emit('update:active', props.name)
+    }
+    return {
+      handleClick
+    }
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+  .theme-icon {
+    display: inline-flex;
+    width: 50px;
+    height: 50px;
+    box-shadow: 0 1px 2.5px 0 rgba(0,0,0,.18);
+    cursor: pointer;
+    box-shadow: 0 2px 4px rgba(0,0,0,0.12),0 0 6px rgba(0,0,0,0.04);
+    outline: none;
+    border-radius: 4px;
+    overflow: hidden;
+    &-sidebar{
+      width: 18px;
+      display: flex;
+      flex-direction: column;
+      &-logo{
+        width: 20px;
+        height: 10px;
+        background-color: #263445;
+      }
+      &-menu{
+        flex: 1;
+        background-color: rgb(40, 65, 90);
+      }
+    }
+    &-content{
+      flex: 1;
+      display: flex;
+      flex-direction: column;
+      &-header{
+        height: 10px;
+        background-color: #fff;
+      }
+      &-main{
+        flex: 1;
+        background-color: #f8f8f8;
+        position: relative;
+        .active {
+          position: absolute;
+          width: 100%;
+          height: 100%;
+          top: 0;
+          left: 0;
+          display: flex;
+          justify-content: center;
+          align-items: center;
+          i {
+            color: #000;
+            font-weight: bold;
+            font-size: 22px;
+          }
+        }
+      }
+    }
+
+  }
+  .theme-icon+.theme-icon{
+    margin-left: 20px;
+  }
+</style>

+ 152 - 0
src/layout/Header/index.vue

@@ -0,0 +1,152 @@
+<template>
+  <header>
+    <div class="left-box">
+      <!-- 收缩按钮 -->
+      <div class="menu-icon" @click="opendStateChange">
+        <i class="iconfont" :class="isCollapse ? 'icon-caidanzhankai':'icon-caidanshouqi'" style="font-size:24px;"></i>
+      </div>
+      <Breadcrumb />
+    </div>
+    <div class="right-box">
+      <!-- 快捷功能按钮 -->
+      <div class="function-list">
+        <div class="function-list-item hidden-sm-and-down">
+          <Full-screen />
+        </div>
+        <div class="function-list-item"><SizeChange /></div>
+        <div class="function-list-item hidden-sm-and-down"><Theme /></div>
+      </div>
+      <!-- 用户信息 -->
+      <div class="user-info">
+        <el-avatar src="https://i.loli.net/2017/08/21/599a521472424.jpg" style="margin-top:1px;" size="small"/>
+        <el-dropdown>
+          <div class="el-dropdown-link">
+            <span>{{userInfo.nickName || '请登录'}}</span> 
+            <i class="iconfont icon-xialazhankai" style="font-size:14px;margin-left: 3px;"></i>
+          </div>
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item @click="loginOut">退出登录</el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+      </div>
+    </div>
+  </header>
+</template>
+
+<script>
+import { defineComponent, computed, reactive } from 'vue'
+import { useStore } from 'vuex'
+import { useRouter, useRoute } from 'vue-router'
+import FullScreen from './functionList/fullscreen.vue'
+import SizeChange from './functionList/sizeChange.vue'
+import Theme from './functionList/theme.vue'
+import Breadcrumb from './Breadcrumb.vue'
+import { ElMessage } from 'element-plus'
+export default defineComponent({
+  components: {
+    FullScreen,
+    Breadcrumb,
+    SizeChange,
+    Theme,
+  },
+  setup() {
+    const store = useStore()
+    const router = useRouter()
+    const route = useRoute()
+    const layer = reactive({
+      show: false,
+      showButton: true
+    })
+
+    const userInfo = computed(()=>store.state.user.userInfo)
+    const isCollapse = computed(() => store.state.app.isCollapse)
+    // isCollapse change to hide/show the sidebar
+    const opendStateChange = () => {
+      store.commit('app/isCollapseChange', !isCollapse.value)
+    }
+
+    // login out the system
+    const loginOut = () => {
+      store.dispatch('user/loginOut').then(() => {
+        ElMessage.success({
+          message: '退出登录成功',
+          type: 'success',
+          showClose: true,
+          duration: 1000
+        })
+        router.push('/login')
+      })
+    }
+    
+  
+    return {
+      isCollapse,
+      layer,
+      opendStateChange,
+      loginOut,
+      userInfo,
+    }
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+  header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    height: 60px;
+    background-color: var(--system-header-background);
+    padding-right: 22px;
+  }
+  .left-box {
+    height: 100%;
+    display: flex;
+    align-items: center;
+    border-left: 1px solid var(--system-header-border-color);
+    .menu-icon {
+      width: 60px;
+      height: 100%;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      font-size: 25px;
+      font-weight: 100;
+      cursor: pointer;
+      margin-right: 10px;
+      &:hover {
+        background-color: var(--system-header-item-hover-color);
+      }
+      i {
+        color: var(--system-header-text-color);
+      }
+    }
+  }
+  .right-box {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    .function-list{
+      display: flex;
+      .function-list-item {
+        width: 30px;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        :deep(i) {
+          color: var(--system-header-text-color);
+        }
+      }
+    }
+    .user-info {
+      margin-left: 20px;
+      .el-dropdown-link {
+        margin-top: 8px;
+        margin-left: 5px;
+        color: var(--system-header-breadcrumb-text-color);
+      }
+    }
+  }
+</style>

+ 47 - 0
src/layout/Logo/index.vue

@@ -0,0 +1,47 @@
+<template>
+  <div class="logo-container">
+    <Row>
+      <Col :span="isCollapse?24:5" class="login-posi">
+        <img src="@/assets/AYN.png" style="width:70%;" alt="">
+      </Col>
+      <Col span="19" v-if="!isCollapse">
+        <h1>{{ systemTitle }}</h1>
+      </Col>
+    </Row>
+  </div>
+</template>
+
+<script>
+import { defineComponent, computed } from 'vue'
+import { useStore } from 'vuex'
+import { systemTitle } from '@/config'
+export default defineComponent({
+  setup() {
+    const store = useStore()
+    const isCollapse = computed(() => store.state.app.isCollapse)
+    return {
+      isCollapse,
+      systemTitle
+    }
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+  .logo-container {
+    height: 60px;
+    width: 100%;
+    background-color: var(--system-logo-background);
+    .login-posi{
+      height: 60px;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+    h1 {
+      font-size: 20px;
+      white-space: nowrap;
+      color: var(--system-logo-color);
+    }
+  }
+</style>

+ 41 - 0
src/layout/Menu/Link.vue

@@ -0,0 +1,41 @@
+<template>
+  <component :is="type" v-bind="linkProps(to)" @click="hideMenu" >
+    <slot>
+    </slot>
+  </component>
+</template>
+<script>
+import { defineComponent, computed } from 'vue'
+import { useStore } from "vuex";
+export default defineComponent({
+  name: 'appLink',
+  props: {
+    to: {
+      type: String,
+      required: true
+    }
+  },
+  setup(props) {
+    const store = useStore();
+    const isCollapse = computed(() => store.state.app.isCollapse);
+    const linkProps = (to) => {
+     return {
+       to: to
+     } 
+    }
+    const hideMenu = () => {
+      if (document.body.clientWidth <= 1000 && !isCollapse.value) {
+        store.commit("app/isCollapseChange", true);
+      }
+    };
+    return {
+      type: "router-link",
+      linkProps,
+      hideMenu
+    }
+  }
+})
+</script>
+<style lang="">
+  
+</style>

+ 100 - 0
src/layout/Menu/MenuItem.vue

@@ -0,0 +1,100 @@
+<template>
+  <template v-if="!menu.hideMenu">
+    <el-sub-menu v-if="showMenuType === 2" :index="pathResolve">
+      <template #title v-if="!menu.meta.hideMenuItem">
+        <i :class="'iconfont'+' '+menu.meta.icon" v-if="menu.meta.icon"></i>
+        <span class="marginLeft5">{{ menu.meta.title }}</span>
+      </template>
+      <menu-item v-for="(item, key) in menu.children" :key="key" :menu="item" :basePath="pathResolve" />
+    </el-sub-menu>
+    <app-link v-else-if="showMenuType === 1" :to="pathResolve">
+      <el-menu-item :index="pathResolve" v-if="(!menu.children[0].children || menu.children[0].children.length === 0)&&!menu.meta.hideMenuItem">
+        <i :class="'iconfont'+' '+menu.children[0].meta.icon || menu.meta.icon" v-if="menu.children[0].meta.icon || menu.meta.icon"></i>
+        <template #title><span class="marginLeft5">{{ menu.children[0].meta.title }}</span></template>
+      </el-menu-item>
+      <el-sub-menu v-else :index="pathResolve">
+        <template #title v-if="!menu.meta.hideMenuItem">
+          <i :class="'iconfont'+' '+menu.children[0].meta.icon || menu.meta.icon" v-if="menu.children[0].meta.icon || menu.meta.icon"></i>
+          <span class="marginLeft5">{{ menu.children[0].meta.title }}</span>
+        </template>
+        <menu-item v-for="(item, key) in menu.children[0].children" :key="key" :menu="item" :basePath="pathResolve" />
+      </el-sub-menu>
+    </app-link>
+    <app-link v-else :to="pathResolve">
+      <el-menu-item :index="pathResolve" v-if="!menu.meta.hideMenuItem">
+        <i :class="'iconfont'+' '+menu.meta.icon" v-if="menu.meta.icon"></i>
+        <template #title><span class="marginLeft5">{{ menu.meta.title }}</span></template>
+      </el-menu-item>
+    </app-link>
+  </template>
+</template>
+
+<script>
+import { defineComponent, computed } from 'vue'
+import appLink from './Link.vue'
+export default defineComponent({
+  name: 'menu-item',
+  props: {
+    menu: {
+      type: Object,
+      required: true
+    },
+    basePath: {
+      type: String,
+      default: ''
+    }
+  },
+  components: {
+    appLink
+  },
+
+  setup(props) {
+    const menu = props.menu
+    // todo: 优化if结构
+    const showMenuType = computed(() => { // 0: 无子菜单, 1:有1个子菜单, 2:显示上下级子菜单
+      if (menu.children && (menu.children.length > 1 || (menu.children.length === 1 && menu.alwayShow))) {
+        return 2
+      } else if (menu.children && menu.children.length === 1 && !menu.alwayShow) {
+        return 1
+      } else {
+        return 0
+      }
+    })
+    // todo: 优化多层if
+    const pathResolve = computed(() => {
+      let path = ''
+      if (showMenuType.value === 1) {
+        if (menu.children[0].path.charAt(0) === '/') {
+          path = menu.children[0].path
+        } else {
+          let char = '/'
+          if (menu.path.charAt(menu.path.length - 1) === '/') {
+            char = ''
+          }
+          path = menu.path + char + menu.children[0].path
+        }
+      } else {
+        path = menu.path
+      }
+      path = props.basePath ? props.basePath + '/' + path : path
+      return path
+    })
+    return {
+      showMenuType,
+      pathResolve
+    }
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+  .el-sub-menu {
+    text-align: left;
+  }
+  .el-menu-item {
+    text-align: left;
+  }
+  .marginLeft5{
+    margin-left: 5px;
+  }
+</style>

+ 120 - 0
src/layout/Menu/index.vue

@@ -0,0 +1,120 @@
+<template>
+  <el-scrollbar>
+    <el-menu
+      class="layout-menu system-scrollbar"
+      background-color="var(--system-menu-background)"
+      text-color="var(--system-menu-text-color)"
+      active-text-color="var(--system-primary-color)"
+      :default-active="activeMenu"
+      :class="isCollapse? 'collapse': ''"
+      :collapse="isCollapse"
+      :collapse-transition="false"
+      :unique-opened="expandOneMenu"
+    >
+      <menu-item v-for="(menu, key) in allRoutes" :key="key" :menu="menu" />
+    </el-menu>
+  </el-scrollbar>
+</template>
+
+<script>
+import { defineComponent, computed, onMounted } from 'vue'
+import { useRouter, useRoute } from 'vue-router'
+import { useStore } from 'vuex'
+import MenuItem from './MenuItem.vue'
+export default defineComponent({
+  components: {
+    MenuItem
+  },
+
+  setup() {
+    const store = useStore()
+    const isCollapse = computed(() => store.state.app.isCollapse)
+    const expandOneMenu = computed(() => store.state.app.expandOneMenu)
+    const allRoutes = useRouter().options.routes
+    const route = useRoute()
+    const activeMenu = computed(() => {
+      const { meta, path } = route;
+      if (meta.activeMenu) {
+        return meta.activeMenu;
+      }
+      return path;
+    });
+    
+    onMounted(() => {
+
+    })
+    return {
+      isCollapse,
+      expandOneMenu,
+      allRoutes,
+      activeMenu,
+    }
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+  .el-scrollbar {
+    background-color: var(--system-menu-background);
+  }
+  .layout-menu {
+    border-right:0px solid;
+    width: 100%;
+    &.collapse {
+      margin-left: 0px;
+    }
+    :deep() {
+      .el-menu-item, .el-submenu {
+        background-color: var(--system-menu-background) !important;
+      }
+      .el-menu-item i, .el-menu-item-group__title, .el-submenu__title i {
+        color: var(--system-menu-text-color);
+      }
+      .el-menu-item, .el-submenu__title{
+        &.is-active {
+          background-color: var(--system-primary-color) !important;
+          color: var(--system-primary-text-color) !important;
+          i {
+            color: var(--system-primary-text-color) !important;
+          }
+          &:hover {
+            background-color: var(--system-primary-color) !important;
+            color: var(--system-primary-text-color) !important;
+          }
+        }
+        &:hover {
+          background-color: var(--system-menu-hover-background) !important;
+        }
+      }
+      .el-submenu {
+        &.is-active {
+          >.el-submenu__title, >.el-submenu__title i {
+            color: var(--system-menu-submenu-active-color) !important;
+          }
+        }
+        .el-menu-item {
+          background-color: var(--system-menu-children-background) !important;
+          &.is-active {
+            background-color: var(--system-primary-color) !important;
+            color: var(--system-primary-text-color) !important;
+            &:hover {
+              background-color: var(--system-primary-color) !important;
+              color: var(--system-primary-text-color) !important;
+            }
+          }
+          &:hover {
+            background-color: var(--system-menu-hover-background) !important;
+          }
+        }
+      }
+      .el-submenu {
+        .el-submenu__title {
+          background-color: var(--system-menu-children-background) !important;
+          &:hover {
+            background-color: var(--system-menu-hover-background) !important;
+          }
+        }
+      }
+    }
+  }
+</style>

+ 159 - 0
src/layout/Menu/menu.js

@@ -0,0 +1,159 @@
+/**
+ * 左侧菜单栏显示的项目
+ */
+
+
+
+export default [
+  {code:"1001260001",name: "系统操作日志",privileges:[],"file":"systemOperation","routePath":"","isRoute":true},
+  {code:"1001030300",name: "用户管理",privileges:[],"file":"roleManager/userList","routePath":"","isRoute":true},
+  {code:"1001030200",name: "权限名称管理",privileges:[],"file":"roleManager/roleName","routePath":"","isRoute":true},
+  {code:"1001030500",name: "用户角色管理",noShow:true,privileges:[],"file":"roleManager/roleManager","routePath":"","isRoute":true},
+  {code:"1001030600",name: "角色权限管理",privileges:[],"file":"roleManager/roleList","roleManager":"","isRoute":true},,
+  {code:"1001990202",name: "订单管理",privileges:[
+      {
+          code:"1001020200",
+          name: "订单列表",
+          privileges:[],
+          "file":"orderManager/orderList",
+          "routePath":"",
+          "isRoute":true
+      },
+      {
+          code:"1001020205",
+          name: "订单列表(管理员)",
+          privileges:[],
+          "file":"ororderManagerder/orderAdminList",
+          "routePath":"",
+          "isRoute":true
+      },
+      {
+          code:"1001020206",
+          name: "货运物流审核",
+          privileges:[],
+          "file":"orderManager/cargoLogisticsAudit",
+          "routePath":"",
+          "isRoute":true
+      },
+  ]},
+  {code:"1001990103",name: "电商用户管理",privileges:[
+      {
+          code:"1001010300",
+          name: "电商用户列表",
+          privileges:[],
+          "file":"ecommerceManager/ecommerceList",
+          "routePath":"",
+          "isRoute":true
+      },
+        // 注销用户 2021
+        {
+            code:"1001010305",
+            name: "注销管理",
+            privileges:[],
+            "file":"ecommerceManager/logoffManage",
+            "routePath":"",
+            "isRoute":true
+        }
+  ]},
+  {code:"1001990805",name: "商品管理",privileges:[
+      {
+          code:"1001080300",
+          name: "商品分类管理",
+          privileges:[],
+          "file":"shopItemManager/itemClassify",
+          "routePath":"",
+          "isRoute":true
+      },
+      {
+          code:"1001080500",
+          name: "商品管理",
+          privileges:[],
+          nameEN:'3',
+          "file":"shopItemManager/itemList",
+          "routePath":"",
+          "isRoute":true
+      },
+      {
+          code:"1001080600",
+          name: "审核上架商品",
+          privileges:[],
+          nameEN:'2',
+          "file":"shopItemManager/itemUp",
+          "routePath":"",
+          "isRoute":true
+      },
+      {
+          code:"1111111111",
+          name: "审核下架商品",
+          privileges:[],
+          nameEN:'1',
+          "file":"shopItemManager/itemOff",
+          "routePath":"",
+          "isRoute":true
+      },
+      {
+          code:"1001080506",
+          name: "复核违规下架商品",
+          privileges:[],
+          nameEN:'5',
+          "file":"shopItemManager/recheckIllegalltemOff",
+          "routePath":"",
+          "isRoute":true
+      },
+      {
+          code:"1001080700",
+          name: "商品违规下架",
+          privileges:[],
+          nameEN:'4',
+          "file":"shopItemManager/illegalItemOfff",
+          "routePath":"",
+          "isRoute":true
+      },
+      {
+        code:"1001080504",
+        name: "待审事项",
+        privileges:[],
+        nameEN:'4',
+        "file":"shopItemManager/waitAuitMatters",
+        "routePath":"",
+        "isRoute":true
+      },
+      {
+        code:"1001080505",
+        name: "已审事项",
+        privileges:[],
+        nameEN:'4',
+        "file":"shopItemManager/auitMatters",
+        "routePath":"",
+        "isRoute":true
+      },
+      {
+          code:"1001990020",
+          name:"商品预警管理",
+          privileges:[],
+          "file":"shopItemManager/warningManage",
+          "routePath":"",
+          "isRoute":true
+      },
+      {
+          code:"1001080510",
+          name:"商品审核项管理",
+          privileges:[],
+          "file":"shopItemManager/auditItemsManage",
+          "routePath":"",
+          "isRoute":true
+      },
+      {
+          code:"1001980805",
+          name:"砍价商品管理",
+          privileges:[],
+          "file":"shopItemManager/bargainManage",
+          "routePath":"",
+          "isRoute":true
+      },
+  ]},
+]
+
+
+
+

+ 265 - 0
src/layout/Tabs/index.vue

@@ -0,0 +1,265 @@
+<template>
+  <div class="tabs">
+    <el-scrollbar class="scroll-container tags-view-container" ref="scrollbarDom">
+      <Item
+        v-for="menu in menuList"
+        :key="menu.meta.title"
+        :menu="menu"
+        :active="activeMenu.path === menu.path"
+        @close="delMenu(menu)"
+        @reload="pageReload"
+      />
+    </el-scrollbar>
+    <div class="handle">
+      <el-dropdown placement="bottom">
+        <div class="el-dropdown-link">
+          <i class="iconfont icon-xialajiantouxiao"></i>
+        </div>
+        <template #dropdown>
+          <el-dropdown-menu>
+            <el-dropdown-item @click="pageReload">重新加载</el-dropdown-item>
+            <el-dropdown-item :disabled="currentDisabled" @click="closeCurrentRoute">关闭当前标签</el-dropdown-item>
+            <el-dropdown-item :disabled="menuList.length < 3" @click="closeOtherRoute">关闭其他标签</el-dropdown-item>
+            <el-dropdown-item :disabled="menuList.length <= 1" @click="closeAllRoute">关闭所有标签</el-dropdown-item>
+          </el-dropdown-menu>
+        </template>
+      </el-dropdown>
+      <i class="iconfont" :class="contentFullScreen?'icon-tuichuquanping':'icon-quanping1'" @click="onFullscreen"></i>
+    </div>
+  </div>
+</template>
+
+<script>
+import { defineComponent, computed, unref, watch, reactive, ref, nextTick } from 'vue'
+import Item from './item.vue'
+import { useStore } from 'vuex'
+import { useRoute, useRouter } from 'vue-router'
+import tabsHook from './tabsHook'
+export default defineComponent({
+  components: {
+    Item
+  },
+  setup() {
+    const store = useStore()
+    const route = useRoute()
+    const router = useRouter()
+    const scrollbarDom = ref(null)
+    const allRoutes = router.options.routes
+    const defaultMenu = {
+      path: '/dashboard',
+      meta: { title: '首页', hideClose: true }
+    }
+    const contentFullScreen = computed(() => store.state.app.contentFullScreen)
+    const currentDisabled = computed(() => route.path === defaultMenu.path)
+
+    let activeMenu = reactive({ path: '' })
+    let menuList = ref(tabsHook.getItem())
+    if (menuList.value.length === 0) { // 判断之前有没有调用过
+      addMenu(defaultMenu)
+    } 
+    watch(menuList.value, (newVal) => {
+      tabsHook.setItem(newVal)
+    })
+    watch(menuList, (newVal) => {
+      tabsHook.setItem(newVal)
+    })
+    router.afterEach(() => {
+      addMenu(route)
+      initMenu(route)
+    })
+
+    // 全屏
+    function onFullscreen() {
+      store.commit('app/contentFullScreenChange', !contentFullScreen.value)
+    }
+    // 当前页面组件重新加载
+    function pageReload() {
+      const self = route.matched[route.matched.length-1].instances.default
+      // console.log(route.matched);
+      
+      self.handleReload();
+      // const { fullPath, meta, name } = unref(route);
+      // if (meta.cache && name) {
+      //   store.commit('keepAlive/delKeepAliveComponentsName', name)
+      // }
+      // router.replace({
+      //   path: "/redirect" + fullPath
+      // });
+    }
+
+    // 关闭当前标签,首页不关闭
+    function closeCurrentRoute() {
+      if (route.path !== defaultMenu.path) {
+        delMenu(route)
+      }
+    }
+    // 关闭除了当前标签之外的所有标签
+    function closeOtherRoute() {
+      menuList.value = [defaultMenu]
+      if (route.path !== defaultMenu.path) {
+        addMenu(route)
+      }
+      setKeepAliveData()
+    }
+
+    // 关闭所有的标签,除了首页
+    function closeAllRoute() {
+      menuList.value = [defaultMenu]
+      setKeepAliveData()
+      router.push(defaultMenu.path)
+    }
+
+    // 添加新的菜单项
+    function addMenu(menu) {
+      let { path, meta, name } = menu
+      if (meta.hideTabs) {
+        return
+      }
+      let hasMenu = menuList.value.some((obj) => {
+        return obj.path === path
+      })
+      if (!hasMenu) {
+        menuList.value.push({
+          path,
+          meta,
+          name
+        })
+      }
+    }
+
+    // 删除菜单项
+    function delMenu(menu) {
+      let index = 0
+      if (!menu.meta.hideClose) {
+        if (menu.meta.cache && menu.name) {
+          store.commit('keepAlive/delKeepAliveComponentsName', menu.name)
+        }
+        index = menuList.value.findIndex((item) => item.path === menu.path)
+        menuList.value.splice(index, 1)
+      }
+      if (menu.path === activeMenu.path) {
+        index - 1 > 0 ? router.push(menuList.value[index - 1].path) : router.push(defaultMenu.path)
+      }
+    }
+
+    // 初始化activeMenu
+    function initMenu(menu) {
+      activeMenu = menu
+      nextTick(() => {
+        // setPosition()
+      })
+    }
+    // 设置当前滚动条应该在的位置
+    function setPosition() {
+      console.log('查看当前什么值',scrollbarDom);
+      if (scrollbarDom.value) {
+        const domBox = {
+          scrollbar: scrollbarDom.value.scrollbar.querySelector('.el-scrollbar__wrap '),
+          activeDom: scrollbarDom.value.scrollbar.querySelector('.active'),
+          activeFather: scrollbarDom.value.scrollbar.querySelector('.el-scrollbar__view')
+        }
+        for (let i in domBox) {
+          if (!domBox[i]) {
+            return
+          }
+        }
+        const domData = {
+          scrollbar: domBox.scrollbar.getBoundingClientRect(),
+          activeDom: domBox.activeDom.getBoundingClientRect(),
+          activeFather: domBox.activeFather.getBoundingClientRect()
+        }
+        const num = domData.activeDom.x - domData.activeFather.x + 1/2 * domData.activeDom.width - 1/2 * domData.scrollbar.width
+        domBox.scrollbar.scrollLeft = num
+      }
+    }
+
+    // 配置需要缓存的数据
+    function setKeepAliveData() {
+      let keepAliveNames = []
+      menuList.value.forEach((menu) => {
+        menu.meta && menu.meta.cache && menu.name && keepAliveNames.push(menu.name)
+      })
+      store.commit('keepAlive/setKeepAliveComponentsName', keepAliveNames)
+    }
+    
+    // 初始化时调用:1. 新增菜单 2. 初始化activeMenu
+    addMenu(route)
+    initMenu(route)
+    return {
+      contentFullScreen,
+      onFullscreen,
+      pageReload,
+      scrollbarDom,
+      // 菜单相关
+      menuList,
+      activeMenu,
+      delMenu,
+      closeCurrentRoute,
+      closeOtherRoute,
+      closeAllRoute,
+      currentDisabled
+    }
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+  .tabs {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    height: 40px;
+    background: var(--system-header-background);
+    border-bottom: 1px solid var(--system-header-border-color);
+    border-top: 1px solid var(--system-header-border-color);
+    border-left: 1px solid var(--system-header-border-color);
+    box-shadow: 0 1px 4px 0 rgba(0, 0, 0, .1);
+    .handle {
+      min-width: 95px;
+      height: 100%;
+      display: flex;
+      align-items: center;
+      .el-dropdown-link {
+        margin-top: 5px;
+        border-left: 1px solid var(--system-header-border-color);
+        height: 25px;
+        width: 40px;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+      }
+      i {
+        color: var(--system-header-text-color);
+      }
+    }
+  }
+  .scroll-container {
+    white-space: nowrap;
+    position: relative;
+    overflow: hidden;
+    width: 100%;
+    :deep {
+      .el-scrollbar__bar {
+        bottom: 0px;
+      }
+      .el-scrollbar__wrap {
+        height: 49px;
+      }
+    }
+  }
+  .tags-view-container {
+    height: 34px;
+    flex: 1;
+    width: 100%;
+    display: flex;
+  }
+  .el-icon-full-screen {
+    cursor: pointer;
+    &:hover {
+      background: rgba(0,0,0,.025);
+    }
+    &:focus {
+      outline: none;
+    }
+  }
+</style>

+ 100 - 0
src/layout/Tabs/item.vue

@@ -0,0 +1,100 @@
+<template>
+  <div class="tags-view-item" :class="active? 'active' : ''">
+    <router-link :to="menu.path" v-if="menu.meta.title">
+      {{ menu.meta.title }}
+    </router-link>
+    <i class="iconfont icon-shuaxin"  @click.stop="reload" v-if="active" style="font-size:14px;"></i>
+    <i class="iconfont icon-guanbi1"  @click.stop="closeTab" v-if="!menu.meta.hideClose" alt="关闭当前标签页" style="font-size:14px;"></i>
+  </div>
+</template>
+
+<script>
+import { defineComponent } from 'vue'
+export default defineComponent({
+  props: {
+    menu: {
+      type: Object,
+      default: () => {
+        return {
+          path: '',
+          meta: {
+            label: '',
+            hideClose: false
+          }
+        }
+      }
+    },
+    active: {
+      type: Boolean,
+      default: false
+    }
+  },
+  setup(props, { emit }) {
+    // 关闭按钮
+    function closeTab() {
+      emit('close')
+    }
+    // 刷新按钮
+    function reload() {
+      emit('reload')
+    }
+    return {
+      closeTab,
+      reload
+    }
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+  .tags-view-item {
+    display: inline-block;
+    position: relative;
+    cursor: pointer;
+    height: 24px;
+    line-height: 24px;
+    border: 1px solid var(--system-header-border-color);
+    color: var(--system-header-text-color);
+    background: var(--system-header-tab-background);
+    padding: 0 8px;
+    font-size: 12px;
+    margin-left: 5px;
+    margin-top: 4px;
+    border-radius: 2px;
+    a {
+      color: var(--system-header-text-color);
+      height: 26px;
+      display: inline-block;
+      padding-left: 8px;
+      padding-right: 8px;
+    }
+    .el-icon-refresh-right {
+      display: inline-block;
+      margin-right: 5px;
+    }
+    .el-icon-close {
+      display: inline-block;
+      height: 26px;
+    }
+    &:first-of-type {
+      margin-left: 15px;
+    }
+    &:last-of-type {
+      margin-right: 15px;
+    }
+    &.active {
+      background: var(--system-primary-color);
+      border-color: var(--system-primary-color);
+      color: var(--system-primary-text-color);
+      a {
+        color: var(--system-primary-text-color);
+      }
+      &:hover {
+        background: var(--system-primary-color);
+      }
+    }
+    &:hover {
+      background-color: var(--system-header-item-hover-color);
+    }
+  }
+</style>

+ 9 - 0
src/layout/Tabs/tabsHook.js

@@ -0,0 +1,9 @@
+const tabsHook = {
+  setItem: function(arr) {
+    localStorage.setItem('tabs', JSON.stringify(arr))
+  },
+  getItem: function() {
+    return JSON.parse(localStorage.getItem('tabs') || '[]')
+  }
+}
+export default tabsHook

+ 134 - 0
src/layout/index.vue

@@ -0,0 +1,134 @@
+<template>
+  <el-container style="height: 100vh">
+    <div class="mask" v-show="!isCollapse && !contentFullScreen" @click="hideMenu"></div>
+    <el-aside
+      :width="isCollapse ? '60px' : '250px'"
+      :class="isCollapse ? 'hide-aside' : 'show-side'"
+      v-show="!contentFullScreen"
+    >
+      <Logo v-if="showLogo" />
+      <Menu />
+    </el-aside>
+    <el-container>
+      <el-header v-show="!contentFullScreen">
+        <Header />
+      </el-header>
+      <Tabs v-show="showTabs" />
+      <el-main>
+        <router-view v-slot="{ Component, route }">
+          <transition :name="route.meta.transition || 'fade-transform'" mode="out-in">
+            <keep-alive v-if="keepAliveComponentsName" :include="keepAliveComponentsName">
+              <component :is="Component" :key="route.fullPath" />
+            </keep-alive>
+            <component v-else :is="Component" :key="route.fullPath" />
+          </transition>
+        </router-view>
+      </el-main>
+    </el-container>
+  </el-container>
+</template>
+
+<script>
+import { defineComponent, computed, onBeforeMount } from "vue";
+import { useStore } from "vuex";
+import { useRouter } from "vue-router";
+import { useEventListener } from "@vueuse/core";
+import Menu from "./Menu/index.vue";
+import Logo from "./Logo/index.vue";
+import Header from "./Header/index.vue";
+import Tabs from "./Tabs/index.vue";
+export default defineComponent({
+  components: {
+    Menu,
+    Logo,
+    Header,
+    Tabs,
+  },
+  setup() {
+    const store = useStore();
+    // computed
+    const isCollapse = computed(() => store.state.app.isCollapse);
+    const contentFullScreen = computed(() => store.state.app.contentFullScreen);
+    const showLogo = computed(() => store.state.app.showLogo);
+    const showTabs = computed(() => store.state.app.showTabs);
+    const keepAliveComponentsName = computed(() => store.getters['keepAlive/keepAliveComponentsName']);
+    // 页面宽度变化监听后执行的方法
+    const resizeHandler = () => {
+      if (document.body.clientWidth <= 1000 && !isCollapse.value) {
+        store.commit("app/isCollapseChange", true);
+      } else if (document.body.clientWidth > 1000 && isCollapse.value) {
+        store.commit("app/isCollapseChange", false);
+      }
+    };
+    // 初始化调用
+    resizeHandler();
+    // beforeMount
+    onBeforeMount(() => {
+      // 监听页面变化
+      useEventListener("resize", resizeHandler);
+    });
+    // methods
+    // 隐藏菜单
+    const hideMenu = () => {
+      store.commit("app/isCollapseChange", true);
+    };
+    return {
+      isCollapse,
+      showLogo,
+      showTabs,
+      contentFullScreen,
+      keepAliveComponentsName,
+      hideMenu,
+    };
+  },
+});
+</script>
+
+<style lang="scss" scoped>
+.el-header {
+  padding-left: 0;
+  padding-right: 0;
+}
+.el-aside {
+  display: flex;
+  flex-direction: column;
+  transition: 0.2s;
+  overflow-x: hidden;
+  transition: 0.3s;
+  &::-webkit-scrollbar {
+    width: 0 !important;
+  }
+}
+.el-main {
+  background-color: var(--system-container-background);
+  height: 100%;
+  padding: 0;
+}
+.el-main-box {
+  width: 100%;
+  height: 100%;
+  overflow-y: auto;
+  box-sizing: border-box;
+}
+@media screen and (max-width: 1000px) {
+  .el-aside {
+    position: fixed;
+    top: 0;
+    left: 0;
+    height: 100vh;
+    z-index: 1000;
+    &.hide-aside {
+      left: -250px;
+    }
+  }
+  .mask {
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 100vw;
+    height: 100vh;
+    z-index: 999;
+    background: rgba(0, 0, 0, 0.5);
+  }
+}
+</style>

+ 24 - 0
src/main.js

@@ -0,0 +1,24 @@
+import { createApp } from 'vue'
+import App from './App.vue'
+import store from './store'
+import router from './router'
+// 引入iview
+import ViewUIPlus from 'view-ui-plus'
+import 'view-ui-plus/dist/styles/viewuiplus.css'
+import ElementPlus from 'element-plus'
+import 'element-plus/dist/index.css'
+import 'normalize.css' // css初始化
+import './assets/style/common.scss' // 公共css
+import '@/assets/iconfont/iconfont.css'
+import * as ElementPlusIconsVue from '@element-plus/icons-vue'
+
+const app = createApp(App)
+for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
+  app.component(key, component)
+}
+app.use(store)
+// app.config.performance = true
+app.use(ViewUIPlus)
+app.use(ElementPlus, { size: store.state.app.elementSize })
+
+app.use(router).mount('#app')

+ 20 - 0
src/request/api.js

@@ -0,0 +1,20 @@
+
+import * as apiUser from './modules/apiUser'    //用户服务系统
+import * as apiItem  from './modules/apiItem' //item
+import * as apiSku  from './modules/apiSku' //sku
+import * as apiShop  from './modules/apiShop' //item
+import * as apiMnp from './modules/apiMnp'  //Mnp业务
+import * as apiManager from './modules/apiManager'  //
+import * as apiOrder from './modules/apiOrder'  //
+import * as apiMarket from './modules/apiMarket'  //
+import * as apiContent from './modules/apiContent'  //
+
+export const user = apiUser
+export const item  = apiItem
+export const sku  = apiSku
+export const shop  = apiShop
+export const mnp = apiMnp 
+export const manager = apiManager
+export const order = apiOrder
+export const market = apiMarket
+export const content = apiContent

+ 46 - 0
src/request/apiConfig.js

@@ -0,0 +1,46 @@
+// 接口配置文件
+let env = process.env.NODE_ENV
+let api
+if (env === 'development') {  //开发环境
+  api = {
+    apiUser: 'http://account2.aiyangniu.net',
+    apiItem: 'http://items2.aiyangniu.net',
+    apiSku: 'http://items2.aiyangniu.net',
+    apiShop: 'http://items2.aiyangniu.net',
+    apiManager: 'http://manager2.aiyangniu.net',
+    apiAccount: 'http://account.aiyangniu.net',
+    apiOrder: 'http://orders2.aiyangniu.net',
+    apiMnp:'http://mengniupay.aiyangniu.net',
+    apiMarket:'http://market2.aiyangniu.net',
+    apiContent: 'http://contents2.aiyangniu.net',
+  }
+} else if (env === 'testing') {
+  api = {
+    apiUser: 'http://account2.aiyangniu.net',
+    apiItem: 'http://items2.aiyangniu.net',
+    apiSku: 'http://items2.aiyangniu.net',
+    apiShop: 'http://items2.aiyangniu.net',
+    apiManager: 'http://manager2.aiyangniu.net', 
+    apiAccount: 'http://account.aiyangniu.net',
+    apiOrder: 'http://orders2.aiyangniu.net',
+    apiMnp:'http://mengniupay.aiyangniu.net',
+    apiMarket:'http://market2.aiyangniu.net',
+    apiContent: 'http://contents2.aiyangniu.net',
+  }
+} else { //生产环境
+  api = {
+    apiUser: 'http://account.aiyangniu.cn',
+    apiItem: 'http://items.aiyangniu.cn',
+    apiSku: 'http://items.aiyangniu.cn',
+    apiShop: 'http://items.aiyangniu.cn',
+    apiManager: 'http://manager.aiyangniu.cn',
+    apiAccount: 'http://account.aiyangniu.cn',
+    apiOrder: 'http://orders.aiyangniu.cn',
+    apiMarket:'https://market.aiyangniu.cn',
+    apiMnp:'http://orders.aiyangniu.cn',
+    apiContent:'https://contents.aiyangniu.cn',
+  }
+}
+
+
+export default api

+ 41 - 0
src/request/modules/apiContent.js

@@ -0,0 +1,41 @@
+/**
+ * 内容服务系统
+ * apiContent:'http://10.162.16.5:8070'  //内容服务系统
+ */
+import res from '@/utils/system/request.js'
+
+
+/**
+  * 内容管理
+  * contents : Content Controller
+  */
+/* 获取内容列表 */
+export const GetContent = (params) => res('get', 'apiContent', '/contents/{contentTypeId}/list', {...params,params})
+
+/* 获取品牌展示数据 */
+export const GetHomeBrand = (params) => res('get','apiShop', '/brandSelections/list', {params:params})
+
+/* 获取楼层数据 */
+export const GetHomePublicity = (params) => res('get','apiItem', '/publicitys/v2/list/{location}/{code}', {params:params})
+
+/*商品评价*/
+export const GetItemCommentList= (params) => res('get','apiComment', '/comments/list/{itemId}',{params:params});
+
+/**
+ * 新闻
+ */
+  export const GetArticleDetail = (params) => res('get','apiContent', '/contents/list/{id}', {params:params})
+
+/**
+ * admin
+ */
+/**
+ * 内容类别
+ */
+  export const GetTypeList = (params) => res('get','apiContent', '/manager/contentTypes/list', {params:params})
+
+
+  /**
+ * MMS 内容列表
+ */
+export const GetContentList = (params) => res('get','apiContent', '/manager/contents/list', {params:params})

+ 462 - 0
src/request/modules/apiItem.js

@@ -0,0 +1,462 @@
+/**
+ * 商品服务系统
+ * apiItem:'http://10.162.16.5:8020',    //商品服务系统
+ */
+import res from '@/utils/system/request.js'
+
+/**
+ *  商品详情
+ */
+//商品详情
+export const GetItemDetail = (params) => res('get', 'apiItem', '/items/{itemId}', {params:params});
+
+/**
+  * 商品收藏
+  * item-collection-controller
+  */
+// 获取商品收藏列表
+export const GetItemCollectList = (params) => res('get', 'apiItem', '/itemCollections/list', {params:params});
+// 取消商品收藏
+export const DelItemCollect = (params) => res('delete', 'apiItem', '/itemCollections/delete/{id}', params);
+// 添加商品收藏
+export const AddItemCollect = (params) => res('post', 'apiItem', '/itemCollections/add', params, {form: true});
+
+/**
+  * 蒙牛供应商(个人中心的)
+  * 
+  */
+// B001获取分类下的商品
+export const GetListItems = (params) => res('get', 'apiItem', '/itemOrganizations/{shopId}/listItems', {params:params});
+// B002保存蒙牛新增的合同
+export const SaveItemContract = (params) => res('post', 'apiItem', '/itemOrganizations/add', params);
+// A008获取集团圈定的商品
+export const GetGroupItemList = (params) => res('get','apiItem','/itemOrganizations/group/list', {params:params})
+// A013获取集团人员查看已圈定的商品
+export const GetGroupItemListView = (params) => res('get','apiItem','/itemOrganizations/group/list/view', {params:params})
+//B004集团人员查看已圈定商品被供应商设置的区域价格列表
+export const GetMNAreasItemPrice = (params) => res('get', 'apiItem', '/itemAreas/group/{itemId}/list/', {params: params}); 
+//B003圈定的商品通过接口
+export const GroupItemPass = (params) => res('put','apiItem','/itemOrganizations/list/pass',params,{form: true})
+
+//B004圈定的商品拒绝接口
+export const GroupItemRefause = (params) => res('put','apiItem','/itemOrganizations/list/{id}/unpass',params,{form: true})
+
+//B005圈定的商品删除接口
+export const GroupItemDelete = (params) => res('delete','apiItem','/itemOrganizations/list/delete',{params:params})
+
+//B010获取圈定的供应商列表
+export const GetSupplierItemList = (params) => res('get','apiItem','/itemOrganizations/list/shops',{params:params})
+ 
+//牧场查询集团圈定的商品接口
+export const GetRanchItemList = (params) => res('get','apiItem','/itemOrganizations/ranch/list',{params:params})
+
+
+/**
+  * 合同管理
+  */
+  /*A004获取需要审核的商品信息列表*/
+  export const GetItemAuditList = (params) => res('get','apiItem', '/contracts/list',{params:params});
+  /*A011获取集团合同信息列表*/
+  export const GroupContractList = (params) => res('get','apiItem', '/contracts/group/list',{params:params});
+  /*B012获取集团设置牧场价格和牧场列表*/
+  export const GetRanchPriceList = (params) => res('get','apiItem','/contracts/listItemRelations',{params:params});
+  /*B013保存集团设置牧场价格和库存数量*/
+  export const SavePriceChange = (params) => res('post','apiItem','/contracts/saveItemRelations',params);
+  /*B014删除合同接口*/
+  export const DeleteContract = (params) => res('delete','apiItem','/contracts/delete/{id}',params);
+  /*B001获取商品一级分类*/
+  export const GetClassifiyOne = (params) => res('get','apiItem','/contracts/listClassifyOnes',{params:params});
+  /*B003获取牧场下拉数据列表*/
+  export const GetRanchList = (params) => res('get','apiItem','/contracts/listRanches',{params:params});
+  /*B008修改合同或者新增合同,获取分类下的商品*/
+  export const GetClassifyItem = (params) => res('get','apiItem','/contracts/shop/listItems',{params:params});
+    /*B016合同中集团列表自动补全接口*/
+  export const GetContractsShops = (params) => res('get','apiItem','/contracts/shop/listGroups',{params:params});
+  /*B159修改合同或者新增合同,获取商品分类*/
+  export const ContractClassify = (params) => res('get','apiItem','/classifys/{shopId}/listClassifyOnes',{params: params});
+  /*B006商品合同审核接口*/
+  export const AuditContract = (params) => res('put','apiItem','/contracts/audit',params,{form: true});
+  /*B009保存新增合同接口*/
+  export const SaveAddContract = (params) => res('post','apiItem','/contracts/add',params);
+  /*B010保存修改合同接口*/
+  export const SaveChangeContract = (params) => res('put','apiItem','/contracts/update',params);
+  /*B007获取修改合同信息接口*/
+  export const GetChangeInfo = (params) => res('get','apiItem','/contracts/list/{id}',{params: params});
+ /**
+
+  * 搜索结果
+  */
+/*获取搜索结果*/
+export const GetSearchResult = (params) => res('get', 'apiItem', '/items/list', {params: params});
+/*B002获取商品大分类明细*/
+export const GetClassifysList = (params) => res('get', 'apiItem', '/classifys/list/'+params.parentId, {params: params});
+export const GetClassifysListAll = () => res('get', 'apiItem', '/classifys/list');
+export const GetShopClassifysList = (params) => res('get', 'apiItem', '/classifys/classify/{shopId}', {params: params});
+/**
+  * 店铺
+  */
+/*获取店铺商品列表*/
+export const GetShopProList = (params) => res('get', 'apiItem', '/items/{shopId}/list', {...params,params});
+/*B019 商品审核被拒绝原因列表接口*/
+export const GetRefuseReasonList = (params) => res('get','apiItem','/items/{id}/refuseReason/list',{params: params});
+
+/*
+蒙牛价格管理(商品管理的)
+ */
+export const GetMNOrgs = (params) => res('get', 'apiItem', '/itemOrganizations/shop/list/organizationNamesAndIds'); //B007获取跟登入用户店铺信息获取与其签过蒙牛价格的集团(集团名字和编号)列表
+export const GetMNOrgItems = (params) => res('get', 'apiItem', '/itemOrganizations/shop/list', {params: params}); //A006供应商被圈定的商品列表接口
+export const GetMNItemInfos = (params) => res('get', 'apiItem', '/itemAreas/shop/list/{orgId}/{itemId}', {params: params}); //B004商户获取指定商品在某集团下的签订关系
+export const AddMNItemPrice = (params) => res('post', 'apiItem', '/itemAreas/add', params); //B001店铺批量添加商品区域价格关系对象
+export const AddMNItemGroupPrice = (params) => res('post', 'apiItem', '/itemAreas/group/add', params); //B005店铺添加商品集团价格接口
+export const DeleteMNItemPrice = (params) => res('delete', 'apiItem', '/itemAreas/delete', {params}); //B002店铺批量删除蒙牛区域价格关系接口
+export const UpdateMNItemPrice = (params) => res('put', 'apiItem', '/itemAreas/update', params); //B003店铺更新蒙牛区域价格关系接口
+
+/*
+商铺下商品管理
+ */
+export const GetItemList = (params) => res('get', 'apiItem', '/items/shop/itemsPageList', {params}); //A010商铺管理查询商品列表接口
+export const GetContracts = (params) => res('get', 'apiItem', '/contracts/shop/list', {params}); //A018供应商合同商品列表接口
+export const GetShopContracts = () => res('get', 'apiItem', '/contracts/shop/listClassifyOnes'); //B015商品一级分类列表接口
+export const GetShopRanches = (params) => res('get', 'apiItem', '/contracts/shop/listRanches', {params}); //B017供应商合同涉及的牧场列表接口
+export const PutAwayItem = (params) => res('put', 'apiItem', '/items/shop/toSale/items', params, {form: true}); //B015批量上架商品接口
+export const OffSaleItem = (params) => res('put', 'apiItem', '/items/shop/offSale/items', params, {form: true}); //B016批量下架商品接口
+export const CancelApplyForItem = (params) => res('put', 'apiItem', '/items/shop/{itemId}/cancelToSale', {params}); //B009商品取消上架接口
+export const BackStoreItem = (params) => res('put', 'apiItem', '/items/shop/{itemId}/toStore', {params}); //B012商品放回仓库接口
+export const GetItemsById = (params) => res('get','apiItem','/items/list/listItemsByIds',{params:params}) //B005根据商品编号列表获取商品列表接口
+
+export const AddShopItem = (params) => res('post', 'apiItem', '/items/add', params); //B006商铺添加商品接口
+export const AddShopItemVersion = (params) => res('post', 'apiItem', '/items/addVersion', params); //B011商铺添加商品规格接口
+export const EditShopItem = (params) => res('put', 'apiItem', '/items/update', params); //B013商铺编辑商品接口
+export const auditShopGoodNoSaleApply = (params) => res('put', 'apiItem', '/manager/item/auditOffSaleItem/'+params.skuId+'/'+params.status,params,{form:true}); //审核店铺商品下架申请
+export const auditShopGoodViolationApply = (params) => res('put', 'apiItem', '/manager/item/auditViolationOffSaleItem/'+params.skuId+'/'+params.status,params,{form:true}); //审核违规商品下架申请
+
+/*
+个人中心中我的咨询
+ */
+export const getConsultingList = (params) => res('get', 'apiItem', '/consultings/list/consulting', {params}); //A002买家获取我的咨询列表接口
+
+/*
+价格监控接口
+ */
+ //B002删除价格监控记录接口
+// export const DeletePriceMonitor = (params) => res('delete', 'apiItem', '/priceMonitoring/delet', {params:params});
+
+//B002价格监控记录处理接口
+export const Handleprice = (params) => res('put','apiItem','/priceMonitoring/handle',params,{form:true})
+
+ //A001价格监控记录查询接口
+export const GetPriceMonitorList = (params) => res('get', 'apiItem', '/priceMonitoring/listPage', {params:params});
+/**
+ * 后台管理
+ * 
+ */
+/* 获取商品列表 */
+export const GetManagerItemList = (params) => res('get', 'apiItem', '/manager/item/list/'+params.status, {params: params});
+export const OffItem = (params) => res('post', 'apiItem', '/manager/item/refused/'+ params.id, params,{form: true}); 
+/*商品审核接口*/
+export const AuditItem = (params) => res('put','apiItem','/manager/item/'+params.id+'/'+params.status,params,{form: true});
+
+// 解除供应商店铺冻结
+export const freeSupplierShop = (params) => res('put', 'apiItem', '/manager/shop/unfreeze/'+params.id); //M009解冻供应商接口
+
+// 设置爱养牛合同价格
+export const setAYNSumPrice = (params) => res('get', 'apiItem', '/manager/item/updateSettlementPrice', {params: params});
+ //获取特殊价格列表
+export const getSpecialList = (params) =>res('get','apiItem','/itemSpecialPrice/getItemSpecialPriceList',{params:params})
+
+
+
+//金融产品管理
+/*添加*/
+export const addFinancial = (options) => res('post', 'apiItem', '/manager/Financial/add', options.body, {params: options.params})
+/*删除*/
+export const delFinancial = (params) => res('delete', 'apiItem', '/manager/Financial/delete/'+ params.id, {params:params})
+/*列表*/
+export const getFinancial = (params) => res('get', 'apiItem', '/manager/Financial/list', {params: params})
+/*编辑*/
+export const putFinancial = (options) => res('post', 'apiItem', '/manager/Financial/update',options.body, {params: options.params})
+
+// 供应商佣金功能
+/*供应商佣金列表*/
+export const commissionList = (params) => res('get', 'apiItem', '/commission/list', {params: params})
+//添加佣金
+export const commissionAdd = (params) => res('post', 'apiItem', '/commission/add', params); 
+//供应商佣金详情
+export const commissionInfo = (params) => res('get', 'apiItem', '/commission/info', {params: params})
+//取消佣金
+export const commissionDelete = (params) => res('post', 'apiItem', '/commission/delete', params,{form: true}); 
+
+// 商品审核项管理
+//商品审核项列表
+export const getAuditLists = (params) => res('get', 'apiItem', '/itemAudit/getAuditLists', {params: params})
+//修改商品审核项
+export const updateBySkuId = (params) => res('post', 'apiItem', '/itemAudit/updateBySkuIds', params,{form: true}); 
+
+//搜索关键词
+//新增输入词
+export const addInputWord = (params) => res('post', 'apiItem', '/manager/keyword/addInputWord', params); 
+//删除输入词
+export const deleteInputWord = (params) => res('post', 'apiItem', '/manager/keyword/deleteInputWord', params);
+//获取关键词关联的输入词列表
+export const getInputWordsByKey = (params) => res('get', 'apiItem', '/manager/keyword/getInputWordsByKey', {params: params})
+//获取未关联的输入词列表
+export const listUnRelInputWords = (params) => res('get', 'apiItem', '/manager/keyword/listUnRelInputWords', {params: params})
+//关联输入词
+export const relateKeyWord = (params) => res('post', 'apiItem', '/manager/keyword/relateKeyWord', params);
+
+//新增关键词
+export const addKeyword = (params) => res('post', 'apiItem', '/manager/keyword/addKeyword', params); 
+//删除关键词并释放输入词
+export const deleteKeyword = (params) => res('post', 'apiItem', '/manager/keyword/deleteKeyword', params);
+//获取关键词详情
+export const getKeywordById = (params) => res('get', 'apiItem', '/manager/keyword/getKeywordById', {params: params})
+//获取关键词列表
+export const listKeywords = (params) => res('get', 'apiItem', '/manager/keyword/listKeywords', {params: params})
+//获取关键词列表--不分页
+export const selectKeyWords = (params) => res('get', 'apiItem', '/manager/keyword/selectKeyWords', {params: params})
+//修改关键词
+export const updateKeyword = (params) => res('post', 'apiItem', '/manager/keyword/updateKeyword', params);
+//推荐词上移下移
+export const upDownKeys = (params) => res('post', 'apiItem', '/manager/keyword/upDownKeys', params);
+//获取搜索历史列表
+export const listHisKeywords = (params) => res('get', 'apiItem', '/manager/keyword/listHisKeywords', {params: params})
+
+//供应商年检资料添加
+export const inspectionAdd = (params) => res('post', 'apiItem', '/manager/shop/inspection/add', params);
+//批量/单个 年检开关
+export const inspectionSwitch = (params) => res('post', 'apiItem', '/manager/shop/inspection/inspectionSwitch', params);
+//供应商年检审核拒绝原因查看
+export const inspectionRejectInfo = (params) => res('get', 'apiItem', '/manager/shop/inspection/rejectInfo', {params: params})
+//供应商年检资料审核
+export const inspectionReview = (params) => res('get', 'apiItem', '/manager/shop/inspection/review', {params: params})
+//供应商年检资料更新
+export const inspectionUpdate = (params) => res('post', 'apiItem', '/manager/shop/inspection/update', params);
+//供应商年检详情
+export const getShopYearlyInspectionInfo = (params) => res('get', 'apiItem', '/manager/shop/inspection/getShopYearlyInspectionInfo', {params: params})
+//商品管理-审核上下架商品(批量审核)
+export const auditItems = (params) => res('post','apiItem','/manager/item/auditItems',params,{form: true})
+//商品管理-审核下架商品(批量审核)管理员强制下架
+export const refuseBatch = (params) => res('post','apiItem','/manager/item/refuseBatch',params,{form: true})
+/*
+    电子开票
+*/
+//新增税率信息
+export const addInvoiceTaxRate = (params) => res('post','apiItem','/manager/invoice/addInvoiceTaxRate',params)
+//获取列表税率信息
+export const taxRatePages = (params) => res('get', 'apiItem', '/manager/invoice/taxRatePages', {params: params})
+//修改、删除税率信息
+export const updateInvoiceTaxRate = (params) => res('put','apiItem','/manager/invoice/updateInvoiceTaxRate',params)
+//获取销货方信息
+export const getInvoiceShop = (params) => res('get', 'apiItem', '/manager/invoice/getInvoiceShop', {params: params})
+//获取开票推送设置
+export const getInvoiceSetting = (params) => res('get', 'apiItem', '/manager/invoice/getInvoiceSetting', {params: params})
+//新增、修改销货方信息
+export const saveInvoiceShop = (params) => res('post','apiItem','/manager/invoice/saveInvoiceShop',params)
+//更新开票推送设置
+export const saveInvoiceSetting = (params) => res('post','apiItem','/manager/invoice/saveInvoiceSetting',params)
+//开票数据查询
+export const getInvoiceDataPage = (params) => res('get', 'apiItem', '/manager/invoice/invoiceDownloadPages', {params: params});
+//开票数据下载
+export const invoiceDataDownload = (params) => res('get', 'apiItem', '/manager/invoice/downloadInvoice', {params: params});
+
+/**
+ * 招采系统-供应商主营物料管理
+*/
+//添加商品分类和地区
+export const AddInquiryClassIfyShop = (params) => res('post', 'apiItem', '/inquiryClassIfyShop/add', params);
+//查询地区分类列表
+export const inquiryClassIfyShopList = (params) => res('get', 'apiItem', '/inquiryClassIfyShop/list', {params:params});
+//查询指定分类地区
+export const inquiryClassIfyShopGetById = (params) => res('get', 'apiItem', '/inquiryClassIfyShop/getById', {params:params});
+//删除商品分类地区
+export const DeleteInquiryClassIfyShop = (params) => res('post', 'apiItem', '/inquiryClassIfyShop/delete', params);
+//查找地区列表
+export const inquiryClassIfyShopGetAreas = (params) => res('get', 'apiItem', '/inquiryClassIfyShop/getAreas', {params:params});
+//修改商品分类和地区
+export const UpdateInquiryClassIfyShop = (params) => res('post', 'apiItem', '/inquiryClassIfyShop/update', params);
+
+//查询商铺其他证件类型编码接口
+export const getLicenseType = (params) => res('get', 'apiItem','/shops/getLicenseType', {params: params});
+
+//推广供应商黑名单
+// 新增黑名单数据
+export const addInBlackList = (params) => res('post', 'apiItem', '/promote/shops/addInBlackList', params);
+//从黑名单移除
+export const deleteForBlackList = (params) => res('post', 'apiItem', '/promote/shops/deleteForBlackList', params,{form: true});
+//下载黑名单模板
+export const downLoadExcelTemplate = (params) => res('get', 'apiItem','/promote/shops/downLoadExcelTemplate', {params: params});
+// 导入黑名单数据(加入时自动排除已有数据)
+export const importBlackList = (params) => res('post', 'apiItem', '/promote/shops/importBlackList', params,{form: true});
+//获取供应商列表接口(正常状态,除去已加入)
+export const promoteShopList = (params) => res('get', 'apiItem','/promote/shops/list', {params: params});
+//已加入黑名单供应商列表接口
+export const pormoteShopBlackList = (params) => res('get', 'apiItem','/promote/shops/pormoteShopBlackList', {params: params});
+
+
+/**
+ * 寄售相关接口
+ */
+//查询商品分类 树形结构
+export const searchAllClassifyAsTree = (params) => res('get', 'apiMarket', '/classify/searchAllClassifyAsTree', {params: params});
+// 获取寄售商品列表
+export const consignListPage = (params) => res('get', 'apiItem','/consign/manager/item/listPage', {params: params});
+// 审核寄售商品
+export const consignItemAudit = (params) => res('post', 'apiItem', '/consign/manager/item/audit', params);
+// 强制下架寄售商品
+export const offSaleByAdmin = (params) => res('post', 'apiItem', '/consign/manager/item/offSaleByAdmin', params);
+// 获取寄售合同列表
+export const listContractPage = (params) => res('get', 'apiItem','/consign/contract/admin/listContractPage', {params: params});
+// 查看寄售合同详情
+export const getContractById = (params) => res('get', 'apiItem','/consign/contract/admin/getContractById', {params: params});
+// 导出采购需求商品信息
+export const exportContractItems = (params) => res('get', 'apiItem','/consign/contract/admin/exportContractItems', {params: params});
+// 获取牧场台账列表
+export const queryOrgForShopByPage = (params) => res('get', 'apiItem','/consign/itemStock/queryOrgForShopByPage', {params: params});
+// 获取台账商品明细
+export const queryStocksByPage = (params) => res('get', 'apiItem','/consign/itemStock/queryStocksByPage', {params: params});
+// 牧场查询指定库存商品的入库记录
+export const queryStockInByPage = (params) => res('get', 'apiItem','/consign/itemStock/queryStockInByPage', {params: params});
+// 查看退库商品信息
+export const queryStockCancelByPage = (params) => res('get', 'apiItem','/consign/itemStock/queryStockCancelByPage', {params: params});
+// 牧场查询指定库存商品的出库记录
+export const queryStockOutByPage = (params) => res('get', 'apiItem','/consign/itemStock/queryStockOutByPage', {params: params});
+// 获取库存台账商品主体
+export const getTotalCountByStockId = (params) => res('get', 'apiItem','/consign/itemStock/getTotalCountByStockId', {params: params});
+// 分页查询商品库存盘点数据记录
+export const itemStockTakeList = (params) => res('get', 'apiItem','/consign/itemStockTake/listPage', {params: params});
+// 查看盘点详情信息
+export const getItemTakeInfo = (params) => res('get', 'apiItem','/consign/itemStockTake/getItemTakeInfo', {params: params});
+// 供应商、牧场、平台 导出退库/出库/入库记录
+export const exportStockLogExcel = (params) => res('get', 'apiItem','/consign/itemStock/exportStockLogExcel', {params: params});
+//大区划分
+//查询大区接口
+export const reginList = (params) => res('get', 'apiItem','/manager/regin/list', {params: params});
+//查询大区接口全部
+export const reginListAll = (params) => res('get', 'apiItem','/manager/regin//listAll', {params: params});
+//查询大区下省市接口
+export const regionCityList = (params) => res('get', 'apiItem','/manager/regin/regionCityList', {params: params});
+// 新增大区
+export const reginAdd = (params) => res('post', 'apiItem', '/manager/regin/add', params);
+// 编辑大区
+export const reginUpdate = (params) => res('post', 'apiItem', '/manager/regin/update', params);
+// 新增大区下的省市或者省下的市
+export const addRegionCityList = (params) => res('post', 'apiItem', '/manager/regin/addRegionCityList', params);
+//删除大区
+export const reginDel = (params) => res('post', 'apiItem', '/manager/regin/del', params,{form: true});
+//删除大区下的市(最后一级)
+export const delRegionCityById = (params) => res('post', 'apiItem', '/manager/regin/delRegionCityById', params,{form: true});
+//删除大区下的省级(包含其下面的市)
+export const delRegionCitysByProvince = (params) => res('post', 'apiItem', '/manager/regin/delRegionCitysByProvince', params,{form: true});
+//查询现有全部省市信息
+export const getGovAreaList = (params) => res('get', 'apiItem','/manager/regin/getGovAreaList', {params: params});
+//查询现有全部省市信息(树形全部)
+export const getAllGovAreaList = (params) => res('get', 'apiItem','/manager/regin/getAllGovAreaList', {params: params});
+
+// 新增供应商/牧场 到对应市场
+export const addOrgTypeCode = (params) => res('post', 'apiItem', '/manager/typeCodeSetting/addOrgTypeCode', params);
+//获取已绑定对应市场的牧场列表
+export const getOrgList = (params) => res('get', 'apiItem','/manager/typeCodeSetting/org/list', {params: params});
+//获取未绑定对应市场的牧场列表(添加牧场)
+export const orgListNotChoose = (params) => res('get', 'apiItem','/manager/typeCodeSetting//org/listNotChoose', {params: params});
+//获取已绑定对应市场的供应商列表
+export const getShopList = (params) => res('get', 'apiItem','/manager/typeCodeSetting/shop/list', {params: params});
+//获取未绑定对应市场的供应商列表(添加供应商)
+export const shopListNotChoose = (params) => res('get', 'apiItem','/manager/typeCodeSetting/shop/shopListNotChoose', {params: params});
+//删除已绑定的
+export const delOrgTypeCodeById = (params) => res('post', 'apiItem', '/manager/typeCodeSetting/delOrgTypeCodeById', params,{form: true});
+//查询牛客市场商品佣金接口
+export const getPromoteValue = (params) => res('get', 'apiItem', '/promote/sku/getPromoteValue', {params:params});
+//牧场列表
+export const getFarmList = (params) => res('get', 'apiItem', '/manager/farm/list', {params:params});
+//修改牧场信息
+export const updateOrgFarm = (params) => res('put','apiItem','/manager/farm/updateOrgFarm',params)
+//牧场详情
+export const getOrgFarmById = (params) => res('get', 'apiItem', '/manager/farm/getOrgFarmById/{id}', {params:params});
+
+// 新建用户调研主体
+export const satisfyManageAdd = (params) => res('post', 'apiItem', '/satisfy/manager/add', params);
+// 查询调研列表
+export const satisfyListPage = (params) => res('get', 'apiItem', '/satisfy/manager/listPage', {params:params});
+// 修改调研管理信息
+export const satisfyUpdate = (params) => res('post', 'apiItem', '/satisfy/manager/update', params,{form: true});
+// 获取用户提报历史分页查询
+export const getAdminPageList = (params) => res('get', 'apiItem', '/item/require/getAdminPageList', {params:params});
+//获取询价信息列表
+export const getBargainList = (params) => res('get', 'apiItem', '/manager/bargain/list', {params:params});
+//获取询价信息详情
+export const getBargainById = (params) => res('get', 'apiItem', '/manager/bargain/getBargainById/{id}', {params:params});
+//获取询价处理进度
+export const getBargainProgress = (params) => res('get', 'apiItem', '/manager/bargain/getBargainProgress/{bargainId}', {params:params});
+
+// 代采管理
+// 管理端获取代采需求分页列表
+export const purchaseItemsPageList = (params) => res('get', 'apiItem', '/purchase/manager/demand/itemsPageList', {params:params});
+// 获取代采需求详情
+export const getPurchaseDemandInfo = (params) => res('get', 'apiItem', '/purchase/manager/demand/getPurchaseDemandInfo', {params:params});
+// 牧场提交代采申请列表
+export const applyList = (params) => res('get', 'apiItem', '/purchaseApply/platform/applyList', {params:params});
+// 审核牧场申请开通代采
+export const purchaseApplayApprove = (params) => res('get', 'apiItem', '/purchaseApply/platform/purchaseApplayApprove', {params:params});
+
+// 代采商品列表 
+export const getItemPageListForManager = (params) => res('get', 'apiItem', '/purchase/manager/item/getItemPageListForManager', {params:params})
+// 查看代采商品详情 
+export const getItemInfo = (params) => res('get', 'apiItem', '/purchase/manager/item/getItemInfo', {params:params})
+// 下架审核 
+export const auditOffSaleItem = (params) => res('put','apiItem','/purchase/manager/item/auditOffSaleItem/'+params.skuId+'/'+params.status,params,{form: true})
+// 上架审核 
+export const auditUpSaleItem = (params) => res('put','apiItem','/purchase/manager/item/{skuId}/{status}',params,{form: true})
+// 查询运费模板 
+export const getFreightTemplate = (params) => res('get', 'apiItem', '/purchase/shop/item/getFreightTemplate', {params:params});
+// 查询代采方案列表
+export const purchaseGetPageList = (params) => res('get', 'apiItem', '/purchase/manager/program/getPageList', {params:params});
+// 新增代采方案
+export const purchaseProgramAdd = (params) => res('post', 'apiItem', '/purchase/manager/program/add', params,{form: true});
+// 获取代采牧场列表
+export const getPurchaseApples = (params) => res('get', 'apiItem', '/purchase/manager/program/getPurchaseApples', {params:params});
+// 根据用户id查询对应牧场的需求列表
+export const getPurchaseDemandSubmits = (params) => res('get', 'apiItem', '/purchase/manager/program/getPurchaseDemandSubmits', {params:params});
+// 代采方案管理-获取需求商品列表
+export const getPurchaseProgramDemands = (params) => res('get', 'apiItem', '/purchase/manager/program/getPurchaseProgramDemands', {params:params});
+// 代采方案管理-获取匹配商品运费总价
+export const calculateFreightPriceList = (params) => res('post', 'apiOrder', '/purchase/order/calculateFreightPriceList', params);
+// 代采方案管理-获取匹配商品列表 
+export const getMatchItems = (params) => res('get', 'apiItem', '/purchase/manager/program/getMatchItems', {params:params});
+// 查询待邀请供应商列表 
+export const getInviteShopList = (params) => res('get', 'apiItem', '/purchase/manager/program/getInviteShopList', {params:params});
+// 提交方案 
+export const saveOrUpdate = (params) => res('post', 'apiItem', '/purchase/manager/program/saveOrUpdate', params,{form: false});
+// 查看方案详情 
+export const getPurchaseProgramInfo = (params) => res('get', 'apiItem', '/purchase/manager/program/getPurchaseProgramInfo', {params:params});
+// 代采方案撤回、删除 
+export const deletePurchaseProgram = (params) => res('put','apiItem','/purchase/manager/program/deletePurchaseProgram',params,{form: true})
+//代采方案需求商品、匹配商品和邀请供应商报价数据删除 
+export const deleteProgramInfoOne = (params) => res('put','apiItem','/purchase/manager/program/deleteProgramInfoOne',params,{form: true})
+// 获取审核代采方案列表信息
+export const purchaseGetAuditPageList = (params) => res('get', 'apiItem', '/purchase/manager/program/audit/getPageList', {params:params});
+// 审核代采方案
+export const auditPurchaseProgram = (params) => res('put','apiItem','/purchase/manager/program/audit/auditPurchaseProgram',params,{form: true})
+// 获取收货地址  
+export const getUserAddressPage = (params) => res('get', 'apiItem', '/purchase/manager/program/getUserAddressPage', {params:params});
+// 新增收货地址 
+export const saveUserAddress = (params) => res('post', 'apiItem', '/purchase/manager/program/saveUserAddress', params,{form: false});
+
+// 获取预算列表
+export const getBudgetPageList = (params) => res('get', 'apiItem', '/purchase/manager/annualBudget/getPageList', {params:params}); 
+// 获取预算详情 GET 
+export const getSubmitDetailByAnnualBudgetId = (params) => res('get', 'apiItem', '/purchase/manager/annualBudget/getSubmitDetailByAnnualBudgetId', {params:params}); 
+// 查询运费模板 
+export const getFreightTemplates = (params) => res('get', 'apiItem', '/purchase/manager/program/getFreightTemplate', {params:params}); 
+// 添加供应商招采权益生效时间
+export const createInquiry = (params) => res('post', 'apiItem', '/manager/shop/inquiry/create', params);
+//分页查询供应商招采权益生效时间
+export const inquiryList = (params) => res('get', 'apiItem', '/manager/shop/inquiry/list', {params:params});
+//修改供应商招采权益生效时间
+export const inquiryUpdate = (params) => res('put','apiItem','/manager/shop/inquiry/update',params);
+//删除供应商招采权益生效时间
+export const inquiryDelete = (params) => res('delete', 'apiItem', '/manager/shop/inquiry/delete/{id}', {params}); 
+
+//批量移除砍一刀接口
+export const outDisCount = (params) => res('put','apiItem','/manager/bargain/skus/outDisCount',params,{form:true});
+//批量加入砍一刀接口
+export const toDisCount = (params) => res('put','apiItem','/manager/bargain/skus/toDisCount',params,{form:true});

+ 178 - 0
src/request/modules/apiManager.js

@@ -0,0 +1,178 @@
+/**
+ * 
+ */
+import res from '@/utils/system/request.js'
+
+/**
+ * 用户
+ */
+// 获取token
+export const GetUserToken = (params) => res('post', 'apiManager', '/manager/login', params, {form: true})
+
+// 获取用户树型菜单
+export const GetHomeMenu = (params) => res('get', 'apiManager', '/manager/menu', {params:params})
+
+// 用户信息读取接口
+export const GetUserInfo = () => res('get', 'apiManager', '/manager/managerUser',{})
+
+// 根据id获取管理人员信息
+export const GetUserDetail = (params) => res('get', 'apiManager', '/manager/user/{id}', {params:params})
+
+// 获取管理人员列表
+export const GetUserList = (params) => res('get', 'apiManager', '/manager/user/list', {params:params})
+
+// 获取平台系统列表
+export const GetSystemMenuList = (params) => res('get', 'apiManager', '/manager/systemMenu/list', {params:params})
+
+// 获取系统的权限树列表
+export const GetPrivilegeList = (params) => res('get', 'apiManager', '/manager/privilege/list/'+params.systemCode, {params:params})
+
+// 获取角色的权限树列表
+export const GetDefaultPrivileges = (params) => res('get', 'apiManager', '/manager/rolePrivilege/list/'+params.systemCode+'/'+params.roleId, {params:params})
+
+//删除管理人员接口
+export const DelUser = (params) => res('delete', 'apiManager', '/manager/user/delete/'+params.id, params)
+
+ //新增管理人员接口
+export const AddNewUser = (params) => res('post', 'apiManager', '/manager/user/add', params)
+
+//更新管理人员信息
+export const UpdateUser = (params) => res('put', 'apiManager', '/manager/user/update',params);
+
+//删除角色接口
+export const DelRole = (params) => res('delete', 'apiManager', '/manager/role/delete/'+params.id, params)
+
+ //新增角色接口
+export const AddNewRole = (params) => res('post', 'apiManager', '/manager/role/add', params)
+
+//更新角色信息
+export const UpdateRole = (params) => res('put', 'apiManager', '/manager/role/update',params);
+
+//更新权限信息
+export const UpdatePrivilege = (params) => res('put', 'apiManager', '/manager/privilege/update',params);
+
+// 获取角色列表
+export const GetRoleList = (params) => res('get', 'apiManager', '/manager/role/list', {params:params})
+
+// 根据userId获取角色列表
+export const GetUserRoleList = (params) => res('get', 'apiManager', '/manager/userRole/list', {params:params})
+
+// 根据系统获取角色列表
+export const GetSysRoleList = (params) => res('get', 'apiManager', '/manager/role/list', {params:params})
+
+//保存用户的角色
+export const UpdateUserRole = (params) => res('put', 'apiManager', '/manager/userRole/save/'+params.userId+'/'+params.systemCode, params, {form: true})
+
+//保存角色的权限
+export const UpdateRolePrivileges = (params) => res('put', 'apiManager', '/manager/rolePrivilege/update/'+params.systemCode+'/'+params.roleId, params, {form: true})
+
+// 获取中信交易明细列表
+export const GetZXtransactionList = (params) => res('get', 'apiManager', '/citic/queryTranDetails', {params:params})
+
+// 中信回执单打印
+export const ZXPrintReceipt = (params) => res('get', 'apiManager', '/citic/getCiticReceipt/'+params.citicTranId)
+
+//根据角色获取已分配的商品三级分类
+export const searchRoleClassifyByRoleId = (params) => res('get', 'apiManager', '/manager/rolePrivilege/searchRoleClassifyByRoleId',{params: params});
+
+//商品待审核信息列表接口
+export const getAwaitAuditProcess = (params) => res('get', 'apiManager', '/manager/ItemAuditProcess/getAwaitAuditProcess', {params:params})
+
+//商品已审核信息列表接口
+export const getEndAuditProcess = (params) => res('get', 'apiManager', '/manager/ItemAuditProcess/getEndAuditProcess', {params:params})
+
+//审批流程历史列表
+export const histoicAuditList = (params) => res('get', 'apiManager', '/manager/ItemAuditProcess/histoicAuditList', {params:params})
+// 商品分类权限绑定
+export const bindingClassify = (params) => res('post', 'apiManager', '/manager/roleItemClassify/bindingClassify',params);
+
+//保存商品归属类型----------------
+export const SaveGoodsType = (params) => res('post','apiManager','/manager/rolePrivilege/addRoleItemType', params)
+//查看商品归属类型----------------
+export const GetGoodsType = (params) => res('get','apiManager','/manager/rolePrivilege/getRoleItemType',{params:params})
+
+//商品已审核信息列表接口
+export const getWarningList = (params) => res('get', 'apiManager', '/manager/ItemWarning/getWarningList', {params:params})
+
+//商品设置预警信息
+export const addWarningInfo = (params) => res('post', 'apiManager', '/manager/ItemWarning/addWarningInfo', params, {form: true})
+
+//商品取消预警提醒
+export const cancelWarningInfo = (params) => res('post', 'apiManager', '/manager/ItemWarning/updateWarningInfo', params, {form: true})
+
+// erp分配销售人员
+// 牧场列表
+export const getRancherPage = data => res('get', 'apiManager', '/manager/organization/list', {params: data})
+
+// 销售人员
+export const getManagerUserList = data => res('get', 'apiManager', '/manager/organization/managerUserList', {params: data})
+
+// 分配销售人员
+export const allocationSalesperson = data => res('post', 'apiManager', '/manager/organization/save', data, {form: true})
+
+/*查询物料分类树结构*/
+export const getMaterialClassify = (params) => res('get', 'apiManager', '/materialClassify/list', {params: params})
+/*添加物料分类*/
+export const addMaterialClassify = (params) => res('post', 'apiManager', '/materialClassify/add', params)
+/*修改物料分类*/
+export const updateMaterialClassify = (params) => res('put', 'apiManager', '/materialClassify/update', params)
+/*获取物料一级分类*/
+export const firstMaterialClassify = (params) => res('get', 'apiManager', '/materialClassify/list/first', {params: params})
+/*删除物料分类*/
+export const DelMaterialClassify = (params) => res('delete', 'apiManager', '/materialClassify/delete',  {params: params})
+
+/*查询申请注销用户列表*/
+export const userCancelPage = (params) => res('get', 'apiManager', '/manager/userCancel/userCancelPage', {params: params})
+/*注销管理审核*/
+export const userCancelReview = data => res('put', 'apiManager', '/manager/userCancel/userCancelReview', data, {form: true})
+/*注销账号注意事项查询*/
+export const userCancelMatter = (params) => res('get', 'apiManager', '/manager/userCancel/userCancelMatter', {params: params})
+
+/*获取当前用户角色*/
+export const getUserRoleMap = (params) => res('get', 'apiManager', '/manager/userRole/getUserRoleMap', {params: params})
+
+
+
+/**
+ * 原奶管理
+*/
+//原奶价格列表
+export const milkPricePage = (params) => res('post', 'apiManager', '/manager/milkPrice/milkPricePage', params)
+//修改原奶价格
+export const updateMilkPrice = (params) => res('post', 'apiManager', '/manager/milkPrice/updateMilkPrice', params, {form: true})
+
+
+//奶价白名单添加用户列表
+export const getAddMilkPriceWhiteList = (params) => res('get', 'apiManager', '/manager/milkPrice/getAddMilkPriceWhiteList', {params:params})
+//奶价白名单列表
+export const getMilkPriceWhiteList = (params) => res('get', 'apiManager', '/manager/milkPrice/getMilkPriceWhiteList', {params:params})
+//添加奶价白名单
+export const addMilkPriceWhiteList = (params) => res('post', 'apiManager', '/manager/milkPrice/addMilkPriceWhiteList', params)
+//删除奶价数据
+export const deletedMilkPriceWhiteList = (params) => res('post', 'apiManager', '/manager/milkPrice/deletedMilkPriceWhiteList', params, {form: true})
+//上传奶价表格
+export const milkPriceReserveExcel = (params) => res('post', 'apiManager', '/manager/milkPrice/reserveExcel', params, {form: true})
+
+//代采需求管理列表 
+export const getProcureRequirePage = (params) => res('get', 'apiManager', '/procure/require/getProcureRequirePage', {params:params})
+// 代采需求回复  
+export const submitReply = (params) => res('post', 'apiManager', '/procure/require/reply', params)
+
+// 获取系统操作日志
+export const getSysLogListPage = (params) => res('get', 'apiManager', '/manager/sysLog/listPage', {params:params})
+
+// 获取操作类型数据
+export const getLogTypeList = (params) => res('get', 'apiManager', '/manager/sysLog/logTypeList', {params:params})
+
+// 查询该用户已配置的牧场列表
+export const getUserConfigOrgs = (params) => res('get', 'apiManager', '/manager/userRanchConfig/getUserConfigOrgs', {params:params})
+// 获取管理人员(已配置过区域)列表接口
+export const getUserList = (params) => res('get', 'apiManager', '/manager/userRanchConfig/getUserList', {params:params})
+// 查询该用户未配置的牧场列表
+export const getUserNotConfigOrgs = (params) => res('get', 'apiManager', '/manager/userRanchConfig/getUserNotConfigOrgs', {params:params})
+//删除该用户牧场配置
+export const delConfig = (params) => res('post', 'apiManager', '/manager/userRanchConfig/delConfig', params, {form: true})
+//新增该用户牧场配置
+export const addConfig = (params) => res('post', 'apiManager', '/manager/userRanchConfig/addConfig', params, {form: true})
+// 根据用户名获取管理人员(如果未配置人员,初始化时可选)
+export const getUserListByUserName = (params) => res('get', 'apiManager', '/manager/userRanchConfig/getUserListByUserName', {params:params})

+ 39 - 0
src/request/modules/apiMarket.js

@@ -0,0 +1,39 @@
+
+import res from '@/utils/system/request.js'
+
+// 推广管理--商品管理
+export const addPromoteItem = params => res('post', 'apiMarket', '/promote/item/addPromoteItem', params)  //新增推广商品
+export const batchCancelPromote = params => res('post', 'apiMarket', '/promote/item/batchCancelPromote', params)  //批量取消推广、批量禁止推广(管理员)
+export const batchSaveBrokerage = params => res('post', 'apiMarket', '/promote/item/batchSaveBrokerage', params)   //批量设置佣金
+export const itemsPageList = (params) => res('get', 'apiMarket', '/promote/item/itemsPageList', {params: params})   //查询推广商品列表
+export const promoteSetting = params => res('post', 'apiMarket', '/promote/item/promoteSetting', params, {form: true})  //推广商品配置接口,推广商品 开启推广、关闭推广
+export const saveBrokerage = params => res('post', 'apiMarket', '/promote/item/saveBrokerage', params, {form: true})   //设置佣金保存
+export const promoteOrderLogListForAdmin = params => res('get', 'apiMarket', '/promote/orderlog/promoteOrderLogListForAdmin', {params: params})//A002平台推广订列表接口
+export const promoteDrawMoneyLogForAdmin = (params) => res('get', 'apiMarket', '/promote/drawmoneylog/promoteDrawMoneyLogForAdmin', {params: params})   //A001平台提现记录列表接口
+export const promoteOrderLogListForShop = params => res('get', 'apiMarket', '/promote/orderlog/promoteOrderLogListForShop', params, {form: true})//商铺推广订单列表接口
+export const updatePromoteDrawMoneyLog = params => res('post', 'apiMarket', '/promote/drawmoneylog/updatePromoteDrawMoneyLog', params,{form: true})  //确认线下打款
+export const promoteUserListForAdmin = (params) => res('get', 'apiMarket', '/promote/user/promoteUserListForAdmin', {params: params})   //平台牛客管理列表接口
+export const getPromoteUserForAdmin = (params) => res('get', 'apiMarket', '/promote/user/getPromoteUserForAdmin', {params: params})   //平台牛客管理详情接口
+export const updateStatusForPromoteUser = params => res('post', 'apiMarket', '/promote/user/updateStatusForPromoteUser', params, {form: true}) //审核推客
+export const drawMoneyLogDetailForAdmin = (params) => res('get', 'apiMarket', '/promote/drawmoneylog/drawMoneyLogDetailForAdmin', {params: params})   //A001平台提现记录详情接口
+export const getDrawMoneyInfo = (params) => res('get', 'apiMarket', '/promote/drawmoneylog/getDrawMoneyInfo', {params: params})   //A001查询平台付款信息
+
+
+/*根据订单号查询是否使用了奖励额度购买的抵用券并在订单详情中呈现信息*/
+export const GetDiscountInfo = (params) => res('get','apiMarket','/mengniupay/getClassifyUseByOrdNum',{params:params});
+//查询商品分类 树形结构
+export const searchAllClassifyAsTree = (params) => res('get', 'apiMarket', '/classify/searchAllClassifyAsTree', {params: params});
+//删除推广人
+export const inviterDel = (params) => res('post', 'apiMarket', '/promote/inviter/del', params,{form: true});
+//获取推广邀请码
+export const getInviteCode = (params) => res('get', 'apiMarket', '/promote/inviter/getInviteCode', {params:params});
+//获取邀请二维码
+export const getQrCode = (params) => res('get', 'apiMarket', '/promote/inviter/getQrCode', {params:params});
+//新建推广人
+export const saveInviter = (params) => res('post', 'apiMarket', '/promote/inviter/saveInviter', params);
+//设置备注
+export const upRemarks = (params) => res('post', 'apiMarket', '/promote/inviter/upRemarks', params,{form: true});
+//冻结/解冻
+export const upStatus = (params) => res('post', 'apiMarket', '/promote/inviter/upStatus', params,{form: true});
+//推广员列表接口
+export const promoteInviterList = (params) => res('get', 'apiMarket', '/promote/inviter/promoteInviterList', {params:params});

+ 19 - 0
src/request/modules/apiMnp.js

@@ -0,0 +1,19 @@
+/**
+ * mnp业务接口
+ */
+import res from '@/utils/system/request.js'
+/**
+ *  
+ */
+// 分页查询代扣牧场列表
+export const czbankListPage = (params) => res('get', 'apiMnp', '/mengniuPay/ranch/czbank/listPage', {params:params});
+// 分页查询按查询牧场奶款数据列表
+export const dataGatherListPage = (params) => res('get', 'apiMnp', '/mengniuPay/ranch/czbank/dataGatherListPage', {params:params});
+// 审核牧场奶款数据,通过、拒绝
+export const auditDataGather = (params) => res('put', 'apiMnp', '/mengniuPay/ranch/czbank/auditDataGather', params,{form:true});
+// 上保存传授权书文件
+export const saveCZBankAuth = (params) => res('post', 'apiMnp', '/mengniuPay/ranch/czbank/saveCZBankAuth', params);
+// 修改授权书文件
+export const updateCZBankAuth = (params) => res('post', 'apiMnp', '/mengniuPay/ranch/czbank/updateCZBankAuth', params);
+// 更正牧场奶款数据
+export const updateDataGather = (params) => res('post', 'apiMnp', '/mengniuPay/ranch/czbank/updateDataGather', params);

+ 291 - 0
src/request/modules/apiOrder.js

@@ -0,0 +1,291 @@
+/**
+ * 订单服务系统
+ * apiOrder:'http://10.162.16.5:8050',   //订单服务系统
+ */
+import res from '@/utils/system/request.js'
+
+/**
+ * 买家订单
+ * ordersUser : User Order Controller
+ */
+/* 获取订单列表 */
+export const GetOrderList = (params) => res('get', 'apiOrder', '/orders/user/list', { params: params });
+/* 获取账期订单列表 */
+export const GetccountPeriodOrderList = (params) => res('get', 'apiOrder', '/orders/user/accountPeriod/list', { params: params });
+/* B003订单信息概要 */
+export const GetOrderListSummary = () => res('get', 'apiOrder', '/orders/user/list/summary', {});
+/* 取消订单 */
+export const CancelOrder = (params) => res('put', 'apiOrder', '/orders/user/list/' + params.orderNum + '/cancel');
+/* 删除订单 */
+export const DeleteOrder = (params) => res('delete', 'apiOrder', '/orders/user/delete/{orderNum}', { params });
+/* 确认收货 */
+export const ReceivedOrder = (params) => res('put', 'apiOrder', '/orders/user/list/' + params.orderNum + '/received');
+/* 查看凭证 */
+export const GetVoucherList = (params) => res('get', 'apiOrder', '/orderVouchers/{orderNum}/list', { params: params });
+/* B004删除凭证 */
+export const DeleteVoucher = (params) => res('delete', 'apiOrder', '/orderVouchers/{orderNum}/delete/{id}', params);
+/* 提交凭证 */
+export const AddVoucher = (options) => res('post', 'apiOrder', '/orderVouchers/{orderNum}/add', options.body, { params: options.params });
+/* 修改凭证 */
+export const EditVoucher = (options) => res('put', 'apiOrder', '/orderVouchers/{orderNum}/update', options.body, { params: options.params }, { form: true });
+/* 订单评价 */
+export const SendComment = (params) => res('post', 'apiComment', '/comments/add', params);
+
+/**
+ * 卖家订单
+ * ordersShop : Shop Order Controller
+ */
+/* 卖家订单列表 */
+export const GetSellerOrderList = (params) => res('get', 'apiOrder', '/orders/shop/list', { params: params });
+/* B003普通会员商铺保证金支付订单生成 */
+export const AddPayBailOrder = (params) => res('post', 'apiOrder', '/orders/shop/addPayBailOrder', params, { form: true });
+/* 卖家单个订单 包括账期订单 */
+export const GetSellerOrder = (params) => res('get', 'apiOrder', '/orders/shop/list/{orderNum}', { params: params });
+/* 修改订单详情的数量、单价 */
+export const ChangeOrderInfo = (params) => res('put', 'apiOrder', '/orders/shop/update/{orderDetailId}/moneyAndCount', params, { form: true })
+    /* 买家修改订单详情的数量、单价 */
+export const ChangeUserOrderInfo = (params) => res('put', 'apiOrder', '/orders/user/update/{orderDetailId}/moneyAndCount', params, { form: true })
+    /* 修改订单总价 */
+export const ChangeTotalPrice = (params) => res('put', 'apiOrder', '/orders/shop/update/{orderNum}/totalPrice', params, { form: true });
+/* 卖家发货 */
+export const orderDeliver = (params) => res('put', 'apiOrder', '/orders/shop/list/{orderNum}/deliver', params);
+/* 账期订单 */
+export const accountPeriodList = (params) => res('get', 'apiOrder', '/orders/shop/accountPeriod/list', { params: params });
+/* 上传发票 */
+export const addOrderInvoice = (params) => res('post', 'apiOrder', '/orderVouchers/{orderNum}/add', params);
+export const getOrderInvoice = (params) => res('get', 'apiOrder', '/orderVouchers/{orderNum}/list', params);
+export const putOrderInvoice = (params) => res('put', 'apiOrder', '/orderVouchers/{orderNum}/update', params);
+export const delOrderInvoice = (params) => res('delete', 'apiOrder', '/orderVouchers/{orderNum}/delete/{id}', params);
+
+
+
+
+
+/**
+ * 财富中心-账号管理
+ * fortune : Fortune Center Controller
+ */
+/* B001财富中心帐号列表 */
+export const SupplyFortune = (params) => res('post', 'apiOrder', '/fortune/add', params);
+/* B002创建虚拟账户开户信息 */
+export const GetFortuneList = () => res('get', 'apiOrder', '/fortune/account', {});
+/* B003更新虚拟账户开户信息 */
+export const UpdateFortuneList = (params) => res('put', 'apiOrder', '/fortune/update', params);
+
+/**
+ * 财富中心-渤海
+ * bohaipay : Bo Hai Pay Controller
+ */
+/* B001渤海银行虚拟开户 */
+export const BohaiOpenAccount = (params) => res('get', 'apiOrder', '/bohaipay/account/xnkh', { params: params });
+
+/* B006 */
+export const getBohaiAccount = (params) => res('get', 'apiOrder', '/bohaipay/account/khcx', { params: params });
+
+/* B005信息变更 */
+export const BohaiChangeInfo = (params) => res('get', 'apiOrder', '/bohaipay/account/xxbg', { params: params });
+
+/* B002密码修改 */
+export const BohaiEditPassword = (params) => res('get', 'apiOrder', '/bohaipay/account/mmxg', { params: params });
+
+/* B003虚拟充值 */
+export const BohaiRecharge = (params) => res('get', 'apiOrder', '/bohaipay/account/xncz', { params: params });
+
+/* B004虚拟提现 */
+export const BohaiWithdrawals = (params) => res('get', 'apiOrder', '/bohaipay/account/xntx', { params: params });
+
+/* B007余额查询 */
+export const BohaiBalance = (params) => res('get', 'apiOrder', '/bohaipay/account/yecx', { params: params });
+
+
+/**
+ * 购物车-支付页
+ * bohaipay : Bo Hai Pay Controller
+ */
+/* B001支付工具 */
+export const PayTools = (params) => res('get', 'apiOrder', '/payTools/list', { params: params });
+// export const SetPayType = (options) => res('get', 'apiOrder', '/payCenter/{orderNum}/pay', options.params, {params: options.body});
+export const SetPayType = (params) => res('get', 'apiOrder', '/payCenter/{orderNum}/pay', { params: params });
+/**
+ * 后台管理
+ * 
+ */
+/* 获取订单列表 */
+export const GetManagerOrderList = (params) => res('get', 'apiOrder', '/manager/order/list', { params: params });
+/* 获取订单详情 */
+export const GetOrderDetail = (params) => res('get', 'apiOrder', '/manager/order/list/'+params.orderNum, { params: params });
+/* 订单备注 */
+export const SaveRemark = (params) => res('put', 'apiOrder', '/manager/order/remark/save', params, { form: true });
+/* 修改中信账户名称 */
+export const UpdateAccNm = (params) => res('put', 'apiOrder', '/manager/citic/account/updateSubAccNm', params, { form: true });
+/* 获取中信用户列表 */
+export const GetCiticListManager = (params) => res('get', 'apiOrder', '/manager/citic/account/list', { params: params });
+
+
+/* M004启用或禁用支付方式接口 */
+export const AblePayTool = (params) => res('put', 'apiOrder', '/manager/payTool/able/{id}', params, { form: true });
+/* M001获取支付方式列表接口 */
+export const GetPayToolList = (params) => res('get', 'apiOrder', '/manager/payTool/list', { params: params });
+/* M002获取支付方式接口 */
+export const GetPayTool = (params) => res('get', 'apiOrder', '/manager/payTool/list/{id}', { params: params });
+/* M003更新支付信息配置接口 */
+export const UpdatePayTool = (options) => res('put', 'apiOrder', '/manager/payTool/update', options.body, { params: options.body });
+
+/* 获取产品需求接口 */
+export const listProdDemands = (params) => res('get', 'apiOrder', '/seggestion/listProdDemands', { params: params });
+
+/* 获取平台建议接口 */
+export const listSeggestions = (params) => res('get', 'apiOrder', '/seggestion/listSeggestions', { params: params });
+
+/* 运营人员确认收货 */
+export const confirmReceived = (params) => res('put', 'apiOrder', '/manager/order/list/received', params, { form: true });
+
+/* 获取厂家入驻列表接口 */
+export const listSupplierRegistry = (params) => res('get', 'apiOrder', '/seggestion/listSupplierRegistry', { params: params });
+
+/*奶款结算优化确认线下支付*/
+export const confirmOfflinePay = (params) => res('put', 'apiOrder', '/manager/order/confirmOfflinePay/'+params.orderNum, params, { form: true });
+
+/*  货运物流审核  */
+export const updateOrderDeliverVoucher = (params) => res('put', 'apiOrder', '/orderVouchers/admin/'+ params.orderNum + '/'+'updateOrderDeliverVoucher/'+params.id, params, { form: true });
+
+
+/* 供应商排期白名单列表 */
+export const getScheduleByshopId = (params) => res('get', 'apiOrder', '/orderSchedule/config/getByshopId', { params: params });
+/* 供应商排期白名单保存 */
+export const saveSchedule = (params) => res('post', 'apiOrder', '/orderSchedule/config/save', params, { form: true });
+/* 供应商排期白名单删除 */
+export const deleteSchedule = (params) => res('post', 'apiOrder', '/orderSchedule/config/delete/' + params.id);
+// 牧场审核修改订单详情
+export const checkUpdatedPrice = (params) => res('get', 'apiOrder', '/manager/order/getOrderUpdateInfo', { params: params });
+
+
+/*
+ * 平安支付
+ */
+//审核账户信息列表
+export const selectPaList = (params) => res('get', 'apiOrder', '/manager/paBank/account/orgInfo/selectList', { params: params });
+//查询账户信息详情
+export const selectPaDetail = (params) => res('get', 'apiOrder', '/manager/paBank/account/orgInfo/selectById', { params: params });
+//审核账户信息
+export const updateStatus = (params) => res('post', 'apiOrder', '/manager/paBank/account/orgInfo/updateStatus', params, { form: true });
+//审核账户信息
+export const openCustAcct = (params) => res('post', 'apiOrder', '/paBank/account/admin/openCustAcct', params);
+// 获取平安交易明细列表
+export const getTranDetailListByAdmin = (params) => res('get', 'apiOrder', '/paBank/query/query/getTranDetailListByAdmin', { params: params })
+    /*B005订单详情调用查询订单修改接口*/
+export const GetOrderModify = (params) => res('get', 'apiOrder', '/manager/orders/modify/'+params.orderNum, { params: params });
+
+/*
+  电子开票
+*/
+//申请发票列表
+export const getInvoiceOrderPage = (params) => res('get', 'apiOrder', '/manager/ticket/getInvoiceOrderPage', { params: params });
+//申请发票详情
+export const getInvoiceOrderInfo = (params) => res('get', 'apiOrder', '/manager/ticket/getInvoiceOrderInfo', { params: params });
+
+// 管理端订单开票设置
+export const invoiceOrderSetting = (params) => res('post', 'apiOrder', '/manager/ticket/invoiceOrderSetting', params)
+
+// 管理端修改发票抬头信息
+export const invoiceUpdate = (params) => res('post', 'apiOrder', '/manager/ticket/invoiceUpdate', params)
+    // 查看申请发票审批流信息
+export const getProcessList = (params) => res('get', 'apiOrder', '/manager/ticket/getProcessList', { params: params });
+// 管理员开票审核
+export const doInvoiceProcess = (params) => res('post', 'apiOrder', '/manager/ticket/doInvoiceProcess', params, { form: true })
+
+export const confirmOfflineInvoice = (params) => res('post', 'apiOrder', '/manager/ticket/confirmOfflineInvoice', params, { form: true })
+
+/* 获取货运物流审核订单列表 */
+export const managerVoucherList = (params) => res('get', 'apiOrder', '/manager/order/voucherList', { params: params });
+
+/* 供应商服务费开票*/
+//根据供应商名称检索供应商id信息
+export const getShopByName = (params) => res('get', 'apiOrder', '/manager/ticket/shop/getShopByName', { params: params });
+// 待开票订单管理
+export const getManagerShopOweFeePage = (params) => res('get', 'apiOrder', '/manager/ticket/shop/getManagerShopOweFeePage', { params: params });
+// 已勾选订单根据shop_owe_fee_order表主键重新查询数据列表
+export const getSelectShopOweFeePage = (params) => res('get', 'apiOrder', '/manager/ticket/shop/getSelectShopOweFeePage', { params: params });
+//提交开票申请
+export const submitInvoiceReq = (params) => res('post', 'apiOrder', '/manager/ticket/shop/submitInvoice', params);
+// 分页查询开票申请记录
+export const getInvoiceOrderShopPage = (params) => res('get', 'apiOrder', '/manager/ticket/shop/getInvoiceOrderShopPage', { params: params });
+
+//申请列表
+export const getShopInvoiceOrderPage = (params) => res('get', 'apiOrder', '/manager/ticket/shop/getInvoiceOrderPage', { params: params });
+//申请发票详情
+export const getShopInvoiceOrderInfo = (params) => res('get', 'apiOrder', '/manager/ticket/shop/getInvoiceOrderInfo', { params: params });
+// 管理员开票审核
+export const doShopInvoiceProcess = (params) => res('post', 'apiOrder', '/manager/ticket/shop/doInvoiceProcess', params, { form: true })
+
+export const getShopFeeInfoPage = (params) => res('get', 'apiOrder', '/manager/ticket/shop/getShopFeeInfoPage', { params: params });
+
+//发票批量下载
+export const batchdownload2zip = (params) => res('get', 'apiOrder', '/manager/ticket/shop/batchdownload2zip', { params: params });
+
+/* 手续费管理*/
+//分页查询供应商服务费信息
+export const getShopOwePageByAdmin = (params) => res('get', 'apiOrder', '/manager/ticket/shop/getShopOwePageByAdmin', { params: params });
+//进行已开票情况的备注操作
+export const changeOweFeeOrderInvice = (params) => res('post', 'apiOrder', '/manager/ticket/shop/changeOweFeeOrderInvice', params, { form: true })
+
+/* 管理员申请服务费退票*/
+export const refundInvoice = (params) => res('post', 'apiOrder', '/manager/ticket/shop/refundInvoice', params)
+    //开票详情获取
+export const getTicketDetail = (params) => res('get', 'apiOrder', '/manager/ticket/shop/getTicketDetail', { params: params });
+//分页查询管理员已申请的开票服务费明细
+export const getTicketFeeDetailPage = (params) => res('get', 'apiOrder', '/manager/ticket/shop/getTicketFeeDetailPage', { params: params });
+//移除服务费订单
+export const removeShopOweOrder = (params) => res('post', 'apiOrder', '/manager/ticket/shop/removeShopOweOrder', params);
+//追加订单
+export const addShopOweOrder = (params) => res('post', 'apiOrder', '/manager/ticket/shop/addShopOweOrder', params);
+//追加或移除订单后重新申请开票
+export const reSubmitInvoice = (params) => res('post', 'apiOrder', '/manager/ticket/shop/reSubmitInvoice', params, { form: true });
+
+/* 线下订单开票审核申请管理 */
+// 开票、退票分页列表
+export const getOfflineOrderApplyPage = (params) => res('get', 'apiOrder', '/ticket/offline/getOfflineReviewInvoiceList', { params: params });
+// 开票、退票详情
+export const getOfflineOrderApplyDetail = (params) => res('get', 'apiOrder', '/ticket/offline/getOfflineInfoById', { params: params });
+// 审批流
+export const getOfflineOrderApprovalProcessList = (params) => res('get', 'apiOrder', '/manager/ticket/getProcessList', { params: params });
+// 线下开票、退票审核
+export const offlineOrderExamine = (params) => res('post', 'apiOrder', '/ticket/offline/doInvoiceProcess', params, { form: true });
+// 根据id查看开票文件
+export const getInvoiceZip = (params) => res('get', 'apiOrder', '/ticket/offline/getInvoiceZip', { params: params });
+
+
+/* 线下开票用户端*/
+// 根据id查询开票信息详情
+export const getOfflineInfoById = (params) => res('get', 'apiOrder', '/ticket/offline/getOfflineInfoById', { params: params });
+// 分页查询线下开票数据(我发起的)
+export const getOfflineInvoiceList = (params) => res('get', 'apiOrder', '/ticket/offline/getOfflineInvoiceList', { params: params });
+//申请线下开票退票
+export const offlineRefundInvoice = (params) => res('post', 'apiOrder', '/ticket/offline/refundInvoice', params);
+//新增线下开票信息
+export const offlineSaveInvoiceInfo = (params) => res('post', 'apiOrder', '/ticket/offline/saveInvoiceInfo', params);
+
+
+//寄售订单
+export const consignList = (params) => res('get','apiOrder','/orders/consign/list',{params:params});
+
+//工行账户管理
+//账户管理列表
+export const getICBCAccountList = (params) => res('get','apiOrder','/manager/icbc/getICBCAccountList',{params:params});
+//可用账户列表(不分页)
+export const getICBCAccounts = (params) => res('get','apiOrder','/manager/icbc/getICBCAccounts',{params:params});
+//平台交易明细查询
+export const queryTranDetails = (params) => res('get','apiOrder','/manager/icbc/queryTranDetails',{params:params});
+//对公账簿交易明细查询
+export const wallettransquery = (params) => res('get','apiOrder','/manager/icbc/wallettransquery',{params:params});
+//聚富通图片下载接口
+export const picDownload = (params) => res('get','apiOrder','/manager/icbc/picDownload',{params:params});
+//对账明细
+export const queryWalletTransLog = (params) => res('get','apiOrder','/manager/icbc/queryWalletTransLog',{params:params});
+
+/* 获取奶站供方 */
+export const GetOrgList = (params) => res('get', 'apiOrder', '/mengniuPay/admin/ranchCodes/list', {params: params});
+//获取事业部列表接口---新的接口
+export const GetDepartmentInfoAd = (params) => res('get','apiOrder','/mengniuPay/admin/ranchCodes/division/listForAd',{params:params})
+//查询牧场使用额度订单详情
+export const getUsedAmountOrder = (params) => res('get', 'apiOrder', '/mengniuPay/admin/ranchCodes/getUsedAmountOrder', {params: params});

+ 106 - 0
src/request/modules/apiShop.js

@@ -0,0 +1,106 @@
+/**
+ * 商铺服务系统
+ * apiShop:'http://10.162.16.5:8030',    //商铺服务系统
+ */
+import res from '@/utils/system/request.js'
+
+/**
+  * 店铺收藏
+  * shop-collection-controller
+  */
+// 收藏店铺
+export const AddShopCollect = (params) => res('post', 'apiShop', '/shopCollections/add', params,{form:true});
+
+// 获取店铺收藏列表
+export const GetShopCollectList = (params) => res('get', 'apiShop', '/shopCollections/list',{params: params});
+
+// B003取消收藏店铺接口(根据ID)
+export const DelShopCollect = (params) => res('delete', 'apiShop', '/shopCollections/delete/{id}', params);
+
+// B004取消收藏店铺接口
+export const DelShopCollectShopId = (params) => res('delete', 'apiShop', '/shopCollections/del/{shopId}', params);
+
+
+/**
+  * 店铺
+  * shops : Shop Controller
+  */
+// 获取店铺列表
+export const GetShopList = (params) => res('get', 'apiShop', '/shops/shops', {params: params});
+
+// B001商铺详情接口
+export const GetShopDetail = (params) => res('get', 'apiShop', '/shops/{id}',{params: params});
+
+// B001商铺详情接口
+export const GetShopIntro = (params) => res('get', 'apiShop', '/shops/list/{id}/intro',{params: params});
+
+// B001商铺详情接口
+export const UpdateShopIntro = (params) => res('put', 'apiShop', '/shops/update/intro',params, {form:true});
+
+// B007新开店铺
+export const AddShop = (params) => res('post', 'apiShop', '/shops/add', params);
+// B008更新商铺接口
+export const EditShop = (params) => res('put', 'apiShop', '/shops/update', params);
+
+
+//删除供应商接口
+export const DeleteShop = (params) => res('delete', 'apiShop', '/manager/shop/delete/{id}', params)
+//冻结供应商接口
+export const FrozenShop = (params) => res('put', 'apiShop', '/manager/shop/frozen/{id}', params,{form:true})
+//供应商列表接口
+export const GetShopListManager = (params) => res('get', 'apiShop', '/manager/shop/list', {params: params})
+//获取供应商详情
+export const GetShopDetailManager = (params) => res('get', 'apiShop', '/manager/shop/list/{id}', params)
+//审核通过供应商接口
+export const PassShop = (params) => res('put', 'apiShop', '/manager/shop/pass/{id}', params)
+//重审供应商接口
+export const ReSubmitShop = (params) => res('put', 'apiShop', '/manager/shop/reSubmit/{id}', params)
+//M008供应商拒绝审核接口
+export const UnPassShop = (params) => res('put', 'apiShop', '/manager/shop/unpass/{id}', params,{form:true})
+//更新供应商接口
+export const Updateshop = (options) => res('put', 'apiShop', '/manager/shop/update', options.body, {params: options.params})
+//供应商特殊牧场查询
+export const getSpecialPasture = (params) => res('get', 'apiShop', '/manager/shop/getByshopId', {params:params})
+//奶源不下拉框查询
+export const getDepartmentList = (params) => res('get', 'apiShop', '/manager/shop/getAdminDepartmentList', {params:params})
+//牧场查询
+export const getOrgName = (params) => res('get', 'apiShop', '/manager/shop/getAdminOrgList', {params:params})
+//为供应商添加特殊牧场
+export const addByshopId = (params) => res('post', 'apiShop', '/manager/shop/addByshopId', params,{form:true})
+//为供应商删除特殊牧场
+export const deleteByshopId = (params) => res('post', 'apiShop', '/manager/shop/deleteByshopId/'+params.id)
+//排期牧场查询
+export const getOrgNameSelect = (params) => res('get', 'apiOrder', '/orderSchedule/config/getOrgList', {params:params})
+
+//获取微信支付上传的信息列表
+export const getwxpayList = (params) => res('get', 'apiOrder', '/manager/wxPayShop/list', {params:params});
+
+//获取单条微信支付上传的信息
+export const getwxpayById = (params) => res('get', 'apiOrder', '/manager/wxPayShop/get/{id}', params);
+
+// 补充微信支付店铺资料
+export const updateWxpay = (params) => res('post', 'apiOrder', '/manager/wxPayShop/update', params,{form:true});
+
+// 审核微信支付店铺资料
+export const checkWxpay = (params) => res('post', 'apiOrder', '/manager/wxPayShop/check', params,{form:true});
+
+//产季物料白名单
+// 查询未添加产季物白名单牧场列表
+export const getWhiteOrgList = (params) => res('get', 'apiShop', '/manager/shop/getWhiteOrgList', {params:params})
+// 查询已添加产季物料白名单牧场
+export const getWhiteListPage = (params) => res('get', 'apiShop', '/manager/shop/getWhiteListPage', {params:params})
+// 移出产季物料白名单
+export const deleteWhiteList = (params) => res('put', 'apiShop', '/manager/shop/deleteWhiteList', params,{form:true})
+// 维护产季物料白名单牧场
+export const saveWhiteList = (params) => res('post', 'apiShop', '/manager/shop/saveWhiteList', params)
+
+//上传身份证,营业执照读取信息
+export const getCardInfo = (params) => res('get', 'apiShop', '/manager/shop/inspection/getCardInfo', {params: params});
+
+//修改供应商是否可以设置奶款担保
+export const changeShopMnpAccount = (params) => res('put', 'apiShop', '/manager/shop/changeShopMnpAccount', params,{form:true})
+
+//供应商保证金设置
+export const shopDepositPaid = (params) => res('put', 'apiShop', '/manager/shop/shopDepositPaid', params,{form:true})
+//供应商类别变更
+export const updateShopCategory = (params) => res('put', 'apiShop', '/manager/shop/updateShopCategory', params,{form:true})

+ 52 - 0
src/request/modules/apiSku.js

@@ -0,0 +1,52 @@
+/*
+  说明:调用restful
+  apiSku:'http://10.162.16.5:8021'  //平台管理系统
+ */
+
+  import res from '@/utils/system/request.js'
+
+  /*M002新增三级分类公共属性*/
+  export const addClassPublicProp = (options) => res('post', 'apiSku', '/manager/classifyPublicProp/create', options.body, {params: options.params})
+  /*M004删除三级分类公共属性*/
+  export const delClassPublicProp = (params) => res('delete', 'apiSku', '/manager/classifyPublicProp/delete/'+params.id, {params: params})
+  /*M001获取三级分类公共属性列表*/
+  export const getClassPublicProp = (params) => res('get', 'apiSku', '/manager/classifyPublicProp/list/'+params.classifyId+'?id=', {params: params})
+  /*M001M003编辑三级分类公共属性*/
+  export const putAuditCartItemReq = (options) => res('put', 'apiSku', '/manager/classifyPublicProp/update/'+options.body.id, options.body,{params: options.params})
+  
+  /*M001新增三级分类公共属性预设值*/
+  export const addClassPublicPropValue = (options) => res('post', 'apiSku', '/manager/classifyPublicPropValue/create', options.body, {params: options.params})
+  /*M003删除三级分类公共属性预设值*/
+  export const delClassPublicPropValue = (params) => res('delete', 'apiSku', '/manager/classifyPublicPropValue/delete/'+params.id, {params: params})
+  /*M002编辑三级分类公共属性预设值*/
+  export const putClassPublicPropValue = (options) => res('put', 'apiSku', '/manager/classifyPublicPropValue/update/'+options.body.id, options.body, {params:options.params})
+  
+  /*M002新增商品分类*/
+  export const addClass = (options) => res('post', 'apiSku', '/manager/classify/add', options.body, {params: options.params})
+  /*M004删除商品分类*/
+  export const delClass = (params) => res('delete', 'apiSku', '/manager/classify/delete', {params:params})
+  
+  export const getAllClassList = (params) => res('get', 'apiSku', '/manager/classify/list/all', {params: params})
+  /*M001获取商品分类列表*/
+  export const getClassList = (params) => res('get', 'apiSku', '/manager/classify/list/'+params.parentId, {params: params})
+  /*M003修改商品分类*/
+  export const updateClass = (options) => res('put', 'apiSku', '/manager/classify/update',options.body, {params: options.params})
+  
+  /*M002新增产品品牌*/
+  export const addItemBrand = (options) => res('post', 'apiSku', '/manager/itemBrands/create', options.body, {params: options.params})
+  /*M004删除产品品牌*/
+  export const delItemBrand = (params) => res('delete', 'apiSku', '/manager/itemBrands/delete/'+params.id, {params:params})
+  /*M001获取产品品牌列表*/
+  export const getItemBrand = (params) => res('get', 'apiSku', '/manager/itemBrands/list', {params: params})
+  /*M003编辑产品品牌*/
+  export const putItemBrand = (options) => res('put', 'apiSku', '/manager/itemBrands/update'+options.body.id,options.body, {params: options.params})
+  
+  
+  /*M004获取产品分类关联品牌列表*/
+  export const getItemBrandClassList = (params) => res('get', 'apiSku', '/manager/itemBrandClassify/brand/list', {params: params})
+  /*M002新增产品分类关联品牌列表*/
+  export const addItemBrandClass = (options) => res('post', 'apiSku', '/manager/itemBrandClassify/create', options.body, {params: options.params})
+  /*M003删除产品分类关联品牌列表*/
+  export const delItemBrandClass = (params) => res('put', 'apiSku', '/manager/itemBrandClassify/delete', params,{form: true})
+  /*M001获取分类关联品牌列表*/
+  export const getItemBrandClass = (params) => res('get', 'apiSku', '/manager/itemBrandClassify/list/'+params.classifyId, {params: params})

+ 315 - 0
src/request/modules/apiUser.js

@@ -0,0 +1,315 @@
+import res from '@/utils/system/request.js'
+
+/*
+  说明:调用restful
+  apiItem:'http://10.162.16.5:8020',    //商品服务系统
+  apiShop:'http://10.162.16.5:8030',    //商铺服务系统
+  apiUser:'http://10.162.16.5:8040',    //用户服务系统
+  apiOrder:'http://10.162.16.5:8050',   //订单服务系统
+  apiComment:'http://10.162.16.5:8060', //商品评价服务系统
+  apiContent:'http://10.162.16.5:8070'  //内容服务系统
+ */
+
+  /**
+   * 用户
+   * user-controller
+   */
+  // 获取token
+export const GetUserToken = (params) => res('post', 'apiManager', '/manager/login', params, {form: true})
+
+// 获取用户树型菜单
+export const GetHomeMenu = (params) => res('get', 'apiManager', '/manager/menu', {params:params})
+
+// 用户信息读取接口
+export const GetUserInfo = () => res('get', 'apiManager', '/manager/managerUser',{})
+  
+  // 用户信息完善
+  export const PutUserInfo = (params) => res('put', 'apiUser', '/users/updateUserInfo', params)
+  
+  // 修改头像
+  export const PutHeadImg = (params) => res('put', 'apiUser', '/users/updateHeadImg', params,{form:true})
+  
+  // 用户登录后修改密码接口
+  export const ChangePassWord = (params) => res('put', 'apiUser', '/users/updatePassword', params,{form:true})
+  
+  //手机号码找回密码接口(找回密码的保存接口)
+  export const FindPassword = (params) => res('put','apiUser', '/users/findPassword',params,{form:true})
+  
+  /* 找回密码时手机获取短信验证码 */
+  export const FindMsgCode = (params) => res('get','apiUser', '/users/findPwdCode',{params:params})
+  
+  /* 手机号码注册接口*/
+  /*用户注册接口 */
+  export const UserSignup = (params) => res('post','apiUser', '/users/register',params,{form:true})
+  
+  /* 根据注册时手机获取短信验证码 */
+  /*用户注册接收验证码接口 */
+  export const GetMsgCode = (params) => res('get','apiUser', '/users/registerCode',{params:params})
+  
+  export const UpdateUserName = (params) => res('put','apiUser', '/users/updateUserName',params,{form:true}) 
+  
+  /**
+   * 收货地址
+   * address-controller
+   */
+  //获取收货地址  / 支持模糊搜索 传address:string
+  export const GetAddressList = (params) => res('get', 'apiUser', '/addresses/list', {params: params})
+  
+  //新增收货地址
+  export const AddInfoAddress = (params) => res('post', 'apiUser', '/addresses/add', params)
+  
+  //保存修改收货地址接口
+  export const UpdateAddress = (params) => res('put', 'apiUser', '/addresses/update', params)
+  
+  //删除收货地址接口
+  export const DeleteAddress = (params) => res('delete', 'apiUser', '/addresses/delete/{id}', params)
+  
+  /**
+   * 开票信息
+   * invoice-info-controller
+   */
+  //获取开票信息
+  export const GetInvoiceList = (params) => res('get', 'apiUser', '/invoiceInfoes/list', {})
+  
+  //新增开票信息
+  export const AddInvoice = (params) => res('post', 'apiUser', '/invoiceInfoes/add', params)
+  
+  //保存修改开票接口
+  export const UpdateInvoice = (params) => res('put', 'apiUser', '/invoiceInfoes/update', params)
+  
+  //删除开票接口
+  export const DelInvoice = (params) => res('delete', 'apiUser', '/invoiceInfoes/delete/{id}', params)
+  
+  //获取部门列表
+  export const GetDepartmentList = () => res('get', 'apiUser', '/depart/list', {})
+  
+  //保存部门信息
+  export const SavePartment = (params) => res('post','apiUser','/depart/add',params)
+  
+  //获取数据库中的省、市
+  export const GetAddressInfo = (params) => res('get','apiUser','/areas/{parentId}/list',{params:params})
+  
+  //保存事业部和地市的关系
+  export const SaveAddRange = (params) => res('post','apiUser','/mengniuAreaRelations/add',params)
+  
+  //删除事业部和地市的关系
+  export const DeleteRange = (params) => res('delete','apiUser','/mengniuAreaRelations/delete/{id}',params)
+  
+  //删除事业部
+  export const DeleteDepartment = (params) => res('delete','apiUser','/depart/delete/{id}',params)
+  
+  //获取事业部列表接口
+  export const GetDepartmentInfo = (params) => res('get','apiUser','/mengniuAreaRelations/division/list',{params:params})
+  /**
+   * 组织管理
+   * organizations : Organization Controller
+   */
+  
+   /**
+    * 公司信息
+    */
+  //B001当前用户组织机构详情接口
+  export const GetOrgDetail = () => res('get', 'apiUser', '/organizations/organization', {})
+  
+  //获取牧场详情
+  export const GetmanagerOrgDetail = (params) => res('get', 'apiUser', '/manager/organizations/organization', {params:params})
+  
+  //B005组织机构信息更新接口
+  export const UpdateOrgDetail = (params) => res('put', 'apiUser', '/organizations/update', params)
+  
+  //B011创建组织接口
+  export const CreatCompany = (params) => res('post','apiUser','/organizations/add',params)
+  
+  //B004组织配置信息更新
+  export const UpdateOrgConfig = (params) => res('put', 'apiUser', '/organizations/organizationConfig/update', params)
+  
+  //A012获取集团公司与集团牧场接口
+  export const GetGroupList = (params) => res('get', 'apiUser', '/organizations/list',  {params: params})
+  
+  // 获取店铺列表
+  export const GetShopList = (params) => res('get', 'apiShop', '/shops/shops', {params: params});
+  
+  /**
+   * 牧场管理
+   */
+  
+   //B001牧场模糊查询(无社会牧场)
+  export const searchOrgList = (params) => res('get', 'apiFinance', '/organization/search', {params: params});
+  
+  //牧场模糊查询(全)
+  export const searchOrgRanchlist = (params) => res('get', 'apiUser', '/manager/organizations/ranchList', {params: params});
+  
+  //B007牧场申请加入集团接口
+  export const JoinGroup = (params) => res('put', 'apiUser', '/organizations/joinGroup',  params, {form:true})
+  
+  //A002获取牧场列表
+  export const GetPastureList = (params) => res('get', 'apiUser', '/organizations/list/pageChildren', {params: params})
+  
+  //A019获取申请加入集团的子牧场列表接口
+  export const GetApplyPastureList = (params) => res('get', 'apiUser', '/organizations/list/applyRanches', params)
+  
+  //B018集团组织审核申请加入的子牧场接口
+  export const AuditPasture = (params) => res('put', 'apiUser', '/organizations/auditRanch', params, {form: true})
+  
+  //B019集团子牧场退出集团接口
+  export const ExitGroup = (params) => res('put','apiUser','/organizations/exitGroup',params,{form: true})
+  /**
+   * 成员管理
+   */
+  //B008组织设置或撤销管理员接口
+  export const UpdateOrgAdmin = (params) => res('put', 'apiUser', '/users/orgUser/updateAdmin', params, {form: true})
+  
+  //B013 新增组织成员接口
+  export const AddOrgEmployee = (params) => res('post', 'apiUser', '/users/addOrgUser',  params, {form:true})
+  
+  //B011移除组织成员接口
+  export const DelOrgEmployee = (params) => res('delete', 'apiUser', '/users/deleteOrgUser/{userId}', params)
+  
+  //B009冻结,启用子账号接口
+  export const FreezeOrgEmployee = (params) => res('put', 'apiUser', '/users/freezeOrgUser', params, {form: true})
+  
+  //B012修改组织成员昵称接口
+  export const updateOrgNickName = (params) => res('put', 'apiUser', '/users/updateNickname', params, {form: true})
+  
+  //A006获取组织机构的用户列表
+  export const GetEmployeeList = (params) => res('get', 'apiUser', '/users/list/orgUsers', {params: params})
+  
+  //A010获取申请加入该组织机构的用户列表
+  export const GetApplyEmployeeList = (params) => res('get', 'apiUser', '/users/list/orgApplyUsers', {params: params})
+  
+  //B014 用户申请加入集团接口
+  export const userJoinGroup = (params) => res('post', 'apiUser', '/users/joinOrg',  params, {form:true})
+  
+  /**
+    * 岗位管理
+    * roles : Role Controller
+    */
+  //B004获取岗位列表
+  export const GetPostList = (params) => res('get', 'apiUser', '/roles/list', {params: params})
+  
+  //B001创建岗位
+  export const AddPost = (params) => res('post', 'apiUser', '/roles/add', params)
+  
+  //B002更新岗位
+  export const UpdatePost = (params) => res('put', 'apiUser', '/roles/update', params)
+  
+  //B003删除岗位
+  export const DelPost = (params) => res('delete', 'apiUser', '/roles/delete/{id}', params)
+  
+  /**
+    * 岗位权限管理
+    * rolePrivileges : Role Privilege Controller
+    */
+  //B003获取系统指定岗位的权限树
+  export const GetPrivileges = (params) => res('get', 'apiUser', '/rolePrivileges/list/{systemCode}', {params: params})
+  
+  //B001获取权限编码
+  export const GetDefaultPrivileges = (params) => res('get', 'apiUser', '/rolePrivileges/list/{systemCode}/{roleId}', {params: params})
+  
+  //B002保存岗位的权限
+  export const UpdatePrivileges = (params) => res('put', 'apiUser', '/rolePrivileges/update/{systemCode}/{roleId}', params, {form: true})
+  
+  /**
+    * 分配岗位
+    * userRoles : User Role Controller
+    */
+    //A001获取组织用户角色信息
+    export const GetOrgUserRoles = (params) => res('get', 'apiUser', '/userRoles/list/{systemCode}', {...params,params})
+  
+    //B002保存用户岗位
+    export const UpdateUserRoles = (params) => res('put', 'apiUser', '/userRoles/update/{userId}/{systemCode}', params,{form:true})
+  
+  /**
+    * 系统管理
+    * systemInfo : System Info Controller
+    */
+  //B001获取系统信息接口
+  export const GetSystemList = () => res('get', 'apiUser', '/systemInfo/list', {})
+  
+  /**
+   * 获取区域地址
+   */
+  export const GetAreaDepart = (params) => res('get', 'apiUser', '/depart/{orgId}/list', {params: params})
+  export const GetMNCities = (params) => res('get', 'apiUser', '/mengniuAreaRelations/{divisionId}/list', {params: params})
+  export const GetMNRanches = (params) => res('get', 'apiUser', '/organizations/{orgId}/{cityId}/list/sampleOrganizations', {params: params})
+  
+  
+  /**
+   * 蒙牛供应商报警组管理
+   */
+   //B002新增通知联系人接口
+  export const AddAlarmPerson = (params) => res('post', 'apiUser', '/pmsNotifies/add', params)
+  
+  //B004删除通知联系人接口
+  export const DeleteAlarmPerson = (params) => res('delete', 'apiUser', '/pmsNotifies/delete',  {params:params})
+  
+  //B001查询组织通知联系人列表接口
+  export const GetAlarmPersonList = () => res('get', 'apiUser', '/pmsNotifies/list', {})
+  
+  //B003修改联系人接口
+  export const ChangeAlarmPerson = (params) => res('put', 'apiUser', '/pmsNotifies/update', params)
+  
+  
+  /**
+   * 管理平台
+   */
+  
+  
+  //获取平台用户列表
+  export const GetUsersList = (params) => res('get', 'apiUser', '/manager/users/list', {params: params})
+  
+  //冻结平台用户接口
+  export const FrozenUser = (params) => res('put', 'apiUser', '/manager/users/frozen', params, {form: true})
+  //解冻平台用户接口
+  export const ThawUser = (params) => res('put', 'apiUser', '/manager/users/thaw/'+params.id, params, {form: true})
+  // 平台修改密码接口
+  export const UpdatePassWord = (params) => res('put', 'apiUser', '/manager/users/updatePassword/'+params.id, params,{form:true})
+  
+  //获取平台邀请码
+  export const GetInviteCodeList = (params) => res('get', 'apiUser', '/manager/inviteCodes/list',{params:params})
+  
+  //批量删除平台邀请码
+  export const DeleteInviteCodes = (params) => res('put', 'apiUser', '/manager/inviteCodes/delete/codes',params,{form:true})
+  
+  //单个删除平台邀请码
+  export const DeleteInviteCode = (params) => res('delete','apiUser','/manager/inviteCodes/delete/'+params.id,{params:params})
+  
+  //创建平台邀请码
+  export const CreatInviteCode = (params) => res('post', 'apiUser','/manager/inviteCodes/generate',params,{form:true})
+  
+  //获取指定用户的角色信息
+  export const GetUserRoleList = (params) => res('get', 'apiUser', '/userRoles/roleList/'+params.userId,params)
+  
+  //获取开票抬头列表
+  export const getInvoceTitleInfoList = (params) => res('get', 'apiUser', '/manager/ticketInfo/listPage', {params: params})
+  
+  //添加开票抬头信息
+  export const addInvoceInfo = (params) => res('post', 'apiUser','/manager/ticketInfo/add',params)
+  
+  //修改开票抬头信息
+  export const updateInvoceInfo = (params) => res('put', 'apiUser','/manager/ticketInfo/update',params)
+  
+  //获取开票抬头列表
+  export const getInvoiceInfoByName = (params) => res('get', 'apiUser', '/manager/ticketInfo/getInvoiceInfoByName', {params: params})
+  
+  // 金融机构管理
+  // 冻结/解冻金融机构账号
+  export const fincInstFreeze = (params) => res('put', 'apiUser','/fincPay/fincInst/freeze',params, {form: true})
+  //重置用户密码
+  export const resetPsw = (params) => res('put', 'apiUser', '/fincPay/fincInst/resetPsw/{userId}',params, {form: true})
+  //新建机构
+  export const fincInstRegister = (params) => res('post', 'apiUser','/fincPay/fincInst/register',params,{form:true})
+  
+  //推广用户信息认证
+  export const promoteUserAuth = (params) => res('post', 'apiUser','/promote/user/promoteUserAuth',params)
+  
+
+
+
+
+
+
+
+
+
+

+ 46 - 0
src/router/createNode.js

@@ -0,0 +1,46 @@
+// 1. 用于解决keep-alive需要name的问题,动态生成随机name供keep-alive使用
+// 2. 用于解决transition动画内部结点只能为根元素的问题,单文件可写多结点
+import { defineComponent, h, createVNode, ref, nextTick } from 'vue'
+import reload from './reload.vue'
+import NProgress from '@/utils/system/nprogress'
+
+export function createNameComponent(component) {
+  return () => {
+    return new Promise((res) => {
+      component().then((comm) => {
+        const name = (comm.default.name || 'vueAdminBox') + '$' + Date.now();
+        const tempComm = defineComponent({
+          name,
+          setup() {
+            const isReload = ref(false);
+            let timeOut = null;
+            const handleReload = () => {
+              isReload.value = true;
+              timeOut && clearTimeout(timeOut);
+              NProgress.start();
+              timeOut = setTimeout(() => {
+                nextTick(() => {
+                  NProgress.done();
+                  isReload.value = false;
+                });
+              }, 260);
+            };
+            return {
+              isReload,
+              handleReload
+            };
+          },
+          render: function () {
+            if (this.isReload) {
+              return h('div', { class: 'el-main-box' }, [h(reload)]);
+            } else {
+              return h('div', { class: 'el-main-box' }, [createVNode(comm.default)]);
+            }
+          }
+        });
+        res(tempComm);
+      });
+    });
+  };
+}
+

+ 59 - 0
src/router/index.js

@@ -0,0 +1,59 @@
+/**
+ * @description 所有人可使用的参数配置列表
+ * @params hideMenu: 是否隐藏当前路由结点不在导航中展示
+ * @params alwayShow: 只有一个子路由时是否总是展示菜单,默认false
+ */
+import { createRouter, createWebHashHistory } from 'vue-router'
+import store from '@/store'
+import NProgress from '@/utils/system/nprogress'
+import { changeTitle } from '@/utils/system/title'
+
+// 动态路由相关引入数据
+import Layout from '@/layout/index.vue'
+import MenuBox from '@/components/menu/index.vue'
+import { createNameComponent } from './createNode'
+
+// 引入modules
+import Pages from './modules/pages'
+import System from './modules/system'
+
+let modules = [
+  ...System,
+  ...Pages,
+]
+
+const routes = modules
+
+const router = createRouter({
+  history: createWebHashHistory(),
+  routes
+})
+
+const whiteList = ['/login']
+
+router.beforeEach((to, _from, next) => {
+  NProgress.start();
+  if (store.state.user.userToken || whiteList.indexOf(to.path) !== -1) {
+    to.meta.title ? (changeTitle(to.meta.title)) : ""; // 动态title
+    next()
+  } else {
+    next("/login"); // 全部重定向到登录页
+    to.meta.title ? (changeTitle(to.meta.title)) : ""; // 动态title
+  }
+});
+
+// 路由进入后出发守卫
+router.afterEach((to, _from) => {
+  const keepAliveComponentsName = store.getters['keepAlive/keepAliveComponentsName'] || []
+  const name = to.matched[to.matched.length - 1].components.default.name
+  if (to.meta && to.meta.cache && name && !keepAliveComponentsName.includes(name)) {
+    store.commit('keepAlive/addKeepAliveComponentsName', name)
+  }
+  NProgress.done();
+});
+
+export {
+  modules
+}
+
+export default router

+ 166 - 0
src/router/modules/pages.js

@@ -0,0 +1,166 @@
+import Layout from '@/layout/index.vue'
+import { createNameComponent } from '../createNode'
+const route = [
+  {
+    path: '/userList',
+    component: Layout,
+    redirect: '/userList',
+    meta: { title: '权限管理' },
+    children: [
+      {
+        path: 'userList',
+        component: createNameComponent(() => import('@/views/manager/roleManager/userList.vue')),
+        meta: { title: '用户管理' }
+      },
+      {
+        path: 'roleManager',
+        component: createNameComponent(() => import('@/views/manager/roleManager/roleManager.vue')),
+        meta: { title: '用户角色管理',hideMenuItem: true}
+      },
+      {
+        path: 'roleName',
+        component: createNameComponent(() => import('@/views/manager/roleManager/roleName.vue')),
+        meta: { title: '权限名称管理'}
+      },
+      {
+        path: 'roleList',
+        component: createNameComponent(() => import('@/views/manager/roleManager/roleList.vue')),
+        meta: { title: '角色权限管理' }
+      },
+    ]
+  },
+  {
+    path: '/',
+    component: Layout,
+    redirect: '/systemOperation',
+    meta: { title: '系统操作日志' },
+    children: [
+      {
+        path: 'systemOperation',
+        component: createNameComponent(() => import('@/views/manager/systemOperation.vue')),
+        meta: { title: '系统操作日志', }
+      },
+    ]
+  },
+  {
+    path: '/orderList',
+    component: Layout,
+    redirect: 'orderList',
+    meta: { title: '订单管理', },
+    children: [
+      {
+        path: 'orderList',
+        component: createNameComponent(() => import('@/views/manager/orderManager/orderList.vue')),
+        meta: { title: '订单列表',cache: false},
+      },
+      {
+        path: 'orderDetail',
+        component: createNameComponent(() => import('@/views/manager/orderManager/orderDetail.vue')),
+        meta: { title: '订单详情',hideMenuItem: true},
+      },
+      {
+        path: 'orderAdminList',
+        component: createNameComponent(() => import('@/views/manager/orderManager/orderAdminList.vue')),
+        meta: { title: '订单列表(管理员)'},
+      },
+      {
+        path: 'cargoLogisticsAudit',
+        component: createNameComponent(() => import('@/views/manager/orderManager/cargoLogisticsAudit.vue')),
+        meta: { title: '货物物流审核'},
+      },
+    ]
+  },
+  {
+    path: '/ecommerceList',
+    component: Layout,
+    redirect: 'ecommerceList',
+    meta: { title: '电商用户管理', },
+    children: [
+      {
+        path: 'ecommerceList',
+        component: createNameComponent(() => import('@/views/manager/ecommerceManager/ecommerceList.vue')),
+        meta: { title: '电商用户列表',cache: false},
+      },
+      {
+        path: 'logoffManage',
+        component: createNameComponent(() => import('@/views/manager/ecommerceManager/logoffManage.vue')),
+        meta: { title: '注销管理'},
+      },
+    ]
+  },
+  {
+    path: '/itemClassify',
+    component: Layout,
+    redirect: 'itemClassify',
+    meta: { title: '商品管理', },
+    children: [
+      {
+        path: 'index',
+        component: createNameComponent(() => import('@/views/manager/shopItemManager/itemClassify/index.vue')),
+        meta: { title: '商品分类管理',cache: false},
+      },
+      {
+        path: 'propAdmin',
+        component: createNameComponent(() => import('@/views/manager/shopItemManager/itemClassify/propAdmin.vue')),
+        meta: { title: '商品属性管理',cache: false,hideMenuItem: true},
+      },
+      {
+        path: 'linkBrand',
+        component: createNameComponent(() => import('@/views/manager/shopItemManager/itemClassify/linkBrand.vue')),
+        meta: { title: '品牌管理',cache: false,hideMenuItem: true},
+      },
+      {
+        path: 'itemList',
+        component: createNameComponent(() => import('@/views/manager/shopItemManager/itemList.vue')),
+        meta: { title: '商品管理',nameEN:'3',},
+      },
+      {
+        path: 'itemUp',
+        component: createNameComponent(() => import('@/views/manager/shopItemManager/itemUp.vue')),
+        meta: { title: '审核上架商品',cache: false,nameEN:'2',},
+      },
+      {
+        path: 'itemOff',
+        component: createNameComponent(() => import('@/views/manager/shopItemManager/itemOff.vue')),
+        meta: { title: '审核下架商品',nameEN:'1',},
+      },
+      {
+        path: 'illegalItemOfff',
+        component: createNameComponent(() => import('@/views/manager/shopItemManager/illegalItemOfff.vue')),
+        meta: { title: '商品违规下架',cache: false,nameEN:'4',},
+      },
+      {
+        path: 'recheckIllegalltemOff',
+        component: createNameComponent(() => import('@/views/manager/shopItemManager/recheckIllegalltemOff.vue')),
+        meta: { title: '复核违规下架商品',nameEN:'5',},
+      },
+      {
+        path: 'waitAuitMatters',
+        component: createNameComponent(() => import('@/views/manager/shopItemManager/waitAuitMatters.vue')),
+        meta: { title: '待审事项',cache: false,nameEN:'4',},
+      },
+      {
+        path: 'auitMatters',
+        component: createNameComponent(() => import('@/views/manager/shopItemManager/auitMatters.vue')),
+        meta: { title: '已审事项',nameEN:'4',},
+      },
+      {
+        path: 'warningManage',
+        component: createNameComponent(() => import('@/views/manager/shopItemManager/warningManage.vue')),
+        meta: { title: '商品预警管理',cache: false},
+      },
+      {
+        path: 'auditItemsManage',
+        component: createNameComponent(() => import('@/views/manager/shopItemManager/auditItemsManage.vue')),
+        meta: { title: '商品审核项管理'},
+      },
+      {
+        path: 'bargainManage',
+        component: createNameComponent(() => import('@/views/manager/shopItemManager/bargainManage.vue')),
+        meta: { title: '砍价商品管理'},
+      },
+    ]
+  },
+]
+
+export default route

+ 43 - 0
src/router/modules/system.js

@@ -0,0 +1,43 @@
+import Layout from '@/layout/index.vue'
+import { createNameComponent } from '../createNode'
+const route = [
+  {
+    path: '/system',
+    component: Layout,
+    redirect: '/404',
+    hideMenu: true,
+    meta: { title: '系统目录' },
+    children: [
+      {
+        path: '/404',
+        component: createNameComponent(() => import('@/views/system/404.vue')),
+        meta: { title: '404', hideTabs: true }
+      },
+      {
+        path: '/401',
+        component: createNameComponent(() => import('@/views/system/401.vue')),
+        meta: { title: '401', hideTabs: true }
+      },
+      {
+        path: '/redirect/:path(.*)',
+        component: createNameComponent(() => import('@/views/system/redirect.vue')),
+        meta: { title: 'redirect', hideTabs: true }
+      }
+    ]
+  },
+  {
+    path: '/login',
+    component: createNameComponent(() => import('@/views/system/login.vue')),
+    hideMenu: true,
+    meta: { title: '登录', hideTabs: true }
+  },
+  {
+    // 找不到路由重定向到404页面
+    path: "/:pathMatch(.*)",
+    component: Layout,
+    redirect: "/404",
+    hideMenu: true
+  },
+]
+
+export default route

+ 116 - 0
src/router/reload.vue

@@ -0,0 +1,116 @@
+<template>
+  <div class="ok-loading">
+    <div class="ball-loader"> <span></span><span></span><span></span><span></span> </div>
+  </div>
+</template>
+
+<script>
+import { defineComponent } from 'vue'
+export default defineComponent({
+  name: 'routerReload',
+  setup() {}
+});
+</script>
+
+<style lang="scss">
+.ok-loading {
+  width: calc(100% - 30px);
+  height: calc(100% - 30px);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-color:  var(--system-page-background);
+  margin: 15px;
+}
+.ok-loading.close {
+  animation: close 1s;
+  -webkit-animation: close 1s;
+  animation-fill-mode: forwards;
+}
+.ball-loader {
+
+}
+.ball-loader > span,
+.signal-loader > span {
+  background-color: var(--system-primary-color);
+  display: inline-block;
+}
+
+.ball-loader > span:nth-child(1),
+.ball-loader.sm > span:nth-child(1),
+.signal-loader > span:nth-child(1),
+.signal-loader.sm > span:nth-child(1) {
+  -webkit-animation-delay: 0s;
+  animation-delay: 0s;
+}
+.ball-loader > span:nth-child(2),
+.ball-loader.sm > span:nth-child(2),
+.signal-loader > span:nth-child(2),
+.signal-loader.sm > span:nth-child(2) {
+  -webkit-animation-delay: 0.1s;
+  animation-delay: 0.1s;
+}
+.ball-loader > span:nth-child(3),
+.ball-loader.sm > span:nth-child(3),
+.signal-loader > span:nth-child(3),
+.signal-loader.sm > span:nth-child(3) {
+  -webkit-animation-delay: 0.15s;
+  animation-delay: 0.15s;
+}
+.ball-loader > span:nth-child(4),
+.ball-loader.sm > span:nth-child(4),
+.signal-loader > span:nth-child(4),
+.signal-loader.sm > span:nth-child(4) {
+  -webkit-animation-delay: 0.2s;
+  animation-delay: 0.2s;
+}
+.ball-loader > span {
+  width: 20px;
+  height: 20px;
+  margin: 0 3px;
+  border-radius: 50%;
+  transform: scale(0);
+  -ms-transform: scale(0);
+  -webkit-transform: scale(0);
+  animation: ball-load 1s ease-in-out infinite;
+  -webkit-animation: 1s ball-load ease-in-out infinite;
+}
+@-webkit-keyframes ball-load {
+  0% {
+    transform: scale(0);
+    -webkit-transform: scale(0);
+  }
+  50% {
+    transform: scale(1);
+    -webkit-transform: scale(1);
+  }
+  100% {
+    transform: scale(0);
+    -webkit-transform: scale(0);
+  }
+}
+@keyframes ball-load {
+  0% {
+    transform: scale(0);
+    -webkit-transform: scale(0);
+  }
+  50% {
+    transform: scale(1);
+    -webkit-transform: scale(1);
+  }
+  100% {
+    transform: scale(0);
+    -webkit-transform: scale(0);
+  }
+}
+@keyframes close {
+  0% {
+    opacity: 1;
+    /*display: block;*/
+  }
+  100% {
+    opacity: 0;
+    /*display: none;*/
+  }
+}
+</style>

+ 29 - 0
src/store/index.js

@@ -0,0 +1,29 @@
+import { createStore, createLogger } from 'vuex'
+import Presistent from './plugins/persistent'
+const debug = process.env.NODE_ENV !== 'production'
+
+const files = require.context("./modules/", true, /\.js$/)
+const map = {}
+for (const key of files.keys()) {
+  map[key] = files(key)
+}
+
+let modules = {}
+Object.keys(map).forEach((c) => {
+  const module = map[c].default
+  const moduleName = ('./modules/'+c.replace('./','')).replace(/^\.\/(.*)\/(.*)\.\w+$/, '$2')
+  modules[moduleName] = module
+})
+
+const presistent = Presistent({ key: 'vuex', modules, modulesKeys: {
+  local: Object.keys(modules),
+  session: []
+} })
+
+export default createStore({
+  modules: {
+    ...modules
+  },
+  strict: debug,
+  plugins: debug ? [createLogger(), presistent] : [presistent]
+})

+ 44 - 0
src/store/modules/app.js

@@ -0,0 +1,44 @@
+const state = () => ({
+  isCollapse: false, // 侧边栏是否收缩展示
+  contentFullScreen: false, // 内容是否可全屏展示
+  showLogo: true, // 是否显示Logo
+  fixedTop: false, // 是否固定顶部, todo,暂未使用
+  showTabs: true, // 是否显示导航历史
+  expandOneMenu: true, // 一次是否只能展开一个菜单
+  elementSize: 'default', // element默认尺寸,支持官网四个大小参数
+  theme: {
+    state: {
+      style: 'default',
+      primaryColor: '#409eff',
+      menuType: 'side'
+    }
+  }
+})
+
+// mutations
+const mutations = {
+  isCollapseChange(state, type) {
+    state.isCollapse = type
+  },
+  contentFullScreenChange(state, type) {
+    state.contentFullScreen = type
+  },
+  menuListChange(state, arr) {
+    state.menuList = arr
+  },
+  stateChange(state, option) {
+    state[option.name] = option.value
+  }
+}
+
+// actions
+const actions = {
+
+}
+
+export default {
+  namespaced: true,
+  state,
+  actions,
+  mutations
+}

+ 41 - 0
src/store/modules/keepAlive.js

@@ -0,0 +1,41 @@
+
+const state = () => ({
+  keepAliveComponentsName: [] // 需要缓存的组件名称
+})
+
+// mutations
+const mutations = {
+  // 重置,Push, splice keep-alive对象
+  setKeepAliveComponentsName(state, nameArr) {
+    state.keepAliveComponentsName = nameArr
+  },
+  addKeepAliveComponentsName(state, name) {
+    state.keepAliveComponentsName.push(name)
+  },
+  delKeepAliveComponentsName(state, name) {
+    const key = state.keepAliveComponentsName.indexOf(name)
+    if (key !== -1) {
+      state.keepAliveComponentsName.splice(key, 1)
+      console.log(state.keepAliveComponentsName)
+    }
+  }
+}
+
+const getters = {
+  keepAliveComponentsName(state) {
+    return state.keepAliveComponentsName
+  }
+}
+
+// actions
+const actions = {
+
+}
+
+export default {
+  namespaced: true,
+  state,
+  getters,
+  actions,
+  mutations
+}

+ 57 - 0
src/store/modules/order.js

@@ -0,0 +1,57 @@
+import * as types from '../mutation-types'
+import {order} from '@/request/api'
+
+const state = () =>({
+  orderList: [],      //订单列表数据
+  orderDetail : [],   //订单详情
+  voucherList:[]      //凭证信息列表
+})
+
+const mutations = {
+  /* 获取订单列表 */
+  [types.ORDER_LIST_GET](state,res){
+    state.orderList = res.data? res : []
+    console.log('成功获取订单数据')
+  },
+  /* 获取订单详情 */
+  [types.ORDER_DETAIL_GET](state,res){
+    res.code == "101" ? (state.orderDetail = res.data) : (state.orderDetail = [])
+    console.log('成功获取订单详情',state.orderDetail)
+  },
+  /* 获取凭证列表 */
+  [types.ORDER_VOUCHER_GET](state,res){
+  res.code == "101" ? (state.voucherList = res.data) : (state.voucherList = [])
+    console.log('成功获取订单数据')
+  }
+}
+const actions = {
+  /* 获取订单列表 */
+  getOrderList : async ({commit},params) =>{
+    let result = await order.GetOrderList(params)
+    commit(types.ORDER_LIST_GET,result)
+  },
+  /* 获取订单详情 */
+  getOrderDetail : async ({commit},params) => {
+    let result = await order.GetOrderDetail(params)
+    commit(types.ORDER_DETAIL_GET, result)
+  },
+  /* 获取凭证列表 */
+  getOrderVoucher : async ({commit},params) => {
+    let result = await order.GetVoucherList(params)
+    commit(types.ORDER_VOUCHER_GET, result)
+  },
+}
+
+const getters = {
+  orderList: state => state.orderList,
+  orderDetail : state => state.orderDetail,
+  voucherList: state => state.voucherList
+}
+
+export default{
+  namespaced: true,
+	state,
+	mutations,
+  getters,
+  actions
+}

+ 79 - 0
src/store/modules/user.js

@@ -0,0 +1,79 @@
+import * as types from '../mutation-types'
+import {user} from '@/request/api'
+
+const state = () => ({
+  token: '', // 登录token
+  userInfo: {},  // 用户信息
+})
+
+// mutations
+const mutations = {
+
+  /* 用户登录,获取token */
+  [types.USER_GET_TOKEN](state, info) {
+    if (info.code == 101) {
+      state.userToken = info.data //token
+      localStorage.aynUserToken = info.data //把token放入本地存储
+      state.isGetToken = true
+    } else {
+      state.userToken = ''
+      localStorage.aynUserToken = ''
+      state.isGetToken = false
+    }
+    state.loginMessage = info.message //登录的提示信息
+  },
+  /* 用户登录,获取用户信息 */
+  [types.USER_GET_USERINFO](state, info) {
+    if (info.code == 101) {            
+      state.userInfo = info.data || {} //用户信息
+      console.log(state.userInfo);
+      state.loginStatus = true //登录状态
+    } else {
+      state.loginMessage = info.message //登录失败提示信息
+    }
+  },
+  /* 用户退出登录 */
+  [types.USER_LOGIN_EXIT](state) {
+    state.isGetToken = false
+    state.loginStatus = false
+    state.userToken = ''
+    state.userInfo = ''
+    localStorage.aynUserToken = ''
+  },
+
+}
+
+// actions
+const actions = {
+  /* 用户登录,获取token */
+  getUserToken: async({commit}, params) => {
+    let token = await user.GetUserToken(params) //获取token
+    await commit(types.USER_GET_TOKEN, token)
+  },
+
+  /* 获取用户信息 */
+  getUserInfo: async({commit }) => {
+    let result = await user.GetUserInfo() //获取用户信息
+    await commit(types.USER_GET_USERINFO, result)
+  },
+
+   /* 退出登录 */
+  loginOut: ({
+    commit
+  }) => {
+    commit(types.USER_LOGIN_EXIT)
+  }
+}
+
+const getters = {
+  userToken: state => state.userToken,
+  userInfo: state => state.userInfo,
+}
+
+export default {
+  namespaced: true,
+  state,
+  actions,
+  getters,
+  mutations
+}

+ 14 - 0
src/store/mutation-types.js

@@ -0,0 +1,14 @@
+
+
+// 登录注册
+
+export const USER_GET_TOKEN = 'USER_GET_TOKEN'
+export const USER_GET_USERINFO = 'USER_GET_USERINFO'
+export const USER_LOGIN_EXIT = 'USER_LOGIN_EXIT'
+export const USER_GET_LOGIN_BG = 'USER_GET_LOGIN_BG'
+export const USER_GET_USERTYPE = 'USER_GET_USERTYPE'
+
+// 订单详情
+export const ORDER_LIST_GET = 'ORDER_LIST_GET'
+export const ORDER_DETAIL_GET = 'ORDER_DETAIL_GET'
+export const ORDER_VOUCHER_GET = 'ORDER_VOUCHER_GET'

+ 39 - 0
src/store/plugins/persistent.js

@@ -0,0 +1,39 @@
+const exclude = ['actions', 'getters', 'mutations', 'namespaced']
+export default function Presistent({ key, modules, modulesKeys }) {
+  return (store) => {
+    const localOldState = JSON.parse(localStorage.getItem(key) || '{}')
+    const sessionOldState = JSON.parse(sessionStorage.getItem(key) || '{}')
+    let oldState = {}
+    Object.assign(oldState, localOldState, sessionOldState)
+    if (Object.keys(oldState).length > 0) {
+      for (const oldKey in oldState) {
+        modules[oldKey] = oldState[oldKey]
+      }
+      store.replaceState(modules)
+    }
+    store.subscribe((mutation, state) => {
+      // 判断是否需要缓存数据至localStorage
+      if (modulesKeys.local.length > 0) {
+        const localData = setData(store.state, modulesKeys.local)
+        localStorage.setItem(key, JSON.stringify(localData))
+      } else {
+        localStorage.removeItem(key)
+      }
+      // 判断是否需要缓存数据至sessionStorage
+      if (modulesKeys.session.length > 0) {
+        const sessionData = setData(store.state, modulesKeys.session)
+        sessionStorage.setItem(key, JSON.stringify(sessionData))
+      } else {
+        sessionStorage.removeItem(key)
+      }
+    })
+  }
+}
+
+function setData(state, module) {
+  let data = {}
+  for (const i of module) {
+    data[i] = state[i]
+  }
+  return data
+}

+ 99 - 0
src/theme/index.js

@@ -0,0 +1,99 @@
+
+export const style = {
+  'default': {
+    name: '默认菜单风格',
+    menu: {
+      textColor: '#bfcbd9',
+      background: '#515a6e',
+      childrenBackground: '#1f2d3d',
+      hoverBackground: '#203448',
+      submenuActiveColor: '#fff'
+    },
+    logo: {
+      color: '#f1f1f1',
+      background: '#263445'
+    },
+    header: {
+      background: '#fff',
+      textColor: '#303133',
+      itemHoverColor: 'rgba(0,0,0,.025)',
+      breadcrumbTextColor: '#606266',
+      borderColor: '#d8dce5',
+      tabBackground: '#fff'
+    },
+    container: {
+      background: '#f8f8f8',
+      mainBackground: '#fff'
+    },
+    page: {
+      background: '#fff',
+      color: '#303133',
+      tipColor: 'rgba(0, 0, 0, 0.45)',
+      borderColor: '#ebeef5'
+    }
+  },
+  'light': {
+    name: '亮色菜单风格',
+    menu: {
+      textColor: '#272727',
+      background: '#fff',
+      childrenBackground: '#fff',
+      hoverBackground: '#f1f1f1',
+      submenuActiveColor: 'var(--system-primary-color)'
+    },
+    logo: {
+      color: '#000',
+      background: '#fff'
+    },
+    header: {
+      background: '#fff',
+      textColor: '#303133',
+      itemHoverColor: 'rgba(0,0,0,.025)',
+      breadcrumbTextColor: '#606266',
+      borderColor: '#d8dce5',
+      tabBackground: '#fff'
+    },
+    container: {
+      background: '#f8f8f8',
+      mainBackground: '#fff'
+    },
+    page: {
+      background: '#fff',
+      color: '#303133',
+      tipColor: 'rgba(0, 0, 0, 0.45)',
+      borderColor: '#ebeef5'
+    }
+  },
+  'dark': {
+    name: '暗色菜单风格',
+    menu: {
+      textColor: '#bbb',
+      background: '#18181c',
+      childrenBackground: '#18181c',
+      hoverBackground: '#000',
+      submenuActiveColor: '#fff'
+    },
+    logo: {
+      color: '#fff',
+      background: '#18181c'
+    },
+    header: {
+      background: '#18181c',
+      textColor: '#e3e3e4',
+      itemHoverColor: '#000',
+      breadcrumbTextColor: '#fff',
+      borderColor: '#3e3e3e',
+      tabBackground: '#1b1b1b'
+    },
+    container: {
+      background: '#000',
+      mainBackground: '#18181c'
+    },
+    page: {
+      background: '#18181c',
+      color: '#c7c7c7',
+      tipColor: 'rgba(255, 255, 255, 0.45)',
+      borderColor: '#3e3e3e'
+    }
+  }
+}

+ 51 - 0
src/theme/index.scss

@@ -0,0 +1,51 @@
+:root {
+  // 主题色
+  --system-primary-color: #409eff; // 可做背景色和文本色,用做背景色时,需要和--system-primary-text-color配合使用,避免文件颜色和主题色冲突
+  --system-primary-text-color: #fff; // 主题色作为背景色时使用
+
+  // logo颜色相关
+  --system-logo-color: #f1f1f1;
+  --system-logo-background: #263445;
+
+  // 菜单颜色相关
+  --system-menu-text-color: #bfcbd9;
+  --system-menu-background: #28415a;
+  --system-menu-children-background: #1f2d3d;
+  --system-menu-submenu-active-color: #fff; 
+  --system-menu-hover-background: #203448;
+
+  // header区域
+  --system-header-background: #fff;
+  --system-header-text-color: #bbb;
+  --system-header-breadcrumb-text-color: #97a8be;
+  --system-header-item-hover-color: #000;
+  --system-header-border-color: #d8dce5;
+  --system-header-tab-background: #fff;
+
+  // contaier区域,父框架
+  --system-container-background: #f8f8f8;
+  --system-container-main-background: #fff;
+
+  // 页面区域, 这一块是你在自己写的文件中使用主题,核心需要关注的地方
+  --system-page-background: #fff; // 主背景
+  --system-page-color: #303133; // 主要的文本颜色
+  --system-page-tip-color: rgba(0, 0, 0, 0.45); // 协助展示的文本颜色
+  --system-page-border-color: #000; // 通用的边框配置色,便于主题扩展
+  
+  // element主题色修改
+  --el-color-primary: var(--system-primary-color);
+}
+
+// 进度条颜色修改为主题色
+body #nprogress .bar {
+  background-color: var(--system-primary-color);
+}
+body #nprogress .peg {
+  box-shadow: 0 0 10px var(--system-primary-color), 0 0 5px var(--system-primary-color);
+}
+body #nprogress .spinner-icon {
+  border-top-color: var(--system-primary-color);
+  border-left-color: var(--system-primary-color);
+}
+
+@import './modules/dark.scss';

+ 23 - 0
src/theme/modules/dark.scss

@@ -0,0 +1,23 @@
+.dark {
+  // 通用
+  p, h1, h2, h3, h4, h5, h6, article {
+    color: var(--system-page-color);
+  }
+  .el-tree {
+    background-color: var(--system-page-background);
+    .el-tree-node__content:hover {
+      background-color: #272727;
+    }
+    --el-color-primary-light-9: #272727;
+  }
+  .el-card {
+    background-color: var(--system-page-background);
+    color: var(--system-page-color);
+    border-color: var(--system-page-border-color);
+    .el-card__header {
+      border-color: var(--system-page-border-color);
+    }
+  }
+  // 页面内部样式修改
+  
+}

+ 283 - 0
src/utils/system/filters.js

@@ -0,0 +1,283 @@
+/**
+ * 自定义过滤器
+ */
+
+function toPercent (num) {
+  return (Math.round(num*100)/100).toFixed(2); 
+}
+
+/* 订单状态 */
+function orderStatus(val) {
+  switch (val) {
+      case 1:
+          return '待付款'
+      case 2:
+          return '待发货'
+      case 3:
+          return '待收货'
+      case 4:
+          return '已收货'
+      case 5:
+          return '已取消'
+      case 6:
+          return '已完成'
+      case 7:
+          return '账期待审核'
+      case 8:
+          return '已进入账期'
+      case 9:
+          return '账期已完成'
+      case 10:
+          return '已逾期'
+      case 11:
+          return '已结算'
+      case 12:
+          return '提现中'
+      case 13:
+          return '提现完成'
+      case 14:
+          return '预售订金未代扣'
+      case 15:
+          return '拼团未确认'
+      case 16:
+          return '已进入排期'
+      case 17:
+          return '预售定金已付'
+      case 18:
+          return '排期核算完成'
+  }
+}
+/* 报表状态 */
+function reportStatus(val) {
+  switch (val) {
+      case 1:
+          return '未创建'
+      case 2:
+          return '正在生成中'
+      case 3:
+          return '已生成'
+      case 4:
+          return '报表出错'
+      case 5:
+          return '正在执行'
+      default:
+          return '-'
+  }
+}
+/* 凭证类型 */
+function voucherType(val) {
+  switch (val) {
+      case '1':
+          return '发票'
+      case '2':
+          return '入库单'
+      case '3':
+          return ''
+      case '4':
+          return '物流凭证'
+      case '5':
+          return '销货清单'
+      case '6':
+          return '对账单'
+      case '7':
+          return '普通快递'
+      case 8:
+          return '货运物流'
+      case '9':
+          return '其它'
+  }
+}
+// 中信回执单交易类型
+function tranType(v) {
+  switch (v.tranType) {
+      case "11":
+          return '即时到账'
+          break;
+      case "15":
+          return '担保交易'
+          break;
+      case "23":
+          if (v.cdfg === "C") {
+              return '充值'
+          } else if (v.cdfg === "D") {
+              return '提现'
+          }
+          break;
+  }
+}
+/* 支付方式 */
+function payModel(val) {
+  switch (val) {
+      case 0:
+          return '全额支付'
+      case 1:
+          return '奶款担保'
+      case 3:
+          return '奶款结算'
+      case 4:
+          return '全额线下支付'
+      case 5:
+          return '牛奶花支付'   
+      case 6:
+          return '账期逾期转代扣' 
+      case 7:
+          return '牛信支付'
+      case 8:
+          return '青贮贷支付'  
+      case 11:
+          return '30天账期'
+      case 12:
+          return '60天账期'
+      case 13:
+          return '90天账期'
+  }
+}
+/* 支付状态 */
+function payStatus(val) {
+  switch (val) {
+      case 1:
+          return '货到付款'
+      case 2:
+          return '等待付款'
+      case 3:
+          return '已付款'
+      case 4:
+          return '正在退款'
+      case 5:
+          return '已退款'
+      case 6:
+          return '待付余款'
+      case 7:
+          return '已付余款'
+  }
+}
+/* 支付方式 */ 
+function payType(val) {
+  switch (val) {
+      case 1:
+        return '支付宝'
+      case 2:
+        return '微信支付'
+      case 3:
+        return '银联支付'
+      case 4:
+        return '中国农业银行'
+      case 5:
+        return '渤海银行渤商赢'
+      case 6:
+        return '蒙牛代扣款'
+      case 7:
+      return '中信银行支付'
+      case 8:
+        return '微信PC支付'
+      case 9:
+        return '线下支付'
+      case 10:
+        return '爱养牛钱包支付'
+      case 11:
+        return '牛奶花融资支付'
+      case 12:
+          return '青贮贷融资支付'
+      case 13:
+          return '牛信融资支付'
+      }
+}
+// 配送方式
+function sendWayDisplayInt(val) {
+  switch (val) {
+      case 1:
+          return '自提'
+      case 2:
+          return '配送'
+  }
+}
+/* 售后状态 */
+function afterSaleStatus(val) {
+  switch (val) {
+      case 1:
+          return '-'
+      case 2:
+          return '申请换货'
+      case 3:
+          return '申请退货'
+      case 4:
+          return '未通过换货审核'
+      case 5:
+          return '未通过退货审核'
+      case 6:
+          return '已通过换货审核'
+      case 7:
+          return '已通过退货审核'
+      case 8:
+          return '退货已发货'
+      case 9:
+          return '退货已收货'
+      case 10:
+          return '已换货'
+      case 11:
+          return '已退货'
+  }
+}
+/* 货运物流审核状态 */
+function voucherStatus(val) {
+    switch (val) {
+        case '1':
+            return '待审核'
+        case '2':
+            return '已通过'
+        case '3':
+            return '已拒绝'
+    }
+  }
+  //用户注销状态状态
+  function reviewStatus (val) {
+    switch (val) {
+        case 0:
+            return '待审核'
+        case 1:
+            return '审核通过'
+        case 2:
+            return '审核拒绝'
+    }
+  }
+  //代扣分期类型
+  function instalType(val) {
+    switch (val) {
+      case 1:
+        return '自有分期'
+      case 2:
+        return '融资产品'
+    }
+  }
+
+  //分期还款类型
+  function InstallmentType(val) {
+    switch (val) {
+      case 1:
+        return '等额本息'
+      case 2:
+        return '等额本金'
+      case 3:
+        return '先息后本'
+    }
+  }
+  /* 商铺管理-平台审核 */
+  function itemStatus(val) {
+    switch (val) {
+        case 1:
+            return '仓库中'
+        case 2:
+            return '待审核'
+        case 3:
+            return '销售中'
+        case 4:
+            return '违规下架'
+        default:
+            return '审核被拒绝'
+    }
+  }
+
+export{
+  toPercent,orderStatus,payType,payStatus,payModel,tranType,voucherType,reportStatus,sendWayDisplayInt,afterSaleStatus,voucherStatus,reviewStatus,instalType,InstallmentType,itemStatus
+}
+

+ 12 - 0
src/utils/system/nprogress.js

@@ -0,0 +1,12 @@
+import NProgress from "nprogress"
+import "nprogress/nprogress.css"
+
+NProgress.configure({
+  easing: 'ease', // 动画方式    
+  speed: 500, // 递增进度条的速度    
+  showSpinner: true, // 是否显示加载ico    
+  trickleSpeed: 200, // 自动递增间隔    
+  minimum: 0.3 // 初始化时的最小百分比
+})
+
+export default NProgress

+ 98 - 0
src/utils/system/request.js

@@ -0,0 +1,98 @@
+import axios from 'axios'
+import store from '@/store'
+import api from '@/request/apiConfig' //真实接口配置
+import { ElMessage } from 'element-plus'
+import qs from 'qs'
+import router from '@/router/index.js'
+
+
+/**  axios基础配置 */
+axios.defaults.timeout = 50000;
+axios.defaults.headers['Content-Type'] = 'application/json;charset=UTF-8'
+
+// 请求拦截器
+axios.interceptors.request.use(
+  config => {
+    if (localStorage.aynUserToken) {
+      config.headers.common['X-AIYANGNIU-SIGNATURE'] = localStorage.aynUserToken;
+    }
+    return config;
+  },
+  err => {
+    return Promise.reject(err);
+  }
+);
+
+// 响应拦截器
+axios.interceptors.response.use(
+  response => {
+    if (response.data) {
+      let code = response.data.code
+      switch (code) {
+        case '1002': // 109 清除token信息并跳转到登录页面
+          localStorage.aynUserToken = ''
+          router.push('/login')
+          break;
+        case 110:
+          break;
+      }
+    }else{
+      showError({ code, message: response.data.code })
+    }
+    return response;
+  },
+  error => {
+    if (error.response) {
+      let status = error.response.status
+      switch (status) {
+        case 401: // 109 清除token信息并跳转到登录页面
+          localStorage.aynUserToken = ''
+          router.push('/login')
+          break;
+        case 403: // 109 清除token信息并跳转到登录页面
+          location.hash = "#/page403"
+          break;
+      }
+    }
+    let err = error.response ? (error.response.data || error.response) : (error.message || error)
+    return Promise.reject(err)
+  }
+);
+
+
+function showError(error) {
+  if (error.code === 403) {
+    // to re-login
+    store.dispatch('user/loginOut')
+  } else {
+    ElMessage({
+      message: error.msg || error.message || '服务异常',
+      type: 'error',
+      duration: 3 * 1000
+    })
+  }
+  
+}
+
+/**
+ * 二次封装axios请求
+ */
+ export default async(type, apiName, url, data, options) => {
+
+  let result = {}
+  let path = (apiName != '')? api[apiName] + url:url
+  
+  //post/put data转form
+  if(options && options.form){
+    let opt = {headers:{'Content-Type':'application/x-www-form-urlencoded'}}
+    data = qs.stringify(data)
+    options === {}?options.headers = opt.headers:options = opt
+  }
+
+  //axios
+  await axios[type](path,data,options).then((res) => {
+    result = res.data
+  })
+  
+  return result
+}

+ 39 - 0
src/utils/system/time.js

@@ -0,0 +1,39 @@
+// 用于格式化时间
+function formatDate(value, format) {
+    //value: 需要格式化的数据
+    //format: 指定格式 yyyy-MM-dd hh:mm:ss
+    let date = new Date(value);
+    // 获取年份
+    let year = date.getFullYear();
+  
+    if (/(y+)/.test(format)) {
+      // 获取匹配组的内容
+      let content = RegExp.$1;
+      format = format.replace(content, year.toString().slice(4 - content.length));
+    }
+  
+    let o = {
+      // y: date.getFullYear(),  // 用这一句也行,但只适用于四位数显示时候用
+      M: date.getMonth() + 1,
+      d: date.getDate(),
+      h: date.getHours(),
+      m: date.getMinutes(),
+      s: date.getSeconds()
+    };
+  
+    for (let key in o) {
+      // 构造动态正则
+      let reg = new RegExp(`(${key}+)`);
+  
+      if (reg.test(format)) {
+        // 获取匹配组的内容
+        let content = RegExp.$1;
+        let k = o[key] >= 10 ? o[key] : content.length == 2 ? '0' + o[key] : o[key];
+        format = format.replace(content, k);
+      }
+    }
+    return format;
+  }
+  
+  export default formatDate
+  

+ 6 - 0
src/utils/system/title.js

@@ -0,0 +1,6 @@
+// import { systemTitle } from '@/config'
+
+export function changeTitle(name) {
+  // document.title = `${name}-${systemTitle}`
+  document.title = '让养牛更绿色,更简捷,更高效'
+}

+ 32 - 0
src/utils/system/uploadCompress.js

@@ -0,0 +1,32 @@
+/*  time:20022.08.29
+**  classify:AYN Define Component
+**  author:zhangb
+**  description: 用于资源图片上传压缩,以提升终端性能,提升用户良性体验,该组件基于‘image-conversion’基础进行封装延展,视频文件不进行压缩,PNG由于无法改变分辨率,所以压缩后原型输出
+**  params: file -- 上传文件   ctimes -- 压缩比例值
+*/
+
+import * as imageConversion from 'image-conversion'; 
+
+export function compressFileM(file,ctimes) {
+  console.log('上传前的尺寸',file);
+    // 如果是视频不做压缩处理
+    if(file.type === 'video/mp4'){
+      return true
+    }
+    const isLt1M = (file.size / 1024 / 1024) * 10 < 1;
+    if (!isLt1M) {
+      let myImg = new Promise((resolve) => {
+        // 压缩值自定义,当前定义为原图的  1/<ctimes>
+        imageConversion.compressAccurately(file,{
+          size:file.size/1024/ctimes,  //指定压缩后的大小
+          type:file.type                 //指定压缩的后文件类型
+        }).then((res) => {
+          res = new File([res], file.name, { type: res.type, lastModified: Date.now() })
+          resolve(res);
+        });
+      });
+      console.log('今经过压缩处理的文件',myImg);
+      return myImg;
+    }
+  return isLt1M;
+}

+ 355 - 0
src/views/manager/ecommerceManager/ecommerceList.vue

@@ -0,0 +1,355 @@
+/**
+ * 模板名称:电商用户管理
+ * 作者:zhangyy
+ * 时间:2023-10-07
+ */
+
+<template>
+  <div class="ecommerceList">
+    <!-- 按订单号搜索 -->
+    <Row :gutter="10">
+       <Col span="19">
+          <Form :label-width="80" :model="searchFilter">
+                <transition name="el-zoom-in-center">
+                  <Row>
+                    <Col span="6">
+                      <FormItem label="用户名">
+                        <Input placeholder="请输入用户名" v-model="searchFilter.userName"/>
+                      </FormItem>
+                    </Col>
+                    <!-- 按状态 -->
+                    <Col span="5">
+                      <FormItem label="昵称">
+                        <Input placeholder="请输入昵称" v-model="searchFilter.nickName"/>
+                      </FormItem>
+                    </Col>
+                    <!-- 按成交时间 -->
+                    <Col span="12" >
+                      <FormItem label="注册时间">
+                          <Row>
+                              <Col span="11">
+                                <DatePicker type="date" placeholder="选择日期"
+                                format="yyyy-MM-dd"
+                                v-model="searchFilter.startDate"
+                                @on-change="changeStartTime"/>
+                              </Col>
+                              <Col span="2" style="text-align: center">-</Col>
+                              <Col span="11">
+                                <DatePicker type="date" placeholder="截止日期"
+                                format="yyyy-MM-dd"
+                                v-model="searchFilter.endDate"
+                                @on-change="changeEndTime"
+                                />
+                              </Col>
+                          </Row>
+                      </FormItem>
+                    </Col>
+                  </Row>
+                </transition>
+              </Form>
+       </Col>
+        <Col span="2">
+         <Button type="primary" icon="ios-search" @click="initData">搜索</Button>
+       </Col>
+       <Col span="2">
+         <Button type="error" @click="frozenUser('MULTI')">冻结所选</Button>
+       </Col>
+    </Row>
+    <br />
+    <!-- 数据展示 -->
+    <el-table class="el-table" ref="usersListTable" :data="usersList" v-loading="dataLoading">
+      <el-table-column
+        type="selection"
+        width="55">
+      </el-table-column>
+      <el-table-column label="头像" width="150">
+        <template #default="scope">
+          <span class="imgStyle">
+            <img v-if="scope.row.headImg" :src="scope.row.headImg" alt="">
+            <img v-else src="../../../assets/images/default.png" alt="">
+          </span>
+        </template>
+      </el-table-column>
+      
+      <el-table-column label="用户名" width="150">
+        <template #default="scope">
+            {{scope.row.userName || '无'}}
+        </template>
+      </el-table-column>
+      <el-table-column label="昵称" width="150">
+        <template #default="scope">
+            {{scope.row.nickName || '无'}}
+        </template>
+      </el-table-column>
+      <el-table-column label="组织编号" width="150">
+        <template #default="scope">
+            {{scope.row.orgId || '无'}}
+        </template>
+      </el-table-column>
+      <el-table-column label="联系电话" width="150">
+        <template #default="scope">
+            {{scope.row.contactCell || '无'}}
+        </template>
+      </el-table-column>
+      <el-table-column label="注册时间" width="100">
+        <template #default="scope">
+          <span>
+            {{formatData(scope.row.addTime)}}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="280">
+        <template #default="scope">
+          <span>
+            <Button type="success" size="small"  @click="checkUsersDetail(scope.row)" style="margin-right: 5px;">详情</Button>
+            <Button v-show="scope.row.status==0" type="error" size="small" @click="frozenUser(scope.row.id)" style="margin-right: 5px;">冻结账号</Button>
+            <Button v-show="scope.row.status==1" type="warning" size="small" @click="thawUser(scope.row.id)" style="margin-right: 5px;">解冻账号</Button>
+            <Button type="primary" size="small"  @click="updatePsd(scope.row.id)" style="margin-right: 5px;">修改密码</Button>
+          </span>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <div style="margin: 10px;overflow: hidden">
+      <div style="float: right;">
+        <Page show-elevator :total="parseInt(totalNum)" :page-size="searchFilter.limit"  @on-change="changePage"></Page>
+      </div>
+    </div>
+    <!-- 用户详情弹出层 -->
+    <Modal v-model="checkUsersDetailModel" title="用户详情" @on-ok="checkUsersDetailModel=false">
+      <Form ref="checkUsersDetailRef" :model="usersDetail" :label-width="80" >
+        <FormItem label="用户名:" prop="userName">
+          <span>{{usersDetail.userName}}</span>
+        </FormItem>
+        <FormItem label="用户头像:" prop="headImg">
+          <span class="imgStyle">
+            <img v-if="usersDetail.headImg"  :src="usersDetail.headImg" alt="">
+            <img v-else src="../../../assets/images/default.png" alt="">
+          </span>
+        </FormItem>
+        <FormItem label="用户昵称:" prop="nickName">
+          <span>{{usersDetail.nickName || '无'}}</span>
+        </FormItem>
+        <FormItem label="联系电话:" prop="contactCell">
+          <span>{{usersDetail.contactCell || '无'}}</span>
+        </FormItem>
+        <FormItem label="注册时间:" prop="addTime">
+          <span>{{formatData(usersDetail.addTime)|| '无'}}</span>
+        </FormItem>
+      </Form>
+    </Modal>
+    <!-- 修改密码 -->
+    <Modal v-model="updatePsdModel" title="修改密码" ok-text="提交修改" @on-ok="submit()">
+      <Form ref="changePasswordRef" :label-width="100" :model="changePassword" :rules="psdRules">
+        <FormItem label="新密码" prop="newPwd">
+          <Input type="password" v-model="changePassword.newPwd" placeholder="请输入新密码"/>
+        </FormItem>
+        <FormItem label="确认密码" prop="confirmPwd">
+          <Input type="password" v-model="changePassword.confirmPwd" placeholder="请重复输入新密码"/>
+        </FormItem>
+      </Form>
+    </Modal>
+  </div>
+</template>
+
+<script>
+import { defineComponent, onMounted, ref ,reactive,getCurrentInstance} from 'vue'
+import { Message,Modal } from 'view-ui-plus'
+import { user } from '@/request/api'
+import moment from 'moment'
+
+export default defineComponent({
+  components:{
+    
+  },
+  setup() {
+    const confirmPwdCheck = (rule, value, callback)=>{
+      if (value != changePassword.value.newPwd) {
+        callback(new Error('两次输入密码不一致'))
+      }else{
+        callback()
+      }
+    }
+    let dataLoading = ref(false) //是否在加载中
+    let usersList = ref([])
+    let totalNum = ref(0)
+    let imgDefault = '../../../assets/images/default.png'
+    let updatePsdModel = ref(false)
+    let checkUsersDetailModel = ref(false)
+    let searchFilter = reactive({
+      orgId:'',    //订单状态
+      userName:'',        //用户名
+      startDate: '',      //订单开始日期(yyyy-MM-dd)
+      endDate: '',        //订单结束日期(yyyy-MM-dd)
+      offset: 0,
+      limit:10,
+      nickName:''
+    })
+    let usersDetail = ref({})
+    let changePassword = ref({
+      id:'',
+      newPwd: '',    //新密码
+      confirmPwd:'',      //确认密码
+    })
+    let changePasswordRef = ref()
+    let psdRules = {                //验证规则
+      newPwd: [
+        { required: true, message: '请输入新密码', trigger: 'blur' },
+        { type: 'string', min: 6, message: '密码长度不能小于6位', trigger: 'blur' },
+      ],
+      confirmPwd:[
+        { required: true, message: '请重复输入新密码', trigger: 'blur' },
+        { type: 'string', min: 6, message: '密码长度不能小于6位', trigger: 'blur' },
+        { validator: confirmPwdCheck, trigger: 'blur' },
+      ]
+    }
+    const usersListTable = ref()
+
+    // 格式化日期
+    function formatData(date) {
+      return moment(date).format("YYYY-MM-DD");
+    }
+
+    async function initData() {
+      dataLoading.value = true
+      getUsersList()
+      dataLoading.value = false
+    }
+
+    async function getUsersList() {
+      await user.GetUsersList({...searchFilter
+      }).then(res => {
+        if (res.code == '101') {
+            usersList.value = res.data || []
+            totalNum.value = res.total || 0
+        } else {
+            Message.error(res.message || "获取平台用户信息出错")
+        }
+      })
+    }
+
+    //更改页码
+    function changePage(page) {
+      searchFilter.offset = (page - 1) * searchFilter.limit
+      getUsersList()
+    }
+
+    //更改开始时间
+    function changeStartTime(time){
+      searchFilter.startDate = time
+      // this.getData()
+    }
+
+    //更改截止时间
+    function changeEndTime(time){
+      searchFilter.endDate = time
+      // this.getData()
+    }
+
+    /*=====搜索=====*/
+    function searchItem() {
+      getUsersList()
+    }
+    function checkUsersDetail(item) {
+      usersDetail.value = item
+      checkUsersDetailModel.value = true
+    }
+
+    async function frozenUser(...args) {
+      let params
+
+      if (args[0] == "MULTI") {
+        var selection = usersListTable.value.store.states.selection._rawValue,
+          ids = selection.map(val => val.id).join(',')
+          params = {ids: ids}
+      }else {
+        params = {ids: args[0]}
+      }
+
+      await user.FrozenUser(params).then(res => {
+          if (res.code == '101') {
+            Message.success(res.message || "冻结成功")
+            getUsersList()
+          } else {
+            Message.error(res.message || "冻结失败")
+          }
+      })
+    }
+
+    async function thawUser(id) {
+      await user.ThawUser({
+        id:id
+      }).then(res => {
+          if (res.code == '101') {
+            Message.success(res.message || "解冻成功")
+            getUsersList()
+          } else {
+            Message.error(res.message || "解冻失败")
+          }
+      })
+    }
+
+    function updatePsd(id) {
+      changePassword.value.id = id
+      updatePsdModel.value = true
+    }
+
+    function submit (name) {
+      changePasswordRef.value.validate(async (valid) => {
+        if(valid){     //验证通过
+          await user.UpdatePassWord({
+            id:changePassword.value.id,
+            newPwd: changePassword.value.newPwd,
+            confirmPwd: changePassword.value.confirmPwd
+          }).then((res)=>{
+            if(res.code == '101'){
+              Message.success("密码修改成功")
+              changePasswordRef.value.resetFields()//将数据置空(清除callback函数影响)
+              updatePsdModel.value = false
+              changePassword.value.newPwd = ''
+              changePassword.value.confirmPwd = ''
+            }else{
+              Message.error(res.message)
+            }
+          }).catch((err) => {
+            Message.error(err)
+          })
+        } else {   //验证失败
+            Message.error('提交失败!');
+        }
+      })
+    }
+
+    onMounted(()=>{
+      initData()
+    })
+
+    return {
+      dataLoading,usersList,totalNum,updatePsdModel,checkUsersDetailModel,searchFilter,usersDetail,changePassword,psdRules,
+      usersListTable,changePasswordRef,imgDefault,
+      getUsersList,changePage,changeStartTime,changeEndTime,searchItem,checkUsersDetail,frozenUser,thawUser,updatePsd,submit,formatData,initData
+    }
+  },
+})
+</script>
+
+<style lang="scss" scoped>
+.ecommerceList{
+  padding: 1em;
+  .el-table{
+    width: 100%;
+    font-size: 12px;
+  }
+  .imgStyle {
+    width: 100px;
+    height: 100px;
+    display: table;
+    overflow: hidden;
+    img {
+      vertical-align: middle;
+      max-width: 100px;
+      max-height: 100px;
+    }
+  }
+}
+</style>

+ 506 - 0
src/views/manager/ecommerceManager/logoffManage.vue

@@ -0,0 +1,506 @@
+/**
+ * 模板名称:系统操作日志
+ * 作者:zhangyy
+ * 时间:2023-09-22
+ */
+
+<template>
+  <div class="logoffManage">
+    <!-- 按订单号搜索 -->
+    <Row :gutter="10">
+      <Form :label-width="80" :model="searchFilter">
+        <Row>
+          <Col span="6">
+            <FormItem label="用户名">
+              <Input placeholder="请输入用户名" v-model="searchFilter.userName" clearable/> 
+            </FormItem>
+          </Col>
+          <Col span="6">
+            <FormItem label="状态">
+              <Select v-model="searchFilter.reviewStatus" placeholder="请选择审核状态" clearable>
+                <Option value="">全部</Option>
+                <Option :value="0" label="待审核"></Option>
+                <Option :value="1" label="审核通过"></Option>
+                <Option :value="2" label="审核拒绝"></Option>
+              </Select>
+            </FormItem>
+          </Col>
+          <Col span="10">
+            <FormItem label="申请时间">
+              <Row>
+                <Col span="11">
+                  <DatePicker type="date" placeholder="开始时间"
+                    format="yyyy-MM-dd"
+                    clearable
+                    v-model="searchFilter.startDate"
+                    @on-change="changeStartTime"/>
+                </Col>
+                <Col span="2" style="text-align: center">-</Col>
+                <Col span="11">
+                  <DatePicker type="date" placeholder="截止时间"
+                    format="yyyy-MM-dd"
+                    clearable
+                    v-model="searchFilter.endDate"
+                    @on-change="changeEndTime"
+                  />
+                </Col>
+              </Row>
+            </FormItem>
+          </Col>
+          <Col span="2">
+            <Button type="primary" style="margin-left: 25px;" @click="initData">搜索</Button>
+          </Col>
+        </Row>
+      </Form>
+    </Row>
+    <br/>
+    <!-- 数据展示 -->
+    <el-table class="el-table" ref="shopListTable" :data="promoteUserList" v-loading="dataloading">
+	  <!-- 扩展 -->
+	  <el-table-column type="expand">
+		<template #default="props">
+		  <el-table :data="props.row.userCancelList" border>
+			  <el-table-column label="用户名" width="180">
+			    <template #default="scope">
+				   <span>{{scope.row.userName}}</span>
+			    </template>
+			  </el-table-column>
+			  <el-table-column label="昵称" width="180">
+			    <template #default="scope">
+			  	   <span>{{scope.row.nickName}}</span>
+			    </template>
+			  </el-table-column>
+			  <el-table-column label="是否管理员" width="180">
+			    <template #default="scope">
+			  	   <span>{{scope.row.isAdminStr}}</span>
+			    </template>
+			  </el-table-column>
+			  <el-table-column label="注销原因" width="180">
+			    <template #default="scope">
+			  	   <span>{{scope.row.reason}}</span>
+			    </template>
+			  </el-table-column>
+			  <el-table-column label="手机号" width="180">
+			    <template #default="scope">
+			  	   <span>{{scope.row.phone}}</span>
+			    </template>
+			  </el-table-column>
+			  <el-table-column label="注册时间" width="180" align="center">
+			    <template #default="scope">
+			  	   <span v-if="scope.row.registerTime">{{formatData(scope.row.registerTime)}}</span>
+				   <span v-else>-</span>
+			    </template>
+			  </el-table-column>
+			  <el-table-column label="申请时间" width="180" align="center">
+			    <template #default="scope">
+			  	   <span v-if="scope.row.applyTime">{{formatData(scope.row.applyTime)}}</span>
+				   <span v-else>-</span>
+			    </template>
+			  </el-table-column>
+			  <el-table-column label="审核时间" width="180" align="center">
+			    <template #default="scope">
+			  	   <span v-if="scope.row.reviewTime">{{formatData(scope.row.reviewTime)}}</span>
+				     <span v-else>-</span>
+			    </template>
+			  </el-table-column>
+			  <el-table-column label="审核状态" width="180">
+			    <template #default="scope">
+			  	   <span>{{ reviewStatus(scope.row.reviewStatus)}}</span>
+			    </template>
+			  </el-table-column>
+			  <el-table-column label="操作" width="210" v-if="pageName!=4">
+			    <template #default="scope">
+			      <span>
+              <Button type="primary" size="small" @click="putRefuseReason(scope.row)"  v-show ="scope.row.reviewStatus === 0">审核</Button>
+              <Button type="submit" size="small" @click="checkRefuseReason(scope.row)"  v-show ="scope.row.reviewStatus !== 0">查看备注</Button>
+			      </span> 
+			    </template>
+			  </el-table-column>
+		  </el-table>
+		</template>
+	  </el-table-column>
+	  <!-- 扩展 end-->
+    <el-table-column label="公司名称">
+      <template #default="scope">
+        <span>
+          {{scope.row.orgName}}
+        </span>
+      </template>
+    </el-table-column>
+    <el-table-column label="公司类型">
+      <template #default="scope">
+        <span>
+          {{scope.row.orgType}}
+        </span>
+      </template>
+    </el-table-column>
+    <el-table-column label="法定代表人">
+      <template #default="scope">
+        <span>
+          {{scope.row.idName}}
+        </span>
+      </template>
+    </el-table-column>
+    <el-table-column label="联系人">
+      <template #default="scope">
+        <span>
+          {{scope.row.contactName}}
+        </span>
+      </template>
+    </el-table-column>
+    <el-table-column label="联系方式">
+      <template #default="scope">
+        <span>
+          {{scope.row.contactCell}}
+        </span>
+      </template>
+    </el-table-column>
+  </el-table>
+  <!-- 分页 -->
+  <div style="margin: 10px;overflow: hidden">
+    <div style="float: right;">
+      <Page show-elevator :total="parseInt(totalNum)" :current="searchFilter.current" :page-size="searchFilter.limit"  @on-change="changePage"></Page>
+    </div>
+  </div>
+	
+	<!-- 详情弹出层 -->
+	<Modal v-model="checkRefuseReasonModel" title="查看备注" style="text-align:center;height:50%" width="35%" @on-ok="checkRefuseReasonModel=false">
+	  <Form ref="checkRefuseReasonRef" :model="usersDetail" align="left">
+	    <FormItem label="备注文字:" prop="remarks">
+	      <span>{{usersDetail.remarks || '无'}}</span>
+	    </FormItem>
+      <FormItem label="备注图片:" >
+        <span v-if="imageList.length != 0">
+          <span v-for="(item,index) in imageList" :key="index" style="margin:5px">
+            <img :src="item"  alt="" style="height:146px"  />
+          </span>
+        </span>
+        <span v-else>无</span>
+      </FormItem>
+	  </Form>
+	</Modal>
+	
+	<!-- 添加拒绝原因 -->
+	<Modal v-model="refuseReasonModel" title="审核" style="text-align:center;height:50%" width="35%" @on-ok="refuseReasonModel=false" footer-hide="false">
+	  <Form ref="putRefuseReasonRef" :model="itemChange" :label-width="100" align="left">
+	    <FormItem label="备注文字:" prop="remarks">
+	      <Input v-model="itemChange.remarks" placeholder="填写输入备注文字" type="textarea" style="width: 260px" :rows="3"></Input>
+	    </FormItem>
+      <FormItem label="备注图片:" prop="image">
+        <el-upload
+          class="avatar-uploader"
+          :action="uploadUrl"
+          :headers="{'X-AIYANGNIU-SIGNATURE':token}"
+          list-type="picture-card"
+          :on-preview="handlePictureCardPreview1"
+          :before-upload="beforeUpload"
+          :on-success="handleAvatarSuccess"
+          :file-list="avatarfileList"
+          :limit="5"
+          :on-remove="handleRemove1">
+          <el-icon><Plus /></el-icon>
+        </el-upload>
+      </FormItem>
+    </Form>
+    <div v-show="itemChange.isAdmin == 0" align="left"><span style="color: red;">注意:当前账号为管理员身份,若此账号所在组织下仅剩最后一位管理员,则注销账号会一并将组织注销,请谨慎操作。目前此组织下有{{itemChange.adminTotal || 0}}名管理员,{{itemChange.noAdminTotal || 0}}名非管理员。</span></div>
+    <div v-show="itemChange.isAdmin == 1" align="left"><span style="color: red;">注意:点击确定按钮,账户将被注销,请谨慎操作。</span></div>
+    <div slot="footer" style="text-align:center;">
+      <Button type="submit" @click="doModifyApply(itemChange)">拒绝</Button>
+      <Button type="primary" @click="passIn(itemChange)" >通过</Button>
+    </div>
+	</Modal>
+	
+    <el-dialog :visible.sync="dialogVisible" size="tiny">
+      <img width="100%" :src="dialogImageUrl" alt="">
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { defineComponent, onMounted, ref ,reactive,getCurrentInstance} from 'vue'
+import {manager} from '@/request/api'
+import { Message,Modal } from 'view-ui-plus'
+import moment from 'moment'
+import { reviewStatus } from '@/utils/system/filters'
+import { useRoute } from 'vue-router'
+import api from "@/request/apiConfig";
+
+export default defineComponent({
+  components:{
+    
+  },
+  setup() {
+    let {proxy} = getCurrentInstance();
+    const token = localStorage.aynUserToken
+
+    const route = useRoute()
+    let dataloading = ref(false) //是否在加载中
+    let dialogVisible = ref(false)
+    let dialogImageUrl = ref('')
+    let promoteUserList = ref([])
+    let avatarfileList = ref([])
+    let imageList = ref([])
+    let uploadUrl = api.apiManager + '/manager/images/upload'
+    let totalNum = ref(0)
+    let refuseReasonModel = ref(false)
+    let checkRefuseReasonModel = ref(false)
+    let searchFilter = reactive({
+      reviewStatus:'',
+      userName:'',
+      startDate: '',      //订单开始日期(yyyy-MM-dd)
+      endDate: '',        //订单结束日期(yyyy-MM-dd)
+      offset: 0,
+      limit: 10,
+      current:1,
+    })
+    let itemChange = ref({
+      id:'',
+      orgId:'',
+      isAdmin:'',
+      noAdminTotal: 0,
+      adminTotal: 0,
+      remarks: '',
+      image:''
+    })
+    let usersDetail = ref({})
+    let imgDefault = require('../../../assets/images/default.png')
+
+
+    // 格式化日期
+    function formatData(date) {
+      return moment(date).format("YYYY-MM-DD hh:mm:ss");
+    }
+
+	  function handlePictureCardPreview(file) {
+		  dialogImageUrl.value = file;
+		  dialogVisible.value = true;
+		}
+		function handlePictureCardPreview1(file) {
+		  dialogImageUrl.value = file.url;
+		  dialogVisible.value = true;
+		}
+
+		//限制上传的图片是jpg并且小于2M大小的图片
+		function beforeUpload(file) {
+		  const isJPEG = file.type === 'image/jpeg';
+		  const isJPG = file.type === 'image/jpg';
+		  const isPNG = file.type === 'image/png';
+		  const isPDF = file.type === 'image/pdf';
+		  const isLt50M = file.size / 1024 / 1024 < 50;
+		  if (!isJPG && !isJPEG && !isPNG && !isPDF) {
+		    Message.error('上传图片只能是 JPG,JPEG,PNG,PDF 格式!');
+		    return false
+		  }
+		  if (!isLt50M) {
+		    Message.error("上传图片大小不能超过 50MB!");
+		  }
+		  return (isPNG || isJPG || isJPEG) && isLt50M;
+		  // return isLt50M;
+		}
+
+		//判断是否上传成功
+	  function handleAvatarSuccess(res, file) {
+		  if (res.code == "101") {
+		    let obj={
+		      url:file.raw.type.indexOf('image') != -1?res.data:"",
+		      type:file.raw.type,
+		      fileName:file.raw.name,
+		      downloadUrl:res.data
+		    }
+		    avatarfileList.value.push(obj)
+		    let arr = []
+		    avatarfileList.value.forEach(item=>{
+		      arr.push(item.url)
+		    })
+		    itemChange.value.image = arr.join('@_@')
+		    Message.success(res.message);
+		  } else {
+		    Message.error("图片上传失败");
+		  }
+		}
+
+		function handleRemove1(file, fileList) {
+		  avatarfileList.value.forEach((item,index) => {
+		    if(item.url == file.url){	
+			    let arr = []
+		      avatarfileList.value.splice(index,1)
+          avatarfileList.value.forEach(item=>{
+            arr.push(item.url)
+          })
+          itemChange.value.image = arr.join('@_@')
+		    }
+		  });
+		}
+
+		async function passIn(item){
+      Modal.confirm({
+        title:'提示',
+        content:'确认通过审核?',
+        onOk:async()=>{
+        console.log(item.id)
+          await manager.userCancelReview({
+            userCancelId:item.id,reviewStatus:1, image:item.image, orgId:item.orgId, isAdmin:item.isAdmin, remarks:item.remarks
+          }).then(res => {
+            if (res.code == '101') {
+              Message({
+                type: 'success',
+                message: '操作成功'
+              })
+              initData()
+              refuseReasonModel.value=false
+            } else {
+              Message.error(res.message || "操作失败")
+              refuseReasonModel.value=false
+            }
+          })
+        }
+      })
+		}
+
+		async function doModifyApply(item){
+      await manager.userCancelReview({
+			  userCancelId:item.id,reviewStatus:2, image:item.image, orgId:item.orgId, isAdmin:item.isAdmin, remarks:item.remarks,
+			}).then(res => {
+				if(res.code == 101){
+				  Message({
+				    type: 'success',
+				    message: '操作成功'
+				  })
+				  initData()
+				  refuseReasonModel.value=false
+				}else{
+				  Message({
+				    type: 'error',
+				    message: '操作失败'
+				  })
+				  refuseReasonModel.value=false
+				}
+			})
+    }
+
+    async function userCancelMatter(id){
+      await manager.userCancelMatter({
+        orgId:id
+      }).then(res => {
+        if(res.code == 101){
+          itemChange.value.adminTotal = res.data.adminTotal
+          itemChange.value.noAdminTotal = res.data.noAdminTotal
+        }else{
+          Message({
+            type: 'error',
+            message: '操作失败'
+          })
+        } 				
+      })
+	  }
+
+		async function initData() {
+      if(route.params.searchFilter && undefined!= route.params.searchFilter){
+        searchFilter = route.params.searchFilter
+        route.params.searchFilter=null
+      }
+      dataloading.value = true
+      await manager.userCancelPage({
+        ...searchFilter
+      }).then(res => {
+        if (res.code == '101') {
+          promoteUserList.value = res.data || []
+          totalNum.value = res.total || 0
+        } else {
+          Message.error(res.message || "获取平台用户信息出错")
+        }
+      })
+      dataloading.value = false
+    }
+
+    //更改页码
+    function changePage(page) {
+      searchFilter.offset = (page - 1) * searchFilter.limit
+      searchFilter.current =  page
+      initData()
+    }
+    //更改开始时间
+    function changeStartTime(time){
+      searchFilter.startDate = time
+      initData()
+    }
+
+    //更改截止时间
+    function changeEndTime(time){
+      searchFilter.endDate = time
+      initData()
+    }
+    /*=====搜索=====*/
+    function searchItem() {
+      initData()
+    }
+    function checkRefuseReason(item) {
+      imageList.value = []
+      usersDetail.value = item
+      if(usersDetail.value.image){
+        imageList.value = usersDetail.value.image.split('@_@')
+      }
+      checkRefuseReasonModel.value = true
+    }
+
+    function putRefuseReason(item){
+      console.log(item,'item123')
+      avatarfileList.value = []
+      itemChange.value.id = item.id
+      itemChange.value.orgId = item.orgId
+      itemChange.value.isAdmin = item.isAdmin
+      itemChange.value.remarks = ""
+      itemChange.value.image = ""
+      userCancelMatter(item.orgId)
+      console.log(itemChange.value)
+      refuseReasonModel.value = true
+    }
+
+    onMounted(()=>{
+      initData()
+    })
+
+    return {
+      reviewStatus,token,dataloading,dialogVisible,dialogImageUrl,promoteUserList,avatarfileList,imageList,uploadUrl,totalNum,refuseReasonModel,checkRefuseReasonModel,searchFilter,itemChange,usersDetail,imgDefault,putRefuseReason,
+      formatData,handlePictureCardPreview,handlePictureCardPreview1,beforeUpload,handleAvatarSuccess,handleRemove1,passIn,doModifyApply,userCancelMatter,initData,changePage,changeStartTime,changeEndTime,searchItem,checkRefuseReason,
+    }
+  },
+})
+</script>
+
+<style lang="scss" scoped>
+.logoffManage{
+  padding: 1em;
+  .avatar-uploader .el-upload {
+	  border: 1px dashed #d9d9d9;
+	  border-radius: 6px;
+	  cursor: pointer;
+	  position: relative;
+	  overflow: hidden;
+	}
+	.avatar-uploader .el-upload:hover {
+	  border-color: #409EFF;
+	}
+	.avatar-uploader-icon {
+	  font-size: 20px;
+	  color: #8c939d;
+	  width: 50px;
+	  height: 50px;
+	  line-height: 100px;
+	  text-align: center;
+	}
+	.avatar {
+	  width: 50px;
+	  height: 50px;
+	  display: block;
+	}
+	.imgStyle {
+	  width: 100px;
+	  height: 100px;
+	  img {
+	    width: 100%;
+	    height: 100%;
+	 }
+  }
+}
+</style>

+ 163 - 0
src/views/manager/orderManager/afterChange.vue

@@ -0,0 +1,163 @@
+/**
+ * 模板名称  订单改价组件
+ */
+
+<template lang="html">
+  <div class="changePrice">
+    <div class="innerbox">
+      <Form :model="origin" label-position="left" :label-width="200" class="originForm">
+        <h3>原价</h3>
+          <FormItem label="单价(元):">
+              <span>{{extendmsg.oldPrice}}</span>
+          </FormItem>
+          <FormItem label="数量:">
+              <span>{{extendmsg.oldCount}}</span>
+          </FormItem>
+          <FormItem label="运费(元):">
+              <span>{{extendmsg.oldFreight}}</span>
+          </FormItem>
+          <FormItem label="账期成本(元)(供应商承担):" v-if='extendmsg.feePayer == 0'>
+              <span>{{extendmsg.oldAccountPeriodCost?extendmsg.oldAccountPeriodCost:0}}</span>
+          </FormItem>
+          <FormItem label="账期成本(元)(牧场承担):" v-if='extendmsg.feePayer == 1'>
+              <span>{{extendmsg.oldAccountPeriodCost?extendmsg.oldAccountPeriodCost:0}}</span>
+          </FormItem>
+          <FormItem label="账期成本(元):" v-if='extendmsg.feePayer == 2'>
+              <span>{{extendmsg.oldAccountPeriodCost?extendmsg.oldAccountPeriodCost:0}}</span>
+          </FormItem>
+          <FormItem label="利息(元1):" v-if='extendmsg.oldInstalRate'>
+              <span>{{extendmsg.oldInstalRate}}</span>
+          </FormItem>
+          <FormItem label="总计(元):">
+              <span>{{extendmsg.oldTotalPrice}}</span>
+          </FormItem>
+      </Form>
+      <Form :model="change" label-position="left" :label-width="200" class="changeForm">
+          <h3>申请改价</h3>
+          <FormItem label="单价(元):">
+              <span>{{extendmsg.price}}</span>
+          </FormItem>
+          <FormItem label="数量:">
+              <span >{{extendmsg.count}}</span>
+          </FormItem>
+          <FormItem label="运费(元):">
+              <span >{{extendmsg.freight}}</span>
+          </FormItem>
+          <FormItem label="账期成本(元)(供应商承担):" v-if='extendmsg.feePayer == 0'>
+              <span>{{extendmsg.accountPeriodCost?extendmsg.accountPeriodCost:0}}</span>
+          </FormItem>
+          <FormItem label="账期成本(元)(牧场承担):" v-if='extendmsg.feePayer == 1'>
+              <span>{{extendmsg.accountPeriodCost?extendmsg.accountPeriodCost:0}}</span>
+          </FormItem>
+          <FormItem label="账期成本(元):" v-if='extendmsg.feePayer == 2'>
+              <span>{{extendmsg.accountPeriodCost?extendmsg.accountPeriodCost:0}}</span>
+          </FormItem>
+          <FormItem label="利息(元):" v-if='extendmsg.newInstalRate'>
+              <span>{{extendmsg.newInstalRate}}</span>
+          </FormItem>
+          <FormItem label="总计(元):">
+              <span >{{extendmsg.totalPrice}}</span>
+          </FormItem>
+      </Form>
+      <div class="bottomLine" style="margin-bottom:10px"></div>
+      <div style="width:90%;margin:auto">
+        <Input disabled  type="textarea" autosize v-model="extendmsg.updateComment" ></Input>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { defineComponent, onMounted, ref ,reactive,getCurrentInstance} from 'vue'
+
+export default defineComponent({
+  props: {
+    extendmsg:{
+      type:Object,
+      default:()=>{
+        return {}
+      }
+    },
+  },
+  setup() {
+    let {proxy} = getCurrentInstance();
+    const token = localStorage.aynUserToken
+
+    //原价
+    let origin = ref({
+        singlePrice: 3000, //单价
+        count: 1, //数量
+        fare: 120, //运费
+        payment: 0, //账期成本
+        sum: 3120 //总计
+      })
+
+      //改价后
+    let change = ref({
+        singlePrice: 0, //单价
+        count: 0, //数量
+        fare: 0, //运费
+        payment: 0, //账期成本
+        sum: 0 //总计
+      })
+
+    let applyReason = ref("") //申请原因
+
+
+    onMounted(()=>{
+    })
+
+    return {
+      origin,change,applyReason
+    }
+  },
+})
+</script>
+
+<style lang="scss" scoped>
+.changePrice {
+  height: auto;
+  padding: 5px 10px;
+  margin:auto;
+  font-size: 14px;
+  color: #657180;
+  font-weight: normal;
+  font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB",
+    "Microsoft YaHei", "微软雅黑", Arial, sans-serif;
+  .innerbox {
+    width: 100%;
+    height: 100%;
+    h4 {
+      width: 100%;
+      line-height: 30px;
+      border-bottom: 1px solid #ccc;
+      margin-bottom: 10px;
+    }
+    .originForm,
+    .changeForm {
+      width: 49%;
+    display: inline-block;
+     padding: 0px 30px;
+      h3 {
+        width: 100%;
+        line-height: 30px;
+        color: red;
+        text-align: center;
+        font-size: 14px;
+        font-weight: normal;
+      }
+    }
+    .originForm {
+      border-right: 1px solid #ccc;
+    }
+    .ivu-form-item {
+      margin-bottom: 0px !important;
+    }
+    .bottomLine {
+      width: 100%;
+      height: 0.5px;
+      background-color: #ccc;
+    }
+  }
+}
+</style>

+ 576 - 0
src/views/manager/orderManager/cargoLogisticsAudit.vue

@@ -0,0 +1,576 @@
+/**
+ * 模板名称:货物物流审核
+ * 作者:zhangyy
+ * 时间:2023-09-27
+ */
+
+ <template>
+  <div class="cargoLogisticsAudit">
+    <!-- 按订单号搜索 -->
+    <Row :gutter="10">
+      <Col span="6">
+        <Input placeholder="订单编号" v-model="searchFilter.orderNum"/>
+      </Col>
+      <Col span="16">
+        <Button type="primary" icon="ios-search" @click="searchOrder">订单搜索</Button>
+        <Button type="text" @click="moreFilter = !moreFilter">
+        更多筛选条件
+          <Icon type="chevron-down" v-show="moreFilter"/>
+          <Icon type="chevron-up" v-show="!moreFilter"/>
+        </Button>
+      </Col>
+    </Row>
+    <br />
+    <!-- 更多筛选条件 -->
+    <Form :label-width="80" :model="searchFilter" v-show="moreFilter">
+      <transition name="el-zoom-in-center">
+        <Row :gutter="10">
+          <!-- 按发货凭证审核状态 -->
+          <Col span="6">
+            <FormItem label="审核状态">
+              <Select placeholder="请选择" v-model="searchFilter.voucherStatus"
+              @on-change="getData">
+                  <Option value="">全部</Option>
+                  <Option value="1">待审核</Option>
+                  <Option value="2">已通过</Option>
+                  <Option value="3">已拒绝</Option>
+              </Select>
+            </FormItem>
+          </Col>
+          <!-- 按成交时间 -->
+          <Col span="12">
+            <FormItem label="成交时间">
+              <Row>
+                <Col span="11">
+                  <DatePicker type="date" placeholder="选择日期"
+                  format="yyyy-MM-dd"
+                  confirm
+                  v-model="searchFilter.startDate"
+                  @on-change="changeStartTime"/>
+                </Col>
+                <Col span="1" style="text-align: center">-</Col>
+                <Col span="11">
+                  <DatePicker type="date" placeholder="截止日期"
+                  format="yyyy-MM-dd"
+                  confirm 
+                  v-model="searchFilter.endDate"
+                  @on-change="changeEndTime"
+                  />
+                </Col>
+              </Row>
+            </FormItem>
+          </Col>
+        </Row>
+      </transition>
+    </Form>
+    <br />
+    <!-- 数据展示 -->
+    <el-table class="el-table" :data="orderList.data"  v-loading="tableLoading">
+      <el-table-column prop="orderNum" label="订单编号" width="200">
+        <template #default="scope">
+          <a href="javascript:void(0)"  @click="goOrderDetail(scope.row)">{{scope.row.orderNum}}</a>
+        </template>
+      </el-table-column>
+      <el-table-column label="买家账号" prop="userName"  width="120"/>
+      <el-table-column label="买家名称" width="120">
+        <template #default="scope">
+            <span>
+            {{scope.row.orderBuyer.nickName || '无'}}
+            </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="商品信息" width="200">
+        <template #default="scope">
+            <div v-show="scope.row.orderDetailList.length > 0">
+            <p v-for="list in scope.row.orderDetailList" :key="list.id">
+                <span>{{ list.name || '无名称'}}</span>
+                <span>{{ 'X' + list.count.toFixed(0)}}</span>
+                <br />
+            </p>
+            </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="店铺" prop="shopName"  width="100"/>
+      <el-table-column label="总金额" prop="totalMoney"  width="80"/>
+      <el-table-column label="下单时间" width="100">
+        <template #default="scope">
+            <span>
+            {{ formatData(scope.row.addTime) }}
+            </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="付款方式" width="85">
+        <template #default="scope">
+            <span>
+            {{payModel(scope.row.payModel)}}
+            </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="审核状态" width="110">
+        <template #default="scope">
+            <span>
+            {{voucherStatus(scope.row.orderVoucher.voucherStatus)}}
+            </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="管理员备注" width="90">
+        <template #default="scope">
+            <span>
+            {{scope.row.adminRemark || '无'}}
+            </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="商家备注" width="75">
+        <template #default="scope">
+            <span>
+            {{scope.row.shopRemark || '无'}}
+            </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" fixed="right" width="100">
+        <template #default="scope">
+            <!--按钮-->
+            <Button style="margin-top:5px" type="primary" v-if="scope.row.orderVoucher.voucherStatus == 1" size="small" @click="auditVoucher(scope.row)">查看申诉</Button>
+            <!-- <Button v-else size="small" @click="viewVoucher(scope.row)">查看凭证</Button> -->
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <div style="margin: 10px;overflow: hidden">
+        <div style="float: right;">
+          <Page show-elevator :total="parseInt(orderList.total)" :page-size="orderList.limit" :current="current" @on-change="changePage"></Page>
+        </div>
+    </div>
+    
+    <Modal v-model="confirmModel" title="审核凭证" width="750px" footer-hide="false">
+        <el-form :model="voucherInfo">
+            <el-form-item label="凭证类型:" label-width="100px">
+              <span>{{ voucherType(voucherInfo.voucherType) }}</span>
+            </el-form-item>
+            <el-form-item  style="margin-bottom:0px;">
+                <Row>
+                  <Col :span="24">
+                    <el-form-item label="发货照片:" label-width="100px">
+                        <div v-if="voucherInfo.deliverUrl">
+                          <Row>
+                            <Col :span="6" v-for="(item,index) in voucherInfo.deliverUrl" :key="index" style="margin-bottom:10px;">
+                              <img v-if="item.type.indexOf('image') != -1" :src="item.url" style="width:120px;height:120px;" @click="downloadFile(item.downloadUrl)">
+                              <div v-else @click="downloadFile(item.downloadUrl)" class="voucherImg">
+                                  <img src="../../../assets/images/file.png" alt="" style="width:30px;height:30px;margin-top:5px;">
+                                  <div style="color:#1c6ed5;font-size:10px;">{{item.fileName}}</div>
+                              </div>
+                            </Col>
+                          </Row>
+                        </div>
+                        <div v-else>无</div>
+                    </el-form-item>
+                  </Col>
+                </Row>
+              </el-form-item>
+              <el-form-item  style="margin-bottom:0px;">
+                <Row>
+                    <Col :span="24">
+                    <el-form-item label="发货磅单:" label-width="100px">
+                        <div v-if="voucherInfo.sendInvoiceUrl">
+                        <Row>
+                            <Col :span="6" v-for="(item,index) in voucherInfo.sendInvoiceUrl" :key="index" style="margin-bottom:10px;">
+                            <img v-if="item.type.indexOf('image') != -1" :src="item.url" style="width:120px;height:120px;" @click="downloadFile(item.downloadUrl)">
+                            <div v-else @click="downloadFile(item.downloadUrl)" class="voucherImg">
+                                <img src="../../../assets/images/file.png" alt="" style="width:30px;height:30px;margin-top:5px;">
+                                <div style="color:#1c6ed5;font-size:10px;">{{item.fileName}}</div>
+                            </div>
+                            </Col>
+                        </Row>
+                        </div>
+                        <div v-else>无</div>
+                    </el-form-item>
+                    </Col>
+                </Row>
+            </el-form-item>
+            <el-form-item style="margin-bottom:0px;">
+                <Row>
+                    <Col :span="24">
+                    <el-form-item label="收货照片:" label-width="100px">
+                        <div v-if="voucherInfo.receiveUrl">
+                        <Row>
+                            <Col :span="6" v-for="(item,index) in voucherInfo.receiveUrl" :key="index" style="margin-bottom:10px;">
+                            <img v-if="item.type.indexOf('image') != -1" :src="item.url" style="width:120px;height:120px;" @click="downloadFile(item.downloadUrl)">
+                            <div v-else @click="downloadFile(item.downloadUrl)" class="voucherImg">
+                                <img src="../../../assets/images/file.png" alt="" style="width:30px;height:30px;margin-top:5px;">
+                                <div style="color:#1c6ed5;font-size:10px;">{{item.fileName}}</div>
+                            </div>
+                            </Col>
+                        </Row>
+                        </div>
+                        <div v-else>无</div>
+                    </el-form-item>
+                    </Col>
+                </Row>
+              </el-form-item>
+              <el-form-item style="margin-bottom:0px;">
+                <Row>
+                    <Col :span="24">
+                    <el-form-item label="收货磅单:" label-width="100px">
+                        <div v-if="voucherInfo.poundUrl">
+                        <Row>
+                            <Col :span="6" v-for="(item,index) in voucherInfo.poundUrl" :key="index" style="margin-bottom:10px;">
+                            <img v-if="item.type.indexOf('image') != -1" :src="item.url" style="width:120px;height:120px;" @click="downloadFile(item.downloadUrl)">
+                            <div v-else @click="downloadFile(item.downloadUrl)" class="voucherImg">
+                                <img src="../../../assets/images/file.png" alt="" style="width:30px;height:30px;margin-top:5px;">
+                                <div style="color:#1c6ed5;font-size:10px;">{{item.fileName}}</div>
+                            </div>
+                            </Col>
+                        </Row>
+                        </div>
+                        <div v-else>无</div>
+                    </el-form-item>
+                    </Col>
+                </Row>
+            </el-form-item>
+            <el-form-item label="申诉说明:" label-width="100px">
+                <el-input type="textarea" v-model="voucherInfo.appealInfo" disabled></el-input>
+            </el-form-item>
+            <el-form-item label="改价申请:" label-width="100px">
+                <Button type="primary" @click="lookPriceChange">查看</Button>
+            </el-form-item>
+            <!-- 审核意见 -->
+            <el-form-item v-if="voucherInfo.voucherStatus && voucherInfo.voucherStatus == '3'" label="拒绝原因:" label-width="120px">
+                <span>{{voucherInfo.reason}}</span>
+            </el-form-item>
+        </el-form>
+        <div slot="footer" style="text-align: right;">
+            <Button type="error" v-if="voucherInfo.voucherStatus == 1" :loading="modal_loading" @click="reject">拒绝</Button>&nbsp;
+            <Button type="success" v-if="voucherInfo.voucherStatus == 1" :loading="modal_loading" @click="doConfirmRecive">同意</Button>&nbsp;
+            <Button type="primary" v-else @click="confirmModel = false">关闭</Button>
+        </div>
+    </Modal>
+    <!-- 改价弹框 -->
+    <Modal v-model="checkPrice" title="查看改价历史" width='45%' footer-hide="false">
+        <afterChange :extendmsg="msg"></afterChange>
+    </Modal>
+  </div>
+</template>
+
+<script>
+import { defineComponent, onMounted, ref ,reactive,getCurrentInstance} from 'vue'
+import {order} from '@/request/api'
+import { Message,Modal } from 'view-ui-plus'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import afterChange from "./afterChange"; //审核改价申请组件
+import moment from 'moment'
+import { voucherStatus,payModel,voucherType} from '@/utils/system/filters'
+import { useRouter } from 'vue-router'
+
+export default defineComponent({
+  components:{
+    afterChange
+  },
+  setup() {
+    let {proxy} = getCurrentInstance();
+    const token = localStorage.aynUserToken
+
+    const router = useRouter()
+    let orderList = ref({})      //订单数据
+    let tableLoading = ref(false)     //是否在加载中
+    let current = ref(1)       //当前页码
+    let searchFilter =reactive({
+        orderStatus: '',    //订单状态
+        payStatus: '',      //支付状态
+        orderNum:'',        //订单编号
+        commentStatus: '',  //评价状态
+        startDate: '',      //订单开始日期(yyyy-MM-dd)
+        endDate: '',        //订单结束日期(yyyy-MM-dd)
+        offset: 0,
+        limit:10,
+        // voucherType:'8',       //发货凭证类型
+        voucherStatus:'',        //发货凭证审核状态
+    })
+    let moreFilter =ref(true)    //是否显示更多筛选条件
+    let confirmModel =ref(false)     //审核凭证弹框
+    let voucherInfo = ref({           //凭证信息
+        voucherType: '',
+        sendUrl:'',
+        receiveUrl:'',
+        fileUrl:'',
+    })
+    let modal_loading =ref(false)      //弹框关闭加载
+    let orderNum = ref('')
+    let checkPrice = ref(false) //改价弹框
+    let msg = ref({}) //接收订单的详细信息
+    let orderDetail = ref({})
+
+    //获取订单数据
+    async function getData(){
+      tableLoading.value = true;
+      await order.managerVoucherList({
+        ...searchFilter
+      }).then(res =>{
+      if (res.code==101) {
+        orderList.value = res||{}
+      }else{
+        Message.error(res.message)
+      }
+      })
+      tableLoading.value = false;
+    }
+    
+    //更改页码
+    function changePage (page) {
+      let orderlist = orderList.value
+      if(orderlist.limit){
+        searchFilter.offset = (page -1) *  orderlist.limit  //更新偏移量
+        current.value = page  //切换当前页码
+        getData()       //获取订单数据
+      }
+    }
+
+    // 格式化日期
+    function formatData(date) {
+      return moment(date).format("YYYY-MM-DD");
+    }
+
+    //更改开始时间
+    function changeStartTime(time){
+      searchFilter.startDate = time
+      getData()
+    }
+    //更改截止时间
+    function changeEndTime(time){
+      searchFilter.endDate = time
+      getData()
+    }
+    /*=====搜索订单功能=====*/
+    function searchOrder(){
+      getData()
+    }
+    //查看凭证
+    function viewVoucher(item){
+      let abc = {}
+      abc = item.orderVoucher
+      voucherInfo.value = abc
+      voucherInfo.value.deliverUrl = JSON.parse(abc.deliverUrl);
+      voucherInfo.value.poundUrl = JSON.parse(abc.poundUrl);
+      voucherInfo.value.receiveUrl = JSON.parse(abc.receiveUrl);
+      voucherInfo.value.sendInvoiceUrl = JSON.parse(abc.sendInvoiceUrl);
+      orderNum.value = item.orderNum
+      orderDetail.value = item
+      confirmModel.value = true
+    }
+    //下载申诉附件
+    function downloadFile(url){
+      window.open(url)
+    }
+    //审核凭证
+    function auditVoucher(row){
+      console.log(row.orderVoucher,'row')
+      let abc = {}
+      abc = Object.assign(abc,row.orderVoucher)
+      voucherInfo.value = abc
+      voucherInfo.value.deliverUrl = JSON.parse(abc.deliverUrl);
+      voucherInfo.value.poundUrl = JSON.parse(abc.poundUrl);
+      voucherInfo.value.receiveUrl = JSON.parse(abc.receiveUrl);
+      voucherInfo.value.sendInvoiceUrl = JSON.parse(abc.sendInvoiceUrl);
+      voucherInfo.value.voucherType = JSON.parse(abc.voucherType);
+      orderNum.value = row.orderNum
+      console.log(voucherInfo.value,'voucherInfo.value')
+      orderDetail.value = row
+      confirmModel.value = true
+    }
+    //通过审核
+    async function doConfirmRecive(){
+      voucherInfo.value.voucherStatus = '2'
+      let orderVoucher= voucherInfo.value
+      ElMessageBox.prompt('请输入同意理由', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        inputPattern:/\S/,
+        inputErrorMessage: '同意理由不能为空'
+      }).then(async ({ value }) => {
+        await  order.updateOrderDeliverVoucher({
+          orderNum:orderNum.value,
+          voucherStatus:'2',
+          id:voucherInfo.value.id,
+          reason:value
+        }).then(res=>{
+          if(res.code == 101){
+            ElMessage({
+                type: 'success',
+                message: res.message || '审核成功!'
+            })
+            confirmModel.value=false
+            getData()
+          }else{
+            ElMessage({
+                type: 'error',
+                message: res.message || '审核失败!'
+            });
+            confirmModel.value=false
+          }
+        })
+      }).catch(() => {
+        ElMessage({
+              type: 'info',
+              message: '取消输入'
+          });       
+      });
+    }
+    //拒绝通过审核
+    function reject(){
+      ElMessageBox.prompt('请输入拒绝理由', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        inputPattern:/\S/,
+        inputErrorMessage: '拒绝理由不能为空'
+      }).then(async ({ value }) => {
+        await order.updateOrderDeliverVoucher({
+          orderNum:orderNum.value,
+          voucherStatus:'3',
+          id:voucherInfo.value.id,
+          reason:value
+        }).then(res=>{
+            if(res.code == 101){
+              ElMessage({
+                type: 'success',
+                message: res.message || '审核成功!'
+              });
+              confirmModel.value=false
+              getData()
+            }else{
+              ElMessage({
+                type: 'error',
+                message: res.message || '审核失败!'
+              });
+              confirmModel.value=false
+            }
+        })
+      }).catch(() => {
+        ElMessage({
+          type: 'info',
+          message: '取消输入'
+        });       
+      });
+    }
+    //查看改价
+    async function lookPriceChange(){
+      checkPrice.value = true;
+      let res = await order.checkUpdatedPrice({
+        orderNum: orderNum.value
+      });
+      if (res.code == 101) {
+        msg.value = res.data;
+        let key = "feePayer";
+        let value = orderDetail.value.feePayer !=undefined ? orderDetail.value.feePayer : 2  //1为牧场承担,0为供应商承担,2为不是奶款结算下单时的值;
+        msg.value[key] = value;
+      } else {
+        Message.error(res.message);
+      }
+    }
+
+    // 订单详情
+    function goOrderDetail(row){
+      const href = router.resolve({ //使用resolve
+        path:'orderDetail',
+        query:{orderNum:row.orderNum,orgId:row.orgId}
+      })
+      window.open(href.href, '_blank')
+    }
+
+    onMounted(()=>{
+      getData()
+    })
+
+    return {
+      orderDetail,msg,checkPrice,orderNum,modal_loading,voucherInfo,confirmModel,moreFilter,searchFilter,current,tableLoading,orderList,voucherStatus,payModel,voucherType,
+      lookPriceChange,reject,doConfirmRecive,auditVoucher,downloadFile,viewVoucher,searchOrder,changeEndTime,changeStartTime,changePage,getData,goOrderDetail,formatData
+    }
+  },
+})
+</script>
+
+<style lang="scss" scoped>
+.cargoLogisticsAudit{
+  padding: 1em;
+  .el-table{
+      width: 100%;
+      font-size: 12px;
+  }
+  .ivu-modal-mask{
+      background-color: rgba(55, 55, 55, 0.1);
+  }
+  .track-rcol{
+      border: 1px solid #eee;
+  }
+  .deliverNum{
+      color: red;
+      text-align: center;
+      padding-top: 20px;
+  }
+  .track-list{
+      margin: 20px;
+      padding-left: 5px;
+      position: relative;
+  }
+  .track-list li{
+      position: relative;
+      padding: 9px 0 0 25px;
+      line-height: 18px;
+      border-left: 1px solid #d9d9d9;
+      color: #999;
+  }
+  .track-list li.first{
+      color: red;
+      padding-top: 0;
+      border-left-color: #fff;
+  }
+  .track-list li .node-icon{
+      position: absolute;
+      left: -6px;
+      top: 50%;
+      width: 11px;
+      height: 11px;
+      background: url(../../../assets/images/order-icons.png)  -21px -72px no-repeat;
+  }
+  .track-list li.first .node-icon{
+      background-position:0 -72px;
+  }
+  .track-list li .time{
+      margin-right: 20px;
+      position: relative;
+      top: 4px;
+      display: inline-block;
+      vertical-align: middle;
+  }
+  .track-list li .txt{
+      max-width: 600px;
+      position: relative;
+      top: 4px;
+      display: inline-block;
+      vertical-align: middle;
+  }
+  .track-list li.first .time{
+      margin-right: 20px;
+  }
+  .track-list li.first .txt{
+      max-width: 600px;
+  }
+  .avatar {
+      width: 178px;
+      height: 178px;
+      display: block;
+  }
+  .avatar-uploader-icon {
+      font-size: 28px;
+      color: #8c939d;
+      width: 178px;
+      height: 178px;
+      line-height: 178px;
+      text-align: center;
+  }
+  .el-icon-picture-outline {
+      border: 1px dashed #d9d9d9 !important;
+  }
+  .voucherImg{
+      width:120px;height:120px;border:1px solid #eee;text-align: center;cursor: pointer;
+  }
+}
+</style>

+ 493 - 0
src/views/manager/orderManager/orderAdminList.vue

@@ -0,0 +1,493 @@
+/**
+ * 模板名称:订单列表(管理员)
+ * 作者:zhangyy
+ * 时间:2023-09-27
+ */
+
+<template>
+  <div class="orderAdminList">
+   <!-- 更多筛选条件 -->
+   <Form :label-width="80" :model="searchFilter">
+      <transition name="el-zoom-in-center">
+        <Row :gutter="10">
+          <Col span="6">
+             <FormItem label="订单编号">
+              <Input placeholder="请输入" v-model="searchFilter.orderNum" clearable/>
+            </FormItem>
+          </Col>
+            <!-- 按订单状态 -->
+           <Col span="6">
+             <FormItem label="订单状态">
+                <Select placeholder="请选择" v-model="searchFilter.orderStatus" clearable
+                @on-change="getData">
+                  <Option value="">全部</Option>
+                  <Option value="WAIT_SENDING">待发货</Option>
+                  <Option value="WAIT_RECEIVING">待收货</Option>
+                  <Option value="RECEIVED">已收货</Option>
+                  <Option value="CANCEL">已取消</Option>
+                  <Option value="FINISH">已完成</Option>
+                </Select>
+            </FormItem>
+           </Col>
+           <Col span="8">
+             <FormItem label="成交时间">
+                <Row>
+                  <Col span="11">
+                    <DatePicker type="date" placeholder="选择日期"
+                    format="yyyy-MM-dd"
+                    confirm
+                    v-model="searchFilter.startDate"
+                    @on-change="changeStartTime"/>
+                  </Col>
+                  <Col span="1" style="text-align: center">-</Col>
+                  <Col span="11">
+                    <DatePicker type="date" placeholder="截止日期"
+                    format="yyyy-MM-dd"
+                    confirm 
+                    v-model="searchFilter.endDate"
+                    @on-change="changeEndTime"
+                    />
+                  </Col>
+                </Row>
+            </FormItem>
+           </Col>
+           <Col span="6">
+             <FormItem label="商品分类">
+                <Select v-model="searchFilter.classifyOne" placeholder="商品分类"  clearable>
+                  <Option v-for="item in filterProList" :label="item.label" :value="item.id" :key="item.value">{{item.label}}</Option>
+                </Select>
+            </FormItem>
+          </Col>
+          <Col span="6">
+             <FormItem label="店铺名称">
+              <Input placeholder="请输入" v-model="searchFilter.shopName" clearable/>
+            </FormItem>
+          </Col>
+          <Col span="6">
+             <FormItem label="牧场名称">
+              <Input placeholder="请输入" v-model="searchFilter.orgName" clearable/>
+            </FormItem>
+          </Col>
+          <Col span="6">
+             <Button type="primary" icon="ios-search" @click="searchOrder">订单搜索</Button>
+          </Col>
+        </Row>
+      </transition>
+    </Form>
+    <br/>
+    <!-- 数据展示 -->
+    <el-table class="el-table" :data="orderList.data"  v-loading="tableLoading">
+      <el-table-column prop="orderNum" label="订单编号" width="200">
+      	<template #default="scope">
+      		<a href="javascript:void(0)" @click="goOrderDetail(scope.row)">{{scope.row.orderNum}}</a>
+      	</template>
+	    </el-table-column>
+      <el-table-column label="买家账号" prop="userName"  width="120"/>
+      <el-table-column label="买家名称" width="120">
+        <template #default="scope">
+          <span>
+            {{scope.row.orderBuyer?scope.row.orderBuyer.nickName || '无' :'无'}}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="牧场名称" width="120">
+        <template #default="scope">
+          <span>
+            {{ scope.row.orderBuyer?scope.row.orderBuyer.orgName || '无' :'无' }}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="商品信息" width="200">
+        <template #default="scope">
+          <div v-show="scope.row.orderDetailList.length > 0">
+            <p v-for="(list,index) in scope.row.orderDetailList" :key="index" >
+                <span>{{ list.name || '无名称'}}</span>
+                <span>{{ 'X' + list.count.toFixed(0)}}</span>
+              <br/>
+            </p>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="店铺" prop="shopName"  width="100"/>
+      <el-table-column label="总金额" prop="totalMoney"  width="80"/>
+      <el-table-column label="下单时间" width="100">
+        <template #default="scope">
+          <span>
+            {{formatData(scope.row.addTime)}}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="付款方式" width="85">
+        <template #default="scope">
+          <span>
+            {{payModel(scope.row.payModel) }}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="订单状态" width="85">
+        <template #default="scope">
+          <span>
+            {{orderStatus(scope.row.orderStatus)}}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="管理员备注" width="75">
+        <template #default="scope">
+          <span>
+            {{scope.row.adminRemark || '无'}}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="商家备注" width="75">
+        <template #default="scope">
+          <span>
+            {{scope.row.shopRemark || '无'}}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" fixed="right" width="100">
+        <template #default="scope">
+          <!--按钮-->
+            <Button size="small" @click="putRemark(scope.row)">填写备注</Button>
+            <!-- <Button style="margin-top:5px" type="primary" v-if="scope.row.orderStatus == 3" size="small" @click="confirmRecive(scope.row)">确认收货</Button> -->
+            <!-- <Button v-if="funOffline(scope.row)" type="success" size="small"  @click="confirmOffline(scope.row.orderNum)">确认线下支付</Button> -->
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <div style="margin: 10px;overflow: hidden">
+        <div style="float: right;">
+            <Page show-elevator :total="parseInt(orderList.total)" :page-size="orderList.limit" :current="current" @on-change="changePage"></Page>
+        </div>
+    </div>
+    <!-- 填写备注 -->
+    <Modal v-model="remarkModel" title="填写备注" ok-text="提交" @on-ok="doModifyApply()">
+      <Form ref="itemChange" :model="itemChange" :label-width="80" >
+        <FormItem label="备注:" prop="remark">
+          <Input v-model="itemChange.remark" placeholder="填写备注"></Input>
+        </FormItem>
+      </Form>
+    </Modal>
+     <Modal v-model="confirmModel" title="填写备注" ok-text="确认" @on-ok="doConfirmRecive()">
+      <p style="width:100%;text-align:center;font-size:14px">确认收货此订单吗</p>
+      <p style="width:100%;text-align:center;font-size:14px">订单号:<b style="color:blur;font-size:15px">{{orderNumber}}</b></p>
+    </Modal>
+  </div>
+</template>
+
+<script>
+
+import { defineComponent, onMounted, ref ,reactive,getCurrentInstance, computed} from 'vue'
+import {manager,order,item} from '@/request/api'
+import { Message,Modal } from 'view-ui-plus'
+import { useRouter } from 'vue-router'
+import moment from 'moment'
+import { orderStatus,payModel,payType,payStatus,sendWayDisplayInt,afterSaleStatus} from '@/utils/system/filters'
+
+export default defineComponent({
+  components:{
+    
+  },
+  setup() {
+    const router = useRouter()
+
+    let orderList = ref({})                   //订单数据
+    let tableLoading = ref(false)   //是否在加载中
+    let remarkModel = ref(false)
+    let current = ref(1)      //当前页码
+    let searchFilter = reactive({
+      orderStatus: '',    //订单状态
+      payStatus: '',      //支付状态
+      orderNum:'',        //订单编号
+      commentStatus: '',  //评价状态
+      startDate: '',      //订单开始日期(yyyy-MM-dd)
+      endDate: '',        //订单结束日期(yyyy-MM-dd)
+      offset: 0,
+      limit:10,
+      classifyOne:'',
+      shopName:'',
+      orgName:''
+    })
+    let moreFilter = ref(true)     //是否显示更多筛选条件
+    let modalLoading = ref(true)
+    let confirmModel = ref(false)     //确认收货弹框
+    let itemChange = ref({
+      remark: '',
+      orderNum:''
+    })
+    let orderNumber = ref('')
+    let voucherInfo = ref({})
+    let VoucherModel = ref(false)     //查看凭证弹框
+    let InvoiceModel = ref(false) //查看账期发票弹框
+    let accountInvoice = ref({})
+    let accountList = ref([])
+    let filterProList = ref([])
+
+    const funOffline = computed(()=>{//判断是否展示确认线下支付按钮
+      return function (row) {
+        let flag=false
+        if(row.payModel==3 && row.orderStatus==4){
+          let receivedTime = new Date(row.orderTime.receivedTime)
+          let Y = receivedTime.getFullYear()
+          let M = (receivedTime.getMonth()+1 < 10 ? '0'+(receivedTime.getMonth()+1) : receivedTime.getMonth()+1)
+          let D = receivedTime.getDate() + ' '
+          //console.log("第一次"+Y+"-"+M+"-"+D)
+          let nextMonth=''
+          if(M>=12){
+            Y=parseInt(Y)+1
+            M='1'
+            D='01'
+            nextMonth=Y+"-"+M+"-"+D
+          }else{
+            M=parseInt(M)+1
+            D='01'
+            nextMonth=Y+"-"+M+"-"+D
+          }
+          let nextTimeLeast = new Date(nextMonth).getTime();
+          let currentTimeLeast = new Date().getTime();
+          if(currentTimeLeast<nextTimeLeast){
+              flag=true;
+          }
+        }
+        return flag;
+      };
+    })
+    
+    // 格式化日期
+    function formatData(date) {
+      return moment(date).format("YYYY-MM-DD");
+    }
+
+    //获取订单数据
+    async function getData(){
+      tableLoading.value = true;
+      await order.GetManagerOrderList({
+        ...searchFilter
+      }).then(res =>{
+        if (res.code==101) {
+          orderList.value = res||{}
+        }else{
+        	Message.error(res.message)
+        }
+      })
+	    tableLoading.value = false;
+    }
+
+    //更改页码
+    function changePage (page) {
+      let orderlist = orderList.value
+      if(orderlist.limit){
+        searchFilter.offset = (page -1) *  orderlist.limit  //更新偏移量
+        current.value = page  //切换当前页码
+        getData()       //获取订单数据
+      }
+    }
+
+    //更改开始时间
+    function changeStartTime(time){
+      searchFilter.startDate = time
+      getData()
+    }
+
+    //更改截止时间
+    function changeEndTime(time){
+      searchFilter.endDate = time
+      getData()
+    }
+
+    /*=====搜索订单功能=====*/
+    function searchOrder(){
+      getData()
+    }
+
+    function putRemark(item){
+    	itemChange.value.orderNum = item.orderNum
+    	itemChange.value.remark = item.adminRemark
+    	remarkModel.value = true
+    }
+
+    async function doModifyApply() {
+      if (!itemChange.value.remark) {
+        Message.error('未填写备注')
+        return false
+      }
+      let res = await order.SaveRemark({ adminRemark: itemChange.value.remark, orderNum: itemChange.value.orderNum })
+      if (res.code == 101) {
+      	Message.success('备注成功')
+      	getData()
+      	remarkModel.value=false
+      } else {
+        Message.error('备注失败')
+      	remarkModel.value=false
+      }
+    }
+
+    //强制确认收货
+    function confirmRecive(row){
+      orderNumber.value=row.orderNum
+      confirmModel.value=true
+    }
+  
+    //确认收货弹框中的确认按钮
+    async function doConfirmRecive(){
+      let res = await order.confirmReceived({
+        orderNum:orderNumber.value,
+        deviceType:'PC'
+      })
+      if(res.code == 101){
+          Message({
+            type: 'success',
+            message: '收货成功!'
+          })
+          getData()
+      }else{
+          Message({
+            type: 'error',
+            message: res.message || '操作失败'
+          })
+      }
+    }
+
+    //确认线下支付
+    function confirmOffline(orderNum){
+      Modal.confirm({  //打开确认收货弹出层
+        title: '提示',
+        content: '<p>要确认已线下支付吗</p>',
+        onOk:async () => {
+          await order.confirmOfflinePay({orderNum}).then((res) =>{
+            if(res.code == '101'){
+              Message.success('确认线下支付成功')
+              getData() //刷新页面
+            }else{
+              Message.error(res.message)
+            }
+          }).catch((err) => {
+            Message.error(err)
+          })
+        }
+      })
+    }
+
+    //查询商品一级分类
+    async function GetOneClassifysList(){
+      let res = await item.GetClassifysList({
+        parentId:0
+      })
+      res.data.forEach((item)=>{
+        filterProList.value.push({
+          value:item.name,
+          label:item.name,
+          id:item.id
+        })
+      })
+    }
+
+    // 订单详情
+    function goOrderDetail(row){
+      const href = router.resolve({ //使用resolve
+        path:'orderDetail',
+        query:{orderNum:row.orderNum,orgId:row.orgId}
+      })
+      window.open(href.href, '_blank')
+    }
+
+    onMounted(()=>{
+      getData() //获取订单数据
+      GetOneClassifysList()
+    })
+
+    return {
+      orderList,tableLoading,remarkModel,current,searchFilter,moreFilter,modalLoading,confirmModel,itemChange,orderNumber,voucherInfo,VoucherModel,InvoiceModel,accountInvoice,accountList,filterProList,payModel,orderStatus,funOffline,
+      GetOneClassifysList,confirmOffline,doConfirmRecive,confirmRecive,doModifyApply,putRemark,searchOrder,changeEndTime,changeStartTime,changePage,getData,goOrderDetail,formatData
+    }
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+.orderAdminList{
+  padding: 1em;
+  background-color: #fff;
+  .el-table{
+    width: 100%;
+    font-size: 12px;
+  }
+  .ivu-modal-mask{
+    background-color: rgba(55, 55, 55, 0.1);
+  }
+  .track-rcol{
+   border: 1px solid #eee;
+ }
+ .deliverNum{
+    color: red;
+    text-align: center;
+    padding-top: 20px;
+ }
+  .track-list{
+    margin: 20px;
+   padding-left: 5px;
+   position: relative;
+ }
+  .track-list li{
+    position: relative;
+   padding: 9px 0 0 25px;
+   line-height: 18px;
+   border-left: 1px solid #d9d9d9;
+   color: #999;
+ }
+  .track-list li.first{
+    color: red;
+   padding-top: 0;
+   border-left-color: #fff;
+ }
+  .track-list li .node-icon{
+    position: absolute;
+   left: -6px;
+   top: 50%;
+   width: 11px;
+   height: 11px;
+   background: url(../../../assets/images/order-icons.png)  -21px -72px no-repeat;
+ }
+  .track-list li.first .node-icon{
+    background-position:0 -72px;
+  }
+  .track-list li .time{
+    margin-right: 20px;
+   position: relative;
+   top: 4px;
+   display: inline-block;
+   vertical-align: middle;
+ }
+  .track-list li .txt{
+    max-width: 600px;
+   position: relative;
+   top: 4px;
+   display: inline-block;
+   vertical-align: middle;
+ }
+  .track-list li.first .time{
+    margin-right: 20px;
+   }
+  .track-list li.first .txt{
+    max-width: 600px;
+   }
+   .avatar {
+        width: 178px;
+        height: 178px;
+        display: block;
+    }
+    .avatarImg {
+        width: 178px;
+        height: 178px;
+        margin-right: 10px;
+    }
+    .avatar-uploader-icon {
+        font-size: 28px;
+        color: #8c939d;
+        width: 178px;
+        height: 178px;
+        line-height: 178px;
+        text-align: center;
+    }
+}
+</style>

+ 516 - 0
src/views/manager/orderManager/orderDetail.vue

@@ -0,0 +1,516 @@
+<template lang="html">
+  <div class="orderDetail">
+    <Card :bordered="false">
+      <template #title><b>订单详情</b></template>
+      <!-- 联系方式 -->
+      <Row class="contact">
+        <Col span="24" >
+          <h3>当前订单状态:{{orderStatus(orderDetail.orderStatus)}}</h3>
+          <h3>订单号:{{orderDetail.orderNum || '无'}}</h3>
+        </Col>
+      </Row>
+      <br>
+
+      <Row class="color info" :gutter="20">
+          <!-- 预售活动信息 -->
+          <Col span="5" v-if='(orderDetail.orderType == 3 || orderDetail.orderType == 4 || orderDetail.orderType == 5) && orderDetail.advanceOrder'>
+            <h4>预售活动信息</h4>
+            <ul>
+              <li>活动名称:{{orderDetail.advanceOrder.advanceSaleName}}</li>
+            </ul>
+          </Col>
+          <!-- 预售活动订金信息 -->
+          <Col span="5" v-if='orderDetail.orderType == 3 || orderDetail.orderType == 4 || orderDetail.orderType == 5'>
+            <h4>订金基本信息</h4>
+            <ul>
+              <li>支付类型:{{payModel(orderDetail.payModel)}}</li>
+              <li>支付方式:{{payType(orderDetail.payType)}}</li>
+              <li>支付状态:{{payStatus(orderDetail.payStatus)}}</li>
+              <li>
+                {{showDiscountInfo?'实付款':'总计'}}:
+                ¥{{orderDetail.totalMoney|| '0'}}
+              </li>
+                <li v-if="showDiscountInfo">
+                  使用{{discountInfo.customClassifyName}}券减:
+                {{toPercent(discountInfo.usedAmount) || '0'}}元
+              </li>
+            </ul>
+          </Col>
+          <!-- 预售活动尾款信息 -->
+          <Col span="5" v-if='(orderDetail.orderType == 3 || orderDetail.orderType == 4 || orderDetail.orderType == 5) && orderDetail.order && orderDetail.order.payModel != undefined'>
+            <h4>尾款基本信息</h4>
+            <ul>
+              <li>支付类型:{{payModel(orderDetail.payModel)}}</li>
+              <li v-if='orderDetail.payModel==5 && orderDetail.fincpayOrder.payName'>支付方式:{{orderDetail.fincpayOrder.payName}}</li>
+              <li v-if="orderDetail.payModel != 5  && orderDetail.payModel != 8">支付方式:{{payType(orderDetail.payType)}}</li>
+              <li v-if="orderDetail.payModel != 5 && orderDetail.payModel!=7 && orderDetail.payModel != 8">支付状态:{{payStatus(orderDetail.payStatus)}}</li>
+              <li v-if="orderDetail.payModel == 5 || orderDetail.payModel==7">融资期限:{{orderDetail.orderDetailList[0].fincpayDays+'天'}}</li>
+              <li>
+                {{showDiscountInfo?'实付款':'总计'}}:
+                ¥{{toPercent(orderDetail.order.totalMoney) || '0'}}
+              </li>
+            </ul>
+          </Col>
+          <!-- 拼团活动信息 -->
+          <Col span="5" v-if='orderDetail.orderType == 6 && orderDetail.collageOrder'>
+            <h4>拼团活动信息</h4>
+            <ul>
+              <li>活动名称:{{orderDetail.collageOrder.collageSaleName}}</li>
+            </ul>
+          </Col>
+          <!-- 订单基本信息 -->
+          <Col span="5" v-if='orderDetail.orderType != 3 && orderDetail.orderType != 4 && orderDetail.orderType != 5'>
+            <h4>订单基本信息</h4>
+            <ul>
+              <li>支付类型:{{payModel(orderDetail.payModel)}}</li>
+              <li>支付方式:{{payType(orderDetail.payType) }}</li>
+              <li>支付状态:{{payStatus(orderDetail.payStatus)}}</li>
+              <li>
+                {{showDiscountInfo?'实付款':'总计'}}:
+                ¥{{toPercent(orderDetail.totalMoney) || '0'}}
+              </li>
+                <li v-if="showDiscountInfo">
+                  使用{{discountInfo.customClassifyName}}券减:
+                {{toPercent(discountInfo.usedAmount)|| '0'}}元
+              </li>
+            </ul>
+          </Col>
+          <!-- 代扣分期 -->
+          <Col span="5" v-if="orderDetail.orderDetailList?orderDetail.orderDetailList[0].orderMnpInstal:false">
+              <h4>代扣分期信息</h4>
+              <ul>
+                  <li>总期数:{{orderDetail.orderDetailList[0].orderMnpInstal.periods}}</li>
+                  <li>总金额:¥{{toPercent(orderDetail.orderDetailList[0].orderMnpInstal.money)}}</li>
+                  <li>年利率:{{orderDetail.orderDetailList[0].orderMnpInstal.annualInterestRate}}%</li>
+                  <li>还款类型:{{orderDetail.orderDetailList[0].orderMnpInstal.repayType | repayTypeFormat}}</li>
+                  <li>是否全部还清:{{orderDetail.orderDetailList[0].orderMnpInstal.workState | workStateFormat}}</li>
+                  <li>首付款金额:¥{{toPercent(orderDetail.orderDetailList[0].orderMnpInstal.firstPay)}}</li>
+                  <li>首付款支付方式:{{orderDetail.orderDetailList[0].orderMnpInstal.payModel | payModelFormat}}</li>
+                  <li><Button type="info" @click="isStageDetailsDia = true">分期详情</Button></li>
+              </ul>
+              <Modal v-model="isStageDetailsDia" width="900">
+                  <p slot="header">
+                      <span>分期详情</span>
+                  </p>
+                  <el-table :data="orderDetail.orderDetailList[0].orderMnpInstal.orderMnpInstalDetails" style="width: 100%">
+                      <el-table-column :formatter="periodNumFormat" prop="periodNum" label="期号"></el-table-column>
+                      <el-table-column :formatter="moneyFormat" prop="money" label="总额(元)"></el-table-column>
+                      <el-table-column :formatter="repaymentMonthFormat" label="代扣月份"></el-table-column>
+                      <el-table-column :formatter="moneyFormat" prop="repayMoney" label="已还金额(元)"></el-table-column>
+                      <el-table-column :formatter="moneyFormat" prop="unpayMoney" label="未还金额(元)"></el-table-column>
+                      <el-table-column :formatter="payResultFormat" prop="payResult" label="是否还清"></el-table-column>
+                  </el-table>
+                  <div slot="footer">
+                      <Button type="primary" size="large" @click="isStageDetailsDia = false">确认</Button>
+                  </div>
+              </Modal>
+          </Col>
+          <Col span="5" v-if="orderDetail.mnpProxyMoney || orderDetail.mnpUnproxyMoney">
+            <h4>代扣基本信息</h4>
+                <ul>
+                  <li>已代扣金额:¥{{orderDetail.mnpProxyMoney}}</li>
+                  <li>剩余金额:¥{{orderDetail.mnpUnproxyMoney}}</li>
+                  <!-- 逾期转代扣订单显示信息 -->
+                  <li v-if="orderDetail.mnpAccountPeriodCost">代扣手续费:¥{{orderDetail.mnpAccountPeriodCost}}</li>
+                  <li v-if="orderDetail.mnpConvertMnpTime">确认代扣时间:
+                      {{formatData(orderDetail.mnpConvertMnpTime) }}
+                  </li>
+                </ul>
+          </Col>
+          <Col span="4" v-if="orderDetail.payModel == '1' || orderDetail.orderStatus == '7' || orderDetail.orderStatus == '8' || orderDetail.orderStatus == '9' || orderDetail.orderStatus =='10'">
+            <h4>账期信息</h4>
+            <ul>
+              <li><p>余款金额:¥{{orderDetail.unFinishMoney || '0'}}</p></li>
+              <li><p>账期期限:{{orderDetail.accountPeriod || '0'}}天</p></li>
+              <li>
+                <p v-if="orderDetail.periodStart">账期开始:{{formatData(orderDetail.periodStart)}}</p>
+                <p v-else>账期开始:无 </p>
+              </li>
+              <li>
+                <p v-if="orderDetail.periodEnd">账期结束:{{formatData(orderDetail.periodEnd)}}</p>
+                <p v-else>账期结束:无 </p>
+              </li>
+            </ul>
+          </Col>
+          <Col span="4">
+            <h4>订单时间信息</h4>
+                <ul>
+                  <li>创建时间:{{formatData(orderDetail.addTime)}}</li>
+                  <li v-if="orderDetail.orderTime && orderDetail.orderTime.payTime">付款时间:{{formatData(orderDetail.orderTime.payTime) || '暂无'}}</li>
+                  <li v-if="orderDetail.orderTime && orderDetail.orderTime.shipmenTime">发货时间:{{formatData(orderDetail.orderTime.shipmenTime) || '暂无'}}</li>
+                  <li v-if="orderDetail.orderTime && orderDetail.orderTime.receivedTime">收货时间:{{formatData(orderDetail.orderTime.receivedTime) || '暂无'}}</li>
+                  <li v-if="orderDetail.orderTime && orderDetail.orderTime.evaluteTime">评价时间:{{formatData(orderDetail.orderTime.evaluteTime) || '暂无'}}</li>
+                  <li v-if="orderDetail.orderStatus == 5">取消时间:{{formatData(orderDetail.updateTime) || '暂无'}}</li>
+                </ul>
+          </Col>
+          <Col span="4" v-if="orderDetail.discount">
+            <h4>营销活动信息</h4>
+            <ul>
+              <li v-if="orderDetail.discount.flashSalePrice">限时抢购价:¥{{toPercent(orderDetail.discount.flashSalePrice )}}</li>
+              <li v-if="orderDetail.discount.flashSaleCount">限时抢购数量:{{orderDetail.discount.flashSaleCount}}</li>
+              <li v-if="orderDetail.discount.originalPrice">商品原价:¥{{toPercent(orderDetail.discount.originalPrice )}}</li>
+              <li v-if="orderDetail.discount.originalCount">原价抢购数量:{{orderDetail.discount.originalCount}}</li>
+              <li v-if="orderDetail.discount.freight|| orderDetail.discount.freight ==0">实付运费:¥{{toPercent(orderDetail.discount.freight)}}</li>
+              <li v-if="orderDetail.discount.discountReduceMoney">店铺宝优惠金额:¥{{toPercent(orderDetail.discount.discountReduceMoney)}}</li>
+              <li v-if="orderDetail.discount.couponReduceMoney">优惠券优惠金额:¥{{toPercent(orderDetail.discount.couponReduceMoney)}}</li>
+            </ul>
+          </Col>
+      </Row>
+
+      <Row class="color info" :gutter="20">
+          <Col span="5" v-if="orderDetail.orderBuyer">
+          <h4>下单账号信息</h4>
+            <ul>
+              <li>用户名:{{orderDetail.orderBuyer.userName || ''}}</li>
+              <li>联系人:{{orderDetail.orderBuyer.nickName || ''}}</li>
+              <li>联系方式:{{orderDetail.orderBuyer.contactCell || ''}}</li>
+              <li>公司信息:{{orderDetail.orderBuyer.orgName || ''}}</li>
+            </ul>
+        </Col>
+
+        <!-- 联系人信息 -->
+        <Col span="4" v-if="orderDetail.orderAddress">
+          <h4>收货人信息</h4>
+          <ul>
+            <li>姓名:{{orderDetail.orderAddress.contacts || '无'}}</li>
+            <li>地址:{{address}}</li>
+            <li>电话:{{orderDetail.orderAddress.phone || '无'}}</li>
+          </ul>
+        </Col>
+        <!-- 发票信息 -->
+        <Col span="5" v-if="orderDetail.orderInvoice">
+          <h4>发票信息</h4>
+          <p>开票类型:{{orderDetail.orderInvoice.category?(orderDetail.orderInvoice.category==1?'普通发票':'专用发票'):'无'}}</p>
+          <ul>
+            <li>公司名称: {{orderDetail.orderInvoice.companyName || '无'}}</li>              
+            <li>开户银行:{{orderDetail.orderInvoice.bankName || '无'}}</li>
+            <li>纳税人识别号:{{orderDetail.orderInvoice.taxNum || '无'}}</li>
+            <li>银行账号:{{orderDetail.orderInvoice.bankNum || '无'}}</li>
+            <li>联系电话:{{orderDetail.orderInvoice.contactCell || '无'}}</li>
+            <li>公司地址:{{orderDetail.orderInvoice.companyAddress || '无'}}</li>
+          </ul>
+        </Col>
+        <Col span="8" v-if="modifyBtnStatus>1">
+          <h4>订单金额修改申请</h4>
+            <ul>
+              <li>修改内容:{{applyItemiChange.auditMessage}}</li>
+              <li>修改原因:{{applyItemiChange.auditRemark}}</li>
+              <li v-if="modifyBtnStatus==4 || modifyBtnStatus==7">拒绝原因:{{applyItemiChange.refuseReason}}</li>
+              <li v-if="modifyBtnStatus==2"><Button  size="small" disabled>待牧场确认</Button></li>
+              <li v-if="modifyBtnStatus==3"><Button  size="small" disabled>牧场确认订单修改申请</Button></li>
+              <li v-if="modifyBtnStatus==4"><Button  size="small" disabled>牧场已拒绝订单修改申请</Button></li>
+              <li v-if="modifyBtnStatus==5">
+                <Button type="info" size="small" @click="confirmModifyApply">同意</Button>
+                <Button type="error" size="small" @click="refuseModel=true">拒绝</Button>
+              </li>
+              <li v-if="modifyBtnStatus==6"><Button  size="small" disabled>已确认修改申请</Button></li>
+              <li v-if="modifyBtnStatus==7"><Button  size="small" disabled>已拒绝订单修改申请</Button></li>
+            </ul>
+        </Col>
+      </Row>
+      <!-- 商品信息 -->
+      <el-table :data="orderDetail.orderDetailList" style="width: 100%">
+          <el-table-column  label="商品名称" width="200">
+            <template #default="scope">
+              <span>
+                {{scope.row.name || '无名称'}}
+              </span> 
+            </template>
+          </el-table-column>
+          <el-table-column prop="version" label="规格" width="150"></el-table-column>
+          <el-table-column prop="unit" label="单位" align="center" width="90"></el-table-column>
+          <el-table-column prop="count" label="数量" ></el-table-column>
+          <el-table-column prop="itemPrice" label="单价" ></el-table-column>
+          <el-table-column label="单价(元)+积分" align="center" width="150" v-if='orderDetail.orderDetailList?orderDetail.orderDetailList[0].useScore != undefined:false'>
+          <template #default="scope">{{toPercent(scope.row.itemPrice)}} + {{scope.row.useScore}}</template>
+        </el-table-column>
+        <el-table-column prop="freight" label="运费" ></el-table-column>
+        <el-table-column label="账期成本(元)" align="center" width="100"  v-if='orderDetail.payModel ==1'>
+          <template #default="scope">
+            <span v-if='scope.row.cost'>{{toPercent(scope.row.cost || 0 )}}</span>
+            <span v-else>{{toPercent(orderDetail.accountPeriodCost || 0 )}}</span>
+          </template>
+        </el-table-column>
+        <!-- 奶款结算--供应商牧场承担手续费 -->
+        <el-table-column label="代扣服务费(元) (供应商承担)" align="center" width="120" v-if='orderDetail.payModel ==3 && orderDetail.feePayer == 0'>
+          <template #default="scope">
+            <span v-if='scope.row.cost'>{{toPercent(scope.row.cost || 0 )}}</span>
+            <span v-else>{{toPercent(orderDetail.accountPeriodCost || 0 )}}</span>
+          </template>
+        </el-table-column>
+        <!-- 奶款结算--牧场承担手续费 -->
+        <el-table-column label="代扣服务费(元) (牧场承担)" align="center" width="120" v-if='orderDetail.payModel ==3 && orderDetail.feePayer == 1'>
+          <template #default="scope">
+            <span v-if='scope.row.cost'>{{toPercent(scope.row.cost || 0 )}}</span>
+            <span v-else>{{toPercent(orderDetail.accountPeriodCost || 0 )}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="延期费用(元)" align="center" width="120" v-if='orderDetail.payModel ==3'>
+          <template #default="scope">
+            <span v-if='orderDetail.mnpDelayInterest'>{{toPercent(orderDetail.mnpDelayInterest || 0 )}}</span>
+            <span v-else>{{toPercent(0)}}</span>
+          </template>
+        </el-table-column>
+        <!-- 奶款结算--供应商承担手续费 -->
+        <el-table-column label="分期利息(元)" align="center" width="120" v-if='orderDetail.payModel ==3 &&orderDetail.orderDetailList[0].orderMnpInstal && orderDetail.feePayer ==0'>
+          <template #default="scope">{{toPercent(orderDetail.totalMoney - (scope.row.freight || 0) -(scope.row.count*scope.row.itemPrice))}}</template>
+        </el-table-column>
+        <!-- 奶款结算--牧场承担手续费 -->
+        <el-table-column label="分期利息(元)" align="center" width="120" v-if='orderDetail.payModel ==3 &&orderDetail.orderDetailList[0].orderMnpInstal && orderDetail.feePayer == 1'>
+          <template #default="scope">{{toPercent(orderDetail.totalMoney - (scope.row.freight || 0) -  (orderDetail.accountPeriodCost)-(scope.row.count*scope.row.itemPrice))}}</template>
+        </el-table-column>
+        <!-- 总价需要自己算,单价x价格,保留两位,4舍5入 -->
+        <el-table-column  label="总价" >
+          <template #default="scope">
+            <span>
+               {{toPercent(orderDetail.totalMoney) || '无'}}
+            </span>
+          </template>
+        </el-table-column>
+          <!-- 2018-09-03 配送方式 -->
+        <el-table-column  label="配送方式" width="90"  align="center">
+          <template #default="scope">
+            <span>{{sendWayDisplayInt(scope.row.priceKindSel)}}</span>
+          </template>
+        </el-table-column>
+        <!-- 2018-09-03 end -->
+
+        <el-table-column  label="状态"  align="center" >
+          <template #default="scope">
+            <span>{{afterSaleStatus(scope.row.status)}}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+    </Card>
+  </div>
+</template>
+
+<script>
+import { defineComponent, onMounted, ref ,reactive,nextTick,computed, onBeforeMount} from 'vue'
+import {order,market} from '@/request/api'
+import { Message,Modal } from 'view-ui-plus'
+import { mapGetters, mapActions, useStore} from 'vuex'
+import { useRouter,useRoute } from 'vue-router'
+import { ElLoading } from 'element-plus'
+import { toPercent,orderStatus,payModel,payType,payStatus,sendWayDisplayInt,afterSaleStatus} from '@/utils/system/filters'
+import moment from 'moment';
+
+export default defineComponent({
+  components:{
+    
+  },
+  setup() {
+    const router = useRouter()
+    const route = useRoute()
+    const store = useStore()
+    
+    const orderDetail = ref({})
+    const address = computed(()=> {                    //收货地址
+      let info = orderDetail.value.orderAddress
+      let address = ''
+      info.province && (address += info.province + ' ')
+      info.city && (address += info.city + ' ')
+      info.area && (address += info.area + ' ')
+      info.addressInfo && (address += info.addressInfo)
+      return address
+    })
+
+    let showDiscountInfo = ref(false)     //显示使用奖励额度抵扣券减金额
+    let modifyBtnStatus = ref(0)
+    let applyItemiChange = reactive({
+      auditMessage: "",
+      auditRemark: "",
+      id: ""
+    })
+    let discountInfo = ref([])            //奖励额度抵用信息
+
+    // 格式化日期
+    function formatData(date) {
+      return moment(date).format("YYYY-MM-DD hh:mm:ss");
+    }
+
+    //获取订单数据
+    async function getData() {
+      const loadingInstance = ElLoading.service({ fullscreen: true })
+      let orderNum = route.query.orderNum
+      let orgId = route.query.orgId
+      store.dispatch('order/getOrderDetail', {
+        orderNum: orderNum,
+        orgId: orgId
+      }).then((res) => {
+        if(store.state.order.orderDetail){
+          orderDetail.value = store.state.order.orderDetail
+          console.log(orderDetail.value,'orderDetail.value ')
+          loadingInstance.close()
+        }
+      })
+    }
+
+    async function getOrderMobity() {
+      let orderNum = route.query.orderNum;
+      let modifyInfo = await order.GetOrderModify({
+        orderNum: orderNum
+      });
+      if (modifyInfo.code == 101) {
+        if (
+          Object.prototype.toString.call(modifyInfo.data) == "[object Array]"
+        ) {
+          if (modifyInfo.data.length == 0) {
+            modifyBtnStatus.value = 1;
+          } else {
+            let data = modifyInfo.data[0];
+            if (data.auditStatus == 1) {
+              if (data.modifyType == 1) {
+                modifyBtnStatus.value = 5;
+              } else if (data.modifyType == 2) {
+                modifyBtnStatus.value = 2;
+              }
+            } else if (data.auditStatus == 2) {
+              if (data.modifyType == 1) {
+                modifyBtnStatus.value = 6;
+              } else if (data.modifyType == 2) {
+                modifyBtnStatus.value = 3;
+              }
+            } else if (data.auditStatus == 3) {
+              if (data.modifyType == 1) {
+                modifyBtnStatus.value = 7;
+              } else if (data.modifyType == 2) {
+                modifyBtnStatus.value = 4;
+              }
+              applyItemiChange.refuseReason = data.refuseReason;
+            }
+            applyItemiChange.auditMessage = data.auditMessage;
+            applyItemiChange.auditRemark = data.auditRemark;
+            applyItemiChange.id = data.id;
+          }
+        }
+      }
+    }
+    //该订单是否使用了奖励额度购买的抵用券
+    async function getDiscountDetail(){
+      let res = await market.GetDiscountInfo({
+        orderNum: route.query.orderNum
+      })
+      if(res.code === 101){
+        if(res.data.usedAmount){
+          showDiscountInfo.value=true
+          discountInfo.value = res.data
+        }
+      }
+    }
+
+    onBeforeMount(()=>{
+      getData()//获取订单数据
+      getOrderMobity()
+      getDiscountDetail()
+    })
+
+    onMounted(()=>{
+
+    })
+
+    return {
+      orderDetail,address,showDiscountInfo,modifyBtnStatus,applyItemiChange,discountInfo,toPercent,orderStatus,payModel,payStatus,payType,sendWayDisplayInt,afterSaleStatus,
+      getDiscountDetail,getOrderMobity,getDiscountDetail,getData,formatData,
+    }
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+.orderDetail {
+  width: 100%;
+  padding: 20px;
+  height: 100%;
+  color:#657180;
+  background-color: #f3f3f4;
+  .contact {
+    padding: 20px;
+    background-color: #dff0d8;
+    border-radius: 4px;
+  }
+  .color {
+    padding: 20px;
+    background-color: #f5f7f9; // box-shadow:1px 1px  3px rgba(0, 0, 0, 0.2);
+    border-radius: 4px;
+  }
+  .ivu-row {
+    margin-left: 0 !important;
+    margin-right: 0 !important;
+  }
+  .shopInfo {
+    padding: 15px 20px 5px 10px;
+  }
+  .info {
+    line-height: 26px;
+  }
+  .btn {
+    background-color: #fff;
+    color: #ff3300;
+    border: 1px solid #ff3300;
+  }
+  
+}
+.demo-upload-list{
+        display: inline-block;
+        width: 60px;
+        height: 60px;
+        text-align: center;
+        line-height: 60px;
+        border: 1px solid transparent;
+        border-radius: 4px;
+        overflow: hidden;
+        background: #fff;
+        position: relative;
+        box-shadow: 0 1px 1px rgba(0,0,0,.2);
+        margin-right: 4px;
+    }
+    .demo-upload-list img{
+        width: 100%;
+        height: 100%;
+    }
+    .demo-upload-list-cover{
+        display: none;
+        position: absolute;
+        top: 0;
+        bottom: 0;
+        left: 0;
+        right: 0;
+        background: rgba(0,0,0,.6);
+    }
+    .demo-upload-list:hover .demo-upload-list-cover{
+        display: block;
+    }
+    .demo-upload-list-cover i{
+        color: #fff;
+        font-size: 20px;
+        cursor: pointer;
+        margin: 0 2px;
+    }
+.avatar-uploader .el-upload {
+        border-radius: 6px;
+        cursor: pointer;
+        position: relative;
+        overflow: hidden;
+    }
+    .avatar-uploader .el-upload--text {}
+    .avatar-uploader .el-upload:hover {
+        border-color: #20a0ff;
+    }
+    .avatar-uploader .el-icon-plus {
+        border: 1px dashed #d9d9d9 !important;
+    }
+    .avatar-uploader-icon {
+        font-size: 28px;
+        color: #8c939d;
+        width: 178px;
+        height: 178px;
+        line-height: 178px;
+        text-align: center;
+    }
+    .avatar {
+        width: 178px;
+        height: 178px;
+        display: block;
+    }
+</style>

+ 513 - 0
src/views/manager/orderManager/orderList.vue

@@ -0,0 +1,513 @@
+/**
+ * 模板名称:系统操作日志
+ * 作者:zhangyy
+ * 时间:2023-09-22
+ */
+
+<template>
+  <div class="orderList">
+    <!-- 更多筛选条件 -->
+    <Form :label-width="80" :model="searchFilter">
+      <transition name="el-zoom-in-center">
+        <Row :gutter="10">
+            <Col span="6">
+              <FormItem label="订单编号">
+                  <Input placeholder="请输入" v-model="searchFilter.orderNum" clearable/>
+              </FormItem>
+            </Col>
+           <Col span="6">
+             <FormItem label="订单状态">
+                <Select placeholder="请选择" v-model="searchFilter.orderStatus" clearable
+                @on-change="getData">
+                  <Option value="">全部</Option>
+                  <Option value="WAIT_SENDING">待发货</Option>
+                  <Option value="WAIT_RECEIVING">待收货</Option>
+                  <Option value="RECEIVED">已收货</Option>
+                  <Option value="CANCEL">已取消</Option>
+                  <Option value="FINISH">已完成</Option>
+                </Select>
+            </FormItem>
+           </Col>
+           <Col span="8">
+             <FormItem label="成交时间">
+                <Row>
+                    <Col span="11">
+                      <DatePicker type="date" placeholder="选择日期"
+                      format="yyyy-MM-dd"
+                      confirm
+                      v-model="searchFilter.startDate"
+                       @on-change="changeStartTime"/>
+                    </Col>
+                    <Col span="1" style="text-align: center">-</Col>
+                    <Col span="11">
+                      <DatePicker type="date" placeholder="截止日期"
+                      format="yyyy-MM-dd"
+                      confirm v-model="searchFilter.endDate"
+                      @on-change="changeEndTime"
+                      />
+                    </Col>
+                </Row>
+            </FormItem>
+           </Col>
+           <Col span="6">
+             <FormItem label="商品分类">
+                <Select v-model="searchFilter.classifyOne" placeholder="商品分类"  clearable>
+                  <Option v-for="item in filterProList" :label="item.label" :value="item.id" :key="item.value">{{item.label}}</Option>
+                </Select>
+            </FormItem>
+           </Col>
+           <Col span="6">
+             <FormItem label="店铺名称">
+                <Input placeholder="请输入" v-model="searchFilter.shopName" clearable/>
+            </FormItem>
+          </Col>
+           <Col span="6">
+             <FormItem label="牧场名称">
+                <Input placeholder="请输入" v-model="searchFilter.orgName" clearable/>
+            </FormItem>
+          </Col>
+          <Col span="6">
+             <Button type="primary" icon="ios-search" @click="searchOrder">订单搜索</Button>
+          </Col>
+        </Row>
+      </transition>
+    </Form>
+    <!-- 数据展示 -->
+    <el-table class="el-table" :data="orderList.data"  v-loading="tableLoading">
+      <el-table-column prop="orderNum" label="订单编号" width="200">
+      	<template #default="scope">
+      		<a href="javascript:void(0)" @click="goOrderDetail(scope.row)">{{scope.row.orderNum}}</a>
+      	</template>
+	    </el-table-column>
+      <el-table-column label="买家账号" prop="userName"  width="120"/>
+      <el-table-column label="买家名称" width="120">
+        <template #default="scope">
+          <span>
+            {{scope.row.orderBuyer?scope.row.orderBuyer.nickName || '无' :'无'}}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="商品信息" width="200">
+        <template #default="scope">
+          <div v-show="scope.row.orderDetailList.length > 0">
+            <p v-for="list in scope.row.orderDetailList" >
+                <span>{{ list.name || '无名称'}}</span>
+                <span>{{ 'X' + list.count.toFixed(0)}}</span>
+              <br/>
+            </p>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="店铺" prop="shopName"  width="100"/>
+      <el-table-column label="总金额" prop="totalMoney"  width="80"/>
+      <el-table-column label="下单时间" width="100">
+        <template #default="scope">
+          <span>
+            {{formatData(scope.row.addTime)}}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="付款方式" width="85">
+        <template #default="scope">
+          <span>
+            {{scope.row.payModel | payModel}}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="订单状态" width="85">
+        <template #default="scope">
+          <span>
+            {{scope.row.orderStatus | orderStatus}}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="管理员备注" width="75">
+        <template #default="scope">
+          <span>
+            {{scope.row.adminRemark || '无'}}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="商家备注" width="75">
+        <template #default="scope">
+          <span>
+            {{scope.row.shopRemark || '无'}}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" fixed="right" width="100">
+        <template #default="scope">
+          <!--按钮-->
+            <Button size="small" @click="putRemark(scope.row)">填写备注</Button>
+            <!-- <Button type="warning" v-if="scope.row.orderVoucher" size="small" @click="viewVoucher(scope.row)">查看凭证</Button> -->
+            <!-- <Button style="margin-top:5px" type="primary" v-if="scope.row.orderStatus == 3" size="small" @click="confirmRecive(scope.row)">确认收货</Button> -->
+            <Button type="warning" v-if="scope.row.accountInvoice" size="small" @click="lookInvoice(scope.row)">查看账期发票</Button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <div style="margin: 10px;overflow: hidden">
+        <div style="float: right;">
+            <Page show-elevator :total="parseInt(orderList.total)" :page-size="orderList.limit" @on-change="changePage"></Page>
+        </div>
+    </div>
+    <!-- 填写备注 -->
+    <Modal v-model="remarkModel" title="填写备注" ok-text="提交" @on-ok="doModifyApply()">
+      <Form ref="itemChange" :model="itemChange" :label-width="80" >
+        <FormItem label="备注:" prop="remark">
+          <Input v-model="itemChange.remark" placeholder="填写备注"></Input>
+        </FormItem>
+      </Form>
+    </Modal>
+
+    <Modal v-model="confirmModel" title="填写备注" ok-text="确认" @on-ok="doConfirmRecive()">
+      <p style="width:100%;text-align:center;font-size:14px">确认收货此订单吗</p>
+      <p style="width:100%;text-align:center;font-size:14px">订单号:<b style="color:blur;font-size:15px">{{orderNumber}}</b></p>
+    </Modal>
+
+    <!-- 查看凭证弹框 -->
+    <Modal v-model="VoucherModel" title="审核凭证" width="750px">
+      <el-form :model="voucherInfo" ref="voucherInfo">
+          <el-FormItem label="凭证类型:" label-width="120px">
+              <span>{{voucherInfo.voucherType | voucherType}}</span>
+          </el-FormItem>
+          <el-FormItem>
+            <Row>
+                <Col :span="12">
+                <el-FormItem label="发货照片:" label-width="120px">
+                    <img v-if="voucherInfo.deliverUrl" :src="voucherInfo.deliverUrl" class="avatar">
+                    <i v-else class="el-icon-picture-outline avatar-uploader-icon"></i>
+                </el-FormItem>
+                </Col>
+                <Col :span="12">
+                <el-FormItem label="发货单照片:" label-width="120px">
+                    <img v-if="voucherInfo.sendInvoiceUrl" :src="voucherInfo.sendInvoiceUrl" class="avatar">
+                    <i v-else class="el-icon-picture-outline avatar-uploader-icon"></i>
+                </el-FormItem>
+                </Col>
+            </Row>
+          </el-FormItem>
+          <el-FormItem>
+            <Row>
+                <Col :span="12">
+                <el-FormItem label="收货照片:" label-width="120px">
+                    <img v-if="voucherInfo.receiveUrl" :src="voucherInfo.receiveUrl" class="avatar">
+                    <i v-else class="el-icon-picture-outline avatar-uploader-icon"></i>
+
+                </el-FormItem>
+                </Col>
+                <Col :span="12">
+                <el-FormItem label="磅单照片:" label-width="120px">
+                    <img v-if="voucherInfo.poundUrl" :src="voucherInfo.poundUrl" class="avatar">
+                    <i v-else class="el-icon-picture-outline avatar-uploader-icon"></i>
+                </el-FormItem>
+                </Col>
+            </Row>
+          </el-FormItem>
+      </el-form>
+      <div slot="footer">
+          <Button type="primary" @click="VoucherModel = false">关闭</Button>
+      </div>
+    </Modal>
+
+    <!-- 查看账期发票弹框 -->
+    <Modal v-model="InvoiceModel" title="查看账期发票" width="750px">
+      <el-form :model="accountInvoice" ref="accountInvoice">
+        <el-FormItem label="添加发票时间:" label-width="120px">
+          <span>{{accountInvoice.invoiceTime}}</span>
+        </el-FormItem>
+        <el-FormItem label="发货照片:" label-width="120px">
+          <span v-for="(item,index) in accountList" :key="index">
+             <img :src="item.url" class="avatarImg">
+          </span>
+        </el-FormItem>
+      </el-form>
+      <div slot="footer">
+          <Button type="primary" @click="InvoiceModel = false">关闭</Button>
+      </div>
+    </Modal>
+  </div>
+</template>
+
+<script>
+
+import { defineComponent, onMounted, ref ,reactive,getCurrentInstance} from 'vue'
+import {manager,order,item} from '@/request/api'
+import { Message,Modal } from 'view-ui-plus'
+import { useRouter } from 'vue-router'
+import moment from 'moment'
+
+export default defineComponent({
+  components:{
+    
+  },
+  setup() {
+    const router = useRouter()
+
+    let orderList = ref({})                   //订单数据
+    let tableLoading = ref(false)   //是否在加载中
+    let remarkModel = ref(false)
+    let current = ref(1)      //当前页码
+    let searchFilter = reactive({
+        orderStatus: '',    //订单状态
+        payStatus: '',      //支付状态
+        orderNum:'',        //订单编号
+        commentStatus: '',  //评价状态
+        startDate: '',      //订单开始日期(yyyy-MM-dd)
+        endDate: '',        //订单结束日期(yyyy-MM-dd)
+        offset:0,
+        limit:10,
+        classifyOne:'',
+        shopName:'',
+        orgName:''
+    })
+    let moreFilter = ref(true)     //是否显示更多筛选条件
+    let modalLoading = ref(true)
+    let confirmModel = ref(false)     //确认收货弹框
+    let itemChange = ref({
+      remark: '',
+      orderNum:''
+    })
+    let orderNumber = ref('')
+    let voucherInfo = ref({})
+    let VoucherModel = ref(false)     //查看凭证弹框
+    let InvoiceModel = ref(false) //查看账期发票弹框
+    let accountInvoice = ref({})
+    let accountList = ref([])
+    let filterProList = ref([])
+
+    //获取订单数据
+    async function getData(){
+      tableLoading.value = true;
+      await order.GetManagerOrderList({
+        ...searchFilter
+      }).then(res =>{
+        if (res.code==101) {
+            orderList.value = res||{}
+            console.log(orderList.value)
+        }else{
+        	Message.error(res.message)
+        }
+      })
+	    tableLoading.value = false;
+    }
+
+    //更改页码
+    function changePage (page) {
+      let orderlist = orderList.value
+      if(orderlist.limit){
+        searchFilter.offset = (page -1) *  orderlist.limit  //更新偏移量
+        current.value = page  //切换当前页码
+        getData()       //获取订单数据
+      }
+    }
+
+    
+    // 格式化日期
+    function formatData(date) {
+      return moment(date).format("YYYY-MM-DD");
+    }
+
+    //更改开始时间
+    function changeStartTime(time){
+      searchFilter.startDate = time
+      getData()
+    }
+
+    //更改截止时间
+    function changeEndTime(time){
+      searchFilter.endDate = time
+      getData()
+    }
+
+    /*=====搜索订单功能=====*/
+    function searchOrder(){
+      getData()
+    }
+
+    function putRemark(item){
+    	itemChange.value.orderNum = item.orderNum
+    	itemChange.value.remark = item.adminRemark
+    	remarkModel.value = true
+    }
+
+    //查看凭证
+    function viewVoucher(item){
+      console.log(item);
+      voucherInfo.value = item.orderVoucher
+      VoucherModel.value = true
+    }
+
+    async function doModifyApply() {
+      if (!itemChange.value.remark) {
+        Message.error('未填写备注')
+        return false
+      }
+      let res = await order.SaveRemark({ adminRemark: itemChange.value.remark, orderNum: itemChange.value.orderNum })
+      if (res.code == 101) {
+      	Message.success('备注成功')
+      	getData()
+      	remarkModel.value = false
+      } else {
+        Message.error('备注失败')
+      	remarkModel.value = false
+      }
+    }
+
+    //强制确认收货
+    function confirmRecive(row){
+      orderNumber.value = row.orderNum
+      confirmModel.value = true
+    }
+
+    //确认收货弹框中的确认按钮
+    async function doConfirmRecive(){
+      let res = await order.confirmReceived({
+        orderNum:orderNumber.value,
+        deviceType:'PC'
+      })
+      if(res.code == 101){
+        Message({
+          type: 'success',
+          message: '收货成功!'
+        })
+        getData()
+      }else{
+        Message({
+          type: 'error',
+          message: res.message || '操作失败'
+        })
+      }
+    }
+
+    //查收账期发票
+    function lookInvoice(item){
+      accountInvoice.value = item.accountInvoice
+      accountList.value =  JSON.parse(accountInvoice.value.invoiceImg)
+      console.log(accountList.value,'accountList.value')
+      InvoiceModel.value = true
+    }
+
+    //查询商品一级分类
+    async function GetOneClassifysList(){
+      let res = await item.GetClassifysList({
+        parentId:0
+      })
+      res.data.forEach((item)=>{
+        filterProList.value.push({
+          value:item.name,
+          label:item.name,
+          id:item.id
+        })
+      })
+    }
+    
+    // 订单详情
+    function goOrderDetail(row){
+      const href = router.resolve({ //使用resolve
+        path:'orderDetail',
+        query:{orderNum:row.orderNum,orgId:row.orgId}
+      })
+      window.open(href.href, '_blank')
+    }
+
+    onMounted(()=>{
+      getData() //获取订单数据
+      GetOneClassifysList()
+    })
+
+    return {
+      orderList,tableLoading,remarkModel,current,searchFilter,moreFilter,modalLoading,confirmModel,itemChange,orderNumber,voucherInfo,VoucherModel,InvoiceModel,accountInvoice,accountList,filterProList,
+      GetOneClassifysList,lookInvoice,doConfirmRecive,confirmRecive,doModifyApply,viewVoucher,putRemark,searchOrder,changeEndTime,changeStartTime,changePage,getData,goOrderDetail,formatData
+    }
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+.orderList{
+  padding: 1em;
+  background-color: #fff;
+  .el-table{
+    width: 100%;
+    font-size: 12px;
+  }
+  .ivu-modal-mask{
+    background-color: rgba(55, 55, 55, 0.1);
+  }
+  .track-rcol{
+   border: 1px solid #eee;
+ }
+ .deliverNum{
+    color: red;
+    text-align: center;
+    padding-top: 20px;
+ }
+  .track-list{
+    margin: 20px;
+   padding-left: 5px;
+   position: relative;
+ }
+  .track-list li{
+    position: relative;
+   padding: 9px 0 0 25px;
+   line-height: 18px;
+   border-left: 1px solid #d9d9d9;
+   color: #999;
+ }
+  .track-list li.first{
+    color: red;
+   padding-top: 0;
+   border-left-color: #fff;
+ }
+  .track-list li .node-icon{
+    position: absolute;
+   left: -6px;
+   top: 50%;
+   width: 11px;
+   height: 11px;
+   background: url(../../../assets/images/order-icons.png)  -21px -72px no-repeat;
+ }
+  .track-list li.first .node-icon{
+    background-position:0 -72px;
+  }
+  .track-list li .time{
+    margin-right: 20px;
+   position: relative;
+   top: 4px;
+   display: inline-block;
+   vertical-align: middle;
+ }
+  .track-list li .txt{
+    max-width: 600px;
+   position: relative;
+   top: 4px;
+   display: inline-block;
+   vertical-align: middle;
+ }
+  .track-list li.first .time{
+    margin-right: 20px;
+   }
+  .track-list li.first .txt{
+    max-width: 600px;
+   }
+   .avatar {
+        width: 178px;
+        height: 178px;
+        display: block;
+    }
+    .avatarImg {
+        width: 178px;
+        height: 178px;
+        margin-right: 10px;
+    }
+    .avatar-uploader-icon {
+        font-size: 28px;
+        color: #8c939d;
+        width: 178px;
+        height: 178px;
+        line-height: 178px;
+        text-align: center;
+    }
+}
+</style>

+ 669 - 0
src/views/manager/roleManager/roleList.vue

@@ -0,0 +1,669 @@
+/**
+ * 模板名称:角色权限管理
+ * 作者:zhangyy
+ * 时间:2023-09-22
+ */
+<template lang="html">
+  <div class="roleList">
+    <!-- 选择系统 -->
+    <Form :label-width="80">
+      <Row>
+        <Col span="6">
+          <FormItem  label="所属系统">
+            <Select v-model="rolesPageParams.systemCode" placeholder="请选择所属系统" @on-change="initRoles">
+              <Option v-for="sys in systemList" :key="sys.systemCode" :value="sys.systemCode">{{sys.systemName}}</Option>
+            </Select>
+          </FormItem >
+        </Col>
+      </Row>
+    </Form>
+    <Row type="flex" align="middle" justify="end">
+      <Col span="3">
+        <Button long @click="addRole">
+          新增角色
+        </Button>
+      </Col>
+    </Row>
+    <br>
+    <!-- 分配角色 -->
+    <el-table class="el-table" :data="rolesList" v-loading="rolesListLoading">
+      <el-table-column prop="roleCode" label="角色编码" min-width="60" align="center"/>
+      <el-table-column prop="roleDesc" label="角色名称" min-width="100" align="center"/>
+      <el-table-column label="操作" align="center">
+        <template #default="scope">
+          <Button type="warning" size="small" @click="RolePrivModel(scope.row)" style="margin-right: 5px;">分配权限</Button>
+          <Button type="primary" size="small" @click="editRoleModel(scope.row)" style="margin-right: 5px;">修改角色</Button>
+          <Button v-if="scope.row.roleCode.indexOf('SPSH')!=-1" type="info" size="small" @click="GoodsModel(scope.row)"  style="margin-right: 5px;">分配商品归属类型</Button>
+          <Button v-if="scope.row.roleCode.indexOf('SPSH')!=-1" type="success" size="small" style="margin-right: 5px; margin-top: 3px;" @click="roleClassifyModel(scope.row)">分配分类权限</Button>
+          <Button type="error" size="small" @click="delRole(scope.row)" style="margin-right: 5px;">删除角色</Button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <div style="margin: 10px;overflow: hidden">
+      <div style="float: right;">
+        <Page show-elevator :total="pager.total" :page-size="pager.limit" :current="rolesListCurrent" @on-change="roleChangePage"></Page>
+      </div>
+    </div>
+
+    <!-- 修改角色信息 -->
+    <Modal v-model="showEdit" :title="modelTitle" footer-hide="false">
+      <Form ref="editRoleRef" :model="editRole" :rules="editRules" :label-width="80" >
+        <FormItem  label="角色编码" prop="roleCode">
+          <Input v-model="editRole.roleCode" placeholder="请输入角色编码"></Input>
+        </FormItem >
+        <FormItem  label="角色名称" prop="roleDesc">
+          <Input v-model="editRole.roleDesc" placeholder="请输入角色名称"></Input>
+        </FormItem >
+        <FormItem  label="所属系统" prop="systemCode">
+          <Select v-model="editRole.systemCode" placeholder="请选择所属系统">
+              <Option v-for="sys in systemList" :key="sys.systemCode" :value="sys.systemCode">{{sys.systemName}}</Option>
+          </Select>
+        </FormItem >
+      </Form>
+      <div slot="footer" style="text-align: right;">
+        <Button type="primary" @click="saveRole">{{ editSub }}</Button>&nbsp;
+        <Button @click="reset" style="margin-left: 8px">重置</Button>
+      </div>
+    </Modal>
+    <!-- 为角色选择权限 -->
+    <Modal v-model="showSystemPrivTree" title="请选择权限" ok-text="确认分配" footer-hide="false">
+      <el-tree
+        :data="powerTree"
+        show-checkbox
+        node-key="id"
+        ref="treeRef"
+        highlight-current
+        :empty-text="emptyTree"
+        :props="defaultProps">
+      </el-tree>
+      <div slot="footer" style="text-align: right;">
+         <Button type="primary" @click="saveTree">保存权限</Button>&nbsp;
+         <Button @click="showSystemPrivTree=false">关闭</Button>
+      </div>
+    </Modal>
+
+    <!-- 为角色选择商品归属类型 -->
+    <Modal v-model="showGoodsType" title="请为角色分配商品归属类型" ok-text="商品归属类型已分配" :width="30"  footer-hide="false">
+      <CheckboxGroup v-model="goodsTypeGroup">
+        <Checkbox label="1" size="large">集采市场</Checkbox><br>
+        <Checkbox label="2" size="large">统采市场</Checkbox><br>
+        <Checkbox label="3" size="large">爆品超市</Checkbox><br>
+        <Checkbox label="4" size="large">有机市场</Checkbox><br>
+        <Checkbox label="5" size="large">积分商城</Checkbox><br>
+        <Checkbox label="7" size="large">代采市场</Checkbox><br>
+        <Checkbox label="8" size="large">牛客市场</Checkbox>
+      </CheckboxGroup>
+      <div slot="footer" style="text-align: right;">
+        <Button type="primary" @click="confirmGoodsType">确认分配</Button>&nbsp;
+        <Button  @click="showGoodsType=false">取消</Button>
+      </div>
+    </Modal>
+
+    <!-- 角色对应商品分类权限 -->
+    <Modal v-model="showRoleClassifyTree" title="请选择分类" ok-text="确认分配" footer-hide="false">
+      <Tree ref="classifyTree" :data="classify" show-checkbox @on-check-change="selClassify"></Tree>
+      <div slot="footer" style="text-align: right;">
+        <Button type="primary" @click="authClassifyOk">保存分类权限</Button>&nbsp;
+        <Button  @click="authClassifyCancel">关闭</Button>
+      </div>
+    </Modal>
+  </div>
+</template>
+
+<script>
+import { defineComponent, onMounted, ref ,reactive,getCurrentInstance,onBeforeMount } from 'vue'
+import {manager,sku} from '@/request/api'
+import { Message,Modal } from 'view-ui-plus'
+import { ElLoading } from 'element-plus'
+
+export default defineComponent({
+  components:{
+  },
+  setup() {
+    let {proxy} = getCurrentInstance();
+    const token = localStorage.aynUserToken
+
+    let isEdit = ref(false)      //是否为修改角色     
+    let showEdit = ref(false)    //是否显示 新建/修改角色 弹窗             
+    let modelTitle = ref('')     //新建/修改角色 弹窗的标题
+    let editSub = ref('')        //新建/修改弹窗 提交按钮文字
+    let editRole = ref( {        //需 新建/修改的 角色信息
+      roleCode:'',
+      roleDesc:'',
+      systemCode:''
+    })
+    let editRoleRef = ref()
+    let editRules = reactive({   //新建/修改角色的 验证规则
+      roleCode: [{
+        required: true,
+        message: '角色编码不能为空',
+        trigger: 'blur'
+      }],
+      roleDesc: [{
+        required: true,
+        message: '角色名称不能为空',
+        trigger: 'blur'
+      }],
+      systemCode: [{
+        required: true,
+        message: '所属系统不能为空',
+        trigger: 'blur'
+      }],
+    })
+    let systemList = ref([])                 //系统列表
+    let roleId = ref('')                     //角色id
+    let showSystemPrivTree = ref(false)      //是否为角色选择权限
+    let showRoleClassifyTree = ref(false)    //是否为角色选择权限
+    let powerTree = ref([])                  //权限树
+    let emptyTree = ref('')                  //权限树为空时的提示
+    let defaultProps = {                     //权限树配置
+      children: 'privileges',                //指定子树为节点对象的某个属性值
+      label: 'name'                          //指定节点标签为节点对象的某个属性值
+    }
+    let defaultTree = ref([])                //角色已有的权限树
+    let defaultPrivileges = ref([])          //角色已有权限ID
+    let rolesList = ref([])
+    let rolesListLoading = ref(false)        //分配角色列表是否在载入中
+    let rolesListCurrent = ref(1)            //配角色列表页码
+    let rolesPageParams =reactive({          //分配角色的参数
+      systemCode: '1001',                    //分配角色的所属系统
+    })
+    let pager = reactive({
+        total:1,
+        limit:10,
+        offset:0
+    })
+    let addRoleInfo = ref({})
+    let classify = ref([])
+    let allClassify = ref([])
+    let chkedPathClassifySel = ref({})
+    let chkedPathClassify = ref({})
+    let pathClassify = ref([])
+    let showGoodsType = ref(false)            //点击为角色分配商品归属类型---
+    let goodsTypeGroup = ref([])              //被选进数组---
+    let treeRef = ref()
+    let selClassifyList = ref([])
+    let selList = ref()
+
+    async function initSystem() {
+      await manager.GetSystemMenuList().then(async res => {
+        if (res.code == '101' && res.data) {
+          systemList.value = res.data
+          initRoles()
+        } else {
+          Message.error(res.message || "获取平台系统出错")
+        }
+      })
+    }
+
+    //显示新增角色
+    function addRole() {
+      editRoleRef.value.resetFields()
+      isEdit.value = false //新增角色
+      editSub.value = '提交'
+      modelTitle.value = '新增角色'
+      showEdit.value = true //显示弹窗
+    }
+
+    //显示修改角色
+    function editRoleModel(data) {
+      editRoleRef.value.resetFields()
+      isEdit.value = true //修改角色
+      editSub.value = '保存'
+      modelTitle.value = '修改角色'
+      editRole.value = _.cloneDeep(data) //需要修改的角色
+      showEdit.value = true //显示弹窗
+    }
+
+    //保存角色
+    function saveRole() {
+      editRoleRef.value.validate(async(valid) => {
+        if (valid) { //验证成功
+          if(!isEdit.value){ //判断是否是新增,还是修改,如果是新增的话,则传到用一个对象保存数据,传参不同
+            addRoleInfo.value = {}
+            addRoleInfo.value.roleCode = editRole.value.roleCode ? editRole.value.roleCode : ''
+            addRoleInfo.value.roleDesc = editRole.value.roleDesc ? editRole.value.roleDesc : ''
+            addRoleInfo.value.systemCode = editRole.value.systemCode ? editRole.value.systemCode : ''
+          }else{
+            addRoleInfo.value = {}
+          }
+          let save = isEdit.value ? await manager.UpdateRole(editRole.value) : await manager.AddNewRole(addRoleInfo.value) //修改和保存调用不同接口
+          if (save.code === 101) {
+            Message.success(save.message) //保存后提示的消息
+            initRoles() //更新角色列表数据
+            showEdit.value = false
+          } else {
+            Message.error(save.message)
+          }
+        } else { //验证失败
+          Message.error('提交失败!')
+        }
+      })
+    }
+
+    //重置表单
+    function reset() {
+      editRoleRef.value.resetFields();
+    }
+
+    //删除角色
+    function delRole(row) {
+      let params = {
+        id: row.id
+      }
+      Modal.confirm({
+        title: '提示',
+        content: '确认删除角色【' + row.roleDesc + '】吗?',
+        onOk: async() => {
+          let del = await manager.DelRole(params)
+          if (del.code === 101) {
+            Message.success('删除成功') //删除成功后提示的消息
+            initRoles() //更新角色列表数据
+          } else {
+            Message.error(del.message) //删除失败后提示的消息
+          }
+        }
+      })
+    }
+
+    //获取角色的权限树
+    async function getTree() {
+      await manager.GetPrivilegeList({ //获取系统的权限树
+        systemCode: rolesPageParams.systemCode,
+      }).then(async res => {
+        if (res.code == '101' && res.data) {
+          res.data.length > 0 && (powerTree.value = _.cloneDeep(res.data))//创建权限树的副本
+          res.data.length === 0 && (powerTree.value = []) && (emptyTree.value = '该系统没有可配置权限') //没有可配置权限时,提示并清除当前系统权限
+        } else {
+          Message.error(res.message || "获取出错")
+        }
+      })
+      await manager.GetDefaultPrivileges({ //获取角色已有的权限
+        systemCode: rolesPageParams.systemCode,
+        roleId: roleId.value
+      }).then(async res => {
+        if (res.code == '101' && res.data) {
+          let arr = res.data
+          if(arr && arr[0] && arr[0].privilegeList && arr[0].privilegeList.length > 0){ 
+            let powerList = arr[0].privilegeList
+            let defaultPrivileges = powerList.map(function (list) { //获取默认权限的所有id
+              return list.id
+            })
+            console.log(defaultPrivileges,'defaultPrivileges')
+            console.log(powerTree.value,'powerTree.value')
+            powerTree.value.forEach(function (list,index,array) {
+              //两层结构
+              for(var i=0; i<defaultPrivileges.length; i++) {
+                if(defaultPrivileges[i] == list.id && list.privileges.length>0) {
+                  defaultPrivileges.splice(i, 1);
+                  break;
+                }
+              }
+              //三层结构
+              list.privileges.map((child)=>{
+                if(child.privileges.length>0){
+                  for(var i=0; i<defaultPrivileges.length; i++) {
+                    if(defaultPrivileges[i] == child.id && child.privileges.length>0) {
+                      defaultPrivileges.splice(i, 1);
+                      break;
+                    }
+                  }
+                }
+              })
+            })
+            defaultPrivileges.value = defaultPrivileges
+            defaultPrivileges.value.length > 0 && (defaultTree.value = _.cloneDeep(defaultPrivileges.value)) && treeRef.value.setCheckedKeys(defaultTree.value) //创建默认权限的副本,通过 keys 设置目前勾选的节点
+          }else{  //无默认权限
+            defaultPrivileges.value = []
+            treeRef.value.setCheckedKeys([])
+          }
+        }
+      })
+    }
+
+    //保存角色权限
+    async function saveTree() {
+      let saveTree = treeRef.value.getCheckedKeys() //获取选中的权限
+      console.log(saveTree,'saveTree')
+      powerTree.value.forEach(function (list,index,array) { //获取默认权限的所有id
+        let flag = false
+        let flagTwo = false
+        list.privileges.map(function(privilege) {
+          if(saveTree.indexOf(privilege.id)>-1&&saveTree.indexOf(list.id)<0) flag=true
+          if(privilege.privileges.length>0){
+            privilege.privileges.map(function(child){
+              if(saveTree.indexOf(child.id)>-1&&saveTree.indexOf(privilege.id)<0) flagTwo=true
+              if(saveTree.indexOf(child.id)>-1&&saveTree.indexOf(list.id)<0) flag=true
+            })
+            if(flagTwo) saveTree.push(privilege.id)
+          }
+        })
+        if(flag) saveTree.push(list.id)
+      })
+      saveTree = saveTree.join(',') //权限编码传参需以逗号隔开
+      console.log(saveTree)
+      let params = {
+        systemCode: rolesPageParams.systemCode,
+        roleId: roleId.value,
+        privilegeIds: saveTree
+      }
+      let update = await manager.UpdateRolePrivileges(params) //提交保存
+      if (update.code === 101) { //提交结果提示
+        Message.success(update.message)
+        showSystemPrivTree.value = false
+      } else {
+        Message.error(update.message)
+      }
+    }
+
+    /*
+     * 分配权限
+     */
+    //根据系统初始化角色列表
+    async function initRoles() {
+      rolesListLoading.value = true
+      const param = {
+         systemCode: rolesPageParams.systemCode,
+         ...pager
+      }
+      await manager.GetSysRoleList(param).then(async res => {
+          if (res.code == '101' && res.data) {
+            if( res.data.length > 0 ) {
+              rolesList.value = _.cloneDeep(res.data)
+            }else{
+              rolesList.value = []
+            }
+             pager.total = res.total || 0
+          } else {
+            Message.error(res.message || "获取出错")
+          }
+      })
+      rolesListLoading.value = false
+    }
+
+    //更改页码
+    function roleChangePage(page) {
+      console.log('更改密码')
+      pager.offset = page === 1 ? 0 : ((page - 1) * pager.limit) //更新偏移量
+      rolesListCurrent.value = page //切换当前页码
+      initRoles() //获取角色列表
+    }
+
+    //分配权限弹窗
+    async function RolePrivModel(row) {
+      roleId.value = row.id
+      getTree()
+      showSystemPrivTree.value = true //显示弹窗
+    }
+
+    //分配商品三级分类权限
+    async function roleClassifyModel(row) {
+      roleId.value = row.id
+      await manager.searchRoleClassifyByRoleId({'roleId':row.id}).then((res)=>{
+        if(res.code === 101){
+          let tempAllClassifyStr = JSON.stringify(allClassify.value);
+          let tempAllClassify = JSON.parse(tempAllClassifyStr);
+          if(res.data && res.data.length >0){
+            //编辑
+            findAllNode(res.data);
+            let tempResult = JSON.stringify(tempAllClassify);
+            for(var item in chkedPathClassifySel.value){
+                tempResult = tempResult.replace("\"id\":"+chkedPathClassifySel.value[item],"\"checked\":true,\"id\":"+chkedPathClassifySel.value[item]);
+            }
+            classify.value = JSON.parse(tempResult);
+          }else{
+            //新增
+            classify.value = tempAllClassify;
+          }
+          showRoleClassifyTree.value = true;
+        }else{
+          Message.error(res.message);
+        }
+      })
+    }
+
+    function authClassifyOk() {
+      if(!selClassifyList.value||selClassifyList.value.length == 0 ){
+        Message.error("没有监测到选择信息,请重新操作!");
+        return;
+      }
+      for(let i = 0 ; i < chkedPathClassifySel.value.length ; i++){
+        chkedPathClassifySel.value[oneitem.id] = oneitem.id;
+      }
+
+      //处理并保存数据
+      findCheckedPathNode();
+      let allClassifyCopyStr = JSON.stringify(allClassify.value);
+      let allClassifyCopy = JSON.parse(allClassifyCopyStr);
+      let receiveUnsed = removeUnCheckedNode(allClassifyCopy);
+      invertedOrder(receiveUnsed);
+      for(let i = 0 ; i < receiveUnsed.length; i++){
+          allClassifyCopy.splice(receiveUnsed[i],1);
+      }
+      let result = {'roleId':roleId.value,'children':allClassifyCopy};
+      selList.value = result;
+      addAuthClassifyList();
+      authClassifyCancel();
+    }
+
+    async function addAuthClassifyList(){
+      const loadingObj = ElLoading.service({
+        lock: true,
+        text: 'Loading',
+        spinner: "el-icon-loading",
+        background: 'rgba(0, 0, 0, 0.7)',
+      })
+      const res1 = await manager.bindingClassify(selList.value);
+      loadingObj.close();
+      if (res1.code == "101") {
+        Message.success("保存成功!");
+      } else {
+        Message.error(res1.message);
+      }
+    }
+
+    async function initData() {//初始化三级分类 将数据结构转换为层级关系的结构
+      await sku.getAllClassList().then((res)=>{
+        if (res.code == 101) {
+          let tempResult = handAllClasses(res.data);
+          tempResult = JSON.stringify(tempResult);
+          tempResult = tempResult.replace(/name/g,"title");
+          let rootTree =JSON.parse(tempResult);
+          allClassify.value = rootTree;
+          for(let i = 0 ; i < allClassify.value.length; i++){
+              spellPath(allClassify.value[i],'');
+          }
+        }
+      })
+    }
+
+    function handAllClasses(classes) {
+      let classTree = [];
+      classes.forEach(classItem => {
+        if (classItem.parentId === 0) {
+          // 是否是一级分类
+          classTree.push({
+              ...classItem,
+              children: []
+          });
+        } else {
+          try {
+            //用try catch throw 中断forEach循环
+            classTree.forEach(classOne => {
+              // 是否是一级分类下的二级分类
+              if (classOne.id === classItem.parentId) {
+                classOne.children.push({
+                    ...classItem,
+                    children: []
+                });
+                throw "是二级分类";
+              } else {
+                try {
+                  classOne.children.forEach(classTwo => {
+                    if (classTwo.id === classItem.parentId) {
+                      // 是否是二级分类下的三级分类
+                      classTwo.children.push({
+                          ...classItem
+                      });
+                      throw "是三级分类";
+                    }
+                  });
+                } catch (err) {
+                    //  console.log('是三级分类')
+                }
+              }
+            });
+          } catch (err) {
+              // console.log('是二级分类')
+          }
+        }
+      });
+
+      return classTree;
+    }
+
+    function spellPath(node,spell){
+      spell += '-'+node.id;
+      if(!node.children || node.children.length == 0){
+        pathClassify.value.push(spell);
+        return;
+      }
+      for(let i = 0 ; i < node.children.length; i++){
+        spellPath(node.children[i],spell);
+      }
+    }
+
+    function findAllNode(nodes){
+      for(let i = 0; i < nodes.length; i++){
+          let oneitem = nodes[i];
+        if(oneitem.children){
+          findAllNode(oneitem.children);
+        }else{
+           chkedPathClassifySel.value[oneitem.id] = oneitem.id;
+        }
+      }
+    }
+
+    function findCheckedPathNode(){
+      for(let i = 0 ; i < selClassifyList.value.length ; i++){
+        for(let j =0;j < pathClassify.value.length;j++){
+          let oneItem = pathClassify.value[j];
+            if(oneItem.indexOf('-'+selClassifyList.value[i].id)>=0){
+              let items = oneItem.split('-');
+              for(let k = 0 ; k < items.length; k++){
+                if(items[k]){
+                  chkedPathClassify.value[items[k]] = items[k];
+                }
+              }
+            }
+        }
+      }
+    }
+
+   function removeUnCheckedNode(nodes){
+      let unUsed = [];
+      for(let i = 0 ; i < nodes.length; i++){
+        let oneNode = nodes[i];
+        if(!chkedPathClassify.value[oneNode.id]){
+            unUsed.push(i);
+        }else{
+          if(!oneNode.children || oneNode.children.length ==0 ){
+          }else{
+            let receiveUnsed = removeUnCheckedNode(oneNode.children);
+            //begin delete
+            invertedOrder(receiveUnsed);
+            for(let j = 0 ; j < receiveUnsed.length; j++){
+                oneNode.children.splice(receiveUnsed[j],1);
+            }
+          }
+        }
+      }
+      return unUsed;
+    }
+
+    function invertedOrder(aset){
+        var n=aset.length;
+        for(var i=0;i<n-1;i++){
+            var flag=false;
+            for(var j=0;j<n-i;j++){
+                var temp;
+                if(aset[j]<aset[j+1]){
+                    temp=aset[j+1];
+                    aset[j+1]=aset[j];
+                    aset[j]=temp;
+                }
+                flag=true;
+            }
+            if(!flag) return;
+        }
+    }
+
+    //勾选分类
+    function selClassify(sel){
+      console.log("sel",sel)
+      selClassifyList.value = sel;
+    }
+
+    // 取消分类授权界面
+    function authClassifyCancel() {
+        roleId.value = '';
+        selClassifyList.value = [];
+        chkedPathClassify.value= {};
+        chkedPathClassifySel.value = {};
+        showRoleClassifyTree.value = false;
+    }
+
+    //分配商品归属类型弹窗---------------------------------------
+    async function GoodsModel(row) {
+      roleId.value = row.id
+      await manager.GetGoodsType( {roleId:roleId.value} ).then(res=>{
+        console.log(res);//这是一条可以删除的:{code: 0, data: Array(4), message: "查询成功"}
+        if(res.code==0){
+            let resData = res.data
+            let arr = resData.map((val,index)=>{
+                return val.typeCode
+            })
+            goodsTypeGroup.value = arr
+            showGoodsType.value = true
+        }
+      })
+    }
+
+    //确认分配商品归属类型---------------------------------------
+    async function confirmGoodsType(){
+        let goodsTypeSelected ={}
+        goodsTypeSelected.roleId=roleId.value
+        goodsTypeSelected.typeCodeList=goodsTypeGroup.value
+        await manager.SaveGoodsType(goodsTypeSelected).then(res=>{
+          if(res.code==0){
+            Message.success(res.message ||'分配成功')
+            showGoodsType.value = false
+          }else{
+            Message.error(res.message || '分配失败')
+            showGoodsType.value=false
+          }
+        })
+    }
+
+    onMounted(()=>{
+
+    })
+    onBeforeMount(()=>{
+      initSystem() //初始化列表
+      initData()
+    })
+
+    return {
+      editRoleRef,isEdit,showEdit,modelTitle,editSub,editRole,editRules,systemList,roleId,showSystemPrivTree,showRoleClassifyTree,powerTree,emptyTree,defaultProps,defaultTree,defaultPrivileges,rolesList,rolesListLoading,rolesListCurrent,rolesPageParams,pager,addRoleInfo,classify,allClassify,chkedPathClassifySel,chkedPathClassify,pathClassify,showGoodsType,goodsTypeGroup,treeRef,selClassifyList,selList,
+      initSystem,addRole,editRoleModel,saveRole,reset,delRole,getTree,saveTree,initRoles,roleChangePage,RolePrivModel,roleClassifyModel,confirmGoodsType,GoodsModel,selClassify,initData,authClassifyOk,authClassifyCancel
+    }
+  },
+})
+</script>
+
+<style lang="scss" scoped>
+.roleList{
+  padding: 1em;
+}
+</style>

+ 0 - 0
src/views/manager/roleManager/roleManager.vue


Some files were not shown because too many files changed in this diff