上传我的成果静态页面

This commit is contained in:
何童崇 2021-06-19 16:37:35 +08:00
parent 92f3934d5e
commit 216e984740
14 changed files with 673 additions and 118 deletions

View File

@ -3,7 +3,7 @@ import classNames from 'classnames';
import './index.scss';
export default (props) => {
const { title, options, changeOptionId, type } = props;
const { title, options, changeOptionId, type ,size} = props;
const [option, setOption] = useState({ code: "", dicItemName: "" ,dicItemCode:""});
@ -13,7 +13,7 @@ export default (props) => {
return (
<div className="shop-box">
<div className={classNames({"choose-box":true,"choose-box-big":size})}>
<div className="choose-title">{title}</div>
<div className="choose-list">
<div className={classNames({ "choose-item-checked": option.dicItemCode === "", "choose-item": true })} key={"all"} onClick={() => { setOption({ dicItemCode: "", dicItemName: "" }) }}>全部</div>

View File

@ -1,42 +1,45 @@
.nav-content {
margin:20px 0;
padding:1rem 0.2rem;
background: #fff;
border-bottom: 1px solid #eaeaea;
box-shadow: #ddd 0px 0px 5px;
box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.05);
border-radius: 5px;
}
.shop-box {
width: 1280px;
border-top: 1px solid #eaeaea;
.choose-box {
padding: .35em 0;
display: flex;
justify-content: start;
font-size: .85rem;
}
.choose-title {
width: 110px;
background: #f3f3f3;
width: 6.5em;
text-align: center;
padding: 16px 0;
font-size: 14px;
color: #666;
font-weight: 600;
color: #333;
font-weight: 500;
}
.choose-box-big{
font-size: 1rem;
.choose-title{
text-align: right;
}
}
.choose-list {
width: 1170px;
padding: 16px 0;
display: flex;
justify-content: start;
}
.choose-item {
font-size: 14px;
color:#666;
text-align: center;
padding: 0 15px ;
cursor: pointer;
&:hover{
color: #0072ff;
color: #1B8FFF;
}
}
.choose-item-checked {
color: #0072ff;
background: #f7f7f7;
color: #1B8FFF;
}

View File

@ -0,0 +1,101 @@
import React, { useEffect, useState } from 'react';
import { Icon, Pagination } from 'antd';
import { getImageUrl } from 'educoder';
import Nodata from '../../../forge/Nodata';
import Loading from "../../../Loading";
import './index.scss';
const statusArr = ["草稿", "待审核", "已拒绝", "成果征集中", "成果评选中", "公示中", "协议签订中", "支付中", "已完成"];
const classArr = ['', 'list-done', 'list-error', 'list-red', 'list-yellow', '', '', 'list-pay', 'list-gray',];
export default (props) => {
const { list, curPage, total, changePage, loading } = props;
const [page, setPage] = useState(1);
const [pageSize, setPageSize] = useState(() => {
return props.pageSize || 10;
});
useEffect(() => {
changePage(page);
}, [page]);
return (
loading ? <Loading /> :
<React.Fragment>
{
list.map(item => {
return (
<div className="fileComments df" key={item.id}>
<img src={getImageUrl("images/educoder/competition/1.png")} width="50" height="50" className="bor-radius-all mr20" />
<div className="flex1">
<ul className="clearfix">
<li className="fl pr">
<span className="font-16 mr20 color-grey3">
莫胜吕
</span>
<span className="color-grey9">2 天前</span>
<span className="color-blue ml10">待审核</span>
</li>
<li className="fr">
<a className="base_smallBtn blue_line_btn fl">
待确认
</a>
</li>
</ul>
{/* <li className="color-grey-6 mt10 mb10 justify break_word lineh-20">
<div className="paper-detail-content" id="paper-detail-content-184" style="box-sizing: border-box;">
<textarea style="display:none;">测试</textarea>
</div>
</li> */}
<div>
<div className="attachments" >
<p className="clearfix" id="attachments_1541">
<span title="歌曲ID代入演示.txt" id="attachment_">
<i className="iconfont icon-fujian color-green font-14 mr3"></i>
<a href="/attachments/download/1541/%E6%AD%8C%E6%9B%B2ID%E4%BB%A3%E5%85%A5%E6%BC%94%E7%A4%BA.txt" className="icon icon-attachment font-14" length="32">歌曲ID代入演示.txt</a> </span>
<span className="size color-grey-9 ml10">(299 Bytes)</span>
</p>
</div>
</div>
<li className="clearfix color-grey-6 mt10 mb20">
<span className="mr50 fl"><span className="color-grey9">成果编号</span>#25698320</span>
<span className="mr50 fl"><span className="color-grey9">提交时间</span>2021-06-17 13: 45: 53</span>
<span className="fl"><span className="color-grey9">稿件状态</span>雇主已浏览</span>
<span className="fr">
<a href="javascript:void(0)" className="mr20" onclick="tipOffs(184);"><i className="iconfont icon-jinggao font-15 mr3"></i>举报</a>
<a href="/papers/184/add_comments" className="mr20" data-remote="true"><i className="iconfont icon-huifu1 font-15 mr3"></i>0</a>
<span id="vote_link">
<a onclick="vote(184, 'Paper')" href="javascript:void(0)"><i className="iconfont icon-dianzan11 font-15 mr3"></i>2</a>
</span>
</span>
</li>
<div id="paper-comment-add-184"></div>
</div>
</div>
)
})
}
{list.length > 0 ?
<div className="edu-txt-center mt20 mb20">
{total > pageSize && <Pagination
showQuickJumper
onChange={(page) => { setPage(page) }}
current={curPage}
total={total}
showTotal={total => `${total}`}
/>}
</div> :
<Nodata _html="暂无数据" />}
</React.Fragment>
)
}

View File

@ -0,0 +1,20 @@
.blue_line_btn {
color: #4CACFF!important;
border: 1px solid #4CACFF;
background: #fff!important;
}
.base_smallBtn {
color: #ccc;
font-size: 14px;
background: #ccc;
border-radius: 4px;
height: 30px;
line-height: 30px;
display: block;
width: 100px;
box-sizing: border-box;
text-align: center;
}

View File

@ -2,7 +2,7 @@
display: flex;
justify-content: start;
align-items: center;
margin-left: 20px;
margin-left: 10px;
font-size: 1rem;
.sort-item {
display: flex;

BIN
src/military/image/win.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

View File

@ -11,25 +11,29 @@
.color-deep-blue{
color:#1B8FFF;
}
.text-center{
text-align: center;
}
.centerbox {
width: 80vw;
max-width: 1280px;
max-width: 1200px;
margin: 40px auto;
position: relative;
}
.center-content {
padding-top:5px;
background: #fff;
border: 1px solid #dedede;
box-shadow: #eee 0px 1px 1px 3px;
box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.05);
border-radius: 5px;
}
.centerScreen {
display: flex;
justify-content: space-between;
height: 46px;
height: 60px;
background-color: #fff;
border-bottom: 1px solid #dedede;
}
}
.head-navigation {
position: absolute;
@ -106,4 +110,23 @@
.ant-modal-footer{
text-align: center;
}
}
@media screen and (max-width: 1200px){
.centerbox {
width: 100vw;
}
.newHeaders{
min-width: 325px;
}
.newContainers{
min-width: 325px;
.newMain{
min-width: 325px;
}
}
.newFooter{
min-width: 325px;
}
}

View File

@ -1,8 +1,9 @@
import React, { useEffect, useState } from 'react';
import { Tabs, Input, Button, } from 'antd';
import { Tabs, Input, Button,Table,Pagination } from 'antd';
import StatusNav from '../../components/statusNav';
import ChooseNav from '../../components/chooseNav';
import ItemListMyTask from '../../components/itemListMyTask';
import { taskStatusAllArr, } from '../static';
import { taskStatusAllArr, applyStatusArr } from '../static';
import { getTaskList, getTaskCategory } from '../api';
import './index.scss';
const Search = Input.Search;
@ -11,6 +12,7 @@ const { TabPane } = Tabs;
const publishStatusArr = taskStatusAllArr.slice(3);
const unpublishStatusArr = taskStatusAllArr.slice(0, 3);
const columns=[];
export default ({ location, history, current_user }) => {
let defaultValue = decodeURI(location.search.split("=")[1] || "");
@ -25,6 +27,8 @@ export default ({ location, history, current_user }) => {
return defaultValue === 'false' ? '0,1,2' : '3,4,5,6,7,8';
});
const [requireAchieve, setRequireAchieve] = useState('1');
const [searchInput, setSearchInput] = useState('');
const [orderBy, setOrderBy] = useState('');
const [curPage, setCurPage] = useState(1);
@ -81,6 +85,16 @@ export default ({ location, history, current_user }) => {
setCurPage(1);
}
function changeIdentity(key) {
setIdentity(key);
if (key === '1') {
setStatusString('3,4,5,6,7,8');
} else {
setStatusString('0,1,2');
}
setCurPage(1);
}
function changeStatusType(key) {
if (key === '1') {
setStatusString('3,4,5,6,7,8');
@ -91,10 +105,21 @@ export default ({ location, history, current_user }) => {
setStatusType(key);
}
function changeRequireAchieve(key) {
if (key === '1') {
setStatusString('3,4,5,6,7,8');
} else {
setStatusString('0,1,2');
}
setCurPage(1);
setRequireAchieve(key);
}
return (
<div className="centerbox my-task">
<Tabs defaultActiveKey={identity} onChange={(key) => { setIdentity(key) }}>
<Tabs defaultActiveKey={identity} onChange={changeIdentity}>
<TabPane tab="我是雇主" key="1">
<Tabs className="childTab"
activeKey={statusType}
onChange={changeStatusType}
@ -145,11 +170,77 @@ export default ({ location, history, current_user }) => {
/>
</TabPane>
</Tabs>
</TabPane>
<TabPane tab="我是创客" key="2">
请稍候
<Tabs className="childTab"
activeKey={requireAchieve}
onChange={changeRequireAchieve}
tabBarExtraContent={
<Search
maxLength={20}
style={{ width: "300px" }}
placeholder="请输入任务编号/任务名称关键字"
onSearch={(value) => setSearchInput(value)}
/>
}
>
<TabPane tab="我发布的需求" key="1">
<ChooseNav
key={'taskStatus'}
type={'taskStatus'}
title={'任务状态:'}
options={publishStatusArr}
changeOptionId={changeOptionId}
/>
<ChooseNav
key={'applyStatus'}
type={'applyStatus'}
title={'应征状态:'}
options={applyStatusArr}
changeOptionId={changeOptionId}
/>
<ItemListMyTask
list={taskList}
itemClick={taskClick}
curPage={curPage}
total={total}
taskCategoryValueArr={taskCategoryValueArr}
changePage={(page) => { setCurPage(page) }}
loading={loading}
/>
</TabPane>
<TabPane tab="需求草稿" key="2">
<ChooseNav
key={'applyStatus'}
type={'applyStatus'}
title={'应征状态:'}
options={applyStatusArr}
changeOptionId={changeOptionId}
/>
<Table
loading={loading}
rowKey={(row) => row.id}
dataSource={taskList}
columns={columns}
pagination={false}
/>
{taskList.length > 10 &&
<Pagination
onChange={(page) => { setCurPage(page) }}
current={curPage}
total={total}
/>}
</TabPane>
</Tabs>
</TabPane>
</Tabs>

View File

@ -52,7 +52,11 @@ export const sortArr = [{
desc: false,
},];
export const applyStatusArr = [
{ dicItemCode: '0', name: "待确认", dicItemName: '待确认' },
{ dicItemCode: '1', name: "未采纳", dicItemName: '未采纳' },
{ dicItemCode: '2', name: "评选胜出", dicItemName: '评选胜出' },
];
export const formItemLayout = {
labelCol: {

View File

@ -1,69 +1,164 @@
import React, { useEffect, useState, useCallback } from 'react';
import React, { forwardRef, useEffect, useState, useCallback } from 'react';
import { Form, Input, Button, Modal, Table, Pagination } from 'antd';
import classNames from 'classnames';
import { Link } from "react-router-dom";
import { getImageUrl } from 'educoder';
import { httpUrl } from '../../fetch';
import Upload from '../../components/Upload';
import StatusNav from '../../components/statusNav';
import ItemListAchieve from '../../components/itemListAchieve';
import { getTaskDetail, getTaskCategory } from '../api';
import { taskModeIdArr} from '../static';
import './index.scss';
import classNames from 'classnames';
import { taskModeIdArr, applyStatusArr } from '../static';
import { httpUrl } from '../../fetch';
const taskModeNameArr=[];
for(const item of taskModeIdArr){
taskModeNameArr[item.dicItemCode]=item.dicItemName;
import winpng from '../../image/win.png';
import './index.scss';
const { TextArea } = Input;
const taskModeNameArr = [];
for (const item of taskModeIdArr) {
taskModeNameArr[item.dicItemCode] = item.dicItemName;
}
export default ({ match, current_user, history, showNotification }) => {
console.log(current_user);
const id = match.params.taskId;
const [detailData, setDetailData] = useState({});
const [taskCategoryValueArr, setTaskCategoryValueArr] = useState([]);
const columns = [
{
title: '应征者姓名',
dataIndex: 'name',
},
{
title: '投稿时间',
dataIndex: 'age',
},
{
title: '状态',
dataIndex: 'status',
render:(text,record)=>{
return <img src={winpng}/>
}
},
{
title: '详情',
dataIndex: 'detail',
},
];
export default Form.create()(
forwardRef(({ match, current_user, form, history, showNotification }, ref) => {
console.log(current_user);
const id = match.params.taskId;
const { getFieldDecorator, validateFields, setFieldsValue } = form;
const [detailData, setDetailData] = useState({});
const [taskCategoryValueArr, setTaskCategoryValueArr] = useState([]);
const [fileList, setFileList] = useState(null);
const [applyModal, setApplyModal] = useState(false);
//
useEffect(() => {
getTaskCategory().then(data => {
if (data) {
const taskCategoryValueArr = [];
for (const item of data) {
taskCategoryValueArr[item.id] = item.name;
const [curPage, setCurPage] = useState(1);
const [total, setTotal] = useState(0);
const [orderBy, setOrderBy] = useState('');
const [dataList, setDataList] = useState([
{name:'测试方式',id:1},
{name:'测试方式',id:2},
{name:'测试方式',id:3},
{name:'测试方式',id:4},
]);
const [loading, setLoading] = useState(false);
//
useEffect(() => {
getTaskCategory().then(data => {
if (data) {
const taskCategoryValueArr = [];
for (const item of data) {
taskCategoryValueArr[item.id] = item.name;
}
setTaskCategoryValueArr(taskCategoryValueArr);
}
setTaskCategoryValueArr(taskCategoryValueArr);
}
});
}, []);
});
}, []);
useEffect(() => {
id && getTaskDetail(id).then(data => {
setDetailData(data || {});
console.log(data);
})
}, [id]);
const process = useCallback((title, days, active) => {
return (
<li key={title} className={classNames({ active: active })} >
<span>{title}</span>
{days && <p className="color-grey-6 font-12">
{days}
useEffect(() => {
id && getTaskDetail(id).then(data => {
setDetailData(data || {});
console.log(data);
})
}, [id]);
//
const process = useCallback((title, days, active) => {
return (
<li key={title} className={classNames({ active: active })} >
<span>{title}</span>
{days && <p className="color-grey-6 font-12">
{days}
</p>}
</li>
)
}, []);
</li>
)
}, []);
function downFile(item) {
let url = httpUrl + '/busiAttachments/download/' + item.id;
window.open(url);
}
function downFile(item) {
let url = httpUrl + '/busiAttachments/download/' + item.id;
window.open(url);
}
return (
<React.Fragment>
const helper = useCallback(
(label, name, rules, widget) => (
<Form.Item label={label}>
{getFieldDecorator(name, { rules, validateFirst: true })(widget)}
</Form.Item>
),
[]
);
//
function UploadFunc(fileList) {
setFileList(fileList);
let files = [];
for (const item of fileList) {
files.push(item.id || item.response.data.id);
}
setFieldsValue({
uploadFileNumbers: files.join()
});
}
//
function saveItem(status) {
validateFields((error, values) => {
if (!error) {
}
})
}
function changeOptionId(option, type) {
// if (type === 'publishStatus') {
// // setStatusString(option.dicItemCode.toString() || '3,4,5,6,7,8');
// } else if (type === 'unpublishStatus') {
// // setStatusString(option.dicItemCode.toString() || '0,1,2');
// }
// setCurPage(1);
}
return (
<div className="centerbox">
<div className="head-navigation">
<Link to="/task">创客空间 &gt;</Link>
<Link to="/task">任务大厅 &gt;</Link>
&nbsp;任务编号{detailData.number}
&nbsp;任务编号{detailData.number}
</div>
<div className="edu-back-white padding30">
@ -123,9 +218,9 @@ export default ({ match, current_user, history, showNotification }) => {
{
detailData.tasksAttachments.map(item => {
return <div className="file-list-box" key={item.id}>
<a onClick={() => { downFile(item) }}><i className="iconfont icon-fujian color-green font-14 mr3"></i>
{item.fileName} </a>
{item.fileName} </a>
<span className="ml10 color-grey-9">({item.fileSizeString})</span>
</div>
})
@ -136,7 +231,7 @@ export default ({ match, current_user, history, showNotification }) => {
<div className="font-16 font-bd mt10">知识产权说明</div>
<p className="color-grey-6 lineh-20 padding10-15 mb10">
1参赛作品一经采用其所有权修改权和使用权均归主办方所有设计者不得再在任何地方使用<br />
2应征者所提交的作品必须由应征者本人创作或参与创作应征者应确认其作品的原创性主办单位不承担因作品侵犯他人或单位的权利而产生的法律责任其法律责任由应征者本人承担
2应征者所提交的作品必须由应征者本人创作或参与创作应征者应确认其作品的原创性主办单位不承担因作品侵犯他人或单位的权利而产生的法律责任其法律责任由应征者本人承担
</p>
<div className="font-16 font-bd">交稿声明</div>
@ -146,8 +241,176 @@ export default ({ match, current_user, history, showNotification }) => {
</p>
</div>
</div>
</React.Fragment>
{/* {detailData.status == '3' ? */}
<div className="edu-back-white padding30 mt20 text-center">
<Button className="mr20" type={"primary"} onClick={() => { setApplyModal(true) }}>我要应征投稿</Button>
</div>
)
}
{/* : */}
<div className="edu-back-white padding30 mt20">
<div className="font-16 font-bd">我要应征投稿</div>
{helper(
"",
"achievementRemark",
[{ required: true, message: "请输入" }],
<TextArea
placeholder="请输入"
autoSize={{ minRows: 6 }}
className="applyText"
/>
)}
<Form.Item >
<Upload
className="commentStyle"
load={UploadFunc}
size={50}
showNotification={showNotification}
// actionUrl={httpUrl}
actionUrl={'http://117.50.100.12:8001'}
fileList={fileList}
/>
{getFieldDecorator('uploadFileNumbers', {
validateFirst: true
})(<Input style={{ display: 'none' }} />)}
</Form.Item>
<Button className="mr20" type={"primary"} onClick={() => { saveItem(0) }}>提交</Button>
</div>
{/* } */}
<div className="applyList edu-back-white padding30 mt20">
<div class="font-16 font-bd">交稿0<i data-tip-down="不公示应征者姓名" class="iconfont icon-yincang1 color-grey9 font-20"></i>
{/* <a href="javascript:void(0)" onclick="upload_proofs_popup(130)" class="line_1 color-blue fr ml20" id="proof-upload-button">上传佐证材料</a> */}
{/* <a href="/tasks/130/export_papers" class="line_1 color-blue fr ml20" data-disable-with="<img alt=&quot;Loading&quot; class=&quot;download-loading&quot; src=&quot;/images/loading.gif?1564989000&quot; ></a>下载中..." target="_blank">一键导出成果物</a> */}
<a href="javascript:notice_box('暂无应征者提交')"><span class="fr color-orange ml20">应征者名单公示 &gt;&gt;</span></a>
</div>
<StatusNav
key={'applyStatus'}
type={'applyStatus'}
options={applyStatusArr}
changeOptionId={changeOptionId}
/>
<Table
loading={loading}
rowKey={(row) => row.id}
dataSource={dataList}
columns={columns}
pagination={false}
/>
{dataList.length > 10 &&
<Pagination
onChange={(page) => { setCurPage(page) }}
current={curPage}
total={total}
/>}
<ItemListAchieve
list={dataList}
itemClick={dataList}
curPage={curPage}
total={total}
changePage={(page) => { setCurPage(page) }}
loading={loading}
/>
</div>
<Modal
title="应征投稿协议内容"
visible={applyModal}
// onOk={checkItem}
onCancel={() => { setApplyModal(false) }}
className="form-edit-modal"
width='60vw'
>
<div className="new_li markdown-body editormd-html-preview" id="agreement_content" style={{ boxSizing: 'border-box', padding: '0px 20px' }}>
<p>投稿协议内容示例请在管理 创客 基础数据 应征投稿协议内容 修改.</p>
<p> <strong>在您通过本平台在线签署应征投稿合同前请您认真细致地阅读以下应征投稿协议特别是其中以粗体下划线明显标注的条款并在您同意了下述协议条款再正式进入后续程序</strong></p>
<p>本协议由甲方任务发布方和乙方应征者在线签订请甲乙双方仔细阅读协议内容 <strong>请务必审慎阅读充分理解各条款内容特别是免除或者限制责任的条款法律适用和争议解决条款</strong> 甲乙双方点击接受本协议即意味着已阅读理解并接受本协议所有条款并对本协议条款的含义及相应的法律后果已全部知晓并充分认可甲乙双方点击确认本协议后本协议即产生法律约束力</p>
<p>本协议内容包括协议正文及甲乙双方在线相互确认的合同所签订的合同合同附件为本协议不可分割的一部分与本协议正文具有同等法律效力若您继续使用本平台创客空间则表明您已经完全知晓认可并同意遵守本协议内容所有汇新云已经发布的各类规则以及签订的合同</p>
<p>在阅读本协议的过程中如不同意本协议或其中任何条款约定应拒绝接受本协议所约定的内容甲乙双方都有权自主选择拒绝达成合作</p>
<h5 id="h5-1-"><a name="1.定义" className="reference-link"></a><span className="header-link octicon octicon-link"></span>1.定义</h5><p>除非本协议另有约定在本协议中所用下列术语定义如下:</p>
<p>1.1 本平台是指www.XXXXXX.com 为用户提供需求信息发布交流第三方以企业个人入驻的形式应征需求的电子商务交易服务平台</p>
<p>1.2 用户指在本平台合法注册接受并认可服务平台相关协议规则规范制度等的自然人法人或其他非法人组织</p>
<p>1.3 甲方指在本平台上发布创客需求的用户</p>
<p>1.4 乙方是指经本平台审核通过入驻本平台根据需求方发布的需求提供各种定制服务或IT产品在平台开展业务经营的企业或个人</p>
<p>1.5 服务需求指甲方基于自身需求向乙方提出的具体服务要求</p>
<p>1.6 项目款指甲方和乙方的交易金额即本协议约定交易金额或后续经协商调整后确定的交易总金额</p>
<p>1.7 平台账户指用户在本平台注册的帐号用户只能通过该帐户登陆服务平台进行交易</p>
<h5 id="h5-2-"><a name="2.甲方权利义务" className="reference-link"></a><span className="header-link octicon octicon-link"></span>2.甲方权利义务</h5><p>2.1 甲方应当根据服务需求主动向乙方提交本项目所需的相关资料并保证该资料的真实性合法性准确性完整性如因甲方未按照前述标准提供资料导致乙方无法履行协议义务由此产生的责任由甲方自行承担</p>
<p>2.2 甲方在向乙方提交项目所涉及资料时有权一并对乙方的服务提出建议和思路同时有权在验收时对乙方的服务成果提出修改意见但甲方提出的服务建议或思路以及修改意见应当明确具体如不明确有权不听取建议或拒绝修改同时甲方不得借机拖延进度及应支付的款项甲方提出超出协议或合同约定范围的修改要求乙方有权拒绝或者另行收取费用</p>
<p>2.3 甲方未按照合同在约定的日期内支付项目款的乙方有权拒绝或顺延提供服务</p>
<p>2.4 甲方应充分了解且同意遵守服务平台公布的所有协议规则制度等文件并按照服务平台的相关规定处理相关交易事项</p>
<p>2.5 甲方应及时验收乙方交付的服务成果包括阶段成果和最终成果如乙方向甲方提交服务成果后在规定期限日内甲方未给出具体验收意见的视为乙方提交的服务成果合格如有下一阶段服务的乙方有权继续推进如下一阶段服务因甲方原因导致无法继续推进的乙方不承担任何责任</p>
<p>2.6 甲方有义务向乙方提供必要的配合义务包括提供必要资料及时验收及时回复等</p>
<p><strong>2.7 甲方同意并知晓乙方仅提供合法合规合理的服务对甲方违背法律法规或行政规章的服务要求乙方有权拒绝提供服务</strong></p>
<p><strong>2.8 甲方应当保证委托的服务事项不违反任何法律法规或侵犯他人合法权利否则乙方有权拒绝提供服务并有权立即解除本协议</strong></p>
<p><strong>2.9 甲方应当保证合法使用乙方提交的服务成果不得将服务成果用于任何违法违规或侵犯他人合法权益的活动甲方应自行承担服务成果使用过程中发生的全部责任</strong></p>
<p><strong>2.10 甲方同意为便于双方交易本协议作为交易的主要内容和双方之间权利义务的根本性约定具体服务项目期限金额等甲方在平台与乙方签订电子合同时在合同上予以标注甲方对在合同中提供的所有信息的真实性负责</strong></p>
<p><strong>2.11 甲方在签订线下子合同时应仔细确认所需要的服务内容价格数量交付方式等信息该信息将作为甲方的真实意思表示甲方应对该等信息的法律后果承担责任</strong></p>
<p><strong>2.12 甲方理解并同意签订线下合同时系统生成的订单信息是计算机信息系统根据乙方填写的内容自动生成的数据仅是乙方发出的合同要约甲方收到乙方的合同信息内容并确认签字后合同生效</strong></p>
<p><strong>2.13 甲方同意并授权平台方保存其信息包括但不限于注册信息</strong></p>
<h5 id="h5-3-"><a name="3. 乙方权利义务" className="reference-link"></a><span className="header-link octicon octicon-link"></span>3. 乙方权利义务</h5><p>3.1 乙方应按照合同约定的时间和质量向甲方提供服务</p>
<p>3.2 乙方应当积极听取甲方的修改意见甲方提出合理需求且提出明确的修改意见的乙方在提交服务成果后可提供修改服务但超出合同约定内容的修改需求乙方有权拒绝</p>
<p>3.3 乙方应当对甲方提供的相关资料承担保密义务除为履行本协议义务及法律规定外不得向第三方透露</p>
<p>3.4 乙方有权要求甲方按照合同约定的日期支付相应款项否则乙方有权拒绝顺延提供服务和不发起项目验收</p>
<p>3.5 甲方与乙方约定分阶段工作的乙方完成阶段性工作并发起验收甲方应在规定期限日内予以验收确认验收合格后乙方有权要求甲方支付下一开发阶段的项目启动资金如甲方在规定期限日内未予以验收的则视为验收合格</p>
<p>3.6 在双方签订的合同生效后乙方有权要求甲方先支付阶段性工作的项目启动资金进行托管后再进行工作</p>
<p>3.7 因乙方自身原因导致约定分阶段工作未能如期完成并交付则乙方需要与甲方提前协商沟通并在汇新云平台上发起项目延期函甲方进行确认后方可生效若乙方未提前发起项目延期函并与甲方确认否则乙方需按照约定的日期进行交付由此产生的责任由乙方自行承担</p>
<p>3.8 乙方应按照法律规定自行缴纳相应税费</p>
<p>3.9 乙方可能会向实现甲方需求所必须的关联方或合作伙伴共享甲方的订单信息以保障为甲方提供的服务顺利进行比如乙方必须将甲方的订单信息与第三方服务商共享来实现甲方的服务需求并使其完成后续的售后服务甲方对此无异议</p>
<p>3.10 乙方应将平台方公布的最新信息传递给甲方维护三方合作关系</p>
<p>3.11 乙方对服务中产生的因己方原因造成的甲方损失负有责任应负责解决若因此对平台造成损失的乙方应赔偿平台方全部损失</p>
<h5 id="h5-4-"><a name="4.服务平台方权利义务" className="reference-link"></a><span className="header-link octicon octicon-link"></span>4.服务平台方权利义务</h5><p>4.1 平台方对甲乙双方的注册申请有审核决定的权利</p>
<p>4.2 平台方享有为维护系统而短暂停止服务的权利暂停服务之前平台方将在系统进行通知甲乙双方应留意公告并做好相应备份工作</p>
<p>4.3 平台方有权根据中国法律法规的调整行政执法机关的命令和社会伦理道德的变化相应调整在线管理服务的审核标准甲乙双方不得以类似以前曾通过汇新云服务审核的理由要求平台方继续审核通过</p>
<p>4.4 乙方使用服务平台的账号密码所进行的一切操作视为乙方行为乙方应妥善平台的账号密码否则由此造成的一切后果由乙方承担一旦发生安全问题应立即通知平台方以共同采取措施包括但不限于冻结账号等</p>
<p>4.5 平台方有权根据自身需求改变平台服务规则并在服务平台进行公告</p>
<p>4.6 若乙方超过90天不使用平台账号的平台方有权屏蔽或注销其账号</p>
<h5 id="h5-5-"><a name="5. 知识产权" className="reference-link"></a><span className="header-link octicon octicon-link"></span>5. 知识产权</h5><p>5.1 本协议所产生成果的知识产权在甲方支付完全部项目款后归甲方所有乙方或乙方委托提供服务的第三方保留法律规定禁止转让部分的知识产权同时保留服务成果用于案例展示评选的权利但甲方与乙方另有约定的除外</p>
<p>5.2 乙方应当保证服务成果符合国家法律法规的规定不存在任何侵犯第三方的所有权知识产权名誉权肖像权等侵权行为并承担因此产生的全部责任</p>
<p>5.3 甲方的服务需求如需采购第三方知识产权产品的乙方应当及时告知甲方经甲方书面同意且支付采购费用后乙方予以采购并使用或由甲方自行采购并提供给乙方使用</p>
<p>5.4 甲方在未付清所有服务费用之前不得使用服务成果不得主张服务成果的知识产权如甲方在未付清服务费用之前自行或许可他人使用包含但不限于直接使用修改后使用乙方提交的服务成果的导致乙方或者其他第三方遭受损失的甲方应承担由此产生的全部责任</p>
<p>5.5 甲方应积极就服务成果申请相关知识产权如有如发生第三方侵权的乙方可协助甲方维权但不对维权结果承担任何责任</p>
<ol>
<li>责任限制</li></ol>
<p>乙方依照法律规定履行基础保障义务但对于下述原因导致的合同履行障碍履行瑕疵履行延后或履行内容变更等情形乙方并不承担相应的违约责任</p>
<p>6因自然灾害罢工暴乱战争政府行为司法行政命令等不可抗力因素</p>
<p>6因电力供应故障通讯网络故障等公共服务因素或第三人因素</p>
<p>6在乙方已尽善意管理的情况下因常规或紧急的设备与系统维护设备与系统故障网络信息与数据安全等因素</p>
<ol>
<li>违约责任</li></ol>
<p>7.1 乙方未按照合同的约定按时提交服务成果的应向甲方支付合同中规定的违约金</p>
<p>7.2 甲方在服务期间无正当理由单方终止协议的已支付费用无权要求返还</p>
<p>7.3 乙方在服务期间无正当理由单方终止协议的所收取的费用应当全部退回给甲方</p>
<p>7.4 甲乙双方应遵守平台规则以及维护平台商业形象以及维护平台方正常运营若因甲乙双方任何一方的原因给平台方造成损失的平台方有权追究其责任要求其支付违约金并有权冻结其享有的平台账号若平台方以法律手段维护其权益的平台方所支付的全部费用包括但不限于律师费诉讼费等全部由违约方承担</p>
<ol>
<li>争议解决</li></ol>
<p>8.1 因本协议及与本协议有关的争议解释等均适用中华人民共和国法律</p>
<p>8.2 本协议签订或履行过程中如有争议双方应当友好协商解决协商不成双方一致同意提交平台方所在地人民法院解决</p>
<ol>
<li>其他</li></ol>
<p>9.1 本协议以电子文本形式生成甲方与乙方完成协议订立手续后即具有与手写签名同等的法律效力</p>
<p>9.2 本协议中的任何约定如违反法律法规的规定而无效的该无效条款不影响本协议其他条款的效力甲方与乙方仍因履行其他条款所约定的权利义务</p>
<p>9.3 本协议内容中以加粗方式显著标识的条款请着重阅读甲乙方点击确认按钮即视为完全接受本协议在点击之前请再次确认已知悉并完全理解本协议的全部内容</p>
</div>
<div className="mt5 mb10 pl20 pr20 ml15">
<input type="checkbox" name="agreements" value="1" className="magic-checkbox" id="agreements" />
<label htmlFor="agreements" className="color-grey-6">我已阅读并同意本电子协议内容</label>
</div>
</Modal>
</div>
)
})
)

View File

@ -1,10 +1,11 @@
.centerbox{
.centerbox {
position: relative;
.head-navigation{
span{
margin-top: 40px;
.head-navigation {
span {
display: inline-flex;
align-items: center;
&:hover{
&:hover {
color: #409eff;
}
}
@ -12,35 +13,35 @@
}
.head-navigation {
position: absolute;
top:-2.3em;
top: -2.3em;
}
.task_tag {
padding: 0px 12px;
background: #F1F8FF;
background: #f1f8ff;
border-radius: 4px;
float: left;
color: #459BE6;
color: #459be6;
height: 1.25rem;
line-height: 1.25rem;
line-height: 1.25rem;
}
.tasks_status li {
float: left;
position: relative;
margin-right: 20px;
background: #EBEBEB;
width: 140px;
background: #ebebeb;
min-width: 8rem;
width: 12.4%;
height: 35px;
line-height: 35px;
color: #05101A;
color: #05101a;
text-align: center;
margin-bottom: 32px;
}
.tasks_status li.active {
background: #4CACFF;
background: #4cacff;
color: #fff;
}
@ -48,7 +49,7 @@
width: 0;
height: 0;
border-width: 17px;
content: '';
content: "";
position: absolute;
left: 0px;
border-style: solid;
@ -61,28 +62,68 @@
width: 0;
height: 0;
border-width: 17px;
content: '';
content: "";
position: absolute;
right: -34px;
border-style: solid;
top: 0px;
border-color: transparent transparent #EBEBEB transparent;
border-color: transparent transparent #ebebeb transparent;
transform: rotate(90deg);
}
.tasks_status li.active:after {
border-color: transparent transparent #4CACFF transparent;
border-color: transparent transparent #4cacff transparent;
transform: rotate(90deg);
}
.file-list-box{
padding:0 1.25rem;
.file-list-box {
padding: 0 1.25rem;
}
.content-text{
.content-text {
padding: 1.25rem;
}
.content-download{
.content-download {
color: #409eff;
}
.applyText {
margin-top: 0.5rem;
border-radius: 3px;
font-family: "微软雅黑", "宋体";
font-size: 14px;
line-height: 1.9;
border: 1px solid #eaeaea;
background: #ffffff;
color: #05101a;
resize: none;
}
.applyList {
table {
width: 100%;
border: 1px solid #eee;
border-bottom: none;
background: #fff;
color: #888;
cursor: default;
}
tbody tr {
height: 90px;
}
.ant-table-thead
> tr.ant-table-row-hover:not(.ant-table-expanded-row):not(.ant-table-row-selected)
> td,
.ant-table-tbody
> tr.ant-table-row-hover:not(.ant-table-expanded-row):not(.ant-table-row-selected)
> td,
.ant-table-thead
> tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected)
> td,
.ant-table-tbody
> tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected)
> td {
background: #fff;
}
}

View File

@ -88,7 +88,7 @@ export default Form.create()(forwardRef(({ current_user, form, showNotification,
let signingTime = getSomeDayAfter(data.collectingDays + data.choosingDays + data.makePublicDays + data.signingDays);
let payingTime = getSomeDayAfter(data.collectingDays + data.choosingDays + data.makePublicDays + data.signingDays + data.payingDays);
setDisplayTime({ collectingTime, choosingTime, makePublicTime, signingTime, payingTime });
console.log(data);
});
} else {
@ -165,14 +165,14 @@ export default Form.create()(forwardRef(({ current_user, form, showNotification,
), []);
const helperNoLabel = useCallback(
(title, name, rules, widget, initialValue) => (
(title, name, rules, widget, displayTime) => (
<div className="timing_task" key={name}>
<div className="mbt10 color-grey-9 lineh-35"><span className="inline-span">{title}</span></div>
<Form.Item className="no-label">
{getFieldDecorator(name, { rules, initialValue, validateFirst: true, })(widget)}
{getFieldDecorator(name, { rules, validateFirst: true, })(widget)}
</Form.Item>
<span className="days-word color-grey-9 "></span>
{publishMode == 1 && <span>{displayTime}</span>}
</div>
), []);
@ -438,7 +438,8 @@ export default Form.create()(forwardRef(({ current_user, form, showNotification,
<InputNumber
onChange={(v) => { changeDate(v, 'collectingDays') }}
className="date-input"
/>
/>,
displayTime.collectingTime
)}
{/* <div className="color-grey-9 format-time-days-1 format-time-day-show">2021-06-16 07:10</div> */}
{/* <div className="days-error"><span className="color-red none">成果提交时间不能为空</span></div> */}
@ -449,7 +450,8 @@ export default Form.create()(forwardRef(({ current_user, form, showNotification,
[{ required: true, message: "请输入天数" }],
<InputNumber
className="date-input"
/>
/>,
displayTime.choosingTime
)}
{helperNoLabel(
@ -458,7 +460,8 @@ export default Form.create()(forwardRef(({ current_user, form, showNotification,
[{ required: true, message: "请输入天数" }],
<InputNumber
className="date-input"
/>
/>,
displayTime.makePublicTime
)}
{helperNoLabel(
@ -467,7 +470,8 @@ export default Form.create()(forwardRef(({ current_user, form, showNotification,
[{ required: true, message: "请输入天数" }],
<InputNumber
className="date-input"
/>
/>,
displayTime.signingTime
)}
{helperNoLabel(
@ -476,7 +480,8 @@ export default Form.create()(forwardRef(({ current_user, form, showNotification,
[{ required: true, message: "请输入天数" }],
<InputNumber
className="date-input"
/>
/>,
displayTime.payingTime
)}
<div className="timing_task">

View File

@ -101,38 +101,42 @@ export default ({ history, current_user }) => {
}
return (
<div className="centerbox">
<div className="centerbox" style={{marginTop:'20px'}}>
<div className="nav-content">
<ChooseNav
key={'taskCategory'}
type={'taskCategory'}
title={'任务领域'}
title={'任务领域'}
options={taskCategoryArr}
changeOptionId={changeOptionId}
size='big'
/>
<ChooseNav
key={'taskModeId'}
type={'taskModeId'}
title={'任务模式'}
title={'任务模式'}
options={taskModeIdArr}
changeOptionId={changeOptionId}
size='big'
/>
<ChooseNav
key={'taskTime'}
type={'taskTime'}
title={'任务时限'}
title={'任务时限'}
options={taskTimeArr}
changeOptionId={changeOptionId}
size='big'
/>
<ChooseNav
key={'taskStatus'}
type={'taskStatus'}
title={'任务状态'}
title={'任务状态'}
options={taskStatusArr}
changeOptionId={changeOptionId}
size='big'
/>
</div>