From 944a8f37fbc9dde014e6b02b7ec68d020bb721ad Mon Sep 17 00:00:00 2001
From: zmj <1493694146@qq.com>
Date: Sat, 23 Mar 2024 10:48:54 +0800
Subject: [PATCH] add

---
 src/App.vue                        |  11 ++-
 src/hooks/usePaging.ts             | 142 ++++++++++++++++-------------
 src/views/account/login.vue        |  19 +---
 src/views/custom/index.vue         |  13 +--
 src/views/custom_service/index.vue |  35 ++++---
 src/views/project/index.vue        |  19 ++--
 6 files changed, 124 insertions(+), 115 deletions(-)

diff --git a/src/App.vue b/src/App.vue
index 28c9f49..ba1d04c 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -58,4 +58,13 @@ watch(
     </el-config-provider>
 </template>
 
-<style></style>
+<style>
+.el-table th.el-table__cell>.cell {
+    text-align: center;
+
+}
+
+.el-table td.el-table__cell div {
+    text-align: center;
+}
+</style>
diff --git a/src/hooks/usePaging.ts b/src/hooks/usePaging.ts
index 421f40c..faea5b3 100644
--- a/src/hooks/usePaging.ts
+++ b/src/hooks/usePaging.ts
@@ -1,72 +1,86 @@
-import { reactive, toRaw } from 'vue'
+import { reactive, toRaw } from "vue";
 
 // 分页钩子函数
 interface Options {
-    page?: number
-    size?: number
-    fetchFun: (_arg: any) => Promise<any>
-    params?: Record<any, any>
-    firstLoading?: boolean
+  page?: number;
+  size?: number;
+  fetchFun: (_arg: any) => Promise<any>;
+  params?: Record<any, any>;
+  firstLoading?: boolean;
+}
+
+interface Icolumn {
+  column: { label: String; width: Number; property: string };
 }
 
 export function usePaging(options: Options) {
-    const { page = 1, size = 15, fetchFun, params = {}, firstLoading = false } = options
-    // 记录分页初始参数
-    const paramsInit: Record<any, any> = Object.assign({}, toRaw(params))
-    // 分页数据
-    const pager = reactive({
-        page,
-        size,
-        loading: firstLoading,
-        count: 0,
-        lists: [] as any[],
-        extend: {} as Record<string, any>,
-        calcWidth:(value:string)=>{
-            let list = pager.lists.map(item => item[value])
-            const maxLength = list.reduce((max, str) => {
-            return Math.max(max, str.length);
-            }, 0);
-
-            return (maxLength*14+24)
-        }
+  const {
+    page = 1,
+    size = 15,
+    fetchFun,
+    params = {},
+    firstLoading = false,
+  } = options;
+  // 记录分页初始参数
+  const paramsInit: Record<any, any> = Object.assign({}, toRaw(params));
+  // 分页数据
+  const pager = reactive({
+    page,
+    size,
+    loading: firstLoading,
+    count: 0,
+    lists: [] as any[],
+    extend: {} as Record<string, any>,
+    calcWidth: ({ column }: Icolumn) => {
+      let propWidth = column.label.length * 14 + 24;
+      let list = pager.lists.map(
+        (item: Object) => (item as any)[column.property]
+      );
+      const maxLength = list.reduce((max, str) => {
+        return Math.max(max, str.length);
+      }, 0);
+      const columnWidth = maxLength * 14 + 24;
+      column.width = Math.max(columnWidth, propWidth);
+      return column.label;
+    },
+  });
+  // 请求分页接口
+  const getLists = () => {
+    pager.loading = true;
+    return fetchFun({
+      page_no: pager.page,
+      page_size: pager.size,
+      ...params,
     })
-    // 请求分页接口
-    const getLists = () => {
-        pager.loading = true
-        return fetchFun({
-            page_no: pager.page,
-            page_size: pager.size,
-            ...params
-        })
-            .then((res: any) => {
-                pager.count = res?.count
-                pager.lists = res?.lists
-                pager.extend = res?.extend
-                return Promise.resolve(res)
-            })
-            .catch((err: any) => {
-                return Promise.reject(err)
-            })
-            .finally(() => {
-                pager.loading = false
-            })
-    }
-    // 重置为第一页
-    const resetPage = () => {
-        pager.page = 1
-        getLists()
-    }
-    // 重置参数
-    const resetParams = () => {
-        Object.keys(paramsInit).forEach((item) => {
-            params[item] = paramsInit[item]
-        })
-        getLists()
-    }
-    return {
-        pager,
-        getLists,
-        resetParams,
-        resetPage
-    }
+      .then((res: any) => {
+        pager.count = res?.count;
+        pager.lists = res?.lists;
+        pager.extend = res?.extend;
+        return Promise.resolve(res);
+      })
+      .catch((err: any) => {
+        return Promise.reject(err);
+      })
+      .finally(() => {
+        pager.loading = false;
+      });
+  };
+  // 重置为第一页
+  const resetPage = () => {
+    pager.page = 1;
+    getLists();
+  };
+  // 重置参数
+  const resetParams = () => {
+    Object.keys(paramsInit).forEach((item) => {
+      params[item] = paramsInit[item];
+    });
+    getLists();
+  };
+  return {
+    pager,
+    getLists,
+    resetParams,
+    resetPage,
+  };
 }
diff --git a/src/views/account/login.vue b/src/views/account/login.vue
index 74b1aeb..f665ef7 100644
--- a/src/views/account/login.vue
+++ b/src/views/account/login.vue
@@ -6,29 +6,19 @@
                     <image-contain :src="config.login_image" :width="400" height="100%" />
                 </div>
                 <div
-                    class="login-form bg-body flex flex-col justify-center px-10 py-10 md:w-[400px] w-[375px] flex-none mx-auto"
-                >
+                    class="login-form bg-body flex flex-col justify-center px-10 py-10 md:w-[400px] w-[375px] flex-none mx-auto">
                     <div class="text-center text-3xl font-medium mb-8">{{ config.web_name }}</div>
                     <el-form ref="formRef" :model="formData" size="large" :rules="rules">
                         <el-form-item prop="account">
-                            <el-input
-                                v-model="formData.account"
-                                placeholder="请输入账号"
-                                @keyup.enter="handleEnter"
-                            >
+                            <el-input v-model="formData.account" placeholder="请输入账号" @keyup.enter="handleEnter">
                                 <template #prepend>
                                     <icon name="el-icon-User" />
                                 </template>
                             </el-input>
                         </el-form-item>
                         <el-form-item prop="password">
-                            <el-input
-                                ref="passwordRef"
-                                v-model="formData.password"
-                                show-password
-                                placeholder="请输入密码"
-                                @keyup.enter="handleLogin"
-                            >
+                            <el-input ref="passwordRef" v-model="formData.password" show-password placeholder="请输入密码"
+                                @keyup.enter="handleLogin">
                                 <template #prepend>
                                     <icon name="el-icon-Lock" />
                                 </template>
@@ -123,6 +113,7 @@ onMounted(() => {
 .login {
     background-image: url('./images/login_bg.png');
     @apply min-h-screen bg-no-repeat bg-center bg-cover;
+
     .login-card {
         height: 400px;
     }
diff --git a/src/views/custom/index.vue b/src/views/custom/index.vue
index 06c10cb..41afe9b 100644
--- a/src/views/custom/index.vue
+++ b/src/views/custom/index.vue
@@ -39,46 +39,39 @@
                 </template>
                 新增
             </el-button>
-            <el-button v-perms="['custom.custom/delete']" :disabled="!selectData.length"
-                @click="handleDelete(selectData)">
+            <el-button v-perms="['custom.custom/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
                 删除
             </el-button>
             <div class="mt-4">
                 <el-table :data="pager.lists" @selection-change="handleSelectionChange">
                     <el-table-column type="selection" width="55" />
                     <el-table-column label="序号" type="index" width="55" />
-                    <el-table-column label="客户名称" prop="name" show-overflow-tooltip />
+                    <el-table-column label="客户名称" prop="name" />
                     <el-table-column label="客户属性" prop="custom_type">
-
                         <template #default="{ row }">
                             <dict-value :options="dictData.custom_type" :value="row.custom_type" />
                         </template>
                     </el-table-column>
-
                     <el-table-column label="所在省" prop="province_name" show-overflow-tooltip />
                     <el-table-column label="负责人姓名" prop="master_name" show-overflow-tooltip />
                     <el-table-column label="负责人职务" prop="master_position" show-overflow-tooltip />
                     <el-table-column label="负责人手机" prop="master_phone" show-overflow-tooltip />
                     <el-table-column label="负责人电话" prop="master_telephone" show-overflow-tooltip />
-
                     <el-table-column label="跟进记录" prop="follow_total" show-overflow-tooltip />
                     <el-table-column label="最后跟进" prop="last_follow_date" show-overflow-tooltip />
                     <el-table-column label="下次回访日期" prop="next_follow_date" show-overflow-tooltip />
                     <el-table-column label="创建时间" prop="create_time" show-overflow-tooltip />
                     <el-table-column label="操作" width="160" fixed="right">
-
                         <template #default="{ row }">
                             <el-button v-perms="['custom.custom/edit']" type="primary" link @click="handleEdit(row)">
                                 编辑
                             </el-button>
-                            <el-button v-perms="['custom.custom/delete']" type="danger" link
-                                @click="handleDelete(row.id)">
+                            <el-button v-perms="['custom.custom/delete']" type="danger" link @click="handleDelete(row.id)">
                                 删除
                             </el-button>
                             <el-button v-perms="['custom.custom/detail']" link @click="handleDetail(row)">
                                 详情
                             </el-button>
-
                         </template>
                     </el-table-column>
                 </el-table>
diff --git a/src/views/custom_service/index.vue b/src/views/custom_service/index.vue
index c6c7b4e..54f3454 100644
--- a/src/views/custom_service/index.vue
+++ b/src/views/custom_service/index.vue
@@ -58,22 +58,22 @@
                 <el-table :data="pager.lists" @selection-change="handleSelectionChange">
                     <el-table-column type="selection" width="55" />
                     <el-table-column label="序号" type="index" width="55" />
-                    <el-table-column label="客户名称" prop="custom_name" :width="pager.calcWidth('custom_name')" />
-                    <el-table-column label="项目名称" prop="project_name" :width="pager.calcWidth('project_name')" />
-                    <el-table-column label="项目编码" prop="project_code" :width="pager.calcWidth('project_code')" />
-                    <el-table-column label="合同编号" prop="contract_code" :width="pager.calcWidth('contract_code')" />
-                    <el-table-column label="投诉主题" prop="name" :width="pager.calcWidth('name')" />
-                    <el-table-column label="日期" prop="date" />
-                    <el-table-column label="接待人" prop="receiver" />
-                    <el-table-column label="分类" prop="classification" />
-                    <el-table-column label="投诉人" prop="custom_master_name" />
-                    <el-table-column label="联系电话" prop="custom_master_phone" />
-                    <el-table-column label="处理结果" prop="processing_result" />
-                    <el-table-column label="紧急程度" prop="urgency" />
-                    <el-table-column label="指定处理人" prop="processed_user" width="105" />
-                    <el-table-column label="问题是否解决" prop="is_solve_text" width="110" />
-                    <el-table-column label="完成日期" prop="done_date" />
-                    <el-table-column label="评分" prop="score" />
+                    <el-table-column label="客户名称" prop="custom_name" />
+                    <el-table-column label="项目名称" prop="project_name":render-header="pager.calcWidth" />
+                    <el-table-column label="项目编码" prop="project_code" :render-header="pager.calcWidth" />
+                    <el-table-column label="合同编号" prop="contract_code" :render-header="pager.calcWidth" />
+                    <el-table-column label="投诉主题" prop="name" show-overflow-tooltip />
+                    <el-table-column label="日期" prop="date" show-overflow-tooltip />
+                    <el-table-column label="接待人" prop="receiver" show-overflow-tooltip />
+                    <el-table-column label="分类" prop="classification" show-overflow-tooltip />
+                    <el-table-column label="投诉人" prop="custom_master_name" show-overflow-tooltip />
+                    <el-table-column label="联系电话" prop="custom_master_phone" show-overflow-tooltip />
+                    <el-table-column label="处理结果" prop="processing_result" show-overflow-tooltip />
+                    <el-table-column label="紧急程度" prop="urgency" show-overflow-tooltip />
+                    <el-table-column label="指定处理人" prop="processed_user" width="105" show-overflow-tooltip />
+                    <el-table-column label="问题是否解决" prop="is_solve_text" width="110" show-overflow-tooltip />
+                    <el-table-column label="完成日期" prop="done_date" show-overflow-tooltip />
+                    <el-table-column label="评分" prop="score" show-overflow-tooltip />
                     <el-table-column label="操作" width="110" fixed="right">
                         <template #default="{ row }">
                             <el-button v-perms="['custom_service.custom_service/solve']" type="primary" link
@@ -88,8 +88,7 @@
                                 @click="handleDelete(row.id)">
                                 删除
                             </el-button>
-                            <el-button v-perms="['custom_service.custom_service/detail']" link
-                                @click="handledetail(row)">
+                            <el-button v-perms="['custom_service.custom_service/detail']" link @click="handledetail(row)">
                                 详情
                             </el-button>
                         </template>
diff --git a/src/views/project/index.vue b/src/views/project/index.vue
index 4416b3a..48a83e2 100644
--- a/src/views/project/index.vue
+++ b/src/views/project/index.vue
@@ -19,8 +19,8 @@
                     <el-select class="w-[280px]" v-model="queryParams.strategic_significance" clearable
                         placeholder="请选择战略意义">
                         <el-option label="全部" value=""></el-option>
-                        <el-option v-for="(item, index) in dictData.strategic_significance" :key="index"
-                            :label="item.name" :value="item.value" />
+                        <el-option v-for="(item, index) in dictData.strategic_significance" :key="index" :label="item.name"
+                            :value="item.value" />
                     </el-select>
                 </el-form-item>
                 <el-form-item label="所属行业" prop="industry">
@@ -45,8 +45,7 @@
                     </el-select>
                 </el-form-item>
                 <el-form-item label="信息来源" prop="information_sources">
-                    <el-select class="w-[280px]" v-model="queryParams.information_sources" clearable
-                        placeholder="请选择信息来源">
+                    <el-select class="w-[280px]" v-model="queryParams.information_sources" clearable placeholder="请选择信息来源">
                         <el-option label="全部" value=""></el-option>
                         <el-option v-for="(item, index) in dictData.information_sources" :key="index" :label="item.name"
                             :value="item.value" />
@@ -81,11 +80,11 @@
                 <el-table :data="pager.lists" @selection-change="handleSelectionChange">
                     <el-table-column type="selection" width="55" />
                     <el-table-column label="序号" type="index" width="55" />
-                    <el-table-column label="客户" prop="custom_name" show-overflow-tooltip />
-                    <el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
-                    <el-table-column label="项目名称" prop="name" show-overflow-tooltip />
+                    <el-table-column label="客户" prop="custom_name" />
+                    <el-table-column label="项目编码" prop="project_code" :render-header="pager.calcWidth" />
+                    <el-table-column label="项目名称" prop="name" />
                     <el-table-column label="项目状态" prop="status" show-overflow-tooltip />
-                    <el-table-column label="项目所在地" prop="project_address" show-overflow-tooltip />
+                    <el-table-column label="项目所在地" prop="project_address" width="94" show-overflow-tooltip />
                     <el-table-column label="项目类型" prop="project_type" show-overflow-tooltip />
                     <el-table-column label="战略意义" prop="strategic_significance" show-overflow-tooltip />
                     <el-table-column label="所属行业" prop="industry" show-overflow-tooltip />
@@ -136,6 +135,10 @@ const showEdit = ref(false)
 
 const showDtail = ref(false)
 
+const test = (column) => {
+    console.log(column, 'column')
+    return column.column.label
+}