From 622715919e7b21006ef419f4748ecdd3b057062b Mon Sep 17 00:00:00 2001 From: qyzh Date: Wed, 22 Jul 2020 17:33:05 +0800 Subject: [PATCH 01/13] before merge --- forgeplus-react.sublime-workspace | 317 ++++++++++++++++++++++++++++++ src/App.js | 10 + src/forge/sponsor/Sponsor.js | 32 +++ src/forge/users/Infos.js | 23 +++ 4 files changed, 382 insertions(+) create mode 100644 forgeplus-react.sublime-workspace create mode 100644 src/forge/sponsor/Sponsor.js diff --git a/forgeplus-react.sublime-workspace b/forgeplus-react.sublime-workspace new file mode 100644 index 000000000..08ec48f4e --- /dev/null +++ b/forgeplus-react.sublime-workspace @@ -0,0 +1,317 @@ +{ + "auto_complete": + { + "selected_items": + [ + [ + "samp", + "samp2_method" + ], + [ + "modu", + "module_method" + ], + [ + "cu", + "currentTerm" + ], + [ + "req", + "requestVote" + ], + [ + "reque", + "RequestVote" + ], + [ + "App", + "AppendEntries" + ], + [ + "hea", + "heartBeatInterval" + ], + [ + "time", + "timeOut" + ], + [ + "ele", + "electionTimeout" + ], + [ + "R", + "Raft" + ], + [ + "vote", + "votedFor" + ], + [ + "Ra", + "RaftState" + ], + [ + "is", + "isleader" + ] + ] + }, + "buffers": + [ + { + "file": "src/redux/actions/actionTypes.js", + "settings": + { + "buffer_size": 5688, + "encoding": "UTF-8", + "line_ending": "Unix" + } + } + ], + "build_system": "", + "build_system_choices": + [ + ], + "build_varint": "", + "command_palette": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + ], + "width": 0.0 + }, + "console": + { + "height": 171.0, + "history": + [ + "ls" + ] + }, + "distraction_free": + { + "menu_visible": true, + "show_minimap": false, + "show_open_files": false, + "show_tabs": false, + "side_bar_visible": false, + "status_bar_visible": false + }, + "expanded_folders": + [ + "/home/qyzh/new_trustie/forgeplus-react" + ], + "file_history": + [ + "/home/qyzh/OSS/forgeplus/app/models/user.rb", + "/home/qyzh/OSS/forgeplus/db/structure.sql", + "/home/qyzh/OSS/forgeplus/app/controllers/settings_controller.rb", + "/home/qyzh/OSS/forgeplus/app/controllers/application_controller.rb", + "/home/qyzh/OSS/Trustie/app/controllers/projects_controller.rb", + "/home/qyzh/temp.sh", + "/home/qyzh/OSS/Trustie/Gemfile", + "/home/qyzh/.npm/_logs/2020-06-07T02_42_06_886Z-debug.log", + "/home/qyzh/OSS/forgeplus/app/controllers/users_controller.rb", + "/home/qyzh/OSS/forgeplus/app/controllers/accounts_controller.rb", + "/home/qyzh/custom/conf/app.ini", + "/home/qyzh/OSS/Trustie_old/Gemfile.lock", + "/home/qyzh/OSS/Trustie/Gemfile.lock", + "/home/qyzh/ruby_study/test.rb", + "/home/qyzh/RubymineProjects/myblog/app/controller/users_controller.rb", + "/home/qyzh/OSS/forgeplus/app/libs/limit_forbid_control.rb", + "/home/qyzh/OSS/forgeplus/log/development.log", + "/home/qyzh/NJU-DisSys-2017/src/raft/raft.go", + "/home/qyzh/OSS/forgeplus/config/application.rb", + "/home/qyzh/RubymineProjects/demo/app/helpers/welcome_helper.rb", + "/home/qyzh/RubymineProjects/demo/app/controllers/welcome_controller.rb", + "/home/qyzh/RubymineProjects/demo/config/routes.rb", + "/home/qyzh/RubymineProjects/demo/app/views/welcome/index.html.erb", + "/home/qyzh/trustie/Gemfile", + "/home/qyzh/trustie/Gemfile.lock", + "/home/qyzh/ruby_study/test", + "/home/qyzh/NJU-DisSys-2017/src/labrpc/test_test.go", + "/home/qyzh/NJU-DisSys-2017/src/labrpc/labrpc.go", + "/home/qyzh/NJU-DisSys-2017/src/raft/test_test.go", + "/home/qyzh/NJU-DisSys-2017/src/raft/persister.go", + "/home/qyzh/NJU-DisSys-2017/src/raft/util.go", + "/home/qyzh/NJU-DisSys-2017/src/raft/config.go" + ], + "find": + { + "height": 29.0 + }, + "find_in_files": + { + "height": 0.0, + "where_history": + [ + ] + }, + "find_state": + { + "case_sensitive": true, + "find_history": + [ + "current_user", + "user_set", + "login", + "platform", + "Platform不包含于列表中", + "find_by_", + "find_by", + "3.2.22", + "bug", + "persister", + "currentTerm", + "currentTern", + "term", + "your", + "electionInterval", + "your", + "if", + "your", + "Persister", + "make", + "Your code here", + "Call", + "labrpc", + "main" + ], + "highlight": true, + "in_selection": false, + "preserve_case": false, + "regex": false, + "replace_history": + [ + ], + "reverse": false, + "show_context": true, + "use_buffer2": true, + "whole_word": false, + "wrap": true + }, + "groups": + [ + { + "selected": 0, + "sheets": + [ + { + "buffer": 0, + "file": "src/redux/actions/actionTypes.js", + "semi_transient": false, + "settings": + { + "buffer_size": 5688, + "regions": + { + }, + "selection": + [ + [ + 0, + 0 + ] + ], + "settings": + { + "syntax": "Packages/JavaScript/JavaScript.sublime-syntax", + "tab_size": 2, + "translate_tabs_to_spaces": true + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 0, + "type": "text" + } + ] + } + ], + "incremental_find": + { + "height": 29.0 + }, + "input": + { + "height": 0.0 + }, + "layout": + { + "cells": + [ + [ + 0, + 0, + 1, + 1 + ] + ], + "cols": + [ + 0.0, + 1.0 + ], + "rows": + [ + 0.0, + 1.0 + ] + }, + "menu_visible": true, + "output.find_results": + { + "height": 0.0 + }, + "pinned_build_system": "", + "project": "forgeplus-react.sublime-project", + "replace": + { + "height": 54.0 + }, + "save_all_on_build": true, + "select_file": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + ], + "width": 0.0 + }, + "select_project": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + ], + "width": 0.0 + }, + "select_symbol": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + ], + "width": 0.0 + }, + "selected_group": 0, + "settings": + { + }, + "show_minimap": true, + "show_open_files": false, + "show_tabs": true, + "side_bar_visible": true, + "side_bar_width": 288.0, + "status_bar_visible": true, + "template_settings": + { + } +} diff --git a/src/App.js b/src/App.js index ac18a443a..4a586cacf 100644 --- a/src/App.js +++ b/src/App.js @@ -81,6 +81,11 @@ const OrganizeIndex = Loadable({ loader: () => import('./forge/Team/Index'), loading: Loading, }) +// Sponsor +const Sponsor = Loadable({ + loader: () => import('./forge/sponsor/Sponsor'), + loading: Loading, +}) class App extends Component { constructor(props) { @@ -270,6 +275,11 @@ class App extends Component { return () } }> + () + }> + () diff --git a/src/forge/sponsor/Sponsor.js b/src/forge/sponsor/Sponsor.js new file mode 100644 index 000000000..35417180e --- /dev/null +++ b/src/forge/sponsor/Sponsor.js @@ -0,0 +1,32 @@ +import React, { Component } from "react"; + +import { Route, Switch } from "react-router-dom"; +import { withRouter } from "react-router"; + +import { SnackbarHOC } from "educoder"; +import { CNotificationHOC } from "../../modules/courses/common/CNotificationHOC"; +import { TPMIndexHOC } from "../../modules/tpm/TPMIndexHOC"; + + +import Loadable from "react-loadable"; +import Loading from "../../Loading"; +import { ImageLayerOfCommentHOC } from "../../modules/page/layers/ImageLayerOfCommentHOC"; + +class Sponsor extends Component { + + render(){ + return ( +

This is sponsor page

+ ); + + } + +} + +export default withRouter( + ImageLayerOfCommentHOC({ + imgSelector: ".imageLayerParent img, .imageLayerParent .imageTarget", + parentSelector: ".newMain", + })(CNotificationHOC()(SnackbarHOC()(TPMIndexHOC(Sponsor)))) + ); + \ No newline at end of file diff --git a/src/forge/users/Infos.js b/src/forge/users/Infos.js index 37172aa40..5a1bd8832 100644 --- a/src/forge/users/Infos.js +++ b/src/forge/users/Infos.js @@ -113,6 +113,14 @@ class Infos extends Component { this.props.history.push(`/users/${user && user.login}/organizes`) } + sponsor_link = () => { + const {user} = this.state + this.setState({ + route_type: undefined + }) + this.props.history.push(`/sponsor/${user && user.login}`) + } + render() { const { current_user, mygetHelmetapi } = this.props; @@ -240,6 +248,21 @@ class Infos extends Component {

+ {current_user && user && current_user.id === user.id && ( +
+
+

this.sponsor_link()} > + + {/* */} + Sponsor + + {/* + {user && user.undo_events} + */} +

+
+
+ )}
{user && ( -- 2.34.1 From df9d6aa8a20b9b470b845609ec8dbe321ab76046 Mon Sep 17 00:00:00 2001 From: qyzh Date: Wed, 22 Jul 2020 17:34:43 +0800 Subject: [PATCH 02/13] ignore sublime workspace file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9a82a1138..79d23d759 100644 --- a/.gitignore +++ b/.gitignore @@ -86,3 +86,4 @@ typings/ .DS_Store .idea/* +.forgeplus-react.sublime-workspace -- 2.34.1 From 016c0bee0032ee1a09b52f641564df5a72c090f9 Mon Sep 17 00:00:00 2001 From: qyzh Date: Tue, 8 Sep 2020 10:05:27 +0800 Subject: [PATCH 03/13] =?UTF-8?q?=E7=BC=96=E8=BE=91=E8=B5=84=E5=8A=A9?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 2 +- src/forge/sponsor/Sponsor.js | 161 +++++++++++++- src/forge/sponsor/sponsor.css | 20 ++ src/forge/sponsor/sponsor_tier_item.js | 260 ++++++++++++++++++++++ src/forge/users/Infos.js | 79 ++++++- src/forge/users/sponsor/CoinChangeItem.js | 43 ++++ src/forge/users/sponsor/wallet.js | 197 ++++++++++++++++ 7 files changed, 747 insertions(+), 15 deletions(-) create mode 100644 src/forge/sponsor/sponsor.css create mode 100644 src/forge/sponsor/sponsor_tier_item.js create mode 100644 src/forge/users/sponsor/CoinChangeItem.js create mode 100644 src/forge/users/sponsor/wallet.js diff --git a/src/App.js b/src/App.js index 41ba3d346..78ec28838 100644 --- a/src/App.js +++ b/src/App.js @@ -268,7 +268,7 @@ class App extends Component { }> () + (props) => () }> { + this.fetchUser(); + this.fetchSponsors(); + }; + + fetchUser = () => { + this.setState({ + isSpin: true, + }); + const { current_user } = this.props; + const { username } = this.props.match.params; + + let url = `/users/${username || (current_user && current_user.login)}.json`; + axios + .get(url) + .then((result) => { + // TODO: 在这里添加了对用户自我介绍的处理,前后端交互实现后需要删掉 + result.data.description = tempDesc; + this.setState({ + user: result.data, + isSpin: false, + }); + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + }; + + fetchSponsors = () => { + this.setState({ + sponsors: tempSponsors, + }); + } + + sponsorList(){ + const {sponsors} = this.state; + const sponsorList = (sponsors && sponsors.length>0 ? sponsors.map((item, key)=>{ + return ( + + + ); + }) + :"") + return (

{sponsorList}

); + } + render(){ + const { current_user} = this.props; + const isSpin = false; + const { user } = this.state; + const sponsorList = this.sponsorList(); + // console.log("current", current_user) + // console.log("user", user) + return ( -

This is sponsor page

+
+ +
+
+
+
+
成为{user && user.username}的赞助者吧
+ + {user && user.user_identity && ( +
+ {user && user.user_identity} +
+ )} +
+
+ +
+
+ 自我介绍: + {user && current_user && user.login===current_user.login? + ():""} + + {user && user.description? + (

{user.description}

):(

暂无自我介绍

)} +
+
+ 赞助者: + {sponsorList} +
+
+
+
+
+ + +
+
+
+
+
); } diff --git a/src/forge/sponsor/sponsor.css b/src/forge/sponsor/sponsor.css new file mode 100644 index 000000000..e52ca123a --- /dev/null +++ b/src/forge/sponsor/sponsor.css @@ -0,0 +1,20 @@ +.sponsor-page-left{ + width: 65%; + padding-right: 20px; + box-sizing: border-box; + margin-bottom: 20px; +} + +.sponsor-page-right{ + width: 35%; + padding-right: 20px; + box-sizing: border-box; + margin-bottom: 20px; +} + +.sponsor-page-sponsors{ + width: 50px; + height: 50px; + border-radius: 50%; + margin-right: 11px; +} \ No newline at end of file diff --git a/src/forge/sponsor/sponsor_tier_item.js b/src/forge/sponsor/sponsor_tier_item.js new file mode 100644 index 000000000..bd932bc02 --- /dev/null +++ b/src/forge/sponsor/sponsor_tier_item.js @@ -0,0 +1,260 @@ +import React, { Component } from "react"; +import { Link } from "react-router-dom"; +import { Avatar, Tag, Button, Spin, Icon, Modal, Input, Form} from "antd"; +import { Route, Switch } from "react-router-dom"; +import { withRouter } from "react-router"; +// import { EditOutlined } from "@ant-design/icons"; + +import { SnackbarHOC } from "educoder"; +import { CNotificationHOC } from "../../modules/courses/common/CNotificationHOC"; +import { TPMIndexHOC } from "../../modules/tpm/TPMIndexHOC"; + +import axios from "axios"; +import { getImageUrl } from "educoder"; + +import Loadable from "react-loadable"; +import Loading from "../../Loading"; +import { ImageLayerOfCommentHOC } from "../../modules/page/layers/ImageLayerOfCommentHOC"; + +import "../users/new_user.css"; +import "../css/index.scss"; +import '../users/Index.scss'; +import "./sponsor.css"; +import Item from "antd/lib/list/Item"; + +const FormItem = Form.Item; + +const EditTierForm = Form.create()( +class extends Component{ + getItemsValue = ()=>{ + const val= this.props.form.getFieldsValue(); // 获取from表单的值 + return val; + } + render(){ + + const { form, initValue1, initValue2, initValueList } = this.props; + const { getFieldDecorator } = form; // 校验控件 + return( +
+ + {getFieldDecorator(`amount`,{ + rules: [{ + message: '必填字段!', + required: true + }], + initialValue: initValue1 ? initValue1 : undefined + })( + + )} + + + {getFieldDecorator(`name`,{ + rules: [{ + message: '必填字段!', + required: true + }], + initialValue: initValue2 ? initValue2 : undefined + })( + + )} + +
+ ) + } + +}); + +class SponsorTierItem extends Component{ + constructor(props) { + super(props) + + var edit = new Array(); + for(var i=0; i { + // console.log(this.props.tiers) + } + + editTier = (item, key, e) => { + var edit = this.state.edit; + edit[key] = true; + this.setState({ + edit:edit + }) + } + + confirmEdit = (item, key, e) => { + console.log("key", key, "item", item) + let values = this.formRef.getItemsValue(); + console.log("values:", values) + + // TODO: 在此处加入对后端的修改请求 + + var edit = this.state.edit; + edit[key] = false; + this.setState({ + edit:edit + }) + } + + canelEdit = (item, key, e) => { + var edit = this.state.edit; + edit[key] = false; + this.setState({ + edit:edit + }) + } + + showModal = () => { + let {tiers, edit} = this.state; + // this.setState({ + // visible: true + // }) + } + + hideModal = () => { + this.setState({ + visible: false + }) + } + + createTier = () => { + this.setState({ + visible: false + }) + } + + newTierModal = () => { + return ( + +

12312312

+
+ ); + } + + visitorTemplate = (item, key) => { + return ( +
    + +
    + 金额:{item.amount} + +
    +
    + 描述:{item.description} +
    +
+ ); + } + + manageTemplate = (item, key) => { + return ( +
    +
    + 金额:{item.amount} + this.editTier(item, key, e)}> +
    +
    + 描述:{item.description} + +
    +
+ ); + } + + editTemplate = (item, key) => { + return ( +
    + this.formRef = form} + /> + + +
+ ); + + // return ( + //
    + //
    + // 金额: + //
    + //
    + // 描述: + // + // + //
    + //
+ // ); + } + + render() { + const {tiers} = this.state; + const { current_user, user} = this.props; + + const renderList = ( + tiers && tiers.length > 0 ? tiers.map((item, key) => { + const amount = this.state.edit[key]? ():item.amount; + const description = this.state.edit[key]? ():item.description; + + var content = ""; + if (current_user && user && user.login !== current_user.login){ + content = this.visitorTemplate(item, key); + } + else if(current_user && user && user.login === current_user.login && this.state.edit[key]){ + content = this.editTemplate(item, key); + } + else if(current_user && user && user.login === current_user.login && !this.state.edit[key]){ + content = this.manageTemplate(item, key); + } + + // return ( + //
    + + //
    + // 金额:{amount} + // {current_user && user && user.login === current_user.login ? + // // ( this.editTier(item)}/> + // ( this.editTier(item, key, e)}>): + // } + //
    + //
    + // 描述:{description} + // {current_user && user && user.login === current_user.login ? + // ():""} + //
    + //
+ + // ) + return content; + }) : "" + ); + + return ( +
+
{renderList}
+ {current_user && user && user.login === current_user.login ? + ( ): + "" + } + {this.newTierModal()} +
+ ) + } +} + + +export default SponsorTierItem; \ No newline at end of file diff --git a/src/forge/users/Infos.js b/src/forge/users/Infos.js index 3bc8507a9..ee59e55cd 100644 --- a/src/forge/users/Infos.js +++ b/src/forge/users/Infos.js @@ -36,6 +36,10 @@ const UndoEvents = Loadable({ loader: () => import("./undo_events"), loading: Loading, }) +const Wallet = Loadable({ + loader: () => import("./sponsor/wallet"), + loading: Loading, +}); class Infos extends Component { constructor(props) { super(props); @@ -43,7 +47,8 @@ class Infos extends Component { isSpin: false, user: undefined, project_type: undefined, - route_type: undefined + route_type: undefined, + choose_wallet: undefined }; } @@ -79,6 +84,7 @@ class Infos extends Component { const {user} = this.state this.setState({ project_type: type , + choose_wallet: false, route_type: undefined }) let url = `/users/${user && user.login}` @@ -119,10 +125,30 @@ class Infos extends Component { this.props.history.push(`/sponsor/${user && user.login}`) } + wallet_link = () => { + const {user} = this.state + this.setState({ + project_type: undefined, + choose_wallet: true, + route_type: undefined + }) + this.props.history.push(`/users/${user && user.login}/wallet`) + } + + sponsor_setting_link = () => { + const {user} = this.state + this.setState({ + route_type: undefined + }) + this.props.history.push(`/users/${user && user.login}/sponsor_setting`) + } + render() { const { current_user, mygetHelmetapi } = this.props; - const { user, isSpin, project_type, route_type } = this.state; + const { user, isSpin, project_type, route_type, choose_wallet } = this.state; + // console.log("current", current_user) + // console.log("user", user) return (
@@ -159,7 +185,10 @@ class Infos extends Component { 修改资料 + +
+ )} {current_user && user && user.login !== current_user.login && (
@@ -170,6 +199,13 @@ class Infos extends Component { fontClass={"font-14 ml5"} starText={"关注TA"} /> +
)}
@@ -254,19 +290,32 @@ class Infos extends Component {

*/} - {current_user && user && current_user.id === user.id && ( + {current_user && user && user.login == current_user.login && ( +
-
-

this.sponsor_link()} > - - {/* */} - Sponsor +

    +
  • + + 赞助管理 + +
  • +
  • this.wallet_link()}> +

    + 我的钱包 + + {/* {user && user.common_projects_count} */} - {/* - {user && user.undo_events} - */}

    -
+ +
  • this.sponsor_link()}> +

    + 赞助管理 + + {/* {user && user.sync_mirror_projects_count} */} + +

    +
  • +
    )} @@ -286,6 +335,12 @@ class Infos extends Component { return ; }} >
    + { + return ; + }} + > { diff --git a/src/forge/users/sponsor/CoinChangeItem.js b/src/forge/users/sponsor/CoinChangeItem.js new file mode 100644 index 000000000..e046b65c1 --- /dev/null +++ b/src/forge/users/sponsor/CoinChangeItem.js @@ -0,0 +1,43 @@ +import React, { Component } from 'react'; +import { Tooltip } from 'antd'; +import '../../css/index.scss' +import '../../Main/list.css'; + +class CoinChangeItem extends Component { + TurnToDetail = (login, url) => { + this.props.history.push({ + pathname: url, + state: login + }) + } + render() { + const { coinChanges } = this.props; + const renderList = ( + coinChanges && coinChanges.length > 0 ? coinChanges.map((item, key) => { + return ( +
    +
    +

    金额:{item.amount>0? "收入":"支出"}{Math.abs(item.amount)}硬币

    +

    变动原因:{item.reasons}

    +

    备注:{item.description}

    + +
    + + {item.date} + {item.to_user} + {/* {item.amount>0 ? {item.to_user}: {item.to_user}} */} + +
    +
    +
    + ) + }) : "" + ) + return ( +
    + {renderList} +
    + ) + } +} +export default CoinChangeItem; \ No newline at end of file diff --git a/src/forge/users/sponsor/wallet.js b/src/forge/users/sponsor/wallet.js new file mode 100644 index 000000000..1f4f43439 --- /dev/null +++ b/src/forge/users/sponsor/wallet.js @@ -0,0 +1,197 @@ +import React, { Component } from "react"; +import { Link } from "react-router-dom"; +import { Menu, Input, Spin, Pagination, Popover, Button, Divider } from "antd"; + +import axios from "axios"; +import CoinChangeItem from "./CoinChangeItem"; +import Nodata from "../../Nodata"; +import img_array from "../../Images/array.png"; +const Search = Input.Search; + +const tempData = [ + {amount: -3, description: "des", reasons: "no reason", to_user: "串串", date: "2016年1月5日"}, + {amount: 3, description: "des", reasons: "no reason", to_user: "串串", date: "2016年1月5日"}, + {amount: -3, description: "des", reasons: "no reason", to_user: "串", date: "2016年1月5日"}, + {amount: 3, description: "des", reasons: "no reason", to_user: "串串", date: "2016年1月5日"}, + {amount: -3, description: "des", reasons: "no reason", to_user: "串串", date: "2016年1月5日"}, + {amount: 3, description: "des", reasons: "no reason", to_user: "串串", date: "2016年1月5日"}, + {amount: -3, description: "des", reasons: "no reason", to_user: "串串", date: "2016年1月5日"}, + {amount: 3, description: "des", reasons: "no reason", to_user: "串串", date: "2016年1月5日"}, + {amount: -3, description: "des", reasons: "no reason", to_user: "串串", date: "2016年1月5日"} +]; + +class Wallet extends Component { + constructor(props) { + super(props); + this.state = { + page: 1, + limit: 15, + sort_by: undefined, + totalCount: undefined, + isSpin: false, + coinChangeList: undefined, + displayList: undefined, + total: undefined, + category: undefined, + is_public: undefined + }; + } + + componentDidMount = () => { + this.get_coin_changes(); + }; + + componentDidUpdate = () => { + // this.get_coin_changes() + }; + + get_coin_changes = () => { + this.setState({ + coinChangeList: tempData, + displayList: tempData, + total: tempData.count, + isSpin: false, + }); + }; + + changeCategory = (cate) => { + let resultList = this.state.coinChangeList; + switch (cate.target.value){ + case "income": + resultList = resultList.filter(function(item,index,array){ + return item.amount > 0; + }); + break; + case "outcome": + resultList = resultList.filter(function(item,index,array){ + return item.amount < 0; + }); + break; + + } + this.setState({ + displayList: resultList, + }); + }; + + //切换页数 + changePage = (page) => { + this.state.page = page; + this.get_coin_changes(); + }; + + // 排序 + ChangeSoryBy = (e) => { + // this.state.sort_by = e.key; + // this.get_coin_changes(); + console.log(e.key) + }; + + changeSearchValue = (e) => { + this.setState({ + search: e.target.value, + }); + }; + + menu =()=> ( + + 时间从近到远排序 + 时间从远到近排序 + + ); + + category_button=(category)=>{ + const { current_user, user } = this.props; + const button_lists = + user && current_user && user.login === current_user.login + ? [ + { type: "all", name: "所有" }, + { type: "income", name: "收入" }, + { type: "outcome", name: "支出" }, + ] + : + []; + + let list = button_lists.map((item, key) => { + return ( + + + + ); + }) + return list; + } + + render() { + const { current_user, user } = this.props; + const { category , is_public } = this.state; + const { displayList, coinChangeList, isSpin, total, search, limit, page } = this.state; + + return ( + +
    + + +
    +
    +
    {this.category_button(category)}
    + +
    + {displayList && displayList.length > 0 ? + + : + + } + { + total && total > limit ? +
    + +
    + : + "" + } +
    + ); + } +} +export default Wallet; -- 2.34.1 From 381ad7135b946c3f3ce25dd948bbf956a8c98c2a Mon Sep 17 00:00:00 2001 From: qyzh Date: Thu, 10 Sep 2020 10:12:49 +0800 Subject: [PATCH 04/13] =?UTF-8?q?=E5=BC=80=E5=8F=91=E8=B5=9E=E5=8A=A9?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 11 + src/forge/sponsor/Sponsor.js | 119 +++++++++- src/forge/sponsor/SponsorConfirmation.js | 221 +++++++++++++++++++ src/forge/sponsor/sponsor.css | 18 ++ src/forge/sponsor/sponsor_tier_item.js | 126 +++++++---- src/forge/users/Infos.js | 28 ++- src/forge/users/sponsor/SponsorManagement.js | 190 ++++++++++++++++ src/forge/users/sponsor/sponsor_list.js | 62 ++++++ 8 files changed, 725 insertions(+), 50 deletions(-) create mode 100644 src/forge/sponsor/SponsorConfirmation.js create mode 100644 src/forge/users/sponsor/SponsorManagement.js create mode 100644 src/forge/users/sponsor/sponsor_list.js diff --git a/src/App.js b/src/App.js index 78ec28838..bb1f211cc 100644 --- a/src/App.js +++ b/src/App.js @@ -30,6 +30,7 @@ import { SnackbarHOC } from 'educoder' import { initAxiosInterceptors } from './AppConfig' import { Provider } from 'react-redux'; import configureStore from './redux/stores/configureStore'; +import { load } from 'react-cookies'; const store = configureStore(); window.marked = marked; const theme = createMuiTheme({ @@ -81,6 +82,11 @@ const Sponsor = Loadable({ loader: () => import('./forge/sponsor/Sponsor'), loading: Loading, }) +// Sponsor Confirmation +const SponsorConfirmation = Loadable({ + loader: () => import('./forge/sponsor/SponsorConfirmation'), + loading: Loading, +}) class App extends Component { constructor(props) { @@ -266,6 +272,11 @@ class App extends Component { return () } }>
    + () + }> + () diff --git a/src/forge/sponsor/Sponsor.js b/src/forge/sponsor/Sponsor.js index 657c3bd11..5beba6967 100644 --- a/src/forge/sponsor/Sponsor.js +++ b/src/forge/sponsor/Sponsor.js @@ -1,6 +1,6 @@ import React, { Component } from "react"; import { Link } from "react-router-dom"; -import { Avatar, Tag, Button, Spin } from "antd"; +import { Avatar, Tag, Button, Spin, Input, Form} from "antd"; import { Route, Switch } from "react-router-dom"; import { withRouter } from "react-router"; @@ -58,6 +58,36 @@ const tempSponsors = [ {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104"}, ]; +const FormItem = Form.Item; +const TextArea = Input.TextArea; + +const DescriptionForm = Form.create()( +class extends Component{ + getItemsValue = ()=>{ + const val= this.props.form.getFieldsValue(); // 获取from表单的值 + return val; + } + render(){ + + const { form, initValue} = this.props; + const { getFieldDecorator } = form; // 校验控件 + return( +
    + + {getFieldDecorator(`description`,{ + rules: [], + initialValue: initValue ? initValue : undefined + })( + // + + )} + +
    + ) + } +} +); + class Sponsor extends Component { constructor(props) { @@ -67,6 +97,7 @@ class Sponsor extends Component { user: undefined, description: undefined, sponsors: undefined, + edit: false, }; } @@ -107,6 +138,71 @@ class Sponsor extends Component { }); } + editDescription = () => { + this.setState({ + edit: true, + }); + } + + cancelEdit = () => { + this.setState({ + edit: false, + }) + } + + confirmEdit = () => { + //TODO: 增加和后端交互 + let value = this.formRef.getItemsValue().description; + // console.log(value); + let user = this.state.user; + if (user){ + user.description = value; + } + this.setState({ + user: user, + edit: false, + }); + } + + visitorTemplate = () => { + const user = this.state.user; + return ( +
    + 自我介绍: + {user && user.description? + (

    {user.description}

    ):(

    暂无自我介绍

    )} +
    + ); + } + + manageTemplate = () => { + const user = this.state.user; + return ( +
    + + 自我介绍: + this.editDescription()}> + + {user && user.description? (

    {user.description}

    ):(

    暂无自我介绍

    )} +
    + ); + } + + editTemplate = () => { + const user = this.state.user; + return ( +
    + 自我介绍: + this.formRef = form} + /> + + +
    + ); + } + sponsorList(){ const {sponsors} = this.state; const sponsorList = (sponsors && sponsors.length>0 ? sponsors.map((item, key)=>{ @@ -121,12 +217,22 @@ class Sponsor extends Component { render(){ const { current_user} = this.props; - const isSpin = false; - const { user } = this.state; + const { user, isSpin } = this.state; const sponsorList = this.sponsorList(); // console.log("current", current_user) // console.log("user", user) + var content = ""; + if (current_user && user && user.login !== current_user.login){ + content = this.visitorTemplate(); + } + else if(current_user && user && user.login === current_user.login && this.state.edit){ + content = this.editTemplate(); + } + else if(current_user && user && user.login === current_user.login && !this.state.edit){ + content = this.manageTemplate(); + } + return (
    @@ -149,12 +255,7 @@ class Sponsor extends Component {
    - 自我介绍: - {user && current_user && user.login===current_user.login? - ():""} - - {user && user.description? - (

    {user.description}

    ):(

    暂无自我介绍

    )} + {content}
    赞助者: diff --git a/src/forge/sponsor/SponsorConfirmation.js b/src/forge/sponsor/SponsorConfirmation.js new file mode 100644 index 000000000..0e22a282d --- /dev/null +++ b/src/forge/sponsor/SponsorConfirmation.js @@ -0,0 +1,221 @@ +import React, { Component } from "react"; +import { Link } from "react-router-dom"; +import { Avatar, Tag, Button, Spin, Input, Divider, Form, Radio, Alert, message} from "antd"; +import { Route, Switch } from "react-router-dom"; +import { withRouter } from "react-router"; + +import { SnackbarHOC } from "educoder"; +import { CNotificationHOC } from "../../modules/courses/common/CNotificationHOC"; +import { TPMIndexHOC } from "../../modules/tpm/TPMIndexHOC"; + +import axios from "axios"; +import { getImageUrl } from "educoder"; + +import Loadable from "react-loadable"; +import Loading from "../../Loading"; +import { ImageLayerOfCommentHOC } from "../../modules/page/layers/ImageLayerOfCommentHOC"; + +import "../users/new_user.css"; +import "../css/index.scss"; +import '../users/Index.scss'; +import "./sponsor.css"; +import { submitUserCode } from "../../redux/actions/ojForUser"; + +const tempData = {amount:100, description: "如果您更加慷慨的话就选择这个"}; +const tempBalance = 999; +const FormItem = Form.Item; + +const SponsorConfirmation = Form.create()( +class extends Component{ + + constructor(props) { + super(props); + this.state = { + isSpin: false, + user: undefined, + tier: undefined, + single: true, + balance: undefined, + }; + } + + componentDidMount = () => { + this.fetchUser(); + this.fetchTierInformation(); + this.fetchBalance(); + }; + + fetchUser = () => { + this.setState({ + isSpin: true, + }); + const { current_user } = this.props; + const { username } = this.props.match.params; + + let url = `/users/${username || (current_user && current_user.login)}.json`; + axios + .get(url) + .then((result) => { + this.setState({ + user: result.data, + isSpin: false, + }); + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + }; + + fetchTierInformation = () => { + //TODO: 和后端交互 + this.setState({ + tier: tempData + }) + } + + fetchBalance = () => { + this.setState({ + balance: tempBalance + }) + } + + reSelect = () => { + const {user} = this.state; + this.setState({ + route_type: undefined + }) + this.props.history.push(`/sponsor/${user && user.login}`) + } + + changeSingle = (e) => { + + this.setState({ + single: e.target.value + }) + } + + submit = () => { + const value = this.props.form.getFieldsValue(); + console.log(value); + message.success("赞助成功!"); + } + + render(){ + const {tier_id, username} = this.props.match.params; + const {current_user, form} = this.props; + const {user, isSpin, tier, balance} = this.state; + const {getFieldDecorator} = form; + + const current_username = current_user && current_user.username; + const alert_text = this.state.single? `您选择了单次付费,本次扣除${tier && tier.amount}硬币` + :`您选择了按月付费,每月20日将扣除${tier && tier.amount}硬币`; + + // console.log("user", user) + // console.log("current user", current_user); + + const radioStyle = { + display: 'block', + height: '30px', + lineHeight: '30px', + }; + + return ( +
    + +
    +
    +
    +

    + + 赞助{user && user.username}/赞助等级确认 +

    +

    + 赞助者为 + + {current_user && current_user.username} +

    + +

    所选赞助等级

    +

    {tier && tier.amount}硬币

    +

    {tier && tier.description}

    + +
    +
    + +
    +
    +
    + + {getFieldDecorator(`single`,{ + rules: [{ + required: true + }], + initialValue: true + })( + this.changeSingle(e)}> + 单次付费 + 按月支付 + + )} + +

    本次支付金额{tier && tier.amount}硬币

    +

    {this.state.single? "单次付费": "即日起-次月20日"}

    + + +
    支付信息
    +
    +
    + +
    +
    +
    {current_user && current_user.username}
    +
    硬币余额{balance}
    +
    +
    + + + 赞助关系可见性 + + {getFieldDecorator(`private`,{ + rules: [{ + required: true + }], + initialValue: false + })( + + 所有人可见 + 私密 + + )} + + + +
    +
    +
    +
    +
    + ); + } +}); + + +export default withRouter( + ImageLayerOfCommentHOC({ + imgSelector: ".imageLayerParent img, .imageLayerParent .imageTarget", + parentSelector: ".newMain", + })(CNotificationHOC()(SnackbarHOC()(TPMIndexHOC(SponsorConfirmation)))) + ); + \ No newline at end of file diff --git a/src/forge/sponsor/sponsor.css b/src/forge/sponsor/sponsor.css index e52ca123a..707819e8a 100644 --- a/src/forge/sponsor/sponsor.css +++ b/src/forge/sponsor/sponsor.css @@ -17,4 +17,22 @@ height: 50px; border-radius: 50%; margin-right: 11px; +} + +.sponsor-confirmation-left{ + width: 35%; + padding-right: 20px; + box-sizing: border-box; + margin-bottom: 20px; +} + +.sponsor-confirmation-right{ + width: 65%; + padding-right: 20px; + box-sizing: border-box; + margin-bottom: 20px; +} + +.sponsor-confirmation-inline{ + display: inline-block; } \ No newline at end of file diff --git a/src/forge/sponsor/sponsor_tier_item.js b/src/forge/sponsor/sponsor_tier_item.js index bd932bc02..c3f15ea12 100644 --- a/src/forge/sponsor/sponsor_tier_item.js +++ b/src/forge/sponsor/sponsor_tier_item.js @@ -1,6 +1,6 @@ import React, { Component } from "react"; import { Link } from "react-router-dom"; -import { Avatar, Tag, Button, Spin, Icon, Modal, Input, Form} from "antd"; +import { Avatar, Tag, Button, Spin, Icon, Modal, Input, Form, message, Popconfirm, Divider} from "antd"; import { Route, Switch } from "react-router-dom"; import { withRouter } from "react-router"; // import { EditOutlined } from "@ant-design/icons"; @@ -40,6 +40,7 @@ class extends Component{ {getFieldDecorator(`amount`,{ rules: [{ message: '必填字段!', + pattern: /^[0-9]+$/, required: true }], initialValue: initValue1 ? initValue1 : undefined @@ -48,7 +49,7 @@ class extends Component{ )} - {getFieldDecorator(`name`,{ + {getFieldDecorator(`description`,{ rules: [{ message: '必填字段!', required: true @@ -73,16 +74,41 @@ class SponsorTierItem extends Component{ this.state = { tiers: props.tiers, - new_tier: false, - visible: false, + new_tier: undefined, edit: edit, + isSpin: false, } } componentDidMount = () => { // console.log(this.props.tiers) + this.fetchUser(); } + fetchUser = () => { + this.setState({ + isSpin: true, + }); + const { current_user } = this.props; + const { username } = this.props.match.params; + + let url = `/users/${username || (current_user && current_user.login)}.json`; + axios + .get(url) + .then((result) => { + this.setState({ + user: result.data, + isSpin: false, + }); + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + }; + editTier = (item, key, e) => { var edit = this.state.edit; edit[key] = true; @@ -92,56 +118,70 @@ class SponsorTierItem extends Component{ } confirmEdit = (item, key, e) => { + if (this.state.new_tier == key){ + console.log("new tier"); + } console.log("key", key, "item", item) let values = this.formRef.getItemsValue(); console.log("values:", values) // TODO: 在此处加入对后端的修改请求 - var edit = this.state.edit; + var {tiers, edit} = this.state; + tiers[key] = values; edit[key] = false; this.setState({ - edit:edit + tiers: tiers, + edit: edit, + new_tier: undefined }) } - canelEdit = (item, key, e) => { - var edit = this.state.edit; - edit[key] = false; - this.setState({ - edit:edit - }) - } - - showModal = () => { + cancelEdit = (item, key, e) => { let {tiers, edit} = this.state; - // this.setState({ - // visible: true - // }) - } - - hideModal = () => { + tiers.pop(); + edit.pop(); this.setState({ - visible: false + tiers: tiers, + edit: edit, + new_tier: undefined }) } - createTier = () => { + newTier = () => { + if (this.state.new_tier !== undefined){ + message.info("请先完成当前编辑") + return; + } + + let {tiers, edit} = this.state; + tiers.push({amount: 1, description: ""}) + edit.push(true); this.setState({ - visible: false + tiers: tiers, + edit: edit, + new_tier: tiers.length - 1, }) } - newTierModal = () => { - return ( - -

    12312312

    -
    - ); + deleteTier = (item, key, e) => { + // TODO: 此处向后端发送请求删除 + let {tiers, edit} = this.state; + + tiers.splice(key, 1) + edit.splice(key, 1) + this.setState({ + tiers: tiers, + edit: edit, + }) + } + + toConformation = (item, key, e) => { + const {user} = this.state + this.setState({ + route_type: undefined + }) + this.props.history.push(`/sponsor_confirmation/${user && user.login}/${item.id}`) } visitorTemplate = (item, key) => { @@ -150,7 +190,7 @@ class SponsorTierItem extends Component{
    金额:{item.amount} - +
    描述:{item.description} @@ -168,7 +208,15 @@ class SponsorTierItem extends Component{
    描述:{item.description} - + this.deleteTier(item, key, e)} + // onCancel={cancel} + okText="是" + cancelText="否" + > + + ,
    ); @@ -203,7 +251,8 @@ class SponsorTierItem extends Component{ render() { const {tiers} = this.state; - const { current_user, user} = this.props; + const { current_user} = this.props; + const {user} = this.state; const renderList = ( tiers && tiers.length > 0 ? tiers.map((item, key) => { @@ -247,10 +296,9 @@ class SponsorTierItem extends Component{
    {renderList}
    {current_user && user && user.login === current_user.login ? - ( ): + ( ): "" } - {this.newTierModal()}
    ) } diff --git a/src/forge/users/Infos.js b/src/forge/users/Infos.js index ee59e55cd..434197fea 100644 --- a/src/forge/users/Infos.js +++ b/src/forge/users/Infos.js @@ -40,6 +40,10 @@ const Wallet = Loadable({ loader: () => import("./sponsor/wallet"), loading: Loading, }); +const SponsorManagement = Loadable({ + loader: () => import("./sponsor/SponsorManagement"), + loading: Loading, +}) class Infos extends Component { constructor(props) { super(props); @@ -125,6 +129,14 @@ class Infos extends Component { this.props.history.push(`/sponsor/${user && user.login}`) } + sponsor_management_link = () => { + const {user} = this.state + this.setState({ + route_type: undefined + }) + this.props.history.push(`/users/${user && user.login}/sponsor_management`) + } + wallet_link = () => { const {user} = this.state this.setState({ @@ -185,7 +197,13 @@ class Infos extends Component { 修改资料 - +
    @@ -307,7 +325,7 @@ class Infos extends Component {

    -
  • this.sponsor_link()}> +
  • this.sponsor_management_link()}>

    赞助管理 @@ -341,6 +359,12 @@ class Infos extends Component { return ; }} > + { + return ; + }} + > { diff --git a/src/forge/users/sponsor/SponsorManagement.js b/src/forge/users/sponsor/SponsorManagement.js new file mode 100644 index 000000000..5e43605d4 --- /dev/null +++ b/src/forge/users/sponsor/SponsorManagement.js @@ -0,0 +1,190 @@ +import React, { Component } from "react"; +import { Link } from "react-router-dom"; +import { Menu, Input, Spin, Pagination, Popover, Button, Divider } from "antd"; + +import axios from "axios"; +import CoinChangeItem from "./CoinChangeItem"; +import Nodata from "../../Nodata"; +import img_array from "../../Images/array.png"; +import SponsorList from "./sponsor_list"; +const Search = Input.Search; + +const tempData = [ + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01"}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01"}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01"}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01"}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01"}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01"}, +]; + + +class SponsorManagement extends Component{ + + constructor(props) { + super(props); + this.state = { + page: 1, + limit: 15, + sort_by: undefined, + totalCount: undefined, + isSpin: false, + coinChangeList: undefined, + total: undefined, + category: undefined, + is_public: undefined, + sponsors: undefined, + }; + } + + changeCategory = (cate) => { + // let resultList = this.state.coinChangeList; + // switch (cate.target.value){ + // case "income": + // resultList = resultList.filter(function(item,index,array){ + // return item.amount > 0; + // }); + // break; + // case "outcome": + // resultList = resultList.filter(function(item,index,array){ + // return item.amount < 0; + // }); + // break; + + // } + // this.setState({ + // displayList: resultList, + // }); + }; + + componentDidMount = () => { + this.get_sponsors(); + } + + get_sponsors = ()=>{ + this.setState({ + sponsors: tempData, + }) + } + + //切换页数 + changePage = (page) => { + this.state.page = page; + // this.get_coin_changes(); + }; + + // 排序 + ChangeSoryBy = (e) => { + // this.state.sort_by = e.key; + // this.get_coin_changes(); + console.log(e.key) + }; + + changeSearchValue = (e) => { + this.setState({ + search: e.target.value, + }); + }; + + menu =()=> ( +

    + 时间从近到远排序 + 时间从远到近排序 + + ); + + category_button=(category)=>{ + const { current_user, user } = this.props; + const button_lists = + user && current_user && user.login === current_user.login + ? [ + { type: "sponsoring", name: "赞助中" }, + { type: "stopped", name: "已终止" }, + ] + : + []; + + let list = button_lists.map((item, key) => { + return ( + + + + ); + }) + return list; + } + + + render() { + const { current_user, user } = this.props; + const { category , is_public, sponsors } = this.state; + const { coinChangeList, isSpin, total, search, limit, page } = this.state; + return ( + +
    + + +
    +
    +
    {this.category_button(category)}
    + +
    + {sponsors && sponsors.length > 0 ? + + : + + } + { + total && total > limit ? +
    + +
    + : + "" + } +
    + ); + } +}; + +export default SponsorManagement; \ No newline at end of file diff --git a/src/forge/users/sponsor/sponsor_list.js b/src/forge/users/sponsor/sponsor_list.js new file mode 100644 index 000000000..04cdf893e --- /dev/null +++ b/src/forge/users/sponsor/sponsor_list.js @@ -0,0 +1,62 @@ +import React, { Component } from "react"; +import { getImageUrl } from "educoder"; +import FocusButton from "../../UsersList/focus_button"; +import { Button } from "antd"; +import "../../UsersList/list.css"; +class SponsorList extends Component { + + renderList = (users, userClass, current_user) => { + + if (users && users.length > 0) { + return users.map((item, key) => { + return ( +
    +
    +
    + + + +
    +
    + +
    + + 加入时间:{item.format_time} +
    + { + current_user && current_user.login === item.login ? + + : + + } +
    +
    +
    + ); + }); + } + } + render() { + const { users, userClass, current_user } = this.props; + console.log(users); + return ( + this.renderList(users, userClass, current_user) + ); + } +} + +export default SponsorList; -- 2.34.1 From c69692452314c3a2b628b85e4477e0d80927ace9 Mon Sep 17 00:00:00 2001 From: qyzh Date: Thu, 10 Sep 2020 15:55:52 +0800 Subject: [PATCH 05/13] =?UTF-8?q?=E8=B5=9E=E5=8A=A9=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/forge/sponsor/sponsor.css | 4 +- src/forge/users/sponsor/SponsorManagement.js | 39 +++++++--- src/forge/users/sponsor/sponsor_list.js | 77 +++++++++++++------- 3 files changed, 83 insertions(+), 37 deletions(-) diff --git a/src/forge/sponsor/sponsor.css b/src/forge/sponsor/sponsor.css index 707819e8a..5493e6c48 100644 --- a/src/forge/sponsor/sponsor.css +++ b/src/forge/sponsor/sponsor.css @@ -33,6 +33,6 @@ margin-bottom: 20px; } -.sponsor-confirmation-inline{ - display: inline-block; +.sponsor-inline{ + display: inline; } \ No newline at end of file diff --git a/src/forge/users/sponsor/SponsorManagement.js b/src/forge/users/sponsor/SponsorManagement.js index 5e43605d4..a9fbbf64f 100644 --- a/src/forge/users/sponsor/SponsorManagement.js +++ b/src/forge/users/sponsor/SponsorManagement.js @@ -10,12 +10,12 @@ import SponsorList from "./sponsor_list"; const Search = Input.Search; const tempData = [ - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01"}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01"}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01"}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01"}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01"}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01"}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01", amount: 100}, ]; @@ -32,7 +32,7 @@ class SponsorManagement extends Component{ coinChangeList: undefined, total: undefined, category: undefined, - is_public: undefined, + is_sponsor: undefined, sponsors: undefined, }; } @@ -127,11 +127,20 @@ class SponsorManagement extends Component{ return list; } - + changeStatus=(check_is_sponsor, e)=>{ + // const {is_sponsor} = this.state + // const new_is_sponsor = is_sponsor === check_is_sponsor ? undefined : check_is_sponsor + // this.state.is_sponsor = check_is_sponsor; + this.setState({ + is_sponsor: check_is_sponsor, + }) + } + render() { const { current_user, user } = this.props; - const { category , is_public, sponsors } = this.state; + const { category , is_sponsor, sponsors } = this.state; const { coinChangeList, isSpin, total, search, limit, page } = this.state; + return (
    @@ -157,7 +166,17 @@ class SponsorManagement extends Component{
    {this.category_button(category)}
    - + { + user && current_user && user.login === current_user.login ? +
    + this.changeStatus(true, e)}>我赞助的 + { + !is_sponsor ? ():"" + } + this.changeStatus(false, e)}>赞助我的 +
    + :"" + }
    {sponsors && sponsors.length > 0 ? { @@ -10,12 +11,48 @@ class SponsorList extends Component { if (users && users.length > 0) { return users.map((item, key) => { return ( -
    -
    + //
    + //
    + //
    + // + // + // + //
    + //
    + // + //
    + // + // 赞助时间:{item.format_time} + //
    + // { + // current_user && current_user.login === item.login ? + // + // : + // // + // + // } + //
    + //
    + //
    +
    -
    - -
    - - 加入时间:{item.format_time} -
    - { - current_user && current_user.login === item.login ? - - : - - } + {item && item.username} +
    +

    金额:{item.amount}硬币

    + {item.format_time}
    +
    + + {/* {item.amount>0 ? {item.to_user}: {item.to_user}} */} +
    +
    ); }); @@ -52,7 +79,7 @@ class SponsorList extends Component { } render() { const { users, userClass, current_user } = this.props; - console.log(users); + // console.log(users); return ( this.renderList(users, userClass, current_user) ); -- 2.34.1 From 236a8f127a83034530cf775104f79b3b376b0efc Mon Sep 17 00:00:00 2001 From: qyzh Date: Sat, 19 Sep 2020 10:00:30 +0800 Subject: [PATCH 06/13] =?UTF-8?q?sponsor=20tiers=E5=A2=9E=E5=88=A0?= =?UTF-8?q?=E6=94=B9=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/AppConfig.js | 2 +- src/forge/sponsor/Sponsor.js | 81 +++++--- src/forge/sponsor/sponsor.css | 2 +- src/forge/sponsor/sponsor_tier_item.js | 199 ++++++++++++++----- src/forge/users/Infos.js | 20 +- src/forge/users/sponsor/SponsorManagement.js | 70 ++++--- src/forge/users/sponsor/sponsor_list.js | 53 +---- src/forge/users/sponsor/wallet.js | 9 +- 8 files changed, 275 insertions(+), 161 deletions(-) diff --git a/src/AppConfig.js b/src/AppConfig.js index dadadc5f3..f80e96efa 100644 --- a/src/AppConfig.js +++ b/src/AppConfig.js @@ -65,7 +65,7 @@ export function initAxiosInterceptors(props) { // TODO 避免重复的请求 https://github.com/axios/axios#cancellation var proxy = "http://localhost:3000" - proxy = "https://testforgeplus.trustie.net" + // proxy = "https://testforgeplus.trustie.net" const requestMap = {}; window.setfalseInRequestMap = function (keyName) { diff --git a/src/forge/sponsor/Sponsor.js b/src/forge/sponsor/Sponsor.js index 5beba6967..627f076e5 100644 --- a/src/forge/sponsor/Sponsor.js +++ b/src/forge/sponsor/Sponsor.js @@ -1,6 +1,6 @@ import React, { Component } from "react"; import { Link } from "react-router-dom"; -import { Avatar, Tag, Button, Spin, Input, Form} from "antd"; +import { Avatar, Tag, Button, Spin, Input, Form, message} from "antd"; import { Route, Switch } from "react-router-dom"; import { withRouter } from "react-router"; @@ -23,13 +23,13 @@ import '../users/Index.scss'; import "./sponsor.css"; const tempData = [ - {id:1, amount: 5, description: "这能让我感到很开心"}, - {id:2, amount: 10, description: "如果您更加慷慨的话就选择这个"}, - {id:3, amount: 150, description: "这能为我带来相当多的额外收入"}, - {id:4, amount: 250, description: "这能为我带来相当多的额外收入"}, - {id:5, amount: 500, description: "这能为我带来相当多的额外收入"}, - {id:6, amount: 1000, description: "这能为我带来相当多的额外收入"}, - {id:7, amount: 5000, description: "这能为我带来相当多的额外收入"}, + {id:1, tier: 5, description: "这能让我感到很开心"}, + {id:2, tier: 10, description: "如果您更加慷慨的话就选择这个"}, + {id:3, tier: 150, description: "这能为我带来相当多的额外收入"}, + {id:4, tier: 250, description: "这能为我带来相当多的额外收入"}, + {id:5, tier: 500, description: "这能为我带来相当多的额外收入"}, + {id:6, tier: 1000, description: "这能为我带来相当多的额外收入"}, + {id:7, tier: 5000, description: "这能为我带来相当多的额外收入"}, ]; const tempDesc = "我长期从事开源社区相关工作...目前已经开发了多个项目,如xxx, xxxx, ...\n我希望通过资助机制成为全职开源开发者,如果您对我的项目感兴趣,请资助我!" @@ -98,15 +98,17 @@ class Sponsor extends Component { description: undefined, sponsors: undefined, edit: false, + tiers: [], }; } componentDidMount = () => { this.fetchUser(); this.fetchSponsors(); + this.fetchData(); }; - fetchUser = () => { + fetchUser = async () => { this.setState({ isSpin: true, }); @@ -114,15 +116,17 @@ class Sponsor extends Component { const { username } = this.props.match.params; let url = `/users/${username || (current_user && current_user.login)}.json`; - axios + await axios .get(url) .then((result) => { // TODO: 在这里添加了对用户自我介绍的处理,前后端交互实现后需要删掉 - result.data.description = tempDesc; + // result.data.description = tempDesc; + console.log(result.data); this.setState({ - user: result.data, + user: result.data, isSpin: false, }); + // console.log(result.data); }) .catch((error) => { console.log(error); @@ -138,6 +142,23 @@ class Sponsor extends Component { }); } + fetchData = () => { + let url = `/sponsor_tiers.json`; + const user_login = this.props.match.params.username; + axios + .get(url, {params:{login: user_login}}) + .then((result) => { + // console.log(result.data); + // console.log(tempData) + this.setState({ + tiers: result.data + }) + }) + .catch((error) => { + console.log(error); + }) + } + editDescription = () => { this.setState({ edit: true, @@ -155,13 +176,29 @@ class Sponsor extends Component { let value = this.formRef.getItemsValue().description; // console.log(value); let user = this.state.user; - if (user){ - user.description = value; - } - this.setState({ - user: user, - edit: false, - }); + let url = `/users/${user.user_id}/update_description.json` + axios.put(url, {description: value}) + .then((result) => { + user.description = value; + this.setState({ + user: user, + edit: false + }) + message.success("修改成功") + }) + .catch(error => { + console.log(error); + message.error("修改失败") + }) + + + // if (user){ + // user.description = value; + // } + // this.setState({ + // user: user, + // edit: false, + // }); } visitorTemplate = () => { @@ -217,10 +254,8 @@ class Sponsor extends Component { render(){ const { current_user} = this.props; - const { user, isSpin } = this.state; + const { user, isSpin, tiers} = this.state; const sponsorList = this.sponsorList(); - // console.log("current", current_user) - // console.log("user", user) var content = ""; if (current_user && user && user.login !== current_user.login){ @@ -268,7 +303,7 @@ class Sponsor extends Component { + tiers={tiers}>
    diff --git a/src/forge/sponsor/sponsor.css b/src/forge/sponsor/sponsor.css index 5493e6c48..1ca79791a 100644 --- a/src/forge/sponsor/sponsor.css +++ b/src/forge/sponsor/sponsor.css @@ -34,5 +34,5 @@ } .sponsor-inline{ - display: inline; + display: inline-block; } \ No newline at end of file diff --git a/src/forge/sponsor/sponsor_tier_item.js b/src/forge/sponsor/sponsor_tier_item.js index c3f15ea12..96e767233 100644 --- a/src/forge/sponsor/sponsor_tier_item.js +++ b/src/forge/sponsor/sponsor_tier_item.js @@ -1,6 +1,6 @@ import React, { Component } from "react"; import { Link } from "react-router-dom"; -import { Avatar, Tag, Button, Spin, Icon, Modal, Input, Form, message, Popconfirm, Divider} from "antd"; +import { Avatar, Tag, Button, Spin, Icon, Modal, Input, Form, message, Popconfirm, Divider, InputNumber} from "antd"; import { Route, Switch } from "react-router-dom"; import { withRouter } from "react-router"; // import { EditOutlined } from "@ant-design/icons"; @@ -37,15 +37,15 @@ class extends Component{ return(
    - {getFieldDecorator(`amount`,{ + {getFieldDecorator(`tier`,{ rules: [{ - message: '必填字段!', + message: '请输入数字!', pattern: /^[0-9]+$/, required: true }], initialValue: initValue1 ? initValue1 : undefined })( - + )} @@ -70,19 +70,58 @@ class SponsorTierItem extends Component{ super(props) var edit = new Array(); - for(var i=0; i { - // console.log(this.props.tiers) - this.fetchUser(); + + } + + // 如果服务器较慢,组件会先被挂载,此时父组件传来的props数据是空的,但是获得数据后,有新的props,需要更新。 + // 如果用户点击了修改自我描述等父组件的方法,父组件会重新渲染,这个方法又会被调用,有可能原有的编辑框会丢失。 + // 因此先判断一下父组件传过来的数据是否有变化。没有变化则不需要修改state + componentWillReceiveProps = () => { + if (this.props.tiers !== this.state.tiers){ + var edit = new Array(); + for(var i=0; i { + let url = `/sponsor_tiers.json`; + axios + .get(url) + .then((result) => { + console.log(result.data); + // console.log(tempData); + var edit = new Array(); + for(var i=0; i { + console.log(error); + }) } fetchUser = () => { @@ -111,36 +150,87 @@ class SponsorTierItem extends Component{ editTier = (item, key, e) => { var edit = this.state.edit; - edit[key] = true; - this.setState({ - edit:edit - }) + + var editing = false; + for(var i=0; i { + let url; + let values = this.formRef.getItemsValue(); + const {current_user} = this.props; if (this.state.new_tier == key){ console.log("new tier"); + url = `/sponsor_tiers.json`; + axios + .post(url, { + ...values, + user_id: current_user.user_id + }) + .then((result) => { + var {tiers, edit} = this.state; + tiers[key] = result.data; + edit[key] = false; + this.setState({ + tiers: tiers, + edit: edit, + new_tier: undefined + }) + }) + .catch((error) => { + console.log(error); + }) } - console.log("key", key, "item", item) - let values = this.formRef.getItemsValue(); - console.log("values:", values) + else{ + url = `/sponsor_tiers/${item.id}.json` + axios + .put(url, { + ...values, + }) + .then((result) => { + var {tiers, edit} = this.state; + tiers[key] = result.data; + edit[key] = false; + this.setState({ + tiers: tiers, + edit: edit, + new_tier: undefined + }) + message.success("修改成功"); + }) + .catch((error) => { + console.log(error); + message.error("修改失败"); + }) + } + // TODO: 在此处加入对后端的修改请求 - var {tiers, edit} = this.state; - tiers[key] = values; - edit[key] = false; - this.setState({ - tiers: tiers, - edit: edit, - new_tier: undefined - }) + // TODO: 修改的请求实现 } cancelEdit = (item, key, e) => { - let {tiers, edit} = this.state; - tiers.pop(); - edit.pop(); + let {tiers, edit, new_tier} = this.state; + if (new_tier){ + tiers.pop(); + edit.pop(); + } + else { + edit[key] = false; + } this.setState({ tiers: tiers, edit: edit, @@ -150,12 +240,12 @@ class SponsorTierItem extends Component{ newTier = () => { if (this.state.new_tier !== undefined){ - message.info("请先完成当前编辑") + message.warn("请先完成当前编辑") return; } let {tiers, edit} = this.state; - tiers.push({amount: 1, description: ""}) + tiers.push({tier: 1, description: ""}) edit.push(true); this.setState({ tiers: tiers, @@ -168,12 +258,23 @@ class SponsorTierItem extends Component{ // TODO: 此处向后端发送请求删除 let {tiers, edit} = this.state; - tiers.splice(key, 1) - edit.splice(key, 1) - this.setState({ - tiers: tiers, - edit: edit, - }) + let url = `/sponsor_tiers/${item.id}.json`; + + axios + .delete(url) + .then((result) => { + tiers.splice(key, 1) + edit.splice(key, 1) + this.setState({ + tiers: tiers, + edit: edit, + }) + message.success("删除成功"); + }) + .catch((error) => { + console.log(error); + message.error("删除失败"); + }) } toConformation = (item, key, e) => { @@ -189,7 +290,7 @@ class SponsorTierItem extends Component{
      - 金额:{item.amount} + 金额:{item.tier}
      @@ -203,7 +304,7 @@ class SponsorTierItem extends Component{ return (
        - 金额:{item.amount} + 金额:{item.tier} this.editTier(item, key, e)}>
        @@ -216,7 +317,7 @@ class SponsorTierItem extends Component{ cancelText="否" > - , +
      ); @@ -226,7 +327,7 @@ class SponsorTierItem extends Component{ return (
        this.formRef = form} /> @@ -234,29 +335,18 @@ class SponsorTierItem extends Component{
      ); - - // return ( - //
        - //
        - // 金额: - //
        - //
        - // 描述: - // - // - //
        - //
      - // ); } render() { const {tiers} = this.state; const { current_user} = this.props; - const {user} = this.state; - + const {user} = this.props; + + // console.log(tiers); + const renderList = ( tiers && tiers.length > 0 ? tiers.map((item, key) => { - const amount = this.state.edit[key]? ():item.amount; + const tier = this.state.edit[key]? ():item.tier; const description = this.state.edit[key]? ():item.description; var content = ""; @@ -291,7 +381,6 @@ class SponsorTierItem extends Component{ return content; }) : "" ); - return (
      {renderList}
      diff --git a/src/forge/users/Infos.js b/src/forge/users/Infos.js index 434197fea..b6d6b6053 100644 --- a/src/forge/users/Infos.js +++ b/src/forge/users/Infos.js @@ -52,7 +52,8 @@ class Infos extends Component { user: undefined, project_type: undefined, route_type: undefined, - choose_wallet: undefined + c: undefined, + sponsor_management: undefined, }; } @@ -87,8 +88,9 @@ class Infos extends Component { change_project_type = (type) => { const {user} = this.state this.setState({ - project_type: type , + project_type: type, choose_wallet: false, + sponsor_management: undefined, route_type: undefined }) let url = `/users/${user && user.login}` @@ -132,7 +134,10 @@ class Infos extends Component { sponsor_management_link = () => { const {user} = this.state this.setState({ - route_type: undefined + route_type: undefined, + sponsor_management: true, + project_type: undefined, + choose_wallet: undefined, }) this.props.history.push(`/users/${user && user.login}/sponsor_management`) } @@ -142,7 +147,8 @@ class Infos extends Component { this.setState({ project_type: undefined, choose_wallet: true, - route_type: undefined + route_type: undefined, + sponsor_management: undefined, }) this.props.history.push(`/users/${user && user.login}/wallet`) } @@ -158,7 +164,7 @@ class Infos extends Component { render() { const { current_user, mygetHelmetapi } = this.props; - const { user, isSpin, project_type, route_type, choose_wallet } = this.state; + const { user, isSpin, project_type, route_type, choose_wallet, sponsor_management } = this.state; // console.log("current", current_user) // console.log("user", user) return ( @@ -313,7 +319,7 @@ class Infos extends Component {
      • - + 赞助管理
      • @@ -325,7 +331,7 @@ class Infos extends Component {

        -
      • this.sponsor_management_link()}> +
      • this.sponsor_management_link()}>

        赞助管理 diff --git a/src/forge/users/sponsor/SponsorManagement.js b/src/forge/users/sponsor/SponsorManagement.js index a9fbbf64f..74c3c150e 100644 --- a/src/forge/users/sponsor/SponsorManagement.js +++ b/src/forge/users/sponsor/SponsorManagement.js @@ -7,15 +7,23 @@ import CoinChangeItem from "./CoinChangeItem"; import Nodata from "../../Nodata"; import img_array from "../../Images/array.png"; import SponsorList from "./sponsor_list"; + +import "../../sponsor/sponsor.css"; +// import "../new_user.css"; const Search = Input.Search; const tempData = [ - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01", amount: 100}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01", amount: 100}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01", amount: 100}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01", amount: 100}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01", amount: 100}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, login:"alpc104", format_time: "2020-08-01", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: true, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: true, sponsor: true, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: false, sponsor: true, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: false, sponsor: true, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, ]; @@ -29,32 +37,33 @@ class SponsorManagement extends Component{ sort_by: undefined, totalCount: undefined, isSpin: false, - coinChangeList: undefined, total: undefined, - category: undefined, - is_sponsor: undefined, + category: "all", + is_sponsor: false, sponsors: undefined, + displayList: undefined, }; } changeCategory = (cate) => { - // let resultList = this.state.coinChangeList; - // switch (cate.target.value){ - // case "income": - // resultList = resultList.filter(function(item,index,array){ - // return item.amount > 0; - // }); - // break; - // case "outcome": - // resultList = resultList.filter(function(item,index,array){ - // return item.amount < 0; - // }); - // break; + let resultList = this.state.sponsors; + switch (cate.target.value){ + case "sponsoring": + resultList = resultList.filter(function(item,index,array){ + return item.stop_time === "-"; + }); + break; + case "stopped": + resultList = resultList.filter(function(item,index,array){ + return item.stop_time !== "-"; + }); + break; - // } - // this.setState({ - // displayList: resultList, - // }); + } + this.setState({ + category: cate.target.value, + displayList: resultList, + }); }; componentDidMount = () => { @@ -64,6 +73,7 @@ class SponsorManagement extends Component{ get_sponsors = ()=>{ this.setState({ sponsors: tempData, + displayList: tempData, }) } @@ -98,6 +108,7 @@ class SponsorManagement extends Component{ const button_lists = user && current_user && user.login === current_user.login ? [ + { type: "all", name: "全部" }, { type: "sponsoring", name: "赞助中" }, { type: "stopped", name: "已终止" }, ] @@ -138,8 +149,9 @@ class SponsorManagement extends Component{ render() { const { current_user, user } = this.props; - const { category , is_sponsor, sponsors } = this.state; - const { coinChangeList, isSpin, total, search, limit, page } = this.state; + const { category , is_sponsor, sponsors, displayList} = this.state; + const {isSpin, total, search, limit, page }= this.state; + console.log(displayList); return ( @@ -178,11 +190,11 @@ class SponsorManagement extends Component{ :"" }

      - {sponsors && sponsors.length > 0 ? + {displayList && displayList.length > 0 ? : diff --git a/src/forge/users/sponsor/sponsor_list.js b/src/forge/users/sponsor/sponsor_list.js index 826f011b7..feee49edb 100644 --- a/src/forge/users/sponsor/sponsor_list.js +++ b/src/forge/users/sponsor/sponsor_list.js @@ -3,7 +3,9 @@ import { getImageUrl } from "educoder"; import FocusButton from "../../UsersList/focus_button"; import { Button } from "antd"; import "../../Main/list.css"; +import "../../UsersList/list.css"; import "../../sponsor/sponsor.css"; +import "../new_user.css" class SponsorList extends Component { renderList = (users, userClass, current_user) => { @@ -11,67 +13,34 @@ class SponsorList extends Component { if (users && users.length > 0) { return users.map((item, key) => { return ( - //
      - //
      - //
      - // - // - // - //
      - //
      - // - //
      - // - // 赞助时间:{item.format_time} - //
      - // { - // current_user && current_user.login === item.login ? - // - // : - // // - // - // } - //
      - //
      - //
      - -
      - {item && item.username} + {item && item.username}

      金额:{item.amount}硬币

      - {item.format_time} +

      {item.start_time}

      +

      {item.stop_time? item.stop_time:"-"}

      +
      +
      + 可见性:{item.private? "私有":"公开"}
      {/* {item.amount>0 ? {item.to_user}: {item.to_user}} */}
      - + {item.stop_time ==="-"? ():""}
      ); }); diff --git a/src/forge/users/sponsor/wallet.js b/src/forge/users/sponsor/wallet.js index 1f4f43439..2818fade2 100644 --- a/src/forge/users/sponsor/wallet.js +++ b/src/forge/users/sponsor/wallet.js @@ -32,8 +32,9 @@ class Wallet extends Component { coinChangeList: undefined, displayList: undefined, total: undefined, - category: undefined, - is_public: undefined + category: "all", + is_public: undefined, + balance: 50, }; } @@ -70,6 +71,7 @@ class Wallet extends Component { } this.setState({ + category: cate.target.value, displayList: resultList, }); }; @@ -138,7 +140,7 @@ class Wallet extends Component { render() { const { current_user, user } = this.props; const { category , is_public } = this.state; - const { displayList, coinChangeList, isSpin, total, search, limit, page } = this.state; + const { displayList, coinChangeList, isSpin, total, search, limit, page, balance} = this.state; return ( @@ -163,6 +165,7 @@ class Wallet extends Component {
      +
      余额:{balance}
      {this.category_button(category)}
      -- 2.34.1 From fc55df4d307d786b168fbc2b93155fcb63149e10 Mon Sep 17 00:00:00 2001 From: qyzh Date: Tue, 20 Oct 2020 19:59:18 +0800 Subject: [PATCH 07/13] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/forge/sponsor/Sponsor.js | 101 ++++++++++------- src/forge/sponsor/SponsorConfirmation.js | 85 +++++++++++--- src/forge/sponsor/sponsor.css | 32 ++++++ src/forge/sponsor/sponsor_tier_item.js | 65 +++++++---- src/forge/users/sponsor/CoinChangeItem.js | 14 ++- src/forge/users/sponsor/SponsorManagement.js | 110 +++++++++++-------- src/forge/users/sponsor/sponsor_list.js | 67 ++++++++--- src/forge/users/sponsor/wallet.js | 99 +++++++++++------ 8 files changed, 389 insertions(+), 184 deletions(-) diff --git a/src/forge/sponsor/Sponsor.js b/src/forge/sponsor/Sponsor.js index 627f076e5..9720d93c3 100644 --- a/src/forge/sponsor/Sponsor.js +++ b/src/forge/sponsor/Sponsor.js @@ -1,6 +1,6 @@ import React, { Component } from "react"; import { Link } from "react-router-dom"; -import { Avatar, Tag, Button, Spin, Input, Form, message} from "antd"; +import { Avatar, Tag, Button, Spin, Input, Form, message, Divider} from "antd"; import { Route, Switch } from "react-router-dom"; import { withRouter } from "react-router"; @@ -104,11 +104,10 @@ class Sponsor extends Component { componentDidMount = () => { this.fetchUser(); - this.fetchSponsors(); this.fetchData(); }; - fetchUser = async () => { + fetchUser = () => { this.setState({ isSpin: true, }); @@ -116,16 +115,15 @@ class Sponsor extends Component { const { username } = this.props.match.params; let url = `/users/${username || (current_user && current_user.login)}.json`; - await axios + axios .get(url) .then((result) => { // TODO: 在这里添加了对用户自我介绍的处理,前后端交互实现后需要删掉 // result.data.description = tempDesc; - console.log(result.data); this.setState({ user: result.data, isSpin: false, - }); + }, () => {this.fetchSponsors()}); // console.log(result.data); }) .catch((error) => { @@ -137,9 +135,32 @@ class Sponsor extends Component { }; fetchSponsors = () => { - this.setState({ - sponsors: tempSponsors, - }); + // console.log("fetch sponsors"); + const user_id = this.state.user.user_id; + + let url = `/sponsorships/sponsored.json`; + + axios.get(url, {params: {id: user_id}}) + .then((result) => { + // console.log(result); + this.setState({ + sponsors: result.data.sponsorships, + isSpin: false, + }) + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + // this.setState({ + // sponsors: tempData, + // displayList: tempData, + // }) + // this.setState({ + // sponsors: tempSponsors, + // }); } fetchData = () => { @@ -152,7 +173,7 @@ class Sponsor extends Component { // console.log(tempData) this.setState({ tiers: result.data - }) + }); }) .catch((error) => { console.log(error); @@ -205,7 +226,6 @@ class Sponsor extends Component { const user = this.state.user; return (
      - 自我介绍: {user && user.description? (

      {user.description}

      ):(

      暂无自我介绍

      )}
      @@ -216,11 +236,10 @@ class Sponsor extends Component { const user = this.state.user; return (
      - - 自我介绍: - this.editDescription()}> - - {user && user.description? (

      {user.description}

      ):(

      暂无自我介绍

      )} +
      + this.editDescription()}> +
      + {user && user.description? (
      {user.description}
      ):(
      暂无自我介绍
      )}
      ); } @@ -229,7 +248,6 @@ class Sponsor extends Component { const user = this.state.user; return (
      - 自我介绍: this.formRef = form} @@ -256,6 +274,7 @@ class Sponsor extends Component { const { current_user} = this.props; const { user, isSpin, tiers} = this.state; const sponsorList = this.sponsorList(); + console.log(tiers); var content = ""; if (current_user && user && user.login !== current_user.login){ @@ -273,39 +292,43 @@ class Sponsor extends Component {
      -
      -
      -
      成为{user && user.username}的赞助者吧
      - - {user && user.user_identity && ( -
      - {user && user.user_identity} -
      - )} +
      +
      成为{user && user.username}的赞助者吧
      +
      + {user && user.user_identity && ( +
      + {user && user.user_identity} +
      + )}
      -
      + + {content} + +
      + 赞助者: + {sponsorList} +
      +
      -
      + {/*
      {content}
      赞助者: {sponsorList} -
      +
      */}
      -
      - - -
      + +
      diff --git a/src/forge/sponsor/SponsorConfirmation.js b/src/forge/sponsor/SponsorConfirmation.js index 0e22a282d..8d97c51a9 100644 --- a/src/forge/sponsor/SponsorConfirmation.js +++ b/src/forge/sponsor/SponsorConfirmation.js @@ -43,8 +43,15 @@ class extends Component{ this.fetchUser(); this.fetchTierInformation(); this.fetchBalance(); + // this.fetchData(); }; + //组件刚刚挂载时,TPMINDEXHOC还没从后端获取current_user,需要在获取后,再使用current_user的内容 + componentWillReceiveProps = () => { + if (this.props.current_user) + this.fetchBalance(); + } + fetchUser = () => { this.setState({ isSpin: true, @@ -70,16 +77,42 @@ class extends Component{ }; fetchTierInformation = () => { - //TODO: 和后端交互 - this.setState({ - tier: tempData - }) + const { current_user } = this.props; + const { username, tier_id } = this.props.match.params; + let url = `/sponsor_tiers/${tier_id}.json`; + axios + .get(url) + .then((result) => { + this.setState({ + tier: result.data, + }) + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); } fetchBalance = () => { - this.setState({ - balance: tempBalance - }) + const { current_user } = this.props; + let url = `/wallets/balance.json`; + if (current_user){ + axios + .get(url, {params: {id: current_user.user_id}}) + .then((result) => { + this.setState({ + balance: result.data.balance, + }) + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + } } reSelect = () => { @@ -99,8 +132,24 @@ class extends Component{ submit = () => { const value = this.props.form.getFieldsValue(); - console.log(value); - message.success("赞助成功!"); + const {tier, user} = this.state; + const {current_user} = this.props; + // console.log(value); + let url = `/sponsorships.json`; + axios.post(url, { + amount: tier.tier, + visible: value.visible, + single: value.single, + developer_id: user.user_id, + }) + .then((result) => { + console.log(result); + if (result && result.data.status == 1) + message.success(result.data.message); + }) + .catch((error) => { + console.log(error); + }) } render(){ @@ -110,8 +159,8 @@ class extends Component{ const {getFieldDecorator} = form; const current_username = current_user && current_user.username; - const alert_text = this.state.single? `您选择了单次付费,本次扣除${tier && tier.amount}硬币` - :`您选择了按月付费,每月20日将扣除${tier && tier.amount}硬币`; + const alert_text = this.state.single? `您选择了单次付费,本次扣除${tier && tier.tier}硬币` + :`您选择了按月付费,每月20日将扣除${tier && tier.tier}硬币`; // console.log("user", user) // console.log("current user", current_user); @@ -145,7 +194,7 @@ class extends Component{

      所选赞助等级

      -

      {tier && tier.amount}硬币

      +

      {tier && tier.tier}硬币

      {tier && tier.description}

      @@ -167,7 +216,7 @@ class extends Component{ )} -

      本次支付金额{tier && tier.amount}硬币

      +

      本次支付金额{tier && tier.tier}硬币

      {this.state.single? "单次付费": "即日起-次月20日"}

      @@ -188,19 +237,19 @@ class extends Component{ 赞助关系可见性 - {getFieldDecorator(`private`,{ + {getFieldDecorator(`visible`,{ rules: [{ required: true }], - initialValue: false + initialValue: 1 })( - 所有人可见 - 私密 + 所有人可见 + 私密 )} - +
      diff --git a/src/forge/sponsor/sponsor.css b/src/forge/sponsor/sponsor.css index 1ca79791a..0433c4a1b 100644 --- a/src/forge/sponsor/sponsor.css +++ b/src/forge/sponsor/sponsor.css @@ -35,4 +35,36 @@ .sponsor-inline{ display: inline-block; +} + +.tier-Item:last-child{ + border-bottom: none !important; + } + +.tier-Item{ + border-bottom:1px solid rgba(238,238,238,1); + padding:9px 12px; +} + + +.right{ + float: right +} + +.btn-border-5{ + border-radius: 5px; +} + +.description-edit{ + min-height:28px; + border:true; +} + +.tier-title{ + font-size: 16px; + font-weight: 600; +} + +.mr10{ + margin-right: 10px; } \ No newline at end of file diff --git a/src/forge/sponsor/sponsor_tier_item.js b/src/forge/sponsor/sponsor_tier_item.js index 96e767233..e5b4c1aba 100644 --- a/src/forge/sponsor/sponsor_tier_item.js +++ b/src/forge/sponsor/sponsor_tier_item.js @@ -20,6 +20,7 @@ import "../users/new_user.css"; import "../css/index.scss"; import '../users/Index.scss'; import "./sponsor.css"; +import "../Main/list.css"; import Item from "antd/lib/list/Item"; const FormItem = Form.Item; @@ -52,7 +53,10 @@ class extends Component{ {getFieldDecorator(`description`,{ rules: [{ message: '必填字段!', - required: true + required: true, + }, { + max: 255, + message: "长度不能超过255个字符" }], initialValue: initValue2 ? initValue2 : undefined })( @@ -167,9 +171,17 @@ class SponsorTierItem extends Component{ } } - confirmEdit = (item, key, e) => { + confirmEdit = async (item, key, e) => { let url; + try { + const values = await this.formRef.props.form.validateFields(); + console.log('Success:', values); + } catch (errorInfo) { + message.warn('提交失败,数据不合法'); + return false; + } let values = this.formRef.getItemsValue(); + console.log(this.formRef); const {current_user} = this.props; if (this.state.new_tier == key){ console.log("new tier"); @@ -278,7 +290,7 @@ class SponsorTierItem extends Component{ } toConformation = (item, key, e) => { - const {user} = this.state + const {user} = this.props; this.setState({ route_type: undefined }) @@ -287,14 +299,14 @@ class SponsorTierItem extends Component{ visitorTemplate = (item, key) => { return ( -
        +
          -
          - 金额:{item.tier} - +
          + {item.tier}  硬币 +
          -
          - 描述:{item.description} +
          + {item.description}
        ); @@ -302,13 +314,10 @@ class SponsorTierItem extends Component{ manageTemplate = (item, key) => { return ( -
          -
          - 金额:{item.tier} - this.editTier(item, key, e)}> -
          -
          - 描述:{item.description} +
          +
          + {item.tier}  硬币 + this.deleteTier(item, key, e)} @@ -316,16 +325,23 @@ class SponsorTierItem extends Component{ okText="是" cancelText="否" > - + + + this.editTier(item, key, e)}> +
          -
        +
        + {item.description} + +
        +
    ); } editTemplate = (item, key) => { return ( -
      +
      -
    +
  • ); } @@ -342,7 +358,8 @@ class SponsorTierItem extends Component{ const { current_user} = this.props; const {user} = this.props; - // console.log(tiers); + // console.log("item state tiers:", tiers); + // console.log("item props tiers:", this.props.tiers); const renderList = ( tiers && tiers.length > 0 ? tiers.map((item, key) => { @@ -383,7 +400,11 @@ class SponsorTierItem extends Component{ ); return (
    -
    {renderList}
    +
    +

    选择您的赞助等级

    + {/* */} + {renderList} +
    {current_user && user && user.login === current_user.login ? ( ): "" diff --git a/src/forge/users/sponsor/CoinChangeItem.js b/src/forge/users/sponsor/CoinChangeItem.js index e046b65c1..820aa8f4e 100644 --- a/src/forge/users/sponsor/CoinChangeItem.js +++ b/src/forge/users/sponsor/CoinChangeItem.js @@ -11,21 +11,23 @@ class CoinChangeItem extends Component { }) } render() { - const { coinChanges } = this.props; + const { coinChanges, current_user } = this.props; const renderList = ( coinChanges && coinChanges.length > 0 ? coinChanges.map((item, key) => { + let url = current_user && item.to_user_login == current_user.login? `/users/${item.from_user_login}`:`/users/${item.to_user_login}`; return (
    -

    金额:{item.amount>0? "收入":"支出"}{Math.abs(item.amount)}硬币

    -

    变动原因:{item.reasons}

    -

    备注:{item.description}

    +

    金额:{current_user && item.to_user_login == current_user.login? "收入":"支出"}{item.amount}硬币

    +

    变动原因:{item.reason}

    + {/*

    备注:{item.description}

    */}
    {item.date} - {item.to_user} - {/* {item.amount>0 ? {item.to_user}: {item.to_user}} */} + {current_user && item.to_user_login == current_user.login? + ({item.from_user}): + ({item.to_user})}
    diff --git a/src/forge/users/sponsor/SponsorManagement.js b/src/forge/users/sponsor/SponsorManagement.js index 74c3c150e..2a84893c4 100644 --- a/src/forge/users/sponsor/SponsorManagement.js +++ b/src/forge/users/sponsor/SponsorManagement.js @@ -13,17 +13,17 @@ import "../../sponsor/sponsor.css"; const Search = Input.Search; const tempData = [ - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: true, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: true, sponsor: true, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: false, sponsor: true, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: false, sponsor: true, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, - {image_url: "avatars/User/b", username: "万山川", user_id: 1369, private: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: true, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: true, sponsor: true, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: false, sponsor: true, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: false, sponsor: true, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, + {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, ]; @@ -38,7 +38,7 @@ class SponsorManagement extends Component{ totalCount: undefined, isSpin: false, total: undefined, - category: "all", + category: "sponsoring", is_sponsor: false, sponsors: undefined, displayList: undefined, @@ -46,24 +46,10 @@ class SponsorManagement extends Component{ } changeCategory = (cate) => { - let resultList = this.state.sponsors; - switch (cate.target.value){ - case "sponsoring": - resultList = resultList.filter(function(item,index,array){ - return item.stop_time === "-"; - }); - break; - case "stopped": - resultList = resultList.filter(function(item,index,array){ - return item.stop_time !== "-"; - }); - break; - - } this.setState({ category: cate.target.value, - displayList: resultList, - }); + page: 1, + }, ()=>{this.get_sponsors();}); }; componentDidMount = () => { @@ -71,22 +57,51 @@ class SponsorManagement extends Component{ } get_sponsors = ()=>{ + const user_id = this.props.current_user.user_id; + + let url = this.state.is_sponsor? `sponsoring`:`sponsored`; + url = this.state.category === "stopped"? `stopped_` + url: url; + url = `/sponsorships/` + url + `.json`; + + const {page, limit} = this.state; this.setState({ - sponsors: tempData, - displayList: tempData, + isSpin: true }) + axios.get(url, { + params: { + id: user_id, + page: page, + limit: limit, + }}) + .then((result) => { + // console.log(result); + this.setState({ + displayList: result.data.sponsorships, + total: result.data.count, + isSpin: false, + }) + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + // this.setState({ + // sponsors: tempData, + // displayList: tempData, + // }) } //切换页数 changePage = (page) => { - this.state.page = page; - // this.get_coin_changes(); + this.setState({ + page: page + }, ()=>{this.get_sponsors()}) }; // 排序 ChangeSoryBy = (e) => { - // this.state.sort_by = e.key; - // this.get_coin_changes(); console.log(e.key) }; @@ -108,7 +123,6 @@ class SponsorManagement extends Component{ const button_lists = user && current_user && user.login === current_user.login ? [ - { type: "all", name: "全部" }, { type: "sponsoring", name: "赞助中" }, { type: "stopped", name: "已终止" }, ] @@ -144,28 +158,30 @@ class SponsorManagement extends Component{ // this.state.is_sponsor = check_is_sponsor; this.setState({ is_sponsor: check_is_sponsor, - }) + page: 1, + }, ()=>{this.get_sponsors()}); } render() { const { current_user, user } = this.props; const { category , is_sponsor, sponsors, displayList} = this.state; const {isSpin, total, search, limit, page }= this.state; - console.log(displayList); + // console.log(displayList); return ( + //
    - */} + {/*
    */}
    {this.category_button(category)}
    { @@ -190,14 +206,15 @@ class SponsorManagement extends Component{ :"" }
    - {displayList && displayList.length > 0 ? + {user && current_user && user.login === current_user.login && displayList && displayList.length > 0 ? : - + } { total && total > limit ? @@ -214,6 +231,7 @@ class SponsorManagement extends Component{ "" } + //
    ); } }; diff --git a/src/forge/users/sponsor/sponsor_list.js b/src/forge/users/sponsor/sponsor_list.js index feee49edb..093e14a6d 100644 --- a/src/forge/users/sponsor/sponsor_list.js +++ b/src/forge/users/sponsor/sponsor_list.js @@ -1,56 +1,89 @@ import React, { Component } from "react"; import { getImageUrl } from "educoder"; import FocusButton from "../../UsersList/focus_button"; -import { Button } from "antd"; +import { Button, message, Popconfirm } from "antd"; import "../../Main/list.css"; import "../../UsersList/list.css"; import "../../sponsor/sponsor.css"; import "../new_user.css" +import axios from "axios"; +import { Link } from "react-router-dom"; class SponsorList extends Component { + stop_sponsorship = (item, key, e)=>{ + + console.log("before: ", this.state.users); + let url = `/sponsorships/${item.id}.json`; + axios.delete(url) + .then((result) => { + console.log(result); + if(result && result.data.status == 1){ + message.success(result.data.message); + this.props.rerender(); + } + }) + .catch((error) => { + console.log(error); + message.error("失败"); + }) + } + renderList = (users, userClass, current_user) => { if (users && users.length > 0) { return users.map((item, key) => { return (
    -
    + {/*
    - +
    */} + + + +
    + {item && item.username} +
    + 金额:{item.amount}硬币 + 累计金额:{item.accumulate}硬币
    - {item && item.username} -
    -

    金额:{item.amount}硬币

    -

    {item.start_time}

    -

    {item.stop_time? item.stop_time:"-"}

    -
    -
    - 可见性:{item.private? "私有":"公开"} -
    +
    - {/* {item.amount>0 ? {item.to_user}: {item.to_user}} */} + {item.start_time} - {item.stop_time? item.stop_time:"现在"} +
    - {item.stop_time ==="-"? ():""} +
    + {item.stop_time? "":( + this.stop_sponsorship(item, key, e)} + // onCancel={cancel} + okText="是" + cancelText="否" + > + + )}
    ); }); + } else{ + return null; } } render() { const { users, userClass, current_user } = this.props; - // console.log(users); return ( - this.renderList(users, userClass, current_user) +
    {this.renderList(users, userClass, current_user)}
    + ); } } diff --git a/src/forge/users/sponsor/wallet.js b/src/forge/users/sponsor/wallet.js index 2818fade2..1ca3a37f1 100644 --- a/src/forge/users/sponsor/wallet.js +++ b/src/forge/users/sponsor/wallet.js @@ -25,16 +25,15 @@ class Wallet extends Component { super(props); this.state = { page: 1, - limit: 15, - sort_by: undefined, - totalCount: undefined, + limit: 10, + sort_by: "desc", isSpin: false, coinChangeList: undefined, displayList: undefined, total: undefined, category: "all", - is_public: undefined, balance: 50, + saerch: undefined, }; } @@ -45,48 +44,77 @@ class Wallet extends Component { componentDidUpdate = () => { // this.get_coin_changes() }; + + componentWillReceiveProps = () => { + if (this.props.current_user) + this.get_coin_changes(); + } get_coin_changes = () => { this.setState({ - coinChangeList: tempData, - displayList: tempData, - total: tempData.count, - isSpin: false, - }); + isSpin: true + }) + + let url = `/wallets/coin_changes.json`; + const {category, sort_by, page, limit} = this.state; + const {current_user} = this.props; + let user_id = current_user && current_user.user_id; + if (current_user){ + axios.get(url, { + params: { + id: user_id, + category: category, + sort_direction: sort_by, + page: page, + limit: limit, + }}) + .then((result) => { + // console.log(result); + this.setState({ + coinChangeList: result.data.coin_changes, + displayList: result.data.coin_changes, + total: result.data.count, + balance: result.data.balance, + isSpin: false, + }) + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + } + // this.setState({ + // coinChangeList: tempData, + // displayList: tempData, + // total: tempData.count, + // isSpin: false, + // }); }; changeCategory = (cate) => { - let resultList = this.state.coinChangeList; - switch (cate.target.value){ - case "income": - resultList = resultList.filter(function(item,index,array){ - return item.amount > 0; - }); - break; - case "outcome": - resultList = resultList.filter(function(item,index,array){ - return item.amount < 0; - }); - break; - - } this.setState({ category: cate.target.value, - displayList: resultList, - }); + page: 1, + }, ()=> {this.get_coin_changes();}); }; //切换页数 changePage = (page) => { - this.state.page = page; - this.get_coin_changes(); + this.setState({ + page: page + }, ()=>{this.get_coin_changes();}) }; // 排序 ChangeSoryBy = (e) => { - // this.state.sort_by = e.key; + this.setState({ + sort_by: e.key, + page: 1, + }, ()=>{this.get_coin_changes();}) // this.get_coin_changes(); - console.log(e.key) + console.log(e.key); }; changeSearchValue = (e) => { @@ -97,8 +125,8 @@ class Wallet extends Component { menu =()=> ( - 时间从近到远排序 - 时间从远到近排序 + 时间从近到远排序 + 时间从远到近排序 ); @@ -139,13 +167,12 @@ class Wallet extends Component { render() { const { current_user, user } = this.props; - const { category , is_public } = this.state; + const { category , sort_by } = this.state; const { displayList, coinChangeList, isSpin, total, search, limit, page, balance} = this.state; - return (
    - + /> */}
    @@ -170,7 +197,7 @@ class Wallet extends Component {
    {this.category_button(category)}
    - {displayList && displayList.length > 0 ? + {user && current_user && user.login === current_user.login && displayList && displayList.length > 0 ? Date: Mon, 9 Nov 2020 21:00:40 +0800 Subject: [PATCH 08/13] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E8=B5=9E=E5=8A=A9=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/forge/sponsor/SponsorConfirmation.js | 73 +++++++++++++++++--- src/forge/sponsor/sponsor.css | 10 +++ src/forge/users/Infos.js | 8 +-- src/forge/users/new_user.css | 7 +- src/forge/users/sponsor/SponsorManagement.js | 1 + src/forge/users/sponsor/sponsor_list.js | 13 +++- 6 files changed, 97 insertions(+), 15 deletions(-) diff --git a/src/forge/sponsor/SponsorConfirmation.js b/src/forge/sponsor/SponsorConfirmation.js index 8d97c51a9..71ec07e14 100644 --- a/src/forge/sponsor/SponsorConfirmation.js +++ b/src/forge/sponsor/SponsorConfirmation.js @@ -1,6 +1,6 @@ import React, { Component } from "react"; import { Link } from "react-router-dom"; -import { Avatar, Tag, Button, Spin, Input, Divider, Form, Radio, Alert, message} from "antd"; +import { Avatar, Tag, Button, Spin, Input, Divider, Form, Radio, Alert, message, Modal} from "antd"; import { Route, Switch } from "react-router-dom"; import { withRouter } from "react-router"; @@ -24,6 +24,7 @@ import { submitUserCode } from "../../redux/actions/ojForUser"; const tempData = {amount:100, description: "如果您更加慷慨的话就选择这个"}; const tempBalance = 999; const FormItem = Form.Item; +const { confirm } = Modal; const SponsorConfirmation = Form.create()( class extends Component{ @@ -34,8 +35,11 @@ class extends Component{ isSpin: false, user: undefined, tier: undefined, - single: true, + single: false, balance: undefined, + is_sponsoring: false, + visible: false, + sponsorship_id: undefined, }; } @@ -84,7 +88,9 @@ class extends Component{ .get(url) .then((result) => { this.setState({ - tier: result.data, + tier: result.data.tier, + is_sponsoring: result.data.is_sponsoring, + sponsorship_id: result.data.sponsorship_id, }) }) .catch((error) => { @@ -130,6 +136,24 @@ class extends Component{ }) } + updateSponsorship = () => { + const value = this.props.form.getFieldsValue(); + const {tier, user, sponsorship_id} = this.state; + const {current_user} = this.props; + let url = `/sponsorships/${sponsorship_id}.json`; + axios.put(url, { + amount: tier.tier, + visible: value.visible + }) + .then((result) => { + if (result && result.data.status == 1) + message.success(result.data.message); + }) + .catch((error) => { + console.log(error); + }) + } + submit = () => { const value = this.props.form.getFieldsValue(); const {tier, user} = this.state; @@ -143,7 +167,7 @@ class extends Component{ developer_id: user.user_id, }) .then((result) => { - console.log(result); + // console.log(result); if (result && result.data.status == 1) message.success(result.data.message); }) @@ -152,17 +176,48 @@ class extends Component{ }) } + handleCancel = e => { + this.setState({ + visible: false, + }); + }; + + showModal = () => { + this.setState({ + visible: true, + }); + }; + + showConfirm = () => { + const {user} = this.state; + const fun = this.state.is_sponsoring?this.updateSponsorship:this.submit; + let text = this.state.is_sponsoring?`确认要修改对 ${user && user.username} 的赞助吗?若修改金额,将在下次自动扣款生效。` + :`确认要赞助 ${user && user.username} 吗?`; + confirm({ + // title: '确认赞助', + // icon: , + content: text, + onOk() { + fun() + }, + onCancel() { + + }, + }); + } + render(){ const {tier_id, username} = this.props.match.params; const {current_user, form} = this.props; - const {user, isSpin, tier, balance} = this.state; + const {user, isSpin, tier, balance, is_sponsoring, single} = this.state; const {getFieldDecorator} = form; const current_username = current_user && current_user.username; const alert_text = this.state.single? `您选择了单次付费,本次扣除${tier && tier.tier}硬币` :`您选择了按月付费,每月20日将扣除${tier && tier.tier}硬币`; - // console.log("user", user) + // console.log("sponsoring", is_sponsoring); + // console.log("tier: ", tier); // console.log("current user", current_user); const radioStyle = { @@ -208,9 +263,9 @@ class extends Component{ rules: [{ required: true }], - initialValue: true + initialValue: single })( - this.changeSingle(e)}> + this.changeSingle(e)} disabled={is_sponsoring}> 单次付费 按月支付 @@ -249,7 +304,7 @@ class extends Component{ )} - +
    diff --git a/src/forge/sponsor/sponsor.css b/src/forge/sponsor/sponsor.css index 0433c4a1b..beeb07fba 100644 --- a/src/forge/sponsor/sponsor.css +++ b/src/forge/sponsor/sponsor.css @@ -67,4 +67,14 @@ .mr10{ margin-right: 10px; +} + +.confirm-btn{ + width: 100%; + border-radius: 5px; +} + +.sponsor-item-btn{ + display: flex; + flex-direction: column; } \ No newline at end of file diff --git a/src/forge/users/Infos.js b/src/forge/users/Infos.js index b6d6b6053..bfc3591ef 100644 --- a/src/forge/users/Infos.js +++ b/src/forge/users/Infos.js @@ -189,10 +189,10 @@ class Infos extends Component {
    {user && current_user && user.login === current_user.login && ( -
    +
    - )} + + )} + {!item.stop_time && item.sponsor_id==current_user.user_id? ( + + ):""} +
    ); }); -- 2.34.1 From 2cc888a9722306bb23e9436d5cc495873cc710f4 Mon Sep 17 00:00:00 2001 From: qyzh Date: Tue, 1 Dec 2020 14:52:23 +0800 Subject: [PATCH 09/13] fix bugs --- src/forge/Version/UpdateVersion.js | 191 ++++++++++++++++++++++++ src/forge/sponsor/sponsor_tier_item.js | 10 +- src/forge/users/sponsor/sponsor_list.js | 2 +- 3 files changed, 198 insertions(+), 5 deletions(-) create mode 100644 src/forge/Version/UpdateVersion.js diff --git a/src/forge/Version/UpdateVersion.js b/src/forge/Version/UpdateVersion.js new file mode 100644 index 000000000..d9eebeddd --- /dev/null +++ b/src/forge/Version/UpdateVersion.js @@ -0,0 +1,191 @@ +import React , { Component } from "react"; +import { Form , Input , Select,Divider,Button,Checkbox,Dropdown,Menu} from 'antd'; +import {Link} from 'react-router-dom'; + +import UploadComponent from '../Upload/Index'; +import '../Order/order.css'; +import './version.css'; + +import axios from 'axios'; + +const Option = Select.Option; +const TextArea = Input.TextArea; +class NewVersion extends Component{ + constructor(props){ + super(props); + this.state={ + branch_name:"", + issue_tag_ids:"", + fixed_version_id:"", + issue_chosen:undefined, + fileList:undefined, + ischeck:undefined, + pull:undefined, + tag_name:'', + data:undefined + } + } + + componentDidMount=()=>{ + this.getSelectList(); + } + + getSelectList=()=>{ + const { projectsId,versionId} = this.props.match.params; + const url = `/projects/${projectsId}/version_releases/${versionId}/edit.json`; + axios.get(url).then((result)=>{ + if(result){ + this.setState({ + data:result.data, + pull:result.data.target_commitish + }) + } + }).catch((error)=>{ + console.log(error); + }) + } + + + //delete + deleteversion=()=>{ + const { projectsId , versionId} = this.props.match.params; + const url = `/projects/${projectsId}/version_releases/${versionId}.json`; + axios.delete(url,{ data: { + project_id: projectsId, + id:versionId + } + }).then((result)=>{ + if(result){ + this.props.history.push(`/projects/${projectsId}/version`); + + } + }).catch((error)=>{ + console.log(error); + }) + } + + // 创建 + handleSubmit=()=>{ + this.props.form.validateFieldsAndScroll((err, values) => { + if(!err){ + const { projectsId,versionId} = this.props.match.params; + const { pull,ischeck } = this.state; + const url = `/projects/${projectsId}/version_releases/${versionId}.json`; + // if(values.issue_type==="普通"){ + // values.issue_type="1" + // } + axios.put(url,{ + ...values, + tag_name:this.state.data&&this.state.data.tag_name, + draft:false, + prerelease:ischeck, + target_commitish:pull + }).then(result=>{ + if(result){ + this.props.history.push(`/projects/${projectsId}/version`); + } + }).catch(error=>{ + console.log(error); + }) + + } + }) + } + + RedieonChange=(e)=>{ + this.setState({ + ischeck:e.target.checked + }) + } + Preservation=()=>{ + alert(this.state.data.tag_name) + } + + renderMenu =(array,id)=>{ + return( + + { + array && array.length > 0 && array.map((item,key)=>{ + return( + this.getOption(item)}>{item} + ) + }) + } + + ) + } + + getOption=(name)=>{ + this.setState({ + pull:name + }) + + } + + changmodelname=(e)=>{ + this.setState({ + tag_name:e.target.value + }) + } + + render(){ + const { getFieldDecorator } = this.props.form; + const { projectsId } = this.props.match.params; + return( +
    +
    +

    发布新版

    +
    版本发布组织项目的版本。
    + +
    + {this.state.data&&this.state.data.tag_name}@{this.state.data&&this.state.data.target_commitish} +
    +
    +
    +

    标题

    +
    + + {getFieldDecorator('name', { + rules: [{ + required: true, message: '请输入标题' + }], + initialValue:this.state.data&&this.state.data.name + + })( + + )} + +
    +

    内容

    + + {getFieldDecorator('body', { + rules: [{ + required: true, message: '请输入描述内容' + }], + initialValue:this.state.data&&this.state.data.body + })( +