瀏覽代碼

Project Init

yigeren911 2 年之前
父節點
當前提交
cd1ab23353

+ 2 - 0
src/api/controllerUrls.ts

@@ -64,3 +64,5 @@ export const buildingTree = "/common/tree";//获取楼宇位置树
 export const coupon = "/coupon/"; //优惠卷
 export const store = "/store/"; //门店管理
 export const storeGoods = "/store/goods/"; //门店管理
+export const storeEmployee = "/store/employee/"; //店员管理
+export const ad = "/ad/"; //广告管理

+ 85 - 0
src/views/backend/enterprise/mediapromotion/ad/index.vue

@@ -0,0 +1,85 @@
+<template>
+  <div class="default-main ">
+    <el-alert class="ba-table-alert" v-if="baTable.table.remark" :title="baTable.table.remark" type="info"
+              show-icon/>
+    <el-row>
+      <el-col :span="24">
+
+        <!-- 表格顶部菜单 -->
+        <TableHeader :buttons="['refresh', 'add', 'edit', 'delete', 'comSearch']"
+                     quick-search-placeholder="通过标题模糊搜索"
+                     @action="baTable.onTableHeaderAction"/>
+        <!-- 表格 -->
+        <!-- 要使用`el-table`组件原有的属性,直接加在Table标签上即可 -->
+        <Table @action="baTable.onTableAction"/>
+
+      </el-col>
+    </el-row>
+
+    <!-- 表单 -->
+    <PopupForm ref="formRef"/>
+
+  </div>
+</template>
+
+<script setup lang="ts">
+import {ref, onMounted, provide} from 'vue'
+import { ad } from "/@/api/controllerUrls";
+import Table from '/@/components/table/index.vue'
+import TableHeader from '/@/components/table/header/index.vue'
+import {defaultOptButtons} from '/@/components/table'
+import PopupForm from './popupForm.vue'
+import {baTableApi} from '/@/api/common'
+import baTableClass from '/@/utils/baTable'
+
+
+const baTable = new baTableClass(
+  new baTableApi(ad),
+  {
+    dblClickNotEditColumn: [undefined, 'status'],
+    column: [
+      {type: 'selection', align: 'center', operator: false},
+      {label: '广告标题', prop: 'adTitle', align: 'left', operator: 'LIKE'},
+      {
+        label: "广告状态",
+        prop: "adStatus",
+        align: "center",
+        render: "tag",
+        operator: "=",
+        replaceValue: { 0: "上架", 1: "下架" }
+      },
+      {label: '广告图片', prop: 'adUrl', align: 'center',render:'image', operator: false},
+      {label: '浏览次数', prop: 'viewCount', align: 'center', operator: false},
+      {label: '创建人', prop: 'creatorName', align: 'center', width: '120', operator: false},
+      {label: '创建时间', prop: 'createTime', align: 'center', width: '180', operator: false},
+      {
+        label: '操作',
+        align: 'center',
+        width: '160',
+        render: 'buttons',
+        buttons: defaultOptButtons(),
+        operator: false
+      },
+    ],
+  },
+  {
+    defaultItems: {},
+  },
+  {
+    // 获得编辑数据后
+    requestEdit: () => {
+      if (baTable.form.items && !baTable.form.items.icon) baTable.form.items.icon = 'el-icon-Minus'
+    },
+  }
+)
+
+provide('baTable', baTable)
+
+onMounted(() => {
+  baTable.mount()
+  baTable.getIndex()
+})
+</script>
+
+
+<style scoped lang="scss"></style>

+ 101 - 0
src/views/backend/enterprise/mediapromotion/ad/popupForm.vue

@@ -0,0 +1,101 @@
+<template>
+  <!-- 对话框表单 -->
+  <el-dialog custom-class="ba-operate-dialog" :close-on-click-modal="false"
+             :model-value="baTable.form.operate ? true : false" @close="baTable.toggleForm"
+             width="30%"
+  >
+    <template #header>
+      <div class="title" v-drag="['.ba-operate-dialog', '.el-dialog__header']" v-zoom="'.ba-operate-dialog'">
+        {{ baTable.form.operate ? baTable.form.operate == "edit" ? "编辑" : "添加" : "无标题" }}
+      </div>
+    </template>
+    <el-scrollbar v-loading="baTable.form.loading">
+      <div class="ba-operate-form" :class="'ba-' + baTable.form.operate + '-form'"
+           style="width: calc(100% - 40px);margin-bottom: 40px;">
+        <el-form ref="formRef" @keyup.enter="baTable.onSubmit(formRef)" :model="baTable.form.items"
+                 label-position="right" :label-width="'100px'" :rules="rules"
+                 v-if="!baTable.form.loading">
+          <el-form-item prop="adTitle" label="广告标题">
+            <el-input v-model="baTable.form.items!.adTitle" placeholder="请输入">
+            </el-input>
+          </el-form-item>
+          <el-form-item prop="adStatus" label="广告状态">
+            <el-select v-model="baTable.form.items!.adStatus" placeholder="请选择" style="width: 100%">
+              <el-option label="上架" :value="0"></el-option>
+              <el-option label="下架" :value="1"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item prop="adUrl" label="上传图片">
+            <pictureUpload v-model:fileUrl="baTable.form.items!.adUrl"></pictureUpload>
+          </el-form-item>
+        </el-form>
+      </div>
+    </el-scrollbar>
+    <template #footer>
+      <div :style="'width: calc(100% - ' + baTable.form.labelWidth! / 1.8 + 'px)'">
+        <el-button @click="baTable.toggleForm('')">取消</el-button>
+        <el-button v-blur :loading="baTable.form.submitLoading" @click="baTable.onSubmit(formRef)" type="primary">
+          {{ baTable.form.operateIds && baTable.form.operateIds.length > 1 ? "保存并编辑下一项" : "保存" }}
+        </el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, inject, onMounted, watch } from "vue";
+
+import type baTableClass from "/@/utils/baTable";
+import type { ElForm, FormItemRule } from "element-plus";
+import FormItem from "/@/components/formItem/index.vue";
+import { ElNotification } from "element-plus/es";
+import pictureUpload from "/@/components/pictureUpload/index.vue";
+import request from "/@/api/request";
+import { store } from "/@/api/controllerUrls";
+
+const formRef = ref<InstanceType<typeof ElForm>>();
+const baTable = inject("baTable") as baTableClass;
+
+
+const rules: Partial<Record<string, FormItemRule[]>> = reactive({
+  adStatus: [{ required: true, message: "请选择", trigger: "blur" }],
+  adTitle: [{ required: true, message: "请选择", trigger: "blur" }],
+  adUrl: [{ required: true, message: "请选择", trigger: "blur" }],
+});
+
+
+
+</script>
+
+<style scoped lang="scss">
+.avatar-uploader {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  position: relative;
+  border-radius: var(--el-border-radius-small);
+  box-shadow: var(--el-box-shadow-light);
+  border: 1px dashed var(--color-sub-1);
+  cursor: pointer;
+  overflow: hidden;
+  width: 110px;
+  height: 110px;
+}
+
+.avatar-uploader:hover {
+  border-color: var(--color-primary);
+}
+
+.avatar {
+  width: 110px;
+  height: 110px;
+  display: block;
+}
+
+.image-slot {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  height: 100%;
+}
+</style>

+ 0 - 105
src/views/backend/enterprise/members/Invitefriends/index.vue

@@ -1,105 +0,0 @@
-<template>
-    <div class="default-main">
-        <el-card style="display: flex;justify-content: center">
-            <div style="max-width: 1500px;">
-                <div style="display: flex;justify-content: right;margin-bottom: 30px">
-                    <el-button type="primary" @click="save()" :disabled="!auth('edit')">保存</el-button>
-                </div>
-                <el-form :model="formData" ref="formRef" :rules="rules" label-width="100px" >
-                    <el-form-item label="分享标题" prop="title">
-                        <el-input v-model="formData.title"></el-input>
-                    </el-form-item>
-                    <el-form-item label="分享简介" prop="description">
-                        <el-input type="textarea" v-model="formData.description"></el-input>
-                    </el-form-item>
-                    <el-row>
-                        <el-col :span="12">
-                            <el-form-item prop="shareUrl" label="分享图片">
-                                <pictureUpload :size="1000000"
-                                               v-model:fileUrl="formData.shareUrl"></pictureUpload>
-                                <div class="mt-5" style="font-size: 10px;color: #92969a;line-height: initial;">
-                                    图片控制在1MB以内,图片尺寸建议按照1:1比例设计
-                                </div>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :span="12">
-                            <el-form-item prop="showedUrl" label="展示图片">
-                                <pictureUpload :size="1000000"
-                                               v-model:fileUrl="formData.showedUrl"></pictureUpload>
-                                <div class="mt-5" style="font-size: 10px;color: #92969a;line-height: initial;">
-                                    图片控制在1MB以内,图片尺寸建议按照1:1比例设计
-                                </div>
-                            </el-form-item>
-                        </el-col>
-                    </el-row>
-                    <el-form-item label="详情描述" prop="ruleDescription">
-                        <editor v-model:modelValue="formData.ruleDescription" ></editor>
-                    </el-form-item>
-                </el-form>
-            </div>
-
-
-        </el-card>
-    </div>
-</template>
-
-<script setup lang="ts">
-
-import {onMounted, reactive, ref} from "vue";
-import editor from '/@/components/editor/index.vue'
-import request from '/@/api/request'
-import {sysConfig} from '/@/api/controllerUrls'
-import {validatorMobile} from '/@/utils/validate'
-import {ElNotification} from "element-plus";
-import {auth} from '/@/utils/common'
-import { useConfig } from "/@/stores/config";
-import pictureUpload from '/@/components/pictureUpload/index.vue'
-
-
-const config = useConfig()
-
-onMounted(() => {
-    getData()
-})
-
-let formData = ref({
-    title: '',
-    description: '',
-    shareUrl: '',
-    showedUrl: '',
-    ruleDescription: '',
-})
-
-let rules = reactive({
-    title: [{required: true, message: '请输入分享标题', trigger: 'blur',}],
-    description: [{required: true, message: '请输入分享简介', trigger: 'blur',}],
-    shareUrl: [{required: true, message: '请上传分享图片', trigger: 'blur',}],
-    showedUrl: [{required: true, message: '请上传展示图片', trigger: 'blur',}],
-    ruleDescription: [{required: true, message: '请输入规则介绍', trigger: 'blur',}],
-})
-
-const formRef = ref()
-
-function save() {
-    if (!formRef) return
-    formRef.value.validate((valid: any) => {
-        if (valid) {
-            request.edit(sysConfig, {configName: 'share', configValue: formData.value}).then((res:any) => {
-                ElNotification({type:'success',message:res.msg,})
-            })
-        } else {
-            return false
-        }
-    })
-}
-
-function getData() {
-    request.index(sysConfig, {configName: 'share'}, 'edit').then((res:any) => {
-        formData.value = res.data.configValue
-    })
-}
-</script>
-
-<style scoped>
-
-</style>

+ 0 - 226
src/views/backend/enterprise/members/factionalism/auditDialog.vue

@@ -1,226 +0,0 @@
-<template>
-    <el-dialog v-model="showDialog" title="圈子审核" :close-on-click-modal="false" @close="closeDialog">
-        <div style="width: 100%;display: flex;align-items: center">
-            <el-image alt="#" style="height: 60px;width: 60px;border-radius: 30px" v-if="data.headPortrait==='/'"
-                      :src="defaultAvatar"></el-image>
-            <el-image alt="#" style="height: 60px;width: 60px;border-radius: 30px" v-else
-                      :src="data.headPortrait"></el-image>
-            <div>
-                <h3 style="margin-left: 30px;color: #409eff">{{ data.nickName }}</h3>
-                <h4 style="margin-left: 30px">会员编号:{{ data.memberId }}</h4>
-            </div>
-
-        </div>
-        <h4 style="margin-top: 30px">发布内容</h4>
-        <div style="margin-top: 10px">
-            <h5>{{ data.momentsContent }}</h5>
-        </div>
-        <div style="margin-top: 10px;display: flex;flex-wrap: wrap">
-            <div style="height: 150px;margin: 0 10px 10px 0" v-for="(item,index) in urlList" :key="index">
-                <el-image style="height: 150px" :src="item" :preview-teleported="true" :preview-src-list="urlList"
-                          :initial-index="index"/>
-            </div>
-        </div>
-
-        <el-tabs v-model="activeTab" style="margin-top: 20px">
-            <el-tab-pane name="first" label="发布审核">
-                <el-form :model="formData" ref="formRef" label-width="110px" :rules="rules"
-                         v-if="data.releaseStatus==0">
-                    <el-form-item prop="releaseStatus" label="审核状态">
-                        <el-select style="width: 200px" v-model="formData.releaseStatus">
-                            <el-option label="审核通过" :value="1"></el-option>
-                            <el-option label="审核驳回" :value="2"></el-option>
-                        </el-select>
-                    </el-form-item>
-                    <el-form-item prop="releaseReason" label="审核驳回原因">
-                        <el-input type="textarea" v-model="formData.releaseReason"></el-input>
-                    </el-form-item>
-                </el-form>
-
-                <el-descriptions
-                    v-else
-                    class="margin-top"
-                    direction="vertical"
-                    :column="4"
-                    border
-                    style="margin-top: 10px"
-                >
-                    <el-descriptions-item width="25%">
-                        <template #label>
-                            <div class="cell-item">发布状态</div>
-                        </template>
-                        <el-tag>{{ data.releaseStatusName }}</el-tag>
-                    </el-descriptions-item>
-                    <el-descriptions-item width="25%">
-                        <template #label>
-                            <div class="cell-item">发布时间</div>
-                        </template>
-                        {{ data.releaseTime }}
-                    </el-descriptions-item>
-                    <el-descriptions-item width="25%">
-                        <template #label>
-                            <div class="cell-item">发布城市</div>
-                        </template>
-                        {{ data.locationCity }}
-                    </el-descriptions-item>
-                    <el-descriptions-item width="25%">
-                        <template #label>
-                            <div class="cell-item">点赞数量</div>
-                        </template>
-                        <el-tag>{{ data.favorCount }}</el-tag>
-                    </el-descriptions-item>
-                    <el-descriptions-item :span="4" v-if="data.releaseStatus==2">
-                        <template #label>
-                            <div class="cell-item">审核失败原因
-                            </div>
-                        </template>
-                        {{ data.releaseReason }}
-                    </el-descriptions-item>
-                </el-descriptions>
-
-            </el-tab-pane>
-
-            <el-tab-pane name="second" label="举报审核">
-                <el-card style="margin: 10px 5px" :key="index" v-for="(item,index) in reportList">
-                    <div style="display: flex;align-items: center">
-                        <img style="height: 60px;width: 60px;border-radius: 30px"
-                             :src="item.headPortrait" :srcset="defaultAvatar"/>
-                        <span style="color: #409eff;margin-left: 20px">{{ item.nickName }}</span>
-                    </div>
-                    <div style="margin-top: 10px">
-                        <h5>{{ item.reportContent }}</h5>
-                    </div>
-                    <div style="margin-top: 10px;display: flex;flex-wrap: wrap">
-                        <div style="height: 150px;margin: 0 10px 10px 0" v-for="(item2,index2) in item.reportPictureUrl"
-                             :key="index2">
-                            <el-image style="height: 150px" :src="item2" :preview-teleported="true"
-                                      :preview-src-list="item.reportPictureUrl"
-                                      :initial-index="index2"/>
-                        </div>
-                    </div>
-                </el-card>
-                <div style="display: flex;align-items: center" v-if="data.momentsStatus==1&&reportList.length>0">
-                    <span style="margin: 0 10px">处理结果</span>
-                    <el-select style="width: 200px" v-model="operateType">
-                        <el-option label="下架" :value="1"></el-option>
-                        <el-option label="举报驳回" :value="2"></el-option>
-                    </el-select>
-                    <el-button style="margin-left: 20px" type="primary" @click="subReport">提交</el-button>
-                </div>
-                <div v-if="reportList.length==0" style="color: #92969a">
-                    <span>暂无待处理举报</span>
-                </div>
-            </el-tab-pane>
-        </el-tabs>
-
-
-        <template #footer>
-            <el-button @click="closeDialog()">{{ data.auditStatus == 0 ? '取消' : '关闭' }}</el-button>
-            <el-button v-if="data.releaseStatus==0&&activeTab=='first'" type="danger" @click="subForm">提交</el-button>
-        </template>
-    </el-dialog>
-</template>
-
-<script setup lang="ts">
-import {nextTick, ref} from "vue";
-import request from "/@/api/request";
-import {moments, order, orderRefund} from '/@/api/controllerUrls'
-import defaultAvatar from '/@/assets/defaultAvatar.svg'
-
-
-let data = ref<any>({})
-let urlList = ref<Array<string>>([])
-let activeTab = ref('first')
-
-//控制对话框
-let showDialog = ref(false)
-//向父容器暴露方法
-defineExpose({
-    open,
-})
-
-//打开对话框并初始化数据
-function open(row: any) {
-    showDialog.value = true
-    data.value = row
-    urlList.value = JSON.parse(row.attachmentUrl)
-    getInitData()
-}
-
-let emit = defineEmits(['close'])
-
-function closeDialog() {
-    showDialog.value = false
-    emit('close')
-}
-
-//订单详情
-let orderData = ref<any>({})
-
-let formData = ref<any>({
-    releaseStatus: '',
-    releaseReason: '',
-})
-
-function validators(rule: any, val: any, callback: Function) {
-    if (formData.value.releaseStatus == 2 && formData.value.releaseReason == '') {
-        return callback(new Error('审核驳回,请输入驳回原因'))
-    }
-    return callback()
-}
-
-let rules = ref({
-    releaseStatus: [{required: true, message: '请选择审核状态', trigger: 'blur',},],
-    releaseReason: [{validator: validators, trigger: 'blur',},],
-})
-
-
-let formRef = ref()
-
-function subForm() {
-    formRef.value.validate((valid: any) => {
-        if (valid) {
-            request.edit(moments, {id: data.value.id, entity: formData.value}, 'release').then((res: any) => {
-                if (res.code == 1) {
-                    closeDialog()
-                }
-            })
-        }
-    })
-}
-
-
-//举报信息
-let reportList = ref([])
-//处理结果
-let operateType = ref('')
-
-function getInitData() {
-    request.index(moments, {id: data.value.id}, 'report/detail').then((res: any) => {
-        if (res.code == 1) {
-            reportList.value = res.data.reportList
-            for (let i in reportList.value) {
-                reportList.value[i].reportPictureUrl = JSON.parse(reportList.value[i].reportPictureUrl)
-            }
-        }
-    })
-}
-
-//提交举报处理结果
-function subReport() {
-    if (operateType.value == '') {
-        return
-    }
-    request.edit(moments, {id: data.value.id, operateType: operateType.value}, 'report/audit').then((res: any) => {
-        if (res.code == 1) {
-            closeDialog()
-        }
-    })
-}
-
-
-</script>
-
-<style scoped>
-
-</style>

+ 0 - 161
src/views/backend/enterprise/members/factionalism/index.vue

@@ -1,161 +0,0 @@
-<template>
-    <div class="default-main ">
-        <el-alert class="ba-table-alert" v-if="baTable.table.remark" :title="baTable.table.remark" type="info"
-                  show-icon/>
-        <el-row>
-            <el-col :span="24">
-
-                <!-- 表格顶部菜单 -->
-                <TableHeader :buttons="['refresh', 'add', 'edit', 'delete', 'comSearch']"
-                             quick-search-placeholder="通过订单号模糊搜索"
-                             @action="baTable.onTableHeaderAction"/>
-                <!-- 表格 -->
-                <!-- 要使用`el-table`组件原有的属性,直接加在Table标签上即可 -->
-                <Table @action="baTable.onTableAction"/>
-
-            </el-col>
-        </el-row>
-
-
-        <auditDialog ref="dialogRef" @close="baTable.onTableHeaderAction('refresh', {loading: true})"></auditDialog>
-
-    </div>
-</template>
-
-<script setup lang="ts">
-import _ from 'lodash'
-import {ref, onMounted, provide} from 'vue'
-import {moments} from '/@/api/controllerUrls'
-import Table from '/@/components/table/index.vue'
-import TableHeader from '/@/components/table/header/index.vue'
-import {useRouter} from 'vue-router'
-import {defaultOptButtons} from '/@/components/table'
-import {baTableApi} from '/@/api/common'
-import baTableClass from '/@/utils/baTable'
-import useCurrentInstance from '/@/utils/useCurrentInstance'
-import {auth} from "/@/utils/common";
-import auditDialog from './auditDialog.vue'
-import defaultAvatar from '/@/assets/defaultAvatar.svg'
-
-const router = useRouter()
-
-let auditBtn: OptButton[] = [
-    {
-        render: 'tipButton',
-        name: 'audit',
-        title: '审核',
-        text: '审核',
-        type: 'warning',
-        icon: '',
-        class: 'table-row-edit',
-        disabledTip: false,
-    },
-]
-
-//根据权限增加按钮
-function optButtons() {
-    let newBtns = defaultOptButtons([])
-    if (auth('audit') == true) {
-        newBtns = _.concat(auditBtn, newBtns)
-    }
-    return newBtns
-}
-
-
-const tableRef = ref()
-const baTable = new baTableClass(
-    new baTableApi(moments),
-    {
-        dblClickNotEditColumn: [undefined, 'status'],
-        column: [
-            {
-                label: '头像',
-                prop: 'headPortrait',
-                align: 'center',
-                width: '100',
-                render: 'image',
-                operator: false
-            },
-            {label: '发布人昵称', prop: 'nickName', align: 'center', width: 120, operator: 'LIKE'},
-            {label: '圈子内容', prop: 'momentsContent', align: 'center', operator: false},
-            {
-                label: '发布状态',
-                prop: 'releaseStatus',
-                align: 'center',
-                render: 'tag',
-                operator: '=',
-                width: 120,
-                custom: {0: 'warning', 1: 'success', 2: 'info'},
-                replaceValue: {0: '待发布', 1: '已发布', 2: '审核失败'},
-            },
-            {
-                label: '举报',
-                prop: 'momentsStatus',
-                align: 'center',
-                render: 'tag',
-                operator: '=',
-                width: 120,
-                custom: {0: 'success', 1: 'warning', 2: 'info'},
-                replaceValue: {0: '正常', 1: '被举报', 2: '已下架'},
-            },
-            {label: '点赞数量', prop: 'favorCount', align: 'center', width: '100', operator: false},
-            {label: '被举报数量', prop: 'reportCountTotal', align: 'center', width: '100', operator: false},
-            {label: '审核失败原因', prop: 'releaseReason', align: 'center', operator: false},
-            {label: '创建时间', prop: 'createTime', align: 'center', width: '170', operator: false},
-            {
-                label: '操作',
-                align: 'center',
-                width: 120,
-                render: 'buttons',
-                buttons: optButtons(),
-                operator: false
-            },
-        ],
-    },
-    {
-        defaultItems: {},
-    },
-    {
-        // 获得编辑数据后
-        requestEdit: () => {
-            if (baTable.form.items && !baTable.form.items.icon) baTable.form.items.icon = 'el-icon-Minus'
-        },
-    }
-)
-
-provide('baTable', baTable)
-
-baTable.mount()
-baTable.getIndex()
-
-
-onMounted(() => {
-
-    const {proxy} = useCurrentInstance()
-    /**
-     * 表格内的按钮响应
-     * @param name 按钮name
-     * @param row 被操作行数据
-     */
-    proxy.eventBus.on('onTableButtonClick', (data: { name: string; row: TableRow }) => {
-        if (!baTable.activate) return
-        if (data.name == 'audit') {
-            buttonClick(data.row)
-        }
-    })
-})
-
-let dialogRef = ref()
-
-/** 点击查看详情按钮响应 */
-const buttonClick = (row: TableRow) => {
-    if (!row) return
-// 数据来自表格数据,未重新请求api,深克隆,不然可能会影响表格
-    let rowClone = _.cloneDeep(row)
-    dialogRef.value.open(rowClone)
-}
-
-</script>
-
-
-<style scoped lang="scss"></style>

+ 0 - 58
src/views/backend/enterprise/members/memberManagement/afterDialog.vue

@@ -1,58 +0,0 @@
-<template>
-    <el-dialog
-        custom-class="ba-operate-dialog"
-        :model-value="showDialog"
-        @close="showDialog=false"
-        title="售后记录"
-    >
-        <el-table :data="tableData">
-            <el-table-column prop="aftersaleTypeName" label="售后类型"></el-table-column>
-            <el-table-column prop="isReturnName" label="是否退货"></el-table-column>
-            <el-table-column prop="aftersaleStatusName" label="售后状态"></el-table-column>
-            <el-table-column prop="aftersaleReason" label="售后原因"></el-table-column>
-        </el-table>
-
-    </el-dialog>
-</template>
-
-<script setup lang="ts">
-
-
-import {nextTick, ref, toRaw} from "vue";
-import request from "/@/api/request";
-import {member, order} from "/@/api/controllerUrls";
-
-let props = defineProps({
-    data: {
-        type: Object,
-        default: {}
-    }
-})
-
-let tableData = ref([])
-
-function getData(row: any) {
-    request.index(order, {id: row.orderId,serialNumber:row.serialNumber}, 'aftersale/index').then(res => {
-        tableData.value = res.data
-    })
-}
-
-
-let showDialog = ref(false)
-
-function openDialog(value: any) {
-    showDialog.value = true
-    nextTick(() => {
-        getData(value)
-    })
-}
-
-defineExpose({
-    openDialog,
-})
-
-</script>
-
-<style scoped>
-
-</style>

+ 0 - 105
src/views/backend/enterprise/members/memberManagement/detail.vue

@@ -1,105 +0,0 @@
-<template>
-    <div class="default-main ba-table-box">
-        <div
-            style="padding-left: 10px;padding-bottom: 10px;width: 100%;background-color: #f5f5f5;margin-left: 10px;">
-            <el-page-header @back="backFn">
-                <template #content>
-                    <span class="text-large font-600 mr-3">用户详情</span>
-                </template>
-            </el-page-header>
-        </div>
-        <el-card style="margin-top: 10px">
-            <div style="width: 100%;display: flex;align-items: center">
-                <el-image  alt="#" style="height: 60px;width: 60px;border-radius: 30px" v-if="userInfo.headPortrait==='/'" :src="defaultAvatar"></el-image>
-                <el-image  alt="#" style="height: 60px;width: 60px;border-radius: 30px" v-else :src="userInfo.headPortrait"></el-image>
-                <h4 style="margin-left: 30px;color: #409eff">{{ userInfo.nickName }}</h4>
-                <h4 style="margin-left: 40px">联系电话</h4>
-                <h4 style="margin-left: 20px;color: #409eff">{{ userInfo.mobileNumber }}</h4>
-            </div>
-
-
-        </el-card>
-        <el-card style="margin-top: 20px">
-            <h3>购买记录</h3>
-            <el-table :data="userData.equipmentList" border class="mt-20">
-                <el-table-column prop="orderNumber" label="订单编号"></el-table-column>
-                <el-table-column prop="productName" label="产品名称"></el-table-column>
-                <el-table-column prop="serialNumber" label="产品序列号"></el-table-column>
-                <el-table-column prop="equipmentAreaName" label="所在区域" width="120"></el-table-column>
-                <el-table-column prop="isOnline" label="是否在线" width="120"></el-table-column>
-                <el-table-column prop="purchaseDate" label="购买日期" width="120"></el-table-column>
-                <el-table-column prop="expirationDate" label="保修日期" width="120"></el-table-column>
-                <el-table-column prop="equipmentStatusName" label="状态" width="80"></el-table-column>
-                <el-table-column prop="" label="操作" width="120">
-                    <template #default="{row}">
-                        <el-button type="primary" plain size="small" @click="dialogRef.openDialog(row)">售后记录</el-button>
-                    </template>
-                </el-table-column>
-            </el-table>
-        </el-card>
-        <el-card style="margin-top: 20px">
-            <h3>优惠券</h3>
-            <el-table :data="userData.memberCouponList" border class="mt-20">
-                <el-table-column prop="couponName" label="标题"></el-table-column>
-                <el-table-column prop="couponSourceName" label="获取场景"></el-table-column>
-                <el-table-column prop="discountAmount" label="优惠金额"></el-table-column>
-                <el-table-column prop="couponStatusName" label="状态"></el-table-column>
-            </el-table>
-        </el-card>
-        <el-card style="margin-top: 20px">
-            <h3>好友邀请</h3>
-            <el-table :data="userData.inviteMemberList" border class="mt-20">
-                <el-table-column  label="头像" width="80" align="center">
-                    <template #default="{row}">
-                        <el-image :src="defaultAvatar" v-if="row.headPortrait==='/'" alt="" style="width:30px"></el-image>
-                        <el-image :src="row.headPortrait" v-else alt=""></el-image>
-                    </template>
-                </el-table-column>
-                <el-table-column prop="nickName" label="用户名"></el-table-column>
-                <el-table-column prop="mobileNumber" label="手机号码"></el-table-column>
-                <el-table-column prop="createTime" label="注册日期"></el-table-column>
-            </el-table>
-        </el-card>
-
-        <afterDialog ref="dialogRef" ></afterDialog>
-    </div>
-</template>
-
-<script setup lang="ts">
-
-import {onMounted, ref} from "vue";
-import {useRoute, useRouter} from 'vue-router'
-import request from "/@/api/request";
-import {member} from "/@/api/controllerUrls";
-import afterDialog from './afterDialog.vue'
-import defaultAvatar from '/@/assets/defaultAvatar.svg'
-const route = useRoute()
-const router = useRouter()
-
-let dialogRef = ref()
-
-let userInfo = ref({})
-onMounted(() => {
-    userInfo.value = route.params
-    getUserData()
-})
-
-let userData = ref({})
-
-function getUserData(){
-    request.index(member,{id:userInfo.value.id},'detail').then(res=>{
-        userData.value = res.data
-    })
-}
-
-
-
-
-function backFn() {
-    router.go(-1)
-}
-</script>
-
-<style scoped>
-
-</style>

+ 47 - 160
src/views/backend/enterprise/members/memberManagement/memberinfo.vue

@@ -1,181 +1,68 @@
 <template>
-    <div class="default-main ba-table-box">
-        <el-alert class="ba-table-alert" v-if="baTable.table.remark" :title="baTable.table.remark" type="info"
-                  show-icon/>
-        <el-row>
-            <el-col :span="24">
-                <!-- 表格顶部菜单 -->
-                <TableHeader :buttons="['refresh', 'add', 'edit', 'delete', 'comSearch']"
-                             quick-search-placeholder="通过标题模糊搜索"
-                             @action="baTable.onTableHeaderAction"/>
-                <!-- 表格 -->
-                <!-- 要使用`el-table`组件原有的属性,直接加在Table标签上即可 -->
-                <Table @action="baTable.onTableAction"/>
-
-            </el-col>
-        </el-row>
-
-
-    </div>
+  <div class="default-main ">
+    <el-alert class="ba-table-alert" v-if="baTable.table.remark" :title="baTable.table.remark" type="info"
+              show-icon/>
+    <el-row>
+      <el-col :span="24">
+
+        <!-- 表格顶部菜单 -->
+        <TableHeader :buttons="['refresh', 'add', 'edit', 'delete', 'comSearch']"
+                     quick-search-placeholder="通过标题模糊搜索"
+                     @action="baTable.onTableHeaderAction"/>
+        <!-- 表格 -->
+        <!-- 要使用`el-table`组件原有的属性,直接加在Table标签上即可 -->
+        <Table @action="baTable.onTableAction"/>
+
+      </el-col>
+    </el-row>
+
+    <!-- 表单 -->
+
+  </div>
 </template>
 
 <script setup lang="ts">
-import {ref, onMounted, provide, nextTick} from 'vue'
-import {advertisement, coupon, document, member, order, recommend} from '/@/api/controllerUrls'
+import {ref, onMounted, provide} from 'vue'
+import { member } from "/@/api/controllerUrls";
 import Table from '/@/components/table/index.vue'
 import TableHeader from '/@/components/table/header/index.vue'
-import {defaultOptButtons} from '/@/components/table/index'
+import {defaultOptButtons} from '/@/components/table'
 import {baTableApi} from '/@/api/common'
 import baTableClass from '/@/utils/baTable'
-import _ from "lodash";
-import {useRouter} from "vue-router";
-import useCurrentInstance from "/@/utils/useCurrentInstance";
-import {auth} from '/@/utils/common'
-import {ElMessageBox} from "element-plus";
-import request from "/@/api/request";
-import {ElNotification} from "element-plus/es";
-
-
-const router = useRouter()
-
-//详情按钮
-let detailBtn: OptButton[] = [
-    {
-        render: 'tipButton',
-        name: 'detail',
-        title: '详情',
-        text: '详情',
-        type: 'primary',
-        icon: '',
-        class: 'table-row-edit',
-        disabledTip: false,
-    },
-]
-
-//注销按钮
-let cancelBtn: OptButton[] = [
-    {
-        render: 'tipButton',
-        name: 'cancel',
-        title: '注销',
-        text: '注销',
-        type: 'danger',
-        icon: '',
-        class: '',
-        disabledTip: false,
-    },
-]
 
-//根据权限增加按钮
-function optButtons() {
-    let newBtns = defaultOptButtons([])
-    if (auth('cancel') == true) {
-        newBtns = _.concat(cancelBtn, newBtns)
-    }
-    if (auth('detail') == true) {
-        newBtns = _.concat(detailBtn, newBtns)
-    }
-    return newBtns
-}
 
-
-const tableRef = ref()
 const baTable = new baTableClass(
-    new baTableApi(member),
-    {
-        dblClickNotEditColumn: ['all'],
-        column: [
-            {
-                label: '头像',
-                prop: 'headPortrait',
-                align: 'center',
-                width: '120',
-                render: 'image',
-                operator: false
-            },
-            {label: '用户名', prop: 'nickName', align: 'center', operator: 'LIKE'},
-            {label: '手机号', prop: 'mobileNumber', align: 'center', operator: 'LIKE'},
-            {label: '最后一次登录', prop: 'lastLoginTime', align: 'center', operator: false},
-            {
-                label: '状态',
-                prop: 'memberStatus',
-                align: 'center',
-                render: 'tag',
-                operator: '=',
-                custom: {0: 'success', 1: 'warning', 2: 'info'},
-                replaceValue: {0: '正常', 1: '待注销', 2: '已注销'}
-            },
-            {label: '创建时间', prop: 'createTime', align: 'center', operator: false},
-            {
-                label: '操作',
-                align: 'center',
-                width: '160',
-                render: 'buttons',
-                buttons: optButtons(),
-                operator: false
-            },
-        ],
-    },
-    {
-        defaultItems: {},
+  new baTableApi(member),
+  {
+    dblClickNotEditColumn: [undefined, 'status'],
+    column: [
+      {type: 'selection', align: 'center', operator: false},
+      {label: '头像', prop: 'headPortrait', align: 'center',render:'image', operator: false},
+      {label: '用户昵称', prop: 'nickName', align: 'left', operator: 'LIKE'},
+      {label: '会员状态', prop: 'memberStatusName', align: 'left', operator: 'LIKE'},
+      {label: '联系电话', prop: 'mobileNumber', align: 'left', operator: 'LIKE'},
+      {label: '最后一次登陆时间', prop: 'lastLoginTime', align: 'left', operator: 'LIKE'},
+      {label: '创建人', prop: 'creatorName', align: 'center', width: '120', operator: false},
+      {label: '创建时间', prop: 'createTime', align: 'center', width: '180', operator: false},
+    ],
+  },
+  {
+    defaultItems: {},
+  },
+  {
+    // 获得编辑数据后
+    requestEdit: () => {
+      if (baTable.form.items && !baTable.form.items.icon) baTable.form.items.icon = 'el-icon-Minus'
     },
-    {
-        // 获得编辑数据后
-        requestEdit: () => {
-            if (baTable.form.items && !baTable.form.items.icon) baTable.form.items.icon = 'el-icon-Minus'
-        },
-    }
+  }
 )
 
 provide('baTable', baTable)
 
 onMounted(() => {
-    baTable.mount()
-    baTable.getIndex()
-
-    const {proxy} = useCurrentInstance()
-    /**
-     * 表格内的按钮响应
-     * @param name 按钮name
-     * @param row 被操作行数据
-     */
-    proxy.eventBus.on('onTableButtonClick', (data: { name: string; row: TableRow }) => {
-        if (!baTable.activate) return
-        if (data.name == 'detail') {
-            infoButtonClick(data.row)
-        } else {
-            cancelBunClick(data.row)
-        }
-    })
+  baTable.mount()
+  baTable.getIndex()
 })
-
-
-/** 点击详情按钮响应 */
-const infoButtonClick = (row: TableRow) => {
-    if (!row) return
-// 数据来自表格数据,未重新请求api,深克隆,不然可能会影响表格
-    let rowClone = _.cloneDeep(row)
-    router.push({name: 'members/memberinfo/detail', params: rowClone})
-}
-
-/** 点击详情按钮响应 */
-const cancelBunClick = (row: TableRow) => {
-    if (!row) return
-// 数据来自表格数据,未重新请求api,深克隆,不然可能会影响表格
-    let rowClone = _.cloneDeep(row)
-    ElMessageBox.confirm('是否确认注销该用户?', {type: 'warning'}).then(() => {
-        request.edit(member, {id: rowClone.id}, 'cancel/confirm').then(res => {
-            ElNotification({
-                message: '注销成功',
-                type: 'success',
-            })
-            baTable.onTableHeaderAction('refresh', {loading: true})//调用组件刷新功能
-        })
-    })
-
-
-}
-
 </script>
 
 

+ 3 - 2
src/views/backend/enterprise/project/parking/parkingView.vue

@@ -82,11 +82,10 @@ function setImgSize() {
   const m = document.getElementById("mapContainer");
   let img = new Image();
   img.src = props.imgUrl;
-  console.log(img);
   setTimeout(()=>{
+    console.log(img);
     width.value = m.clientWidth;
     height.value = m.clientWidth * (img.height / img.width);
-    console.log(width.value, height.value);
   },0)
 
 }
@@ -209,6 +208,8 @@ function wheel(event) {
   transition: transform 0.5s ease;
   left: 0;
   top: 0;
+  min-width: 100px;
+  min-height: 100px;
 }
 
 :deep(.labelItem) {

+ 79 - 6
src/views/backend/enterprise/store/employee/index.vue

@@ -1,13 +1,86 @@
 <template>
+  <div class="default-main ">
+    <el-alert class="ba-table-alert" v-if="baTable.table.remark" :title="baTable.table.remark" type="info"
+              show-icon/>
+    <el-row>
+      <el-col :span="24">
 
+        <!-- 表格顶部菜单 -->
+        <TableHeader :buttons="['refresh', 'add', 'edit', 'delete', 'comSearch']"
+                     quick-search-placeholder="通过标题模糊搜索"
+                     @action="baTable.onTableHeaderAction"/>
+        <!-- 表格 -->
+        <!-- 要使用`el-table`组件原有的属性,直接加在Table标签上即可 -->
+        <Table @action="baTable.onTableAction"/>
+
+      </el-col>
+    </el-row>
+
+    <!-- 表单 -->
+    <PopupForm ref="formRef"/>
+
+  </div>
 </template>
 
-<script>
-export default {
-  name: "index"
-};
+<script setup lang="ts">
+import {ref, onMounted, provide} from 'vue'
+import { storeEmployee } from "/@/api/controllerUrls";
+import Table from '/@/components/table/index.vue'
+import TableHeader from '/@/components/table/header/index.vue'
+import {defaultOptButtons} from '/@/components/table'
+import PopupForm from './popupForm.vue'
+import {baTableApi} from '/@/api/common'
+import baTableClass from '/@/utils/baTable'
+
+
+const baTable = new baTableClass(
+  new baTableApi(storeEmployee),
+  {
+    dblClickNotEditColumn: [undefined, 'status'],
+    column: [
+      {type: 'selection', align: 'center', operator: false},
+      {label: '头像', prop: 'defaultHeadPortrait', align: 'center',render:'image', operator: false},
+      {label: '姓名', prop: 'realName', align: 'left', operator: 'LIKE'},
+      {
+        label: "性别",
+        prop: "sex",
+        align: "center",
+        render: "tag",
+        operator: "=",
+        replaceValue: { 1: "男", 2: "女" }
+      },
+      {label: '所属门店', prop: 'storeName', align: 'center',  operator: false},
+      {label: '手机号码', prop: 'mobileNumber', align: 'center',  operator: false},
+      {label: '创建人', prop: 'creatorName', align: 'center', width: '120', operator: false},
+      {label: '创建时间', prop: 'createTime', align: 'center', width: '180', operator: false},
+      {
+        label: '操作',
+        align: 'center',
+        width: '160',
+        render: 'buttons',
+        buttons: defaultOptButtons(),
+        operator: false
+      },
+    ],
+  },
+  {
+    defaultItems: {},
+  },
+  {
+    // 获得编辑数据后
+    requestEdit: () => {
+      if (baTable.form.items && !baTable.form.items.icon) baTable.form.items.icon = 'el-icon-Minus'
+    },
+  }
+)
+
+provide('baTable', baTable)
+
+onMounted(() => {
+  baTable.mount()
+  baTable.getIndex()
+})
 </script>
 
-<style scoped>
 
-</style>
+<style scoped lang="scss"></style>

+ 25 - 31
src/views/backend/enterprise/store/employee/popupForm.vue

@@ -15,31 +15,31 @@
         <el-form ref="formRef" @keyup.enter="baTable.onSubmit(formRef)" :model="baTable.form.items"
                  label-position="right" :label-width="'100px'" :rules="rules"
                  v-if="!baTable.form.loading">
-          <el-form-item prop="storeId" label="门店名称">
-            <el-select v-model="baTable.form.items!.storeId" placeholder="请选择" style="width: 100%">
-              <el-option v-for="item in storeList" :label="item.storeName" :value="item.id"></el-option>
-            </el-select>
+          <el-form-item prop="realName" label="姓名">
+            <el-input v-model="baTable.form.items!.realName" placeholder="请输入">
+            </el-input>
           </el-form-item>
-          <el-form-item prop="goodsName" label="商品名称">
-            <el-input v-model="baTable.form.items!.goodsName" placeholder="请输入"></el-input>
+          <el-form-item prop="sex" label="性别">
+            <el-select v-model="baTable.form.items!.sex" placeholder="请选择" style="width: 100%">
+              <el-option label="男" :value="1"></el-option>
+              <el-option label="女" :value="2"></el-option>
+            </el-select>
           </el-form-item>
-          <el-form-item prop="goodsType" label="商品类型">
-            <el-select v-model="baTable.form.items!.goodsType" placeholder="请选择" style="width: 100%">
-              <el-option label="服务" :value="0"></el-option>
-              <el-option label="实物" :value="1"></el-option>
+          <el-form-item prop="lastLoginStoreId" label="所属门店">
+            <el-select v-model="baTable.form.items!.lastLoginStoreId" placeholder="请选择" style="width: 100%">
+              <el-option v-for="item in storeList" :label="item.storeName" :value="item.id"></el-option>
             </el-select>
           </el-form-item>
-          <el-form-item prop="goodsPrice" label="商品价格">
-            <el-input type="number" v-model="baTable.form.items!.goodsPrice" placeholder="请输入"></el-input>
+          <el-form-item prop="postName" label="职务">
+            <el-input v-model="baTable.form.items!.postName" placeholder="请输入">
+            </el-input>
           </el-form-item>
-          <el-form-item prop="goodsStatus" label="商品状态">
-            <el-select v-model="baTable.form.items!.goodsStatus" placeholder="请选择" style="width: 100%">
-              <el-option label="正常" :value="0"></el-option>
-              <el-option label="停用" :value="1"></el-option>
-            </el-select>
+          <el-form-item prop="mobileNumber" label="手机号">
+            <el-input v-model="baTable.form.items!.mobileNumber" placeholder="请输入">
+            </el-input>
           </el-form-item>
-          <el-form-item prop="description" label="商品说明">
-            <el-input type="textarea" v-model="baTable.form.items!.description" placeholder="请输入"></el-input>
+          <el-form-item prop="defaultHeadPortrait" label="头像">
+            <pictureUpload v-model:fileUrl="baTable.form.items!.defaultHeadPortrait"></pictureUpload>
           </el-form-item>
         </el-form>
       </div>
@@ -62,6 +62,7 @@ import type baTableClass from "/@/utils/baTable";
 import type { ElForm, FormItemRule } from "element-plus";
 import FormItem from "/@/components/formItem/index.vue";
 import { ElNotification } from "element-plus/es";
+import pictureUpload from "/@/components/pictureUpload/index.vue";
 import request from "/@/api/request";
 import { store } from "/@/api/controllerUrls";
 
@@ -70,13 +71,13 @@ const baTable = inject("baTable") as baTableClass;
 
 
 const rules: Partial<Record<string, FormItemRule[]>> = reactive({
-  storeId: [{ required: true, message: "请选择", trigger: "blur" }],
-  goodsName: [{ required: true, message: "请输入", trigger: "blur" }],
-  goodsType: [{ required: true, message: "请选择", trigger: "blur" }],
-  goodsPrice: [{ required: true, message: "请输入", trigger: "blur" }],
-  goodsStatus: [{ required: true, message: "请选择", trigger: "blur" }]
+  realName: [{ required: true, message: "请选择", trigger: "blur" }],
+  postName: [{ required: true, message: "请选择", trigger: "blur" }],
+  sex: [{ required: true, message: "请选择", trigger: "blur" }],
+  lastLoginStoreId: [{ required: true, message: "请选择", trigger: "blur" }],
 });
 
+
 onMounted(() => {
   getInitData();
 });
@@ -91,7 +92,6 @@ function getInitData() {
   });
 }
 
-
 </script>
 
 <style scoped lang="scss">
@@ -125,10 +125,4 @@ function getInitData() {
   justify-content: center;
   height: 100%;
 }
-
-:deep(input::-webkit-outer-spin-button),
-:deep(input::-webkit-inner-spin-button) {
-  -webkit-appearance: none !important;
-  margin: 0;
-}
 </style>

+ 1 - 1
src/views/backend/enterprise/store/storeManage/index.vue

@@ -48,7 +48,7 @@ const baTable = new baTableClass(
         operator: "=",
         replaceValue: { 0: "自营", 1: "加盟" }
       },
-      {label: '门店LOGO', prop: 'storeLogo', align: 'center',render:'images', operator: false},
+      {label: '门店LOGO', prop: 'storeLogo', align: 'center',render:'image', operator: false},
       {
         label: "门店状态",
         prop: "storeStatus",