From d6000775372ca9f31d5da635362d41289bccae6e Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期四, 15 五月 2025 17:45:05 +0800
Subject: [PATCH] 客户管理,客户列表页面
---
manager/src/api/customer.js | 78 +++++++++
manager/src/views/customer/index.vue | 387 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 465 insertions(+), 0 deletions(-)
diff --git a/manager/src/api/customer.js b/manager/src/api/customer.js
new file mode 100644
index 0000000..bf261ad
--- /dev/null
+++ b/manager/src/api/customer.js
@@ -0,0 +1,78 @@
+import service from "@/libs/axios";
+
+// 鑾峰彇瀹㈡埛鍒楄〃
+export const getCustomerList = (params) => {
+ return service({
+ url: "/customerManager",
+ method: "GET",
+ params: params
+ })
+}
+// 娣诲姞鏍囩
+export const addCustomerTag = (params) => {
+ return service({
+ url: "/customerManager/addTag",
+ method: "POST",
+ data: params
+ })
+}
+// 淇敼鏍囩
+export const editTag = (params) => {
+ return service({
+ url: "/customerManager/editTag",
+ method: "PUT",
+ data: params
+ })
+}
+// 鍒犻櫎鏍囩
+export const delTag = (params) => {
+ return service({
+ url: "/customerManager/tag/" + params,
+ method: "DELETE",
+ })
+}
+// 鏍囩鍒楄〃
+export const getTagList = () => {
+ return service({
+ url: "/customerManager/tagList",
+ method: "GET",
+ })
+}
+// 鍒嗛〉鏍囩鍒楄〃
+export const getPageTagList = (params) =>{
+ return service({
+ url: "/customerManager/pageTagList",
+ method: "GET",
+ params:params
+ })
+}
+// 娣诲姞瀹㈡埛鏍囩鏍囪瘑
+export const saveCustomerTagById = (params) => {
+ return service({
+ url: "/customerManager/customerAddTag",
+ method: "POST",
+ data:params
+ })
+}
+// 淇敼瀹㈡埛鏍囩鏍囪瘑
+export const editCustomerTagById = (params) => {
+ return service({
+ url: "/customerManager/customerEditTag",
+ method: "PUT",
+ data:params
+ })
+}
+// 鍒犻櫎瀹㈡埛鏍囩鏍囪瘑ID鍒犻櫎
+export const removeCustomerTagById = (params) => {
+ return service({
+ url: "/customerManager/customerDelTag/" + params,
+ method: "DELETE",
+ })
+}
+export const getStoreSelectOptions = () =>{
+ return service({
+ url: '/customerManager/store/selectOption',
+ method: 'GET'
+ })
+}
+
diff --git a/manager/src/views/customer/index.vue b/manager/src/views/customer/index.vue
new file mode 100644
index 0000000..0076c30
--- /dev/null
+++ b/manager/src/views/customer/index.vue
@@ -0,0 +1,387 @@
+<template>
+ <div>
+ <card>
+ <Form
+ ref="searchForm"
+ @keydown.enter.native="handleSearch"
+ :model="searchForm"
+ inline
+ :label-width="70"
+ class="search-form"
+ >
+ <Form-item label="鐢ㄦ埛鍚�" prop="username">
+ <Input
+ type="text"
+ v-model="searchForm.username"
+ clearable
+ @on-clear="handleSearch"
+ @on-change="handleSearch"
+ style="width: 160px"
+ />
+ </Form-item>
+ <Form-item label="鏄电О" prop="nickname">
+ <Input
+ type="text"
+ v-model="searchForm.nickName"
+ clearable
+ @on-clear="handleSearch"
+ @on-change="handleSearch"
+ style="width: 160px"
+ />
+ </Form-item>
+ <Form-item label="鍟嗗" prop="storeId">
+ <Select
+ v-model="searchForm.storeId"
+ style="width:160px"
+ :loading="storeSelectLoading"
+ class="custom-select"
+ clearable
+ @on-clear="handleSearch"
+ @on-change="handleSearch"
+ >
+ <Option
+ v-for="item in selectOptions"
+ :value="item.id"
+ :key="item.id"
+ >
+ {{ item.storeName }}
+ </Option>
+ </Select>
+ </Form-item>
+ <Button
+ @click="handleSearch"
+ type="primary"
+ icon="ios-search"
+ class="search-btn"
+ >鎼滅储</Button
+ >
+ </Form>
+
+ <Table
+ :loading="loading"
+ border
+ :columns="columns"
+ :data="customerList"
+ ref="table"
+ sortable="custom"
+ @on-sort-change="changeSort"
+ @on-selection-change="showSelect"
+ >
+ <template slot-scope="{ row, index }" slot="action">
+ <Button type="info" size="small" style="margin-right: 5px" @click="openEdit(row)">缂栬緫鏍囩</Button>
+ <Button type="error" size="small" style="margin-right: 5px" @click="joinBlack(row)">鍔犲叆榛戝悕鍗�</Button>
+ </template>
+ </Table>
+ <Row type="flex" justify="end" class="mt_10">
+ <Page
+ :current="searchForm.pageNumber"
+ :total="total"
+ :page-size="searchForm.pageSize"
+ @on-change="changePage"
+ @on-page-size-change="changePageSize"
+ :page-size-opts="[10, 20, 50]"
+ size="small"
+ show-total
+ show-elevator
+ show-sizer
+ ></Page>
+ </Row>
+
+ <Modal
+ v-model="showCustomerTag"
+ :title="modelTitle"
+ >
+ <Form ref="form" :model="tagForm" :label-width="70" :rules="rules">
+ <FormItem label="鏍囩鍚嶇О" prop="tagList">
+ <Select
+ v-model="tagForm.tagList"
+ multiple
+ style="width:260px"
+ :loading="selectLoading"
+ class="custom-select"
+ @on-clear="handleRemoveTag"
+ @on-select="handleSelectChange"
+ >
+ <Option
+ v-for="item in tagList"
+ :value="item.id"
+ :key="item.id"
+ >
+ {{ item.tagName }}
+ </Option>
+ </Select>
+ </FormItem>
+ </Form>
+ <div slot="footer">
+ <Button type="text" @click="modelClose">纭畾</Button>
+<!-- <Button type="primary" :loading="submitLoading" @click="saveOrUpdate">鎻愪氦</Button>-->
+ </div>
+ </Modal>
+ </card>
+
+
+ </div>
+</template>
+
+<script>
+import JsonExcel from "vue-json-excel";
+import {getCustomerList,addCustomerTag,saveCustomerTagById,getTagList,getStoreSelectOptions} from "@/api/customer";
+
+export default {
+ name:"customer",
+ components:{
+ "download-excel": JsonExcel,
+ },
+ data(){
+ return{
+ loading: false, // 琛ㄥ崟鍔犺浇鐘舵��
+ //鏌ヨ瀹㈡埛鍒楄〃璇锋眰鍙傛暟
+ searchForm:{
+ storeId: '', //鍟嗗
+ username:'', //鐢ㄦ埛鍚�
+ nickName:'', // 鏄电О
+ pageNumber: 1, // 褰撳墠椤垫暟
+ pageSize: 10, // 椤甸潰澶у皬
+ },
+ //瀹㈡埛鍒楄〃琛ㄥご
+ columns: [
+ {
+ type: 'selection',
+ width: 60,
+ align: 'center'
+ },
+ {
+ title:'鐢ㄦ埛鍚�',
+ key: 'username',
+ minWidth: 60,
+ tooltip: true,
+ },
+ {
+ title:'鏄电О',
+ key: 'nickName',
+ minWidth: 60,
+ tooltip: true,
+ },
+ {
+ title:'鎬у埆',
+ key: 'sex',
+ tooltip: true,
+ render: (h, params) => {
+ const sexText = params.row.sex === 1 ? '鐢�' : '濂�';
+ return h('span', sexText);
+ }
+ },
+ {
+ title:'鍦板潃',
+ key: 'region',
+ minWidth: 60,
+ tooltip: true,
+ },
+ {
+ title:'鐘舵��',
+ key: 'disabled',
+ tooltip: true,
+ render: (h, params) => {
+ const sexText = params.row.disabled === true ? '绂佺敤' : '姝e父';
+ return h('span', sexText);
+ }
+ },
+ {
+ title:'瀹㈡埛鏍囩',
+ key: 'customerTagList',
+ minWidth: 60,
+ tooltip: true,
+ render: (h, params) => {
+ const tags = params.row.customerTagList || [];
+ return h('div', {
+ style: {
+ display: 'flex',
+ flexWrap: 'wrap', // 鍏佽鎹㈣
+ gap: '4px' // 鏍囩闂磋窛
+ }
+ }, tags.map(tag => {
+ return h('Tag', {
+ props: {
+ color: tag.color || 'default', // 鍋囪鏍囩鏈夐鑹插瓧娈�
+ size: 'small'
+ }
+ }, tag.name); // 鍋囪鏍囩瀵硅薄鏈塶ame瀛楁
+ }));
+ }
+ },
+ {
+ title: '鎿嶄綔',
+ key: 'action',
+ slot: 'action',
+ minWidth: 150,
+ align: 'center'
+ }
+
+ ],
+ //瀹㈡埛鍒楄〃鏁版嵁
+ customerList:[],
+ total:0,
+ selectCount: 0, // 宸查�夋暟閲�
+ selectList: [], // 宸查�夋暟鎹垪琛�
+
+ //瀹㈡埛鏍囩瀵硅瘽妗�---
+
+ showCustomerTag:false,
+ submitLoading:false,
+ selectLoading:false,
+ modelTitle:'',
+ tagList:[],
+ tagForm:{
+ id: '',
+ tagList: [],
+ createType: 'SYSTEM'
+ },
+ rules: {
+ tagList: [
+ {required: true, message: "鏍囩鍚嶇О涓嶈兘涓虹┖", trigger: "blur", type: 'array'}
+ ],
+ },
+ //鍟嗗涓嬫媺妗嗘暟鎹�
+ selectOptions:[],
+ storeSelectLoading: false
+
+ }
+ },
+ mounted(){
+ this.init();
+ },
+ methods:{
+ // 鑾峰緱鍟嗗涓嬫媺妗嗘暟鎹�
+ getStoreSelectOptions(){
+ this.storeSelectLoading = true;
+ getStoreSelectOptions().then(res =>{
+ this.storeSelectLoading = false;
+ if (res.code === 200){
+ this.selectOptions = res.data;
+ }
+ })
+ },
+ // 鑾峰緱瀹㈡埛琛ㄦ牸淇℃伅
+ getCustomerList(){
+ this.loading = true;
+ getCustomerList(this.searchForm).then(res =>{
+ this.loading = false;
+ if (res.code === 200) {
+ this.customerList = res.data;
+ this.total = res.total;
+ }
+ })
+ },
+ // 鑾峰緱瀹㈡埛鏍囩涓嬫媺妗嗘暟鎹�
+ getCustomerTagSelectOptions(){
+ this.selectLoading = true;
+ getTagList().then(res =>{
+ this.selectLoading = false;
+ if (res.code === 200){
+ this.tagList = res.data;
+ }
+ })
+ },
+ init(){
+ this.getCustomerList();
+ this.getCustomerTagSelectOptions();
+ this.getStoreSelectOptions();
+ },
+ changeSort(){
+
+ },
+ showSelect(){
+ this.selectList = e.map(d => d.id);
+ this.selectCount = e.length;
+ },
+ // 缂栬緫鏍囩
+ openEdit(row){
+ this.showCustomerTag = true
+ this.modelTitle = "缂栬緫鏍囩"
+ //鏀惧叆form
+ this.tagForm.id = row.id
+ this.tagForm.tagList = row.customerTagList
+
+
+ },
+ handleSearch(){
+ this.searchForm.pageNumber = 1;
+ this.searchForm.pageSize = 10;
+ this.getCustomerList();
+ },
+ // 鏂板鎴栦慨鏀�
+ // saveOrUpdate() {
+ // this.$refs.form.validate(valid => {
+ // if (valid) {
+ // this.submitLoading = true
+ // // 鏂板
+ // console.log(this.tagForm)
+ //
+ // }
+ // });
+ // },
+ handleSelectChange(newVal){
+ console.log(newVal)
+ this.getCustomerList()
+ },
+ handleRemoveTag(removedTag) {
+ console.log(removedTag)
+ this.getCustomerList()
+ },
+ // 鍏抽棴寮圭獥
+ modelClose() {
+ this.submitLoading = false
+ this.showCustomerTag = false
+ },
+
+ delById(){
+
+ },
+ // 椤电爜
+ changePage(v){
+ this.searchForm.pageNumber = v
+ this.getCustomerList()
+ },
+ // 淇敼size
+ changePageSize(v){
+ this.searchForm.pageNumber = 1;
+ this.searchForm.pageSize = v;
+ this.getCustomerList()
+ },
+ joinBlack(){
+
+ },
+
+
+ }
+}
+
+</script>
+<style lang="scss" scoped>
+.export {
+ margin: 10px 20px 10px 0;
+}
+.export-excel-wrapper {
+ display: inline;
+}
+.order-tab {
+ width: 950px;
+ height: 36px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ background-color: #f0f0f0;
+ padding: 0 10px;
+ margin-bottom: 10px;
+ div {
+ text-align: center;
+ padding: 4px 12px;
+ border-radius: 4px;
+ cursor: pointer;
+ }
+ .current {
+ background-color: #ffffff;
+ }
+}
+</style>
+
--
Gitblit v1.8.0