zory 3 недель назад
Родитель
Сommit
a20a8c0686

+ 2 - 0
src/views/store/member/consume/components/option.vue

@@ -0,0 +1,2 @@
+<template>
+</template>

+ 59 - 0
src/views/store/member/consume/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.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.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-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: {
+        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>

+ 70 - 0
src/views/store/member/consume/components/table.vue

@@ -0,0 +1,70 @@
+<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="220" fixed="left" prop="order_sn"></el-table-column>
+        <el-table-column label="会员昵称" prop="name"></el-table-column>
+        <el-table-column label="手机号码" prop="tel"></el-table-column>
+        <el-table-column label="消费金额" prop="money">
+            <template #default="scope">
+                ¥{{ scope.row.money }}
+            </template>
+        </el-table-column>
+        <el-table-column label="交易时间" prop="create_at" width="180"></el-table-column>
+    </scTable>
+</template>
+
+<script>
+export default{
+    data(){
+        return {
+            list: {
+                apiObj: this.$API.storeLog.log
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    methods: {
+        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 - 6
src/views/store/member/consume/index.vue

@@ -1,7 +1,47 @@
-<template>
-    <div></div>
-</template>
-
-<script>
-
+<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>

+ 99 - 0
src/views/store/member/list/components/form.vue

@@ -0,0 +1,99 @@
+<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="right">
+            <el-form-item label="会员名称" prop="name">
+                <el-input v-model="formData.name" clearable placeholder="请输入会员名称"></el-input>
+            </el-form-item>
+            <el-form-item label="会员手机号" prop="mobile">
+                <el-input v-model="formData.mobile" clearable placeholder="请输入会员手机号"></el-input>
+            </el-form-item>
+            <el-form-item label="会员生日" prop="birthday">
+                <el-date-picker v-model="formData.birthday" format='YYYY-MM-DD' value-format="YYYY-MM-DD" type="date" placeholder="请选择"/>
+            </el-form-item>
+            <el-form-item label="会员性别" prop="sex">
+                <el-radio-group v-model="formData.sex">
+                    <el-radio :label="1">男</el-radio>
+                    <el-radio :label="2">女</el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item label="会员联系地址" prop="address">
+                <el-input v-model="formData.address" clearable placeholder="请输入会员联系地址"></el-input>
+            </el-form-item>
+            <el-form-item label="备注" prop="remark">
+                <el-input type="textarea" v-model="formData.remark" clearable placeholder="请输入备注"></el-input>
+            </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:{
+                sex:1
+            },
+            rules:{
+                name: [
+                    {required: true, message: '请输入会员名称'}
+                ],
+                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'
+                    }
+                ],
+            }
+        }
+    },
+    methods: {
+        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.storeUser.save.post(submitData);
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.visible = false;
+            this.formData = {
+                sex:1
+            };
+            this.$emit("success");
+        }
+    }
+}
+</script>

+ 44 - 0
src/views/store/member/list/components/option.vue

@@ -0,0 +1,44 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">按需操作</el-tag>
+        </legend>
+        <div class="op-header">
+            <div class="left-panel">
+                <el-button type="success" icon="el-icon-plus" @click="table_add()">新建会员</el-button>
+                <el-button type="danger" icon="el-icon-delete" @click="table_del()" :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: {
+        handleSuccess(){
+            this.$emit("success");
+        },
+        table_add(){
+            this.$nextTick(() => {
+                this.$refs.formMain.open()
+            })
+        },
+    }
+}
+</script>

+ 59 - 0
src/views/store/member/list/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.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.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-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: {
+        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>

+ 112 - 0
src/views/store/member/list/components/table.vue

@@ -0,0 +1,112 @@
+<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="会员卡号" width="150" prop="user_no"></el-table-column>
+        <el-table-column label="手机号码" width="150" prop="tel"></el-table-column>
+        <el-table-column label="可用余额(元)" prop="login_at" width="180">
+            <template #default="scope">
+                {{scope.row.format_balance?scope.row.format_balance:'0.00'}}
+            </template>
+        </el-table-column>
+        <el-table-column label="累计消费金额(元)" prop="login_at" width="180">
+            <template #default="scope">
+                {{scope.row.format_total?scope.row.format_total:'0.00'}}
+            </template>
+        </el-table-column>
+        <el-table-column label="会员性别" width="150" prop="format_sex"></el-table-column>
+        <el-table-column label="会员生日" width="150" prop="brithday"></el-table-column>
+        <el-table-column label="最后充值时间" prop="login_at" width="180">
+            <template #default="scope">
+                {{scope.row.last_at?scope.row.last_at:'-'}}
+            </template>
+        </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="操作" width="160" align="left" fixed="right">
+            <template #default="scope">
+                <el-button-group>
+                    <!-- <el-button text type="primary" 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>
+    <formMain ref="formMain" @success="handleSuccess"></formMain>
+</template>
+<script>
+import formMain from './form';
+export default {
+    components: {
+        formMain
+    },
+    data(){
+        return {
+            list: {
+                apiObj: this.$API.storeUser.get
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    methods: {
+        table_edit(data){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("edit").setData(data)
+            })
+        },
+        async table_del(data){
+            var resp = await this.$API.storeUser.del.post({"id":data.id});
+            if (resp.code == 0) {
+                return this.$message.warning(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.userPasswd.open("edit").setData(row)
+            })
+        },
+    }
+}
+</script>

+ 46 - 6
src/views/store/member/list/index.vue

@@ -1,7 +1,47 @@
-<template>
-    <div></div>
-</template>
-
-<script>
-
+<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>

+ 2 - 0
src/views/store/member/recharge/components/option.vue

@@ -0,0 +1,2 @@
+<template>
+</template>

+ 59 - 0
src/views/store/member/recharge/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.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.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-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: {
+        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>

+ 76 - 0
src/views/store/member/recharge/components/table.vue

@@ -0,0 +1,76 @@
+<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="220" fixed="left" prop="order_sn"></el-table-column>
+        <el-table-column label="会员昵称" prop="name"></el-table-column>
+        <el-table-column label="手机号码" prop="tel"></el-table-column>
+        <el-table-column label="充值金额" prop="money">
+            <template #default="scope">
+                ¥{{ scope.row.money }}
+            </template>
+        </el-table-column>
+        <el-table-column label="充值方式" prop="type">
+            <template #default="scope">
+                <div class="status-danger" v-if="scope.row.type==2"><sc-status-indicator type="danger"></sc-status-indicator> 微信支付</div>
+                <div class="status-danger" v-else><sc-status-indicator type="danger"></sc-status-indicator> PC端现金支付</div>
+            </template>
+        </el-table-column>
+        <el-table-column label="充值时间" prop="create_at" width="180"></el-table-column>
+    </scTable>
+</template>
+
+<script>
+export default{
+    data(){
+        return {
+            list: {
+                apiObj: this.$API.storeLog.recharge
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    methods: {
+        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 - 6
src/views/store/member/recharge/index.vue

@@ -1,7 +1,47 @@
-<template>
-    <div></div>
-</template>
-
-<script>
-
+<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>