修改样式

This commit is contained in:
linxd
2025-07-07 17:01:07 +08:00
parent 21e7f15f64
commit 87fddbbbbc
33 changed files with 1255 additions and 687 deletions

View File

@ -0,0 +1,250 @@
import React, { useState } from 'react';
import { Input, Button, Select, Radio, DatePicker } from 'antd';
import { SearchOutlined } from '@ant-design/icons';
import styles from './announce.less';
import moment from 'moment';
const { Option } = Select;
const { RangePicker } = DatePicker;
// 定义搜索表单数据类型
export interface SearchFormData {
searchKeyword: string;
announceType: string;
projectUnit: string;
projectLocation: string;
publishTime: string;
projectType: string;
currentProvince: string;
dateRange?: [moment.Moment, moment.Moment] | null;
}
interface SearchProps {
initialValues?: SearchFormData;
onChange?: (formData: SearchFormData) => void;
onSearch?: (formData: SearchFormData) => void;
isShowAnnounceType?: boolean;
isShowSearch?: boolean;
isShowProjectUnit?: boolean;
}
// 公告类型选项
const announceTypeOptions = [
{ label: '全部', value: '全部' },
{ label: '采购需求公示', value: '采购需求公示' },
{ label: '招标采购公告', value: '招标采购公告' },
{ label: '非招标采购公告', value: '非招标采购公告' },
{ label: '资格预审公告', value: '资格预审公告' },
{ label: '招募公告', value: '招募公告' },
{ label: '变更公告', value: '变更公告' },
{ label: '中标(中选)候选人公示', value: '中标(中选)候选人公示' },
{ label: '中标(中选)结果公示', value: '中标(中选)结果公示' },
{ label: '采购失败(流标)公告', value: '采购失败(流标)公告' },
];
// 第一行省份
const firstRowProvinces = [
'全部',
'北京',
'天津',
'河北',
'山西',
'内蒙古',
'辽宁',
'吉林',
'黑龙江',
'上海',
'江苏',
'浙江',
'安徽',
'福建',
'江西',
];
// 发布时间选项
const publishTimeOptions = [
{ label: '不限', value: '不限' },
{ label: '今天', value: '今天' },
{ label: '最近三天', value: '最近三天' },
{ label: '最近一周', value: '最近一周' },
{ label: '最近一月', value: '最近一月' },
{ label: '自定义', value: '自定义' },
];
// 项目类型选项
const projectTypeOptions = [
{ label: '全部', value: '全部' },
{ label: '货物', value: '货物' },
{ label: '工程', value: '工程' },
{ label: '服务', value: '服务' },
{ label: '其他', value: '其他' },
];
const Search: React.FC<SearchProps> = ({
initialValues,
onChange,
onSearch,
isShowAnnounceType = true,
isShowSearch = true,
isShowProjectUnit = true,
}) => {
// 内部状态管理
const [formData, setFormData] = useState<SearchFormData>(
initialValues || {
searchKeyword: '',
announceType: '全部',
projectUnit: '全选',
projectLocation: '中国',
publishTime: '不限',
projectType: '全部',
currentProvince: '全部',
dateRange: null,
},
);
// 更新表单数据并通知父组件
const updateFormData = (key: keyof SearchFormData, value: any) => {
const newFormData = { ...formData, [key]: value };
setFormData(newFormData);
if (onChange) {
onChange(newFormData);
}
};
// 处理搜索按钮点击
const handleSearch = () => {
if (onSearch) {
onSearch(formData);
}
};
return (
<div className={styles.announceSearch}>
{/* 公告搜索 */}
{isShowSearch && (
<div className={styles.searchRow}>
<div className={styles.searchLabel}></div>
<Input.Group compact>
<Input style={{ width: 'calc(100% - 200px)' }} />
<Button type="primary" icon={<SearchOutlined />} onClick={handleSearch}>
</Button>
</Input.Group>
</div>
)}
{/* 公告类型 */}
{isShowAnnounceType && (
<div className={styles.filterRow}>
<div className={styles.filterLabel}></div>
<div className={styles.filterOptions}>
<Radio.Group
value={formData.announceType}
onChange={(e) => updateFormData('announceType', e.target.value)}
buttonStyle="solid"
>
{announceTypeOptions.map((option) => (
<Radio.Button key={option.value} value={option.value}>
{option.label}
</Radio.Button>
))}
</Radio.Group>
</div>
</div>
)}
{/* 项目所属单位 */}
{isShowProjectUnit && (
<div className={styles.filterRow}>
<div className={styles.filterLabel}></div>
<Select
style={{ width: 300 }}
value={formData.projectUnit}
onChange={(value) => updateFormData('projectUnit', value)}
>
<Option value="全选"></Option>
<Option value="中远海运集团"></Option>
<Option value="中远海运物流"></Option>
<Option value="中远海运集装箱"></Option>
</Select>
</div>
)}
{/* 项目所在地 */}
<div className={styles.filterRow}>
<div className={styles.filterLabel}></div>
<div className={styles.locationSelector}>
<Select
style={{ width: 150, marginRight: 10 }}
value={formData.projectLocation}
onChange={(value) => updateFormData('projectLocation', value)}
>
<Option value="中国"></Option>
<Option value="国外"></Option>
</Select>
<div className={styles.provinceSelector}>
<Radio.Group
value={formData.currentProvince}
onChange={(e) => updateFormData('currentProvince', e.target.value)}
buttonStyle="solid"
>
<div className={styles.provinceRow}>
{firstRowProvinces.map((province) => (
<Radio.Button key={province} value={province}>
{province}
</Radio.Button>
))}
</div>
</Radio.Group>
</div>
</div>
</div>
{/* 发布时间 */}
<div className={styles.filterRow}>
<div className={styles.filterLabel}></div>
<div className={styles.filterOptions}>
<Radio.Group
value={formData.publishTime}
onChange={(e) => updateFormData('publishTime', e.target.value)}
buttonStyle="solid"
>
{publishTimeOptions.map((option) => (
<Radio.Button key={option.value} value={option.value}>
{option.label}
</Radio.Button>
))}
</Radio.Group>
{formData.publishTime === '自定义' && (
<RangePicker
style={{ marginLeft: 10 }}
value={formData.dateRange as any}
onChange={(dates) => updateFormData('dateRange', dates)}
/>
)}
</div>
</div>
{/* 项目类型 */}
<div className={styles.filterRow}>
<div className={styles.filterLabel}></div>
<div className={styles.filterOptions}>
<Radio.Group
value={formData.projectType}
onChange={(e) => updateFormData('projectType', e.target.value)}
buttonStyle="solid"
>
{projectTypeOptions.map((option) => (
<Radio.Button key={option.value} value={option.value}>
{option.label}
</Radio.Button>
))}
</Radio.Group>
</div>
</div>
</div>
);
};
export default Search;

View File

@ -1,3 +1,5 @@
@import '../../baseStyle.less';
.announcePage {
// padding: 20px;
// background-color: #f5f5f5;
@ -23,6 +25,7 @@
color: #333;
margin-right: 20px;
min-width: 70px;
text-align: right;
}
.filterRow {
@ -38,6 +41,7 @@
margin-right: 20px;
min-width: 70px;
padding-top: 5px;
text-align: right;
}
.filterOptions {
@ -59,27 +63,43 @@
flex-wrap: wrap;
}
}
.announceContainer{
background-color: #fff;
.banner{
width: 100%;
height: 300px;
margin-bottom: 20px;
}
.search{
border: 1px solid rgba(@main-text-color-2, 0.1);
padding: 20px;
}
}
/* 覆盖antd样式 - 仅在announceContainer内生效 */
.announceContainer {
.announceSearch {
:global(.ant-radio-button-wrapper) {
margin-right: 5px;
margin-right: 10px;
margin-bottom: 8px;
border-radius: 0;
border-radius: 5px;
height: 32px;
line-height: 30px;
min-width: 60px;
text-align: center;
padding: 0 10px;
border-left-width:1px;
background: rgb(244, 244, 245);
&:before{
display: none;
}
}
:global(.ant-radio-button-wrapper:first-child) {
border-radius: 0;
}
// :global(.ant-radio-button-wrapper:first-child) {
// border-radius: 0;
// }
:global(.ant-radio-button-wrapper:last-child) {
border-radius: 0;
}
// :global(.ant-radio-button-wrapper:last-child) {
// border-radius: 0;
// }
:global(.ant-radio-button-wrapper-checked) {
background-color: rgb(0, 79, 142);
@ -153,30 +173,63 @@
}
.listItem {
padding: 16px 10px;
border-bottom: 1px solid #f0f0f0;
&:hover {
background-color: #f9f9f9;
}
// border-bottom: 1px solid #f0f0f0;
}
.ant-list-item{
border-bottom: none !important;
}
.itemContent {
width: 100%;
border: 1px solid rgba(@main-text-color-2, 0.1);
padding: 10px;
}
.itemHeader {
display: flex;
align-items: center;
margin-bottom: 10px;
justify-content: space-between;
gap: 10px;
}
.itemInfo{
flex: 1;
}
.itemCompany{
color: @main-text-color-1;
font-size: 14px;
}
.itemDate{
color: @main-text-color-2;
font-size: 12px;
margin-top: 10px;
}
.typeTag {
margin-right: 10px;
min-width: 90px;
text-align: center;
}
.itemLastTime{
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
.itemLastTimeNum{
color: @main-text-color-1;
background-color: @main-danger-color;
color: #fff;
font-weight: 500;
padding: 5px 10px;
font-size: 14px;
width: 100%;
}
.itemLastTimeBtn{
background: rgba(@main-danger-color, 0.1);
border: 1px solid rgba(@main-danger-color, 0.5);
color: @main-danger-color;
padding: 5px 10px;
}
}
.itemTitle {
font-size: 16px;
font-weight: 500;
@ -194,10 +247,24 @@
justify-content: space-between;
color: #666;
font-size: 14px;
border-top: 1px solid rgba(@main-text-color-2, 0.1);
padding-top: 10px;
.itemFooterLeft{
flex: 1;
display: flex;
gap: 10px;
}
.itemFooterRight{
min-width: 180px;
text-align: right;
.itemFooterRightBtn{
color: @main-color;
cursor: pointer;
}
}
}
.company {
flex: 1;
}
.date {

View File

@ -1,11 +1,8 @@
import React, { useState } from 'react';
import { Input, Button, Select, Radio, DatePicker, List, Tag } from 'antd';
import { SearchOutlined } from '@ant-design/icons';
import { List, Tag } from 'antd';
import { history } from 'umi';
import styles from './announce.less';
const { Option } = Select;
const { RangePicker } = DatePicker;
import Search, { SearchFormData } from './Search';
// 模拟公告数据
const mockAnnounceData = [
@ -47,112 +44,33 @@ const mockAnnounceData = [
];
const AnnouncePage: React.FC = () => {
// 状态管理
const [searchKeyword, setSearchKeyword] = useState<string>('');
const [announceType, setAnnounceType] = useState<string>('全部');
const [projectUnit, setProjectUnit] = useState<string>('全选');
const [projectLocation, setProjectLocation] = useState<string>('中国');
const [publishTime, setPublishTime] = useState<string>('不限');
const [projectType, setProjectType] = useState<string>('全部');
const [currentProvince, setCurrentProvince] = useState<string>('全部');
// 分页状态
const [current, setCurrent] = useState(1);
const [pageSize, setPageSize] = useState(10);
const [total, setTotal] = useState(100);
// 公告类型选项
const announceTypeOptions = [
{ label: '全部', value: '全部' },
{ label: '采购需求公示', value: '采购需求公示' },
{ label: '招标采购公告', value: '招标采购公告' },
{ label: '非招标采购公告', value: '非招标采购公告' },
{ label: '资格预审公告', value: '资格预审公告' },
{ label: '招募公告', value: '招募公告' },
{ label: '变更公告', value: '变更公告' },
{ label: '中标(中选)候选人公示', value: '中标(中选)候选人公示' },
{ label: '中标(中选)结果公示', value: '中标(中选)结果公示' },
{ label: '采购失败(流标)公告', value: '采购失败(流标)公告' },
];
// 省份选项 - 按照图片中的顺序排列
const provinceOptions = [
{ label: '全部', value: '全部' },
{ label: '北京', value: '北京' },
{ label: '天津', value: '天津' },
{ label: '河北', value: '河北' },
{ label: '山西', value: '山西' },
{ label: '内蒙古', value: '内蒙古' },
{ label: '辽宁', value: '辽宁' },
{ label: '吉林', value: '吉林' },
{ label: '黑龙江', value: '黑龙江' },
{ label: '上海', value: '上海' },
{ label: '江苏', value: '江苏' },
{ label: '浙江', value: '浙江' },
{ label: '安徽', value: '安徽' },
{ label: '福建', value: '福建' },
{ label: '江西', value: '江西' },
{ label: '山东', value: '山东' },
{ label: '河南', value: '河南' },
{ label: '湖北', value: '湖北' },
{ label: '湖南', value: '湖南' },
{ label: '广东', value: '广东' },
{ label: '广西', value: '广西' },
{ label: '海南', value: '海南' },
{ label: '重庆', value: '重庆' },
{ label: '四川', value: '四川' },
{ label: '贵州', value: '贵州' },
{ label: '云南', value: '云南' },
{ label: '西藏', value: '西藏' },
{ label: '陕西', value: '陕西' },
{ label: '甘肃', value: '甘肃' },
{ label: '青海', value: '青海' },
{ label: '宁夏', value: '宁夏' },
{ label: '新疆', value: '新疆' },
{ label: '香港', value: '香港' },
{ label: '澳门', value: '澳门' },
{ label: '台湾', value: '台湾' },
];
// 第一行省份
const firstRowProvinces = ['全部', '北京', '天津', '河北', '山西', '内蒙古', '辽宁', '吉林', '黑龙江', '上海', '江苏', '浙江', '安徽', '福建', '江西'];
// 第二行省份
const secondRowProvinces = ['山东', '河南', '湖北', '湖南', '广东', '广西', '海南', '重庆', '四川', '贵州', '云南', '西藏', '陕西'];
// 第三行省份
const thirdRowProvinces = ['甘肃', '青海', '宁夏', '新疆', '香港', '澳门', '台湾'];
// 发布时间选项
const publishTimeOptions = [
{ label: '不限', value: '不限' },
{ label: '今天', value: '今天' },
{ label: '最近三天', value: '最近三天' },
{ label: '最近一周', value: '最近一周' },
{ label: '最近一月', value: '最近一月' },
{ label: '自定义', value: '自定义' },
];
// 项目类型选项
const projectTypeOptions = [
{ label: '全部', value: '全部' },
{ label: '货物', value: '货物' },
{ label: '工程', value: '工程' },
{ label: '服务', value: '服务' },
{ label: '其他', value: '其他' },
];
// 搜索表单数据
const [searchFormData, setSearchFormData] = useState<SearchFormData>({
searchKeyword: '',
announceType: '全部',
projectUnit: '全选',
projectLocation: '中国',
publishTime: '不限',
projectType: '全部',
currentProvince: '全部',
});
// 处理搜索
const handleSearch = () => {
console.log('搜索条件:', {
searchKeyword,
announceType,
projectUnit,
projectLocation,
publishTime,
projectType,
});
const handleSearch = (formData: SearchFormData) => {
console.log('搜索条件:', formData);
// 这里添加搜索逻辑
};
// 处理表单变化
const handleFormChange = (formData: SearchFormData) => {
setSearchFormData(formData);
};
// 处理分页变化
const handlePageChange = (page: number, pageSizeValue?: number) => {
setCurrent(page);
@ -188,179 +106,65 @@ const AnnouncePage: React.FC = () => {
return (
<div className={styles.announceContainer}>
<div className={styles.searchSection}>
{/* 公告搜索 */}
<div className={styles.searchRow}>
<div className={styles.searchLabel}></div>
<Input
placeholder="请输入公告关键词"
value={searchKeyword}
onChange={(e) => setSearchKeyword(e.target.value)}
style={{ width: '80%', maxWidth: 1000 }}
suffix={
<Button type="primary" icon={<SearchOutlined />} onClick={handleSearch}>
</Button>
}
<img className={styles.banner} src={require('@/assets/img/banner.jpg')} alt="" />
<div className="layout-content-main">
<div className={styles.search}>
<Search
initialValues={searchFormData}
onChange={handleFormChange}
onSearch={handleSearch}
/>
</div>
{/* 公告类型 */}
<div className={styles.filterRow}>
<div className={styles.filterLabel}></div>
<div className={styles.filterOptions}>
<Radio.Group
value={announceType}
onChange={(e) => setAnnounceType(e.target.value)}
buttonStyle="solid"
>
{announceTypeOptions.map((option) => (
<Radio.Button key={option.value} value={option.value}>
{option.label}
</Radio.Button>
))}
</Radio.Group>
</div>
</div>
{/* 项目所属单位 */}
<div className={styles.filterRow}>
<div className={styles.filterLabel}></div>
<Select
style={{ width: 300 }}
value={projectUnit}
onChange={(value) => setProjectUnit(value)}
>
<Option value="全选"></Option>
<Option value="中远海运集团"></Option>
<Option value="中远海运物流"></Option>
<Option value="中远海运集装箱"></Option>
</Select>
</div>
{/* 项目所在地 */}
<div className={styles.filterRow}>
<div className={styles.filterLabel}></div>
<div className={styles.locationSelector}>
<Select
style={{ width: 150, marginRight: 10 }}
value={projectLocation}
onChange={(value) => setProjectLocation(value)}
>
<Option value="中国"></Option>
<Option value="国外"></Option>
</Select>
<div className={styles.provinceSelector}>
<Radio.Group
value={currentProvince}
onChange={(e) => setCurrentProvince(e.target.value)}
buttonStyle="solid"
>
<div className={styles.provinceRow}>
{firstRowProvinces.map((province) => (
<Radio.Button key={province} value={province}>
{province}
</Radio.Button>
))}
</div>
<div className={styles.provinceRow}>
{secondRowProvinces.map((province) => (
<Radio.Button key={province} value={province}>
{province}
</Radio.Button>
))}
</div>
<div className={styles.provinceRow}>
{thirdRowProvinces.map((province) => (
<Radio.Button key={province} value={province}>
{province}
</Radio.Button>
))}
</div>
</Radio.Group>
</div>
</div>
</div>
{/* 发布时间 */}
<div className={styles.filterRow}>
<div className={styles.filterLabel}></div>
<div className={styles.filterOptions}>
<Radio.Group
value={publishTime}
onChange={(e) => setPublishTime(e.target.value)}
buttonStyle="solid"
>
{publishTimeOptions.map((option) => (
<Radio.Button key={option.value} value={option.value}>
{option.label}
</Radio.Button>
))}
</Radio.Group>
{publishTime === '自定义' && (
<RangePicker style={{ marginLeft: 10 }} />
)}
</div>
</div>
{/* 项目类型 */}
<div className={styles.filterRow}>
<div className={styles.filterLabel}></div>
<div className={styles.filterOptions}>
<Radio.Group
value={projectType}
onChange={(e) => setProjectType(e.target.value)}
buttonStyle="solid"
>
{projectTypeOptions.map((option) => (
<Radio.Button key={option.value} value={option.value}>
{option.label}
</Radio.Button>
))}
</Radio.Group>
</div>
</div>
</div>
{/* 公告列表部分 */}
<div className={styles.announceList}>
<List
itemLayout="horizontal"
dataSource={mockAnnounceData}
pagination={{
onChange: handlePageChange,
current,
pageSize,
total,
showTotal: (totalItems) => `${totalItems} 条记录`,
showSizeChanger: true,
showQuickJumper: true,
}}
renderItem={(item) => (
<List.Item
key={item.id}
className={styles.listItem}
>
<div className={styles.itemContent}>
<div className={styles.itemHeader}>
<Tag color={getTypeColor(item.type)} className={styles.typeTag}>
{item.type}
</Tag>
<div
className={styles.itemTitle}
onClick={() => handleAnnounceClick(item.id)}
>
{item.title}
{/* 公告列表部分 */}
<div className={styles.announceList}>
<List
itemLayout="horizontal"
dataSource={mockAnnounceData}
pagination={{
onChange: handlePageChange,
current,
pageSize,
total,
showTotal: (totalItems) => `${totalItems} 条记录`,
showSizeChanger: true,
showQuickJumper: true,
}}
renderItem={(item) => (
<List.Item key={item.id} className={styles.listItem} style={{borderBottom: 'none'}}>
<div className={styles.itemContent}>
<div className={styles.itemHeader}>
<Tag color={getTypeColor(item.type)} className={styles.typeTag}>
{item.type}
</Tag>
<div className={styles.itemInfo}>
<div
className={styles.itemTitle}
onClick={() => handleAnnounceClick(item.id)}
>
{item.title}
</div>
<div className={styles.itemCompany}>{item.company}</div>
<div className={styles.itemDate}>{item.publishDate}</div>
</div>
<div className={styles.itemLastTime}>
<span className={styles.itemLastTimeNum}>24</span>
<span className={styles.itemLastTimeBtn}></span>
</div>
</div>
<div className={styles.itemFooter}>
<div className={styles.itemFooterLeft}>
<div className={styles.company}>{item.company}</div>
<div className={styles.date}>{item.publishDate}</div>
</div>
<div className={styles.itemFooterRight}>
<div className={styles.itemFooterRightBtn}> </div>
</div>
</div>
</div>
<div className={styles.itemFooter}>
<div className={styles.company}>{item.company}</div>
<div className={styles.date}>{item.publishDate}</div>
</div>
</div>
</List.Item>
)}
/>
</List.Item>
)}
/>
</div>
</div>
</div>
);

View File

@ -10,21 +10,7 @@
margin-top: 15px;
text-align: center;
}
.blockTitle {
font-weight: 600;
font-size: 16px;
line-height: 30px;
}
.questionItem {
line-height: 40px;
.icon {
margin-right: 10px;
font-size: 18px;
}
}
.cardContent {
color: @main-text-color-2;
}
.card {
.ant-card-head {
min-height: 40px;
@ -39,16 +25,196 @@
text-indent: 26px;
}
}
.link {
.banner {
width: 100%;
height: 600px;
}
.noticeList {
padding: 10px 0;
display: flex;
margin-top: 10px;
gap: 20px;
align-items: center;
.flex {
margin-left: 10px;
display: flex;
.noticeName {
font-size: 18px;
font-weight: 600;
color: @main-danger-color;
width: 50px;
line-height: 20px;
text-align: center;
}
.noticeItem {
margin-right: 20px;
flex: 1;
a{
margin: 0 10px;
width: 0;
.cardTitle {
display: flex;
justify-content: space-between;
.cardTitleText {
font-size: 18px;
font-weight: 600;
color: @main-color;
cursor: pointer;
&:hover {
text-decoration: underline;
}
}
.cardTitleTime {
color: @main-text-color-2;
}
}
.cardContent {
color: @main-text-color-2;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
margin-bottom: 0;
}
}
}
// 登录入口
.loginType {
background-color: #fff;
padding: 40px 0 30px 0;
.loginTypeItem {
background-color: rgb(249, 250, 250);
border-radius: 10px;
display: flex;
flex-direction: column;
align-items: center;
padding: 25px 0;
.loginTypeItemTitle {
font-size: 18px;
font-weight: 600;
color: @main-text-color;
margin: 10px 0;
}
.loginTypeItemContent {
font-size: 15px;
color: @main-text-color-1;
margin-bottom: 20px;
}
.btns {
display: flex;
gap: 20px;
.ant-btn {
width: 100px;
border-radius: 5px;
}
}
}
}
// 采购类型
.announce {
margin-top: 40px !important;
.bg {
background-color: #fff;
padding: 20px;
}
.types {
height: 100%;
.announceTitle {
font-size: 18px;
font-weight: 600;
color: @main-color;
margin-bottom: 10px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(@main-text-color-2, 0.5);
}
.typeItem {
font-size: 16px;
cursor: pointer;
border-radius: 5px;
padding: 10px 15px;
&.active {
background-color: @main-color;
color: #fff;
}
&:hover {
background-color: @main-color;
color: #fff;
}
}
}
.search{
height: 100%;
}
}
// 关于我们
.about {
background-color: #fff;
padding: 40px 0 30px 0;
margin-top: 50px;
.blockTitle {
font-weight: 600;
font-size: 20px;
margin-bottom: 20px;
}
.mt20 {
margin-top: 20px;
}
.caBox {
display: flex;
flex-direction: column;
justify-content: space-between;
.caRow {
border: 1px solid rgba(@main-text-color-2, 0.3);
padding: 20px 30px;
}
.caItem {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
img {
width: 60px;
margin-bottom: 10px;
}
}
.contactBox {
flex: 1;
display: flex;
flex-direction: column;
.contact {
flex: 1;
border: 1px solid rgba(@main-text-color-2, 0.3);
padding: 20px 30px;
}
}
}
.borderBox {
border: 1px solid rgba(@main-text-color-2, 0.3);
padding: 20px 30px;
padding-bottom: 50px;
img {
width: 100%;
height: 100%;
}
.questionItem {
line-height: 50px;
border-bottom: 1px solid rgba(@main-text-color-2, 0.5);
.icon {
margin-right: 10px;
font-size: 18px;
}
}
}
}
// 友情链接
.firendLink {
background-color: #fff;
padding: 40px 0 30px 0;
.linkTitle {
font-weight: 600;
font-size: 20px;
margin-bottom: 20px;
}
:global(.ant-card) {
background-color: red;
}
img {
width: 100%;
height: 100%;
}
}

View File

@ -1,38 +1,30 @@
import React, { useState, useEffect } from 'react';
import { Card, Row, Col, Tabs, Table } from 'antd';
import { useIntl, Link } from 'umi';
import { Card, Row, Col, Tabs, Table, Button, Space } from 'antd';
import { useIntl, Link, history } from 'umi';
import './index.less';
import IconFont from '@/components/IconFont/IconFont';
import LinkComponent from './Link';
import { getCoscoPortalsLinksClassification } from '@/servers/api';
import Search from '../announce/Search';
import type { SearchFormData } from '../announce/Search';
const IndexPage: React.FC = () => {
const intl = useIntl();
const [noticeLoading, setNoticeLoading] = useState(false);
const [links, setLinks] = useState<API.CoscoPortalsLinksClassification>([]);
const [noticeList, setNoticeList] = useState([
{
title: 'CA使用通知',
id: '1',
content: '系统将于2022年5月27日期开始对全流程使用CA服务届时全部投标供应商需办理CA。',
time: '2022-05-27',
},
{
title: '5月27日系统优化升级通知',
id: '2',
content:
'系统将于2022年5月27日周五22:00--2022年5月28日周六6:00进行系统优化升级届时系统将暂停服务。',
},
{
title: '测试标题123123',
id: '3',
content: '测试内容124145',
},
{
title: '测试标题45435',
id: '4',
content: '测试内容6666',
time: '2022-05-27',
},
]);
const tabList = [
const typeList = [
{
key: '1',
label: intl.formatMessage({ id: '采购需求公示' }),
@ -71,8 +63,8 @@ const IndexPage: React.FC = () => {
},
];
//tab 切换事件
const tabChange = (key: string) => {
console.log(key);
const tabChange = (item: any) => {
console.log(item);
};
const [tableLoading, setTableLoading] = useState(false);
const dataSource = [
@ -91,28 +83,14 @@ const IndexPage: React.FC = () => {
lastDate: '剩余3天4小时',
},
{
key: '2',
key: '3',
title: '中远海运空运北方物流基地标识制作及安装服务',
address: '西湖区湖底公园1号',
date: '2025年01月23日',
lastDate: '剩余3天4小时',
},
{
key: '2',
title: '中远海运空运北方物流基地标识制作及安装服务',
address: '西湖区湖底公园1号',
date: '2025年01月23日',
lastDate: '剩余3天4小时',
},
{
key: '2',
title: '中远海运空运北方物流基地标识制作及安装服务',
address: '西湖区湖底公园1号',
date: '2025年01月23日',
lastDate: '剩余3天4小时',
},
{
key: '2',
key: '4',
title: '中远海运空运北方物流基地标识制作及安装服务',
address: '西湖区湖底公园1号',
date: '2025年01月23日',
@ -154,104 +132,224 @@ const IndexPage: React.FC = () => {
},
];
useEffect(() => {
getCoscoPortalsLinksClassification().then((res) => {
setLinks(res.data);
console.log(res.data);
const toSystem = (type: string) => {
console.log(type);
history.push({
pathname: '/login',
query: {
type: type,
},
});
}, []);
};
const toRegister = (type: string) => {
history.push({
pathname: '/register/supplier',
query: {
type: type,
},
});
console.log(type);
};
const [searchFormData, setSearchFormData] = useState<SearchFormData>({
searchKeyword: '',
announceType: '全部',
projectUnit: '',
projectLocation: '中国',
publishTime: '不限',
projectType: '全部',
currentProvince: '全部',
});
const handleFormChange = (formData: SearchFormData) => {
setSearchFormData(formData);
};
const handleSearch = (formData: SearchFormData) => {
console.log(formData);
};
return (
<div>
<img className="banner" src={require('@/assets/img/banner.jpg')} alt="" />
{/* 通知列表 */}
<Row gutter={20}>
<div className="noticeList layout-content-main">
<div className="noticeName"></div>
{noticeList.map((item) => (
<Col span={6} key={item.id}>
<Card
title={item.title}
loading={noticeLoading}
hoverable
className="card"
bodyStyle={{ padding: 10 }}
extra={
<Link
to={{
pathname: '/notice/noticeInfo',
<div className="noticeItem" key={item.id}>
<div className="cardTitle">
<span
className="cardTitleText"
onClick={() => {
history.push({
pathname: '/announce/announceInfo',
search: '?id=' + item.id,
});
}}
>
{item.title}
</span>
<span className="cardTitleTime">{item.time}</span>
</div>
<p className="cardContent">{item.content}</p>
</div>
))}
</div>
<div className="loginType">
<div className="layout-content-main">
<Row gutter={20}>
<Col span={8}>
<div className="loginTypeItem">
<img src={require('@/assets/img/loginType1.png')} alt="" />
<div className="loginTypeItemTitle"></div>
<div className="loginTypeItemContent">
</div>
<div className="btns">
<Button type="primary" onClick={() => toSystem('supplier')}>
</Button>
<Button type="primary" ghost onClick={() => toRegister('supplier')}>
</Button>
</div>
</div>
</Col>
<Col span={8}>
<div className="loginTypeItem">
<img src={require('@/assets/img/loginType2.png')} alt="" />
<div className="loginTypeItemTitle"></div>
<div className="loginTypeItemContent">
</div>
<div className="btns">
<Button type="primary" ghost onClick={() => toSystem('expert')}>
</Button>
<Button type="primary" ghost onClick={() => toRegister('expert')}>
</Button>
</div>
</div>
</Col>
<Col span={8}>
<div className="loginTypeItem">
<img src={require('@/assets/img/loginType3.png')} alt="" />
<div className="loginTypeItemTitle"></div>
<div className="loginTypeItemContent">
</div>
<div className="btns">
<Button type="primary" ghost onClick={() => toSystem('agent')}>
</Button>
</div>
</div>
</Col>
</Row>
</div>
</div>
<div className="layout-content-main announce">
<Row gutter={40}>
<Col span={5}>
<div className="types bg">
<div className="announceTitle"></div>
{typeList.map((item) => (
<div
className={`typeItem ${item.key === '1' ? 'active' : ''}`}
key={item.key}
onClick={() => {
tabChange(item);
}}
>
{intl.formatMessage({ id: '查看' })}
</Link>
}
>
<p className="cardContent">{item.content}</p>
</Card>
</Col>
))}
</Row>
<div style={{ backgroundColor: '#fff', marginTop: '20px', padding: '20px' }}>
<Tabs onChange={tabChange}>
{tabList.map((item) => (
<Tabs.TabPane tab={item.label} key={item.key} />
))}
</Tabs>
<Table
loading={tableLoading}
dataSource={dataSource}
columns={columns}
pagination={false}
/>
<div className="tableLoadMore">
<Link
to={{
pathname: '/announce',
}}
>
{intl.formatMessage({ id: '加载更多' })}
</Link>
</div>
<Row style={{ marginTop: '20px' }}>
<Col span={12}>
<div className="blockTitle"></div>
<img src="" alt="" />
<div className="questionItem">
<IconFont type="icon-dizhi" className="icon" />
173
</div>
<div className="questionItem">
<IconFont type="icon-dianhua" className="icon" />
17676373746
</div>
<div className="questionItem">
<IconFont type="icon-youxiang" className="icon" />
i723648723@383.com
{item.label}
</div>
))}
</div>
</Col>
<Col span={12}>
<div className="blockTitle">CA服务</div>
<Row>
<Col span={6} offset={6}>
<span>CA办理</span>
</Col>
<Col span={6}>
<span>CA客服</span>
</Col>
</Row>
<div className="blockTitle"></div>
<p style={{ marginTop: 20 }}>客服1: 400-300-9989</p>
<p>客服1: 400-300-9989</p>
<p>客服1: 400-300-9989</p>
<p>客服1: 400-300-9989</p>
<Col span={19}>
<div className="search bg">
<Search
isShowAnnounceType={false}
isShowSearch={false}
isShowProjectUnit={false}
initialValues={searchFormData}
onChange={handleFormChange}
onSearch={handleSearch}
/>
<Table
loading={tableLoading}
dataSource={dataSource}
columns={columns}
pagination={{
pageSize: 10,
total: 100,
}}
/>
</div>
</Col>
</Row>
</div>
<div className="about">
<div className="layout-content-main">
<Row gutter={40}>
<Col span={16}>
<div className="blockTitle"></div>
<div className="borderBox">
<img src={require('@/assets/img/location.png')} alt="" />
<div className="questionItem">
<IconFont type="icon-dizhi" className="icon" />
173
</div>
<div className="questionItem">
<IconFont type="icon-dianhua" className="icon" />
17676373746
</div>
<div className="questionItem">
<IconFont type="icon-youxiang" className="icon" />
i723648723@383.com
</div>
</div>
</Col>
<Col span={8} className="caBox">
<div>
<div className="blockTitle">CA服务</div>
<Row className="caRow">
<Col span={6} offset={6} className="caItem">
<img src={require('@/assets/img/ca1.png')} alt="" />
<span>CA办理</span>
</Col>
<Col span={6} className="caItem">
<img src={require('@/assets/img/ca2.png')} alt="" />
<span>CA客服</span>
</Col>
</Row>
</div>
<div>
<LinkComponent links={links} />
<div className="contactBox">
<div className="blockTitle mt20"></div>
<div className="contact">
<p style={{ marginTop: 20 }}>客服1: 400-300-9989</p>
<p>客服1: 400-300-9989</p>
<p>客服1: 400-300-9989</p>
<p>客服1: 400-300-9989</p>
</div>
</div>
</Col>
</Row>
</div>
</div>
<div className="firendLink">
<div className="layout-content-main">
<div className="linkTitle"></div>
<Card>
{Array.from({ length: 12 }).map((item, index) => (
<Card.Grid key={index} style={{ width: '16.6667%', height: '130px' }}>
<img src={require('@/assets/img/banner.jpg')} alt="" />
</Card.Grid>
))}
</Card>
</div>
</div>
</div>
);