from dash import html
import feffery_antd_components as fac
import feffery_utils_components as fuc
import feffery_antd_charts as fact
def render_page_bottom():
# 模拟数据
radar_origin_data = [
{
'name': '个人',
'ref': 10,
'koubei': 8,
'output': 4,
'contribute': 5,
'hot': 7
},
{
'name': '团队',
'ref': 3,
'koubei': 9,
'output': 6,
'contribute': 3,
'hot': 1
},
{
'name': '部门',
'ref': 4,
'koubei': 1,
'output': 6,
'contribute': 5,
'hot': 7
}
]
radar_data = []
radar_title_map = {
'ref': '引用',
'koubei': '口碑',
'output': '产量',
'contribute': '贡献',
'hot': '热度'
}
for item in radar_origin_data:
for key, value in item.items():
if key != 'name':
radar_data.append({
'name': item['name'],
'label': radar_title_map[key],
'value': value
})
project_list = [
{
"id": "xxx1",
"title": "Alipay",
"logo": "https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png",
"description": "那是一种内在的东西,他们到达不了,也无法触及的",
"updatedAt": "2023-09-15T01:08:36.135Z",
"member": "科学搬砖组",
"href": "",
"memberLink": ""
},
{
"id": "xxx2",
"title": "Angular",
"logo": "https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png",
"description": "希望是一个好东西,也许是最好的,好东西是不会消亡的",
"updatedAt": "2017-07-24T00:00:00.000Z",
"member": "全组都是吴彦祖",
"href": "",
"memberLink": ""
},
{
"id": "xxx3",
"title": "Ant Design",
"logo": "https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png",
"description": "城镇中有那么多的酒馆,她却偏偏走进了我的酒馆",
"updatedAt": "2023-09-15T01:08:36.135Z",
"member": "中二少女团",
"href": "",
"memberLink": ""
},
{
"id": "xxx4",
"title": "Ant Design Pro",
"logo": "https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png",
"description": "那时候我只会想自己想要什么,从不想自己拥有什么",
"updatedAt": "2017-07-23T00:00:00.000Z",
"member": "程序员日常",
"href": "",
"memberLink": ""
},
{
"id": "xxx5",
"title": "Bootstrap",
"logo": "https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png",
"description": "凛冬将至",
"updatedAt": "2017-07-23T00:00:00.000Z",
"member": "高逼格设计天团",
"href": "",
"memberLink": ""
},
{
"id": "xxx6",
"title": "React",
"logo": "https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png",
"description": "生命就像一盒巧克力,结果往往出人意料",
"updatedAt": "2017-07-23T00:00:00.000Z",
"member": "骗你来学计算机",
"href": "",
"memberLink": ""
}
]
activity_list = [
{
"id": "trend-1",
"updatedAt": "2023-09-15 01:08:36",
"user": {
"name": "曲丽丽",
"avatar": "https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png"
},
"group": {
"name": "高逼格设计天团",
"link": "http://github.com/"
},
"project": {
"name": "六月迭代",
"link": "http://github.com/"
},
"template": "新建项目"
},
{
"id": "trend-2",
"updatedAt": "2023-09-15 01:08:36",
"user": {
"name": "付小小",
"avatar": "https://gw.alipayobjects.com/zos/rmsportal/cnrhVkzwxjPwAaCfPbdc.png"
},
"group": {
"name": "高逼格设计天团",
"link": "http://github.com/"
},
"project": {
"name": "六月迭代",
"link": "http://github.com/"
},
"template": "新建项目"
},
{
"id": "trend-3",
"updatedAt": "2023-09-15 01:08:36",
"user": {
"name": "林东东",
"avatar": "https://gw.alipayobjects.com/zos/rmsportal/gaOngJwsRYRaVAuXXcmB.png"
},
"group": {
"name": "中二少女团",
"link": "http://github.com/"
},
"project": {
"name": "六月迭代",
"link": "http://github.com/"
},
"template": "新建项目"
},
{
"id": "trend-4",
"updatedAt": "2023-09-15 01:08:36",
"user": {
"name": "周星星",
"avatar": "https://gw.alipayobjects.com/zos/rmsportal/WhxKECPNujWoWEFNdnJE.png"
},
"group": {
"name": "白鹭酱油开发组",
"link": "http://github.com/"
},
"project": {
"name": "5 月日常迭代",
"link": "http://github.com/"
},
"template": "发布了"
},
{
"id": "trend-5",
"updatedAt": "2023-09-15 01:08:36",
"user": {
"name": "乐哥",
"avatar": "https://gw.alipayobjects.com/zos/rmsportal/jZUIxmJycoymBprLOUbT.png"
},
"group": {
"name": "程序员日常",
"link": "http://github.com/"
},
"project": {
"name": "品牌迭代",
"link": "http://github.com/"
},
"template": "新建项目"
}
]
return html.Div(
[
fac.AntdRow(
[
fac.AntdCol(
[
fac.AntdCard(
[
fac.AntdCardGrid(
[
html.Div(
[
fac.AntdAvatar(
mode='image',
src=item.get('logo'),
size='small'
),
html.A(
item.get('title')
)
],
className='card-title'
),
html.Div(
item.get('description'),
className='card-description'
),
html.Div(
[
html.A(item.get('member')),
html.Span(
'9小时前',
className='datetime'
)
],
className='project-item'
)
]
)
for item in project_list
],
className='project-list',
title='进行中的项目',
bordered=False,
extraLink={
'content': '全部项目'
},
bodyStyle={
'padding': 0
},
style={
'marginBottom': '24px',
'boxShadow': 'rgba(0, 0, 0, 0.1) 0px 4px 12px'
}
),
fac.AntdCard(
fac.AntdSpace(
[
html.Div(
[
html.Div(
[
html.Div(
fac.AntdAvatar(
mode='image',
src=item.get('user').get('avatar'),
size='small',
),
style={
'flex': '0 1',
'marginRight': '16px'
}
),
html.Div(
[
html.Div(
[
html.Span(f"{item.get('user').get('name')} 在 "),
html.A(item.get('group').get('name'), href=item.get('group').get('link')),
html.Span(f" {item.get('template')} "),
html.A(item.get('project').get('name'), href=item.get('project').get('link'))
],
key=item.get('id')
),
html.Div(
item.get('updatedAt'),
style={
'color': 'rgba(0,0,0,.45)',
'fontSize': '14px',
'lineHeight': '22px'
}
),
],
style={
'flex': '1 1 auto'
}
),
],
style={
'display': 'flex'
}
),
fac.AntdDivider()
]
)
for item in activity_list
],
direction='vertical',
style={
'width': '100%',
'maxHeight': '500px',
'overflowY': 'auto'
}
),
title='动态',
bordered=False,
style={
'marginBottom': '24px',
'boxShadow': 'rgba(0, 0, 0, 0.1) 0px 4px 12px'
}
),
],
xl=16,
lg=24,
md=24,
sm=24,
xs=24
),
fac.AntdCol(
[
fac.AntdCard(
html.Div(
[
html.A('操作一'),
html.A('操作二'),
html.A('操作三'),
html.A('操作四'),
html.A('操作五'),
fac.AntdButton(
'添加',
type="primary",
size='small',
icon=fac.AntdIcon(icon='antd-plus'),
style={
'marginLeft': '20px'
}
)
],
className='item-group'
),
title='快速开始 / 便捷导航',
bordered=False,
style={
'marginBottom': '24px',
'boxShadow': 'rgba(0, 0, 0, 0.1) 0px 4px 12px'
}
),
fac.AntdCard(
html.Div(
fact.AntdRadar(
height=343,
data=radar_data,
xField='label',
yField='value',
seriesField='name',
point={},
legend={
'position': 'bottom'
},
),
style={
'minHeight': '400px',
'margin': '0 auto',
'paddingTop': '30px'
}
),
title='XX 指数',
bordered=False,
bodyStyle={
'padding': 0
},
style={
'marginBottom': '24px',
'boxShadow': 'rgba(0, 0, 0, 0.1) 0px 4px 12px'
}
),
fac.AntdCard(
html.Div(
fac.AntdRow(
[
fac.AntdCol(
html.A(
[
fac.AntdAvatar(
mode='image',
src=item.get('logo'),
size='small'
),
html.Span(
item.get('member'),
className='member'
)
]
),
span=12
)
for item in project_list
]
),
className='members'
),
title='团队',
bordered=False,
style={
'marginBottom': '24px',
'boxShadow': 'rgba(0, 0, 0, 0.1) 0px 4px 12px'
}
),
],
xl=8,
lg=24,
md=24,
sm=24,
xs=24,
style={
'padding': '0 12px'
}
),
],
gutter=24
),
fuc.FefferyStyle(
rawStyle='''
.project-list .card-title {
font-size: 0;
}
.project-list .card-title a {
color: rgba(0, 0, 0, 0.85);
margin-left: 12px;
line-height: 24px;
height: 24px;
display: inline-block;
vertical-align: top;
font-size: 14px;
}
.project-list .card-title a:hover {
color: #1890ff;
}
.project-list .card-description {
color: rgba(0, 0, 0, 0.45);
height: 44px;
line-height: 22px;
overflow: hidden;
}
.project-list .project-item {
display: flex;
margin-top: 8px;
overflow: hidden;
font-size: 12px;
height: 20px;
line-height: 20px;
}
.project-list .project-item a {
color: rgba(0, 0, 0, 0.45);
display: inline-block;
flex: 1 1 0;
}
.project-list .project-item a:hover {
color: #1890ff;
}
.project-list .project-item .datetime {
color: rgba(0, 0, 0, 0.25);
flex: 0 0 auto;
float: right;
}
.project-list .ant-card-meta-description {
color: rgba(0, 0, 0, 0.45);
height: 44px;
line-height: 22px;
overflow: hidden;
}
.item-group {
padding: 20px 0 8px 24px;
font-size: 0;
}
.item-group a {
color: rgba(0, 0, 0, 0.65);
display: inline-block;
font-size: 14px;
margin-bottom: 13px;
width: 25%;
padding-left: 20px;
}
.members a {
display: block;
margin: 12px 0;
line-height: 24px;
height: 24px;
}
.members a .member {
font-size: 14px;
color: rgba(0, 0, 0, 0.65);
line-height: 24px;
max-width: 100px;
vertical-align: top;
margin-left: 12px;
transition: all 0.3s;
display: inline-block;
}
.members a .member:hover span {
color: #1890ff;
}
'''
)
]
)