Compare commits

...

67 Commits

Author SHA1 Message Date
caishi d88179a486 转移项目-状态变化 2021-09-06 15:32:59 +08:00
caishi 58613bf4c1 merge 报错 2021-09-06 14:41:53 +08:00
caishi be379d39e3 merge-pre_develop_dev 2021-09-06 14:21:43 +08:00
caishi 3f918b53d9 merge 转移仓库完成 2021-09-06 11:36:15 +08:00
caishi c4bc8fc9c5 merge 93a53e2c7f 2021-09-06 11:36:15 +08:00
caishi a1b82d833b merge 4e48b0b363 2021-09-06 11:36:15 +08:00
caishi 350769d3d7 搜索用户 2021-09-06 11:35:32 +08:00
caishi af31c381f9 merge 09065383c1 2021-09-06 11:35:32 +08:00
caishi e7f997d3f6 hide 2021-09-06 11:34:44 +08:00
caishi a968287331 项目列表头部button需要更新样式 2021-09-06 11:33:55 +08:00
何童崇 7dd59f7711 merge 52e08e77e5 2021-09-06 11:33:01 +08:00
何童崇 c3b43bb5c7 merge ff75065a0a 2021-09-06 11:32:43 +08:00
caishi 159bc0c893 新建项目跳转地址login 2021-09-06 11:22:21 +08:00
caishi ca84851f0b banner 2021-09-06 11:22:21 +08:00
caishi 4dc0f974df 列表页:描述内容样式 2021-09-06 11:22:21 +08:00
caishi 5b60d92063 /默认跳转地址 2021-09-06 11:21:25 +08:00
caishi f2be69f4e3 新建:拥有者默认选中当前登录用户,默认路由 2021-09-06 11:19:53 +08:00
caishi aa93eade71 同上 update 2021-09-06 11:19:03 +08:00
caishi 02b48e8648 项目列表:banner部分样式版本更新 2021-09-06 11:17:58 +08:00
caishi f50c550816 update issue 2021-09-06 11:17:34 +08:00
caishi 16397c8743 头部的nav字符串内容中有标签要渲染 2021-09-06 11:15:36 +08:00
caishi 5ef79007e2 current fix update 2021-09-06 11:15:21 +08:00
caishi e3321fd676 项目邀请码-第一版测试版上线 2021-09-06 11:14:53 +08:00
caishi 80c559895a bug 2021-09-06 11:12:44 +08:00
caishi e804698d70 修改资料+密码管理 2021-09-06 11:12:19 +08:00
caishi dd20d02477 同上=issue修改 2021-09-06 11:11:20 +08:00
caishi 28d3b5bedd git cherry-pick 1432afebfd 2021-09-06 11:10:05 +08:00
caishi e1b73f582a git cherry-pick a9285f37e7 2021-09-06 11:08:28 +08:00
caishi f94edf90a5 git cherry-pick d41dce26b1 2021-09-06 11:07:55 +08:00
caishi c9a9da6de9 git cherry-pick 975d49 2021-09-06 11:07:55 +08:00
caishi 7d0abfb764 cherry-pick develop 个人中心第一版 2021-09-06 11:05:28 +08:00
caishi f25db9ccf1 eudocderforge头像url 2021-09-06 10:57:31 +08:00
caishi 2d79d144a0 邮箱弹框点击事件 2021-09-06 10:57:31 +08:00
caishi a209b29100 2021-05-28同步develop分支 2021-09-06 10:57:17 +08:00
caishi 7666efe1df git merge a1bd41795a 2021-09-06 10:56:04 +08:00
caishi a14eddda52 git merge 70af7dae5f 2021-09-06 10:54:57 +08:00
caishi c54433728b merge d029840874 2021-09-06 10:43:44 +08:00
caishi ee994458a9 导航-字体颜色 2021-09-06 10:42:09 +08:00
caishi ea57432cb4 merge 2021-09-06 10:40:02 +08:00
caishi 831ff66ebe merge develop 2021-09-06 10:34:54 +08:00
caishi bc0d60fea9 imageurl接口统一返回带iamges的字段 2021-09-06 10:32:48 +08:00
caishi 53c92383d2 去掉右侧悬浮手册按钮 2021-09-06 10:27:56 +08:00
caishi 7697449f05 账号同步框提示文字错误 2021-09-06 10:27:14 +08:00
caishi 2e66904f81 合并资源库 2021-09-06 10:27:14 +08:00
caishi 21f7a2530a 冲突 2021-09-06 10:26:44 +08:00
caishi d76416bf1a 构建列表 2021-09-06 10:25:57 +08:00
caishi a05d06bc1f tips(易修、复刻) 2021-09-06 10:25:16 +08:00
caishi 5f7eaa24c6 通知、消息的地址,trustie改为educoder 2021-09-06 10:24:09 +08:00
caishi e4e419beb2 冲突 2021-09-06 10:20:37 +08:00
caishi 14a68f9241 color 2021-09-06 10:20:17 +08:00
caishi dd0a9e50e5 合并 2021-09-06 10:20:17 +08:00
caishi 3148397343 头部 active 2021-09-06 10:15:53 +08:00
caishi 7f7a1021df toubu 2021-09-06 10:15:53 +08:00
caishi 882d8aef75 代码冲突 2021-09-06 10:15:22 +08:00
caishi 987688bcc9 新建项目 2021-09-06 10:14:34 +08:00
caishi 3bebbdc44d readme 2021-09-06 10:13:51 +08:00
caishi 7b4723b111 header 2021-09-06 10:13:24 +08:00
caishi 3a8d9698db condition 2021-09-06 10:12:59 +08:00
caishi 6b441fc919 delete 2021-09-06 10:12:12 +08:00
caishi b1725a00ee style 2021-09-06 10:11:26 +08:00
caishi 0294439f18 未登录不弹框 2021-09-06 10:11:26 +08:00
caishi e7acb2f142 导航栏和底部 2021-09-06 10:11:26 +08:00
caishi 21ab03f3da update 2021-09-06 10:07:35 +08:00
caishi 102b21f255 隐藏操作手册 2021-09-06 10:07:34 +08:00
caishi 76ed232f6a educoder和forge用户的密码是否一致 2021-09-06 10:06:31 +08:00
caishi f14443a6e8 弹框修改接口 2021-09-06 10:05:33 +08:00
caishi 146d4c9baa 邮箱绑定 2021-09-06 10:05:33 +08:00
45 changed files with 752 additions and 413 deletions

2
package-lock.json generated
View File

@ -14158,7 +14158,7 @@
}, },
"qr.js": { "qr.js": {
"version": "0.0.0", "version": "0.0.0",
"resolved": "https://registry.npmjs.org/qr.js/-/qr.js-0.0.0.tgz", "resolved": "https://registry.npm.taobao.org/qr.js/download/qr.js-0.0.0.tgz",
"integrity": "sha1-ys6GOG9ZoNuAUPqQ2baw6IoeNk8=" "integrity": "sha1-ys6GOG9ZoNuAUPqQ2baw6IoeNk8="
}, },
"qrcode.react": { "qrcode.react": {

View File

@ -25,9 +25,6 @@ html {
min-width: 1200px min-width: 1200px
} }
.newFooter {
max-height: 110px;
}
.newFooter { .newFooter {
position: absolute; position: absolute;

View File

@ -3590,7 +3590,6 @@ a.user_bluebg_btn {
margin-right: 5px; margin-right: 5px;
} }
/***** loading ******/ /***** loading ******/
/*****载入中******/ /*****载入中******/
#ajax-indicator { #ajax-indicator {
@ -3957,7 +3956,7 @@ html>body #ajax-indicator {
display: block; display: block;
height: 100%; height: 100%;
width: 100%; width: 100%;
color: #333; color: #fff;
font-size: 16px; font-size: 16px;
} }

File diff suppressed because one or more lines are too long

View File

@ -79,7 +79,7 @@ const EducoderLogin = Loadable({
loading: Loading, loading: Loading,
}) })
const Search = Loadable({ const Search = Loadable({
loader: () => import('./modules/search/'), loader: () => import('./search/SearchPage'),
loading: Loading, loading: Loading,
}) })
const WikiPreview = Loadable({ const WikiPreview = Loadable({
@ -87,6 +87,7 @@ const WikiPreview = Loadable({
loading: Loading, loading: Loading,
}) })
const ProjectIndex = Loadable({ const ProjectIndex = Loadable({
loader: () => import("./forge/Index"), loader: () => import("./forge/Index"),
loading: Loading, loading: Loading,
@ -168,7 +169,6 @@ class App extends Component {
componentDidMount() { componentDidMount() {
document.title = "loading..."; document.title = "loading...";
this.getAppdata(); this.getAppdata();
window.addEventListener('error', (event) => { window.addEventListener('error', (event) => {

View File

@ -32,7 +32,7 @@ export function initAxiosInterceptors(props) {
// 判断网络是否连接 // 判断网络是否连接
initOnlineOfflineListener(); initOnlineOfflineListener();
var proxy = "https://testforgeplus.trustie.net"; var proxy = "https://testforgeplus.educoder.net";
//响应前的设置 //响应前的设置
axios.interceptors.request.use( axios.interceptors.request.use(
config => { config => {
@ -86,7 +86,7 @@ export function initAxiosInterceptors(props) {
if (response.data.status === 404) { if (response.data.status === 404) {
let responseURL = response.request ? response.request.responseURL:''; let responseURL = response.request ? response.request.responseURL:'';
if (responseURL.indexOf('/api/users/') === -1 && responseURL.indexOf('/api/organizations/') === -1 && responseURL.indexOf('/api/owners/') === -1) { if (responseURL.indexOf('/api/users/') === -1 || responseURL.indexOf('/api/organizations/') === -1 || responseURL.indexOf('/api/owners/') === -1) {
locationurl('/nopage'); locationurl('/nopage');
} }
} }

View File

@ -8,12 +8,18 @@ const isDev = window.location.port == 3007;
const isdev2= window.location.hostname ==='www.educoder.net' const isdev2= window.location.hostname ==='www.educoder.net'
export const TEST_HOST = "https://testforgeplus.trustie.net/" export const TEST_HOST = "https://testforgeplus.trustie.net/"
export function getImageUrl(path) { export function getImageUrl(path) {
// https://www.educoder.net const local = 'https://testforgeplus.educoder.net';
// https://testbdweb.trustie.net const normal = 'https://ali-cdn.educoder.net/images';
// const local = 'http://localhost:3000' const normalend = 'https://ali-cdn.educoder.net';
const local = 'https://testforgeplus.trustie.net'; if(path.substr(0, 7) !== "/system"){
if (isDev) { if (isDev) {
return `${local}/${path}` return `${local}/${path}`
}
if(path.substr(0, 7) !== "/images"){
return `${normal}${path}`;
}else{
return `${normalend}${path}`;
}
} }
return `${path}`; return `${path}`;
} }
@ -162,7 +168,7 @@ export function getmyUrl(geturl) {
} }
export function getUploadActionUrl(path, goTest) { export function getUploadActionUrl(path, goTest) {
return `${getUrl()}/api/attachments.json${isDev ?`${isDev ?`?debug=${window._debugType || 'admin'}` : ""}` : ""}`; return `${getUrl()}/api/attachments.json`;
} }
export function getUploadLogoActionUrl() { export function getUploadLogoActionUrl() {

View File

@ -3,4 +3,9 @@
} }
.ant-modal-wrap{ .ant-modal-wrap{
z-index: 1032; z-index: 1032;
}
.ant-modal-wrap{
.ant-form-explain{
position: absolute;
}
} }

View File

@ -35,21 +35,26 @@ function EducoderAccount({form , visible , onOk , email}){
> >
<div> <div>
<p className="mb15 edu-txt-center" style={{maxWidth:"350px",margin:"0px auto"}}> <p className="mb15 edu-txt-center" style={{maxWidth:"350px",margin:"0px auto"}}>
为确保您能正常使用平台功能请确认以下信息: {
email ?
`平台已检测到您已绑定邮箱${email},请您确认如下操作`
:
"平台已检测到您未绑定邮箱,为不影响使用协同开发功能,请先绑定邮箱"
}
</p> </p>
<Form {...layout}> <Form {...layout}>
<Form.Item label="邮箱"> <Form.Item label="邮箱">
{getFieldDecorator("email",{ {getFieldDecorator("email",{
rules:[{required:true,message:"请输入邮箱账号"}] rules:[{required:true,message:"请输入邮箱账号"}]
})( })(
<Input placeholder="请输入您的邮箱账号" width="220px"/> <Input placeholder="请输入您的邮箱账号" width="220px" disabled={email}/>
)} )}
</Form.Item> </Form.Item>
<Form.Item label="密码"> <Form.Item label="密码">
{getFieldDecorator("password",{ {getFieldDecorator("password",{
rules:[{required:true,message:"请输入邮箱密码"}] rules:[{required:true,message:"请输入您的平台密码"}]
})( })(
<Input.Password placeholder="请输入您的邮箱密码" width="220px"/> <Input.Password placeholder="请输入您的平台密码" width="220px"/>
)} )}
</Form.Item> </Form.Item>
</Form> </Form>

View File

@ -12,7 +12,7 @@ function ServiceModal({sureModal}){
<div className="mt30" style={{textAlign:"center"}}> <div className="mt30" style={{textAlign:"center"}}>
<Radio.Group value={type} onChange={changeType}> <Radio.Group value={type} onChange={changeType}>
<Radio value={1}>自有服务器</Radio> <Radio value={1}>自有服务器</Radio>
<Radio value={2}>Trustie服务器</Radio> <Radio value={2}>EduCoder服务器</Radio>
</Radio.Group> </Radio.Group>
<p className="mt30"><Button type="primary" onClick={()=>sureModal(type)}>下一步</Button></p> <p className="mt30"><Button type="primary" onClick={()=>sureModal(type)}>下一步</Button></p>
</div> </div>

View File

@ -20,13 +20,6 @@ function DivertModal({form , visible , onSuccess , onCancel,owner,repo}){
if(owner && repo && visible===true){ if(owner && repo && visible===true){
getTeam(); getTeam();
} }
if(!visible){
setFieldsValue({
owner_name:undefined,
identifier:undefined
})
setValue(undefined)
}
},[repo,owner,visible]) },[repo,owner,visible])
function getTeam(){ function getTeam(){
@ -46,12 +39,10 @@ function DivertModal({form , visible , onSuccess , onCancel,owner,repo}){
Axios.post(url,{ Axios.post(url,{
...values ...values
}).then(result=>{ }).then(result=>{
if(result){ if(result && result.data.id){
if(result.data.status === 0){ onSuccess(result.data && result.data.owner);
onSuccess(result.data && result.data.owner); }else{
}else{ onSuccess();
onSuccess();
}
} }
}).catch(error=>{}) }).catch(error=>{})
@ -130,7 +121,6 @@ function DivertModal({form , visible , onSuccess , onCancel,owner,repo}){
{getFieldDecorator("owner_name",{ {getFieldDecorator("owner_name",{
rules:[{required:true,message:"请输入目标用户名"}] rules:[{required:true,message:"请输入目标用户名"}]
})( })(
// <Input placeholder="" autoComplete={"off"}/>
<SearchUser getUser={getUser} width={"100%"} placeholder="请输入目标用户" value={value}/> <SearchUser getUser={getUser} width={"100%"} placeholder="请输入目标用户" value={value}/>
)} )}
</Form.Item> </Form.Item>
@ -156,11 +146,11 @@ function DivertModal({form , visible , onSuccess , onCancel,owner,repo}){
</Form.Item> </Form.Item>
} }
<Form.Item label="仓库标识:" style={{marginBottom:"0px"}}> <Form.Item label="仓库标识:">
{getFieldDecorator("identifier", {getFieldDecorator("identifier",
{ {
rules:[ rules:[
{required:true,message:"请输入仓库标识"}, {required:true,message:"请输入仓库标识"},
{ {
validator:checkIdentifier validator:checkIdentifier
} }

View File

@ -19,7 +19,7 @@ function Footer(){
return( return(
<div> <div>
<div style={{height:"497px"}}></div> <div style={{height:"810px"}}></div>
<div className="newFooter edu-txt-center"> <div className="newFooter edu-txt-center">
{value && showhtml(value)} {value && showhtml(value)}
{/* <div className="footerInfos"> {/* <div className="footerInfos">

View File

@ -80,6 +80,36 @@ class NewHeader extends Component {
} catch (e) {} } catch (e) {}
} }
SearchInput = (open,item)=>{
if(open){
return(
<div
onBlur={() => {
setTimeout(() => {
this.setState({
openSearch:false
})
}, 300)
}}
>
<Search placeholder="实践课程/教学课堂/实践项目/交流问答"
className={`search-input mr20`}
onSearch={(value)=>this.onGlobalSearch(value,item)}
autoFocus={true}
/>
</div>
)
}else{
return <i className="iconfont icon-sousuo font-18 color-white ml30" onClick={() => {
this.setState({openSearch:true})
}} />
}
}
onGlobalSearch=(value,item)=>{
window.location.href=`${item}?value=` + value;
}
openNotification = (messge) => { openNotification = (messge) => {
notification.open({ notification.open({
message: "提示", message: "提示",
@ -97,6 +127,26 @@ class NewHeader extends Component {
} }
} }
submitsubmitapplications = () => {
let {
submitapplicationssum,
submitapplicationsvaluedata
} = this.state;
this.setState({
submitapplications: false,
RadioGroupvalue: undefined
})
if (submitapplicationssum === 0) {
if (submitapplicationsvaluedata !== undefined) {
window.location.href = "/courses/" + submitapplicationsvaluedata;
}
} else if (submitapplicationssum === 1) {
if (submitapplicationsvaluedata !== undefined) {
window.location.href = "/projects/" + submitapplicationsvaluedata;
}
}
}
educoderlogin = () => { educoderlogin = () => {
//登录账号 //登录账号
this.setState({ this.setState({
@ -134,6 +184,24 @@ class NewHeader extends Component {
}) })
}; };
hidetojoinclass = () => {
this.setState({
tojoinclasstype: false,
tojoinitemtype: false,
tojoinclasstitle: undefined,
rolearr: ["", ""],
Checkboxteacherchecked: false,
Checkboxstudentchecked: false,
Checkboxteachingchecked: false,
Checkboxteachertype: false,
Checkboxteachingtype: false,
code_notice: false,
checked_notice: false,
RadioGroupvalue: undefined
})
}
// 关闭 // 关闭
cancelModulationModels = () => { cancelModulationModels = () => {
this.setState({ isRenders: false }) this.setState({ isRenders: false })
@ -278,7 +346,11 @@ class NewHeader extends Component {
render() { render() {
const { match} = this.props; const { match} = this.props;
let current_user = this.props.user; let current_user = this.props.user;
let { let { Addcoursestypes,
tojoinitemtype,
tojoinclasstitle,
code_notice,
checked_notice,
AccountProfiletype, AccountProfiletype,
user, user,
isRender, isRender,
@ -416,7 +488,7 @@ class NewHeader extends Component {
var wl = waiLian && waiLian.length>0; var wl = waiLian && waiLian.length>0;
return ( return (
<li key={key} onClick={() => this.headtypesonClick(item.link, true)} className={`${this.matchpaths(item.link) === true ? 'pr active' : 'pr'}`} style={!is_hidden ? { display: 'flex' } : { display: 'none' }}> <li key={key} onClick={() => this.headtypesonClick(item.link, true)} className={`${this.matchpaths(item.link) === true ? 'pr active' : 'pr'}`} style={!is_hidden ? { display: 'flex' } : { display: 'none' }}>
<a href={new_link} target={wl ? "_self":"_blank"}>{item.name}</a> <a href={new_link} target={wl ? "_self":"_blank"}><div dangerouslySetInnerHTML={{ __html: item.name }}></div></a>
</li> </li>
) )
}) })
@ -431,7 +503,7 @@ class NewHeader extends Component {
{ {
current_user && (current_user.main_site || current_user.login) && (settings && settings.add && settings.add.length>0)? current_user && (current_user.main_site || current_user.login) && (settings && settings.add && settings.add.length>0)?
<Dropdown overlay={this.addMenu(settings && settings.add)} placement="bottomRight"> <Dropdown overlay={this.addMenu(settings && settings.add)} placement="bottomRight">
<i className="iconfont icon-tianjiafangda color-grey-6 ml30"></i> <i className="iconfont icon-tianjiafangda color-white ml30"></i>
</Dropdown>:"" </Dropdown>:""
} }
@ -439,7 +511,7 @@ class NewHeader extends Component {
<div className="ml30 edu-menu-panel"> <div className="ml30 edu-menu-panel">
{user && user.login && {user && user.login &&
<a href={`${notice_url}`} style={{ position: 'relative' }}> <a href={`${notice_url}`} style={{ position: 'relative' }}>
<i className="iconfont icon-xiaoxilingdang color-grey-6"></i> <i className="iconfont icon-xiaoxilingdang color-white"></i>
<span className="newslight" style={{ display: this.props.Headertop === undefined ? "none" : this.props.Headertop.new_message === true ? "block" : "none" }}> <span className="newslight" style={{ display: this.props.Headertop === undefined ? "none" : this.props.Headertop.new_message === true ? "block" : "none" }}>
</span> </span>
</a> </a>
@ -449,10 +521,10 @@ class NewHeader extends Component {
</div> </div>
{!user || (user && !user.login) ? {!user || (user && !user.login) ?
<span className="font-15 ml30"> <span className="font-15 ml30">
<a onClick={() => this.educoderlogin()} className="mr5 color-grey-6">登录</a> <a onClick={() => this.educoderlogin()} className="mr5 color-white">登录</a>
{ {
settings && settings.common && settings.common.register && settings && settings.common && settings.common.register &&
<span><em className="vertical-line"></em><a className="ml5 color-grey-6" href={`${settings.common.register}`} target="_blank"></a></span> <span><em className="vertical-line"></em><a className="ml5 color-white" href={`${settings.common.register}`} target="_blank"></a></span>
} }
</span> </span>
: :

View File

@ -126,4 +126,56 @@
width: 110px; width: 110px;
text-align: right; text-align: right;
} }
}
.newFooter {
position: absolute;
bottom: 0;
width: 100%;
background: #323232;
clear: both;
min-width: 1200px;
z-index: 8;
left: 0px;
p {
margin-top: 0;
margin-bottom:0px !important;
}
.footerInfos{
display: flex;
max-width: 1200px;
margin:0px auto;
justify-content: space-around;
padding:60px 0px;
& >ul{
padding:0px 40px;
box-sizing: border-box;
max-width: 25%;
text-align: left;
li{
color: #fff;
font-weight: 300;
&:first-child{
font-size: 17px;
}
&>a,&>span{
color: #bbb;
}
&>a:hover{
color: #4cacff;
}
}
}
}
.footerCopy{
color: #bbb;
border-top: 1px solid #4e4e4e;
padding:10px 0px;
a{
color: #bbb;
&:hover{
color: #4cacff;
}
}
}
} }

BIN
src/forge/Images/banner.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

View File

@ -79,6 +79,12 @@ class Index extends Component {
<ProjectIndex {...this.props} {...props} /> <ProjectIndex {...this.props} {...props} />
)} )}
></Route> ></Route>
<Route
path="/"
render={(props) => (
<ProjectIndex {...this.props} {...props} />
)}
></Route>
</Switch> </Switch>
</div> </div>
); );

View File

@ -450,7 +450,7 @@ function CoderDepot(props){
(dirInfo && dirInfo.length === 0) && !fileInfo ? <Nodata _html="暂未发现文件"/> :"" (dirInfo && dirInfo.length === 0) && !fileInfo ? <Nodata _html="暂未发现文件"/> :""
} }
{/* readme文件显示(显示文件详情时不显示readme文件) */} {/* readme文件显示(显示文件详情时不显示readme文件) */}
{ dirInfo && (readme && readme.content) ? <ReadMe ChangeFile={ChangeFile} readme={readme} operate={props && (props.isManager || props.isDeveloper) && projectDetail.type !==2 } history={props.history} /> :"" } { dirInfo && (projectDetail && projectDetail.readme) ? <ReadMe ChangeFile={ChangeFile} readme={projectDetail && projectDetail.readme} operate={props && (props.isManager || props.isDeveloper) && projectDetail.type !==2 } history={props.history} /> :"" }
</div> </div>
</LongWidth> </LongWidth>
{ {

View File

@ -147,7 +147,7 @@ class CoderRootCommit extends Component{
<p className="f-wrap-alignCenter mt15"> <p className="f-wrap-alignCenter mt15">
{ {
item.id ? item.id ?
<Link to={`/${item.login}`} className="show-user-link"> <Link to={`/users/${item.login}`} className="show-user-link">
{item.image_url?<img src={getImageUrl(`/${item.image_url}`)} alt="" width="28px" height="28px" className="mr15 radius"/>:""} {item.image_url?<img src={getImageUrl(`/${item.image_url}`)} alt="" width="28px" height="28px" className="mr15 radius"/>:""}
<label className="font-14 color-grey-6" style={{verticalAlign:'middle'}}>{item.name ?`${item.name}:`:""}提交于 {item.time_from_now}</label> <label className="font-14 color-grey-6" style={{verticalAlign:'middle'}}>{item.name ?`${item.name}:`:""}提交于 {item.time_from_now}</label>
</Link>: </Link>:

View File

@ -345,7 +345,7 @@ class Index extends Component {
<div className="ProjectListIndex"> <div className="ProjectListIndex">
<div className="list-left"> <div className="list-left">
<ul className="list-l-Menu"> <ul className="list-l-Menu">
<li className="MenuTitle"><i className="iconfont icon-xiangmuleixing color-grey-9 font-15 mr5"></i></li> <li className="MenuTitle"><i className="iconfont icson-xiangmuleixing color-grey-9 font-15 mr5"></i></li>
{typeList} {typeList}
</ul> </ul>
<ul className="list-l-Menu"> <ul className="list-l-Menu">

View File

@ -1,10 +1,69 @@
.lineH2{line-height:2} .lineH2{line-height:2}
.t_project_banner { .subjectBanner {
/* height: 260px; height: 160px;
background: url(../Images/banner_list.jpg) no-repeat center; */ position: relative;
overflow: hidden;
background-color: #050d34; background-color: #050d34;
} }
.subjectleft{
margin-top: 40px;
display: -ms-flexbox;
display: flex;
-ms-flex-align: center;
align-items: center;
}
.bannerBox{
width: 1200px;
position: absolute;
z-index: 2;
left: 50%;
top: 0;
transform: translateX(-50%);
}
.subjectleft>span:first-child{
width: 140px;
height: 30px;
font-size: 30px;
font-weight: 600;
color: #fff;
line-height: 30px;
letter-spacing: 4px;
}
.subjectleft>span:last-child{
height: 16px;
font-size: 16px;
color: #fff;
line-height: 16px;
margin-left: 16px;
}
.subjectleft>span:last-child .words{
letter-spacing: 3px;
display: block;
margin-top: -6px;
margin-bottom: 2px!important;
}
.bannerBox > a{
display: inline-block;
width: 104px;
height: 30px;
line-height: 28px;
text-align: center;
border-radius: 4px;
border: 1px solid #666;
margin-right: 30px;
margin-top: 30px;
color: #fff;
cursor: pointer;
}
.bannerBox > a > i{
font-size: 14px!important;
display: inline-block;
margin-right: 10px;
}
.bannerBox > a > a{
color: #fff!important;
}
.ProjectListIndex{ .ProjectListIndex{
width: 1200px; width: 1200px;
margin:20px auto; margin:20px auto;

View File

@ -19,7 +19,7 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa
return( return(
<div className="f-wrap-between mt15"> <div className="f-wrap-between mt15">
{ {
menuName && projectDetail ? menuName && menuName.length> 0 && projectDetail ?
<ul className="headerMenu-wrapper"> <ul className="headerMenu-wrapper">
{ {
Array.isArray(menuName)&& menuName.map((item,key)=>{ Array.isArray(menuName)&& menuName.map((item,key)=>{
@ -49,7 +49,7 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa
<Tooltip title="易修是Issue的中文名即问题列表" placement="bottom"> <Tooltip title="易修是Issue的中文名即问题列表" placement="bottom">
<Link to={{ pathname: `/${owner}/${projectsId}/issues`, state }}> <Link to={{ pathname: `/${owner}/${projectsId}/issues`, state }}>
<i className={pathname==="issues" ? "iconfont icon-renwu color-grey-3 mr5 font-14":"iconfont icon-renwu color-grey-6 font-14 mr5"}></i> <i className={pathname==="issues" ? "iconfont icon-renwu color-grey-3 mr5 font-14":"iconfont icon-renwu color-grey-6 font-14 mr5"}></i>
<span>易修</span> <span>易修(Issue)</span>
{projectDetail && projectDetail.issues_count ? <span className="num">{projectDetail.issues_count}</span> : ""} {projectDetail && projectDetail.issues_count ? <span className="num">{projectDetail.issues_count}</span> : ""}
</Link> </Link>
</Tooltip> </Tooltip>
@ -65,7 +65,7 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa
</Link> </Link>
</li>:"" </li>:""
} }
{ {/* {
item.menu_name === "wiki" && item.menu_name === "wiki" &&
<li className={pathname === "wiki" ? "active" : ""}> <li className={pathname === "wiki" ? "active" : ""}>
<Link to={{ pathname: `/${owner}/${projectsId}/wiki`, state }}> <Link to={{ pathname: `/${owner}/${projectsId}/wiki`, state }}>
@ -73,7 +73,7 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa
<span>Wiki</span> <span>Wiki</span>
</Link> </Link>
</li> </li>
} } */}
{ {
item.menu_name === "devops" && platform ? item.menu_name === "devops" && platform ?
<li className={pathname==="devops" ? "active" : ""}> <li className={pathname==="devops" ? "active" : ""}>

View File

@ -102,7 +102,7 @@ class MergeSubmit extends Component{
<span className="f-wrap-alignCenter"> <span className="f-wrap-alignCenter">
<Link to={`/${item.login}`} className="show-user-link"> <Link to={`/${item.login}`} className="show-user-link">
<img src={getImageUrl(`/${item.image_url}`)} alt="" width="28px" height="28px" className="mr3 radius"/> <img src={getImageUrl(`/${item.image_url}`)} alt="" width="28px" height="28px" className="mr3 radius"/>
<label className="hide-1" style={{maxWidth:"75px",'vertical-align':'middle'}}>{text}</label> <label className="hide-1" style={{maxWidth:"75px",verticalAlign:'middle'}}>{text}</label>
</Link> </Link>
</span> </span>
), ),

View File

@ -209,8 +209,11 @@ class Index extends Component {
user_id:owners_id user_id:owners_id
}).then((result) => { }).then((result) => {
if (result && result.data.id) { if (result && result.data.id) {
this.setState({
isSpin: false
})
projectsType && projectsType !== "mirror" && this.props.showNotification(`托管项目创建成功!`); projectsType && projectsType !== "mirror" && this.props.showNotification(`托管项目创建成功!`);
this.props.history.push(`/${result.data.login}/${result.data.identifier}`); this.props.history.push(`/projects/${result.data.login}/${result.data.identifier}`);
} }
this.setState({ this.setState({
isSpin: false isSpin: false

View File

@ -22,6 +22,7 @@ function Index(props){
const username = props.match.params.username; const username = props.match.params.username;
const pathname = props.history.location.pathname; const pathname = props.history.location.pathname;
const user = props.user; const user = props.user;
const undo_messages = props.undo_messages;
const [ menu , setMenu ] = useState("notify"); const [ menu , setMenu ] = useState("notify");
const [ messagesCount , setMessagesCount ] = useState(0); const [ messagesCount , setMessagesCount ] = useState(0);

View File

@ -14,8 +14,24 @@ function Notify(props){
const [ isSpin , setIsSpin ] = useState(true); const [ isSpin , setIsSpin ] = useState(true);
useEffect(()=>{ useEffect(()=>{
props && props.deleteEvent("notify",0); if(username){
},[]) getList();
}
},[username,page])
function getList(){
const url = `/users/${username}/applied_messages.json`;
Axios.get(url,{
params:{
page,per_page:limit
}
}).then(result=>{
if(result){
setList(result.data.applied_messages);
setTotal(result.data.total_count);
}
}).catch(error=>{})
}
useEffect(()=>{ useEffect(()=>{
if(username){ if(username){
@ -71,6 +87,20 @@ function Notify(props){
} }
} }
function renderApplyStatus(status,applied) {
let { project } = applied;
if(status){
switch(status){
case 'successed':
return <p>已通过你加入<Link to={`/projects/${project && project.owner && project.owner.login}/${project && project.identifier}`}>{project && project.name}</Link>项目的申请</p>
default:
return <p>已拒绝你加入<Link to={`/projects/${project && project.owner && project.owner.login}/${project && project.identifier}`}>{project && project.name}</Link>项目的申请</p>
}
}else{
return ""
}
}
return( return(
<div> <div>
<Spin spinning={isSpin}> <Spin spinning={isSpin}>

View File

@ -14,6 +14,7 @@ function UndoEvent(props){
const [ total , setTotal ] = useState(0); const [ total , setTotal ] = useState(0);
const [ isSpin , setIsSpin ] = useState(true); const [ isSpin , setIsSpin ] = useState(true);
useEffect(()=>{ useEffect(()=>{
if(username){ if(username){
setIsSpin(true); setIsSpin(true);
@ -93,7 +94,7 @@ function UndoEvent(props){
i.status === "canceled" && <span className="color-grey-9">对方已取消转移</span> i.status === "canceled" && <span className="color-grey-9">对方已取消转移</span>
} }
{ {
i.status === "accepted" && <span className="color-grey-9">已接受</span> i.status === "accept" && <span className="color-grey-9">已接受</span>
} }
{ {
i.status === "refused" && <span className="color-grey-9">已拒绝</span> i.status === "refused" && <span className="color-grey-9">已拒绝</span>

View File

@ -14,7 +14,7 @@ const menu = [
{name:"代码库",index:"code"}, {name:"代码库",index:"code"},
{name:"易修 (Issue)",index:"issues"}, {name:"易修 (Issue)",index:"issues"},
{name:"合并请求",index:"pulls"}, {name:"合并请求",index:"pulls"},
{name:"Wiki",index:"wiki"}, // {name:"Wiki",index:"wiki"},
{name:"工作流(beta版)",index:"devops"}, {name:"工作流(beta版)",index:"devops"},
// {name:"资源库",index:"resources"}, // {name:"资源库",index:"resources"},
{name:"里程碑",index:"versions"}, {name:"里程碑",index:"versions"},
@ -31,7 +31,8 @@ class Setting extends Component {
project_units:['home',"activity","code"], project_units:['home',"activity","code"],
divertVisible:false, divertVisible:false,
is_transfering:undefined, is_transfering:undefined,
projectName:undefined projectName:undefined,
permission:undefined
}; };
} }
@ -241,6 +242,7 @@ class Setting extends Component {
let mirror = projectDetail && projectDetail.mirror; let mirror = projectDetail && projectDetail.mirror;
let type = projectDetail && projectDetail.type; let type = projectDetail && projectDetail.type;
const forked_from_project_id = this.props && this.props.projectDetail && this.props.projectDetail.forked_from_project_id; const forked_from_project_id = this.props && this.props.projectDetail && this.props.projectDetail.forked_from_project_id;
return ( return (
<div> <div>
<DivertModal <DivertModal

View File

@ -1,18 +1,17 @@
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import './Index.scss'; import './Index.scss';
import { AlignCenter, Blueback , FlexAJ } from '../Component/layout'; import { Blueback , FlexAJ } from '../Component/layout';
import { Dropdown, Input , Menu , Pagination, Spin , Popconfirm, Button } from 'antd'; import { Dropdown, Input , Menu , Pagination } from 'antd';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import UploadSource from './UploadSource'; import UploadSource from './UploadSource';
import AddTag from './AddTag';
import { getImageUrl } from 'educoder'; import { getImageUrl } from 'educoder';
import Nodata from '../Nodata';
import axios from 'axios'; import axios from 'axios';
const { Search } = Input; const { Search } = Input;
const sort = [ const sort = [
"按上传时间排序", "按上传时间排序",
"按下载次数排序" "按下载次数排序",
"按引用排序"
] ]
const limit = 15; const limit = 15;
const https = 'https://testfiles.trustie.net'; const https = 'https://testfiles.trustie.net';
@ -22,22 +21,13 @@ function Index(props){
const [ total , setTotal ] = useState(0); const [ total , setTotal ] = useState(0);
const [ search , setSearch ] = useState(undefined); const [ search , setSearch ] = useState(undefined);
const [ data , setData ] = useState(undefined); const [ data , setData ] = useState(undefined);
const [ isSpin , setIsSpin ] = useState(true);
const [ error , setError ] = useState(false);
const [ attachments , setAttachments ] = useState(undefined);
const [ id , setId ] = useState(undefined);
const [ visible , setVisible ] = useState(false); const [ visible , setVisible ] = useState(false);
const [ addVisible , setAddVisible ] = useState(false);
const repo_id = props.projectDetail && props.projectDetail.repo_id; const repo_id = props.projectDetail && props.projectDetail.repo_id;
const owner = props.match.params.owner; const owner = props.match.params.owner;
const current_user = props.current_user;
useEffect(()=>{ useEffect(()=>{
if(owner && repo_id){ if(owner && repo_id){
setIsSpin(true);
getData(); getData();
} }
},[repo_id,owner,search,sortValue,page]) },[repo_id,owner,search,sortValue,page])
@ -56,10 +46,8 @@ function Index(props){
if(result && result.data){ if(result && result.data){
setData(result.data.data.rows); setData(result.data.data.rows);
setTotal(result.data.data.total); setTotal(result.data.data.total);
setIsSpin(false);
setError(false);
} }
}).catch(error=>{setIsSpin(false);setError(true);}) }).catch(error=>{})
} }
// //
@ -85,99 +73,26 @@ function Index(props){
</Menu> </Menu>
) )
function listmenu(id,attachments,isPublic){ const listmenu=(
return( <Menu>
<Menu> <Menu.Item>更新版本</Menu.Item>
<Menu.Item onClick={()=>{setId(id);setVisible(true);setAttachments(attachments)}}>更新版本</Menu.Item> <Menu.Item>设为私有</Menu.Item>
<Menu.Item onClick={()=>changeStatus(id,isPublic===1?0:1)}>{isPublic === 1 ? "设为私有":"设为公开"}</Menu.Item> <Menu.Item>删除资源</Menu.Item>
<Menu.Item onClick={()=>deleteSourceFunc(id)}>删除资源</Menu.Item> </Menu>
</Menu> )
)
}
//
function changeStatus(id,isPublic){
const url = https+`/api/project/achievement/updateStatus`;
axios.put(url,{
id,status:isPublic
}).then(result=>{
if(result && result.data){
props.showNotification(`资源${isPublic === 1 ? "设为公开":"设为私有"}成功!`);
setIsSpin(true);
getData();
}
}).catch({})
}
//
function deleteSourceFunc(id){
props.confirm({
content: "是否确认删除所选资源文件?",
onOk: () => {
const url = https + `/api/project/achievement/${id}`;
axios.delete(url).then(result=>{
if(result && result.data && result.data.code === "1"){
props.showNotification("资源删除成功");
setIsSpin(true);
getData();
}
})
}
})
}
// //
function onOk(){ function onOk(){
setVisible(false);
setIsSpin(true);
getData(); getData();
} }
// //
function removeTagFunc(id,tag){ function removeTagFunc(){
const url = https + `/api/project/achievement/deleteTag`;
axios.delete(url,{
params:{id,tagName:tag}
}).then(result=>{
if(result && result.data){
props.showNotification("标签删除成功");
setIsSpin(true);
getData();
}
}).then(error=>{})
}
function addPanel(id){
setAddVisible(true);
setId(id);
}
function onCancelAdd(){
setId(undefined);
setAddVisible(false);
}
//
function sureAddTag(values){
const url = https+`/api/project/achievement/addTag?id=`+id+`&tagName=`+values.tagName;
axios.put(url).then(result=>{
if(result){
setId(undefined);
setAddVisible(false);
setIsSpin(true);
getData();
}
})
} }
return( return(
<div className="sourcePanel"> <div className="sourcePanel">
<AddTag
visible={addVisible}
onCancel={onCancelAdd}
onOk={sureAddTag}
/>
<UploadSource <UploadSource
visible={visible} visible={visible}
onCancel={()=>setVisible(false)} onCancel={()=>setVisible(false)}
@ -185,15 +100,11 @@ function Index(props){
showNotification={props.showNotification} showNotification={props.showNotification}
owner={owner} owner={owner}
projectsId={repo_id} projectsId={repo_id}
id={id}
attachments={attachments}
/> />
<div className="headtitle"> <div className="headtitle">
<FlexAJ> <FlexAJ>
<span className="font-18">资源库{total ? <span>({total})</span>:""}</span> <span className="font-18">资源库(18)</span>
{ current_user && current_user.login && (props.projectDetail && props.projectDetail.permission) ? <Blueback onClick={()=>setVisible(true)}>上传资源</Blueback>
<Blueback onClick={()=>{setId(undefined);setVisible(true);}}>上传资源</Blueback>:""
}
</FlexAJ> </FlexAJ>
</div> </div>
<FlexAJ className="subHeadtitle"> <FlexAJ className="subHeadtitle">
@ -208,65 +119,43 @@ function Index(props){
<span className="color-grey-9">{sort[sortValue]}<i className="iconfont icon-sanjiaoxing-down font-16 color-grey-9 ml3"></i></span> <span className="color-grey-9">{sort[sortValue]}<i className="iconfont icon-sanjiaoxing-down font-16 color-grey-9 ml3"></i></span>
</Dropdown> </Dropdown>
</FlexAJ> </FlexAJ>
<Spin spinning={isSpin}> <div className="bodycontent">
<div className="bodycontent"> <ul className="bodycontentul">
{ {
data && data.length> 0 && data && data.length> 0 && data.map((item,key)=>{
<ul className="bodycontentul"> return(
{ <li>
data.map((item,key)=>{ <Link to= {`/users/${item.login}`} className="infoImg"><img src={getImageUrl(`${item.imageUrl}`)} alt="" /></Link>
return( <div style={{flex:'1',width:"0"}}>
<li> <FlexAJ>
<Link to= {`/${item.login}`} className="infoImg"><img src={getImageUrl(`/${item.imageUrl}`)} alt="" /></Link> <a href={``} className="infoname">{item.fileName}</a>
<div style={{flex:'1',width:"0"}}> <Dropdown overlay={listmenu} placement={'bottomRight'}>
<FlexAJ> <i className="iconfont icon-gengduo1 color-grey-6"></i>
<AlignCenter> </Dropdown>
<a href={https+`/busiAttachments/download/${item.attachId}`} download className="infoname">{item.fileName}</a> </FlexAJ>
<a href={https + `/busiAttachments/view/${item.attachId}`}><i className="iconfont icon-shenqinggongkai font-15 ml10 color-grey-9"></i></a> <p className="infos">
{item.isPublic === 0 && <span className="privateTip">私有</span>} <span>上传时间<span>{item.uploadTime}</span></span>
</AlignCenter> <span>文件大小<span>{item.fileSize}</span></span>
{ current_user && current_user.login && <span>下载<span>{item.download}</span></span>
<Dropdown overlay={()=>listmenu(item.id,item.attachments,item.isPublic)} placement={'bottomRight'}> </p>
<i className="iconfont icon-gengduo1 color-grey-6"></i> <p className="infodesc task-hide-2">{item.remark}</p>
</Dropdown> { item.tags && item.tags.length>0 &&
}
</FlexAJ>
<p className="infos">
<span>上传时间<span>{item.uploadTime}</span></span>
<span>文件大小<span>{item.fileSize}</span></span>
<span>下载<span>{item.download}</span></span>
</p>
<p className="infodesc task-hide-2">{item.remark}</p>
<div className="infotag"> <div className="infotag">
{ {
item.tags && item.tags.length>0 && item.tags.map((i,k)=>{ item.tags.map((i,k)=>{
return( return(
<span>{i} <span>{i}<i className="iconfont icon-guanbi font-12 ml2" onClick={removeTagFunc}></i></span>
{
current_user && (current_user.login === item.login) ?
<Popconfirm title="确定要删除当前标签?" onConfirm={()=>removeTagFunc(item.id,i)} okText="是" cancelText="否">
<i className="iconfont icon-guanbi font-12 ml2"></i>
</Popconfirm>:""
}
</span>
) )
}) })
} }
{
current_user && (current_user.login === item.login) &&
<a className="color-blue font-12" onClick={()=>addPanel(item.id)} style={{height:"20px",lineHeight:"20px"}}>+新增标签</a>
}
</div> </div>
</div> }
</li> </div>
) </li>
}) )
} })
</ul> }
} </ul>
{
((data && data.length === 0) || error) && <Nodata _html="暂无数据"/>
}
{ {
total > limit && total > limit &&
<div className="pt20 pb20 edu-txt-center"> <div className="pt20 pb20 edu-txt-center">
@ -280,7 +169,6 @@ function Index(props){
</div> </div>
} }
</div> </div>
</Spin>
</div> </div>
) )
} }

View File

@ -21,7 +21,6 @@
} }
.bodycontent{ .bodycontent{
padding:0px 20px; padding:0px 20px;
min-height: 500px;
& > ul.bodycontentul > li{ & > ul.bodycontentul > li{
display: flex; display: flex;
border-bottom: 1px solid #eee; border-bottom: 1px solid #eee;
@ -41,16 +40,6 @@
.infoname{ .infoname{
font-size: 16px; font-size: 16px;
} }
.privateTip{
display: block;
font-size: 12px;
margin-left: 10px;
background-color: orange;
height: 18px;
line-height: 18px;
padding:0px 3px;
color: #fff;
}
.infos{ .infos{
& > span{ & > span{
margin-right: 20px; margin-right: 20px;
@ -84,26 +73,4 @@
} }
} }
} }
}
.versionTable{
.currentTip{
display: block;
padding:0px 3px;
border-radius: 2px;
border:1px solid #68c7ec;
font-size: 12px;
color: #68c7ec;
height: 18px;
line-height: 18px;
margin-left: 5px;
}
.ant-table-body{
margin:0px!important;
thead{
background-color: #eee;
}
thead >tr >th,tbody > tr > td{
padding:4px 5px!important;
}
}
} }

View File

@ -79,4 +79,4 @@ function Uploads({ className , size , actionUrl,fileList,showNotification , load
</Upload> </Upload>
) )
} }
export default Uploads; export default Uploads;

View File

@ -5,18 +5,18 @@ import { AlignCenter } from '../Component/layout';
import axios from 'axios'; import axios from 'axios';
const { TextArea } = Input; const { TextArea } = Input;
const data = [
{name:"sdfkjsfj.pdf",loadNum:"10",citeNum:"15",time:"2021-04-01 10:45"},
{name:"sdfkjsfj.pdf",loadNum:"10",citeNum:"15",time:"2021-04-01 10:45"},
{name:"sdfkjsfj.pdf",loadNum:"10",citeNum:"15",time:"2021-04-01 10:45"}
]
const https = 'https://testfiles.trustie.net'; const https = 'https://testfiles.trustie.net';
function UploadSource({ form , visible , onCancel , onOk , showNotification , attachments , id ,owner,projectsId}){ function UploadSource({ form , visible , onCancel , onOk , showNotification ,owner,projectsId}){
const [ tableData , setTableData ] = useState(undefined); const [ tableData , setTableData ] = useState(data);
const [ fileId , setFilesId ] = useState(undefined); const [ fileId , setFilesId ] = useState(undefined);
const [ fileName , setFileName ] = useState(undefined); const [ fileName , setFileName ] = useState(undefined);
const { getFieldDecorator, validateFields , setFieldsValue } = form; const { getFieldDecorator, validateFields , setFieldsValue } = form;
useEffect(()=>{
if(id && attachments){
setTableData(attachments);
}
},[id,attachments])
// id // id
function UploadFunc(id,name){ function UploadFunc(id,name){
setFilesId(id); setFilesId(id);
@ -25,36 +25,37 @@ function UploadSource({ form , visible , onCancel , onOk , showNotification , at
const columns = [ const columns = [
{ {
dataIndex:"fileName", dataIndex:"name",
key:"fileName", key:"name",
title:"资源名称", title:"资源名称",
width:"42%", width:"45%",
ellipsis:true, ellipsis:true,
render:(value,item,key)=>{ render:(value,item,key)=>{
return <AlignCenter> return <AlignCenter>
<div className="task-hide" style={{maxWidth:key===0 ? "240px":"100%"}}>{value}</div> <div className="task-hide" style={{maxWidth:key===0 ? "250px":"100%"}}>{value}</div>
{ key === 0 && <span className="currentTip">当前版本</span> } { key === 0 && <span className="currentTip">当前版本</span> }
</AlignCenter> </AlignCenter>
} }
}, },
{ {
dataIndex:"downloads", dataIndex:"loadNum",
key:"downloads", key:"loadNum",
title:"下载数", title:"下载数",
width:"14%", width:"15%",
className:"edu-txt-center" className:"edu-txt-center"
}, },
{ {
dataIndex:"fileSizeString", dataIndex:"citeNum",
key:"fileSizeString", key:"citeNum",
title:"文件大小", title:"引用数",
width:"16%", width:"15%",
className:"edu-txt-center" className:"edu-txt-center"
}, },
{ {
dataIndex:"createdAt", dataIndex:"time",
key:"createdAt", key:"time",
title:"上传时间", title:"上传时间",
width:"25%"
} }
] ]
@ -73,35 +74,22 @@ function UploadSource({ form , visible , onCancel , onOk , showNotification , at
function postInfo(values){ function postInfo(values){
const url = https+`/api/project/achievement/`; const url = https+`/api/project/achievement/`;
if(id){
//
axios.put(url,{
id,fileName,fileId:`${fileId}`,
remark:values.remark
}).then(result=>{
if(result && result.data){
onOk();
}
}).catch(error=>{})
}else{
//
axios.post(url,{
fileId:`${fileId}`,
fileName,
login:owner,
projectId:projectsId,
...values
}).then(result=>{
if(result && result.data){
onOk();
}
}).catch(error=>{})
}
axios.post(url,{
fileId:`${fileId}`,
fileName,
login:owner,
projectId:projectsId,
...values
}).then(result=>{
if(result && result.data){
onOk();
}
}).catch(error=>{})
} }
return( return(
<Modal <Modal
title={id?"更新资源版本":"上传资源"} title={"上传资源"}
closable={false} closable={false}
visible={visible} visible={visible}
onCancel={onCancel} onCancel={onCancel}
@ -113,8 +101,8 @@ function UploadSource({ form , visible , onCancel , onOk , showNotification , at
> >
<div> <div>
<Form> <Form>
{id && <Table className="versionTable mb20" columns={columns} dataSource={tableData} pagination={false} size={"small"}/> } <Table className="versionTable" columns={columns} dataSource={tableData} pagination={false} size={"small"}/>
<Form.Item style={{display:id?"none":"block"}}> <Form.Item>
{getFieldDecorator("tagNames",{ {getFieldDecorator("tagNames",{
rules:[] rules:[]
})( })(
@ -147,4 +135,4 @@ function UploadSource({ form , visible , onCancel , onOk , showNotification , at
</Modal> </Modal>
) )
} }
export default Form.create()(forwardRef(UploadSource));; export default UploadSource;

View File

@ -225,7 +225,7 @@ export default Form.create()(
[], [],
<Checkbox checked={check_box} onChange={change_check_box_status} style={OptionStyle}>新建项目<span className="color-grey-8 ml10">(成员可以在组织中新建项目创建者将自动获得新建的项目的管理员权限)</span></Checkbox>, false, 20,onwers ? "hide":"" <Checkbox checked={check_box} onChange={change_check_box_status} style={OptionStyle}>新建项目<span className="color-grey-8 ml10">(成员可以在组织中新建项目创建者将自动获得新建的项目的管理员权限)</span></Checkbox>, false, 20,onwers ? "hide":""
)} )}
{helper( {/* {helper(
'版本库权限:', '版本库权限:',
"authorize", "authorize",
[], [],
@ -234,7 +234,7 @@ export default Form.create()(
<Radio value="write" style={addStyle}>写入权限<span className="color-grey-8 ml10">(成员可以查看和推送提交到团队项目)</span></Radio> <Radio value="write" style={addStyle}>写入权限<span className="color-grey-8 ml10">(成员可以查看和推送提交到团队项目)</span></Radio>
<Radio value="admin" style={OptionStyle}>管理员权限<span className="color-grey-8 ml10">(成员可以拉取和推送到团队项目同时可以添加协作者)</span></Radio> <Radio value="admin" style={OptionStyle}>管理员权限<span className="color-grey-8 ml10">(成员可以拉取和推送到团队项目同时可以添加协作者)</span></Radio>
</Radio.Group>, false, 20,onwers ? "hide":"" </Radio.Group>, false, 20,onwers ? "hide":""
)} )} */}
</Form> </Form>
{/* <div className={(auth!=="owner" && auth !=="admin") ? "" :"hide"}> {/* <div className={(auth!=="owner" && auth !=="admin") ? "" :"hide"}>
<p className="required">允许访问项目单元</p> <p className="required">允许访问项目单元</p>

View File

@ -217,7 +217,6 @@ export default (props) => {
<Button type="default" className="ml10">导出<Icon type="caret-down" /></Button> <Button type="default" className="ml10">导出<Icon type="caret-down" /></Button>
</Dropdown> </Dropdown>
<Button type="default" className="ml10" onClick={preview}>预览</Button> <Button type="default" className="ml10" onClick={preview}>预览</Button>
</div> </div>
</div> </div>

View File

@ -0,0 +1,56 @@
.delete-modal {
.ant-modal-header {
padding: 9px 24px;
background: #f8f8f8;
border-bottom: 1px solid #eee;
}
.ant-modal-title {
text-align: left;
}
.ant-modal-close {
top: 0px !important;
}
.ant-modal-close-x {
font-size: 24px;
}
.ant-modal-body {
text-align: center;
}
.delete-title {
display: flex;
justify-content: center;
align-items: center;
margin: 2rem 0 1rem !important;
font-size: 16px;
color: #333;
letter-spacing: 0;
line-height: 29px;
font-weight: 400;
}
.red-circle {
align-self: flex-start;
color: #ca0002;
font-size: 1.5rem !important;
}
.delete-descibe {
font-size: 14px;
color: #666;
line-height: 33px;
font-weight: 400;
}
.ant-modal-footer {
padding: 2rem 0;
text-align: center;
border: 0;
.ant-btn {
width: 6rem;
}
}
.foot-submit {
margin-left: 3rem;
color: #df0002;
&:hover {
border-color: #df0002;
}
}
}

View File

@ -12,7 +12,7 @@ if (window.location.href.indexOf('localhost') > -1) {
actionUrl = "https://test-search.trustie.net"; actionUrl = "https://test-search.trustie.net";
// actionUrl = 'https://testforgeplus.trustie.net'; // actionUrl = 'https://testforgeplus.trustie.net';
axios.defaults.withCredentials = true; axios.defaults.withCredentials = true;
}else if (window.location.href.indexOf('forgeplus') > -1) { }else if (window.location.href.indexOf('wiki-api') > -1) {
actionUrl = "https://wiki-api.trustie.net"; actionUrl = "https://wiki-api.trustie.net";
axios.defaults.withCredentials = true; axios.defaults.withCredentials = true;
} }

View File

@ -13,8 +13,10 @@ function Cloud({data}) {
var div = new Js2WordCloud(document.getElementById('cloud')) var div = new Js2WordCloud(document.getElementById('cloud'))
let textList= d.categories; let textList= d.categories;
let cyList=[] let cyList=[]
for(let i=0;i<textList.length;i++){ if(textList && textList.length > 0){
cyList.push([textList[i],textList.length-i]) for(let i=0;i<textList.length;i++){
cyList.push([textList[i],textList.length-i]);
}
} }
div.setOption({ div.setOption({
backgroundColor:'transparent', backgroundColor:'transparent',

View File

@ -16,12 +16,14 @@ function ConcentrateBox({ visible , onCancel , onSure , username , choosed , his
const [ value , setValue ]= useState([]); const [ value , setValue ]= useState([]);
const [ isSpin , setIsSpin ]= useState(true); const [ isSpin , setIsSpin ]= useState(true);
const [ disable , setDisable ] = useState(false); const [ disable , setDisable ] = useState(false);
const [ loadCount , setLoadCount ] = useState(0);
const [ copyList , setCopyList ] = useState([]); const [ copyList , setCopyList ] = useState([]);
const [ copyAllList , setCopyAllList ] = useState([]); const [ copyAllList , setCopyAllList ] = useState([]);
useEffect(()=>{ useEffect(()=>{
if(visible){ if(visible && loadCount === 0){
setLoadCount(loadCount+1);
setIsSpin(true); setIsSpin(true);
getProjectList(); getProjectList();
}else{ }else{

View File

@ -133,12 +133,7 @@ class Infos extends Component {
undo_events:e undo_events:e
}); });
}) })
.catch((error) => { }
this.setState({
isSpin: false,
});
});
};
change_devops_type=(type)=>{ change_devops_type=(type)=>{
const {user} = this.state; const {user} = this.state;
@ -194,7 +189,7 @@ class Infos extends Component {
render() { render() {
const { current_user } = this.props; const { current_user } = this.props;
const { username } = this.props.match.params; const { username } = this.props.match.params;
const { user, isSpin, route_type , undo_events , menuKey } = this.state; const { user, isSpin, route_type , undo_events , menuKey , project_type } = this.state;
return ( return (
<div className="newMain clearfix"> <div className="newMain clearfix">
<Spin spinning={isSpin}> <Spin spinning={isSpin}>
@ -207,14 +202,14 @@ class Infos extends Component {
<span> <span>
{ {
user && user.gender===1? user && user.gender===1?
<i className="iconfont icon-nan1"></i> <i className="iconfont icon-nan"></i>
: :
<i className="iconfont icon-nv1"></i> <i className="iconfont icon-nv"></i>
} }
</span> </span>
</span> </span>
<div className="text-center mt15 font-24 task-hide" title={user && user.username}> <div className="text-center mt15 font-16 fwb">
{user && user.username} {user && user.username}
</div> </div>
<div className="userDescription"> <div className="userDescription">
@ -277,6 +272,97 @@ class Infos extends Component {
} }
</div> </div>
</div> </div>
{current_user && user && user.login === current_user.login ? (
<div className="bgcF">
<div className="list-l-Menu">
<li className={project_type && project_type === "notice" ? "active" : ""}>
<p onClick={() => this.undo_link()}>
<span className="font-16 color-grey-3">
<i className="iconfont icon-dahuizhongzuo3x font-15 mr5"></i>
待办事项
</span>
<span className="text-yellow font-16">
{user.undo_events}
</span>
</p>
</li>
</div>
</div>
):""}
<div className="bgcF">
<ul className="list-l-Menu">
<li className="MenuTitle" onClick={() => this.change_project_type(undefined)}>
<i className="iconfont icon-xiangmuleixing font-15 mr5"></i>
项目类型
<i className="iconfont icon-youjiantou font-15 mr20 color-grey-9 pull-right"></i>
</li>
<li className={project_type && project_type === "common" ? "active" : ""} onClick={() => this.change_project_type("common")}>
<p>
<span className="font-16">开源托管项目</span>
<span className="color-blue">
{user && user.common_projects_count}
</span>
</p>
</li>
<li className={project_type && project_type === "mirror" ? "active" : ""} onClick={() => this.change_project_type("mirror")}>
<p>
<span className="font-16">开源镜像项目</span>
<span className="color-blue">
{user && user.mirror_projects_count}
</span>
</p>
</li>
<li className={project_type && project_type === "sync_mirror" ? "active" : ""} onClick={() => this.change_project_type("sync_mirror")}>
<p>
<span className="font-16">镜像托管项目</span>
<span className="color-blue">
{user && user.sync_mirror_projects_count}
</span>
</p>
</li>
</ul>
</div>
{
current_user && current_user.login && current_user.login === username &&
<div className="bgcF">
<ul className="list-l-Menu">
<li className="MenuTitle">
<i className="iconfont icon-gongzuoliu font-15 mr5"></i>
DevOps工作流
<i className="iconfont icon-youjiantou font-15 mr20 color-grey-9 pull-right"></i>
</li>
<li className={project_type && project_type === "CIService" ? "active" : ""} onClick={() => this.change_devops_type("CIService")}>
<p>
<span className="font-16 color-grey-3">CI服务</span>
</p>
</li>
{/* <li className={project_type && project_type === "CDService" ? "active" : ""} onClick={() => this.change_devops_type("CDService")}>
<p>
<span className="font-16">CD服务</span>
<span className="color-blue">
{user && user.common_projects_count}
</span>
</p>
</li> */}
</ul>
</div>
}
<div className="bgcF">
<div className="list-l-Menu">
<li className={project_type && project_type === "organizes" ? "active" : ""}>
<p onClick={() => this.organize_link()} >
<span className="font-16 color-grey-3">
<i className="iconfont icon-itsm-liuchengguanli font-15 mr5"></i>
组织
</span>
<span className="color-blue font-16">
{user && user.user_org_count}
</span>
</p>
</li>
</div>
</div>
</div> </div>
<div className="list-right"> <div className="list-right">
{ !route_type && menuKey && { !route_type && menuKey &&

View File

@ -143,18 +143,18 @@ function Index(props) {
topThree && topThree.length > 0 && topThree && topThree.length > 0 &&
<div className="roundBox"> <div className="roundBox">
<Round num={topThree[0][1]} color="#FF7F69" name={topThree[0][0]}/> <Round num={topThree[0][1]} color="#FF7F69" name={topThree[0][0]}/>
{ topThree[1] && <Round num={topThree[1][1]} color="#99dfff" name={topThree[1][0]}/> } <Round num={topThree[1][1]} color="#99dfff" name={topThree[1][0]}/>
{ topThree[2] && <Round num={topThree[2][1]} color="#ff9e48" name={topThree[2][0]}/> } <Round num={topThree[2][1]} color="#ff9e48" name={topThree[2][0]}/>
</div> </div>
} }
{ {
percentData && percentData &&
<div className="pBox"> <div className="pBox">
<div className="progress"> <div class="progress">
{ {
percentData.map((i,k)=>{ percentData.map((i,k)=>{
return( return(
<span key={i.name} style={{width: `${i.p}%`, backgroundColor:`${i.color}`}}></span> <span style={{width: `${i.p}%`, backgroundColor:`${i.color}`}}></span>
) )
}) })
} }
@ -163,8 +163,8 @@ function Index(props) {
{ {
percentData.map((i,k)=>{ percentData.map((i,k)=>{
return( return(
<span key={i.name}> <span>
<i className="zero" style={{backgroundColor: `${i.color}`}}></i><span>{i.name}</span> <i class="zero" style={{backgroundColor: `${i.color}`}}></i><span>{i.name}</span>
<span>{`${i.p}%`}</span> <span>{`${i.p}%`}</span>
</span> </span>
) )

BIN
src/images/login/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@ -1,11 +1,11 @@
import React, {Component} from "react"; import React, { Component } from "react";
import moment from 'moment'; import moment from 'moment';
import { getImageUrl } from 'educoder'; import { getImageUrl } from 'educoder';
import '../courses/css/members.css'; import '../courses/css/members.css';
import "../courses/common/formCommon.css"; import "../courses/common/formCommon.css";
import '../courses/css/Courses.css'; import '../courses/css/Courses.css';
import beijintulogontwo from '../../../src/images/login/beijintulogontwo.png'; import beijintulogontwo from '../../../src/images/login/beijintulogontwo.png';
import educodernet from '../../../src/images/login/educodernet.png'; import educodernet from '../../../src/images/login/logo.png';
import LoginRegisterComponent from '../user/LoginRegisterComponent'; import LoginRegisterComponent from '../user/LoginRegisterComponent';
import FindPasswordComponent from '../user/FindPasswordComponent'; import FindPasswordComponent from '../user/FindPasswordComponent';
//educoder登入页面 //educoder登入页面
@ -94,84 +94,39 @@ class EducoderLogin extends Component {
render() { render() {
let {showbool,loginstatus,logini} = this.state; let { showbool } = this.state;
const { settings } = this.props;
return ( return (
<div style={newContainer} className=" clearfix" > <div style={newContainer} className=" clearfix" >
<div style={{"justify-content": "center","align-items": "center","width": "100%",textAlign:"center"}}>
<div > <div style={{cursor:"pointer"}}>
<div style={{ {
"display": "flex", settings && settings.login_logo_url ?
"justify-content": "center", <img style={{cursor:"pointer"}} alt="" onClick={()=>this.gohome()} width="80px" src={getImageUrl(settings.login_logo_url)}/>
"align-items": "center", :
"width": "100%" <img style={{cursor:"pointer"}} alt="" onClick={()=>this.gohome()} src={educodernet} width="80px"/>
}}> }
<div style={{cursor:"pointer"}}>
{this.props.mygetHelmetapi === null ? ""
:
this.props.mygetHelmetapi===undefined||this.props.mygetHelmetapi.login_logo_url===null|| this.props.mygetHelmetapi.login_logo_url===undefined?
<img style={{cursor:"pointer"}} onClick={()=>this.gohome()} src={educodernet}/>
:
<img style={{cursor:"pointer"}} onClick={()=>this.gohome()} src={getImageUrl(this.props.mygetHelmetapi.login_logo_url)}/>
}
</div>
</div> </div>
{ {
showbool === 1 ? showbool === 1 ?
<div style={{ <div style={{
display: "flex", display: "flex",
justifyContent: "center", justifyContent: "center",
width: "100%", width: "100%",
marginTop: "25px", marginTop: "25px",
}}> }}>
<div> <div>
<LoginRegisterComponent {...this.props} {...this.state} Setshowbool={(e)=>this.Setshowbool(e)} ></LoginRegisterComponent>
<LoginRegisterComponent {...this.props} {...this.state}
Setshowbool={(e)=>this.Setshowbool(e)} ></LoginRegisterComponent>
</div>
</div> </div>
</div>
: :
<div style={{ <div style={{display: "flex",justifyContent: "center",width: "100%",marginTop: "25px",}}>
display: "flex", <div>
justifyContent: "center", <FindPasswordComponent {...this.props} {...this.state} Setshowbool={(e)=>this.Setshowbool(e)}></FindPasswordComponent>
width: "100%", </div>
marginTop: "25px", </div>
}}>
<div >
<FindPasswordComponent {...this.props} {...this.state}
Setshowbool={(e)=>this.Setshowbool(e)}></FindPasswordComponent>
</div>
</div>
} }
{this.props.mygetHelmetapi === null ? <div style={{ <div className="font-14 color-grey-9 " style={{marginTop:"20px"}}><span className="font-18">©</span>&nbsp;{moment().year()}&nbsp;EduCoder<span className="ml15 mr15">ICP17009477</span><a href="https://team.trustie.net" style={{"color":"#888"}} target="_blank">Trustie</a>&nbsp;&nbsp;&nbsp;&amp;&nbsp;&nbsp;&nbsp;IntelliDE inside.</div>
display: "flex",
justifyContent: "center",
width: "100%",
}}>
<div className="font-14 color-grey-9 " style={{marginTop:"20px"}}><span className="font-18">©</span>&nbsp;{moment().year()}&nbsp;EduCoder<span className="ml15 mr15">ICP17009477</span><a href="https://team.trustie.net" style={{"color":"#888"}} target="_blank">Trustie</a>&nbsp;&nbsp;&nbsp;&amp;&nbsp;&nbsp;&nbsp;IntelliDE inside.</div>
</div>:
this.props.mygetHelmetapi===undefined||this.props.mygetHelmetapi.main_site===null|| this.props.mygetHelmetapi.main_site===undefined? <div style={{
display: "flex",
justifyContent: "center",
width: "100%",
}}>
<div className="font-14 color-grey-9 " style={{marginTop:"20px"}}><span className="font-18">©</span>&nbsp;{moment().year()}&nbsp;EduCoder<span className="ml15 mr15">ICP17009477</span><a href="https://team.trustie.net" style={{"color":"#888"}} target="_blank">Trustie</a>&nbsp;&nbsp;&nbsp;&amp;&nbsp;&nbsp;&nbsp;IntelliDE inside.</div>
</div>:this.props.mygetHelmetapi.main_site===true?
<div style={{
display: "flex",
justifyContent: "center",
width: "100%",
}}>
<div className="font-14 color-grey-9 " style={{marginTop:"20px"}}><span className="font-18">©</span>&nbsp;{moment().year()}&nbsp;EduCoder<span className="ml15 mr15">ICP17009477</span><a href="https://team.trustie.net" style={{"color":"#888"}} target="_blank">Trustie</a>&nbsp;&nbsp;&nbsp;&amp;&nbsp;&nbsp;&nbsp;IntelliDE inside.</div>
</div>
:""
}
</div> </div>
</div> </div>
) )

View File

@ -321,8 +321,8 @@ class LoginDialog extends Component {
return flag; return flag;
} }
componentDidMount() { componentDidMount() {
//true为PC端false为手机端
let flag = this.IsPC(); let flag = this.IsPC(); //true为PC端false为手机端
this.setState({ this.setState({
isphone: flag isphone: flag
}) })
@ -455,9 +455,10 @@ class LoginDialog extends Component {
} }
render() { render() {
let { login, isGoing, isGoingValue, disabled , Phonenumberisnotco , dialogBox, isRender, weixinlogin } = this.state; let { login, isGoing, isGoingValue, disabled, Phonenumberisnotco,
let { settings } = this.props; dialogBox, isRender, weixinlogin } = this.state;
let { settings } = this.props;
if (isRender === undefined) { if (isRender === undefined) {
isRender = false isRender = false
} }

View File

@ -1068,11 +1068,6 @@ class NewMyShixunModel extends Component {
<style> <style>
{ {
` `
.newHeaders{
position: fixed;
top: 0px;
z-index: 999 !important;
}
.ant-drawer { .ant-drawer {
z-index: 800 !important; z-index: 800 !important;
} }

View File

@ -28,12 +28,12 @@ body>.-task-title {
height:70px; height:70px;
min-width: 1200px; min-width: 1200px;
z-index: 1000; z-index: 1000;
background:rgba(255,255,255,1); background:#001529;
position: fixed; position: fixed;
box-shadow: 0px 0px 14px rgb(0 0 0 / 10%); box-shadow: 0px 0px 14px rgb(0 0 0 / 10%);
} }
.headerContent{ .headerContent{
width:1200px; padding:0px 25px;
margin:0px auto; margin:0px auto;
display: flex; display: flex;
align-items: center; align-items: center;
@ -135,7 +135,6 @@ body>.-task-title {
height: 60px !important; height: 60px !important;
} }
.HeaderSearch { .HeaderSearch {
margin-top: 18px; margin-top: 18px;
margin-right: 20px; margin-right: 20px;
@ -329,4 +328,137 @@ body>.-task-title {
.progress-container { .progress-container {
flex: 1 0 0; flex: 1 0 0;
margin-left: 20px; margin-left: 20px;
}
.newFooter > div{
padding: 90px 20px;
display: -ms-flexbox;
display: flex;
-ms-flex-pack: center;
justify-content: center;
-ms-flex-align: start;
align-items: flex-start;
background: #242424;
min-width: 1200px;
}
.newFooter .module-list{
width: 200px;
text-align: left;
}
.newFooter .module-list>.title{
font-size: 16px;
color: #ddd;
margin-bottom: 20px;
font-weight: 400;
background-color: transparent;
border: none;
padding: 0px;
}
.newFooter .module-list a {
display: block;
color: #bbb;
line-height: 34px;
font-weight: 300;
font-size: 12px;
}
.newFooter .module-list a:hover {
color: #fff;
}
.newFooter .module-introduce{
display: flex;
-ms-flex-direction: column;
flex-direction: column;
-ms-flex-align: center;
align-items: center;
width: 290px;
margin-top: -12px;
}
.newFooter .module-introduce p {
font-size: 12px;
color: #bbb;
line-height: 32px;
margin-top: 12px;
font-weight: 300;
text-align: justify;
}
.module-introduce ul {
display: -ms-flexbox;
display: flex;
-ms-flex-pack: distribute;
justify-content: space-around;
padding: 0;
margin-top: 20px;
}
.module-introduce ul {
display: -ms-flexbox;
display: flex;
-ms-flex-pack: distribute;
justify-content: space-around;
padding: 0;
margin-top: 20px;
}
.module-introduce ul li:first-child {
margin-right: 50px;
}
.module-introduce ul li {
display: -ms-flexbox;
display: flex;
-ms-flex-direction: column;
flex-direction: column;
-ms-flex-pack: center;
justify-content: center;
-ms-flex-align: center;
align-items: center;
}
.module-introduce ul li>span {
font-size: 12px;
color: #bbb;
padding-top: 10px;
}
.module-introduce ol {
margin-top: 16px;
display: -ms-flexbox;
display: flex;
-ms-flex-pack: distribute;
justify-content: space-around;
padding: 0;
height: 108px;
width: 100%;
}
.module-introduce ol li {
height: 100%;
display: -ms-flexbox;
display: flex;
-ms-flex-direction: column;
flex-direction: column;
-ms-flex-pack: justify;
justify-content: space-between;
-ms-flex-align: center;
align-items: center;
}
.module-introduce ol li a {
font-size: 14px;
color: #bbb;
margin-top: 20px;
}
.module-introduce section {
width: 100%;
height: 115px;
display: -ms-flexbox;
display: flex;
-ms-flex-direction: column;
flex-direction: column;
-ms-flex-pack: justify;
justify-content: space-between;
-ms-flex-align: start;
align-items: flex-start;
font-size: 14px;
color: #bbb;
font-weight: 300;
}
.module-introduce .footer-line {
width: 310px;
height: 1px;
background-color: #3e4042;
margin: 32px 0;
} }

View File

@ -7,6 +7,8 @@ import './TPMIndex.css';
import LoginDialog from '../login/LoginDialog'; import LoginDialog from '../login/LoginDialog';
import EducoderAccount from '../../forge/Component/EducoderAccount'; import EducoderAccount from '../../forge/Component/EducoderAccount';
import ProfileModal from '../../forge/Component/ProfileModal/Index'; import ProfileModal from '../../forge/Component/ProfileModal/Index';
// import AccountProfile from '../user/AccountProfile';
// import AccountPhoneemail from '../user/AccountPhoneemail';
export function TPMIndexHOC(WrappedComponent) { export function TPMIndexHOC(WrappedComponent) {
return class II extends React.Component { return class II extends React.Component {
@ -27,7 +29,8 @@ export function TPMIndexHOC(WrappedComponent) {
giteaVisible:false, giteaVisible:false,
email:undefined, email:undefined,
completeProfile:false, completeProfile:false,
showCP:false showCP:false,
is_sync_pwd:undefined
} }
} }
@ -168,6 +171,24 @@ export function TPMIndexHOC(WrappedComponent) {
}) })
} }
} }
if(response.data && response.data.login){
if(!response.data.has_gitea_user || (response.data.has_gitea_user && !response.data.is_sync_pwd)){
this.setState({
giteaVisible:true,
email:response.data.email,
is_sync_pwd:response.data.is_sync_pwd
})
}
}
if(response.data && response.data.login){
if(!response.data.has_gitea_user || (response.data.has_gitea_user && !response.data.is_sync_pwd)){
this.setState({
giteaVisible:true,
email:response.data.email,
is_sync_pwd:response.data.is_sync_pwd
})
}
}
} }
}).catch((error) => { }).catch((error) => {
console.log(error) console.log(error)
@ -192,8 +213,11 @@ export function TPMIndexHOC(WrappedComponent) {
} }
onOk =(values)=>{ onOk =(values)=>{
let url = `/users/sync_user_info.json`; let url = `/accounts/gitea_register.json`;
const { current_user } = this.state; const { email , current_user , is_sync_pwd } = this.state;
if(email && !is_sync_pwd){
url = `/users/change_password.json`;
}
axios.post(url,{ axios.post(url,{
login:current_user && current_user.login, login:current_user && current_user.login,
...values ...values
@ -215,6 +239,22 @@ export function TPMIndexHOC(WrappedComponent) {
} }
onOk =(values)=>{
let url = `/users/sync_user_info.json`;
const { current_user } = this.state;
axios.post(url,{
login:current_user && current_user.login,
...values
}).then(result=>{
if(result && result.data && result.data.status === 0){
this.setState({
giteaVisible:false,
email:undefined
})
window.location.reload();
}
}).catch(error=>{})
}
render() { render() {
let { isRender , current_user , giteaVisible , email , completeProfile , showCP } = this.state; let { isRender , current_user , giteaVisible , email , completeProfile , showCP } = this.state;
const common = { const common = {