修复总结后的问题,详见企业微信文档

This commit is contained in:
gyq
2026-05-07 14:34:03 +08:00
parent ffad9432c5
commit ea5a4c14e9
41 changed files with 2678 additions and 1120 deletions

View File

@@ -7,7 +7,7 @@
<el-input v-model="state.query.name" clearable placeholder="请输入分店名称" style="width: 100%" class="filter-item"
@keyup.enter="getTableData" />
</el-col>
<el-col :span="16">
<el-button type="primary" @click="getTableData">查询</el-button>
@@ -22,35 +22,43 @@
</el-row>
</el-card>
</div>
<div style="padding-bottom: 14px;">
<el-alert title="分店需由工作人员协助开通" type="warning" :closable="false" show-icon />
</div>
<div class="head-container">
<el-card shadow="never">
<el-table v-loading="state.tableData.loading" :data="state.tableData.list">
<el-table-column prop="id" label="ID" width="80" />
<el-table-column label="店铺信息">
<template v-slot="scope">
<div>{{ scope.row.shopName }}{{ scope.row.shopType == 'chain' ? '(连锁店)' : scope.row.shopType == 'join' ? '(加盟店)' : '' }}</div>
<div>{{ scope.row.shopName }}{{ scope.row.shopType == 'chain' ? '(连锁店)' : scope.row.shopType == 'join' ?
'(加盟店)' : '' }}</div>
<div>账号{{ scope.row.account }}</div>
<div>联系电话{{ scope.row.phone }}</div>
</template>
</el-table-column>
<el-table-column prop="isEnableProdSync" label="商品同步" width="120">
<template v-slot="scope">
<el-tag :type="scope.row.isEnableProdSync == 1 ? 'success' : 'error'" effect="dark"> {{ scope.row.isEnableProdSync == 1 ? '启用' : '禁用' }} </el-tag>
<el-tag :type="scope.row.isEnableProdSync == 1 ? 'success' : 'error'" effect="dark"> {{
scope.row.isEnableProdSync == 1 ? '启用' : '禁用' }} </el-tag>
</template>
</el-table-column>
<el-table-column prop="isEnableVipSync" label="会员同步" width="120">
<template v-slot="scope">
<el-tag :type="scope.row.isEnableVipSync == 1 ? 'success' : 'error'" effect="dark"> {{ scope.row.isEnableVipSync == 1 ? '启用' : '禁用' }} </el-tag>
<el-tag :type="scope.row.isEnableVipSync == 1 ? 'success' : 'error'" effect="dark"> {{
scope.row.isEnableVipSync == 1 ? '启用' : '禁用' }} </el-tag>
</template>
</el-table-column>
<el-table-column prop="isEnableConsSync" label="耗材同步" width="120">
<template v-slot="scope">
<el-tag :type="scope.row.isEnableConsSync == 1 ? 'success' : 'error'" effect="dark"> {{ scope.row.isEnableConsSync == 1 ? '启用' : '禁用' }} </el-tag>
<el-tag :type="scope.row.isEnableConsSync == 1 ? 'success' : 'error'" effect="dark"> {{
scope.row.isEnableConsSync == 1 ? '启用' : '禁用' }} </el-tag>
</template>
</el-table-column>
<el-table-column prop="isAllowAccountLogin" label="账号状态" width="120">
<template v-slot="scope">
<el-tag :type="scope.row.isAllowAccountLogin == 1 ? 'success' : 'error'" effect="dark"> {{ scope.row.isAllowAccountLogin == 1 ? '启用' : '禁用' }} </el-tag>
<el-tag :type="scope.row.isAllowAccountLogin == 1 ? 'success' : 'error'" effect="dark"> {{
scope.row.isAllowAccountLogin == 1 ? '启用' : '禁用' }} </el-tag>
</template>
</el-table-column>
<el-table-column prop="createdAt" label="备注" />
@@ -105,7 +113,7 @@ onMounted(() => {
getTableData();
getDataSync()
});
async function getDataSync () {
async function getDataSync() {
let res = await ShopBranchApi.getDataSync()
state.par.dataSyncMethod = res
}

View File

@@ -21,10 +21,8 @@
<el-table-column label="头像">
<template v-slot="scope">
<div class="shop_info">
<el-image
:src="scope.row.avatar"
style="width: 50px; height: 50px; border-radius: 4px; background-color: #efefef"
>
<el-image :src="scope.row.avatar"
style="width: 50px; height: 50px; border-radius: 4px; background-color: #efefef">
<template #error>
<div class="img_error">
<i class="icon el-icon-document-delete"></i>
@@ -35,12 +33,10 @@
</template>
</el-table-column>
<el-table-column label="昵称" prop="nickname"></el-table-column>
<el-table-column label="描述提示" prop="content"></el-table-column>
<el-table-column label="订阅类型">
<template v-slot="scope">
<el-checkbox-group
:model-value="scope.row.typeInfo"
@change="typeInfoChange($event, scope.row)"
>
<el-checkbox-group :model-value="scope.row.typeInfo" @change="typeInfoChange($event, scope.row)">
<el-checkbox label="耗材推送" value="con"></el-checkbox>
<el-checkbox label="商品推送" value="pro"></el-checkbox>
<el-checkbox label="操作预警" value="ope"></el-checkbox>
@@ -59,14 +55,9 @@
</el-table>
</div>
<div class="head-container">
<el-pagination
:total="tableData.total"
@size-change="handleSizeChange"
:current-page="tableData.page"
:page-size="tableData.size"
@current-change="paginationChange"
layout="total, sizes, prev, pager, next, jumper"
></el-pagination>
<el-pagination :total="tableData.total" @size-change="handleSizeChange" :current-page="tableData.page"
:page-size="tableData.size" @current-change="paginationChange"
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
</div>
</div>
</template>

View File

@@ -2,25 +2,15 @@
<div>
<el-form ref="form" :model="form" label-width="120px" label-position="left">
<el-form-item label="操作密码">
<el-input
v-model="form.password"
type="number"
@input="jiantingshuru"
:disabled="disabled"
:placeholder="disabled ? '******' : '请输入操作密码'"
style="width: 200px"
></el-input>
<el-input v-model="form.password" type="number" @input="jiantingshuru" :disabled="disabled"
:placeholder="disabled ? '******' : '请输入操作密码'" style="width: 200px"></el-input>
<el-button type="primary" @click="resetting">重置</el-button>
</el-form-item>
<el-form-item label="安全手机号">
{{ phoneFilter(form.phone) }}
</el-form-item>
<el-form-item label="验证码">
<el-input
v-model="form.prepareAmount"
placeholder="点击发送"
style="width: 200px"
></el-input>
<el-input v-model="form.prepareAmount" placeholder="点击发送" style="width: 200px"></el-input>
<el-button type="primary" @click="onSubmit">发送</el-button>
</el-form-item>
<el-form-item>
@@ -31,8 +21,8 @@
<el-form ref="form" :model="form" label-width="120px" label-position="left">
<el-form-item label="校验安全密码">
<el-checkbox v-model="form.isReturnPwd">退款</el-checkbox>
<el-checkbox v-model="form.isMemberInPwd">会员充值</el-checkbox>
<el-checkbox v-model="form.isMemberReturnPwd">会员退款</el-checkbox>
<el-checkbox v-model="form.isMemberInPwd">余额充值</el-checkbox>
<el-checkbox v-model="form.isMemberReturnPwd">余额退款</el-checkbox>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitHandles">保存</el-button>

View File

@@ -1,7 +1,7 @@
<template>
<div>
<div>
<el-form ref="form" :model="form" :rules="rules" label-width="160px" label-position="left">
<el-form ref="form" :model="form" :rules="rules" label-width="160px" label-position="left">
<el-tabs v-model="activeName">
<el-tab-pane label="基础设置" name="first">
<el-form-item label="门店名称" prop="shopName">
<el-input v-model.trim="form.shopName" placeholder="请输入门店名称" style="width: 500px"></el-input>
</el-form-item>
@@ -46,6 +46,36 @@
</el-button>
</div>
</el-form-item> -->
<el-form-item label="联系电话" prop="phone">
<el-input v-model.trim="form.phone" placeholder="请输入联系电话" style="width: 500px"></el-input>
</el-form-item>
<el-form-item label="店铺简介">
<el-input type="textarea" v-model.trim="form.detail" placeholder="请输入店铺简介" style="width: 500px"></el-input>
</el-form-item>
<el-form-item label="店铺经度" prop="provinces">
<el-row :gutter="6">
<el-col :span="9" v-if="form.provinces">
<el-input :value="`${form.provinces}-${form.cities}-${form.districts}`" disabled />
</el-col>
<el-col :span="4" v-if="form.lng">
<el-input v-model="form.lng" placeholder="经度" disabled></el-input>
</el-col>
<el-col :span="4" v-if="form.lng">
<el-input v-model="form.lat" placeholder="纬度" disabled></el-input>
</el-col>
<el-col :span="4">
<el-button type="primary" plain icon="place" @click="chooseAddressShow">
选择坐标
</el-button>
</el-col>
</el-row>
<div style="color: #999">准确的定位便于用户导航到店铺</div>
</el-form-item>
<el-form-item label="门店详细地址">
<el-input type="textarea" v-model.trim="form.address" placeholder="请输入门店详细地址" style="width: 500px"></el-input>
</el-form-item>
</el-tab-pane>
<el-tab-pane label="经营设置" name="third">
<el-form-item label="经营模式「单选」">
<el-radio-group v-model="form.registerType">
<el-radio value="before">快餐版先支付后下单</el-radio>
@@ -75,41 +105,19 @@
<el-radio label="跟随单商品" :value="2"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="后厨单菜二维码">
<el-switch v-model="form.isKitchenCode" :active-value="1" :inactive-value="0"></el-switch>
</el-form-item>
<!-- <el-form-item label="积分群体">
<el-radio-group v-model="form.consumeColony">
<el-radio label="all">所有</el-radio>
<el-radio label="vip">仅针对会员</el-radio>
</el-radio-group>
</el-form-item> -->
<el-form-item label="联系电话" prop="phone">
<el-input v-model.trim="form.phone" placeholder="请输入联系电话" style="width: 500px"></el-input>
</el-form-item>
<!-- <el-form-item label="外卖起送金额">
<el-input-number v-model="form.takeaway_money" placeholder="0.00" controls-position="right"
:min="0"></el-input-number>
</el-form-item> -->
<el-form-item label="店铺经度" prop="provinces">
<el-row :gutter="6">
<el-col :span="9" v-if="form.provinces">
<el-input :value="`${form.provinces}-${form.cities}-${form.districts}`" disabled />
</el-col>
<el-col :span="4" v-if="form.lng">
<el-input v-model="form.lng" placeholder="经度" disabled></el-input>
</el-col>
<el-col :span="4" v-if="form.lng">
<el-input v-model="form.lat" placeholder="纬度" disabled></el-input>
</el-col>
<el-col :span="4">
<el-button type="primary" plain icon="place" @click="chooseAddressShow">
选择坐标
</el-button>
</el-col>
</el-row>
<div style="color: #999">准确的定位便于用户导航到店铺</div>
</el-form-item>
<el-form-item label="门店详细地址">
<el-input type="textarea" v-model.trim="form.address" placeholder="请输入门店详细地址" style="width: 500px"></el-input>
</el-form-item>
<el-form-item label="营业时间">
<div class="u-flex gap-2" style="width: 50%">
<el-select v-model="form.businessStartDay" placeholder="周几开始">
@@ -164,13 +172,10 @@
>
</el-time-picker>
</el-form-item> -->
<el-form-item label="店铺简介">
<el-input type="textarea" v-model.trim="form.detail" placeholder="请输入店铺简介" style="width: 500px"></el-input>
</el-form-item>
<el-form-item label="台桌预订短信">
<!-- <el-form-item label="台桌预订短信">
<el-input type="textarea" v-model.trim="form.bookingSms" placeholder="请输入台桌预订短信"
style="width: 500px"></el-input>
</el-form-item>
</el-form-item> -->
<el-form-item label="电子围栏" prop="isOrderFence">
<div class="column">
<div class="center" style="display: flex; align-items: center; gap: 14px">
@@ -217,32 +222,32 @@
<el-radio :value="2">休息中</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitHandle" :loading="formLoading">
<span v-if="!formLoading">保存</span>
<span v-else>保存中...</span>
</el-button>
</el-form-item>
</el-form>
</div>
<ChooseAddress ref="refChooseAddress" @choose="chooseAddressConfirm"></ChooseAddress>
<el-dialog v-model="showUpload" :close-on-click-modal="false" append-to-body width="500px"
@close="showUpload = false">
<el-upload :before-remove="handleBeforeRemove" :on-success="handleSuccess" :on-error="handleError"
:file-list="fileList" :headers="headers" :action="qiNiuUploadApi" :limit="1" list-type="picture"
class="upload-demo">
<el-button size="small" type="primary">点击上传</el-button>
<template #tip>
<div style="display: block" class="el-upload__tip">请勿上传违法文件且文件不超过15M</div>
</template>
</el-upload>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="doSubmit">确认</el-button>
</div>
</el-tab-pane>
<el-form-item>
<el-button type="primary" @click="submitHandle" :loading="formLoading">
<span v-if="!formLoading">保存</span>
<span v-else>保存中...</span>
</el-button>
</el-form-item>
</el-tabs>
</el-form>
<ChooseAddress ref="refChooseAddress" @choose="chooseAddressConfirm"></ChooseAddress>
<el-dialog v-model="showUpload" :close-on-click-modal="false" append-to-body width="500px"
@close="showUpload = false">
<el-upload :before-remove="handleBeforeRemove" :on-success="handleSuccess" :on-error="handleError"
:file-list="fileList" :headers="headers" :action="qiNiuUploadApi" :limit="1" list-type="picture"
class="upload-demo">
<el-button size="small" type="primary">点击上传</el-button>
<template #tip>
<div style="display: block" class="el-upload__tip">请勿上传违法文件且文件不超过15M</div>
</template>
</el-dialog>
</div>
</el-upload>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="doSubmit">确认</el-button>
</div>
</template>
</el-dialog>
</template>
<script>
@@ -256,6 +261,7 @@ import { filterNumberInput } from "@/utils/index";
export default {
data() {
return {
activeName: "first",
filterNumberInput,
img_download_error,
showUpload: false,

View File

@@ -1,9 +1,10 @@
<template>
<el-dialog title="激活" width="500px" v-model="show" @close="reset">
<el-dialog title="激活" width="550px" v-model="show" @close="reset">
<el-form :model="form" ref="refForm" :rules="rules">
<el-form-item label="激活" prop="activateCode">
<el-input v-model="form.activateCode" placeholder="请输入激活码"></el-input>
<div class="tips">输入有效激活码表示添加的同时直接激活该店铺</div>
<el-form-item label="激活时长" prop="activateDuration">
<activeDate v-model="form.activateDuration" v-model:activeCost="form.activateAmount" />
<!-- <el-input v-model="form.activateDuration" placeholder="请输入激活码"></el-input>
<div class="tips">输入有效激活码表示添加的同时直接激活该店铺</div> -->
</el-form-item>
</el-form>
<template #footer>
@@ -15,18 +16,20 @@
<script setup>
import ShopApi from "@/api/account/shop";
import activeDate from "./activeDate.vue";
const show = ref(false);
const form = reactive({
activateCode: "",
activateDuration: "",
activateAmount: '',
id: "",
});
const rules = {
activateCode: [{ required: true, message: "请输入激活码", trigger: "blur" }],
activateDuration: [{ required: true, message: "请选择激活时长", trigger: "blur" }],
};
function reset() {
form.activateCode = "";
form.activateDuration = "";
form.id = "";
}
const emit = defineEmits(["submit"]);

View File

@@ -0,0 +1,32 @@
<template>
<el-select v-model="modelValue" style="width: 200px;" placeholder="请选择激活时长">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
<el-input v-model="activeCost" placeholder="请输入激活费用(选填)" style="width: 200px; margin-left: 14px;" />
</template>
<script setup>
import { ref, onMounted } from "vue";
const modelValue = defineModel({
type: [String, Number],
default: "",
});
// 激活费用
const activeCost = defineModel('activeCost', {
type: String,
default: "",
})
const options = ref([])
onMounted(() => {
for (let i = 1; i <= 12; i++) {
options.value.push({
label: `${i}个月`,
value: i,
});
}
})
</script>

View File

@@ -0,0 +1,61 @@
<template>
<!-- 激活记录 -->
<el-dialog v-model="show" title="激活记录" width="500px">
<el-table :data="tableData.records" style="width: 100%">
<el-table-column prop="periodMonth" label="激活时长(月)"></el-table-column>
<el-table-column prop="amount" label="店铺签约金额">
<template v-slot="scope">
{{ formatMoney(scope.row.amount) }}
</template>
</el-table-column>
<el-table-column prop="createTime" label="操作时间"></el-table-column>
</el-table>
<el-pagination v-model:current-page="tableData.page" v-model:page-size="tableData.size"
:page-sizes="[10, 20, 50, 100]" :total="tableData.total" @current-change="getData" @size-change="getData"
style="margin-top: 16px; text-align: right;" />
</el-dialog>
</template>
<script setup>
import { ref, reactive } from "vue";
import ShopApi from "@/api/account/shop";
import { formatMoney } from "@/utils";
const shopInfo = ref({ id: '' })
const show = ref(false);
const tableData = reactive({
loading: false,
page: 1,
size: 10,
total: 0,
records: [],
});
async function getData() {
try {
tableData.loading = true;
const res = await ShopApi.registerRecord({
page: tableData.page,
size: tableData.size,
shopId: shopInfo.value.id
});
tableData.records = res.records;
tableData.total = res.totalRow;
} catch (error) {
console.log(error);
} finally {
tableData.loading = false;
}
}
function open(data) {
shopInfo.value = data;
show.value = true;
getData();
}
defineExpose({
open,
});
</script>

View File

@@ -1,72 +1,35 @@
<template>
<div>
<el-dialog
:title="state.form.id ? '编辑店铺' : '添加店铺'"
v-model="state.dialogVisible"
@close="reset"
>
<el-dialog :title="state.form.id ? '编辑店铺' : '添加店铺'" v-model="state.dialogVisible" @close="reset">
<div style="height: 50vh; overflow-y: auto">
<el-form
ref="refForm"
:model="state.form"
:rules="state.rules"
label-width="120px"
label-position="left"
>
<el-form ref="refForm" :model="state.form" :rules="state.rules" label-width="120px" label-position="left">
<el-form-item label="店铺名称" prop="shopName">
<el-input v-model="state.form.shopName" placeholder="请输入门店名称"></el-input>
</el-form-item>
<el-form-item label="店铺类型">
<el-radio-group
v-model="state.form.shopType"
:disabled="state.isEdit || state.type == 'addBranch'"
>
<el-radio-group v-model="state.form.shopType" :disabled="state.isEdit || state.type == 'addBranch'">
<el-radio-button value="only">单店</el-radio-button>
<el-radio-button value="chain">连锁店</el-radio-button>
<el-radio-button value="join">加盟店</el-radio-button>
</el-radio-group>
<div class="tips">
<el-alert
title="请谨慎修改"
type="warning"
size="7"
effect="dark"
show-icon
:closable="false"
/>
<el-alert title="请谨慎修改" type="warning" size="7" effect="dark" show-icon :closable="false" />
</div>
</el-form-item>
<el-form-item label="是否为主店" prop="isHeadShop" v-if="state.form.shopType != 'only'">
<el-radio-group
v-model="state.form.isHeadShop"
@change="state.form.mainId = ''"
:disabled="state.isEdit || state.type == 'addBranch'"
>
<el-radio-group v-model="state.form.isHeadShop" @change="state.form.mainId = ''"
:disabled="state.isEdit || state.type == 'addBranch'">
<el-radio :value="1"></el-radio>
<el-radio :value="0"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label="选择主店"
prop="mainId"
v-if="state.form.isHeadShop == '0' && state.form.shopType != 'only'"
>
<el-form-item label="选择主店" prop="mainId" v-if="state.form.isHeadShop == '0' && state.form.shopType != 'only'">
<!-- <el-form-item label="主店账号" prop="mainId" v-if="state.form.shopType != 'only'"> -->
<el-select
v-model="state.form.mainId"
placeholder="请选择主店铺"
filterable
reserve-keyword
:remote-method="getTableData"
:loading="state.shopListLoading"
:disabled="state.isEdit || state.type == 'addBranch'"
>
<el-option
v-for="item in state.shopList"
:label="`${item.shopName}`"
:value="item.id"
:key="item.id"
></el-option>
<el-select v-model="state.form.mainId" placeholder="请选择主店铺" filterable reserve-keyword
:remote-method="getTableData" :loading="state.shopListLoading"
:disabled="state.isEdit || state.type == 'addBranch'">
<el-option v-for="item in state.shopList" :label="`${item.shopName}`" :value="item.id"
:key="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="连锁店扩展店名">
@@ -84,14 +47,7 @@
<el-radio-button value="after">后付费</el-radio-button>
</el-radio-group>
<div class="tips">
<el-alert
title="请谨慎修改"
type="warning"
size="7"
effect="dark"
show-icon
:closable="false"
/>
<el-alert title="请谨慎修改" type="warning" size="7" effect="dark" show-icon :closable="false" />
</div>
</el-form-item>
<el-form-item label="管理方式" v-if="state.form.shopType != 'only'">
@@ -100,14 +56,7 @@
<el-radio-button :value="1">直接管理</el-radio-button>
</el-radio-group>
<div class="tips">
<el-alert
title="请谨慎修改"
type="warning"
size="7"
effect="dark"
show-icon
:closable="false"
/>
<el-alert title="请谨慎修改" type="warning" size="7" effect="dark" show-icon :closable="false" />
</div>
</el-form-item>
<el-form-item label="商户版本">
@@ -116,53 +65,34 @@
<el-radio-button value="release">正式</el-radio-button>
</el-radio-group>
<div class="tips">
<el-alert
title="请谨慎修改"
type="warning"
size="7"
effect="dark"
show-icon
:closable="false"
/>
<el-alert title="请谨慎修改" type="warning" size="7" effect="dark" show-icon :closable="false" />
</div>
</el-form-item>
<el-form-item label="激活">
<el-input v-model="state.form.activateCode" placeholder="请输入激活码"></el-input>
<div class="tips">输入有效激活码表示添加的同时直接激活该店铺</div>
<el-form-item label="激活时长" prop="activateDuration">
<activeDate v-model="state.form.activateDuration" v-model:activeCost="state.form.activateAmount" />
<!-- <el-input v-model="state.form.activateDuration" placeholder="请输入激活码"></el-input>
<div class="tips">输入有效激活码表示添加的同时直接激活该店铺</div> -->
</el-form-item>
<el-form-item label="登录账号" prop="accountName">
<el-input v-model="state.form.accountName" placeholder="请输入登录账号"></el-input>
</el-form-item>
<el-form-item label="登录密码" prop="password" v-if="!state.form.id">
<el-input
type="password"
show-password
v-model="state.form.accountPwd"
placeholder="请输入登录密码"
></el-input>
<el-form-item label="登录密码" prop="accountPwd" v-if="!state.form.id">
<el-input type="password" show-password v-model="state.form.accountPwd" placeholder="请输入登录密码"></el-input>
</el-form-item>
<el-form-item label="联系电话" prop="phone">
<el-input v-model="state.form.phone" placeholder="请输入联系电话"></el-input>
</el-form-item>
<el-form-item label="设备数量">
<el-input-number
v-model="state.form.supportDeviceNumber"
controls-position="right"
:min="1"
:step="1"
step-strictly
></el-input-number>
<el-input-number v-model="state.form.supportDeviceNumber" controls-position="right" :min="1" :step="1"
step-strictly></el-input-number>
</el-form-item>
<!-- <el-form-item label="外卖起送金额">
<el-input-number v-model="form.takeaway_money" placeholder="0.00" controls-position="right"
:min="0"></el-input-number>
</el-form-item> -->
<el-form-item label="店铺地址" prop="districts">
<AddressSelect
v-model:prov="state.form.provinces"
v-model:city="state.form.cities"
v-model:area="state.form.districts"
></AddressSelect>
<AddressSelect v-model:prov="state.form.provinces" v-model:city="state.form.cities"
v-model:area="state.form.districts"></AddressSelect>
</el-form-item>
<div>
@@ -204,18 +134,10 @@
</el-row>
</el-form-item> -->
<el-form-item label="店铺详细地址">
<el-input
type="textarea"
v-model="state.form.address"
placeholder="请输入门店详细地址"
></el-input>
<el-input type="textarea" v-model="state.form.address" placeholder="请输入门店详细地址"></el-input>
</el-form-item>
<el-form-item label="店铺简介">
<el-input
type="textarea"
v-model="state.form.detail"
placeholder="请输入店铺简介"
></el-input>
<el-input type="textarea" v-model="state.form.detail" placeholder="请输入店铺简介"></el-input>
</el-form-item>
<el-form-item label="状态">
<el-radio-group v-model="state.form.status">
@@ -225,12 +147,7 @@
</el-form-item>
</el-form>
</div>
<el-dialog
title="选择地址"
v-model="state.showLocation"
:modal="false"
:modal-append-to-body="false"
>
<el-dialog title="选择地址" v-model="state.showLocation" :modal="false" :modal-append-to-body="false">
<div class="map_box">
<div class="map">
<el-amap ref="map" :center="state.amapOptions.center" @init="mapInit">
@@ -238,13 +155,8 @@
</el-amap>
</div>
<div class="search_box">
<el-input
v-model="state.searchOption.keyword"
placeholder="请输入关键字"
@focus="state.searchOption.focus = true"
@blur="autoCompleteSearchBlur"
@input="autoCompleteSearch(state.searchOption.keyword)"
>
<el-input v-model="state.searchOption.keyword" placeholder="请输入关键字" @focus="state.searchOption.focus = true"
@blur="autoCompleteSearchBlur" @input="autoCompleteSearch(state.searchOption.keyword)">
<template #append>
<el-button type="primary" @click="placeSearchSearch(state.searchOption.keyword)">
搜索
@@ -252,12 +164,8 @@
</template>
</el-input>
<div class="list" v-if="state.searchOption.focus && state.searchOption.show">
<div
class="item"
@click="autoCompleteListClick(item)"
v-for="item in state.autoCompleteList"
:key="item.id"
>
<div class="item" @click="autoCompleteListClick(item)" v-for="item in state.autoCompleteList"
:key="item.id">
{{ item.name }}
</div>
</div>
@@ -288,11 +196,7 @@
</template>
</el-dialog>
<el-dialog title="坐标搜索" v-model="latShow" width="60vw">
<iframe
style="width: 100%; height: 60vh"
src="https://lbs.baidu.com/maptool/getpoint"
frameborder="0"
></iframe>
<iframe style="width: 100%; height: 60vh" src="https://lbs.baidu.com/maptool/getpoint" frameborder="0"></iframe>
<template #footer>
<div class="dialog-footer">
<el-button @click="latShow = false">取消</el-button>
@@ -311,6 +215,7 @@ import { initMapLoad } from "@/utils/mapLoadUtil";
import { ElNotification } from "element-plus";
// { geocode, ShopApi.getList }
import ShopApi from "@/api/account/shop";
import activeDate from "./activeDate.vue";
const latShow = ref(false);
const validateLogo = (rule, value, callback) => {
@@ -333,7 +238,7 @@ async function latConfirm() {
state.form.lat = latLng[1];
state.form.lng = latLng[0];
latShow.value = false;
} else [ElMessage.error("请搜索地址后复制经纬度")];
} else[ElMessage.error("请搜索地址后复制经纬度")];
} catch (err) {
// 捕获异常(用户拒绝权限、浏览器不支持、非交互上下文等)
console.error("获取剪贴板失败:", err);
@@ -360,7 +265,8 @@ const state = reactive({
tubeType: 0,
registerType: "before",
profiles: "release",
activateCode: "",
activateDuration: "", // 激活时长
activateAmount: "", // 激活费用
accountName: "",
accountPwd: "",
phone: "",
@@ -381,11 +287,11 @@ const state = reactive({
type: "",
resetForm: "",
rules: {
activateCode: [
activateDuration: [
{
required: true,
message: "请输入激活码",
trigger: "blur",
message: "请选择激活时长",
trigger: "change",
},
],
shopName: [
@@ -458,6 +364,25 @@ const state = reactive({
trigger: "change",
},
],
// 密码长度6-18位需包含字母、数字、特殊符号中至少两种
accountPwd: [
{
required: true,
message: "请输入登录密码",
trigger: "blur",
},
{
min: 6,
max: 18,
message: "密码长度应为6-18位",
trigger: "blur",
},
{
pattern: /^(?![0-9]+$)(?![a-zA-Z]+$)(?![^\da-zA-Z]+$).{6,}$/,
message: "密码需包含字母、数字、特殊符号中至少两种",
trigger: "blur",
},
]
},
fileList: [],
files: [],
@@ -561,6 +486,7 @@ function show(obj, type) {
if (obj && obj.id) {
console.log(obj);
state.form = { ...obj };
state.form.accountName = obj.account ? obj.account : "";
}
if (obj && obj.mainId) {
Object.assign(state.form, obj);
@@ -730,6 +656,7 @@ defineExpose({
.amap-sug-result {
z-index: 2000;
}
.tips {
margin-left: 10px;
}

View File

@@ -1,52 +1,26 @@
<template>
<div class="app-container">
<div class="head-container">
<el-row :gutter="20">
<el-col :span="3">
<el-input
v-model="state.query.name"
clearable
placeholder="请输入店铺名称"
style="width: 100%"
class="filter-item"
@keyup.enter="getTableData"
/>
<el-row :gutter="24">
<el-col :span="4">
<el-input v-model="state.query.name" clearable placeholder="请输入店铺名称" style="width: 100%" class="filter-item"
@keyup.enter="getTableData" />
</el-col>
<el-col :span="3">
<el-input
v-model="state.query.phone"
clearable
placeholder="请输入手机号"
style="width: 100%"
class="filter-item"
@keyup.enter="getTableData"
/>
<el-col :span="4">
<el-input v-model="state.query.phone" clearable placeholder="请输入手机号" style="width: 100%" class="filter-item"
@keyup.enter="getTableData" />
</el-col>
<el-col :span="3">
<el-col :span="4">
<el-select v-model="state.query.status" placeholder="请选择店铺状态" style="width: 100%">
<el-option
v-for="item in state.status"
:key="item.type"
:label="item.label"
:value="item.type"
/>
<el-option v-for="item in state.status" :key="item.type" :label="item.label" :value="item.type" />
</el-select>
</el-col>
<el-col :span="3">
<el-select
v-model="state.query.profiles"
placeholder="请选择商户版本"
style="width: 100%"
>
<el-option
v-for="item in state.profiles"
:key="item.type"
:label="item.label"
:value="item.type"
/>
<el-col :span="4">
<el-select v-model="state.query.profiles" placeholder="请选择商户版本" style="width: 100%">
<el-option v-for="item in state.profiles" :key="item.type" :label="item.label" :value="item.type" />
</el-select>
</el-col>
<el-col :span="3">
<el-col :span="4">
<el-button type="primary" @click="getTableData">查询</el-button>
<el-button @click="resetHandle">重置</el-button>
</el-col>
@@ -60,10 +34,8 @@
<el-table-column label="店铺信息" width="200">
<template v-slot="scope">
<div class="shop_info">
<el-image
:src="scope.row.logo"
style="width: 50px; height: 50px; border-radius: 4px; background-color: #efefef"
>
<el-image :src="scope.row.logo"
style="width: 50px; height: 50px; border-radius: 4px; background-color: #efefef">
<template #error>
<div class="img_error">
<i class="icon el-icon-document-delete" />
@@ -73,16 +45,16 @@
<div class="info">
<span>{{ scope.row.shopName }}</span>
<div class="tag_wrap">
<el-tag v-if="scope.row.profiles == 'no'" type="info" effect="dark">
<el-tag v-if="scope.row.profiles == 'no'" type="info" disable-transitions effect="dark">
未激活
</el-tag>
<el-tag v-if="scope.row.profiles == 'probation'" type="warning" effect="dark">
<el-tag v-if="scope.row.profiles == 'probation'" type="warning" disable-transitions effect="dark">
试用
</el-tag>
<el-tag v-if="scope.row.profiles == 'release'" type="success" effect="dark">
<el-tag v-if="scope.row.profiles == 'release'" type="success" disable-transitions effect="dark">
正式
</el-tag>
<el-tag v-if="scope.row.isWxMaIndependent" type="primary" effect="dark">
<el-tag v-if="scope.row.isWxMaIndependent" type="primary" disable-transitions effect="dark">
独立小程序
</el-tag>
</div>
@@ -154,7 +126,7 @@
支付配置
</el-dropdown-item>
<el-dropdown-item :command="2">续费记录</el-dropdown-item>
<el-dropdown-item :command="3">前往店铺</el-dropdown-item>
<!-- <el-dropdown-item :command="3">前往店铺</el-dropdown-item> -->
<el-dropdown-item :command="4">重置密码</el-dropdown-item>
<el-dropdown-item divided :command="5">删除</el-dropdown-item>
</el-dropdown-menu>
@@ -165,19 +137,18 @@
</el-table>
</div>
<div class="head-container">
<el-pagination
v-model:current-page="state.tableData.page"
v-model:page-size="state.tableData.size"
:total="state.tableData.total"
:page-sizes="[10, 20, 30, 50, 100]"
layout="total, sizes , prev, pager ,next, jumper "
@current-change="paginationChange"
/>
<el-pagination v-model:current-page="state.tableData.page" v-model:page-size="state.tableData.size"
:total="state.tableData.total" :page-sizes="[10, 20, 30, 50, 100]"
layout="total, sizes , prev, pager ,next, jumper " @current-change="paginationChange" />
</div>
<addShop ref="refAddShop" @success="getTableData" />
<!-- <detailModal ref="refDetailModal" /> -->
<!-- 激活码 -->
<activateCode ref="refActivateCode" @success="getTableData" />
<!-- 重置密码 -->
<resetPassword ref="refResetPasswordRef" @success="getTableData" />
<!-- 激活记录 -->
<activateRecord ref="refActivateRecordRef" />
</div>
</template>
@@ -189,6 +160,12 @@ import { ElNotification, ElMessageBox } from "element-plus";
import addShop from "./components/addShop.vue";
import detailModal from "./components/detailModal.vue";
import { useRouter } from "vue-router";
import resetPassword from "@/components/resetPassword/index.vue";
import activateRecord from "./components/activeteRecord.vue";
const refActivateRecordRef = ref(null);
const refResetPasswordRef = ref(null);
const router = useRouter();
@@ -242,7 +219,7 @@ onMounted(() => {
const refDetailModal = ref(null);
function dropdownClick(e, row) {
console.log(e);
console.log(row);
// console.log(row);
if (e == 0) {
refAddShop.value.show({ mainId: row.id, shopType: row.shopType, isHeadShop: 0 }, "addBranch");
@@ -264,6 +241,15 @@ function dropdownClick(e, row) {
});
return;
}
if (e == 2) {
// 续费记录
refActivateRecordRef.value.open(row);
}
if (e == 4) {
// 重置密码
// console.log('重置密码', row);
refResetPasswordRef.value.show(row);
}
if (e == 5) {
ElMessageBox.confirm("是否确认删除该店铺?", "提示", {
confirmButtonText: "确认",
@@ -278,7 +264,7 @@ function dropdownClick(e, row) {
});
getTableData();
})
.catch(() => {});
.catch(() => { });
return;
}
}

View File

@@ -11,12 +11,12 @@
<div class="t">{{ route.query.shopName }} | 支付配置</div>
<div class="intro">管理您的支付渠道和进件信息</div>
</div>
<div class="center">
<!-- <div class="center">
<el-text size="large">当前模式</el-text>
<el-radio-group size="large" :model-value="payModel" @change="handleRadioChange">
<el-radio :label="item.label" :value="item.value" v-for="item in tabList" :key="item.value"></el-radio>
</el-radio-group>
</div>
</div> -->
</div>
<div class="gyq_content row mt14">
<tabHeader v-model="tabActiveIndex" :list="tabList" />
@@ -39,10 +39,10 @@ const router = useRouter()
const payModel = ref('')
const tabActiveIndex = ref(0)
const tabList = ref([
{
label: '支付进件',
value: 'native'
},
// {
// label: '支付进件',
// value: 'native'
// },
{
label: '聚合支付',
value: 'poly'

View File

@@ -39,6 +39,11 @@ const contentConfig: IContentConfig = {
align: "center",
prop: "code",
},
{
label: "员工角色",
align: "center",
prop: "roleName",
},
{
label: "最大优惠金额",
align: "center",
@@ -55,6 +60,7 @@ const contentConfig: IContentConfig = {
label: "操作",
align: "center",
templet: "tool",
width: 240,
operat: ["edit", "delete",
{
name: "change_pwd",