zory 2 viikkoa sitten
vanhempi
sitoutus
ee41678ad8
52 muutettua tiedostoa jossa 2931 lisäystä ja 706 poistoa
  1. 16 16
      src/api/model/agent.js
  2. 0 22
      src/api/model/cloth.js
  3. 40 33
      src/api/model/express.js
  4. 39 32
      src/api/model/goods.js
  5. 0 19
      src/api/model/merConfig.js
  6. 0 19
      src/api/model/order.js
  7. 0 12
      src/api/model/service.js
  8. 39 32
      src/api/model/shop.js
  9. 19 12
      src/api/model/store.js
  10. 0 12
      src/api/model/storeDetail.js
  11. 0 19
      src/api/model/storeLog.js
  12. 16 16
      src/api/model/user.js
  13. 0 33
      src/api/model/washGoods.js
  14. 0 33
      src/api/model/washType.js
  15. 173 0
      src/views/manage/agent/components/form.vue
  16. 57 0
      src/views/manage/agent/components/option.vue
  17. 54 0
      src/views/manage/agent/components/search.vue
  18. 114 0
      src/views/manage/agent/components/table.vue
  19. 46 63
      src/views/manage/agent/index.vue
  20. 22 26
      src/views/manage/components/agent.vue
  21. 46 43
      src/views/manage/components/store.vue
  22. 136 165
      src/views/manage/dashboard/index.vue
  23. 78 0
      src/views/manage/express/components/form.vue
  24. 61 0
      src/views/manage/express/components/option.vue
  25. 44 0
      src/views/manage/express/components/search.vue
  26. 105 0
      src/views/manage/express/components/table.vue
  27. 49 0
      src/views/manage/express/index.vue
  28. 146 0
      src/views/manage/goods/components/form.vue
  29. 61 0
      src/views/manage/goods/components/option.vue
  30. 49 0
      src/views/manage/goods/components/search.vue
  31. 105 0
      src/views/manage/goods/components/table.vue
  32. 49 0
      src/views/manage/goods/index.vue
  33. 0 6
      src/views/manage/mall/douyin/components/option.vue
  34. 0 6
      src/views/manage/mall/douyin/components/search.vue
  35. 0 6
      src/views/manage/mall/douyin/components/table.vue
  36. 0 6
      src/views/manage/mall/wechat/components/option.vue
  37. 0 6
      src/views/manage/mall/wechat/components/search.vue
  38. 0 6
      src/views/manage/mall/wechat/components/table.vue
  39. 307 0
      src/views/manage/shop/index/components/form.vue
  40. 57 0
      src/views/manage/shop/index/components/option.vue
  41. 85 0
      src/views/manage/shop/index/components/search.vue
  42. 138 0
      src/views/manage/shop/index/components/table.vue
  43. 46 63
      src/views/manage/shop/index/index.vue
  44. 126 0
      src/views/manage/shop/store/components/form.vue
  45. 57 0
      src/views/manage/shop/store/components/option.vue
  46. 47 0
      src/views/manage/shop/store/components/search.vue
  47. 114 0
      src/views/manage/shop/store/components/table.vue
  48. 47 0
      src/views/manage/shop/store/index.vue
  49. 59 0
      src/views/manage/user/components/search.vue
  50. 143 0
      src/views/manage/user/components/table.vue
  51. 45 0
      src/views/manage/user/index.vue
  52. 96 0
      src/views/manage/user/password.vue

+ 16 - 16
src/api/model/agent.js

@@ -5,36 +5,36 @@ export default {
     list: {
         url: `${config.API_URL}/agent/list`,
         name: "-",
-        get: async function (data = {}) {
-            return await http.get(this.url, data);
-        }
+        get: async function (params) {
+            return await http.get(this.url, params);
+        },
     },
     save: {
         url: `${config.API_URL}/agent/save`,
         name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
+        post: async function (params) {
+            return await http.post(this.url, params);
         },
     },
-    del: {
-        url: `${config.API_URL}/agent/del`,
+    edit: {
+        url: `${config.API_URL}/agent/edit`,
         name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
+        post: async function (params) {
+            return await http.post(this.url, params);
         },
     },
     batch: {
         url: `${config.API_URL}/agent/batch`,
         name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
+        post: async function (params) {
+            return await http.post(this.url, params);
         },
     },
-    time: {
-        url: `${config.API_URL}/agent/time`,
+    del: {
+        url: `${config.API_URL}/agent/del`,
         name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
+        post: async function (params) {
+            return await http.post(this.url, params);
         },
     },
-};
+}

+ 0 - 22
src/api/model/cloth.js

@@ -1,22 +0,0 @@
-import config from "@/config";
-import http from "@/utils/request";
-
-export default {
-    color: {
-        url: `${config.API_URL}/cloth/color`,
-        name: "-",
-        get: async function (data = {}) {
-            return await http.get(this.url, data);
-        },
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
-        },
-    },
-    del: {
-        url: `${config.API_URL}/cloth/del`,
-        name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
-        },
-    },
-};

+ 40 - 33
src/api/model/factory.js → src/api/model/express.js

@@ -1,33 +1,40 @@
-import config from "@/config";
-import http from "@/utils/request";
-
-export default {
-    list: {
-        url: `${config.API_URL}/factory/list`,
-        name: "-",
-        get: async function (data = {}) {
-            return await http.get(this.url, data);
-        }
-    },
-    save: {
-        url: `${config.API_URL}/factory/save`,
-        name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
-        },
-    },
-    del: {
-        url: `${config.API_URL}/factory/del`,
-        name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
-        },
-    },
-    batch: {
-        url: `${config.API_URL}/factory/batch`,
-        name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
-        },
-    },
-};
+import config from "@/config";
+import http from "@/utils/request";
+
+export default {
+    list: {
+        url: `${config.API_URL}/express/list`,
+        name: "-",
+        get: async function (data = {}) {
+            return await http.get(this.url, data);
+        },
+    },
+    page: {
+        url: `${config.API_URL}/express/page`,
+        name: "-",
+        get: async function (data = {}) {
+            return await http.get(this.url, data);
+        },
+    },
+    save: {
+        url: `${config.API_URL}/express/save`,
+        name: "-",
+        post: async function (data = {}) {
+            return await http.post(this.url, data);
+        },
+    },
+    batch: {
+        url: `${config.API_URL}/express/batch`,
+        name: "-",
+        post: async function (data = {}) {
+            return await http.post(this.url, data);
+        },
+    },
+    del: {
+        url: `${config.API_URL}/express/del`,
+        name: "-",
+        post: async function (data = {}) {
+            return await http.post(this.url, data);
+        },
+    },
+}

+ 39 - 32
src/api/model/storeUser.js → src/api/model/goods.js

@@ -1,33 +1,40 @@
-import config from "@/config";
-import http from "@/utils/request";
-
-export default {
-    get: {
-        url: `${config.API_URL}/store/member/list`,
-        name: "-",
-        get: async function (params) {
-            return await http.get(this.url, params);
-        },
-    },
-    save: {
-        url: `${config.API_URL}/store/member/save`,
-        name: "-",
-        post: async function (params) {
-            return await http.post(this.url, params);
-        },
-    },
-    del: {
-        url: `${config.API_URL}/store/member/del`,
-        name: "-",
-        post: async function (params) {
-            return await http.post(this.url, params);
-        },
-    },
-    batch: {
-        url: `${config.API_URL}/store/member/batch`,
-        name: "-",
-        post: async function (params) {
-            return await http.post(this.url, params);
-        },
-    },
+import config from "@/config";
+import http from "@/utils/request";
+
+export default {
+    list: {
+        url: `${config.API_URL}/goods/list`,
+        name: "-",
+        get: async function (params) {
+            return await http.get(this.url, params);
+        },
+    },
+    save: {
+        url: `${config.API_URL}/goods/save`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
+    edit: {
+        url: `${config.API_URL}/goods/edit`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
+    batch: {
+        url: `${config.API_URL}/goods/batch`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
+    del: {
+        url: `${config.API_URL}/goods/del`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
 }

+ 0 - 19
src/api/model/merConfig.js

@@ -1,19 +0,0 @@
-import config from "@/config";
-import http from "@/utils/request";
-
-export default {
-    get: {
-        url: `${config.API_URL}/merchant/config/get`,
-        name: "-",
-        get: async function (params) {
-            return await http.get(this.url, params);
-        },
-    },
-    save: {
-        url: `${config.API_URL}/merchant/config/save`,
-        name: "-",
-        post: async function (params) {
-            return await http.post(this.url, params);
-        },
-    },
-}

+ 0 - 19
src/api/model/order.js

@@ -1,19 +0,0 @@
-import config from "@/config";
-import http from "@/utils/request";
-
-export default {
-    list: {
-        url: `${config.API_URL}/order/list`,
-        name: "-",
-        get: async function (data = {}) {
-            return await http.get(this.url, data);
-        }
-    },
-    detail: {
-        url: `${config.API_URL}/order/save`,
-        name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
-        },
-    },
-};

+ 0 - 12
src/api/model/service.js

@@ -1,12 +0,0 @@
-import config from "@/config"
-import http from "@/utils/request"
-
-export default {
-    data: {
-        url: `${config.API_URL}/service/data`,
-        name: "-",
-        get: async function(data={}){
-            return await http.get(this.url, data);
-        }
-    }
-}

+ 39 - 32
src/api/model/storeAddress.js → src/api/model/shop.js

@@ -1,33 +1,40 @@
-import config from "@/config";
-import http from "@/utils/request";
-
-export default {
-    get: {
-        url: `${config.API_URL}/store-address/list`,
-        name: "-",
-        get: async function (params) {
-            return await http.get(this.url, params);
-        },
-    },
-    save: {
-        url: `${config.API_URL}/store-address/save`,
-        name: "-",
-        post: async function (params) {
-            return await http.post(this.url, params);
-        },
-    },
-    del: {
-        url: `${config.API_URL}/store-address/del`,
-        name: "-",
-        post: async function (params) {
-            return await http.post(this.url, params);
-        },
-    },
-    batch: {
-        url: `${config.API_URL}/store-address/batch`,
-        name: "-",
-        post: async function (params) {
-            return await http.post(this.url, params);
-        },
-    },
+import config from "@/config";
+import http from "@/utils/request";
+
+export default {
+    list: {
+        url: `${config.API_URL}/shop/list`,
+        name: "-",
+        get: async function (params) {
+            return await http.get(this.url, params);
+        },
+    },
+    save: {
+        url: `${config.API_URL}/shop/save`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
+    edit: {
+        url: `${config.API_URL}/shop/edit`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
+    batch: {
+        url: `${config.API_URL}/shop/batch`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
+    del: {
+        url: `${config.API_URL}/shop/del`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
 }

+ 19 - 12
src/api/model/store.js

@@ -5,29 +5,36 @@ export default {
     list: {
         url: `${config.API_URL}/store/list`,
         name: "-",
-        get: async function (data = {}) {
-            return await http.get(this.url, data);
-        }
+        get: async function (params) {
+            return await http.get(this.url, params);
+        },
     },
     save: {
         url: `${config.API_URL}/store/save`,
         name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
+        post: async function (params) {
+            return await http.post(this.url, params);
         },
     },
-    del: {
-        url: `${config.API_URL}/store/del`,
+    edit: {
+        url: `${config.API_URL}/store/edit`,
         name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
+        post: async function (params) {
+            return await http.post(this.url, params);
         },
     },
     batch: {
         url: `${config.API_URL}/store/batch`,
         name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
+    del: {
+        url: `${config.API_URL}/store/del`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
         },
     },
-};
+}

+ 0 - 12
src/api/model/storeDetail.js

@@ -1,12 +0,0 @@
-import config from "@/config";
-import http from "@/utils/request";
-
-export default {
-    data: {
-        url: `${config.API_URL}/store/detail/data`,
-        name: "-",
-        get: async function (data = {}) {
-            return await http.get(this.url, data);
-        }
-    },
-};

+ 0 - 19
src/api/model/storeLog.js

@@ -1,19 +0,0 @@
-import config from "@/config";
-import http from "@/utils/request";
-
-export default {
-    recharge: {
-        url: `${config.API_URL}/store/log/recharge`,
-        name: "-",
-        get: async function (params) {
-            return await http.get(this.url, params);
-        },
-    },
-    log: {
-        url: `${config.API_URL}/store/log/logs`,
-        name: "-",
-        get: async function (params) {
-            return await http.get(this.url, params);
-        },
-    },
-}

+ 16 - 16
src/api/model/user.js

@@ -5,29 +5,29 @@ export default {
     list: {
         url: `${config.API_URL}/user/list`,
         name: "-",
-        get: async function (data = {}) {
-            return await http.get(this.url, data);
-        }
+        get: async function (params) {
+            return await http.get(this.url, params);
+        },
     },
-    save: {
-        url: `${config.API_URL}/user/save`,
+    pwd: {
+        url: `${config.API_URL}/user/passwd`,
         name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
+        post: async function (params) {
+            return await http.post(this.url, params);
         },
     },
-    del: {
-        url: `${config.API_URL}/user/del`,
+    save: {
+        url: `${config.API_URL}/user/save`,
         name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
+        post: async function (params) {
+            return await http.post(this.url, params);
         },
     },
-    batch: {
-        url: `${config.API_URL}/user/batch`,
+    state: {
+        url: `${config.API_URL}/user/state`,
         name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
+        post: async function (params) {
+            return await http.post(this.url, params);
         },
     },
-};
+}

+ 0 - 33
src/api/model/washGoods.js

@@ -1,33 +0,0 @@
-import config from "@/config";
-import http from "@/utils/request";
-
-export default {
-    list: {
-        url: `${config.API_URL}/wash-goods/list`,
-        name: "-",
-        get: async function (data = {}) {
-            return await http.get(this.url, data);
-        }
-    },
-    save: {
-        url: `${config.API_URL}/wash-goods/save`,
-        name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
-        },
-    },
-    del: {
-        url: `${config.API_URL}/wash-goods/del`,
-        name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
-        },
-    },
-    batch: {
-        url: `${config.API_URL}/wash-goods/batch`,
-        name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
-        },
-    },
-};

+ 0 - 33
src/api/model/washType.js

@@ -1,33 +0,0 @@
-import config from "@/config";
-import http from "@/utils/request";
-
-export default {
-    list: {
-        url: `${config.API_URL}/wash-type/list`,
-        name: "-",
-        get: async function (data = {}) {
-            return await http.get(this.url, data);
-        }
-    },
-    save: {
-        url: `${config.API_URL}/wash-type/save`,
-        name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
-        },
-    },
-    del: {
-        url: `${config.API_URL}/wash-type/del`,
-        name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
-        },
-    },
-    batch: {
-        url: `${config.API_URL}/wash-type/batch`,
-        name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
-        },
-    },
-};

+ 173 - 0
src/views/manage/agent/components/form.vue

@@ -0,0 +1,173 @@
+<template>
+    <el-dialog :title="titleMap[mode]" v-model="visible" :width="600" destroy-on-close @closed="$emit('closed')" :close-on-click-modal="false" :close-on-press-escape="false">
+        <el-form ref="dialogForm" :model="formData" :rules="rules" label-width="100px" label-position="top">
+            <fieldset>
+                <legend><el-tag>基础信息</el-tag></legend>
+                <el-row :gutter="15">
+                    <el-col :span="24">
+                        <el-form-item label="代理名称" prop="name">
+                            <el-input v-model="formData.name" clearable placeholder="代理名称"></el-input>
+                            <div class="el-form-item-msg"></div>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="联系人" prop="contact_name">
+                            <el-input v-model="formData.contact_name" clearable placeholder="请输入联系人"></el-input>
+                            <div class="el-form-item-msg"></div>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="联系电话" prop="contact_mobile">
+                            <el-input v-model="formData.contact_mobile" clearable placeholder="请输入联系电话"></el-input>
+                            <div class="el-form-item-msg"></div>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="到期时间" prop="vip_end">
+                            <el-date-picker v-model="formData.vip_end" :style="{width: '100%'}" placeholder="请选择" />
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+            </fieldset>
+            <fieldset v-if="mode=='add'">
+                <legend><el-tag>主账号信息</el-tag></legend>
+                <el-row :gutter="15">
+                    <el-col :span="12">
+                        <el-form-item label="登录账号" prop="username">
+                            <el-input v-model="formData.username" clearable placeholder="请输入登录账号"></el-input>
+                            <div class="el-form-item-msg"></div>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="用户名称" prop="truename">
+                            <el-input v-model="formData.truename" clearable placeholder="请输入用户名称"></el-input>
+                            <div class="el-form-item-msg"></div>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="登录密码" prop="password">
+                            <el-input type="password" v-model="formData.password" clearable show-password placeholder="请输入登录密码"></el-input>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="确认密码" prop="password2">
+                            <el-input type="password" v-model="formData.password2" clearable show-password placeholder="请再次输入密码"></el-input>
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+            </fieldset>
+        </el-form>
+		<template #footer>
+			<el-button @click="visible=false" >取 消</el-button>
+			<el-button type="primary" :loading="isSaveing" @click="submit()">提交</el-button>
+		</template>
+    </el-dialog>
+</template>
+<script>
+export default{
+    data(){
+        return {
+            stepActive:1,
+            loading: false,
+            mode:"add",
+            titleMap:{
+                add:"新增代理",
+                edit:"编辑基础信息"
+            },
+            visible: false,
+            isSaveing: false,
+            formData:{},
+            time:0,
+            submitState:false,
+            disabled:false,
+            rules:{
+                name: [
+                    {required: true, message: '请输入'}
+                ],
+                vip_end: [
+                    {required: true, message: "请选择到期时间",trigger: 'blur'}
+                ],
+                contact_name: [
+                    {required: true, message: '请输入'}
+                ],
+                username: [
+                    {required: true, message: '请输入登录账号'}
+                ],
+                truename: [
+                    {required: true, message: '请输入账号名称'}
+                ],
+                password: [
+                    {required: true, message: '请输入登录密码'}
+                ],
+                password2: [
+                    {required: true, message: '请再次输入密码'},
+                    {validator: (rule, value, callback) => {
+                        if (value !== this.formData.password) {
+                            callback(new Error('两次输入密码不一致!'));
+                        }else{
+                            callback();
+                        }
+                    }}
+                ],
+            }
+        }
+    },
+    methods:{
+        handleSuccess(data){
+            this.formData.agent = data;
+            this.formData.parent_id = data.user_id;
+        },
+        clearUser(){
+            this.formData.agent = "";
+            this.formData.parent_id = "";
+        },
+        selectUser(){
+            this.$nextTick(() => {
+                this.$refs.storeData.open()
+            })
+        },
+        open(mode = 'add'){
+            this.mode = mode;
+            this.visible = true;
+            this.generateRandomNumber()
+            return this
+        },
+        generateRandomNumber() {
+            this.formData.code = "DF"+Math.random().toString().slice(2, 13);
+        },
+        //表单注入数据
+        setData(data){
+            this.formData = data;
+        },
+        async submit(){
+            var validate = await this.$refs.dialogForm.validate().catch(()=>{});
+            if(!validate){ return false }
+            let submitData = JSON.parse(JSON.stringify(this.formData));
+            if (this.formData.vip_end) {
+                submitData.vip_end = this.$TOOL.dateFormat(this.formData.vip_end, "yyyy-MM-dd");
+            }
+            if (this.mode == 'add') {
+                submitData.password = this.$TOOL.crypto.MD5(this.formData.password)
+                submitData.password2 = this.$TOOL.crypto.MD5(this.formData.password2)
+                submitData.scene = "merchant_register";
+                var resp = await this.$API.agent.save.post(submitData);
+            } else {
+                var resp = await this.$API.agent.edit.post(submitData);
+            }
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.visible = false;
+            this.formData = {};
+            this.submitState = false;
+            this.$emit("success");
+        }
+    }
+}
+</script>
+<style>
+.mt20 {margin-top: 20px;}
+.login-msg-yzm {display: flex;width: 100%;}
+.login-msg-yzm .el-button {margin-left: 10px;--el-button-size:42px;}
+</style>

+ 57 - 0
src/views/manage/agent/components/option.vue

@@ -0,0 +1,57 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">按需操作</el-tag>
+        </legend>
+        <div class="op-header">
+            <div class="left-panel">
+                <el-button type="primary" icon="el-icon-plus" @click="table_add()">新增代理</el-button>
+                <el-button icon="el-icon-document" @click="table_batch_status(1)" :disabled="dataSelect.length>0?false:true">启用</el-button>
+                <el-button icon="el-icon-lock" @click="table_batch_status(0)" :disabled="dataSelect.length>0?false:true">禁用</el-button>
+                <!-- <el-button type="primary" icon="el-icon-download" @click="table_export()">导出</el-button> -->
+            </div>
+        </div>
+    </fieldset>
+    <formMain ref="formMain" @success="handleSuccess"></formMain>
+</template>
+
+<script>
+import formMain from './form';
+export default {
+    components: {
+        formMain
+    },
+    props: {
+        type: { type: String, default: "1" },
+        dataSelect: { type: Array, default: () => [] },
+        dataSelectFull: { type: Array, default: () => [] }
+    },
+    data(){
+        return {
+
+        }
+    },
+    methods: {
+        async table_batch_status(status){
+            if (this.dataSelect.length == 0) {
+                return this.$message.error("请选择修改数据")
+            }
+            let submitData = {"id":this.dataSelect,"value":status,"field":"status","type":"batch"};
+            var resp = await this.$API.agent.batch.post(submitData);
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.$emit("success");
+        },
+        handleSuccess(){
+            this.$emit("success");
+        },
+        table_add(){
+            this.$nextTick(() => {
+                this.$refs.formMain.open()
+            })
+        },
+    }
+}
+</script>

+ 54 - 0
src/views/manage/agent/components/search.vue

@@ -0,0 +1,54 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">条件筛选</el-tag>
+        </legend>
+        <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right" label-width="100px">
+            <div class="search-form">
+                <div class="form-left">
+                    <el-row :gutter="10">
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-input v-model="searchKey.truename" placeholder="地址名称" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>代理名称</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-input v-model="searchKey.mobile" placeholder="手机号码" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>联系电话</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-select v-model="searchKey.status" clearable placeholder="请选择状态" @change="searchForm" :style="{width: '100%'}" class="diy-select">
+                                <el-option value="1" label="冻结"></el-option>
+                                <el-option value="2" label="正常"></el-option>
+                                <template #prefix>状态</template>
+                            </el-select>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-date-picker v-model="searchKey.create" :style="{width: '100%'}" placeholder="请选择创建时间" start-placeholder="开始时间" end-placeholder="结束时间" type="daterange" range-separator="至" @change="searchForm" />
+                        </el-col>
+                    </el-row>
+                </div>
+                <div class="form-line"></div>
+                <div class="form-right">
+                    <el-button type="primary" icon="el-icon-search" @click="searchForm">搜索</el-button>
+                </div>
+            </div>
+        </el-form>
+    </fieldset>
+</template>
+
+<script>
+export default {
+    data(){
+        return {
+            searchKey:{}
+        }
+    },
+    methods: {
+        searchForm(){
+            this.$emit("success",this.searchKey);
+        }
+    }
+}
+</script>

+ 114 - 0
src/views/manage/agent/components/table.vue

@@ -0,0 +1,114 @@
+<template>
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+        <el-table-column type="selection" width="50" fixed="left"></el-table-column>
+        <el-table-column label="代理名称" width="150" fixed="left" prop="name"></el-table-column>
+        <el-table-column label="代理ID" prop="agent_id"></el-table-column>
+        <el-table-column label="到期时间" prop="vip_end"></el-table-column>
+        <el-table-column label="联系人" prop="truename">
+            <template #default="scope">
+                <span v-if="scope.row.contact_name">{{ scope.row.contact_name }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="联系电话" prop="mobile" width="150">
+            <template #default="scope">
+                <span v-if="scope.row.contact_mobile">{{ scope.row.contact_mobile }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="状态" prop="status" width="120" align="center">
+            <template #default="scope">
+                <div class="status-success" v-if="scope.row.status==1"><sc-status-indicator type="success"></sc-status-indicator> 正常</div>
+                <div class="status-danger" v-else><sc-status-indicator type="danger"></sc-status-indicator> 禁用</div>
+            </template>
+        </el-table-column>
+        <el-table-column label="注册时间" prop="create_at" width="180"></el-table-column>
+        <el-table-column label="操作" width="200" align="center" fixed="right">
+            <template #default="scope">
+                <el-button-group>
+                    <el-button text type="primary" size="small" @click="table_view(scope.row)">编辑</el-button>
+                    <el-button text type="danger" size="small" @click="table_del(scope.row)">删除</el-button>
+                </el-button-group>
+            </template>
+        </el-table-column>
+    </scTable>
+    <formMain ref="formMain" @success="handleSuccess"></formMain>
+</template>
+
+<script>
+import formMain from './form';
+export default {
+    components: {
+        formMain
+    },
+    data(){
+        return {
+            list: {
+                apiObj: this.$API.agent.list
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    
+    methods: {
+        table_view(data){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("edit").setData(data)
+            })
+        },
+        table_del(data){
+            this.$confirm(`删除代理后,所有有关该代理的店铺、门店、授权、订单等信息都将删除,不可恢复,确定要执行删除吗`, '提示', {
+                type: 'warning'
+            }).then(async ()=>{
+                var resp = await this.$API.agent.del.post({"id":data.id});
+                if (resp.code == 0) {
+                    return this.$message.warning(resp.msg);
+                }
+                this.$message.success(resp.msg);
+                this.$emit("success");
+            }).catch(()=>{})
+        },
+        refresh(){
+            this.$refs.table.refresh()
+        },
+        upData(data){
+            this.$refs.table.upData(data)
+        },
+        handleSuccess(){
+            this.$refs.table.refresh()
+        },
+        sortChange(event){
+            if (event.order) {
+                var data = {
+                    "field":event.prop,
+                    "order":event.order
+                }
+                this.$refs.table.upData(data)
+            } else {
+                this.$refs.table.reload(this.searchKey)
+            }
+            return ;
+        },
+        selectionChange(event){
+            this.dataSelect = [];
+            var arr = [];
+            var arrCompany = [];
+            event.forEach(function(val,index){
+                arr[index] = val.id;
+                arrCompany[index] = val;
+            });
+            this.dataSelectFull = arrCompany;
+            this.dataSelect = arr;
+            this.$emit("success",this.dataSelect);
+            this.$emit("successFull",this.dataSelectFull);
+        },
+        table_passwd(row){
+            this.$nextTick(() => {
+                this.$refs.userPasswd.open("edit").setData(row)
+            })
+        }
+    }
+}
+</script>

+ 46 - 63
src/views/manage/mall/wechat/index.vue → src/views/manage/agent/index.vue

@@ -1,64 +1,47 @@
-<template>
-    <el-container class="flex-column">
-        <div class="channel_menu">
-            <el-menu mode="horizontal" class="channel-tabs" :default-active="activeName" @select="handleClick">
-                <el-menu-item :index="item.key" v-for="(item,indx) in menuData" :key="indx">{{item.name}}</el-menu-item>
-            </el-menu>
-        </div>
-        <div class="table-search">
-            <search @success="handleSuccess"></search>
-            <optionBtn @success="handleSuccess" :dataSelect="dataSelect" :dataSelectFull="dataSelectFull" ></optionBtn>
-        </div>
-        <el-main class="nopadding">
-            <div class="table-container">
-                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull"></tablePage>
-            </div>
-        </el-main>
-    </el-container>  
-</template>
-
-<script>
-import search from './components/search';
-import optionBtn from './components/option';
-import tablePage from './components/table';
-export default {
-    components: {
-        search,tablePage,optionBtn
-    },
-    data(){
-        return {
-            menuData:[],
-            searchKey:{},
-            dataSelect:[],
-            dataSelectFull:[],
-        }
-    },
-    mounted(){
-        // this.getMenuData();
-    },
-    methods: {
-        tableHandle(data){
-            this.dataSelect = data;
-        },
-        tableHandleFull(data){
-            this.dataSelectFull = data;
-        },
-        handleSuccess(data){
-            this.$refs.tablePage.upData(data)
-        },
-        async getMenuData(){
-            var resp = await this.$API.common.menu.get({"type":"account"});
-            if (resp.code !== 1) {
-                return this.$message.error(resp.msg);
-            }
-            this.activeName = resp.data.default;
-            this.menuData = resp.data.menu;
-        },
-        handleClick(name){
-            this.activeName = name;
-            this.searchKey.type = name;
-            this.$refs.tablePage.upData(this.searchKey)
-        }
-    }
-}
+<template>
+    <el-container class="flex-column">
+        <div class="table-search">
+            <search @success="handleSuccess"></search>
+            <optionBtn @success="handleSuccess" :dataSelect="dataSelect" :dataSelectFull="dataSelectFull" type="3"></optionBtn>
+        </div>
+        <el-main class="nopadding">
+            <div class="table-container">
+                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull" type="3"></tablePage>
+            </div>
+        </el-main>
+    </el-container>  
+</template>
+
+<script>
+import search from './components/search';
+import optionBtn from './components/option';
+import tablePage from './components/table';
+export default {
+    components: {
+        search,tablePage,optionBtn
+    },
+    data(){
+        return {
+            searchKey:{},
+            dataSelect:[],
+            dataSelectFull:[],
+        }
+    },
+    methods: {
+        tableHandle(data){
+            this.dataSelect = data;
+        },
+        tableHandleFull(data){
+            this.dataSelectFull = data;
+        },
+        handleSuccess(data){
+            this.$refs.tablePage.upData(data)
+        },
+        handleClick(name){
+            this.activeName = name;
+            this.searchKey.type = name;
+            this.$refs.tablePage.upData(this.searchKey)
+        }
+    }
+}
 </script>

+ 22 - 26
src/views/manage/components/agent.vue

@@ -12,8 +12,8 @@
                     <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right">
                         <el-row :gutter="10">
                             <el-col :span="18" :xs="12">
-                                <el-form-item label=" " prop="truename">
-                                    <el-input v-model="searchKey.truename" placeholder="请输入代理名称" clearable
+                                <el-form-item label=" " prop="name">
+                                    <el-input v-model="searchKey.name" placeholder="请输入代理名称" clearable
                                         :style="{width: '100%'}"></el-input>
                                 </el-form-item>
                             </el-col>
@@ -32,28 +32,26 @@
                         <el-table-column width="50" fixed="left">
                             <div class="checkbox"></div>
                         </el-table-column>
-                        <el-table-column label="代理名称" width="150" fixed="left" prop="truename"></el-table-column>
-                        <el-table-column label="联系人" width="150" prop="contact"></el-table-column>
-                        <el-table-column label="代理ID" width="150" prop="agent_id"></el-table-column>
-                        <el-table-column label="主账号登录账号" prop="truename" width="200">
+                        <el-table-column label="代理名称" width="150" fixed="left" prop="name"></el-table-column>
+                        <el-table-column label="代理ID" prop="agent_id" width="150"></el-table-column>
+                        <el-table-column label="联系人" prop="truename" width="150">
                             <template #default="scope">
-                                <span v-if="scope.row.user">{{ scope.row.user.username?scope.row.user.username:'-' }}</span>
+                                <span v-if="scope.row.contact_name">{{ scope.row.contact_name }}</span>
                                 <span class="status-danger" v-else>未设置</span>
                             </template>
                         </el-table-column>
-                        <el-table-column label="手机号码" prop="mobile" width="150">
+                        <el-table-column label="联系电话" prop="mobile" width="150">
                             <template #default="scope">
-                                <span v-if="scope.row.mobile">{{ scope.row.mobile }}</span>
-                                <span class="status-danger" v-else>-</span>
+                                <span v-if="scope.row.contact_mobile">{{ scope.row.contact_mobile }}</span>
+                                <span class="status-danger" v-else>未设置</span>
                             </template>
                         </el-table-column>
-                        <el-table-column label="到期时间" prop="vip_at" width="220"></el-table-column>
-                        <el-table-column label="创建时间" prop="create_at" width="180"></el-table-column>
+                        <el-table-column label="到期时间" prop="vip_end" width="220"></el-table-column>
+                        <el-table-column label="注册时间" prop="create_at" width="180"></el-table-column>
                         <el-table-column label="状态" prop="status" width="120" align="center">
                             <template #default="scope">
                                 <div class="status-success" v-if="scope.row.status==1"><sc-status-indicator type="success"></sc-status-indicator> 正常</div>
-                                <div class="status-danger" v-if="scope.row.status==2"><sc-status-indicator type="danger"></sc-status-indicator> 已冻结</div>
-                                <div class="status-danger" v-if="scope.row.status==3"><sc-status-indicator type="danger"></sc-status-indicator> 已到期</div>
+                                <div class="status-danger" v-else><sc-status-indicator type="danger"></sc-status-indicator> 禁用</div>
                             </template>
                         </el-table-column>
                     </scTable>
@@ -61,28 +59,26 @@
                 <div class="main-body-wrap" v-else>
                     <scTable ref="table" :apiObj="list.apiObj" :hideSetting="true" paginationLayout="total, prev, pager, next" :params="searchKey" @selectionChange="selectionChange" row-key="id" @sortChange="sortChange">
                         <el-table-column type="selection" width="50" fixed="left"></el-table-column>
-                        <el-table-column label="代理名称" width="150" fixed="left" prop="truename"></el-table-column>
-                        <el-table-column label="联系人" width="150" prop="contact"></el-table-column>
-                        <el-table-column label="代理ID" width="150" prop="agent_id"></el-table-column>
-                        <el-table-column label="主账号登录账号" prop="truename" width="200">
+                        <el-table-column label="代理名称" width="150" fixed="left" prop="name"></el-table-column>
+                        <el-table-column label="代理ID" prop="agent_id" width="150"></el-table-column>
+                        <el-table-column label="联系人" prop="truename" width="150">
                             <template #default="scope">
-                                <span v-if="scope.row.user">{{ scope.row.user.username?scope.row.user.username:'-' }}</span>
+                                <span v-if="scope.row.contact_name">{{ scope.row.contact_name }}</span>
                                 <span class="status-danger" v-else>未设置</span>
                             </template>
                         </el-table-column>
-                        <el-table-column label="手机号码" prop="mobile" width="150">
+                        <el-table-column label="联系电话" prop="mobile" width="150">
                             <template #default="scope">
-                                <span v-if="scope.row.mobile">{{ scope.row.mobile }}</span>
-                                <span class="status-danger" v-else>-</span>
+                                <span v-if="scope.row.contact_mobile">{{ scope.row.contact_mobile }}</span>
+                                <span class="status-danger" v-else>未设置</span>
                             </template>
                         </el-table-column>
-                        <el-table-column label="到期时间" prop="vip_at" width="220"></el-table-column>
-                        <el-table-column label="创建时间" prop="create_at" width="180"></el-table-column>
+                        <el-table-column label="到期时间" prop="vip_end" width="220"></el-table-column>
+                        <el-table-column label="注册时间" prop="create_at" width="180"></el-table-column>
                         <el-table-column label="状态" prop="status" width="120" align="center">
                             <template #default="scope">
                                 <div class="status-success" v-if="scope.row.status==1"><sc-status-indicator type="success"></sc-status-indicator> 正常</div>
-                                <div class="status-danger" v-if="scope.row.status==2"><sc-status-indicator type="danger"></sc-status-indicator> 已冻结</div>
-                                <div class="status-danger" v-if="scope.row.status==3"><sc-status-indicator type="danger"></sc-status-indicator> 已到期</div>
+                                <div class="status-danger" v-else><sc-status-indicator type="danger"></sc-status-indicator> 禁用</div>
                             </template>
                         </el-table-column>
                     </scTable>

+ 46 - 43
src/views/manage/components/store.vue

@@ -12,8 +12,8 @@
                     <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right">
                         <el-row :gutter="10">
                             <el-col :span="18" :xs="12">
-                                <el-form-item label=" " prop="truename">
-                                    <el-input v-model="searchKey.truename" placeholder="请输入店名称" clearable
+                                <el-form-item label=" " prop="name">
+                                    <el-input v-model="searchKey.name" placeholder="请输入店名称" clearable
                                         :style="{width: '100%'}"></el-input>
                                 </el-form-item>
                             </el-col>
@@ -32,88 +32,91 @@
                         <el-table-column width="50" fixed="left">
                             <div class="checkbox"></div>
                         </el-table-column>
-                        <el-table-column label="门店名称" width="150" fixed="left" prop="truename"></el-table-column>
-                        <el-table-column label="门店ID" width="150" prop="store_id"></el-table-column>
-                        <el-table-column label="所属代理" width="150" prop="agent_id"></el-table-column>
-                        <el-table-column label="登录账号" prop="truename" width="150">
+                        <el-table-column label="店铺名称" width="200" fixed="left" prop="store_name"></el-table-column>
+                        <el-table-column label="账户ID" prop="store_id" width="200"></el-table-column>
+                        <el-table-column label="所属代理" prop="agent" width="150">
                             <template #default="scope">
-                                <span v-if="scope.row.user.username">{{ scope.row.user.username }}</span>
+                                <span v-if="scope.row.agent">{{ scope.row.agent.name }}</span>
                                 <span class="status-danger" v-else>未设置</span>
                             </template>
                         </el-table-column>
-                        <el-table-column label="手机号码" prop="mobile" width="150">
+                        <el-table-column label="呼叫快递" prop="express_time" width="150">
                             <template #default="scope">
-                                <span v-if="scope.row.mobile">{{ scope.row.mobile }}</span>
-                                <span class="status-danger" v-else>-</span>
+                                <span v-if="scope.row.express_time>0">{{ scope.row.express_time }}点后</span>
+                                <span class="status-danger" v-else>实时</span>
                             </template>
                         </el-table-column>
-                        <el-table-column label="门店编码" prop="login_at" width="180">
+                        <el-table-column label="核销时机" prop="order_end" width="150">
                             <template #default="scope">
-                                {{scope.row.store_code?scope.row.store_code:'-'}}
+                                <span v-if="scope.row.order_end==1">订单提交后</span>
+                                <span v-if="scope.row.order_end==2">快递取件后</span>
+                                <span v-if="scope.row.order_end==3">快递签收后</span>
                             </template>
                         </el-table-column>
-                        <el-table-column label="店长名称" prop="login_at" width="180">
+                        <el-table-column label="联系人" prop="express_name" width="150">
                             <template #default="scope">
-                                {{scope.row.store_mch?scope.row.store_mch:'-'}}
+                                <span v-if="scope.row.express_name">{{ scope.row.express_name }}</span>
+                                <span class="status-danger" v-else>未设置</span>
                             </template>
                         </el-table-column>
-                        <el-table-column label="门店状态" prop="login_at" width="100" align="center">
+                        <el-table-column label="联系电话" prop="express_mobile" width="150">
                             <template #default="scope">
-                                <div class="status-success" v-if="scope.row.store_status==1"><sc-status-indicator type="success"></sc-status-indicator> 开启</div>
-                                <div class="status-danger" v-else><sc-status-indicator type="danger"></sc-status-indicator> 关闭</div>
+                                <span v-if="scope.row.express_mobile">{{ scope.row.express_mobile }}</span>
+                                <span class="status-danger" v-else>未设置</span>
                             </template>
                         </el-table-column>
-                        <el-table-column label="独立财务" prop="login_at" width="100" align="center">
+                        <el-table-column label="状态" prop="status" width="120" align="center">
                             <template #default="scope">
-                                <div class="status-success" v-if="scope.row.store_order==2"><sc-status-indicator type="success"></sc-status-indicator> 开启</div>
-                                <div class="status-danger" v-else><sc-status-indicator type="danger"></sc-status-indicator> 关闭</div>
+                                <div class="status-success" v-if="scope.row.status==1"><sc-status-indicator type="success"></sc-status-indicator> 正常</div>
+                                <div class="status-danger" v-else><sc-status-indicator type="danger"></sc-status-indicator> 禁用</div>
                             </template>
                         </el-table-column>
-                        <el-table-column label="到期时间" prop="vip_at" width="220"></el-table-column>
+                        <el-table-column label="创建时间" prop="create_at" width="180"></el-table-column>
                     </scTable>
                 </div>
                 <div class="main-body-wrap" v-else>
                     <scTable ref="table" :apiObj="list.apiObj" :hideSetting="true" paginationLayout="total, prev, pager, next" :params="searchKey" @selectionChange="selectionChange" row-key="id" @sortChange="sortChange">
                         <el-table-column type="selection" width="50" fixed="left"></el-table-column>
-                        
-                        <el-table-column label="门店名称" width="150" fixed="left" prop="truename"></el-table-column>
-                        <el-table-column label="门店ID" width="150" prop="store_id"></el-table-column>
-                        <el-table-column label="所属代理" width="150" prop="agent_id"></el-table-column>
-                        <el-table-column label="登录账号" prop="truename" width="150">
+                        <el-table-column label="店铺名称" width="200" fixed="left" prop="store_name"></el-table-column>
+                        <el-table-column label="账户ID" prop="store_id" width="200"></el-table-column>
+                        <el-table-column label="所属代理" prop="agent" width="150">
                             <template #default="scope">
-                                <span v-if="scope.row.user.username">{{ scope.row.user.username }}</span>
+                                <span v-if="scope.row.agent">{{ scope.row.agent.name }}</span>
                                 <span class="status-danger" v-else>未设置</span>
                             </template>
                         </el-table-column>
-                        <el-table-column label="手机号码" prop="mobile" width="150">
+                        <el-table-column label="呼叫快递" prop="express_time" width="150">
                             <template #default="scope">
-                                <span v-if="scope.row.mobile">{{ scope.row.mobile }}</span>
-                                <span class="status-danger" v-else>-</span>
+                                <span v-if="scope.row.express_time>0">{{ scope.row.express_time }}点后</span>
+                                <span class="status-danger" v-else>实时</span>
                             </template>
                         </el-table-column>
-                        <el-table-column label="门店编码" prop="login_at" width="180">
+                        <el-table-column label="核销时机" prop="order_end" width="150">
                             <template #default="scope">
-                                {{scope.row.store_code?scope.row.store_code:'-'}}
+                                <span v-if="scope.row.order_end==1">订单提交后</span>
+                                <span v-if="scope.row.order_end==2">快递取件后</span>
+                                <span v-if="scope.row.order_end==3">快递签收后</span>
                             </template>
                         </el-table-column>
-                        <el-table-column label="店长名称" prop="login_at" width="180">
+                        <el-table-column label="联系人" prop="express_name" width="150">
                             <template #default="scope">
-                                {{scope.row.store_mch?scope.row.store_mch:'-'}}
+                                <span v-if="scope.row.express_name">{{ scope.row.express_name }}</span>
+                                <span class="status-danger" v-else>未设置</span>
                             </template>
                         </el-table-column>
-                        <el-table-column label="门店状态" prop="login_at" width="100" align="center">
+                        <el-table-column label="联系电话" prop="express_mobile" width="150">
                             <template #default="scope">
-                                <div class="status-success" v-if="scope.row.store_status==1"><sc-status-indicator type="success"></sc-status-indicator> 开启</div>
-                                <div class="status-danger" v-else><sc-status-indicator type="danger"></sc-status-indicator> 关闭</div>
+                                <span v-if="scope.row.express_mobile">{{ scope.row.express_mobile }}</span>
+                                <span class="status-danger" v-else>未设置</span>
                             </template>
                         </el-table-column>
-                        <el-table-column label="独立财务" prop="login_at" width="100" align="center">
+                        <el-table-column label="状态" prop="status" width="120" align="center">
                             <template #default="scope">
-                                <div class="status-success" v-if="scope.row.store_order==2"><sc-status-indicator type="success"></sc-status-indicator> 开启</div>
-                                <div class="status-danger" v-else><sc-status-indicator type="danger"></sc-status-indicator> 关闭</div>
+                                <div class="status-success" v-if="scope.row.status==1"><sc-status-indicator type="success"></sc-status-indicator> 正常</div>
+                                <div class="status-danger" v-else><sc-status-indicator type="danger"></sc-status-indicator> 禁用</div>
                             </template>
                         </el-table-column>
-                        <el-table-column label="到期时间" prop="vip_at" width="220"></el-table-column>
+                        <el-table-column label="创建时间" prop="create_at" width="180"></el-table-column>
                     </scTable>
                 </div>
             </div>
@@ -136,8 +139,8 @@ export default{
             loading: false,
             mode:"add",
             titleMap:{
-                add:"选择店",
-                edit:"选择店"
+                add:"选择店",
+                edit:"选择店"
             },
             list: {
                 apiObj: this.$API.store.list

+ 136 - 165
src/views/manage/dashboard/index.vue

@@ -11,210 +11,180 @@
 	</div>
     <el-main>
         <div class="card-news mt0">
-            <div class="news-title">{{ $t('manage.dashboard.orderTitle') }}</div>
+            <div class="news-title">经营数据</div>
             <div class="total-panel">
-                <div class="panel-item">
+                <div :class="this.$store.state.global.ismobile?'panel-item m':'panel-item'" style="background-color: rgb(235, 241, 255);">
                     <div class="item-warp">
                         <div class="left">
-                            <div class="title">代理数量</div>
-                            <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}</div>
-                            <div class="desc">{{ $t('store.dashboard.yestoday') }} 0</div>
-                        </div>
-                        <div class="right"><img src="@/assets/image/wave-4-icon.png" /></div>
-                    </div>
-                    <div class="item-wave"><img src="@/assets/image/wave-4.png" /></div>
-                </div>
-                <div class="panel-item">
-                    <div class="item-warp">
-                        <div class="left">
-                            <div class="title">门店数量</div>
-                            <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}</div>
-                            <div class="desc">{{ $t('store.dashboard.yestoday') }} 0</div>
-                        </div>
-                        <div class="right"><img src="@/assets/image/wave-4-icon.png" /></div>
-                    </div>
-                    <div class="item-wave"><img src="@/assets/image/wave-4.png" /></div>
-                </div>
-                <div class="panel-item">
-                    <div class="item-warp">
-                        <div class="left">
-                            <div class="title">洗衣地址数量</div>
-                            <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}</div>
-                            <div class="desc">{{ $t('store.dashboard.yestoday') }} 0</div>
-                        </div>
-                        <div class="right"><img src="@/assets/image/wave-4-icon.png" /></div>
-                    </div>
-                    <div class="item-wave"><img src="@/assets/image/wave-4.png" /></div>
-                </div>
-                <div class="panel-item">
-                    <div class="item-warp">
-                        <div class="left">
-                            <div class="title">订单数</div>
-                            <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}</div>
-                            <div class="desc">{{ $t('store.dashboard.yestoday') }} 0</div>
+                            <div class="title">今日营业额(元)</div>
+                            <div class="number">{{ todayData.order_money ? todayData.order_money:'0' }}</div>
+                            <div class="desc">来客订单金额</div>
                         </div>
                         <div class="right"><img src="@/assets/image/wave-1-icon.png" /></div>
                     </div>
                     <div class="item-wave"><img src="@/assets/image/wave-1.png" /></div>
                 </div>
-                <div class="panel-item">
+                <div :class="this.$store.state.global.ismobile?'panel-item m':'panel-item'" style="background-color: rgb(240, 235, 255);">
                     <div class="item-warp">
                         <div class="left">
-                            <div class="title">新增客户</div>
-                            <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}</div>
-                            <div class="desc">{{ $t('store.dashboard.yestoday') }} 0</div>
+                            <div class="title">今日订单数(单)</div>
+                            <div class="number">{{ todayData.order_num ? todayData.order_num:'0' }}</div>
+                            <div class="desc">来客订单</div>
                         </div>
                         <div class="right"><img src="@/assets/image/wave-2-icon.png" /></div>
                     </div>
                     <div class="item-wave"><img src="@/assets/image/wave-2.png" /></div>
                 </div>
-                <div class="panel-item">
+                <div :class="this.$store.state.global.ismobile?'panel-item m':'panel-item'" style="background-color: rgb(255, 241, 214);">
                     <div class="item-warp">
                         <div class="left">
-                            <div class="title">收衣数</div>
-                            <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}</div>
-                            <div class="desc">{{ $t('store.dashboard.yestoday') }} 0</div>
+                            <div class="title">今日核销(单)</div>
+                            <div class="number">{{ todayData.order_done ? todayData.order_done:'0' }}</div>
+                            <div class="desc">已完成核销</div>
                         </div>
                         <div class="right"><img src="@/assets/image/wave-3-icon.png" /></div>
                     </div>
                     <div class="item-wave"><img src="@/assets/image/wave-3.png" /></div>
                 </div>
-                <div class="panel-item">
+                <div :class="this.$store.state.global.ismobile?'panel-item m':'panel-item'" style="background-color: rgb(250, 230, 244);">
                     <div class="item-warp">
                         <div class="left">
-                            <div class="title">取衣数</div>
-                            <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}</div>
-                            <div class="desc">{{ $t('store.dashboard.yestoday') }} 0</div>
+                            <div class="title">今日待发货(单)</div>
+                            <div class="number">{{ todayData.order_send ? todayData.order_send:'0' }}</div>
+                            <div class="desc">待发快递</div>
                         </div>
                         <div class="right"><img src="@/assets/image/wave-4-icon.png" /></div>
                     </div>
                     <div class="item-wave"><img src="@/assets/image/wave-4.png" /></div>
                 </div>
+                <div :class="this.$store.state.global.ismobile?'panel-item m':'panel-item'" style="background-color: rgb(235, 255, 248);">
+                    <div class="item-warp">
+                        <div class="left">
+                            <div class="title">店铺数量</div>
+                            <div class="number">{{ todayData.store_num ? todayData.store_num:'0' }}</div>
+                            <div class="desc">开通绑定店铺数量</div>
+                        </div>
+                        <div class="right"><img src="@/assets/image/wave-5-icon.png" /></div>
+                    </div>
+                    <div class="item-wave"><img src="@/assets/image/wave-5.png" /></div>
+                </div>
             </div>
         </div>
-        <el-row :gutter="20">
-            <el-col :span="this.$store.state.global.ismobile?24:24" :xs="24">
+        <el-row :gutter="10">
+            <el-col :span="this.$store.state.global.ismobile?24:12">
                 <div class="card-news mt10">
-                    <div class="news-title">门店监控</div>
-                    <div class="total-panel-sub">
-                        <el-row :gutter="20">
-                            <el-col :span="this.$store.state.global.ismobile?24:12" :xs="24">
-                                <div class="sub-card mt10">
-                                    <div class="title">今日数据</div>
-                                    <div class="sub-content">
-                                        <div class="sub-box">
-                                            <div class="row1"><img src="@/assets/image/store1.png" /><span>今日收衣件数</span></div>
-                                            <div class="row2">0</div>
-                                            <div class="row3">{{ $t('store.dashboard.yestoday') }} 0</div>
-                                        </div>
-                                        <div class="sub-box">
-                                            <div class="row1"><img src="@/assets/image/store2.png" /><span>今日已支付(元)</span></div>
-                                            <div class="row2">0</div>
-                                            <div class="row3">{{ $t('store.dashboard.yestoday') }} 0</div>
-                                        </div>
-                                        <div class="sub-box">
-                                            <div class="row1"><img src="@/assets/image/store3.png" /><span>今日订单数</span></div>
-                                            <div class="row2">0</div>
-                                            <div class="row3">{{ $t('store.dashboard.yestoday') }} 0</div>
-                                        </div>
-                                    </div>
-                                </div>
-                            </el-col>
-                            <el-col :span="this.$store.state.global.ismobile?24:12" :xs="24">
-                                <div class="sub-card mt10">
-                                    <div class="title">过往数据</div>
-                                    <div class="sub-content">
-                                        <div class="sub-box" style="width: calc(50% - 12px);">
-                                            <div class="row1"><img src="@/assets/image/store4.png" /><span>本月订单数</span></div>
-                                            <div class="row2">0</div>
-                                            <div class="row3">{{ $t('store.dashboard.yestoday') }} 0</div>
-                                        </div>
-                                        <div class="sub-box" style="width: calc(50% - 12px);">
-                                            <div class="row1"><img src="@/assets/image/store5.png" /><span>累计订单数</span></div>
-                                            <div class="row2">0</div>
-                                            <div class="row3">{{ $t('store.dashboard.yestoday') }} 0</div>
-                                        </div>
-                                    </div>
-                                </div>
-                            </el-col>
-                        </el-row>
-                    </div>
+                    <scEcharts height="500px" :option="option2"></scEcharts>
                 </div>
+            </el-col>
+            <el-col :span="this.$store.state.global.ismobile?24:12">
                 <div class="card-news mt10">
-                    <div class="news-title">洗衣地址监控</div>
-                    <div class="total-panel">
-                        <div class="panel-item bg-gray" :style="{backgroundImage:'url('+blueBg+')'}">
-                            <div class="item-warp img">
-                                <div class="left">
-                                    <div class="title">今日入库</div>
-                                    <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}<span>单</span></div>
-                                    <div class="desc">总件数:0</div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="panel-item bg-gray">
-                            <div class="item-warp">
-                                <div class="left">
-                                    <div class="title">在库量</div>
-                                    <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}<span>单</span></div>
-                                    <div class="desc">总件数:0</div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="panel-item bg-gray">
-                            <div class="item-warp">
-                                <div class="left">
-                                    <div class="title">近一个月待入库量</div>
-                                    <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}<span>单</span></div>
-                                    <div class="desc">总件数:0</div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="panel-item bg-gray">
-                            <div class="item-warp">
-                                <div class="left">
-                                    <div class="title">待预检量</div>
-                                    <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}<span>单</span></div>
-                                    <div class="desc">总件数:0</div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="panel-item bg-gray">
-                            <div class="item-warp">
-                                <div class="left">
-                                    <div class="title">今日出库</div>
-                                    <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}<span>单</span></div>
-                                    <div class="desc">总件数:0</div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                    <!--  -->
+                    <scEcharts height="500px" :option="option"></scEcharts>
                 </div>
-                
-                
             </el-col>
         </el-row>
-
     </el-main>
 </template>
 
 <script>
 import blueBg from "@/assets/image/blue_bg.png";
+import scEcharts from '@/components/scEcharts';
 export default {
     name: "dashboard",
+    components: {
+        scEcharts
+    },
     data(){
         return {
             pageLoading: false,
             dashboard: '0',
+            todayData:{},
             dataInfo:{},
             blueBg,
-            baseData:{}
+            baseData:{},
+            option: {},
+            option2: {},
         }
     },
     created(){
         var baseData = this.$TOOL.data.get("AGENT_SERVICE");
         this.baseData = baseData;
+        // this.getData()
+    },
+    methods: {
+        async getData(){
+            var loading = this.$loading();
+            var resp = await this.$API.dash.manage.get();
+            loading.close();
+            this.todayData = resp.data.today;
+            let data = resp.data.moneys;
+            let moneyDay = data.map(function (item) {
+                return item['当天日期'];
+            });
+            let data2 = resp.data.orders;
+            let orderDay = data2.map(function (item) {
+                return item['当天日期'];
+            });
+            this.option = {
+                title: {
+                    left: 'left', 
+                    text: '近15天订单数据',
+                },
+                grid: {
+                    top: '80px'
+                },
+                tooltip: {trigger: 'axis', show: true, axisPointer: {type: 'cross', label: {}}},
+                xAxis: [{data: orderDay, gridIndex: 0}],
+                yAxis: [
+                    {
+                        splitLine: {show: true}, gridIndex: 0, type: 'value', axisLabel: {
+                            formatter: '{value} 单'
+                        }
+                    }
+                ],
+                grid: [{left: '5%', right: '3%', top: '15%', bottom: '5%'}],
+                series: [
+                    {
+                        smooth: true, showBackground: true,
+                        areaStyle: {color: 'rgba(180, 180, 180, 0.5)'},
+                        type: 'bar', showSymbol: true, xAxisIndex: 0, yAxisIndex: 0,
+                        label: {normal: {position: 'top', formatter: '{c} 单', show: true}},
+                        data: data2.map(function (item) {
+                            return item['订单数量'];
+                        }),
+                    }
+                ]
+            };
+            this.option2 = {
+                title: {
+                    left: 'left', 
+                    text: '近15天订单金额',
+                },
+                grid: {
+                    top: '80px'
+                },
+                tooltip: {trigger: 'axis', show: true, axisPointer: {type: 'cross', label: {}}},
+                xAxis: [{data: moneyDay, gridIndex: 0}],
+                yAxis: [
+                    {
+                        splitLine: {show: true}, gridIndex: 0, type: 'value', axisLabel: {
+                            formatter: '{value} 元'
+                        }
+                    }
+                ],
+                grid: [{left: '5%', right: '3%', top: '15%', bottom: '5%'}],
+                series: [
+                    {
+                        smooth: true, showBackground: true,
+                        areaStyle: {color: 'rgba(180, 180, 180, 0.5)'},
+                        type: 'line', showSymbol: true, xAxisIndex: 0, yAxisIndex: 0,
+                        label: {normal: {position: 'top', formatter: '{c} 元', show: true}},
+                        data: data.map(function (item) {
+                            return item['订单金额'];
+                        }),
+                    }
+                ]
+            };
+        }
     }
 }
 </script>
@@ -231,12 +201,15 @@ export default {
 }
 .service-item {
     border: 1px solid #EAE9F0;
-    padding: 12px 24px;
+    padding: 12px 14px;
     border-radius: 6px;
     display: flex;
     align-items: center;
     flex: 1;
 }
+.service-item .item-sub{
+    width: 40%;
+}
 .service-item .right-btn {
     margin-left: auto;
 }
@@ -255,10 +228,15 @@ export default {
     color: #333333d9;
 }
 .service-item .value{
-    font-size: 24px;
+    font-size: 18px;
     color: #f64945;
     font-weight: 700;
-    margin-left: 26px;
+    margin-left: auto;
+}
+.service-item .value span {
+    font-weight: normal;
+    color: #666;
+    font-size: 12px;
 }
 .service-tel {
     display: flex;
@@ -371,17 +349,19 @@ export default {
     display: flex;
     align-items: center;
     justify-content: space-between;
+    flex-wrap: wrap;
     margin-top: 16px;
-    gap: 10px;
+}
+.total-panel .panel-item.m{
+    width: calc(100% - 9.6px);
+    margin-bottom: 10px;
 }
 .total-panel .panel-item{
-    width: calc((100% - 18px)/6);
+    width: calc(20% - 9.6px);
     height: 130px;
     box-shadow: rgba(0, 0, 0, 0.05) 0px 0px 8px;
     position: relative;
     border-radius: 6px;
-    overflow: hidden;
-    background-color: rgba(166, 166, 166, 0.5);
 }
 .total-panel .panel-item .item-warp .left {
     padding:16px 0px 0px 23px;
@@ -482,13 +462,4 @@ export default {
     margin-left: auto;
     margin-right: 0;
 }
-@media (max-width: 992px){
-    .total-panel {
-        display: block;
-    }
-    .total-panel .panel-item{
-        width: 100%;
-        margin-bottom: 10px;
-    }
-}
 </style>

+ 78 - 0
src/views/manage/express/components/form.vue

@@ -0,0 +1,78 @@
+<template>
+    <el-dialog :title="titleMap[mode]" v-model="visible" :width="600" destroy-on-close @closed="$emit('closed')" :close-on-click-modal="false" :close-on-press-escape="false">
+        <el-form ref="dialogForm" :model="formData" :rules="rules" label-width="100px" label-position="top">
+            <el-form-item label="类型编号" prop="code">
+                <el-input v-model="formData.code" clearable placeholder="请输入"></el-input>
+                <div class="el-form-item-msg"></div>
+            </el-form-item>
+            <el-form-item label="类型描述/名称" prop="name">
+                <el-input v-model="formData.name" clearable placeholder="请输入"></el-input>
+                <div class="el-form-item-msg"></div>
+            </el-form-item>
+        </el-form>
+		<template #footer>
+			<el-button @click="visible=false" >关 闭</el-button>
+			<el-button type="primary" :loading="isSaveing" @click="submit()">提交</el-button>
+		</template>
+    </el-dialog>
+</template>
+<script>
+export default {
+    data(){
+        return {
+            loading: false,
+            mode:"add",
+            titleMap:{
+                add:"新增快递类型",
+                edit:"编辑快递类型"
+            },
+            visible: false,
+            isSaveing: false,
+            formData:{},
+            submitState:false,
+            disabled:false,
+            rules:{
+                code: [
+                    {required: true, message: '请输入'}
+                ],
+                name: [
+                    {required: true, message: '请输入'}
+                ],
+            },
+            sms:""
+        }
+    },
+    methods:{
+        open(mode = 'add'){
+            this.mode = mode;
+            this.visible = true;
+            return this
+        },
+        //表单注入数据
+        setData(data){
+            this.formData = JSON.parse(JSON.stringify(data));
+        },
+        async submit(){
+            var validate = await this.$refs.dialogForm.validate().catch(()=>{});
+            if(!validate){ return false }
+            this.isSaveing = true;
+            let submitData = JSON.parse(JSON.stringify(this.formData));
+            var resp = await this.$API.express.save.post(submitData);
+            this.isSaveing = false;
+            if (resp.code !== 1) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.visible = false;
+            this.formData = {};
+            this.submitState = false;
+            this.$emit("success");
+        }
+    }
+}
+</script>
+<style>
+.mt20 {margin-top: 20px;}
+.login-msg-yzm {display: flex;width: 100%;}
+.login-msg-yzm .el-button {margin-left: 10px;--el-button-size:42px;}
+</style>

+ 61 - 0
src/views/manage/express/components/option.vue

@@ -0,0 +1,61 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">按需操作</el-tag>
+        </legend>
+        <div class="op-header">
+            <div class="left-panel">
+                <el-button type="primary" icon="el-icon-plus" @click="table_add()">新增类型</el-button>
+                <el-button icon="el-icon-document" @click="table_batch_status(1)" :disabled="dataSelect.length>0?false:true">启用</el-button>
+                <el-button icon="el-icon-lock" @click="table_batch_status(0)" :disabled="dataSelect.length>0?false:true">禁用</el-button>
+            </div>
+        </div>
+    </fieldset>
+    <formMain ref="formMain" @success="handleSuccess"></formMain>
+</template>
+
+<script>
+import formMain from './form';
+export default {
+    components: {
+        formMain
+    },
+    props: {
+        type: { type: String, default: "1" },
+        dataSelect: { type: Array, default: () => [] },
+        dataSelectFull: { type: Array, default: () => [] }
+    },
+    data(){
+        return {
+
+        }
+    },
+    methods: {
+        table_add(){
+            this.$nextTick(() => {
+                this.$refs.formMain.open()
+            })
+        },
+        async table_batch_status(status){
+            if (this.dataSelect.length == 0) {
+                return this.$message.error("请选择修改数据")
+            }
+            let submitData = {"id":this.dataSelect,"value":status,"field":"status","type":"batch"};
+            var resp = await this.$API.express.batch.post(submitData);
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.$emit("success");
+        },
+        handleSuccess(){
+            this.$emit("success");
+        },
+        table_add(){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("add")
+            })
+        },
+    }
+}
+</script>

+ 44 - 0
src/views/manage/express/components/search.vue

@@ -0,0 +1,44 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">条件筛选</el-tag>
+        </legend>
+        <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right" label-width="100px">
+            <div class="search-form">
+                <div class="form-left">
+                    <el-row :gutter="10">
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-input v-model="searchKey.name" placeholder="类型名称" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>类型名称</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-date-picker v-model="searchKey.create" :style="{width: '100%'}" placeholder="请选择创建时间" start-placeholder="开始时间" end-placeholder="结束时间" type="daterange" range-separator="至" @change="searchForm" />
+                        </el-col>
+                    </el-row>
+                </div>
+                <div class="form-line"></div>
+                <div class="form-right">
+                    <el-button type="primary" icon="el-icon-search" @click="searchForm">搜索</el-button>
+                </div>
+            </div>
+        </el-form>
+    </fieldset>
+</template>
+
+<script>
+export default {
+    data(){
+        return {
+            searchKey:{
+                status:7
+            }
+        }
+    },
+    methods: {
+        searchForm(){
+            this.$emit("success",this.searchKey);
+        }
+    }
+}
+</script>

+ 105 - 0
src/views/manage/express/components/table.vue

@@ -0,0 +1,105 @@
+<template>
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+        <el-table-column type="selection" width="50" fixed="left"></el-table-column>
+        <el-table-column label="类型编码" prop="code" width="220" fixed="left">
+            <template #default="scope">
+                <span v-if="scope.row.code">{{ scope.row.code }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="类型描述/名称" prop="name" width="200">
+            <template #default="scope">
+                <span v-if="scope.row.name">{{ scope.row.name }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="状态" prop="status" width="120">
+            <template #default="scope">
+                <div class="status-success" v-if="scope.row.status==1"><sc-status-indicator type="success"></sc-status-indicator> 启用</div>
+                <div class="status-danger" v-else><sc-status-indicator type="danger"></sc-status-indicator> 禁用</div>
+            </template>
+        </el-table-column>
+        <el-table-column label="创建时间" prop="create_at" width="180"></el-table-column>
+        <el-table-column label="操作" width="200" align="right" fixed="right">
+            <template #default="scope">
+                <el-button-group>
+                    <el-button text type="warning" size="small" @click="table_passwd(scope.row)">编辑</el-button>
+                    <el-popconfirm title="确定删除吗?" @confirm="table_del(scope.row, scope.$index)">
+                        <template #reference>
+                            <el-button text type="danger" size="small">删除</el-button>
+                        </template>
+                    </el-popconfirm>                    
+                </el-button-group>
+            </template>
+        </el-table-column>
+    </scTable>
+    <formMain ref="formMain" @success="handleSuccess"></formMain>
+</template>
+
+<script>
+import formMain from './form';
+export default {
+    components: {
+        formMain
+    },
+    data(){
+        return {
+            list: {
+                apiObj: this.$API.express.list
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    methods: {
+        async table_del(data){
+            var resp = await this.$API.express.del.post({"id":data.id});
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg)
+            }
+            this.$message.success(resp.msg)
+            this.$refs.table.refresh()
+        },
+        refresh(){
+            this.$refs.table.refresh()
+        },
+        upData(data){
+            this.$refs.table.upData(data)
+        },
+        handleSuccess(){
+            this.$refs.table.refresh()
+        },
+        sortChange(event){
+            if (event.order) {
+                var data = {
+                    "field":event.prop,
+                    "order":event.order
+                }
+                this.$refs.table.upData(data)
+            } else {
+                this.$refs.table.reload(this.searchKey)
+            }
+            return ;
+        },
+        selectionChange(event){
+            this.dataSelect = [];
+            var arr = [];
+            var arrCompany = [];
+            event.forEach(function(val,index){
+                arr[index] = val.id;
+                arrCompany[index] = val;
+            });
+            this.dataSelectFull = arrCompany;
+            this.dataSelect = arr;
+            this.$emit("success",this.dataSelect);
+            this.$emit("successFull",this.dataSelectFull);
+        },
+        table_passwd(row){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("edit").setData(row)
+            })
+        },
+    }
+}
+</script>

+ 49 - 0
src/views/manage/express/index.vue

@@ -0,0 +1,49 @@
+<template>
+    <el-container class="flex-column">
+        <div class="table-search">
+            <search @success="handleSuccess"></search>
+            <optionBtn @success="handleSuccess" :dataSelect="dataSelect" :dataSelectFull="dataSelectFull" type="3"></optionBtn>
+        </div>
+        <el-main class="nopadding">
+            <div class="table-container">
+                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull" type="3"></tablePage>
+            </div>
+        </el-main>
+    </el-container>  
+</template>
+
+<script>
+import search from './components/search';
+import optionBtn from './components/option';
+import tablePage from './components/table';
+export default {
+    components: {
+        search,tablePage,optionBtn
+    },
+    data(){
+        return {
+            searchKey:{
+                status:7
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+        }
+    },
+    methods: {
+        tableHandle(data){
+            this.dataSelect = data;
+        },
+        tableHandleFull(data){
+            this.dataSelectFull = data;
+        },
+        handleSuccess(data){
+            this.$refs.tablePage.upData(data)
+        },
+        handleClick(name){
+            this.activeName = name;
+            this.searchKey.type = name;
+            this.$refs.tablePage.upData(this.searchKey)
+        }
+    }
+}
+</script>

+ 146 - 0
src/views/manage/goods/components/form.vue

@@ -0,0 +1,146 @@
+<template>
+    <el-drawer :title="titleMap[mode]" :append-to-body="true" v-model="visible" :size="1000" destroy-on-close :close-on-click-modal="false" @closed="$emit('closed')" :with-header="false">
+        <el-container class="flex-column" v-loading="loading">
+            <div class="drawer-detail-main">
+                <div class="drawer-detail-header">
+                    <div class="drawer-detail-header-body">
+                        <div class="drawer-detail-header-left">{{ titleMap[mode] }}</div>
+                        <div class="drawer-detail-header-left">
+                            <el-button type="default" icon="el-icon-close" @click="visible=false"></el-button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <el-main>
+                <el-form ref="dialogForm" :model="formData" :rules="rules" label-width="100px" label-position="top">
+                    <el-row :gutter="15">
+                        <el-col :span="24">
+                            <el-form-item label="所属店铺" prop="account_id">
+                                <el-input v-model="formData.account_id" placeholder="所属店铺" clearable readonly :style="{ width: '100%' }" @click="selectUser">
+                                    <template #append>
+                                        <el-tooltip
+                                            effect="dark"
+                                            content="点这里,清除选择"
+                                            placement="top-start"
+                                        >
+                                        <div class="remove-a" @click="clearUser">清除</div>
+                                        </el-tooltip>
+                                    </template>
+                                </el-input>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="24">
+                            <el-form-item label="商品标题" prop="product_name">
+                                <el-input v-model="formData.product_name" clearable placeholder="请输入"></el-input>
+                                <div class="el-form-item-msg"></div>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="24">
+                            <el-form-item label="快递面单名称" prop="express_name">
+                                <el-input v-model="formData.express_name" clearable placeholder="请输入"></el-input>
+                                <div class="el-form-item-msg">不填写默认使用商品标题名称</div>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="商品价格" prop="product_price">
+                                <el-input v-model="formData.product_price" clearable placeholder="请输入"></el-input>
+                                <div class="el-form-item-msg"></div>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="商品划线价格" prop="product_orgin">
+                                <el-input v-model="formData.product_orgin" clearable placeholder="请输入"></el-input>
+                                <div class="el-form-item-msg"></div>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="24">
+                            <el-form-item label="商品图片" prop="product_img">
+                                <sc-upload v-model="formData.product_img" tip="最多上传100个文件,单个文件不要超过10M,请上传图像格式文件"></sc-upload>
+                                <div class="el-form-item-msg">选填</div>
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                </el-form>
+            </el-main>
+            <el-footer style="text-align: right;">
+                <el-button @click="visible=false" >取 消</el-button>
+                <el-button v-if="mode!='show'" type="primary" :loading="isSaveing" @click="submit()">保 存</el-button>
+            </el-footer>
+        </el-container>
+    </el-drawer>
+    <storeData ref="storeData" :multiple="false" @success="handleSuccess"></storeData>
+</template>
+
+<script>
+import storeData from "@/views/manage/components/store";
+export default {
+    components: {
+        storeData
+    },
+    data(){
+        return {
+            loading: false,
+            mode:"add",
+            titleMap:{
+                add:"新增商品",
+                edit:"编辑商品"
+            },
+            visible: false,
+            isSaveing: false,
+            formData:{},
+            rules:{
+                account_id: [
+                    {required: true, message: '请选择'}
+                ],
+                product_name: [
+                    {required: true, message: '请输入'}
+                ],
+                product_price: [
+                    {required: true, message: '请输入'}
+                ],
+                product_orgin: [
+                    {required: true, message: '请输入'}
+                ],
+            }
+        }
+    },
+    methods:{
+        handleSuccess(data){
+            this.formData.store_id = data.store_id;
+        },
+        clearUser(){
+            this.formData.store_id = "";
+        },
+        selectUser(){
+            this.$nextTick(() => {
+                this.$refs.storeData.open()
+            })
+        },
+        open(mode = 'add'){
+            this.mode = mode;
+            this.visible = true;
+            return this
+        },
+        //表单注入数据
+        setData(data){
+            this.formData = JSON.parse(JSON.stringify(data));
+        },
+        async submit(){
+            var validate = await this.$refs.dialogForm.validate().catch(()=>{});
+            if(!validate){ return false }
+            this.isSaveing = true;
+            let submitData = JSON.parse(JSON.stringify(this.formData));
+            var resp = await this.$API.goods.save.post(submitData);
+            this.isSaveing = false;
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.visible = false;
+            this.formData = {};
+            this.submitState = false;
+            this.$emit("success");
+        }
+    }
+}
+</script>

+ 61 - 0
src/views/manage/goods/components/option.vue

@@ -0,0 +1,61 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">按需操作</el-tag>
+        </legend>
+        <div class="op-header">
+            <div class="left-panel">
+                <el-button type="primary" icon="el-icon-plus" @click="table_add()">新增商品</el-button>
+                <el-button icon="el-icon-document" @click="table_batch_status(1)" :disabled="dataSelect.length>0?false:true">启用</el-button>
+                <el-button icon="el-icon-lock" @click="table_batch_status(0)" :disabled="dataSelect.length>0?false:true">禁用</el-button>
+            </div>
+        </div>
+    </fieldset>
+    <formMain ref="formMain" @success="handleSuccess"></formMain>
+</template>
+
+<script>
+import formMain from './form';
+export default {
+    components: {
+        formMain
+    },
+    props: {
+        type: { type: String, default: "1" },
+        dataSelect: { type: Array, default: () => [] },
+        dataSelectFull: { type: Array, default: () => [] }
+    },
+    data(){
+        return {
+
+        }
+    },
+    methods: {
+        table_add(){
+            this.$nextTick(() => {
+                this.$refs.formMain.open()
+            })
+        },
+        async table_batch_status(status){
+            if (this.dataSelect.length == 0) {
+                return this.$message.error("请选择修改数据")
+            }
+            let submitData = {"id":this.dataSelect,"value":status,"field":"status","type":"batch"};
+            var resp = await this.$API.express.batch.post(submitData);
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.$emit("success");
+        },
+        handleSuccess(){
+            this.$emit("success");
+        },
+        table_add(){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("add")
+            })
+        },
+    }
+}
+</script>

+ 49 - 0
src/views/manage/goods/components/search.vue

@@ -0,0 +1,49 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">条件筛选</el-tag>
+        </legend>
+        <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right" label-width="100px">
+            <div class="search-form">
+                <div class="form-left">
+                    <el-row :gutter="10">
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-input v-model="searchKey.title" placeholder="商品标题" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>商品标题</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-input v-model="searchKey.out_id" placeholder="来客ID" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>来客ID</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-date-picker v-model="searchKey.create" :style="{width: '100%'}" placeholder="请选择创建时间" start-placeholder="开始时间" end-placeholder="结束时间" type="daterange" range-separator="至" @change="searchForm" />
+                        </el-col>
+                    </el-row>
+                </div>
+                <div class="form-line"></div>
+                <div class="form-right">
+                    <el-button type="primary" icon="el-icon-search" @click="searchForm">搜索</el-button>
+                </div>
+            </div>
+        </el-form>
+    </fieldset>
+</template>
+
+<script>
+export default {
+    data(){
+        return {
+            searchKey:{
+                status:7
+            }
+        }
+    },
+    methods: {
+        searchForm(){
+            this.$emit("success",this.searchKey);
+        }
+    }
+}
+</script>

+ 105 - 0
src/views/manage/goods/components/table.vue

@@ -0,0 +1,105 @@
+<template>
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+        <el-table-column type="selection" width="50" fixed="left"></el-table-column>
+        <el-table-column label="类型编码" prop="code" width="220" fixed="left">
+            <template #default="scope">
+                <span v-if="scope.row.code">{{ scope.row.code }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="类型描述/名称" prop="name" width="200">
+            <template #default="scope">
+                <span v-if="scope.row.name">{{ scope.row.name }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="状态" prop="status" width="120">
+            <template #default="scope">
+                <div class="status-success" v-if="scope.row.status==1"><sc-status-indicator type="success"></sc-status-indicator> 启用</div>
+                <div class="status-danger" v-else><sc-status-indicator type="danger"></sc-status-indicator> 禁用</div>
+            </template>
+        </el-table-column>
+        <el-table-column label="创建时间" prop="create_at" width="180"></el-table-column>
+        <el-table-column label="操作" width="200" align="right" fixed="right">
+            <template #default="scope">
+                <el-button-group>
+                    <el-button text type="warning" size="small" @click="table_passwd(scope.row)">编辑</el-button>
+                    <el-popconfirm title="确定删除吗?" @confirm="table_del(scope.row, scope.$index)">
+                        <template #reference>
+                            <el-button text type="danger" size="small">删除</el-button>
+                        </template>
+                    </el-popconfirm>                    
+                </el-button-group>
+            </template>
+        </el-table-column>
+    </scTable>
+    <formMain ref="formMain" @success="handleSuccess"></formMain>
+</template>
+
+<script>
+import formMain from './form';
+export default {
+    components: {
+        formMain
+    },
+    data(){
+        return {
+            list: {
+                apiObj: this.$API.goods.list
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    methods: {
+        async table_del(data){
+            var resp = await this.$API.express.del.post({"id":data.id});
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg)
+            }
+            this.$message.success(resp.msg)
+            this.$refs.table.refresh()
+        },
+        refresh(){
+            this.$refs.table.refresh()
+        },
+        upData(data){
+            this.$refs.table.upData(data)
+        },
+        handleSuccess(){
+            this.$refs.table.refresh()
+        },
+        sortChange(event){
+            if (event.order) {
+                var data = {
+                    "field":event.prop,
+                    "order":event.order
+                }
+                this.$refs.table.upData(data)
+            } else {
+                this.$refs.table.reload(this.searchKey)
+            }
+            return ;
+        },
+        selectionChange(event){
+            this.dataSelect = [];
+            var arr = [];
+            var arrCompany = [];
+            event.forEach(function(val,index){
+                arr[index] = val.id;
+                arrCompany[index] = val;
+            });
+            this.dataSelectFull = arrCompany;
+            this.dataSelect = arr;
+            this.$emit("success",this.dataSelect);
+            this.$emit("successFull",this.dataSelectFull);
+        },
+        table_passwd(row){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("edit").setData(row)
+            })
+        },
+    }
+}
+</script>

+ 49 - 0
src/views/manage/goods/index.vue

@@ -0,0 +1,49 @@
+<template>
+    <el-container class="flex-column">
+        <div class="table-search">
+            <search @success="handleSuccess"></search>
+            <optionBtn @success="handleSuccess" :dataSelect="dataSelect" :dataSelectFull="dataSelectFull" type="3"></optionBtn>
+        </div>
+        <el-main class="nopadding">
+            <div class="table-container">
+                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull" type="3"></tablePage>
+            </div>
+        </el-main>
+    </el-container>  
+</template>
+
+<script>
+import search from './components/search';
+import optionBtn from './components/option';
+import tablePage from './components/table';
+export default {
+    components: {
+        search,tablePage,optionBtn
+    },
+    data(){
+        return {
+            searchKey:{
+                status:7
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+        }
+    },
+    methods: {
+        tableHandle(data){
+            this.dataSelect = data;
+        },
+        tableHandleFull(data){
+            this.dataSelectFull = data;
+        },
+        handleSuccess(data){
+            this.$refs.tablePage.upData(data)
+        },
+        handleClick(name){
+            this.activeName = name;
+            this.searchKey.type = name;
+            this.$refs.tablePage.upData(this.searchKey)
+        }
+    }
+}
+</script>

+ 0 - 6
src/views/manage/mall/douyin/components/option.vue

@@ -1,6 +0,0 @@
-<template>
-
-</template>
-<script>
-
-</script>

+ 0 - 6
src/views/manage/mall/douyin/components/search.vue

@@ -1,6 +0,0 @@
-<template>
-
-</template>
-<script>
-
-</script>

+ 0 - 6
src/views/manage/mall/douyin/components/table.vue

@@ -1,6 +0,0 @@
-<template>
-
-</template>
-<script>
-
-</script>

+ 0 - 6
src/views/manage/mall/wechat/components/option.vue

@@ -1,6 +0,0 @@
-<template>
-
-</template>
-<script>
-
-</script>

+ 0 - 6
src/views/manage/mall/wechat/components/search.vue

@@ -1,6 +0,0 @@
-<template>
-
-</template>
-<script>
-
-</script>

+ 0 - 6
src/views/manage/mall/wechat/components/table.vue

@@ -1,6 +0,0 @@
-<template>
-
-</template>
-<script>
-
-</script>

+ 307 - 0
src/views/manage/shop/index/components/form.vue

@@ -0,0 +1,307 @@
+<template>
+    <el-drawer :title="titleMap[mode]" :append-to-body="true" v-model="visible" :size="1000" destroy-on-close :close-on-click-modal="false" @closed="$emit('closed')" :with-header="false">
+        <el-container class="flex-column" v-loading="loading">
+            <div class="drawer-detail-main">
+                <div class="drawer-detail-header">
+                    <div class="drawer-detail-header-body">
+                        <div class="drawer-detail-header-left">{{ titleMap[mode] }}</div>
+                        <div class="drawer-detail-header-left">
+                            <el-button type="default" icon="el-icon-close" @click="visible=false"></el-button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <el-main>
+                <el-form ref="dialogForm" :model="formData" :rules="rules" label-width="100px" label-position="top">
+                    <fieldset>
+                        <legend><el-tag>店铺信息</el-tag></legend>
+                        <el-alert type="warning" title="已发货的订单用户发起退款后,开启退款自动拦截快递后系统将自动拦截途中快递并退回" :closable="false" style="margin-bottom: 10px;"></el-alert>
+                        <el-row :gutter="15">
+                            <el-col :span="12">
+                                <el-form-item label="所属代理" prop="agent_id">
+                                    <el-input v-model="formData.agent_id" placeholder="所属代理" clearable readonly :style="{ width: '100%' }" @click="selectUser">
+                                        <template #append>
+                                            <el-tooltip
+                                                effect="dark"
+                                                content="点这里,清除选择"
+                                                placement="top-start"
+                                            >
+                                            <div class="remove-a" @click="clearUser">清除</div>
+                                            </el-tooltip>
+                                        </template>
+                                    </el-input>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item label="来客店铺名称" prop="store_name">
+                                    <el-input v-model="formData.store_name" clearable placeholder="来客店铺名称"></el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="6">
+                                <el-form-item label="来客账户ID" prop="store_id">
+                                    <el-input v-model="formData.store_id" clearable placeholder="来客账户ID"></el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="6">
+                                <el-form-item label="自动呼叫快递" prop="is_auto">
+                                    <el-select v-model="formData.is_auto" clearable placeholder="请选择" :style="{width: '100%'}">
+                                        <el-option :value="1" label="开启"></el-option>
+                                        <el-option :value="2" label="关闭"></el-option>
+                                    </el-select>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="6">
+                                <el-form-item label="快递类型" prop="express_type">
+                                    <el-select v-model="formData.express_type" clearable placeholder="请选择" :style="{width: '100%'}">
+                                        <el-option :value="item.code" :label="item.name" v-for="item in expressType"></el-option>
+                                    </el-select>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="6">
+                                <el-form-item label="呼叫快递时间" prop="express_time">
+                                    <el-select v-model="formData.express_time" clearable placeholder="请选择" :style="{width: '100%'}">
+                                        <el-option :value="(item-1)" :label="(item-1)==0?'实时':(item-1)+'点后'" v-for="item in 20"></el-option>
+                                    </el-select>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="6">
+                                <el-form-item label="核销时机" prop="order_end">
+                                    <el-select v-model="formData.order_end" clearable placeholder="请选择" :style="{width: '100%'}">
+                                        <el-option :value="item.id" :label="item.name" v-for="item in orderEnd"></el-option>
+                                    </el-select>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="6">
+                                <el-form-item label="退款自动拦截快递" prop="is_reback">
+                                    <el-select v-model="formData.is_reback" clearable placeholder="请选择" :style="{width: '100%'}">
+                                        <el-option :value="item.id" :label="item.name" v-for="item in orderReback"></el-option>
+                                    </el-select>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                    </fieldset>
+                    <fieldset>
+                        <legend><el-tag>发货信息</el-tag></legend>
+                        <el-row :gutter="15">
+                            <el-col :span="12">
+                                <el-form-item label="联系人" prop="express_name">
+                                    <el-input v-model="formData.express_name" clearable placeholder="请输入"></el-input>
+                                    <div class="el-form-item-msg">用于呼叫快递</div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item label="联系电话" prop="express_mobile">
+                                    <el-input v-model="formData.express_mobile" clearable placeholder="请输入"></el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item label="物品名称" prop="express_goods">
+                                    <el-input v-model="formData.express_goods" clearable placeholder="请输入"></el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item label="物品单位" prop="express_unit">
+                                    <el-input v-model="formData.express_unit" clearable placeholder="请输入"></el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="24">
+                                <el-form-item label="发货地址" prop="express_address">
+                                    <el-input type="textarea" rows="5" v-model="formData.express_address" clearable placeholder="请输入"></el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                    </fieldset>
+                    <fieldset v-if="mode=='add'">
+                        <legend><el-tag>主账号信息</el-tag></legend>
+                        <el-row :gutter="15">
+                            <el-col :span="12">
+                                <el-form-item label="登录账号" prop="username">
+                                    <el-input v-model="formData.username" clearable placeholder="请输入登录账号"></el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item label="用户名称" prop="truename">
+                                    <el-input v-model="formData.truename" clearable placeholder="请输入用户名称"></el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item label="登录密码" prop="password">
+                                    <el-input type="password" v-model="formData.password" clearable show-password placeholder="请输入登录密码"></el-input>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item label="确认密码" prop="password2">
+                                    <el-input type="password" v-model="formData.password2" clearable show-password placeholder="请再次输入密码"></el-input>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                    </fieldset>
+                </el-form>
+            </el-main>
+            <el-footer style="text-align: right;">
+                <el-button @click="visible=false" >取 消</el-button>
+                <el-button v-if="mode!='show'" type="primary" :loading="isSaveing" @click="submit()">保 存</el-button>
+            </el-footer>
+        </el-container>
+    
+    </el-drawer>
+    <agentData ref="agentData" :multiple="false" @success="handleAgent"></agentData>
+</template>
+<script>
+import agentData from "@/views/manage/components/agent";
+export default {
+    components: {
+        agentData
+    },
+    data(){
+        return {
+            stepActive:1,
+            loading: false,
+            mode:"add",
+            titleMap:{
+                add:"新增店铺",
+                edit:"编辑店铺信息"
+            },
+            orderEnd:[{"id":1,"name":"订单提交后"},{"id":2,"name":"快递取件后"},{"id":3,"name":"快递签收后"}],
+            orderReback:[{"id":1,"name":"开启"},{"id":2,"name":"关闭"}],
+            expressType:[],
+            visible: false,
+            isSaveing: false,
+            formData:{},
+            time:0,
+            submitState:false,
+            disabled:false,
+            rules:{
+                username: [
+                    {required: true, message: '请输入登录账号'}
+                ],
+                truename: [
+                    {required: true, message: '请输入账号名称'}
+                ],
+                password: [
+                    {required: true, message: '请输入登录密码'}
+                ],
+                password2: [
+                    {required: true, message: '请再次输入密码'},
+                    {validator: (rule, value, callback) => {
+                        if (value !== this.formData.password) {
+                            callback(new Error('两次输入密码不一致!'));
+                        }else{
+                            callback();
+                        }
+                    }}
+                ],
+                express_type: [
+                    {required: true, message: '请选择'}
+                ],
+                is_auto: [
+                    {required: true, message: '请选择'}
+                ],
+                is_reback: [
+                    {required: true, message: '请选择'}
+                ],
+                store_name: [
+                    {required: true, message: '请输入'}
+                ],
+                store_id: [
+                    {required: true, message: '请输入'}
+                ],
+                agent_id: [
+                    {required: true, message: '请选择'}
+                ],
+                express_name: [
+                    {required: true, message: '请输入'}
+                ],
+                express_mobile: [
+                    {required: true, message: '请输入'}
+                ],
+                express_goods: [
+                    {required: true, message: '请输入'}
+                ],
+                express_unit: [
+                    {required: true, message: '请输入'}
+                ],
+                express_address: [
+                    {required: true, message: '请输入'}
+                ],
+                express_time: [
+                    {required: true, message: '请选择'}
+                ],
+                order_end: [
+                    {required: true, message: '请选择'}
+                ],
+            }
+        }
+    },
+    methods:{
+        handleAgent(data){
+            this.formData.agent_id = data.agent_id;
+        },
+        clearUser(){
+            this.formData.agent_id = "";
+        },
+        selectUser(){
+            this.$nextTick(() => {
+                this.$refs.agentData.open()
+            })
+        },
+        open(mode = 'add'){
+            this.mode = mode;
+            this.visible = true;
+            this.getExpress();
+            return this
+        },
+        async getExpress(){
+            this.loading = true;
+            var resp = await this.$API.express.page.get();
+            this.loading = false;
+            this.expressType = resp.data;
+        },
+        //表单注入数据
+        setData(data){
+            this.formData = JSON.parse(JSON.stringify(data));
+        },
+        async submit(){
+            var validate = await this.$refs.dialogForm.validate().catch(()=>{});
+            if(!validate){ return false }
+            this.isSaveing = true;
+            let submitData = JSON.parse(JSON.stringify(this.formData));
+            if (this.mode == 'add') {
+                submitData.password = this.$TOOL.crypto.MD5(this.formData.password)
+                submitData.password2 = this.$TOOL.crypto.MD5(this.formData.password2)
+                submitData.scene = "register";
+                var resp = await this.$API.store.save.post(submitData);
+            } else {
+                var resp = await this.$API.store.edit.post(submitData);
+            }
+            this.isSaveing = false;
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.visible = false;
+            this.formData = {};
+            this.submitState = false;
+            this.$emit("success");
+        }
+    }
+}
+</script>
+<style>
+.mt20 {margin-top: 20px;}
+.login-msg-yzm {display: flex;width: 100%;}
+.login-msg-yzm .el-button {margin-left: 10px;--el-button-size:42px;}
+</style>

+ 57 - 0
src/views/manage/shop/index/components/option.vue

@@ -0,0 +1,57 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">按需操作</el-tag>
+        </legend>
+        <div class="op-header">
+            <div class="left-panel">
+                <el-button type="primary" icon="el-icon-plus" @click="table_add()">新增店铺</el-button>
+                <el-button icon="el-icon-document" @click="table_batch_status(1)" :disabled="dataSelect.length>0?false:true">启用</el-button>
+                <el-button icon="el-icon-lock" @click="table_batch_status(0)" :disabled="dataSelect.length>0?false:true">禁用</el-button>
+                <!-- <el-button type="primary" icon="el-icon-download" @click="table_export()">导出</el-button> -->
+            </div>
+        </div>
+    </fieldset>
+    <formMain ref="formMain" @success="handleSuccess"></formMain>
+</template>
+
+<script>
+import formMain from './form';
+export default {
+    components: {
+        formMain
+    },
+    props: {
+        type: { type: String, default: "1" },
+        dataSelect: { type: Array, default: () => [] },
+        dataSelectFull: { type: Array, default: () => [] }
+    },
+    data(){
+        return {
+
+        }
+    },
+    methods: {
+        async table_batch_status(status){
+            if (this.dataSelect.length == 0) {
+                return this.$message.error("请选择修改数据")
+            }
+            let submitData = {"id":this.dataSelect,"value":status,"field":"status","type":"batch"};
+            var resp = await this.$API.store.batch.post(submitData);
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.$emit("success");
+        },
+        handleSuccess(){
+            this.$emit("success");
+        },
+        table_add(){
+            this.$nextTick(() => {
+                this.$refs.formMain.open()
+            })
+        },
+    }
+}
+</script>

+ 85 - 0
src/views/manage/shop/index/components/search.vue

@@ -0,0 +1,85 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">条件筛选</el-tag>
+        </legend>
+        <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right" label-width="100px">
+            <div class="search-form">
+                <div class="form-left">
+                    <el-row :gutter="10">
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-input v-model="searchKey.agent" placeholder="所属代理" clearable readonly :style="{ width: '100%' }" @click="selectUser">
+                                <template #append>
+                                    <el-tooltip
+                                        effect="dark"
+                                        content="点这里,清除选择"
+                                        placement="top-start"
+                                    >
+                                    <div class="remove-a" @click="clearUser">清除</div>
+                                    </el-tooltip>
+                                </template>
+                                <template #prepend>所属代理</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-input v-model="searchKey.name" placeholder="店铺名称" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>店铺名称</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-input v-model="searchKey.account" placeholder="来客账户ID" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>来客账户ID</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-select v-model="searchKey.status" clearable placeholder="请选择状态" @change="searchForm" :style="{width: '100%'}" class="diy-select">
+                                <el-option value="1" label="冻结"></el-option>
+                                <el-option value="2" label="正常"></el-option>
+                                <template #prefix>状态</template>
+                            </el-select>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-date-picker v-model="searchKey.create" :style="{width: '100%'}" placeholder="请选择创建时间" start-placeholder="开始时间" end-placeholder="结束时间" type="daterange" range-separator="至" @change="searchForm" />
+                        </el-col>
+                    </el-row>
+                </div>
+                <div class="form-line"></div>
+                <div class="form-right">
+                    <el-button type="primary" icon="el-icon-search" @click="searchForm">搜索</el-button>
+                </div>
+            </div>
+        </el-form>
+    </fieldset>
+    <agentData ref="agentData" :multiple="false" @success="handleSuccess"></agentData>
+</template>
+
+<script>
+import agentData from "@/views/manage/components/agent";
+export default {
+    components: {
+        agentData
+    },
+    data(){
+        return {
+            searchKey:{}
+        }
+    },
+    methods: {
+        handleSuccess(data){
+            this.searchKey.agent = data.user_id;
+            this.$emit("success",this.searchKey);
+        },
+        clearUser(){
+            this.searchKey.agent = "";
+        },
+        selectUser(){
+            this.$nextTick(() => {
+                this.$refs.agentData.open()
+            })
+        },
+        searchForm(){
+            this.$emit("success",this.searchKey);
+        }
+    }
+}
+</script>

+ 138 - 0
src/views/manage/shop/index/components/table.vue

@@ -0,0 +1,138 @@
+<template>
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+        <el-table-column type="selection" width="50" fixed="left"></el-table-column>
+        <el-table-column label="店铺名称" width="200" fixed="left" prop="store_name"></el-table-column>
+        <el-table-column label="账户ID" prop="store_id" width="200"></el-table-column>
+        <el-table-column label="所属代理" prop="agent" width="150">
+            <template #default="scope">
+                <span v-if="scope.row.agent">{{ scope.row.agent.name }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="自动呼叫快递" prop="type" width="150">
+            <template #default="scope">
+                <div class="status-success" v-if="scope.row.is_auto==1"><sc-status-indicator type="success"></sc-status-indicator> 开启</div>
+                <div class="status-danger" v-else><sc-status-indicator type="danger"></sc-status-indicator> 关闭</div>
+            </template>
+        </el-table-column>
+        <el-table-column label="呼叫快递" prop="express_time" width="150">
+            <template #default="scope">
+                <span v-if="scope.row.express_time>0">{{ scope.row.express_time }}点后</span>
+                <span class="status-danger" v-else>实时</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="核销时机" prop="order_end" width="150">
+            <template #default="scope">
+                <span v-if="scope.row.order_end==1">订单提交后</span>
+                <span v-if="scope.row.order_end==2">快递取件后</span>
+                <span v-if="scope.row.order_end==3">快递签收后</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="联系人" prop="express_name" width="150">
+            <template #default="scope">
+                <span v-if="scope.row.express_name">{{ scope.row.express_name }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="联系电话" prop="express_mobile" width="150">
+            <template #default="scope">
+                <span v-if="scope.row.express_mobile">{{ scope.row.express_mobile }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="状态" prop="status" width="120" align="center">
+            <template #default="scope">
+                <div class="status-success" v-if="scope.row.status==1"><sc-status-indicator type="success"></sc-status-indicator> 正常</div>
+                <div class="status-danger" v-else><sc-status-indicator type="danger"></sc-status-indicator> 禁用</div>
+            </template>
+        </el-table-column>
+        <el-table-column label="创建时间" prop="create_at" width="180"></el-table-column>
+        <el-table-column label="操作" width="220" align="center" fixed="right">
+            <template #default="scope">
+                <el-button-group>
+                    <el-button text type="primary" size="small" @click="table_view(scope.row)">编辑</el-button>
+                    <el-button text type="danger" size="small" @click="table_del(scope.row)">删除</el-button>
+                </el-button-group>
+            </template>
+        </el-table-column>
+    </scTable>
+    <formMain ref="formMain" @success="handleSuccess"></formMain>
+</template>
+
+<script>
+import formMain from './form';
+export default {
+    components: {
+        formMain
+    },
+    data(){
+        return {
+            list: {
+                apiObj: this.$API.store.list
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    
+    methods: {
+        table_view(data){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("edit").setData(data)
+            })
+        },
+        table_del(data){
+            this.$confirm(`删除店铺后,所有有关该店铺的门店、订单等信息都将删除,不可恢复,确定要执行删除吗`, '提示', {
+                type: 'warning'
+            }).then(async ()=>{
+                var resp = await this.$API.agent.del.post({"id":data.id});
+                if (resp.code == 0) {
+                    return this.$message.warning(resp.msg);
+                }
+                this.$message.success(resp.msg);
+                this.$emit("success");
+            }).catch(()=>{})
+        },
+        refresh(){
+            this.$refs.table.refresh()
+        },
+        upData(data){
+            this.$refs.table.upData(data)
+        },
+        handleSuccess(){
+            this.$refs.table.refresh()
+        },
+        sortChange(event){
+            if (event.order) {
+                var data = {
+                    "field":event.prop,
+                    "order":event.order
+                }
+                this.$refs.table.upData(data)
+            } else {
+                this.$refs.table.reload(this.searchKey)
+            }
+            return ;
+        },
+        selectionChange(event){
+            this.dataSelect = [];
+            var arr = [];
+            var arrCompany = [];
+            event.forEach(function(val,index){
+                arr[index] = val.id;
+                arrCompany[index] = val;
+            });
+            this.dataSelectFull = arrCompany;
+            this.dataSelect = arr;
+            this.$emit("success",this.dataSelect);
+            this.$emit("successFull",this.dataSelectFull);
+        },
+        table_passwd(row){
+            this.$nextTick(() => {
+                this.$refs.userPasswd.open("edit").setData(row)
+            })
+        }
+    }
+}
+</script>

+ 46 - 63
src/views/manage/mall/douyin/index.vue → src/views/manage/shop/index/index.vue

@@ -1,64 +1,47 @@
-<template>
-    <el-container class="flex-column">
-        <div class="channel_menu">
-            <el-menu mode="horizontal" class="channel-tabs" :default-active="activeName" @select="handleClick">
-                <el-menu-item :index="item.key" v-for="(item,indx) in menuData" :key="indx">{{item.name}}</el-menu-item>
-            </el-menu>
-        </div>
-        <div class="table-search">
-            <search @success="handleSuccess"></search>
-            <optionBtn @success="handleSuccess" :dataSelect="dataSelect" :dataSelectFull="dataSelectFull" ></optionBtn>
-        </div>
-        <el-main class="nopadding">
-            <div class="table-container">
-                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull"></tablePage>
-            </div>
-        </el-main>
-    </el-container>  
-</template>
-
-<script>
-import search from './components/search';
-import optionBtn from './components/option';
-import tablePage from './components/table';
-export default {
-    components: {
-        search,tablePage,optionBtn
-    },
-    data(){
-        return {
-            menuData:[],
-            searchKey:{},
-            dataSelect:[],
-            dataSelectFull:[],
-        }
-    },
-    mounted(){
-        // this.getMenuData();
-    },
-    methods: {
-        tableHandle(data){
-            this.dataSelect = data;
-        },
-        tableHandleFull(data){
-            this.dataSelectFull = data;
-        },
-        handleSuccess(data){
-            this.$refs.tablePage.upData(data)
-        },
-        async getMenuData(){
-            var resp = await this.$API.common.menu.get({"type":"account"});
-            if (resp.code !== 1) {
-                return this.$message.error(resp.msg);
-            }
-            this.activeName = resp.data.default;
-            this.menuData = resp.data.menu;
-        },
-        handleClick(name){
-            this.activeName = name;
-            this.searchKey.type = name;
-            this.$refs.tablePage.upData(this.searchKey)
-        }
-    }
-}
+<template>
+    <el-container class="flex-column">
+        <div class="table-search">
+            <search @success="handleSuccess"></search>
+            <optionBtn @success="handleSuccess" :dataSelect="dataSelect" :dataSelectFull="dataSelectFull" type="3"></optionBtn>
+        </div>
+        <el-main class="nopadding">
+            <div class="table-container">
+                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull" type="3"></tablePage>
+            </div>
+        </el-main>
+    </el-container>  
+</template>
+
+<script>
+import search from './components/search';
+import optionBtn from './components/option';
+import tablePage from './components/table';
+export default {
+    components: {
+        search,tablePage,optionBtn
+    },
+    data(){
+        return {
+            searchKey:{},
+            dataSelect:[],
+            dataSelectFull:[],
+        }
+    },
+    methods: {
+        tableHandle(data){
+            this.dataSelect = data;
+        },
+        tableHandleFull(data){
+            this.dataSelectFull = data;
+        },
+        handleSuccess(data){
+            this.$refs.tablePage.upData(data)
+        },
+        handleClick(name){
+            this.activeName = name;
+            this.searchKey.type = name;
+            this.$refs.tablePage.upData(this.searchKey)
+        }
+    }
+}
 </script>

+ 126 - 0
src/views/manage/shop/store/components/form.vue

@@ -0,0 +1,126 @@
+<template>
+    <el-dialog :title="titleMap[mode]" v-model="visible" :width="600" destroy-on-close @closed="$emit('closed')" :close-on-click-modal="false" :close-on-press-escape="false">
+        <el-form ref="dialogForm" :model="formData" :rules="rules" label-width="100px" label-position="top">
+            <el-row :gutter="15">
+                <el-col :span="24">
+                    <el-form-item label="所属店铺" prop="store_id">
+                        <el-input v-model="formData.store_id" placeholder="所属店铺" clearable readonly :style="{ width: '100%' }" @click="selectUser">
+                            <template #append>
+                                <el-tooltip
+                                    effect="dark"
+                                    content="点这里,清除选择"
+                                    placement="top-start"
+                                >
+                                <div class="remove-a" @click="clearUser">清除</div>
+                                </el-tooltip>
+                            </template>
+                        </el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="门店ID" prop="poi_id">
+                        <el-input v-model="formData.poi_id" clearable placeholder="门店ID"></el-input>
+                        <div class="el-form-item-msg"></div>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="门店名称" prop="poi_name">
+                        <el-input v-model="formData.poi_name" clearable placeholder="门店名称"></el-input>
+                        <div class="el-form-item-msg"></div>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="门店地址" prop="poi_address">
+                        <el-input v-model="formData.poi_address" clearable placeholder="门店地址"></el-input>
+                        <div class="el-form-item-msg"></div>
+                    </el-form-item>
+                </el-col>
+            </el-row>
+        </el-form>
+		<template #footer>
+			<el-button @click="visible=false" >取 消</el-button>
+			<el-button type="primary" :loading="isSaveing" @click="submit()">提交</el-button>
+		</template>
+    </el-dialog>
+    <agentData ref="agentData" :multiple="false" @success="handleSuccess"></agentData>
+</template>
+<script>
+import agentData from "@/views/manage/components/store";
+export default {
+    components: {
+        agentData
+    },
+    data(){
+        return {
+            stepActive:1,
+            loading: false,
+            mode:"add",
+            titleMap:{
+                add:"新增门店",
+                edit:"编辑信息"
+            },
+            visible: false,
+            isSaveing: false,
+            formData:{},
+            time:0,
+            submitState:false,
+            disabled:false,
+            rules:{
+                poi_id: [
+                    {required: true, message: '请输入'}
+                ],
+                poi_name: [
+                    {required: true, message: "请输入"}
+                ],
+                poi_address: [
+                    {required: true, message: '请输入'}
+                ],
+                store_id: [
+                    {required: true, message: '请选择'}
+                ]
+            }
+        }
+    },
+    methods:{
+        handleSuccess(data){
+            this.formData.store_id = data.store_id;
+        },
+        clearUser(){
+            this.formData.store_id = "";
+        },
+        selectUser(){
+            this.$nextTick(() => {
+                this.$refs.agentData.open()
+            })
+        },
+        open(mode = 'add'){
+            this.mode = mode;
+            this.visible = true;
+            return this
+        },
+        //表单注入数据
+        setData(data){
+            this.formData = data;
+        },
+        async submit(){
+            var validate = await this.$refs.dialogForm.validate().catch(()=>{});
+            if(!validate){ return false }
+            let submitData = JSON.parse(JSON.stringify(this.formData));
+            var resp = await this.$API.shop.save.post(submitData);
+            if(resp.code !== 1) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.visible = false;
+            this.formData = {};
+            this.submitState = false;
+            this.$emit("success");
+        }
+    }
+}
+</script>
+<style>
+.mt20 {margin-top: 20px;}
+.login-msg-yzm {display: flex;width: 100%;}
+.login-msg-yzm .el-button {margin-left: 10px;--el-button-size:42px;}
+</style>

+ 57 - 0
src/views/manage/shop/store/components/option.vue

@@ -0,0 +1,57 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">按需操作</el-tag>
+        </legend>
+        <div class="op-header">
+            <div class="left-panel">
+                <el-button type="primary" icon="el-icon-plus" @click="table_add()">新增门店</el-button>
+                <el-button icon="el-icon-document" @click="table_batch_status(1)" :disabled="dataSelect.length>0?false:true">启用</el-button>
+                <el-button icon="el-icon-lock" @click="table_batch_status(0)" :disabled="dataSelect.length>0?false:true">禁用</el-button>
+                <!-- <el-button type="primary" icon="el-icon-download" @click="table_export()">导出</el-button> -->
+            </div>
+        </div>
+    </fieldset>
+    <formMain ref="formMain" @success="handleSuccess"></formMain>
+</template>
+
+<script>
+import formMain from './form';
+export default {
+    components: {
+        formMain
+    },
+    props: {
+        type: { type: String, default: "1" },
+        dataSelect: { type: Array, default: () => [] },
+        dataSelectFull: { type: Array, default: () => [] }
+    },
+    data(){
+        return {
+
+        }
+    },
+    methods: {
+        async table_batch_status(status){
+            if (this.dataSelect.length == 0) {
+                return this.$message.error("请选择修改数据")
+            }
+            let submitData = {"id":this.dataSelect,"value":status,"field":"status","type":"batch"};
+            var resp = await this.$API.shop.batch.post(submitData);
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.$emit("success");
+        },
+        handleSuccess(){
+            this.$emit("success");
+        },
+        table_add(){
+            this.$nextTick(() => {
+                this.$refs.formMain.open()
+            })
+        },
+    }
+}
+</script>

+ 47 - 0
src/views/manage/shop/store/components/search.vue

@@ -0,0 +1,47 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">条件筛选</el-tag>
+        </legend>
+        <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right" label-width="100px">
+            <div class="search-form">
+                <div class="form-left">
+                    <el-row :gutter="10">
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-input v-model="searchKey.name" placeholder="门店名称" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>门店名称</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-input v-model="searchKey.poi" placeholder="门店ID" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>门店ID</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-date-picker v-model="searchKey.create" :style="{width: '100%'}" placeholder="请选择创建时间" start-placeholder="开始时间" end-placeholder="结束时间" type="daterange" range-separator="至" @change="searchForm" />
+                        </el-col>
+                    </el-row>
+                </div>
+                <div class="form-line"></div>
+                <div class="form-right">
+                    <el-button type="primary" icon="el-icon-search" @click="searchForm">搜索</el-button>
+                </div>
+            </div>
+        </el-form>
+    </fieldset>
+</template>
+
+<script>
+export default {
+    data(){
+        return {
+            searchKey:{}
+        }
+    },
+    methods: {
+        searchForm(){
+            this.$emit("success",this.searchKey);
+        }
+    }
+}
+</script>

+ 114 - 0
src/views/manage/shop/store/components/table.vue

@@ -0,0 +1,114 @@
+<template>
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+        <el-table-column type="selection" width="50" fixed="left"></el-table-column>
+        <el-table-column label="门店ID" prop="poi_id" width="200" fixed="left"></el-table-column>
+        <el-table-column label="门店名称" prop="poi_name"></el-table-column>
+        <el-table-column label="所属代理" prop="agent" width="200">
+            <template #default="scope">
+                <span v-if="scope.row.agent">{{ scope.row.agent.name }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="所属店铺" prop="agent" width="200">
+            <template #default="scope">
+                <span v-if="scope.row.store">{{ scope.row.store.store_name }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="状态" prop="status" width="120" align="center">
+            <template #default="scope">
+                <div class="status-success" v-if="scope.row.status==1"><sc-status-indicator type="success"></sc-status-indicator> 正常</div>
+                <div class="status-danger" v-else><sc-status-indicator type="danger"></sc-status-indicator> 禁用</div>
+            </template>
+        </el-table-column>
+        <el-table-column label="门店地址" prop="poi_address"></el-table-column>
+        <el-table-column label="创建时间" prop="create_at" width="180"></el-table-column>
+        <el-table-column label="操作" width="140" align="center" fixed="right">
+            <template #default="scope">
+                <el-button-group>
+                    <el-button text type="primary" size="small" @click="table_view(scope.row)">编辑</el-button>
+                    <el-button text type="danger" size="small" @click="table_del(scope.row)">删除</el-button>
+                </el-button-group>
+            </template>
+        </el-table-column>
+    </scTable>
+    <formMain ref="formMain" @success="handleSuccess"></formMain>
+</template>
+
+<script>
+import formMain from './form';
+export default {
+    components: {
+        formMain
+    },
+    data(){
+        return {
+            list: {
+                apiObj: this.$API.shop.list
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    
+    methods: {
+        table_view(data){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("edit").setData(data)
+            })
+        },
+        table_del(data){
+            this.$confirm(`确定要执行删除吗`, '提示', {
+                type: 'warning'
+            }).then(async ()=>{
+                var resp = await this.$API.shop.del.post({"id":data.id});
+                if (resp.code == 0) {
+                    return this.$message.warning(resp.msg);
+                }
+                this.$message.success(resp.msg);
+                this.$refs.table.refresh()
+            }).catch(()=>{})
+        },
+        refresh(){
+            this.$refs.table.refresh()
+        },
+        upData(data){
+            this.$refs.table.upData(data)
+        },
+        handleSuccess(){
+            this.$refs.table.refresh()
+        },
+        sortChange(event){
+            if (event.order) {
+                var data = {
+                    "field":event.prop,
+                    "order":event.order
+                }
+                this.$refs.table.upData(data)
+            } else {
+                this.$refs.table.reload(this.searchKey)
+            }
+            return ;
+        },
+        selectionChange(event){
+            this.dataSelect = [];
+            var arr = [];
+            var arrCompany = [];
+            event.forEach(function(val,index){
+                arr[index] = val.id;
+                arrCompany[index] = val;
+            });
+            this.dataSelectFull = arrCompany;
+            this.dataSelect = arr;
+            this.$emit("success",this.dataSelect);
+            this.$emit("successFull",this.dataSelectFull);
+        },
+        table_passwd(row){
+            this.$nextTick(() => {
+                this.$refs.userPasswd.open("edit").setData(row)
+            })
+        }
+    }
+}
+</script>

+ 47 - 0
src/views/manage/shop/store/index.vue

@@ -0,0 +1,47 @@
+<template>
+    <el-container class="flex-column">
+        <div class="table-search">
+            <search @success="handleSuccess"></search>
+            <optionBtn @success="handleSuccess" :dataSelect="dataSelect" :dataSelectFull="dataSelectFull" type="3"></optionBtn>
+        </div>
+        <el-main class="nopadding">
+            <div class="table-container">
+                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull" type="3"></tablePage>
+            </div>
+        </el-main>
+    </el-container>  
+</template>
+
+<script>
+import search from './components/search';
+import optionBtn from './components/option';
+import tablePage from './components/table';
+export default {
+    components: {
+        search,tablePage,optionBtn
+    },
+    data(){
+        return {
+            searchKey:{},
+            dataSelect:[],
+            dataSelectFull:[],
+        }
+    },
+    methods: {
+        tableHandle(data){
+            this.dataSelect = data;
+        },
+        tableHandleFull(data){
+            this.dataSelectFull = data;
+        },
+        handleSuccess(data){
+            this.$refs.tablePage.upData(data)
+        },
+        handleClick(name){
+            this.activeName = name;
+            this.searchKey.type = name;
+            this.$refs.tablePage.upData(this.searchKey)
+        }
+    }
+}
+</script>

+ 59 - 0
src/views/manage/user/components/search.vue

@@ -0,0 +1,59 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">条件筛选</el-tag>
+        </legend>
+        <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right" label-width="100px">
+            <div class="search-form">
+                <div class="form-left">
+                    <el-row :gutter="10">
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-input v-model="searchKey.truename" placeholder="用户名称" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>用户名称</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-input v-model="searchKey.username" placeholder="登录账号" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>登录账号</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-input v-model="searchKey.mobile" placeholder="手机号码" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>手机号码</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-select v-model="searchKey.status" clearable placeholder="请选择状态" @change="searchForm" :style="{width: '100%'}" class="diy-select">
+                                <el-option value="1" label="禁用"></el-option>
+                                <el-option value="2" label="正常"></el-option>
+                                <template #prefix>状态</template>
+                            </el-select>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-date-picker v-model="searchKey.create" :style="{width: '100%'}" placeholder="请选择创建时间" start-placeholder="开始时间" end-placeholder="结束时间" type="daterange" range-separator="至" @change="searchForm" />
+                        </el-col>
+                    </el-row>
+                </div>
+                <div class="form-line"></div>
+                <div class="form-right">
+                    <el-button type="primary" icon="el-icon-search" @click="searchForm">搜索</el-button>
+                </div>
+            </div>
+        </el-form>
+    </fieldset>
+</template>
+
+<script>
+export default {
+    data(){
+        return {
+            searchKey:{}
+        }
+    },
+    methods: {
+        searchForm(){
+            this.$emit("success",this.searchKey);
+        }
+    }
+}
+</script>

+ 143 - 0
src/views/manage/user/components/table.vue

@@ -0,0 +1,143 @@
+<template>
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+        <el-table-column type="selection" width="50" fixed="left"></el-table-column>
+        <el-table-column label="账户昵称" width="150" fixed="left" prop="truename">
+            <template #default="scope">
+                <span v-if="scope.row.truename">{{ scope.row.truename }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="账户ID" width="150" prop="user_id"></el-table-column>
+        <el-table-column label="登录账号" prop="username" width="150">
+            <template #default="scope">
+                <span v-if="scope.row.username">{{ scope.row.username }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="账户类型" prop="type" width="120" align="center">
+            <template #default="scope">
+                <div class="status-success" v-if="scope.row.type==1"><sc-status-indicator type="success"></sc-status-indicator> 系统管理员</div>
+                <div class="status-danger" v-if="scope.row.type==2"><sc-status-indicator type="danger"></sc-status-indicator> 代理账号</div>
+                <div class="status-info" v-if="scope.row.type==3"><sc-status-indicator type="info"></sc-status-indicator> 店铺账号</div>
+            </template>
+        </el-table-column>
+        <el-table-column label="手机号码" prop="mobile" width="150">
+            <template #default="scope">
+                <span v-if="scope.row.mobile">{{ scope.row.mobile }}</span>
+                <span class="status-danger" v-else>-</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="登录时间" prop="login_at" width="180">
+            <template #default="scope">
+                {{scope.row.login_at?scope.row.login_at:'-'}}
+            </template>
+        </el-table-column>
+        <el-table-column label="登录IP" prop="login_ip" width="180">
+            <template #default="scope">
+                {{scope.row.login_ip?scope.row.login_ip:'-'}}
+            </template>
+        </el-table-column>
+        <el-table-column label="登录次数" prop="login_num" width="180"></el-table-column>
+        <el-table-column label="注册时间" prop="create_at" width="180"></el-table-column>
+        <el-table-column label="注册IP" prop="create_ip" width="180"></el-table-column>
+        <el-table-column label="状态" prop="status" width="120" align="center">
+            <template #default="scope">
+                <el-popconfirm title="确定要启用或冻结该账号吗?" @confirm="table_state(scope.row)">
+                    <template #reference>
+                        <div class="status-success" v-if="scope.row.status==1"><sc-status-indicator type="success"></sc-status-indicator> 正常</div>
+                        <div class="status-danger" v-else><sc-status-indicator type="danger"></sc-status-indicator> 禁用</div>
+                    </template>
+                </el-popconfirm>
+            </template>
+        </el-table-column>
+        <el-table-column label="操作" width="160" align="right" fixed="right">
+            <template #default="scope">
+                <el-button-group>
+                    <el-button text type="warning" size="small" @click="table_passwd(scope.row)">修改密码</el-button>
+                    <el-popconfirm title="确定删除吗?" @confirm="table_del(scope.row, scope.$index)">
+                        <template #reference>
+                            <el-button text type="danger" size="small">删除</el-button>
+                        </template>
+                    </el-popconfirm>                    
+                </el-button-group>
+            </template>
+        </el-table-column>
+    </scTable>
+    <passwd ref="userPasswd"></passwd>
+</template>
+
+<script>
+import passwd from "@/views/manage/user/password";
+export default {
+    components: {
+        passwd
+    },
+    props: {
+        type: { type: String, default: "1" }
+    },
+    data(){
+        return {
+            list: {
+                apiObj: this.$API.user.list
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    methods: {
+        async table_state(data){
+            var status = 1;
+            if (data.status == 1) {
+                status = 0;
+            }
+            var resp = await this.$API.user.state.post({"id":data.id});
+            if (resp.code == 0) {
+                this.$message.warning(resp.msg)
+                return false;
+            }
+            this.$message.success(resp.msg)
+            this.$refs.table.refresh()
+        },
+        refresh(){
+            this.$refs.table.refresh()
+        },
+        upData(data){
+            this.$refs.table.upData(data)
+        },
+        handleSuccess(){
+            this.$refs.table.refresh()
+        },
+        sortChange(event){
+            if (event.order) {
+                var data = {
+                    "field":event.prop,
+                    "order":event.order
+                }
+                this.$refs.table.upData(data)
+            } else {
+                this.$refs.table.reload(this.searchKey)
+            }
+            return ;
+        },
+        selectionChange(event){
+            this.dataSelect = [];
+            var arr = [];
+            var arrCompany = [];
+            event.forEach(function(val,index){
+                arr[index] = val.id;
+                arrCompany[index] = val;
+            });
+            this.dataSelectFull = arrCompany;
+            this.dataSelect = arr;
+            this.$emit("success",this.dataSelect);
+            this.$emit("successFull",this.dataSelectFull);
+        },
+        table_passwd(row){
+            this.$nextTick(() => {
+                this.$refs.userPasswd.open("edit").setData(row)
+            })
+        },
+    }
+}
+</script>

+ 45 - 0
src/views/manage/user/index.vue

@@ -0,0 +1,45 @@
+<template>
+    <el-container class="flex-column">
+        <div class="table-search">
+            <search @success="handleSuccess"></search>
+        </div>
+        <el-main class="nopadding">
+            <div class="table-container">
+                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull" type="2"></tablePage>
+            </div>
+        </el-main>
+    </el-container>  
+</template>
+
+<script>
+import search from './components/search';
+import tablePage from './components/table';
+export default {
+    components: {
+        search,tablePage
+    },
+    data(){
+        return {
+            searchKey:{},
+            dataSelect:[],
+            dataSelectFull:[],
+        }
+    },
+    methods: {
+        tableHandle(data){
+            this.dataSelect = data;
+        },
+        tableHandleFull(data){
+            this.dataSelectFull = data;
+        },
+        handleSuccess(data){
+            this.$refs.tablePage.upData(data)
+        },
+        handleClick(name){
+            this.activeName = name;
+            this.searchKey.type = name;
+            this.$refs.tablePage.upData(this.searchKey)
+        }
+    }
+}
+</script>

+ 96 - 0
src/views/manage/user/password.vue

@@ -0,0 +1,96 @@
+<template>
+    <el-dialog :title="titleMap[mode]" v-model="visible" :width="500" destroy-on-close @closed="$emit('closed')">
+        <el-form :model="formData" :rules="rules" :disabled="mode=='show'" ref="dialogForm" label-position="top" label-width="120px">
+            <el-form-item label="登录账号">
+				<el-input v-model="formData.username" disabled></el-input>
+			</el-form-item>
+            <el-form-item label="账号昵称">
+				<el-input v-model="formData.truename" disabled></el-input>
+			</el-form-item>
+            <el-form-item label="新密码" prop="password">
+                <el-input type="password" v-model="formData.password" clearable show-password></el-input>
+            </el-form-item>
+            <el-form-item label="确认新密码" prop="password2">
+                <el-input type="password" v-model="formData.password2" clearable show-password></el-input>
+            </el-form-item>
+        </el-form>
+		<template #footer>
+			<el-button @click="visible=false" >取 消</el-button>
+			<el-button v-if="mode!='show'" type="primary" :loading="isSaveing" @click="submit()">保 存</el-button>
+		</template>
+    </el-dialog>
+</template>
+
+<script>
+import scPasswordStrength from '@/components/scPasswordStrength'
+export default{
+    components: {
+        scPasswordStrength
+    },
+    data(){
+        return {
+            loading: false,
+            mode:"edit",
+            titleMap:{
+                edit:"修改密码"
+            },
+            visible: false,
+            isSaveing: false,
+            formData:{},
+            rules:{
+                password: [
+                    {required: true, message: '请输入登录密码'}
+                ],
+                password2: [
+                    {required: true, message: '请再次输入密码'},
+                    {validator: (rule, value, callback) => {
+                        if (value !== this.formData.password) {
+                            callback(new Error('两次输入密码不一致!'));
+                        }else{
+                            callback();
+                        }
+                    }}
+                ],
+            }
+        }
+    },
+    methods:{
+        open(mode = 'edit'){
+            this.mode = mode;
+            this.visible = true;
+            return this
+        },
+        //表单注入数据
+        setData(data){
+            data.password = "";
+            data.password2 = "";
+            this.formData = data;
+        },
+        submit(){
+            this.isSaveing = true;
+            this.$refs.dialogForm.validate(async (valid) => {
+                if (valid) {
+                    let password = this.$TOOL.crypto.MD5(this.formData.password);
+                    var result = await this.$API.user.pwd.post({password:password,id:this.formData.id});
+                    if(result.code !== 1){
+                        this.$message.warning(result.msg)
+                        this.isSaveing = false;
+                        return false;
+                    }
+                    this.$message.success(result.msg)
+                    this.isSaveing = false;
+                    this.visible = false;
+                    this.formData = {};
+                }else{
+                    this.isSaveing = false;
+                    return false;
+                }
+            });
+        }
+    }
+}
+</script>
+
+<style lang="less" scoped>
+
+</style>