feat(credit): 添加赊账客户导入功能

- 新增 importCreditUsers API 接口用于导入赊账客户数据
- 在信用用户管理页面增加导入按钮和导入弹窗组件
- 实现拖拽上传和文件校验逻辑
- 添加导入模板下载链接
- 支持 Excel 文件格式(.xls/.xlsx)导入
- 实现批量导入数据处理和错误提示
- 更新搜索组件支持关键词搜索功能
- 优化表格数据加载逻辑,支持搜索参数传递
- 移除冗余的查询相关代码和状态变量
- 完善导入弹窗的 loading 状态管理和关闭逻辑
This commit is contained in:
2025-12-15 14:43:49 +08:00
parent 1856a611ce
commit 0e489ec35f
13 changed files with 1379 additions and 65 deletions

View File

@@ -0,0 +1,68 @@
<template>
<a-table :columns="columns" :data-source="data" :pagination="false">
<template #bodyCell="{ column, text }">
</template>
<template #footer>
<div class="text-red-500 gap-3">
<div>登录账号u_{{ loginUser.userId }}</div>
<div>初始密码123456</div>
</div>
</template>
</a-table>
</template>
<script lang="ts" setup>
import {computed, ref} from 'vue';
import {useUserStore} from "@/store/modules/user";
import {CmsWebsite} from "@/api/cms/cmsWebsite/model";
import {getSiteInfo} from "@/api/layout";
const userStore = useUserStore();// 当前用户信息
const loginUser = computed(() => userStore.info ?? {});
const website = ref<CmsWebsite>()
const columns = [
{
title: '仓库名称',
dataIndex: 'name',
key: 'name',
},
{
title: '仓库地址',
className: 'column-money',
dataIndex: 'url',
key: 'url',
},
{
title: '备注',
dataIndex: 'comments',
},
];
const data = [
{
key: '1',
name: '服务端',
url: 'https://git.websoft.top/gxwebsoft/mp-java.git',
comments: '基于 Spring Boot + MyBatis Plus 的企业级后端API服务',
},
{
key: '2',
name: '管理端',
url: 'https://code.websoft.top/gxwebsoft/mp-vue.git',
comments: '基于 Vue 3 + Ant Design Vue 的企业级后台管理系统',
},
{
key: '3',
name: '应用端',
url: 'https://git.websoft.top/gxwebsoft/template-10559.git',
comments: '基于 Taro + React + TypeScript 的跨平台小程序应用',
},
];
const reload = async () => {
website.value = await getSiteInfo();
};
reload()
</script>

View File

@@ -0,0 +1,68 @@
<template>
<a-table :columns="columns" :data-source="data" :pagination="false">
<template #bodyCell="{ column, text }">
</template>
<template #footer>
<div class="text-red-500 gap-3">
<div>登录账号u_{{ loginUser.userId }}</div>
<div>初始密码123456</div>
</div>
</template>
</a-table>
</template>
<script lang="ts" setup>
import {computed, ref} from 'vue';
import {useUserStore} from "@/store/modules/user";
import {CmsWebsite} from "@/api/cms/cmsWebsite/model";
import {getSiteInfo} from "@/api/layout";
const userStore = useUserStore();// 当前用户信息
const loginUser = computed(() => userStore.info ?? {});
const website = ref<CmsWebsite>()
const columns = [
{
title: '名称',
dataIndex: 'name',
key: 'name',
},
{
title: '内容',
className: 'column-money',
dataIndex: 'url',
key: 'url',
},
{
title: '备注',
dataIndex: 'comments',
},
];
const data = [
{
key: '1',
name: '服务端',
url: 'https://git.websoft.top/gxwebsoft/mp-java.git',
comments: '基于 Spring Boot + MyBatis Plus 的企业级后端API服务',
},
{
key: '2',
name: '管理端',
url: 'https://code.websoft.top/gxwebsoft/mp-vue.git',
comments: '基于 Vue 3 + Ant Design Vue 的企业级后台管理系统',
},
{
key: '3',
name: '应用端',
url: 'https://git.websoft.top/gxwebsoft/template-10559.git',
comments: '基于 Taro + React + TypeScript 的跨平台小程序应用',
},
];
const reload = async () => {
website.value = await getSiteInfo();
};
reload()
</script>

View File

@@ -0,0 +1,28 @@
<template>
<a-descriptions>
<a-descriptions-item label="公网IP">
<a-tag>1.14.159.185</a-tag>
</a-descriptions-item>
<a-descriptions label="服务器厂商">
<a-tag>阿里云</a-tag>
</a-descriptions>
<a-descriptions-item label="到期时间">
<a-tag>2025-09-01 00:00:00</a-tag>
</a-descriptions-item>
<a-descriptions-item label="面板">
<div class="flex flex-col gap-2">
<a-tag>https://1.14.159.185:9000/cproot/</a-tag>
<a-tag>vo0wowwj</a-tag>
<a-tag>LWM6B5NbAP</a-tag>
</div>
</a-descriptions-item>
</a-descriptions>
</template>
<script lang="ts" setup>
import {computed} from 'vue';
import {useUserStore} from "@/store/modules/user";
const userStore = useUserStore();// 当前用户信息
const loginUser = computed(() => userStore.info ?? {});
</script>

View File

@@ -0,0 +1,46 @@
<template>
<a-descriptions v-if="website">
<a-descriptions label="系统名称">
<a-tag>{{ website?.appName }}</a-tag>
</a-descriptions>
<a-descriptions-item label="后台管理">
<a-tag>https://mp.websoft.top</a-tag>
</a-descriptions-item>
<a-descriptions-item label="API">
<a-tag>https://cms-api.websoft.top/api</a-tag>
</a-descriptions-item>
<a-descriptions-item label="租户ID">
<a-tag>{{ website.appId }}</a-tag>
</a-descriptions-item>
<a-descriptions-item label="超管账号">
<a-tag>superAdmin</a-tag>
<a-tag>vo0wowwj</a-tag>
</a-descriptions-item>
<a-descriptions-item label="域名" v-if="website?.domain">
<a-tag>{{ website?.domain }}</a-tag>
</a-descriptions-item>
<a-descriptions-item label="到期时间">
<a-tag>{{ website?.expirationTime }}</a-tag>
</a-descriptions-item>
<!-- <a-descriptions-item label="开发">-->
<!-- {{ website }}-->
<!-- </a-descriptions-item>-->
</a-descriptions>
</template>
<script lang="ts" setup>
import {computed, ref} from 'vue';
import {useUserStore} from "@/store/modules/user";
import {getSiteInfo} from "@/api/layout";
import {CmsWebsite} from "@/api/cms/cmsWebsite/model";
const userStore = useUserStore();// 当前用户信息
const loginUser = computed(() => userStore.info ?? {});
const website = ref<CmsWebsite>()
const reload = async () => {
website.value = await getSiteInfo();
};
reload()
</script>

View File

@@ -0,0 +1,34 @@
<template>
<a-page-header :title="getPageTitle()" @back="() => $router.go(-1)">
<a-card title="租户信息" style="margin-bottom: 20px">
<template #extra>
<a-button>编辑</a-button>
</template>
<TenantInfo/>
</a-card>
<a-card title="服务器信息" style="margin-bottom: 20px">
<ServerInfo/>
</a-card>
<a-card title="源代码" style="margin-bottom: 20px">
<CodeInfo/>
</a-card>
<a-card title="其他信息" style="margin-bottom: 20px">
<ParamInfo />
</a-card>
</a-page-header>
</template>
<script lang="ts" setup>
import {getPageTitle, push} from "@/utils/common";
import TenantInfo from './components/TenantInfo.vue'
import ServerInfo from './components/ServerInfo.vue'
import CodeInfo from "./components/CodeInfo.vue";
import ParamInfo from "./components/ParamInfo.vue";
</script>
<script lang="ts">
export default {
name: 'SystemDeveloper'
};
</script>