zhengyiming
2025-10-28 48b04d85a2c548399bcb4ed72d8c00bd45f2e808
feat: init
2个文件已修改
8个文件已添加
372 ■■■■■ 已修改文件
.vscode/extensions.json 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.vscode/settings.json 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/hooks/useEvent.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.ts 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CustomerManage/AddOrEditCustomer.vue 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CustomerManage/CustomerDetail.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CustomerManage/CustomerManage.vue 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CustomerManage/components/AddOrEditCustomerView.vue 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CustomerManage/constants/customerManage.ts 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CustomerManage/constants/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.vscode/extensions.json
New file
@@ -0,0 +1,3 @@
{
  "recommendations": ["Vue.volar"]
}
.vscode/settings.json
New file
@@ -0,0 +1,39 @@
{
  "[json]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[jsonc]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[vue]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[scss]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[html]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "editor.codeActionsOnSave": {
    "source.fixAll": "explicit",
    "source.fixAll.eslint": "explicit",
    "source.fixAll.stylelint": "explicit"
  },
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "eslint.enable": true,
  "eslint.validate": ["vue", "ts", "tsx"],
  "stylelint.enable": true,
  "stylelint.validate": ["css", "less", "postcss", "scss", "vue", "sass"]
}
src/hooks/useEvent.ts
@@ -7,6 +7,8 @@
  'taskManage:edit': any;
  sureTaskSettlementOrder: any;
  checkReceiveTask: any;
  'customerManage:add': any;
  'customerManage:edit': any;
};
export type GlobalEventListener<T extends keyof GlobalEvent> = (payload: GlobalEvent[T]) => any;
src/router/index.ts
@@ -96,6 +96,56 @@
    },
  },
  {
    path: '/CustomerManage',
    redirect: 'noRedirect',
    component: Layout,
    hidden: false,
    alwaysShow: true,
    meta: {
      rank: 10010,
      title: '客户管理',
      rootMenu: true,
      icon: 'home',
    },
    children: [
      {
        path: '/CustomerManage',
        name: 'CustomerManage',
        hidden: false,
        alwaysShow: true,
        component: () => import('@/views/CustomerManage/CustomerManage.vue'),
        meta: {
          rank: 10011,
          title: '客户管理',
          // rootMenu: true,
          icon: 'home',
        },
      },
      {
        path: '/AddOrEditCustomer/:id?',
        name: 'AddOrEditCustomer',
        hidden: false,
        alwaysShow: true,
        component: () => import('@/views/CustomerManage/AddOrEditCustomer.vue'),
        meta: {
          rank: 10011,
          title: '新增客户',
        },
      },
      {
        path: '/CustomerDetail/:id',
        name: 'CustomerDetail',
        hidden: false,
        alwaysShow: true,
        component: () => import('@/views/CustomerManage/CustomerDetail.vue'),
        meta: {
          rank: 10011,
          title: '客户详情',
        },
      },
    ],
  },
  {
    path: '/FlexJobManage',
    redirect: 'noRedirect',
    component: Layout,
@@ -361,7 +411,7 @@
        component: () => import('@/views/FinanceManage/FinanceManage.vue'),
        meta: {
          rank: 10071,
          title: '财务管理',
          title: '发放明细',
          // rootMenu: true,
          icon: 'home',
        },
src/views/CustomerManage/AddOrEditCustomer.vue
New file
@@ -0,0 +1,19 @@
<template>
  <AddOrEditCustomerView :isDetail="false"/>
</template>
<script lang="ts">
import { setPageTitle } from '@/utils';
export default defineComponent({
  name: 'AddOrEditCustomer',
  beforeRouteEnter(to) {
    to.meta.title = to.params.id ? '编辑客户' : '新增客户';
    setPageTitle(to.meta.title as string);
  },
});
</script>
<script setup lang="ts">
import AddOrEditCustomerView from './components/AddOrEditCustomerView.vue';
</script>
src/views/CustomerManage/CustomerDetail.vue
New file
@@ -0,0 +1,11 @@
<template>
  <AddOrEditCustomerView isDetail />
</template>
<script setup lang="ts">
import AddOrEditCustomerView from './components/AddOrEditCustomerView.vue';
defineOptions({
  name: 'CustomerDetail',
});
</script>
src/views/CustomerManage/CustomerManage.vue
New file
@@ -0,0 +1,144 @@
<template>
  <LoadingLayout :loading="state.loading">
    <AppContainer>
      <ProTableQueryFilterBar @on-reset="reset">
        <template #query>
          <QueryFilterItem>
            <SearchInput
              v-model="extraParamState.keywords"
              style="width: 300px"
              placeholder="企业名称/信用代码/姓名/电话"
              @on-click-search="getList"
            >
            </SearchInput>
          </QueryFilterItem>
        </template>
        <template #btn>
          <el-button
            @click="goAddOrEdit()"
            icon="Plus"
            type="primary"
            >新增客户</el-button
          >
        </template>
      </ProTableQueryFilterBar>
      <ProTableV2 v-bind="proTableProps" :columns="CustomerManageColumns" :operationBtns="operationBtns">
      </ProTableV2>
    </AppContainer>
  </LoadingLayout>
</template>
<script setup lang="ts">
import {
  ProTableQueryFilterBar,
  OperationBtnType,
  ProTableV2,
  SearchInput,
  LoadingLayout,
  AppContainer,
  QueryFilterItem,
  useTable,
  useFormDialog,
  defineOperationBtns
} from '@bole-core/components';
import * as taskServices from '@/services/api/task';
import {CustomerManageColumns} from './constants';
defineOptions({
  name: 'CustomerManage',
});
const operationBtns=defineOperationBtns([
  {
    data: {
      enCode: 'detailBtn',
      name: '查看',
    },
    emits: {
      onClick: (role) => goDetail(role),
    },
  },
  {
    data: {
      enCode: 'editBtn',
      name: '编辑',
    },
    emits: {
      onClick: (role) => goAddOrEdit(role),
    },
  },
])
const BaseState = {
  loading: true,
};
const state = reactive({ ...BaseState });
const eventContext = useGlobalEventContext();
eventContext.addEvent('customerManage:add', () => {
  getList();
});
eventContext.addEvent('customerManage:edit', () => {
  getList(paginationState.pageIndex);
});
onMounted(async () => {
  await getList();
  state.loading = false;
});
const {
  getDataSource: getList,
  proTableProps,
  paginationState,
  extraParamState,
  reset,
} = useTable(
  async ({ pageIndex, pageSize }, extraParamState) => {
    try {
      let params: API.GetTaskInfosQuery = {
        pageModel: {
          rows: pageSize,
          page: pageIndex,
          orderInput: extraParamState.orderInput,
        },
        keywords: extraParamState.keywords,
      };
      let res = await taskServices.getTaskInfos(params, {
        showLoading: !state.loading,
      });
      return res;
    } catch (error) {}
  },
  {
    defaultExtraParams: {
      keywords: '',
        orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }],
    },
  }
);
const router=useRouter();
function goAddOrEdit(row?: API.GetTaskInfosQueryResultItem) {
  router.push({
    name: 'AddOrEditCustomer',
    params: {
      id: row?.id ?? '',
    },
  });
}
function goDetail(row: API.GetTaskInfosQueryResultItem) {
  router.push({
    name: 'CustomerDetail',
    params: {
      id: row?.id ?? '',
    },
  });
}
</script>
src/views/CustomerManage/components/AddOrEditCustomerView.vue
New file
@@ -0,0 +1,47 @@
<template>
  <div></div>
</template>
<script setup lang="ts">
import { Message, BoleRegExp } from '@bole-core/core';
import { useQuery } from '@tanstack/vue-query';
import {
  LoadingLayout,
  AppScrollContainer,
  ProForm,
  ProFormItemV2,
  ChunkCell,
  ProFormText,
  ProFormSelect,
  ProFormTextArea,
  ProFormCol,
  ProFormColItem,
} from '@bole-core/components';
import { FormRules, FormInstance } from 'element-plus';
defineOptions({
  name: 'AddOrEditCustomerView',
})
type Props = {
  isDetail: boolean;
}
const props = withDefaults(defineProps<Props>(), {
})
const route = useRoute();
const id = route.params.id as string;
const isEdit =  !!id;
const { closeViewPush } = useRouteView();
const eventContext = useGlobalEventContext();
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
</style>
src/views/CustomerManage/constants/customerManage.ts
New file
@@ -0,0 +1,54 @@
  import {defineColumns} from '@bole-core/components'
  export const CustomerManageColumns = defineColumns([
    {
      id: '1',
      enCode: 'name',
      name: '企业名称',
    },
    {
      id: '2',
      enCode: 'phoneNumber',
      name: '统一信用代码',
    },
    {
      id: '3',
      enCode: 'status',
      name: '客户ID',
    },
    {
      id: '4',
      enCode: 'createdTime',
      name: '法人姓名',
    },
    {
      id: '5',
      enCode: 'createdTime',
      name: '联系人名称',
    },
    {
      id: '6',
      enCode: 'createdTime',
      name: '联系电话',
    },
    {
      id: '7',
      enCode: 'createdTime',
      name: '省份',
    },
    {
      id: '8',
      enCode: 'createdTime',
      name: '城市',
    },
    {
      id: '9',
      enCode: 'createdTime',
      name: '合作状态',
    },
    {
      id: '10',
      enCode: 'createdTime',
      name: '签约状态',
    },
  ])
src/views/CustomerManage/constants/index.ts
New file
@@ -0,0 +1 @@
export * from './customerManage'