用户消费金额与总订单数,按标签过滤会员,订单列表会员名称与导出
| | |
| | | |
| | | // 获取会员列表 |
| | | export const getMemberListData = (params) => { |
| | | return getRequest("/passport/member", params); |
| | | const processedParams = new URLSearchParams(); |
| | | |
| | | Object.entries(params).forEach(([key, value]) => { |
| | | if (key === 'tagIds' && Array.isArray(value)) { |
| | | // 如果是tagIds数组,为每个元素添加[]后缀 |
| | | value.forEach(tagId => { |
| | | processedParams.append('tagIds[]', tagId); |
| | | }); |
| | | } else { |
| | | processedParams.append(key, value); |
| | | } |
| | | }); |
| | | |
| | | return getRequest(`/passport/member?${processedParams.toString()}`); |
| | | }; |
| | | |
| | | // 获取会员详情 |
| | |
| | | deleteRequest |
| | | } from '@/libs/axios'; |
| | | |
| | | export const countByIdOrder = (id) =>{ |
| | | return getRequest(`/order/order/countOrder/${id}`,) |
| | | } |
| | | |
| | | // 交由商家申诉 |
| | | export const storeComplain = (params) => { |
| | |
| | | <Form-item label="联系方式" prop="mobile"> |
| | | <Input type="text" v-model="searchForm.mobile" placeholder="请输入会员联系方式" clearable style="width: 200px" /> |
| | | </Form-item> |
| | | <Form-item label="用户标签" prop="tags"> |
| | | <Select v-model="searchForm.tagIds" multiple filterable :loading="selectLoading" style="width:200px;"> |
| | | <Option v-for="item in options" :key="item.id" :label="item.tagName" :value="item.id"></Option> |
| | | </Select> |
| | | </Form-item> |
| | | |
| | | <Button @click="handleSearch" class="search-btn" type="primary" icon="ios-search">搜索</Button> |
| | | </Form> |
| | | </Row> |
| | |
| | | <Option v-for="item in options" :key="item.id" :label="item.tagName" :value="item.id"></Option> |
| | | </Select> |
| | | </FormItem> |
| | | <FormItem label="用户自定义标签" prop="customerTags"> |
| | | <span class="inf0o" v-for="(item,index) in memberTags" :key="index">{{item.tagName}}<span v-if="index < memberTags.length - 1">, </span></span> |
| | | </FormItem> |
| | | <FormItem label="性别" prop="sex"> |
| | | <RadioGroup type="button" button-style="solid" v-model="form.sex"> |
| | | <Radio :label="1"> |
| | |
| | | </FormItem> |
| | | <FormItem label="所在地" prop="mail"> |
| | | {{ form.region || '暂无地址' }} |
| | | |
| | | |
| | | <Button style="margin-left: 10px;" @click="$refs.map.open()">选择</Button> |
| | | |
| | | </FormItem> |
| | | </Form> |
| | | </Modal> |
| | |
| | | import ossManage from "@/views/sys/oss-manage/ossManage"; |
| | | import * as RegExp from "@/libs/RegExp.js"; |
| | | import { getTags } from "@/api/tag.js"; |
| | | import { detailById } from "@/api/memberCustomerTag.js" |
| | | |
| | | export default { |
| | | name: "member", |
| | |
| | | }, |
| | | data() { |
| | | return { |
| | | memberTags:[], |
| | | defaultPic: require('@/assets/default.png'), |
| | | descTitle: "", // modal标题 |
| | | descFlag: false, //编辑查看框 |
| | |
| | | username: "", |
| | | mobile: "", |
| | | disabled: "OPEN", |
| | | tagIds:[], |
| | | }, |
| | | picModelFlag: false, // 选择图片 |
| | | form: {}, // 表单数据 |
| | |
| | | }, |
| | | }, |
| | | methods: { |
| | | getMemberTags(id){ |
| | | detailById(id).then(res =>{ |
| | | if (res.code === 200){ |
| | | this.memberTags = res.data; |
| | | } |
| | | }); |
| | | }, |
| | | // 回调给父级 |
| | | callback(val, index) { |
| | | this.selectMember.forEach(item => { item.___selected = false }) |
| | |
| | | }, |
| | | //查看详情修改 |
| | | editPerm(val) { |
| | | this.form = {}; |
| | | this.descTitle = `查看用户 ${val.username}`; |
| | | this.descFlag = true; |
| | | |
| | | this.getMemberTags(val.id); |
| | | this.getMemberInfo(val.id); |
| | | }, |
| | | addMember() { |
| | |
| | | </div> |
| | | </div> |
| | | <div class="bottom-info"> |
| | | <p>上次登录 {{memberInfo.lastLoginDate}} |
| | | <p>上次登录 {{memberInfo.lastLoginDate}} </p> |
| | | <p> |
| | | <i-switch size="large" v-model="memberInfo.disabled" :true-value="true" :false-value="false" |
| | | @on-change="memberStatusChange"> |
| | |
| | | class="info">暂未完善</span> |
| | | <span v-else class="info">{{memberInfo.region}}</span> |
| | | </p> |
| | | |
| | | </div> |
| | | <div class="ant-col-md-6"> |
| | | <p class="item"> |
| | | <span class="label">注册时间:</span> |
| | | <span class="info">{{memberInfo.createTime}}</span> |
| | | </p> |
| | | <p class="item"> |
| | | <span class="label">用户自定义标签:</span> |
| | | <span class="inf0o" v-for="(item,index) in memberTags" :key="index">{{item.tagName}}<span v-if="index < memberTags.length - 1">, </span></span> |
| | | <span v-for="(item,index) in memberTags" :key="index">{{item.tagName}}<span v-if="index < memberTags.length - 1">, </span></span> |
| | | </p> |
| | | <p class="item"> |
| | | <span class="label">总完成订单数:</span> |
| | | <span class="info">{{orderNumCount}}</span> |
| | | </p> |
| | | <p class="item"> |
| | | <span class="label">总消费金额:</span> |
| | | <span class="info">{{orderPriceCount}}</span> |
| | | </p> |
| | | <p class="item"> |
| | | <span class="label">系统标签:</span> |
| | | <span v-for="(item,index) in memberInfo.tags" :key="index">{{item.tagName}}<span v-if="index < memberInfo.tags.length - 1">, </span></span> |
| | | </p> |
| | | </div> |
| | | <div> |
| | | |
| | | </div> |
| | | |
| | | </div> |
| | | </Card> |
| | | |
| | |
| | | import multipleMap from "@/components/map/multiple-map"; |
| | | import * as RegExp from '@/libs/RegExp.js'; |
| | | import * as API_Order from "@/api/order.js"; |
| | | import {countByIdOrder} from "../../../api/order"; |
| | | |
| | | export default { |
| | | name: "memberDetail", |
| | |
| | | id: "",//会员id |
| | | loading: true, // 表单加载状态 |
| | | memberInfo: {},//会员信息 |
| | | orderPriceCount:0, |
| | | orderNumCount:0, |
| | | memberWalletInfo: {},//会员预存款信息 |
| | | addressModalTitle: "",//会员地址操作标题 |
| | | addressModalVisible: false, //会员地址操作弹出框 |
| | |
| | | methods: { |
| | | |
| | | init() { |
| | | this.getCountOrderPrice(); |
| | | //查询会员信息 |
| | | this.getMemberInfo(); |
| | | //查询会员的历史积分数据 |
| | |
| | | } |
| | | }); |
| | | }, |
| | | getCountOrderPrice(){ |
| | | API_Order.countByIdOrder(this.id).then(res =>{ |
| | | this.$set(this, "orderPriceCount", res.result.orderPriceCount); |
| | | this.$set(this, "orderNumCount", res.result.orderNumCount); |
| | | }) |
| | | }, |
| | | //会员信息tab改变事件 |
| | | memberInfoChange(v) { |
| | | if (v == "point") { |
| | |
| | | style="width: 160px" |
| | | /> |
| | | </Form-item> |
| | | <Form-item label="会员名称" prop="buyerName"> |
| | | <!-- <Form-item label="会员名称" prop="buyerName">--> |
| | | <!-- <Input--> |
| | | <!-- type="text"--> |
| | | <!-- v-model="searchForm.buyerName"--> |
| | | <!-- placeholder="请输入会员名称"--> |
| | | <!-- clearable--> |
| | | <!-- style="width: 160px"--> |
| | | <!-- />--> |
| | | <!-- </Form-item>--> |
| | | <Form-item label="会员昵称" prop="nickName"> |
| | | <Input |
| | | type="text" |
| | | v-model="searchForm.buyerName" |
| | | placeholder="请输入会员名称" |
| | | v-model="searchForm.nickName" |
| | | placeholder="请输入会员昵称" |
| | | clearable |
| | | style="width: 160px" |
| | | /> |
| | |
| | | orderType: "", |
| | | orderSn: "", |
| | | buyerName: "", |
| | | nickName:"", |
| | | orderStatus: "", |
| | | }, |
| | | selectDate: null, |
| | |
| | | :title="playVideoTitle" |
| | | width="800" |
| | | :mask-closable="false" |
| | | @close="playVideoClose" |
| | | @on-cancel="playVideoClose" |
| | | > |
| | | <div class="video-warp"> |
| | | <video :src="playVideoUrl" autoplay controls style="width: 768px;height: 432px"/> |
| | | </div> |
| | | <div slot="footer"> |
| | | <Button type="text" @click="playVideoClose">关闭</Button> |
| | | <Button type="text" @click="playVideoClose">关闭1</Button> |
| | | </div> |
| | | </Modal> |
| | | |
| | |
| | | this.upLoadVideoShow = false; |
| | | }, |
| | | submitVideoUpload() { |
| | | console.log(this.uploadVideoForm.coverUrl) |
| | | if (this.uploadVideoForm.coverUrl === null || this.uploadVideoForm.coverUrl === undefined) { |
| | | this.$Message.error('标题不能为空'); |
| | | return; |
| | | } |
| | | // if (this.uploadVideoForm.coverUrl === null || this.uploadVideoForm.coverUrl === undefined) { |
| | | // this.$Message.error('封面不能为空'); |
| | | // return; |
| | | // } |
| | | this.uploadVideoForm.goodsList = this.uploadVideoForm.goodsList.filter(item => { |
| | | return item.goodsNum > 0; |
| | | }) |