dev_forge
Jasder 5 years ago
commit 1ea0412c61

File diff suppressed because one or more lines are too long

@ -4,7 +4,7 @@
<meta charset="utf-8">
<!--<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">-->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0,user-scalable=0" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- width=device-width, initial-scale=1 , shrink-to-fit=no -->
<!-- <meta name="viewport" content=""> -->
@ -32,13 +32,13 @@
window.__isR = true;
// 不支持ie9 ie10
if (
( navigator.userAgent.indexOf('MSIE 9') != -1
( navigator.userAgent.indexOf('MSIE 9') != -1
|| navigator.userAgent.indexOf('MSIE 10') != -1 )
&&
&&
location.pathname.indexOf("/compatibility") == -1) {
debugger;
// location.href = './compatibility'
location.href = '/compatibility.html'
location.href = '/compatibility.html'
}
// const isMobile = (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase()));
const isWeiXin = (/MicroMessenger/i.test(navigator.userAgent.toLowerCase()));

@ -514,7 +514,7 @@ class App extends Component {
<Switch>
{/* 项目 */}
<Route path="/forge"
<Route path="/projects"
render={
(props) => {

@ -12,18 +12,56 @@ import './css/index.css';
import Loadable from 'react-loadable';
import Loading from '../Loading';
const ProjectNew = Loadable({
loader: () => import('./New/Index'),
loading: Loading,
})
const ProjectIndex = Loadable({
loader: () => import('./Main/Index'),
loading: Loading,
})
const ProjectDetail = Loadable({
loader: () => import('./Main/Detail'),
loading: Loading,
})
class Index extends Component{
constructor(props){
super(props);
this.state={
current_user:undefined
}
}
componentDidMount=()=>{
let current_user={
user_id:50207,
login:'caicc'
}
this.setState({
current_user
})
}
render(){
const {current_user} = this.state;
return(
<Switch {...this.props}>
<Route exact path="/forge/projects/new"
<Route exact path="/projects/:projectsType/new"
render={
(props) => (<ProjectNew {...this.props} {...props} {...this.state} current_user={current_user}/>)
}
></Route>
<Route exact path="/projects/:projectsId"
render={
(props) => (<ProjectDetail {...this.props} {...props} {...this.state} current_user={current_user}/>)
}
></Route>
<Route exact path="/projects"
render={
(props) => (<ProjectNew {...this.props} {...props} {...this.state} />)
(props) => (<ProjectIndex {...this.props} {...props} {...this.state} current_user={current_user}/>)
}
></Route>
</Switch>

@ -0,0 +1,152 @@
import React , { Component } from 'react';
import { Dropdown , Icon , Menu , Table } from 'antd';
import {Link} from 'react-router-dom';
import axios from 'axios';
// 点击按钮复制功能
function jsCopy(){
var e = document.getElementById("copy_rep_content");
e.select();
document.execCommand("Copy");
}
class CoderRootDirectory extends Component{
constructor(props){
super(props);
this.state={
address:"http",
ref:"master"
}
}
changeAddress=(address)=>{
this.setState({
address
})
}
componentDidMount=()=>{
this.getProjectRoot();
}
getProjectRoot=(ref)=>{
const { login } = this.props.current_user;
const { projectsId } = this.props.match.params;
const url = `/${login}/${projectsId}/entries.json`;
axios.get((url),{
params:{
ref
}
}).then((result)=>{
if(result){
}
}).catch((error)=>{})
}
render(){
const menu = (
<Menu>
<Menu.Item key="0">
<a href="http://www.alipay.com/">1st menu item</a>
</Menu.Item>
<Menu.Item key="1">
<a href="http://www.taobao.com/">2nd menu item</a>
</Menu.Item>
</Menu>
);
const columns = [
{
dataIndex: 'name',
width:"33%",
render: text => <a>{text}</a>,
},
{
className: 'column-money',
width:"34%",
dataIndex: 'money',
},
{
dataIndex: 'address',
width:"33%",
className:"edu-txt-right color-grey-9"
},
];
const data = [
{
key: '1',
name: 'John Brown',
money: '¥300,000.00',
address: 'New York No. 1 Lake Park',
},
{
key: '2',
name: 'Jim Green',
money: '¥1,256,000.00',
address: 'London No. 1 Lake Park',
},
{
key: '3',
name: 'Joe Black',
money: '¥120,000.00',
address: 'Sidney No. 1 Lake Park',
},
];
const title = () =>{
return(
<div className="f-wrap-alignCenter">
<img src={``} alt=""/>
<span>蔡蔡</span>
<Link to={``} className="commitKey">asljfowfjoer</Link>
<span className="color-blue flex-1 hide-1">first commit</span>
<span>3小时前</span>
</div>
)
}
const { address , ref } = this.state;
return(
<div className="main">
<p className="branch-wrapper">
<span><i className="iconfont icon-tijiaojilu font-18 mr3"></i></span>
<span><i className="iconfont icon-fenzhi font-18 mr3"></i></span>
</p>
<div className="f-wrap-between mt20">
<div className="branchDropdown">
<span className="color-grey-9 mr3"><i className="iconfont icon-fenzhi font-20 color-grey-6 mr3"></i>:</span>
<Dropdown overlay={menu} trigger={['click']} placement="bottomRight">
<a className="ant-dropdown-link">
{ref} <Icon type="down" />
</a>
</Dropdown>
</div>
<div className="gitAddressClone">
<span className={address ==="http" ? "addressType active":"addressType"} onClick={()=>this.changeAddress("http")}>HTTP</span>
<span className={address ==="ssh" ? "addressType active":"addressType"} onClick={()=>this.changeAddress("ssh")}>SSH</span>
<input type="text" id="copy_rep_content" value={"git@testgitea.trustie.net:sylor/test11.git"}/>
<span><i className="iconfont icon-fuzhi"></i></span>
<span>
<Dropdown overlay={menu} trigger={['click']} placement="bottomRight">
<a className="ant-dropdown-link">
<Icon type="cloud-download" className="font-18 fl"/>
</a>
</Dropdown></span>
</div>
</div>
<Table
className="mt20 wrap-commit-table"
columns={columns}
dataSource={data}
showHeader={false}
size="small"
pagination={false}
title={() => title()}
/>
</div>
)
}
}
export default CoderRootDirectory;

@ -0,0 +1,67 @@
import React , { Component } from 'react';
import { Link , Route , Switch } from 'react-router-dom';
import '../css/index.css'
import './list.css';
import Loadable from 'react-loadable';
import Loading from '../../Loading';
const CoderRootDirectory = Loadable({
loader: () => import('./CoderRootDirectory'),
loading: Loading,
})
class Detail extends Component{
constructor(props){
super(props);
this.state={
currentKey:"coder"
}
}
// 切换菜单
ChangeMenu=(value)=>{
console.log(value);
}
render(){
const { currentKey } = this.state;
return(
<div>
<div className="detailHeader-wrapper">
<div className="normal f-wrap-between mb20">
<p className="font-18 color-blue df flex-1" style={{alignItems:"center"}}>kosasa胡 / <span className="hide-1 flex-1">test11111111111</span></p>
<span className="p-r-tags large">
<span><label>关注</label><span>11</span></span>
<span><label>点赞</label><span>12</span></span>
<span><label>Fork</label><span>11</span></span>
</span>
</div>
<div className="normal f-wrap-between">
<ul className="headerMenu-wrapper">
<li className={currentKey === "coder" ? "active" : ""}><Link to={''}>代码</Link></li>
<li className={currentKey === "orders" ? "active" : ""}><Link to={''}>工单</Link></li>
<li className={currentKey === "merge" ? "active" : ""}><Link to={''}>合并请求</Link></li>
<li className={currentKey === "edition" ? "active" : ""}><Link to={''}>版本发布</Link></li>
<li className={currentKey === "trends" ? "active" : ""}><Link to={''}>动态</Link></li>
</ul>
</div>
</div>
<Switch {...this.props}>
<Route exact path="/projects/:projectsId/coder"
render={
(props) => (<CoderRootDirectory {...this.props} {...props} {...this.state}/>)
}
></Route>
<Route exact path="/projects/:projectsId"
render={
(props) => (<CoderRootDirectory {...this.props} {...props} {...this.state}/>)
}
></Route>
</Switch>
</div>
)
}
}
export default Detail;

@ -0,0 +1,221 @@
import React , { Component } from 'react';
import { Menu , Input , Dropdown , Icon, Spin , Pagination } from 'antd';
import '../css/index.css'
import './list.css';
import ListItem from './IndexItem'
import axios from 'axios';
const Search = Input.Search;
const { SubMenu } = Menu;
class Index extends Component{
constructor(props){
super(props);
this.state={
projectsList:undefined,
page:1,
limit:15,
search:undefined,
sort:undefined,
total:0,
isSpin:true,
project_type:undefined,
category_id:undefined,
typeList:undefined,
categoryList:undefined
}
}
componentDidMount=()=>{
const { page,limit, search , sort ,project_type,category_id} = this.state;
this.getListData(page,limit, search , sort,project_type,category_id);
this.getType();
this.getCategory();
}
// 获取列表
getListData=(page,limit, search , sort,project_type,category_id)=>{
const { current_user } = this.props;
const url = `/projects.json`;
axios.get(url,{params:{
user_id:current_user && current_user.user_id,
page,
limit,
search,
sort_by:sort,
project_type,
category_id
}}).then((result)=>{
if(result){
this.setState({
projectsList:result.data.projects,
total:result.data.total_count,
isSpin:false
})
}
}).catch((error)=>{})
}
// 获取类型
getType=()=>{
const url = `/projects/group_type_list.json`;
axios.get(url).then((result)=>{
if(result){
this.setState({
typeList:result.data && result.data.map((item,key)=>{
return(
<li onClick={()=>this.changeType(`${item.project_type}`)}>
<span>{item.name}</span>
<span>{item.projects_count}</span>
</li>
)
})
})
}
}).catch((error)=>{})
}
// 获取类型
getCategory=()=>{
const url = `/project_categories/group_list.json`;
axios.get(url).then((result)=>{
if(result && result.data){
this.setCategoryList(result.data);
}
}).catch((error)=>{})
}
setCategoryList=(list)=>{
this.setState({
categoryList:list.map((item,key)=>{
return(
<li onClick={()=>this.changeCategory(`${item.id}`)}>
<span>{item.name}</span>
<span>{item.projects_count}</span>
</li>
)
})
})
}
changeCategory=(id)=>{
this.setState({
category_id:id,
page:1
})
const { limit , sort, project_type } = this.state;
this.getListData(1,limit, undefined , sort, project_type ,id);
}
// 切换类型
changeType=(type)=>{
this.setState({
isSpin:true,
project_type:type,
search:undefined
})
const { page,limit, sort,category_id } = this.state;
this.getListData(page,limit, undefined , sort, type ,category_id);
}
// 排序
ChangeSoryBy=(e)=>{
this.setState({
sort_by:e.key,
page:1,
search:undefined,
isSpin:true
})
const { limit,project_type,category_id } = this.state;
this.getListData(1 ,limit , undefined , e.key,project_type,category_id);
}
// 搜索
searchFun=(value)=>{
// console.log(value)
this.setState({
page:1,
search:value,
isSpin:true,
project_type:undefined
})
const { limit , sort , category_id } = this.state;
this.getListData(1 ,limit, value , sort , undefined,category_id);
}
changeSearchValue=(e)=>{
this.setState({
search:e.target.value
})
}
// 翻页
ChangePage=(page)=>{
this.setState({
page
})
const { limit, search , sort,project_type,category_id } = this.state;
this.getListData(page,limit, search , sort,project_type,category_id);
}
render(){
const menu=(
<Menu onClick={this.ChangeSoryBy}>
<Menu.Item key="updated_on">更新时间排序</Menu.Item>
<Menu.Item key="created_on">创建时间排序</Menu.Item>
<Menu.Item key="forked_count">fork数据排序</Menu.Item>
<Menu.Item key="praises_count">点赞数量排序</Menu.Item>
</Menu>
)
const { projectsList , isSpin , total , search , limit , page , typeList , categoryList } = this.state;
const pagination = (
total && total > 0 ?
<div className="edu-txt-center pt30 mb30">
<Pagination simple defaultCurrent={page} total={total} pageSize={limit} onChange={this.ChangePage}></Pagination>
</div>:""
)
return(
<div className="main ProjectListIndex">
<div className="list-left">
<ul className="list-l-Menu">
<li className="MenuTitle">项目类型</li>
{ typeList }
</ul>
<ul className="list-l-Menu">
<li className="MenuTitle">项目类别</li>
{ categoryList }
</ul>
</div>
<div className="list-right">
<Spin spinning={isSpin}>
<div className="list-r-operation">
<Search
placeholder="输入项目名称关键字进行搜索"
enterButton="搜索"
size="large"
onSearch={this.searchFun}
className="list-r-Search"
value={search}
onChange={this.changeSearchValue}
/>
<Dropdown overlay={menu} trigger={['click']} placement='bottomRight'>
<a className="ant-dropdown-link">
排序 <Icon type="down" />
</a>
</Dropdown>
</div>
<ListItem {...this.props} {...this.state} projects={projectsList}></ListItem>
{ pagination }
</Spin>
</div>
</div>
)
}
}
export default Index;

@ -0,0 +1,48 @@
import React , { Component } from 'react';
import { getImageUrl } from 'educoder';
import { Link } from 'react-router-dom';
import '../css/index.css'
import './list.css';
class IndexItem extends Component{
render(){
const { projects } = this.props;
const renderList = (
projects && projects.length >0 ? projects.map((item,key)=>{
return(
<div className="p-r-Item">
<img className="p-r-photo" alt="" src={getImageUrl(`images/${item.author && item.author.image_url}`)} ></img>
<div className="p-r-Infos">
<div className="p-r-name">
<Link to={`/projects/${item.id}`} className="hide-1 font-16 color-grey-3" style={{whiteSpace:"wrap"}}>{item.name}</Link>
<span className="p-r-tags">
{ item.forked_count ? <span><label>Fork</label><span>{ item.forked_count}</span></span>:"" }
<span><label>Start</label><span>{ item.praises_count }</span></span>
{ item.language && item.language.id ? <span><label>{ item.language.name }</label></span>:"" }
</span>
</div>
<div className="p-r-content">
<p className="break_word hide-2">{item.description}</p>
</div>
<div className="p-r-about">
<span className="p-r-detail">
<span><label>浏览量</label>{item.visits}</span>
{ item.category && item.category.id && <span><label>项目类别</label>{item.category.name}</span>}
</span>
{item.last_update_time ? <span>更新于{item.time_ago}</span> : "" }
</div>
</div>
</div>
)
}):""
)
return(
<div className="project-list">
{ renderList }
</div>
)
}
}
export default IndexItem;

@ -0,0 +1,294 @@
body,#root{
background: #fff!important;
}
.ProjectListIndex{
display: flex;
align-items: flex-start;
flex-wrap:wrap;
}
.list-left{
width: 26%;
padding-right: 20px;
box-sizing: border-box;
margin-bottom: 20px;
}
.list-right{
width:74%;
background: #fff;
padding:10px;
}
.list-l-Menu{
border:1px solid #f4f4f4;
background: #fff;
border-radius: 4px;
margin-bottom: 20px;
}
.list-l-Menu>li{
height: 40px;
line-height: 40px;
font-size: 1rem;
padding:0px 20px;
box-sizing: border-box;
color: #333;
display: flex;
justify-content: space-between;
cursor: pointer;
}
.list-l-Menu li span:last-child{
color: #999;
}
.list-l-Menu .MenuTitle{
background-color: #efefef;
border-radius: 4px 4px 0px 0px;
font-size: 16px;
}
.list-l-Menu > li:not(.MenuTitle):hover{
background-color: #1890ff;
}
.list-l-Menu > li:not(.MenuTitle):hover span{
color: #fff;
}
/* 左侧menu */
.list-l-Menu .ant-menu-inline{
border:none;
}
.list-l-Menu .ant-menu-inline .ant-menu-item{
width:100%!important;
}
.list-l-Menu .ant-menu-item-group-title{
padding:0px;
}
.list-r-operation{
display: flex;
align-items: center;
padding:15px 0px 25px;
}
.list-r-Search{
flex: 1;
width: 0;
margin-right: 20px;
}
.list-r-Search .ant-btn-lg{
height: 38px;
}
/* 列表 */
.p-r-Item{
display: flex;
padding:15px 0px;
border-top: 1px solid #eee;
}
.p-r-photo{
width: 42px;
height: 42px;
border-radius: 50%;
margin-right: 15px;
}
.p-r-Infos{
flex: 1;
width: 0;
}
.p-r-name{
display: flex;
justify-content: space-between;
}
.p-r-name > p{
flex: 1;
width: 0;
}
.p-r-tags{
display: flex;
opacity: 1;
}
.p-r-tags.large > span{
height: 30px;
line-height: 30px;
font-size: 14px;
}
.p-r-tags > span{
margin-left: 15px;
border-radius: 4px;
border:1px solid #efefef;
background: #e2f0fd;
height: 24px;
line-height: 24px;
display: block;
font-size: 12px;
display: flex;
}
.p-r-tags.large > span >label{
padding:0px 12px;
}
.p-r-tags > span >label{
padding:0px 8px;
}
.p-r-tags.large > span >span{
padding:0px 6px;
}
.p-r-tags > span >span{
display: block;
background: #fff;
border-left: #efefef;
padding:0px 4px;
border-radius: 0px 4px 4px 0px;
color: #999;
}
.p-r-content{
margin-top:10px;
color: #666;
}
.p-r-detail > span{
margin-right: 15px;
color: #666;
}
.p-r-detail > span > label{
color: #999;
}
.p-r-about{
display: flex;
justify-content: space-between;
flex-wrap: nowrap;
margin-top: 8px;
color: #666;
}
/* -----------详情------------ */
.detailHeader-wrapper{
background: #f7f7f7;
padding-top:20px;
border-bottom: 1px solid rgba(34,36,38,.15);
}
.headerMenu-wrapper{
background: #f7f7f7;
font-size: 16px;
display: flex;
flex-direction: row;
color: #999;
}
.headerMenu-wrapper li{
padding:6px 14px;
position: relative;
text-align: center
}
.headerMenu-wrapper li.active{
background: #fff;
margin-bottom: -1px;
border:1px solid rgba(34,36,38,.15);
border-bottom: none;
border-radius: 4px 4px 0px 0px;
}
/* 详情-代码 */
.branch-wrapper{
border:1px solid #eee;
border-radius: 4px;
display: flex;
padding:5px;
}
.branch-wrapper span{
display: flex;
align-items: center;
justify-content: center;
flex: 1;
text-align: center;
height: 30px;
line-height: 30px;
cursor: pointer;
font-size: 16px;
}
.branch-wrapper span.active{
background: #eee;
}
.branch-wrapper span:hover{
color: #4CACFF;
}
.branchDropdown{
border:1px solid #eee;
border-radius: 4px;
display: flex;
justify-content: center;
padding:0px 10px;
height: 35px;
line-height: 35px;
}
.gitAddressClone{
display: flex;
height: 32px;
align-items: center;
border-radius: 4px;
border:1px solid #eee;
background: #fff;
}
.gitAddressClone > span{
display: flex;
line-height: 30px;
height: 30px;
padding:0px 12px;
border-right: 1px solid #eee;
cursor: pointer;
align-items: center;
}
.gitAddressClone > span.addressType.active{
color: #4CACFF;
}
.gitAddressClone > span:last-child{
border-right: none;
}
.gitAddressClone > input{
border:none;
outline: none;
padding:0px 8px;
height: 30px;
line-height: 30px;
border-radius: 0px;
border-right: 1px solid #eee;
flex:1;
}
.wrap-commit-table .ant-table-small > .ant-table-content > .ant-table-body{
margin:0px;
}
.commitKey{
border:1px solid #dcdcdc;
background-color:#f4f4f4;
color: #666!important;
padding:0px 5px;
height: 28px;
line-height: 28px;
margin:0px 15px;
border-radius: 4px;
}
@media screen and (max-width: 750px){
.list-left,.list-right{
width: 100%;
padding: 0px;
}
}
@media screen and (max-width: 400px){
.headerMenu-wrapper{
flex-direction: column;
width: 100%;
}
.headerMenu-wrapper li{
width: 100%;
}
.gitAddressClone{
width:100%;
}
.gitAddressClone > span{
padding:0px;
}
}
@media screen and (max-width: 370px){
.p-r-tags{
opacity: 0;
display: none;
}
.p-r-about{
flex-wrap: wrap;
}
}

@ -1,6 +1,6 @@
import React , { Component } from 'react';
import { Input , Form , Select , Checkbox , Button } from 'antd';
import { Input , Form , Select , Checkbox , Button , Divider } from 'antd';
import '../css/index.css';
import './new.css'
@ -97,14 +97,17 @@ class Index extends Component{
subMitFrom = () =>{
this.props.form.validateFieldsAndScroll((err, values) => {
if(!err){
console.log(values)
const url = `/projects.json`;
console.log(values);
const { projectsType } =this.props.match.params;
const url = projectsType === "deposit" ? "/projects.json" :"/projects/migrate.json";
axios.post(url,{
...values,
user_id:50207
}).then((result)=>{
if(result){
if(result.data.id){
this.props.showNotification(`${projectsType === "deposit" ? "托管" :"镜像"}项目创建成功!`);
}
}
}).catch((error)=>{
console.log(error);
@ -115,7 +118,9 @@ class Index extends Component{
render(){
const { getFieldDecorator } = this.props.form;
console.log(this.props);
// 项目类型deposit-托管项目mirror-镜像项目
const { projectsType } =this.props.match.params;
const {
// authorValue,
preType,
@ -130,9 +135,9 @@ class Index extends Component{
LicensesList
}=this.state;
return(
<div className="main">
<div className="main back-white">
<div className="newPanel">
<div className="newPanel_title">创建托管项目</div>
<div className="newPanel_title">创建{projectsType === "deposit" ? "托管":"镜像"}项目</div>
<Form>
<div className="newPanel_content">
{/* <Form.Item
@ -148,6 +153,24 @@ class Index extends Component{
</Select>
)}
</Form.Item> */}
{
projectsType != "deposit" &&
<React.Fragment>
<Form.Item
label="镜像版本库地址"
style={{marginBottom:"0px"}}
>
{getFieldDecorator('clone_addr', {
rules: [{
required: true, message: '请填写镜像版本库地址'
}],
})(
<Input placeholder="输入需要同步到本项目的镜像版本库地址"/>
)}
</Form.Item>
<p className="formTip">示例https://github.com/facebook/reack.git</p>
</React.Fragment>
}
<Form.Item
label="项目名称"
>
@ -159,6 +182,7 @@ class Index extends Component{
<Input placeholder="例如:团队协作方法与研究"/>
)}
</Form.Item>
<Form.Item
label="项目简介"
>
@ -224,26 +248,31 @@ class Index extends Component{
)}
</Form.Item>
</div>
<Divider />
<div className="newPanel_content">
<Form.Item
label=".gitignore"
>
{getFieldDecorator('ignore_id')(
<Select value={gitignoreType} className="inline_Tag">
{GitignoreList}
</Select>
)}
</Form.Item>
<Form.Item
label="开源许可证"
>
{getFieldDecorator('license_id')(
<Select value={LicensesType} className="inline_Tag">
{LicensesList}
</Select>
)}
</Form.Item>
{
projectsType === "deposit" &&
<React.Fragment>
<Form.Item
label=".gitignore"
>
{getFieldDecorator('ignore_id')(
<Select value={gitignoreType} className="inline_Tag">
{GitignoreList}
</Select>
)}
</Form.Item>
<Form.Item
label="开源许可证"
>
{getFieldDecorator('license_id')(
<Select value={LicensesType} className="inline_Tag">
{LicensesList}
</Select>
)}
</Form.Item>
</React.Fragment>
}
<Form.Item
label="可见性"
style={{marginBottom:"0px"}}

@ -21,7 +21,7 @@
}
.newPanel_content .ant-form-item-label{
width: 100px;
width: 135px;
display: block;
text-align: right;
margin-right: 10px;
@ -46,17 +46,12 @@
justify-content: space-between;
align-items:flex-end
}
.newContent_inline .ant-form-item-control-wrapper{
min-width: 235px;
}
.newContent_inline .inline_Tag{
width: 235px;
}
.newContent_inline > .ant-form-item:nth-child(2){
margin-left: 20px;
}
.formTip{
margin:0px 0px 20px 110px;
margin:0px 0px 20px 146px;
}
@media screen and (max-width: 750px){
.newPanel_content{

@ -1,11 +1,17 @@
body{
font-size:62.5%;
}
.main{
width: 1200px;
margin:2rem auto;
margin:20px auto;
}
.normal{
width: 1200px;
margin:0px auto;
}
/* 背景色 */
.back-white{
background: #fff;
}
/* 灰色按钮-高度32 */
.btn_32{
border-radius: 4px;
padding:0px 12px;
@ -18,18 +24,53 @@ body{
@media screen and (max-width: 1200px){
.main{
width:1000px;
margin:1rem auto;
margin:10px auto;
}
}
.hide-1{
display: inline-block;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.hide-2 {
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.df{display: flex}
.flex-1{flex: 1;width: 0}
.f-wrap-between{
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.f-wrap-alignCenter{
display: flex;
flex-wrap: wrap;
align-items: center;
}
@media screen and (max-width: 1000px){
.main{
width: 750px;
margin:1rem auto;
}
.normal{
width: 750px;
}
}
@media screen and (max-width: 750px){
.main{
width: 95%;
margin:1rem auto;
}
.normal{
width: 100%;
}
}
Loading…
Cancel
Save