From 61eea3c3f72fdda5969538d50752e7fc0e92b571 Mon Sep 17 00:00:00 2001 From: ZhangRuining <1049731766@qq.com> Date: Mon, 10 Mar 2025 14:40:46 +0800 Subject: [PATCH 01/11] test --- src/forge/Index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/forge/Index.js b/src/forge/Index.js index e1402d227..5fd17749a 100644 --- a/src/forge/Index.js +++ b/src/forge/Index.js @@ -35,6 +35,7 @@ class Index extends Component { }) } + render() { return (
From 69bb64c4de1641044ff9cb278767801b94d6a840 Mon Sep 17 00:00:00 2001 From: ZhangRuining <1049731766@qq.com> Date: Tue, 11 Mar 2025 11:43:22 +0800 Subject: [PATCH 02/11] 10197 --- src/AppConfig.js | 3 +- src/forge/Head/AddProjectModal.jsx | 332 ++++++++++++++++++++++------- src/forge/Head/header.scss | 13 ++ src/forge/Main/Index.js | 54 +++-- src/forge/Main/IndexItem.js | 263 +++++++++++++++++++---- src/forge/New/Index.js | 17 +- src/forge/Settings/Audit.js | 224 +++++++++++++++++++ src/forge/Settings/Index.js | 22 ++ src/forge/Settings/Setting.js | 27 ++- 9 files changed, 818 insertions(+), 137 deletions(-) create mode 100644 src/forge/Settings/Audit.js diff --git a/src/AppConfig.js b/src/AppConfig.js index 328579998..dc23caeff 100644 --- a/src/AppConfig.js +++ b/src/AppConfig.js @@ -32,7 +32,8 @@ export function initAxiosInterceptors(props) { // 判断网络是否连接 initOnlineOfflineListener(); - var proxy = "http://172.16.100.220:81"; + // var proxy = "http://172.16.100.220:81"; + var proxy = 'http://172.16.100.130:81' //响应前的设置 axios.interceptors.request.use( config => { diff --git a/src/forge/Head/AddProjectModal.jsx b/src/forge/Head/AddProjectModal.jsx index 8e3073e30..9c8f100fc 100644 --- a/src/forge/Head/AddProjectModal.jsx +++ b/src/forge/Head/AddProjectModal.jsx @@ -1,84 +1,270 @@ -import React, { useState , forwardRef, useEffect } from 'react'; -import { Form , Modal , Input , Radio } from 'antd'; +import React, { useState, forwardRef, useEffect } from 'react'; +import { Form, Modal, Input, Radio, Upload, Button, Icon, message } from 'antd'; import Axios from 'axios'; +import { getUploadActionUrl, appendFileSizeToUploadFileAll } from 'educoder'; -export default Form.create()( - forwardRef((props)=>{ - const { getFieldDecorator, validateFields , setFieldsValue } = props && props.form; - const [ visible , setVisible ] = useState(false); +const JoinProjectForm = Form.create({ + name: 'join_project_form', +})( + forwardRef((props) => { + const { getFieldDecorator, validateFields } = props.form; + const { onOk, onCancel } = props; - useEffect(()=>{ - if(!visible){ - setFieldsValue({ - code:undefined, - role:"developer" - }) + useEffect(() => { + if (props.visible) { + props.form.setFieldsValue({ + code: '', + role: 'developer', + }); } - },[visible]) + }, [props.visible]) - function onOk() { - validateFields((error,values)=>{ - if(!error){ - const url = `/applied_projects.json`; - Axios.post(url,{ - applied_project:{ - ...values - } - }).then(result=>{ - if(result && result.data){ - setVisible(false); - props.showNotification("申请加入项目成功,等待审核!"); - } - }).catch(error=>{}) - } - }) - } - function checkValue(rule, value, callback){ - if(!value){ + function checkValue(rule, value, callback) { + if (!value) { callback(); } - if(value.length < 6 || value.length > 6){ - callback("请输入6位数的邀请码"); + if (value.length < 6 || value.length > 6) { + callback('请输入6位数的邀请码'); } callback(); - } + } - return( - - setVisible(false)} - > -
- - {getFieldDecorator("code",{ - rules:[ - {required:true,message:"请输入6位项目邀请码"}, - {validator:checkValue} - ] - })( - - )} - - - {getFieldDecorator("role",{ - rules:[{required:true,message:"请选择角色"}] - })( - - 管理员 - 开发者 - 报告者 - - )} - -
-
- setVisible(true)}>加入项目 -
- ) + const handleOk = () => { + validateFields((error, values) => { + if (!error) { + onOk(values); + } + }); + }; + + return ( + +
+ + {getFieldDecorator('code', { + rules: [ + { required: true, message: '请输入6位项目邀请码' }, + { validator: checkValue }, + ], + })( + + )} + + + {getFieldDecorator('role', { + rules: [{ required: true, message: '请选择角色' }], + })( + + 管理员 + 开发者 + 报告者 + + )} + +
+
+ ); }) -) \ No newline at end of file +); + +const PersonalInfoForm = Form.create({ + name: 'personal_info_form', +})( + forwardRef((props) => { + const { getFieldDecorator, validateFields } = props.form; + const { onOk, onCancel, contentFileList, uploadProps } = props; + + useEffect(() => { + if (props.visible) { + props.form.setFieldsValue({ + remarks: '', + attachment_id: '', + }); + } + }, [props.visible]) + + const handleOk = () => { + validateFields((error, values) => { + if (!error) { + const attachmentId = contentFileList.map((item) => { + return item.response ? item.response.id : item.id; + }); + onOk({ ...values, attachment_id: attachmentId.join(',') }); + } + }); + }; + + return ( + +
+ + {getFieldDecorator('remarks', { + rules: [{ required: true, message: '请输入个人情况' }], + })( + + )} + + + {getFieldDecorator('attachment_id', { + rules: [], + })( + + + (单个文件最大20MB) + + )} + +
+
+ ); + }) +); + +export default forwardRef((props) => { + const [visible, setVisible] = useState(false); + const [infoVis, setInfoVis] = useState(false); + const [contentFileList, setContentFileList] = useState([]); + // 新增状态用于保存加入项目表单的数据 + const [joinProjectValues, setJoinProjectValues] = useState({}); + + const uploadProps = { + fileList: contentFileList, + multiple: false, + action: `${getUploadActionUrl()}`, + onChange: (info) => { + let content = info.fileList; + setContentFileList(appendFileSizeToUploadFileAll(content)); + }, + onRemove: (file) => { + if (file.response != undefined) { + Modal.confirm({ + content: '是否确认删除?', + onOk: () => { + deleteAttachment(file); + }, + onCancel() { + console.log('Cancel'); + }, + }); + return false; + } + }, + beforeUpload: (file) => { + console.log('beforeUpload', file.name); + const isLt150M = file.size / 1024 / 1024 <= 20; + if (!isLt150M) { + message.error('文件大小必须不超过20MB!'); + } + return isLt150M; + }, + }; + + const deleteAttachment = (file) => { + const url = `/attachments/${file.response ? file.response.id : file.uid}.json`; + Axios.delete(url, {}) + .then((response) => { + if (response.data) { + const { status } = response.data; + if (status === 0) { + setContentFileList([]); + } + } + }) + .catch((error) => { + console.log(error); + }); + }; + + const handleJoinProjectOk = (values) => { + const url = `/applied_projects.json`; + setJoinProjectValues({ ...values }) + Axios.post(url, { + applied_project: { + alert_remarks: false, + ...values, + }, + }) + .then((result) => { + if (result) { + setVisible(false); + if (result.data.join_project_need_verify) { + setInfoVis(true); + } else { + props.showNotification('申请已提交,请等待项目管理者审核!'); + } + } + }) + .catch((error) => { + console.log(error); + }); + }; + + const handlePersonalInfoOk = (values) => { + const url = `/applied_projects.json`; + let attachmentId = contentFileList.map(item => { + return item.response ? item.response.id : item.id + }) + Axios.post(url, { + personal_info: { + ...joinProjectValues, + alert_remarks: true, + ...values, + attachment_id: attachmentId.join(','), + }, + }) + .then((result) => { + if (result && result.data) { + setInfoVis(false); + setContentFileList([]); + props.showNotification('申请已提交,请等待项目管理者审核!'); + } + }) + .catch((error) => { + console.log(error); + }); + }; + + return ( + + setVisible(false)} + /> + setInfoVis(false)} + contentFileList={contentFileList} + uploadProps={uploadProps} + /> + setVisible(true)}>加入项目 + + ); +}); \ No newline at end of file diff --git a/src/forge/Head/header.scss b/src/forge/Head/header.scss index 812280107..08b1cf29b 100644 --- a/src/forge/Head/header.scss +++ b/src/forge/Head/header.scss @@ -152,4 +152,17 @@ width: 110px; text-align: right; } +} + +.inviteForm2{ + .ant-form-item{ + margin-right: 0px; + display:flex; + flex-wrap: nowrap; + + } + .ant-form-item-label{ + width: 92px; + text-align: right; + } } \ No newline at end of file diff --git a/src/forge/Main/Index.js b/src/forge/Main/Index.js index 3c3ffe9a8..27bfe9a06 100644 --- a/src/forge/Main/Index.js +++ b/src/forge/Main/Index.js @@ -32,14 +32,15 @@ class Index extends Component { recommendList:undefined, languageList:undefined, - languageId:undefined + languageId:undefined, + filter:undefined, } } componentDidMount = () => { - const { page, limit, search, sort, project_type, category_id , languageId } = this.state; - this.getListData(page, limit, search, sort, project_type, category_id , languageId); + const { page, limit, search, sort, project_type, category_id , languageId,filter } = this.state; + this.getListData(page, limit, search, sort, project_type, category_id , languageId,filter); this.getType(); @@ -74,7 +75,7 @@ class Index extends Component { } // 获取列表 - getListData = (page, limit, search, sort, project_type, category_id,languageId) => { + getListData = (page, limit, search, sort, project_type, category_id,languageId,filter) => { const { current_user } = this.props; const url = `/projects.json`; axios.get(url, { @@ -86,7 +87,8 @@ class Index extends Component { sort_by: sort, project_type, category_id, - language_id:languageId + language_id:languageId, + filter } }).then((result) => { if (result) { @@ -132,8 +134,8 @@ class Index extends Component { search: undefined }) this.setTypeList(list, type) - const { page, limit, sort, category_id , languageId } = this.state; - this.getListData(page, limit, undefined, sort, type, category_id , languageId); + const { page, limit, sort, category_id , languageId,filter } = this.state; + this.getListData(page, limit, undefined, sort, type, category_id , languageId,filter); } // 获取类型 @@ -168,8 +170,8 @@ class Index extends Component { page: 1 }); this.setCategoryList(list, id) - const { limit, sort, project_type , languageId } = this.state; - this.getListData(1, limit, undefined, sort, project_type, id , languageId); + const { limit, sort, project_type , languageId,filter } = this.state; + this.getListData(1, limit, undefined, sort, project_type, id , languageId,filter); } // 排序 @@ -180,8 +182,8 @@ class Index extends Component { search: undefined, isSpin: true }) - const { limit, project_type, category_id , languageId } = this.state; - this.getListData(1, limit, undefined, e.key, project_type, category_id , languageId); + const { limit, project_type, category_id , languageId,filter } = this.state; + this.getListData(1, limit, undefined, e.key, project_type, category_id , languageId,filter); } // 搜索 @@ -193,8 +195,8 @@ class Index extends Component { project_type: undefined, sort: "updated_on" }) - const { limit, sort, category_id , languageId } = this.state; - this.getListData(1, limit, value, sort, undefined, category_id , languageId); + const { limit, sort, category_id , languageId ,filter} = this.state; + this.getListData(1, limit, value, sort, undefined, category_id , languageId,filter); } changeSearchValue = (e) => { this.setState({ @@ -206,8 +208,8 @@ class Index extends Component { this.setState({ page }) - const { limit, search, sort, project_type, category_id , languageId } = this.state; - this.getListData(page, limit, search, sort, project_type, category_id , languageId); + const { limit, search, sort, project_type, category_id , languageId,filter } = this.state; + this.getListData(page, limit, search, sort, project_type, category_id , languageId,filter); } getoDetail=(login,identifier)=>{ @@ -220,8 +222,17 @@ class Index extends Component { isSpin:true, languageId:e === 0 ?undefined:e }) - const { page, limit, sort , project_type , category_id } = this.state; - this.getListData(page, limit, undefined, sort, project_type, category_id ,e === 0 ?undefined:e); + const { page, limit, sort , project_type , category_id,filter } = this.state; + this.getListData(page, limit, undefined, sort, project_type, category_id ,e === 0 ?undefined:e,filter); + } + + changeFilter=(e)=>{ + this.setState({ + isSpin:true, + filter:e + }) + const { page,limit, search, sort, project_type, category_id , languageId } = this.state; + this.getListData(page, limit, search, sort, project_type, category_id , languageId,e); } menu =()=> { @@ -282,7 +293,7 @@ class Index extends Component { { recommendList && recommendList.length>0 &&
- { + {/* { recommendList.map((item,key)=>{ return(
this.getoDetail(item.author && item.author.login,item.identifier)}> @@ -298,7 +309,7 @@ class Index extends Component {
) }) - } + } */}
} @@ -315,6 +326,11 @@ class Index extends Component {
+
+ + + +
+ )} + + + {getFieldDecorator('attachment_id', { + rules: [], + })( + + + (单个文件最大20MB) + + )} + + + + ); +} +} + +const WrappedPrivateAccessModal = Form.create()(PrivateAccessModal); class IndexItem extends Component { TurnToDetail = (login, url) => { this.props.history.push({ pathname: url, state: login - }) + }); } + + state = { + showModal: false, + projectInfo: null + }; + + openModal = (projectInfo) => { + this.setState({ showModal: true, projectInfo }); + }; + + closeModal = () => { + this.setState({ showModal: false, projectInfo: null }); + }; + render() { const { projects } = this.props; return ( -
- { projects && projects.length > 0 ? projects.map((item, key) => { +
+ {projects && projects.length > 0 ? projects.map((item, key) => { return (
{ - item.platform === "educoder" ? - - - - : - - - + item.platform === "educoder" ? ( + + + + ) : ( + + + + ) }
- + { + if (item.is_member || item.is_manager) { + return true; + } else { + e.preventDefault(); + this.openModal(item); + return false; + } + }} to={`/projects/${item.author.login}/${item.identifier}`} title={`${item.author.name}/${item.name}`} className="color-grey-3 font-18 task-hide " style={{ maxWidth: 470 }}> {item.author.name}/{item.name} - { !item.is_public && 私有 } + {!item.is_public && 私有} { - item.forked_from_project_id ? + item.forked_from_project_id ? ( - : "" + ) : null } { - item.type && item.type !== 0 ? - item.type === 2 ? - - - : - - - :"" + item.type && item.type !== 0 ? + item.type === 2 ? + + + : + + + : null } + {(item.is_manager && item.join_project_need_verify) && + 待审核申请:{item.pending_verify_count} + } { - item.praises_count && item.praises_count>0 ? - - 赞 {item.praises_count} - :"" + item.praises_count && item.praises_count > 0 ? + + 赞 {item.praises_count} + : null } { - item.forked_count && item.forked_count>0 ? - - fork {item.forked_count} - :"" + item.forked_count && item.forked_count > 0 ? + + fork {item.forked_count} + : null }
-

{item.description}

+

{item.description}

{/* {item.visits} */} {/* {item.category && item.category.id && {item.category.name}} */} - {item.last_update_time ? {item.time_ago} : ""} - {item.language && item.language.id ? {item.language.name} : ""} + {item.last_update_time ? {item.time_ago} : null} + {item.language && item.language.id ? {item.language.name} : null}
- ) - }) : } + ); + }) : } +
- ) + ); } } + export default IndexItem; \ No newline at end of file diff --git a/src/forge/New/Index.js b/src/forge/New/Index.js index b56b4d128..fdc5d1a33 100644 --- a/src/forge/New/Index.js +++ b/src/forge/New/Index.js @@ -44,7 +44,8 @@ class Index extends Component { project_category_name: undefined, license_name: undefined, ignore_name: undefined, - descNum:0 + descNum:0, + join_project_need_verify:true } } componentDidMount = () => { @@ -169,7 +170,7 @@ class Index extends Component { isSpin: true }) const { projectsType } = this.props.match.params; - const { project_language_id, project_category_id, license_id, ignore_id , owners_id , owners_name } = this.state; + const { project_language_id, project_category_id, license_id, ignore_id , owners_id , owners_name,join_project_need_verify } = this.state; const decoderPass = Base64.encode(values.password); const url = (projectsType && projectsType === "mirror") ? "/projects/migrate.json" : "/projects.json"; axios.post(url, { @@ -179,7 +180,8 @@ class Index extends Component { project_category_id, license_id, ignore_id, - user_id:owners_id + user_id:owners_id, + join_project_need_verify }).then((result) => { if (result) { if (result.data.id) { @@ -288,6 +290,7 @@ class Index extends Component { ignore_list, mirrorCheck, + join_project_need_verify, descNum } = this.state; @@ -511,6 +514,14 @@ class Index extends Component { )} } + + {getFieldDecorator('join_project_need_verify')( + this.setState({join_project_need_verify:e.target.checked})}>用户加入项目时需要审核(使用邀请码加入也需要审核,由项目所有人或管理员审核) + )} +
注: 为必填项,否则为选填
diff --git a/src/forge/Settings/Audit.js b/src/forge/Settings/Audit.js new file mode 100644 index 000000000..634b1222e --- /dev/null +++ b/src/forge/Settings/Audit.js @@ -0,0 +1,224 @@ +import React, { useEffect, useState } from 'react'; +import { WhiteBack, FlexAJ } from '../../Component/layout'; +import { Table, Pagination, Popconfirm, Button, Modal, message, Input } from 'antd'; +import Title from '../../Component/Title'; +import Search from '../../Component/Search'; +import styled from 'styled-components'; +import { getImageUrl } from 'educoder'; +import axios from 'axios'; +import { Link } from 'react-router-dom'; + +const Img = styled.img`{ + width:30px; + height:30px; + border-radius:50%; +}` + +const demoData = [ + { + img: "images/avatars/User/g", + name: "蔡世", + email: "1149225589@qq.com", + team: "caicaizi", + role: "管理者", + operation: "移除成员", + } +] +export default ((props) => { + const [page, setPage] = useState(1); + const [limit, setLimit] = useState(15); + const [total, setTotal] = useState(0); + const [search, setSearch] = useState(undefined); + const [data, setData] = useState(demoData); + const [status, setStatus] = useState(1); + + useEffect(() => { + getData(); + }, []) + + function getData(status, search, page) { + const url = `/api/applied_projects.json`; + axios.get(url, { + params: { + page, limit, + keyword: search, + status + } + }).then(result => { + if (result && result.data) { + setData(result.data.list); + setTotal(result.data.count); + } + }).catch(error => { }) + } + + // 切换分页 + function ChangePage(page) { + setPage(page); + getData(status, search, page); + } + + function verify(id, verifyStatus, reason) { + const url = `/api/applied_projects/${id}/verify.json?status=${status}`; + axios.post(url, { + body: { + verify_status: verifyStatus, + status, + reason + } + }).then(result => { + if (result && result.data) { + message.success("操作成功!"); + } + }).catch(error => { }) + } + + const columns = [ + { + title: '用户名', + dataIndex: 'user_name', + width: "15%", + render: (item, record) => {item} + }, + { + title: '申请角色', + dataIndex: 'applied_project', + width: "10%", + render: (value, item) => { + return value + } + }, + { + title: '学号', + dataIndex: 'student_id', + width: "10%", + align: "left", + render: (value) => { + return value + } + }, + { + title: '邮箱', + dataIndex: 'mail', + width: "10%", + render: (value) => value + }, + { + title: '个人情况', + dataIndex: 'remarks', + width: "15%", + render: (value) => value + }, + { + title: '上传附件', + dataIndex: 'attachment_info', + width: "10%", + render: (value, record) => { + if (record.attachment_info.id) { + return + } else { + return '--' + } + } + }, + { + title: '拒绝原因', + dataIndex: 'reason', + width: "15%", + render: (value) => value + }, + { + title: '操作', + dataIndex: 'operation', + width: "15%", + render: (value, item) => { + return ( +
+ + +
+ ) + } + } + ] + + return ( + + + <span>审核管理</span> + + + + +
+ { + setSearch(value) + getData(status, value) + }} /> +
+
+
+
+ { + total > limit ? +
+ +
+ : "" + } +
+
+ ) +}) \ No newline at end of file diff --git a/src/forge/Settings/Index.js b/src/forge/Settings/Index.js index 17ae87614..d53a3acfb 100644 --- a/src/forge/Settings/Index.js +++ b/src/forge/Settings/Index.js @@ -16,6 +16,10 @@ const Branch = Loadable({ loader: () => import("./Branch"), loading: Loading, }); +const Audit = Loadable({ + loader: () => import("./Audit"), + loading: Loading, +}); const Setting = Loadable({ loader: () => import("./Setting"), loading: Loading, @@ -65,6 +69,18 @@ class Index extends Component {

+
  • -1 ? "active" : "" + } + > +

    + + + 审核管理 + +

    +
  • -1 ? "active" : "" @@ -125,6 +141,12 @@ class Index extends Component { )} > + ( + + )} + > ( diff --git a/src/forge/Settings/Setting.js b/src/forge/Settings/Setting.js index 5b4f07c29..6f2bb9e8c 100644 --- a/src/forge/Settings/Setting.js +++ b/src/forge/Settings/Setting.js @@ -28,7 +28,8 @@ class Setting extends Component { project_units:['home',"activity","code"], divertVisible:false, is_transfering:undefined, - projectName:undefined + projectName:undefined, + join_project_need_verify:true }; } @@ -77,6 +78,7 @@ class Setting extends Component { this.setState({ projectName:result.data.project_name, private_check: result.data.private, + join_project_need_verify:result.data.join_project_need_verify, loading:false, project_units:units }); @@ -142,12 +144,13 @@ class Setting extends Component { update=(values)=>{ const { projectsId , owner } = this.props.match.params; - const { private_check } = this.state; + const { private_check ,join_project_need_verify} = this.state; const url = `/${owner}/${projectsId}.json`; axios.put(url, { name: values.project_name, description: values.project_description, private: private_check, + join_project_need_verify:join_project_need_verify, ...values, }).then((result) => { if (result) { @@ -196,7 +199,7 @@ class Setting extends Component { const { getFieldDecorator } = this.props.form; const { projectDetail } = this.props; - const { CategoryList, LanguageList, private_check ,loading } = this.state; + const { CategoryList, LanguageList, private_check ,loading,join_project_need_verify } = this.state; let mirror = projectDetail && projectDetail.mirror; let type = projectDetail && projectDetail.type; const forked_from_project_id = this.props && this.props.projectDetail && this.props.projectDetail.forked_from_project_id; @@ -284,6 +287,24 @@ class Setting extends Component { )} +
    + 加入项目设置 + + {getFieldDecorator("join_project_need_verify", { + rules: [], + })( + this.setState({join_project_need_verify:e.target.checked})} + > + 用户加入项目时需要审核 + + (使用邀请码加入也需要审核,由项目所有人或管理员审核) + + + )} + +

    更新仓库设置 From 6898b87d9deab3513ba2428cb362a43e295ae46a Mon Sep 17 00:00:00 2001 From: ZhangRuining <1049731766@qq.com> Date: Tue, 11 Mar 2025 12:22:42 +0800 Subject: [PATCH 03/11] fix --- src/forge/Settings/Audit.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/forge/Settings/Audit.js b/src/forge/Settings/Audit.js index 634b1222e..8e893c747 100644 --- a/src/forge/Settings/Audit.js +++ b/src/forge/Settings/Audit.js @@ -1,8 +1,8 @@ import React, { useEffect, useState } from 'react'; -import { WhiteBack, FlexAJ } from '../../Component/layout'; +import { WhiteBack, FlexAJ } from '../Component/layout'; import { Table, Pagination, Popconfirm, Button, Modal, message, Input } from 'antd'; -import Title from '../../Component/Title'; -import Search from '../../Component/Search'; +import Title from '../Component/Title'; +import Search from '../Component/Search'; import styled from 'styled-components'; import { getImageUrl } from 'educoder'; import axios from 'axios'; From 570671093343e2c0be67b267937b74f402b5c13b Mon Sep 17 00:00:00 2001 From: ZhangRuining <1049731766@qq.com> Date: Tue, 11 Mar 2025 15:50:55 +0800 Subject: [PATCH 04/11] =?UTF-8?q?fix=E5=AE=A1=E6=A0=B8=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/forge/Component/EducoderAccount.jsx | 1 + src/forge/Head/AddProjectModal.jsx | 4 +- src/forge/Main/IndexItem.js | 83 +++++++++++++------------ src/forge/Main/sub/DetailBanner.jsx | 4 +- src/forge/Settings/Audit.js | 57 ++++++++++------- src/forge/Settings/Index.js | 11 ++-- 6 files changed, 88 insertions(+), 72 deletions(-) diff --git a/src/forge/Component/EducoderAccount.jsx b/src/forge/Component/EducoderAccount.jsx index 59e2295f2..a20ae1311 100644 --- a/src/forge/Component/EducoderAccount.jsx +++ b/src/forge/Component/EducoderAccount.jsx @@ -25,6 +25,7 @@ function EducoderAccount({form , visible , onOk , email}){ return( { .then((result) => { if (result) { setVisible(false); - if (result.data.join_project_need_verify) { + if (result.data.need_verify) { setInfoVis(true); } else { props.showNotification('申请已提交,请等待项目管理者审核!'); @@ -231,7 +231,7 @@ export default forwardRef((props) => { return item.response ? item.response.id : item.id }) Axios.post(url, { - personal_info: { + applied_project: { ...joinProjectValues, alert_remarks: true, ...values, diff --git a/src/forge/Main/IndexItem.js b/src/forge/Main/IndexItem.js index d1fd2e8f7..70e9356bd 100644 --- a/src/forge/Main/IndexItem.js +++ b/src/forge/Main/IndexItem.js @@ -19,7 +19,6 @@ class PrivateAccessModal extends Component { } handleOk = () => { - console.log('this.props.projecInfo',this.props.projectInfo) this.props.form.validateFields((err, values) => { if (!err) { const url = `/applied_projects.json`; @@ -27,7 +26,7 @@ class PrivateAccessModal extends Component { return item.response ? item.response.id : item.id }) Axios.post(url, { - personal_info: { + applied_project: { alert_remarks: true, ...values, attachment_id: attachmentId.join(','), @@ -36,8 +35,9 @@ class PrivateAccessModal extends Component { }) .then((result) => { if (result && result.data) { - setInfoVis(false); - setContentFileList([]); + this.setState({ + contentFileList: [] + }); message.info('申请已提交,请等待项目管理者审核!'); } }) @@ -55,39 +55,41 @@ class PrivateAccessModal extends Component { this.props.form.resetFields(); } - uploadProps = { - fileList: [], - multiple: false, - action: `${getUploadActionUrl()}`, - onChange: (info) => { - let content = info.fileList; - this.setState({ - contentFileList: appendFileSizeToUploadFileAll(content) - }); - }, - onRemove: (file) => { - if (file.response != undefined) { - Modal.confirm({ - content: '是否确认删除?', - onOk: () => { - this.deleteAttachment(file); - }, - onCancel() { - console.log('Cancel'); - }, + uploadProps = ()=>{ + return { + fileList: this.state.contentFileList, + multiple: false, + action: `${getUploadActionUrl()}`, + onChange: (info) => { + let content = info.fileList; + this.setState({ + contentFileList: appendFileSizeToUploadFileAll(content) }); - return false; - } - }, - beforeUpload: (file) => { - console.log('beforeUpload', file.name); - const isLt150M = file.size / 1024 / 1024 <= 20; - if (!isLt150M) { - message.error('文件大小必须不超过20MB!'); - } - return isLt150M; - }, - }; + }, + onRemove: (file) => { + if (file.response != undefined) { + Modal.confirm({ + content: '是否确认删除?', + onOk: () => { + this.deleteAttachment(file); + }, + onCancel() { + console.log('Cancel'); + }, + }); + return false; + } + }, + beforeUpload: (file) => { + console.log('beforeUpload', file.name); + const isLt150M = file.size / 1024 / 1024 <= 20; + if (!isLt150M) { + message.error('文件大小必须不超过20MB!'); + } + return isLt150M; + }, + }; + } deleteAttachment = (file) => { const url = `/attachments/${file.response ? file.response.id : file.uid}.json`; @@ -147,7 +149,7 @@ render() { {getFieldDecorator('attachment_id', { rules: [], })( - + @@ -235,8 +237,10 @@ class IndexItem extends Component { : null } - {(item.is_manager && item.join_project_need_verify) && - 待审核申请:{item.pending_verify_count} + + { + (item.is_manager && item.join_project_need_verify) && + 待审核申请:{item.pending_verify_count} } { @@ -252,6 +256,7 @@ class IndexItem extends Component { : null } +

  • {item.description}

    diff --git a/src/forge/Main/sub/DetailBanner.jsx b/src/forge/Main/sub/DetailBanner.jsx index 64db3dae2..c5e8a3bcd 100644 --- a/src/forge/Main/sub/DetailBanner.jsx +++ b/src/forge/Main/sub/DetailBanner.jsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react'; -import { Skeleton , Tooltip } from 'antd'; +import { Skeleton , Tooltip,Badge } from 'antd'; import { Link } from 'react-router-dom'; function DetailBanner({ history,list , owner , projectsId , isManager , url , pathname , state , urlFlag , projectDetail , platform ,open_devops }){ @@ -109,7 +109,7 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa
  • 0 ? "iconfont icon-cangku color-grey-3 mr5 font-14":"iconfont icon-cangku color-grey-6 font-14 mr5"}> - 设置 + 设置
  • } diff --git a/src/forge/Settings/Audit.js b/src/forge/Settings/Audit.js index 8e893c747..ed5dc6901 100644 --- a/src/forge/Settings/Audit.js +++ b/src/forge/Settings/Audit.js @@ -14,22 +14,13 @@ const Img = styled.img`{ border-radius:50%; }` -const demoData = [ - { - img: "images/avatars/User/g", - name: "蔡世", - email: "1149225589@qq.com", - team: "caicaizi", - role: "管理者", - operation: "移除成员", - } -] + export default ((props) => { const [page, setPage] = useState(1); const [limit, setLimit] = useState(15); const [total, setTotal] = useState(0); const [search, setSearch] = useState(undefined); - const [data, setData] = useState(demoData); + const [data, setData] = useState([]); const [status, setStatus] = useState(1); useEffect(() => { @@ -77,45 +68,55 @@ export default ((props) => { { title: '用户名', dataIndex: 'user_name', - width: "15%", - render: (item, record) => {item} + ellipsis: true, + width: "12%", + align:'left', + render: (item, record) => {item || '--'} }, { title: '申请角色', dataIndex: 'applied_project', + ellipsis: true, width: "10%", + align:'left', render: (value, item) => { - return value + return value || "--" } }, { title: '学号', dataIndex: 'student_id', + ellipsis: true, width: "10%", align: "left", render: (value) => { - return value + return value || "--" } }, { title: '邮箱', dataIndex: 'mail', + ellipsis: true, width: "10%", - render: (value) => value + align:'left', + render: (value) => value || "--" }, { title: '个人情况', dataIndex: 'remarks', + ellipsis: true, width: "15%", - render: (value) => value + align:'left', + render: (value) => value || "--" }, { title: '上传附件', dataIndex: 'attachment_info', width: "10%", + align:'left', render: (value, record) => { - if (record.attachment_info.id) { - return - -
    +
    +
    { setSearch(value) getData(status, value) diff --git a/src/forge/Settings/Index.js b/src/forge/Settings/Index.js index d53a3acfb..fa860b778 100644 --- a/src/forge/Settings/Index.js +++ b/src/forge/Settings/Index.js @@ -7,6 +7,7 @@ import "./setting.scss"; import Loadable from "react-loadable"; import Loading from "../../Loading"; import { Box, Long, Short, Gap } from '../Component/layout'; +import {Badge} from 'antd' const BranchNew = Loadable({ loader: () => import("./BranchRule"), @@ -71,13 +72,13 @@ class Index extends Component {
  • -1 ? "active" : "" + pathname.indexOf("setting/audit") > -1 ? "active" : "" } >

    - - - 审核管理 + + + 审核管理

  • @@ -142,7 +143,7 @@ class Index extends Component { )} > ( )} From 1ddc705ea80c606e5680811b418e995ac306b5cd Mon Sep 17 00:00:00 2001 From: ZhangRuining <1049731766@qq.com> Date: Tue, 11 Mar 2025 16:48:08 +0800 Subject: [PATCH 05/11] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/forge/Head/AddProjectModal.jsx | 2 +- src/forge/Main/sub/DetailBanner.jsx | 2 +- src/forge/Settings/Audit.js | 8 ++++---- src/forge/Settings/Index.js | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/forge/Head/AddProjectModal.jsx b/src/forge/Head/AddProjectModal.jsx index 182f88f6d..80c66527a 100644 --- a/src/forge/Head/AddProjectModal.jsx +++ b/src/forge/Head/AddProjectModal.jsx @@ -213,7 +213,7 @@ export default forwardRef((props) => { .then((result) => { if (result) { setVisible(false); - if (result.data.need_verify) { + if (result.data.data.need_verify) { setInfoVis(true); } else { props.showNotification('申请已提交,请等待项目管理者审核!'); diff --git a/src/forge/Main/sub/DetailBanner.jsx b/src/forge/Main/sub/DetailBanner.jsx index c5e8a3bcd..87f6c538e 100644 --- a/src/forge/Main/sub/DetailBanner.jsx +++ b/src/forge/Main/sub/DetailBanner.jsx @@ -109,7 +109,7 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa
  • 0 ? "iconfont icon-cangku color-grey-3 mr5 font-14":"iconfont icon-cangku color-grey-6 font-14 mr5"}> - 设置 + {projectDetail && projectDetail.pending_verify_count ? 设置 :设置}
  • } diff --git a/src/forge/Settings/Audit.js b/src/forge/Settings/Audit.js index ed5dc6901..625efa563 100644 --- a/src/forge/Settings/Audit.js +++ b/src/forge/Settings/Audit.js @@ -28,7 +28,7 @@ export default ((props) => { }, []) function getData(status, search, page) { - const url = `/api/applied_projects.json`; + const url = `/applied_projects.json`; axios.get(url, { params: { page, limit, @@ -37,8 +37,8 @@ export default ((props) => { } }).then(result => { if (result && result.data) { - setData(result.data.list); - setTotal(result.data.count); + setData(result.data.data.list); + setTotal(result.data.data.count); } }).catch(error => { }) } @@ -50,7 +50,7 @@ export default ((props) => { } function verify(id, verifyStatus, reason) { - const url = `/api/applied_projects/${id}/verify.json?status=${status}`; + const url = `/applied_projects/${id}/verify.json?status=${status}`; axios.post(url, { body: { verify_status: verifyStatus, diff --git a/src/forge/Settings/Index.js b/src/forge/Settings/Index.js index fa860b778..ab0334f8e 100644 --- a/src/forge/Settings/Index.js +++ b/src/forge/Settings/Index.js @@ -78,7 +78,7 @@ class Index extends Component {

    - 审核管理 + {(this.props.projectDetail && this.props.projectDetail.pending_verify_count) ? 审核管理 : '审核管理'}

    From be24551549aa6d156fd6efe6b3f42816d5ee647f Mon Sep 17 00:00:00 2001 From: ZhangRuining <1049731766@qq.com> Date: Tue, 11 Mar 2025 18:05:21 +0800 Subject: [PATCH 06/11] fix --- src/forge/Main/sub/DetailBanner.jsx | 2 +- src/forge/Settings/Audit.js | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/forge/Main/sub/DetailBanner.jsx b/src/forge/Main/sub/DetailBanner.jsx index 87f6c538e..270103b3a 100644 --- a/src/forge/Main/sub/DetailBanner.jsx +++ b/src/forge/Main/sub/DetailBanner.jsx @@ -109,7 +109,7 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa
  • 0 ? "iconfont icon-cangku color-grey-3 mr5 font-14":"iconfont icon-cangku color-grey-6 font-14 mr5"}> - {projectDetail && projectDetail.pending_verify_count ? 设置 :设置} + {projectDetail && projectDetail.pending_verify_count ? 设置 :'设置'}
  • } diff --git a/src/forge/Settings/Audit.js b/src/forge/Settings/Audit.js index 625efa563..a3143890f 100644 --- a/src/forge/Settings/Audit.js +++ b/src/forge/Settings/Audit.js @@ -52,11 +52,9 @@ export default ((props) => { function verify(id, verifyStatus, reason) { const url = `/applied_projects/${id}/verify.json?status=${status}`; axios.post(url, { - body: { verify_status: verifyStatus, status, reason - } }).then(result => { if (result && result.data) { message.success("操作成功!"); From 04ffef47da21d134915579e2229972e96c57d308 Mon Sep 17 00:00:00 2001 From: ZhangRuining <1049731766@qq.com> Date: Tue, 11 Mar 2025 21:58:26 +0800 Subject: [PATCH 07/11] =?UTF-8?q?fix=20=E5=AE=A1=E6=A0=B8=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/forge/Main/Index.js | 15 +++++++++++---- src/forge/Main/IndexItem.js | 2 +- src/forge/Settings/Audit.js | 26 ++++++++++++++++++++------ 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/forge/Main/Index.js b/src/forge/Main/Index.js index 27bfe9a06..3a214919e 100644 --- a/src/forge/Main/Index.js +++ b/src/forge/Main/Index.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import { Link } from 'react-router-dom'; -import { Menu, Input , Spin, Pagination , Popover , Select , Button } from 'antd'; +import { Menu, Input , Spin, Pagination , Popover , Select , Button,Tabs } from 'antd'; import { getImageUrl } from 'educoder'; import '../css/index.scss' import './list.css'; @@ -327,11 +327,18 @@ class Index extends Component {
    - + { + this.changeFilter(key) + }}> + + + + + {/* - + */}
    -
    +
    )} -
    - 可见性 +
    + 可见性 {getFieldDecorator("private", { rules: [], @@ -287,8 +287,8 @@ class Setting extends Component { )} -
    - 加入项目设置 +
    + 加入项目设置 {getFieldDecorator("join_project_need_verify", { rules: [], From c68be919d0914dd1f64cc192125cdab5d154679f Mon Sep 17 00:00:00 2001 From: ZhangRuining <1049731766@qq.com> Date: Wed, 12 Mar 2025 13:38:50 +0800 Subject: [PATCH 10/11] fix --- src/forge/Settings/Audit.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/forge/Settings/Audit.js b/src/forge/Settings/Audit.js index 1671fbc17..ac8807972 100644 --- a/src/forge/Settings/Audit.js +++ b/src/forge/Settings/Audit.js @@ -138,6 +138,7 @@ export default ((props) => { { title: '拒绝原因', dataIndex: 'reason', + ellipsis: true, width: "15%", align:'left', render: (value) => value || "--" From 26bdafa6c91c8bc393778d82b750570f5f9d9ab2 Mon Sep 17 00:00:00 2001 From: ZhangRuining <1049731766@qq.com> Date: Wed, 12 Mar 2025 18:06:21 +0800 Subject: [PATCH 11/11] fix --- src/forge/Settings/Audit.js | 3 ++- src/forge/Settings/Setting.js | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/forge/Settings/Audit.js b/src/forge/Settings/Audit.js index ac8807972..53eabdfd9 100644 --- a/src/forge/Settings/Audit.js +++ b/src/forge/Settings/Audit.js @@ -33,7 +33,8 @@ export default ((props) => { params: { page, limit, keyword: search, - status + status, + project_id: (props.projectDetail) ? props.projectDetail.project_id :'' } }).then(result => { if (result && result.data) { diff --git a/src/forge/Settings/Setting.js b/src/forge/Settings/Setting.js index 1c944e258..d775a27a2 100644 --- a/src/forge/Settings/Setting.js +++ b/src/forge/Settings/Setting.js @@ -29,7 +29,7 @@ class Setting extends Component { divertVisible:false, is_transfering:undefined, projectName:undefined, - join_project_need_verify:true + join_project_need_verify:false }; } @@ -230,8 +230,8 @@ class Setting extends Component { onChange={this.changePrivate} disabled={forked_from_project_id} > - 将仓库设为私有 - + 将仓库设为私有 + { forked_from_project_id ?`(Fork仓库的可见性实时同步自源仓库,不支持直接修改)`:`(修改仓库的可见性,将会影响到该仓库下所有Fork仓库的可见性)`} @@ -297,8 +297,8 @@ class Setting extends Component { checked={join_project_need_verify} onChange={(e)=>this.setState({join_project_need_verify:e.target.checked})} > - 用户加入项目时需要审核 - + 用户加入项目时需要审核 + (使用邀请码加入也需要审核,由项目所有人或管理员审核)