forked from Gitlink/forgeplus-react
Merge branch 'gitlink_server' of https://gitlink.org.cn/Gitlink/forgeplus-react into feature_reposyncer
This commit is contained in:
commit
5c227c5eb9
|
|
@ -17,6 +17,13 @@ const paths = require("./paths");
|
|||
const publicPath = "/";
|
||||
const env = getClientEnvironment("/","development");
|
||||
|
||||
const process = require('process');
|
||||
|
||||
process.on('uncaughtException', function (err) {
|
||||
// 开发时,websocket proxy 会因服务重新部署而报错中断本地 server,这里拦截一下
|
||||
console.log('拦截未处理异常:', err);
|
||||
});
|
||||
|
||||
module.exports = {
|
||||
optimization: {
|
||||
splitChunks: {
|
||||
|
|
@ -273,12 +280,11 @@ module.exports = {
|
|||
reactPath:'react.production.min.js',
|
||||
}),
|
||||
new InterpolateHtmlPlugin(HtmlWebpackPlugin, env.raw),
|
||||
|
||||
// Add module names to factory functions so they appear in browser profiler.
|
||||
new webpack.NamedModulesPlugin(),
|
||||
// Makes some environment variables available to the JS code, for example:
|
||||
// if (process.env.NODE_ENV === 'development') { ... }. See `./env.js`.
|
||||
new webpack.DefinePlugin(env.stringified),
|
||||
new webpack.DefinePlugin({ ...env.stringified, __SERVER__: 'false',__CLIENT__: 'true' }),
|
||||
// This is necessary to emit hot updates (currently CSS only):
|
||||
new webpack.HotModuleReplacementPlugin(),
|
||||
// Watcher doesn't work well if you mistype casing in a path so we use
|
||||
|
|
|
|||
|
|
@ -294,6 +294,7 @@ module.exports = {
|
|||
minifyURLs: true,
|
||||
},
|
||||
}),
|
||||
new webpack.DefinePlugin({ ...env.stringified, __SERVER__: 'false',__CLIENT__: 'true' }),
|
||||
new InterpolateHtmlPlugin(HtmlWebpackPlugin, env.raw),
|
||||
// Makes some environment variables available to the JS code, for example:
|
||||
// if (process.env.NODE_ENV === 'production') { ... }. See `./env.js`.
|
||||
|
|
|
|||
|
|
@ -11029,6 +11029,11 @@
|
|||
"resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.1.tgz",
|
||||
"integrity": "sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg=="
|
||||
},
|
||||
"keypress": {
|
||||
"version": "0.1.0",
|
||||
"resolved": "https://registry.npmmirror.com/keypress/-/keypress-0.1.0.tgz",
|
||||
"integrity": "sha512-x0yf9PL/nx9Nw9oLL8ZVErFAk85/lslwEP7Vz7s5SI1ODXZIgit3C5qyWjw4DxOuO/3Hb4866SQh28a1V1d+WA=="
|
||||
},
|
||||
"killable": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
|
||||
|
|
@ -12777,6 +12782,24 @@
|
|||
"pinkie": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"pinyin": {
|
||||
"version": "4.0.0-alpha.0",
|
||||
"resolved": "https://registry.npmmirror.com/pinyin/-/pinyin-4.0.0-alpha.0.tgz",
|
||||
"integrity": "sha512-hdxO/2RuLWarhLaIcGKdXjkFZ0hFr3W/Yrvrd0YPxuIafixMZSAa4jvxskYLgYHE8OkOXkGsxMsEScwGzqKe3g==",
|
||||
"requires": {
|
||||
"commander": "~1.1.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"commander": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmmirror.com/commander/-/commander-1.1.1.tgz",
|
||||
"integrity": "sha512-71Rod2AhcH3JhkBikVpNd0pA+fWsmAaVoti6OR38T76chA7vE3pSerS0Jor4wDw+tOueD2zLVvFOw5H0Rcj7rA==",
|
||||
"requires": {
|
||||
"keypress": "0.1.x"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"pkg-dir": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@
|
|||
"nvm": "0.0.4",
|
||||
"object-assign": "4.1.1",
|
||||
"papaparse": "^5.3.2",
|
||||
"pinyin": "^4.0.0-alpha.0",
|
||||
"postcss-flexbugs-fixes": "3.2.0",
|
||||
"promise": "8.0.1",
|
||||
"prop-types": "^15.6.1",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import React from "react";
|
||||
import md5 from 'md5';
|
||||
import {Input} from "antd";
|
||||
import { url as ssrOrigin, host as ssrHost } from '../ssrUrl'
|
||||
const { Search } = Input;
|
||||
|
||||
const $ = window.$;
|
||||
|
|
@ -198,7 +199,7 @@ function railsgettimess(proxy) {
|
|||
}
|
||||
}})
|
||||
|
||||
window.setTimeout(function () {
|
||||
setTimeout(function () {
|
||||
checkSubmitFlgs=false;
|
||||
}, 2500);
|
||||
}
|
||||
|
|
@ -345,15 +346,15 @@ export function addMeta(name, content){
|
|||
*/
|
||||
export function setSeoMeta(keyWords, title, description, url, owner, projectId) {
|
||||
// 服务端没有location
|
||||
const host = window.location.host
|
||||
const origin = window.location.origin
|
||||
document.querySelector(`meta[property='og:title']`).content = title + ' | GitLink';
|
||||
document.querySelector(`title`).textContent = title + ' | GitLink';
|
||||
const host = window.location.host === 'null' || !window.location.host ? ssrHost : window.location.host
|
||||
const origin = window.location.origin === 'null' || !window.location.origin ? ssrOrigin : window.location.origin
|
||||
document.querySelector(`meta[property='og:title']`).content = title;
|
||||
document.querySelector(`title`).textContent = title;
|
||||
document.querySelector(`meta[property='og:url']`).content = origin + url;
|
||||
document.querySelector(`meta[property='og:description']`).content = description + ' | GitLink';
|
||||
document.querySelector(`meta[property='og:image:alt']`).content = description + ' | GitLink';
|
||||
document.querySelector('meta[name="Keywords"]').content= `${ keyWords },${ keyWords ? '' : 'GitLink, git, 开源, 代码托管, 项目管理, 版本控制, 代码分享, 项目协作, 协同开发平台' }` ;
|
||||
document.querySelector(`meta[name='description']`).content = description + ' | GitLink';
|
||||
document.querySelector(`meta[property='og:description']`).content = description;
|
||||
document.querySelector(`meta[property='og:image:alt']`).content = description;
|
||||
document.querySelector('meta[name="Keywords"]').content= `${ keyWords }${ keyWords ? '' : 'GitLink, git, 开源, 代码托管, 项目管理, 版本控制, 代码分享, 项目协作, 协同开发平台' }` ;
|
||||
document.querySelector(`meta[name='description']`).content = description;
|
||||
document.querySelector(`meta[name='go-import']`).content = host + url + ' git ' + origin + url;
|
||||
document.querySelector(`meta[name='octolytics-dimension-user_login']`).content = owner;
|
||||
if (projectId) {
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ function Badge(props) {
|
|||
} else {
|
||||
setProjectDetail(result.data);
|
||||
// seo优化设置
|
||||
let keyWords = `${owner},${projectsId},${result.data.author.name},`;
|
||||
let keyWords = `${owner},${projectsId},${result.data.author.name}`;
|
||||
let title = `${owner}/${projectsId}${result.data.description ? ':' + result.data.description : ''}`;
|
||||
setSeoMeta(keyWords, title, result.data.description, `/${owner}/${projectsId}`, owner, projectsId);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import React , { useEffect } from 'react';
|
||||
import Slider from 'react-slick';
|
||||
// import Slider from 'react-slick';
|
||||
import { httpUrl } from '../fetch';
|
||||
import axios from 'axios';
|
||||
import { useState } from 'react';
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
import React, { useEffect } from 'react';
|
||||
import { Form , Input , Row , Col, Button } from 'antd';
|
||||
import { Form , Input , Row , Col, Button, message } from 'antd';
|
||||
import '../index.scss';
|
||||
import { postCreateZone } from '../api';
|
||||
import axios from 'axios';
|
||||
|
||||
const { TextArea } = Input;
|
||||
|
||||
const phonereg = /^([1][3456789])\d{9}$/
|
||||
|
|
@ -25,10 +26,10 @@ function Apply(props){
|
|||
const zoneApplication = {...values};
|
||||
postCreateZone(zoneApplication).then(response=>{
|
||||
if(response && response.data && response.data.code===200){
|
||||
props.showNotification("提交成功!");
|
||||
message.success("您的专区申请已提交,请耐心等待管理员与您联系!");
|
||||
setTimeout(() => {
|
||||
window.location.href="/";
|
||||
}, 70);
|
||||
}, 1000);
|
||||
}
|
||||
}).catch(error=>{})
|
||||
}
|
||||
|
|
@ -55,6 +56,7 @@ function Apply(props){
|
|||
callback();
|
||||
}):callback();
|
||||
}
|
||||
|
||||
|
||||
|
||||
return(
|
||||
|
|
@ -72,9 +74,12 @@ function Apply(props){
|
|||
label="专区名称"
|
||||
>
|
||||
{getFieldDecorator("name",{
|
||||
rules:[{required:true,message:"请输入专区名称"}]
|
||||
rules:[
|
||||
{required:true,message:"请输入专区名称"},
|
||||
{pattern: /^[a-zA-Z0-9\u4e00-\u9fa5\\_.-]{1,31}$/, message: "长度1-30,支持中文,英文,数字,可包含下划线(_),中划线(-),英文句号(.)"}
|
||||
]
|
||||
})(
|
||||
<Input placeholder="请输入专区名称" maxLength={50} style={{height:"36px"}}/>
|
||||
<Input placeholder="请输入专区名称" maxLength={30} style={{height:"36px"}}/>
|
||||
)}
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
|
|
@ -99,18 +104,18 @@ function Apply(props){
|
|||
<Row type="flex" justify="space-between">
|
||||
<Col span={11}>
|
||||
<Form.Item
|
||||
label="专区标识"
|
||||
label="专区英文标识"
|
||||
>
|
||||
{getFieldDecorator("key",{
|
||||
rules:[
|
||||
{ required: true,message:"请输入专区域名标识" },
|
||||
// { required: true,message:"请输入专区域名英文标识" },
|
||||
{ pattern: /^[a-zA-Z][a-zA-Z0-9_-]{0,18}[a-zA-Z]$/, message: "长度2-20,只能包含数字、字母、下划线、中划线,必须以字母开头结尾"},
|
||||
{ validator:checkId }
|
||||
],
|
||||
validateTrigger:"onBlur",
|
||||
validateFirst: true,
|
||||
})(
|
||||
<Input placeholder="请输入专区域名标识" maxLength={20} style={{height:"36px"}}/>
|
||||
<Input placeholder="请输入专区域名标识,若未填写系统将根据专区名称自动生成" maxLength={20} style={{height:"36px"}}/>
|
||||
)}
|
||||
</Form.Item>
|
||||
</Col>
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ function HeaderPageCCF(props) {
|
|||
{
|
||||
// 新闻动态
|
||||
data && data.cmsShow === 1 && newsList && newsList.length >= 0 &&
|
||||
<div className="zone_news">
|
||||
<div className="zone_news zone_news_ccf">
|
||||
<p className="in_title mb50">{data.homepageCmsTitle}</p>
|
||||
<div className="boxmain mb100" style={{ display: "flex" }}>
|
||||
<div className="zone_new_first">
|
||||
|
|
|
|||
|
|
@ -25,9 +25,9 @@ function NewsDetail(props){
|
|||
let initialContent = undefined;
|
||||
// 设置网页标题
|
||||
if(detail){
|
||||
const { name, cmsDir, summary} = detail;
|
||||
const { name, cmsDir} = detail;
|
||||
document.title = `${ name }/${ cmsDir.name }`;
|
||||
addMeta('Keywords', `${ name },${ cmsDir.name },${ summary }`);
|
||||
setMeta()
|
||||
setTimeout(() => {
|
||||
configShareForCustom(detail.name, detail.summary, detail.headImg)
|
||||
}, 1000);
|
||||
|
|
@ -46,8 +46,7 @@ function NewsDetail(props){
|
|||
document.querySelector('meta[name="viewport"]').setAttribute('content', initialContent);
|
||||
}
|
||||
if (zonedetail) {
|
||||
document.title= zonedetail.mainTitle;
|
||||
setSeoMeta(`${zonedetail.name},`, zonedetail.name, zonedetail.subTitle, `/zone/${deptId}`)
|
||||
setMeta(true)
|
||||
}
|
||||
}
|
||||
},[zonedetail,detail])
|
||||
|
|
@ -59,6 +58,19 @@ function NewsDetail(props){
|
|||
}
|
||||
},[id])
|
||||
|
||||
function setMeta(unmount = false) {
|
||||
if (unmount) {
|
||||
document.title= zonedetail.name;
|
||||
setSeoMeta(`${zonedetail.name}`, zonedetail.name, zonedetail.subTitle, `/zone/${deptId}`)
|
||||
} else {
|
||||
const { name, cmsDir, summary, id} = detail;
|
||||
const title = `${ name }/${ cmsDir.name }`;
|
||||
const keywords = `${ name },${ cmsDir.name },${ zonedetail.name }`;
|
||||
document.title = title;
|
||||
setSeoMeta(keywords, title, summary, `/zone/${deptId}/newdetail/${ id }`)
|
||||
}
|
||||
}
|
||||
|
||||
function getDetails(){
|
||||
setIsSpin(true)
|
||||
getNewsDetail(id).then(result=>{
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
@import './theme.scss';
|
||||
|
||||
.zone_news {
|
||||
.zone_news_ccf {
|
||||
margin-top: -10px !important;
|
||||
|
||||
.zone_new_first {
|
||||
|
|
|
|||
|
|
@ -161,7 +161,7 @@ class Infos extends Component {
|
|||
const { pathname } = this.props.location;
|
||||
this.renderPath(pathname,result.data);
|
||||
document.title = result.data.username ? result.data.username : username;
|
||||
let keyWords=`${result.data.username},${username},`;
|
||||
let keyWords=`${result.data.username},${username}`;
|
||||
let title= result.data.username+'('+ username +')';
|
||||
setSeoMeta(keyWords,title,title,`/${username}`,username);
|
||||
})
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import React , { useCallback, useEffect , useState } from 'react';
|
||||
import { Button, Form, Input, Select, Upload, message, Popconfirm, Checkbox } from 'antd';
|
||||
import { Button, Form, Input, Select, Upload, message, Popconfirm, Checkbox, Icon, Tooltip } from 'antd';
|
||||
import {getUploadActionUrl} from 'educoder';
|
||||
import {applyGlcc, findStudentTaskByTaskId, updateApplyGlcc} from '../api';
|
||||
import TextArea from 'antd/lib/input/TextArea';
|
||||
|
|
@ -231,13 +231,22 @@ function EditRepoApplyInfo(props) {
|
|||
{cateList && cateList.map(item=> {return <Option value={item.name} key={item.id}>{item.name}</Option>})}
|
||||
</Select>
|
||||
)}
|
||||
{helper('GitLink地址',
|
||||
'',
|
||||
'gitlinkUrl',
|
||||
[{ required: true, message: "请输入GitLink项目地址" },
|
||||
{ max: 252, message: '超出限制长度252位字符,请重新编辑' }],
|
||||
<Input placeholder="请输入GitLink项目地址" onBlur={()=>{verify("gitlink")}}/>
|
||||
)}
|
||||
|
||||
<div className='hasQuestionBox'>
|
||||
{helper('GitLink地址',
|
||||
'',
|
||||
'gitlinkUrl',
|
||||
[{ required: true, message: "请输入GitLink项目地址" },
|
||||
{ max: 252, message: '超出限制长度252位字符,请重新编辑' }],
|
||||
<Input placeholder="请输入GitLink项目地址" onBlur={()=>{verify("gitlink")}}/>
|
||||
)}
|
||||
<Tooltip title={<div>
|
||||
指项目在GitLink的托管地址,详见<a href='https://forum.gitlink.org.cn/forums/10594/detail' target="_blank" style={{color: "#466aff"}}>迁移说明文档</a>
|
||||
</div>}
|
||||
>
|
||||
<Icon type="question-circle" theme="filled" className="question mt15 ml10"/>
|
||||
</Tooltip>
|
||||
</div>
|
||||
<Form.Item label="联系人姓名">
|
||||
{getFieldDecorator("contactName", { rules: [{ required: true, message: "请输入项目联系人姓名" },
|
||||
{ max: 32, message: '超出限制长度32位字符,请重新编辑' }], validateFirst: true, initialValue: current_user.username })(
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ function Apply(props) {
|
|||
<p className='font-15 c000'>申请说明</p>
|
||||
<div>1、项目报名时间为<span className='c000'>{formatParsedResult(applyTime, "rangeDay")}</span>,请在报名截止时间(北京时间<span className='c000'>{formatParsedResult(applyTime, "end")}</span>)前提交报名信息。</div>
|
||||
<div>2、本次GLCC夏令营建议使用GitLink为代码托管平台,学生基于GitLink上项目完成编程任务。同时也欢迎使用其他代码托管平台的项目参与活动。目前GLCC只对夏令营期间使用GitLink托管的项目提供部分奖励支持。</div>
|
||||
<div>3、如果您的项目还未迁移到GitLink上,迁移事项请查看<a href='https://help.gitlink.org.cn/%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B/%E5%AF%BC%E5%85%A5GitHub%E7%AD%89%E7%AC%AC%E4%B8%89%E6%96%B9Git%E9%A1%B9%E7%9B%AE?_highlight=%E5%AF%BC%E5%85%A5' target="_blank" className='link'>迁移说明文档</a>。如在迁移过程中遇到问题,请加qq群: 1071514693 联系qq群管理员。</div>
|
||||
<div>3、如果您的项目还未迁移到GitLink上,迁移事项请查看<a href='https://forum.gitlink.org.cn/forums/10594/detail' target="_blank" className='link'>迁移说明文档</a>。如在迁移过程中遇到问题,请加qq群: 1071514693 联系qq群管理员。</div>
|
||||
<div>4、提交社区和题目信息后,欢迎与组委会联系沟通宣传推广和后续合作工作。联系人微信: _TigerWang(备注GitLink编程夏令营)</div>
|
||||
<div>5、在项目报名期间({formatParsedResult(applyTime, "rangeDay")}),您可以随时进入当前页调整项目或课题报名信息</div>
|
||||
<div><span className='c000'>6、课题奖励默认由项目方支持,可提供现金或者实习机会等其他形式的奖励,请根据课题难度设定奖励内容。若您可能无法支撑本课题奖励,GLCC组委会将进行资助评审,择优资助。如未获得资助,将下线该课题</span></div>
|
||||
|
|
|
|||
|
|
@ -57,6 +57,17 @@
|
|||
max-height: 100px;
|
||||
}
|
||||
}
|
||||
|
||||
.hasQuestionBox{
|
||||
width: 50%;
|
||||
display: inline-flex;
|
||||
.question{
|
||||
color: $primary-color;
|
||||
}
|
||||
.ant-row.ant-form-item{
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
.introArea{
|
||||
width: 100%;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import React, { useEffect, useState } from 'react';
|
||||
import {Form, Input, Radio, Select } from 'antd';
|
||||
import {Form, Icon, Input, Radio, Select, Tooltip } from 'antd';
|
||||
import TextArea from 'antd/lib/input/TextArea';
|
||||
import { rewardMoney } from '../api';
|
||||
const Option = Select.Option;
|
||||
|
|
@ -36,13 +36,22 @@ function TaskApply(props) {
|
|||
{ max: 32, message: '超出限制长度32位字符,请重新编辑' }],
|
||||
<Input placeholder="请输入课题名称" {...disabledProps}/>
|
||||
)}
|
||||
{helper('课题链接',
|
||||
'',
|
||||
`taskUrl${taskKey}`,
|
||||
[{ required: true, message: "请输入课题链接" },
|
||||
{ max: 252, message: '超出限制长度252位字符,请重新编辑' }],
|
||||
<Input placeholder="请输入课题链接" {...disabledProps}/>
|
||||
)}
|
||||
<div className='hasQuestionBox'>
|
||||
{helper('课题链接',
|
||||
'',
|
||||
`taskUrl${taskKey}`,
|
||||
[{ required: true, message: "请输入课题链接" },
|
||||
{ max: 252, message: '超出限制长度252位字符,请重新编辑' }],
|
||||
<Input placeholder="请输入课题链接" {...disabledProps}/>
|
||||
)}
|
||||
<Tooltip title={<div>
|
||||
您可用issue的形式来发布课题,详见<a href='https://www.gitlink.org.cn/KomachiSion/nacos/issues/1' target="_blank" style={{color: "#466aff"}}>课题样例</a>
|
||||
</div>}
|
||||
>
|
||||
<Icon type="question-circle" theme="filled" className="question mt15 ml10"/>
|
||||
</Tooltip>
|
||||
</div>
|
||||
|
||||
{helper('课题难度',
|
||||
'',
|
||||
`taskDifficulty${taskKey}`,
|
||||
|
|
|
|||
|
|
@ -0,0 +1,7 @@
|
|||
export const url = process.env.NODE_ENV === 'production' ? 'https://www.gitlink.org.cn' : 'https://testforgeplus.trustie.net'
|
||||
export const zoneUrl = process.env.NODE_ENV === 'production' ? 'https://gateway.gitlink.org.cn' : 'https://testgetway.trustie.net'
|
||||
export const host = process.env.NODE_ENV === 'production' ? 'www.gitlink.org.cn' : 'testforgeplus.trustie.net'
|
||||
|
||||
// export const url = process.env.NODE_ENV === 'production' ? 'https://www.gitlink.org.cn' : ''
|
||||
// export const zoneUrl = process.env.NODE_ENV === 'production' ? 'https://gateway.gitlink.org.cn' : ''
|
||||
// export const host = process.env.NODE_ENV === 'production' ? 'www.gitlink.org.cn' : ''
|
||||
Loading…
Reference in New Issue