Zory 3 週間 前
コミット
b7a10fb084

+ 4 - 11
src/api/model/store.js

@@ -3,35 +3,28 @@ import http from "@/utils/request";
 
 export default {
     list: {
-        url: `${config.API_URL}/agent/list`,
+        url: `${config.API_URL}/store/list`,
         name: "-",
         get: async function (data = {}) {
             return await http.get(this.url, data);
         }
     },
     save: {
-        url: `${config.API_URL}/agent/save`,
+        url: `${config.API_URL}/store/save`,
         name: "-",
         post: async function (data = {}) {
             return await http.post(this.url, data);
         },
     },
     del: {
-        url: `${config.API_URL}/agent/del`,
+        url: `${config.API_URL}/store/del`,
         name: "-",
         post: async function (data = {}) {
             return await http.post(this.url, data);
         },
     },
     batch: {
-        url: `${config.API_URL}/agent/batch`,
-        name: "-",
-        post: async function (data = {}) {
-            return await http.post(this.url, data);
-        },
-    },
-    time: {
-        url: `${config.API_URL}/agent/time`,
+        url: `${config.API_URL}/store/batch`,
         name: "-",
         post: async function (data = {}) {
             return await http.post(this.url, data);

+ 0 - 5
src/views/login/components/mobile.vue

@@ -172,11 +172,6 @@ export default {
 					})
 					return false
 				}
-				if (userData.data.is_mch == 2) {
-					this.$store.commit("SET_layout", "header")
-				} else {
-					this.$store.commit("TOGGLE_layoutTags")
-				}
 				this.$TOOL.data.set("USER_TYPE", userData.data.type)
 				this.$TOOL.data.set("USER_INFO", userData.data)
 				this.$TOOL.data.set("MENU", menu.data.menu)

+ 1 - 1
src/views/manage/setting/menu/index.vue

@@ -35,7 +35,7 @@
 		</el-aside>
 		<el-container>
 			<el-main class="nopadding" style="padding:20px;" ref="main">
-				<save ref="save" @success="getMenu" :menu="menuList"></save>
+				<save ref="save" @success="getMenu" :type="activeName" :menu="menuList"></save>
 			</el-main>
 		</el-container>
 	</el-container>

+ 7 - 0
src/views/manage/setting/menu/save.vue

@@ -37,6 +37,12 @@
 						</el-input>
 						<div class="el-form-item-msg">如父节点、链接或Iframe等没有视图的菜单不需要填写</div>
 					</el-form-item>
+					<el-form-item label="洗衣能力" prop="is_hide" v-if="type==3">
+						<el-radio-group v-model="form.is_hide">
+							<el-radio-button :label="1">门店自洗</el-radio-button>
+							<el-radio-button :label="0">洗衣地址</el-radio-button>
+						</el-radio-group>
+					</el-form-item>
 					<el-form-item label="排序" prop="sort">
 						<el-input v-model="form.sort" clearable placeholder=""></el-input>
 					</el-form-item>
@@ -61,6 +67,7 @@
         emits: ['success'],
 		props: {
 			menu: { type: Object, default: () => {} },
+			type: { type: String, default: "" },
 		},
 		data(){
 			return {

+ 1 - 1
src/views/manage/user/merchant/components/table.vue

@@ -1,5 +1,5 @@
 <template>
-    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id" border>
         <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>

+ 1 - 0
src/views/manage/user/merchant/user/form.vue

@@ -178,6 +178,7 @@ export default {
             submitData.password2 = this.$TOOL.crypto.MD5(this.formData.password2)
             if (this.mode == 'add') {
                 submitData.scene = "register";
+                submitData.type = 2;
                 submitData.agent_id = this.dataForm.agent_id;
                 submitData.vip_at = this.$TOOL.dateFormat(this.dataForm.vip_at, "yyyy-MM-dd");
             }

+ 1 - 1
src/views/manage/user/merchant/user/list.vue

@@ -16,7 +16,7 @@
                 <optionBtn @success="handleSuccess" :agent="formData" :dataSelect="dataSelect" :dataSelectFull="dataSelectFull" ></optionBtn>
             </div>
             <el-main>
-                <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+                <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id" border>
                     <el-table-column type="selection" width="50" fixed="left"></el-table-column>
                     <el-table-column label="登录账号" prop="truename" width="150" fixed="left">
                         <template #default="scope">

+ 23 - 27
src/views/manage/user/store/components/form.vue

@@ -14,7 +14,6 @@
             <el-steps simple :active="stepActive" finish-status="success">
                 <el-step title="基础信息"></el-step>
                 <el-step title="其他信息"></el-step>
-                <el-step title="财务配置"></el-step>
                 <el-step title="角色账号"></el-step>
             </el-steps>
             <el-main>
@@ -85,22 +84,6 @@
                                 <el-radio :label="2">已失效</el-radio>
                             </el-radio-group>
                         </el-form-item>
-                        <el-form-item label="自建商品" prop="store_goods">
-                            <el-radio-group v-model="formData.store_goods">
-                                <el-radio :label="1">开启</el-radio>
-                                <el-radio :label="2">关闭</el-radio>
-                            </el-radio-group>
-                            <div class="el-form-item-msg">温馨提示:开启后,门店可自主创建、发布商品并售卖。总部可进行查看、上下架和删除等管理操作</div>
-                        </el-form-item>
-                        <el-form-item label="总部审核" prop="store_system">
-                            <el-radio-group v-model="formData.store_system">
-                                <el-radio :label="1">手动审核</el-radio>
-                                <el-radio :label="2">自动通过审核</el-radio>
-                            </el-radio-group>
-                            <div class="el-form-item-msg">温馨提示:手动审核时,总部需要审核通过店铺自主创建的商品后,店铺才能销售该商品</div>
-                        </el-form-item>
-                    </template>
-                    <template class="mt20" v-if="stepActive==3">
                         <el-form-item label="独立财务" prop="store_order">
                             <el-radio-group v-model="formData.store_order">
                                 <el-radio :label="1">关闭</el-radio>
@@ -125,7 +108,7 @@
                             <div class="el-form-item-msg"></div>
                         </el-form-item>
                     </template>
-                    <template class="mt20" v-if="stepActive==4">
+                    <template class="mt20" v-if="stepActive==3">
                         <el-form-item label="登录账号" prop="username">
                             <el-input v-model="formData.username" clearable placeholder="请输入登录账号"></el-input>
                             <div class="el-form-item-msg">不设置登录账号可以使用手机号码登录</div>
@@ -161,7 +144,7 @@
             <el-footer style="text-align: right;">
                 <el-button @click="cancel">取 消</el-button>
                 <el-button type="danger" :loading="isSaveing" @click="submitPre()" v-if="stepActive > 1 ">上一步</el-button>
-                <el-button type="primary" :loading="isSaveing" @click="submit(stepActive)">{{ stepActive==4?'提交':'下一步' }}</el-button>
+                <el-button type="primary" :loading="isSaveing" @click="submit(stepActive)">{{ stepActive==3?'提交':'下一步' }}</el-button>
             </el-footer>
         </el-container>
     </el-drawer>
@@ -187,6 +170,8 @@ export default {
             formData:{
                 license:"https://washmy.oss-cn-guangzhou.aliyuncs.com/storage/5e1a79764c588ff81d0e09ccc26d2c85c9a6425f.png", // https://washmy.oss-cn-guangzhou.aliyuncs.com/storage/5e1a79764c588ff81d0e09ccc26d2c85c9a6425f.png
             },
+            time:60,
+            disabled:false,
             rules:{
                 store_order: [
                     {required: true, message: '请选择'}
@@ -194,12 +179,6 @@ export default {
                 store_status: [
                     {required: true, message: '请选择'}
                 ],
-                store_goods: [
-                    {required: true, message: '请选择'}
-                ],
-                store_system: [
-                    {required: true, message: '请选择'}
-                ],
                 agent_id: [
                     {required: true, message: '请选择'}
                 ],
@@ -331,7 +310,7 @@ export default {
         async submit(){
             var validate = await this.$refs.dialogForm.validate().catch(()=>{});
             if(!validate){ return false }
-            if (this.stepActive < 4) {
+            if (this.stepActive < 3) {
                 this.stepActive++;
             } else {
                 this.submitState = true;
@@ -357,4 +336,21 @@ export default {
 
     }
 }
-</script>
+</script>
+
+<style>
+
+.login-msg-yzm {display: flex;width: 100%;}
+.login-msg-yzm .el-button {margin-left: 10px;--el-button-size:42px;}
+.login-msg-yzm .captcha{
+	display: flex;
+	align-items: center;
+	cursor: pointer;
+    border: var(--el-border);
+    margin-left: 10px;
+	border-radius: 2px;
+}
+.captcha img{
+	height: 32px;
+}
+</style>

+ 131 - 2
src/views/manage/user/store/components/table.vue

@@ -1,7 +1,136 @@
 <template>
-    <div></div>
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id" border>
+        <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">
+            <template #default="scope">
+                <span v-if="scope.row.user.username">{{ scope.row.user.username }}</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.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.store_code?scope.row.store_code:'-'}}
+            </template>
+        </el-table-column>
+        <el-table-column label="店长名称" prop="login_at" width="180">
+            <template #default="scope">
+                {{scope.row.store_mch?scope.row.store_mch:'-'}}
+            </template>
+        </el-table-column>
+        <el-table-column label="门店状态" prop="login_at" width="100" align="center">
+            <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>
+            </template>
+        </el-table-column>
+        <el-table-column label="独立财务" prop="login_at" width="100" 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>
+            </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="操作" width="200" align="right" fixed="right">
+            <template #default="scope">
+                <el-button-group>
+                    <el-button text size="small" @click="table_user(scope.row)">用户管理</el-button>
+                    <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>
+    <userMain ref="userMain" @success="handleSuccess"></userMain>
 </template>
 
 <script>
-
+import formMain from './form';
+import userMain from './user.vue';
+export default {
+    components: {
+        formMain,userMain
+    },
+    props: {
+        type: { type: String, default: "1" }
+    },
+    data(){
+        return {
+            list: {
+                apiObj: this.$API.store.list
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    methods: {
+        async table_del(data){
+            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.$refs.table.refresh()
+        },
+        table_user(row){
+            this.$nextTick(() => {
+                this.$refs.userMain.open("edit").setData(row)
+            })
+        },
+        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>

+ 147 - 0
src/views/manage/user/store/components/user.vue

@@ -0,0 +1,147 @@
+<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] }} <span class="tips">{{ formData.truename }}</span></div>
+                        <div class="drawer-detail-header-left">
+                            <el-button type="default" icon="el-icon-close" @click="visible=false"></el-button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="table-search">
+                <search @success="handleSuccess"></search>
+                <optionBtn @success="handleSuccess" :agent="formData" :dataSelect="dataSelect" :dataSelectFull="dataSelectFull" ></optionBtn>
+            </div>
+            <el-main>
+                <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id" border>
+                    <el-table-column type="selection" width="50" fixed="left"></el-table-column>
+                    <el-table-column label="登录账号" prop="truename" width="150" fixed="left">
+                        <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="账号ID" prop="user_id" width="150"></el-table-column>
+                    <el-table-column label="账号名称" prop="truename" width="200">
+                        <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="手机号码" 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="type" width="120" align="center">
+                        <template #default="scope">
+                            <div class="status-success" v-if="scope.row.type==3 && formData.store_id == scope.row.user_id"><sc-status-indicator type="success"></sc-status-indicator> 主账号</div>
+                            <div class="status-success" v-if="scope.row.type==3 && formData.store_id !== scope.row.user_id"><sc-status-indicator type="success"></sc-status-indicator> 子账号</div>
+                        </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-if="scope.row.status==2"><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="120" align="right" fixed="right">
+                        <template #default="scope">
+                            <el-button-group>
+                                <el-button text type="warning" size="small" @click="table_edit(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>
+            </el-main>
+            <el-footer>
+                <el-button @click="visible=false">关 闭</el-button>
+            </el-footer>
+        </el-container>
+    </el-drawer>
+    <formMain ref="formMain" @success="handleSuccess"></formMain>
+</template>
+
+<script>
+import search from '@/views/manage/user/merchant/user/search';
+import optionBtn from '@/views/manage/user/merchant/user/option';
+import formMain from './user_form';
+export default{
+    components: {
+        search,optionBtn,formMain
+    },
+    data(){
+        return {
+            loading: false,
+            mode:"add",
+            visible: false,
+            titleMap:{
+                add:"门店名下用户",
+                edit:"门店名下用户"
+            },
+            list: {
+                apiObj: this.$API.user.list
+            },
+            formData:{},
+            searchKey:{},
+            dataSelect:[],
+            dataSelectFull:[],
+        }
+    },
+    methods:{
+        async table_del(data){
+            var resp = await this.$API.user.del.post({"id":data.id});
+            if (resp.code == 0) {
+                return this.$message.warning(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.$refs.table.refresh()
+        },
+        table_edit(row){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("edit").setData(row)
+            })
+        },
+        open(mode = 'add'){
+            this.mode = mode;
+            this.visible = true;
+            return this
+        },
+        //表单注入数据
+        setData(data){
+            this.formData = data;
+            this.searchKey.store = data.store_id;
+        },
+        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;
+        },
+        refresh(){
+            this.$refs.table.refresh()
+        },
+        upData(data){
+            this.$refs.table.upData(data)
+        },
+        handleSuccess(data){
+            this.$refs.table.upData(data)
+        },
+    }
+}
+</script>

+ 199 - 0
src/views/manage/user/store/components/user_form.vue

@@ -0,0 +1,199 @@
+<template>
+    <el-dialog :title="titleMap[mode]" v-model="visible" :width="660" 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="10">
+                <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" v-if="mode=='add'">
+                    <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" v-if="mode=='edit'">
+                    <el-form-item label="登录账号">
+                        <el-input v-model="dataForm.username" :disabled="true" clearable placeholder="请输入登录账号"></el-input>
+                        <div class="el-form-item-msg">不设置登录账号可以使用手机号码登录</div>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12" v-if="mode=='add'">
+                    <el-form-item prop="mobile" :label="$t('login.mobilePlaceholder')">
+                        <el-input v-model="formData.mobile" clearable :placeholder="$t('login.mobilePlaceholder')">
+                            <template #prepend>+86</template>
+                        </el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12" v-if="mode=='add'">
+                    <el-form-item prop="yzm" :label="$t('login.smsPlaceholder')">
+                        <div class="login-msg-yzm">
+                            <el-input v-model="formData.yzm" clearable :placeholder="$t('login.smsPlaceholder')"></el-input>
+                            <el-button @click="getYzm" :disabled="disabled">{{this.$t('login.smsGet')}}<span v-if="disabled"> ({{time}})</span></el-button>
+                        </div>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12" v-if="mode=='add'">
+                    <el-form-item prop="captcha" :label="$t('login.code')">
+                        <div class="login-msg-yzm">
+                            <el-input v-model="formData.captcha" clearable :placeholder="$t('login.codeErr')"></el-input>
+                            <el-tooltip placement="top-start" :content="$t('login.codeTips')">
+                                <div class="captcha" @click="getCaptcha"><img :src="captcha.base64" /></div>
+                            </el-tooltip>
+                        </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>
+        </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:"编辑账号"
+            },
+            rules:{
+                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();
+                        }
+                    }}
+                ],
+                mobile: [
+                    { required: true, message: this.$t('login.mobileError'), trigger: 'blur' },
+                    {
+                        validator: (rule, value, callback) => {
+                            const phoneReg = /^1[3-9]\d{9}$/ // 手机号正则
+                            const landlineReg = /^(?:(?:\d{3}-)?\d{8}|^(?:\d{4}-)?\d{7,8})(?:-\d+)?$/
+                            if (!value) {
+                                callback(new Error('请输入联系方式'))
+                            } else if (!phoneReg.test(value) && !landlineReg.test(value)) {
+                                callback(new Error('请输入有效的手机号码号码'))
+                            } else {
+                                callback()
+                            }
+                        },
+                        trigger: 'blur'
+                    }
+                ],
+                yzm: [
+                    {required: true, message: this.$t('login.smsError')}
+                ],
+                captcha: [
+                    {required: true, message: this.$t('login.codeErr')}
+                ],
+            },
+            visible: false,
+            isSaveing: false,
+            formData:{},
+            captcha:{},
+            dataForm:{}
+        }
+    },
+    methods:{
+        open(mode = 'add'){
+            this.mode = mode;
+            this.visible = true;
+            if (mode == 'add') {
+                this.getCaptcha();
+            }
+            return this
+        },
+        async getCaptcha(){
+            var resp = await this.$API.common.captcha.get();
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.captcha = resp.data;
+        },
+        async getYzm(){
+			var field = ["mobile","captcha"];
+			this.$refs.dialogForm.validateField(field, async (valid) => {
+				if(!valid){
+					return false
+				}
+                var resp = await this.$API.common.sms.post({"mobile":this.formData.mobile,"code":this.formData.captcha,"key":this.captcha.key,"scene":"register"});
+                if (resp.code == 0) {
+                    this.getCaptcha();
+                    return this.$message.error(resp.msg);
+                }
+                this.$message.success(resp.msg)
+                this.disabled = true
+                this.time = 60
+                var t = setInterval(() => {
+                    this.time -= 1
+                    if(this.time < 1){
+                        clearInterval(t)
+                        this.disabled = false
+                        this.time = 0
+                    }
+                },1000)
+            });            
+        },
+        //表单注入数据
+        setData(data){
+            console.log(data)
+            if (this.mode == 'edit') {
+                this.formData.truename = data.truename;
+                this.formData.id = data.id;
+            }
+            this.dataForm = data;
+        },
+        async submit(){
+            var validate = await this.$refs.dialogForm.validate().catch(()=>{});
+            if(!validate){ return false }
+            let submitData = JSON.parse(JSON.stringify(this.formData));
+            submitData.password = this.$TOOL.crypto.MD5(this.formData.password)
+            submitData.password2 = this.$TOOL.crypto.MD5(this.formData.password2)
+            if (this.mode == 'add') {
+                submitData.scene = "register";
+                submitData.type = 3;
+                submitData.store_id = this.dataForm.store_id;
+                submitData.agent_id = this.dataForm.agent_id;
+                submitData.vip_at = this.$TOOL.dateFormat(this.dataForm.vip_at, "yyyy-MM-dd");
+            }
+            this.isSaveing = true;
+            var resp = await this.$API.user.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.$emit("success");
+        }
+    }
+}
+</script>

+ 7 - 0
src/views/store/goods/douyin/index.vue

@@ -0,0 +1,7 @@
+<template>
+    <div></div>
+</template>
+
+<script>
+
+</script>

+ 7 - 0
src/views/store/goods/mall/index.vue

@@ -0,0 +1,7 @@
+<template>
+    <div></div>
+</template>
+
+<script>
+
+</script>

+ 7 - 0
src/views/store/goods/price/index.vue

@@ -0,0 +1,7 @@
+<template>
+    <div></div>
+</template>
+
+<script>
+
+</script>

+ 7 - 0
src/views/store/member/consume/index.vue

@@ -0,0 +1,7 @@
+<template>
+    <div></div>
+</template>
+
+<script>
+
+</script>

+ 7 - 0
src/views/store/member/list/index.vue

@@ -0,0 +1,7 @@
+<template>
+    <div></div>
+</template>
+
+<script>
+
+</script>

+ 7 - 0
src/views/store/member/recharge/index.vue

@@ -0,0 +1,7 @@
+<template>
+    <div></div>
+</template>
+
+<script>
+
+</script>

+ 7 - 0
src/views/store/order/confirm/index.vue

@@ -0,0 +1,7 @@
+<template>
+    <div></div>
+</template>
+
+<script>
+
+</script>

+ 7 - 0
src/views/store/order/douyin/index.vue

@@ -0,0 +1,7 @@
+<template>
+    <div></div>
+</template>
+
+<script>
+
+</script>

+ 7 - 0
src/views/store/order/store/index.vue

@@ -0,0 +1,7 @@
+<template>
+    <div></div>
+</template>
+
+<script>
+
+</script>

+ 7 - 0
src/views/store/store/clothes/index.vue

@@ -0,0 +1,7 @@
+<template>
+    <div></div>
+</template>
+
+<script>
+
+</script>

+ 7 - 0
src/views/store/store/create/index.vue

@@ -0,0 +1,7 @@
+<template>
+    <div></div>
+</template>
+
+<script>
+
+</script>

+ 7 - 0
src/views/store/store/detail/index.vue

@@ -0,0 +1,7 @@
+<template>
+    <div></div>
+</template>
+
+<script>
+
+</script>

+ 7 - 0
src/views/store/store/inspection/index.vue

@@ -0,0 +1,7 @@
+<template>
+    <div></div>
+</template>
+
+<script>
+
+</script>

+ 7 - 0
src/views/store/store/preflight/index.vue

@@ -0,0 +1,7 @@
+<template>
+    <div></div>
+</template>
+
+<script>
+
+</script>