This commit is contained in:
2025-11-29 23:40:29 +08:00
parent bfa83f42a8
commit 51ffefbe2f
95 changed files with 9692 additions and 1322 deletions

View File

@@ -0,0 +1,123 @@
import { useI18n } from '@jeesite/core/hooks/web/useI18n';
import { BasicColumn, BasicTableProps, FormProps } from '@jeesite/core/components/Table';
import { ErpAccount, erpAccountListData } from '@jeesite/erp/api/erp/account';
const { t } = useI18n('erp.account');
const modalProps = {
title: t('账户信息选择'),
};
const searchForm: FormProps<ErpAccount> = {
baseColProps: { md: 8, lg: 6 },
labelWidth: 90,
schemas: [
{
label: t('账户名称'),
field: 'accountName',
component: 'Input',
},
{
label: t('账户类型'),
field: 'accountType',
component: 'Input',
},
{
label: t('是否激活'),
field: 'isActive',
component: 'Select',
componentProps: {
dictType: 'is_active',
allowClear: true,
},
},
],
};
const tableColumns: BasicColumn<ErpAccount>[] = [
{
title: t('记录时间'),
dataIndex: 'createTime',
key: 'a.create_time',
sorter: true,
width: 180,
align: 'left',
},
{
title: t('账户名称'),
dataIndex: 'accountName',
key: 'a.account_name',
sorter: true,
width: 130,
align: 'left',
},
{
title: t('账户类型'),
dataIndex: 'accountType',
key: 'a.account_type',
sorter: true,
width: 130,
align: 'left',
dictType: 'account_type'
},
{
title: t('账户卡号'),
dataIndex: 'accountCode',
key: 'a.account_code',
sorter: true,
width: 130,
align: 'left',
},
{
title: t('初始余额'),
dataIndex: 'initialBalance',
key: 'a.initial_balance',
sorter: true,
width: 130,
align: 'right',
},
{
title: t('当前余额'),
dataIndex: 'currentBalance',
key: 'a.current_balance',
sorter: true,
width: 130,
align: 'right',
},
{
title: t('是否激活'),
dataIndex: 'isActive',
key: 'a.is_active',
sorter: true,
width: 130,
align: 'left',
dictType: 'is_active',
},
{
title: t('更新时间'),
dataIndex: 'updateTime',
key: 'a.update_time',
sorter: true,
width: 180,
align: 'center',
},
];
const tableProps: BasicTableProps = {
api: erpAccountListData,
beforeFetch: (params) => {
params['isAll'] = true;
return params;
},
columns: tableColumns,
formConfig: searchForm,
rowKey: 'accountId',
};
export default {
modalProps,
tableProps,
itemCode: 'accountId',
itemName: 'accountName',
isShowCode: true,
};

View File

@@ -0,0 +1,120 @@
import { useI18n } from '@jeesite/core/hooks/web/useI18n';
import { BasicColumn, BasicTableProps, FormProps } from '@jeesite/core/components/Table';
import { ErpCategory, erpCategoryListData } from '@jeesite/erp/api/erp/category';
const { t } = useI18n('erp.category');
const modalProps = {
title: t('分类信息选择'),
};
const searchForm: FormProps<ErpCategory> = {
baseColProps: { md: 8, lg: 6 },
labelWidth: 90,
schemas: [
{
label: t('分类名称'),
field: 'categoryName',
component: 'Input',
},
{
label: t('分类类型'),
field: 'categoryType',
component: 'Select',
componentProps: {
dictType: 'category_type',
allowClear: true,
},
},
{
label: t('是否启用'),
field: 'isActive',
component: 'Select',
componentProps: {
dictType: 'is_active',
allowClear: true,
},
},
],
};
const tableColumns: BasicColumn<ErpCategory>[] = [
{
title: t('记录时间'),
dataIndex: 'createTime',
key: 'a.create_time',
sorter: true,
width: 180,
align: 'left',
},
{
title: t('分类名称'),
dataIndex: 'categoryName',
key: 'a.category_name',
sorter: true,
width: 230,
align: 'left',
},
{
title: t('分类类型'),
dataIndex: 'categoryType',
key: 'a.category_type',
sorter: true,
width: 130,
align: 'left',
dictType: 'category_type',
},
{
title: t('父级分类'),
dataIndex: 'parentId',
key: 'a.parent_id',
sorter: true,
width: 130,
align: 'left',
dictType: 'parent_type',
},
{
title: t('排序序号'),
dataIndex: 'sortOrder',
key: 'a.sort_order',
sorter: true,
width: 130,
align: 'left',
},
{
title: t('是否启用'),
dataIndex: 'isActive',
key: 'a.is_active',
sorter: true,
width: 130,
align: 'left',
dictType: 'is_active',
},
{
title: t('更新时间'),
dataIndex: 'updateTime',
key: 'a.update_time',
sorter: true,
width: 180,
align: 'center',
},
];
const tableProps: BasicTableProps = {
api: erpCategoryListData,
beforeFetch: (params) => {
params['isAll'] = true;
return params;
},
columns: tableColumns,
formConfig: searchForm,
rowKey: 'categoryId',
};
export default {
modalProps,
tableProps,
itemCode: 'categoryId',
itemName: 'categoryName',
isShowCode: false,
};

View File

@@ -0,0 +1,128 @@
import { useI18n } from '@jeesite/core/hooks/web/useI18n';
import { BasicColumn, BasicTableProps, FormProps } from '@jeesite/core/components/Table';
import { ErpTransactionFlow, erpTransactionFlowListData } from '@jeesite/erp/api/erp/transactionFlow';
const { t } = useI18n('erp.transactionFlow');
const modalProps = {
title: t('明细信息选择'),
};
const searchForm: FormProps<ErpTransactionFlow> = {
baseColProps: { md: 8, lg: 6 },
labelWidth: 90,
schemas: [
{
label: t('交易名称'),
field: 'flowName',
component: 'Input',
},
{
label: t('交易类型'),
field: 'transactionType',
component: 'Select',
componentProps: {
dictType: 'transaction_type',
allowClear: true,
},
},
{
label: t('是否记账'),
field: 'isFinish',
component: 'Select',
componentProps: {
dictType: 'is_finish',
allowClear: true,
},
},
],
};
const tableColumns: BasicColumn<ErpTransactionFlow>[] = [
{
title: t('记录时间'),
dataIndex: 'createTime',
key: 'a.create_time',
sorter: true,
width: 180,
align: 'left',
slot: 'firstColumn',
},
{
title: t('交易名称'),
dataIndex: 'flowName',
key: 'a.flow_name',
sorter: true,
width: 130,
align: 'left',
},
{
title: t('交易类型'),
dataIndex: 'transactionType',
key: 'a.transaction_type',
sorter: true,
width: 130,
align: 'left',
dictType: 'transaction_type',
},
{
title: t('交易金额'),
dataIndex: 'amount',
key: 'a.amount',
sorter: true,
width: 130,
align: 'right',
},
{
title: t('交易时间'),
dataIndex: 'transactionTime',
key: 'a.transaction_time',
sorter: true,
width: 180,
align: 'center',
},
{
title: t('交易备注'),
dataIndex: 'remark',
key: 'a.remark',
sorter: true,
width: 130,
align: 'left',
},
{
title: t('是否记账'),
dataIndex: 'isFinish',
key: 'a.is_finish',
sorter: true,
width: 130,
align: 'left',
dictType: 'is_finish',
},
{
title: t('更新时间'),
dataIndex: 'updateTime',
key: 'a.update_time',
sorter: true,
width: 180,
align: 'center',
},
];
const tableProps: BasicTableProps = {
api: erpTransactionFlowListData,
beforeFetch: (params) => {
params['isAll'] = true;
return params;
},
columns: tableColumns,
formConfig: searchForm,
rowKey: 'flowId',
};
export default {
modalProps,
tableProps,
itemCode: 'flowId',
itemName: 'flowName',
isShowCode: true,
};

View File

@@ -1,196 +0,0 @@
export interface ListItem {
id: string;
avatar: string;
// 通知的标题内容
title: string;
// 是否在标题上显示删除线
titleDelete?: boolean;
datetime?: string;
type: string;
read?: boolean;
description: string;
clickClose?: boolean;
extra?: string;
color?: string;
}
export interface TabItem {
key: string;
name: string;
count?: number;
btnHref?: string;
btnText?: string;
list: ListItem[];
unreadlist?: ListItem[];
}
export const tabListData: TabItem[] = [
{
key: '1',
name: '通知',
list: [
{
id: '000000001',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',
title: '你收到了 10 份新周报',
description: '',
datetime: '2022-08-09',
type: '1',
},
{
id: '000000002',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png',
title: '你推荐的果汁已通过第三轮面试',
description: '',
datetime: '2022-08-08',
type: '1',
},
{
id: '000000003',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png',
title: '这种模板可以区分多种通知类型',
description: '',
datetime: '2022-08-07',
// read: true,
type: '1',
},
{
id: '000000004',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
title: '左侧图标用于区分不同的类型',
description: '',
datetime: '2022-08-07',
type: '1',
},
{
id: '000000005',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
title:
'标题可以设置自动显示省略号本例中标题行数已设为1行如果内容超过1行将自动截断并支持tooltip显示完整标题。',
description: '',
datetime: '2022-08-07',
type: '1',
},
{
id: '000000006',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
title: '左侧图标用于区分不同的类型',
description: '',
datetime: '2022-08-07',
type: '1',
},
{
id: '000000007',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
title: '左侧图标用于区分不同的类型',
description: '',
datetime: '2022-08-07',
type: '1',
},
{
id: '000000008',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
title: '左侧图标用于区分不同的类型',
description: '',
datetime: '2022-08-07',
type: '1',
},
{
id: '000000009',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
title: '左侧图标用于区分不同的类型',
description: '',
datetime: '2022-08-07',
type: '1',
},
{
id: '000000010',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
title: '左侧图标用于区分不同的类型',
description: '',
datetime: '2022-08-07',
type: '1',
},
],
},
{
key: '2',
name: '消息',
list: [
{
id: '000000006',
avatar: 'ant-design:message-outlined',
title: '彩虹 评论了你',
description: '描述信息描述信息描述信息',
datetime: '2022-08-07',
type: '2',
clickClose: true,
},
{
id: '000000007',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
title: '果汁 回复了你',
description: '这种模板用于提醒谁与你发生了互动',
datetime: '2022-08-07',
type: '2',
clickClose: true,
},
{
id: '000000008',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
title: '标题',
description:
'请将鼠标移动到此处以便测试超长的消息在此处将如何处理。本例中设置的描述最大行数为2超过2行的描述内容将被省略并且可以通过tooltip查看完整内容',
datetime: '2022-08-07',
type: '2',
clickClose: true,
},
],
},
{
key: '3',
name: '待办',
list: [
{
id: '000000009',
avatar: '',
title: '任务名称',
description: '任务需要在 2022-01-12 20:00 前启动',
datetime: '',
extra: '未开始',
color: '',
type: '3',
},
{
id: '000000010',
avatar: '',
title: '第三方紧急代码变更',
description: '彩虹 需在 2022-01-07 前完成代码变更任务',
datetime: '',
extra: '马上到期',
color: 'red',
type: '3',
},
{
id: '000000011',
avatar: '',
title: '信息安全考试',
description: '指派竹尔于 2022-01-09 前完成更新并发布',
datetime: '',
extra: '已耗时 8 天',
color: 'gold',
type: '3',
},
{
id: '000000012',
avatar: '',
title: 'ABCD 版本发布',
description: '指派竹尔于 2022-01-09 前完成更新并发布',
datetime: '',
extra: '进行中',
color: 'blue',
type: '3',
},
],
},
];

View File

@@ -13,7 +13,8 @@
<span v-if="item.list.length !== 0">({{ item.list.length }})</span>
</template>
<!-- 绑定title-click事件的通知列表中标题是可点击-->
<NoticeList :list="item.list" @title-click="onNoticeClick" />
<NoticeList :list="item.list" v-if="item.key === '3'" @title-click="onNoticeClick" />
<NoticeList :list="item.list" v-else />
</TabPane>
</template>
</Tabs>
@@ -28,7 +29,7 @@
import NoticeList from './NoticeList.vue';
import { useDesign } from '@jeesite/core/hooks/web/useDesign';
import { useMessage } from '@jeesite/core/hooks/web/useMessage';
import { tabListDataAll, TabItem, BizListItem } from '@jeesite/biz/api/biz/listItem';
import { tabListDataAll, bizListItemSflow, TabItem, BizListItem } from '@jeesite/biz/api/biz/listItem';
export default defineComponent({
components: { Popover, BellOutlined, Tabs, TabPane: Tabs.TabPane, Badge, NoticeList },
@@ -53,10 +54,11 @@
}
return count;
});
function onNoticeClick(record: BizListItem) {
createMessage.success('你点击了' + record.title);
getDataList()
async function onNoticeClick(record: BizListItem) {
const res = await bizListItemSflow(record);
createMessage.success(res.message);
getDataList()
}
onMounted(() => {

View File

@@ -121,168 +121,6 @@ export const groupItems: GroupItem[] = [
group: '前端组',
date: '2021-09-01',
},
{
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
}, {
title: 'Vue',
icon: 'i-ion:logo-vue',
color: '#3fb27f',
desc: '现在的你决定将来的你。',
group: '前端组',
date: '2021-09-01',
},
{
title: 'Html5',
icon: 'i-ion:logo-html5',

View File

@@ -3,19 +3,37 @@
<template #extra>
<a-button type="link" size="small">更多</a-button>
</template>
<!-- 滚动容器 + 网格布局确保一行3个 -->
<div class="scroll-container">
<template v-for="item in items" :key="item">
<CardGrid class="!w-full">
<span class="flex">
<Icon :icon="item.icon" :color="item.color" size="30" />
<span class="ml-4 text-lg">{{ item.title }}</span>
</span>
<div class="text-secondary mt-2 h-10 flex">{{ item.desc }}</div>
<div class="text-secondary flex justify-between">
<span>{{ item.group }}</span>
<span>{{ item.date }}</span>
<template v-for="item in listData" :key="item">
<CardGrid class="!w-full rounded-lg p-4 shadow-sm hover:shadow-md transition-shadow duration-200 border border-gray-100">
<div class="flex items-center mb-3">
<Icon icon="i-ion:layers-outline" color="#00bfff" size="25" />
<span class="ml-2 text-lg font-medium text-gray-800">{{ item.projectName }}</span>
</div>
<div class="text-gray-600 mt-1 mb-4 h-12 flex items-center overflow-auto text-sm pr-2">
{{ item.projectDesc }}
</div>
<div class="bg-blue-50 rounded-md p-3 border-b-2 border-blue-200">
<div class="text-gray-600 flex justify-between mb-2 text-sm">
<span class="flex items-center">
<i class="ri-calendar-start-line mr-1 text-blue-400"></i>
开始时间: {{ item.startDate }}
</span>
<span class="flex items-center">
<i class="ri-code-line mr-1 text-blue-400"></i>
项目编码: {{ item.projectCode }}
</span>
</div>
<div class="text-gray-600 flex justify-between text-sm">
<span class="flex items-center">
<i class="ri-calendar-end-line mr-1 text-blue-400"></i>
结束时间: {{ item.endDate }}
</span>
<span class="flex items-center">
<i class="ri-user-line mr-1 text-blue-400"></i>
项目经理: {{ item.employeeName }}
</span>
</div>
</div>
</CardGrid>
</template>
@@ -23,17 +41,34 @@
</Card>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { defineComponent, onMounted, ref } from 'vue';
import { Card } from 'ant-design-vue';
import { Icon } from '@jeesite/core/components/Icon';
import { groupItems } from './Data';
import { BizProjectInfo, bizProjectInfoListAll } from '@jeesite/biz/api/biz/projectInfo';
export default defineComponent({
components: { Card, CardGrid: Card.Grid, Icon },
setup() {
return { items: groupItems };
},
} as any);
components: { Card, CardGrid: Card.Grid, Icon },
setup() {
const listData = ref();
const getDataList = async () => {
try {
const params = { projectStatus: '2' };
const result = await bizProjectInfoListAll(params);
listData.value = result || [];
} catch (error) {
listData.value = []; // 异常时置空列表,显示空状态
}
}
onMounted(() => {
getDataList()
});
return {
listData,
};
},
});
</script>
<style scoped>
@@ -46,7 +81,7 @@
/* 关键网格布局一行3个 */
display: grid;
grid-template-columns: repeat(3, 1fr); /* 强制一行3列 */
grid-template-columns: repeat(2, 1fr); /* 强制一行3列 */
gap: 16px; /* 卡片间距,可按需调整 */
}

View File

@@ -6,7 +6,6 @@
<Select
:showSearch="false"
:options="[
{ label: '使用手机号码找回您的密码', value: 'mobile' },
{ label: '使用电子邮箱找回您的密码', value: 'email' },
{ label: '使用保密问题找回您的密码', value: 'question' },
]"

View File

@@ -20,12 +20,6 @@
<div class="-enter-x mt-10 text-white font-medium">
<span class="mt-4 inline-block text-3xl"></span>
</div>
<div class="-enter-x text-md mt-5 text-white font-normal dark:text-gray-500">
JeeSite 是一个专业的平台是一个让你使用放心的平台<br />
前端基于 Vue3ViteTypeScriptAnt-Design-VueVben Admin<br />
后台基于 Spring BootApache MyBatis 最先进最经典的技术栈<br />
精致的 UI规范的代码书写匠心著作封装细节专注业务快速开发<br />
</div>
</div>
</div>
<div class="h-full w-full flex overflow-auto py-5 lg:my-0 lg:h-auto lg:w-11/24 lg:py-0">
@@ -35,9 +29,6 @@
>
<LoginForm @demo-mode="demoMode = $event" />
<ForgetPasswordForm :demoMode="demoMode" />
<RegisterForm :demoMode="demoMode" />
<MobileForm :demoMode="demoMode" />
<QrCodeForm :demoMode="demoMode" />
</div>
</div>
</div>
@@ -50,37 +41,10 @@
import { AppLocalePicker, AppDarkModeToggle } from '@jeesite/core/components/Application';
import LoginForm from './LoginForm.vue';
import ForgetPasswordForm from './ForgetPasswordForm.vue';
import RegisterForm from './RegisterForm.vue';
import MobileForm from './MobileForm.vue';
import QrCodeForm from './QrCodeForm.vue';
import { useGlobSetting } from '@jeesite/core/hooks/setting';
import { useDesign } from '@jeesite/core/hooks/web/useDesign';
import { useLocaleStore } from '@jeesite/core/store/modules/locale';
/* import { onMounted } from 'vue';
import { useMessage } from '@jeesite/core/hooks/web/useMessage';
const { createConfirm } = useMessage();
onMounted(() => {
if (!import.meta.env.DEV) {
createConfirm({
content: [
'<div onclick="window.open(\'https://gitee.com/thinkgem/jeesite-vue\')">',
'进入 <strong style="color: #FF0036;">JeeSite Vue</strong> 源码仓库页面,',
'点右上角 <strong style="color: #FF0036;">Star</strong> 加星关注',
'</div>',
].join(''),
width: 480,
iconType: 'info',
maskClosable: false,
cancelText: '我已 Star',
okText: '带我去 Star',
onOk: () => {
window.open('https://gitee.com/thinkgem/jeesite-vue');
},
});
}
}); */
defineProps({
sessionTimeout: {
type: Boolean,

View File

@@ -66,40 +66,7 @@
<Button type="primary" size="large" block @click="handleLogin" :loading="loading">
{{ t('sys.login.loginButton') }}
</Button>
<!-- <Button size="large" class="mt-4 enter-x" block @click="handleRegister">
{{ t('sys.login.registerButton') }}
</Button> -->
</FormItem>
<ARow class="enter-x md:pl-3">
<ACol :md="7" :xs="24">
<Button block @click="setLoginState(LoginStateEnum.MOBILE)">
{{ t('sys.login.mobileSignInFormTitle') }}
</Button>
</ACol>
<ACol :md="8" :xs="24" class="xs:mx-0 !my-2 md:mx-2 !md:my-0">
<Button block @click="setLoginState(LoginStateEnum.QR_CODE)">
{{ t('sys.login.qrSignInFormTitle') }}
</Button>
</ACol>
<ACol :md="7" :xs="24">
<Button block @click="setLoginState(LoginStateEnum.REGISTER)">
{{ t('sys.login.registerButton') }}
</Button>
</ACol>
</ARow>
<Divider class="enter-x">{{ t('sys.login.otherSignIn') }}</Divider>
<div class="enter-x flex justify-evenly" :class="`${prefixCls}-sign-in-way`">
<Icon icon="i-simple-icons:gitee" color="#d81e06" size="28" @click="handleOauth2" />
<Icon icon="i-ant-design:qq-circle-filled" color="#2178e3" size="32" @click="handleOauth2" />
<Icon icon="i-ant-design:wechat-filled" color="#2eb60d" size="32" @click="handleOauth2" />
<Icon icon="i-ant-design:github-filled" color="#2c2c2c" size="32" @click="handleOauth2" />
<a href="https://gitee.com/thinkgem/jeesite-client" target="_blank">
<Icon icon="i-ant-design:windows-filled" size="32" style="vertical-align: middle" />
<span class="pl-1" style="vertical-align: middle"> {{ t('客户端下载') }}</span>
</a>
</div>
</Form>
</template>
<script lang="ts" setup>