From 29e9f37a38f9692482c6543791132fd0afc19a7f Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 30 Jul 2019 09:52:47 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/homework_commons_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/homework_commons_controller.rb b/app/controllers/homework_commons_controller.rb index 29f270a34..5cccb3ee7 100644 --- a/app/controllers/homework_commons_controller.rb +++ b/app/controllers/homework_commons_controller.rb @@ -212,7 +212,7 @@ class HomeworkCommonsController < ApplicationController format.xlsx{ student_work_to_xlsx(@work_excel,@homework) exercise_export_name = "#{current_user.real_name}_#{@course.name}_#{@homework.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" - render xlsx: "#{exercise_export_name.strip.first(30)}",template: "homework_commons/works_list.xlsx.axlsx",locals: + render xlsx: "#{exercise_export_name.strip}",template: "homework_commons/works_list.xlsx.axlsx",locals: {table_columns: @work_head_cells,task_users: @work_cells_column} } end From 5afe063a85ef966b3cc84b940afabfffc4938aa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 10:15:33 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E4=BC=97=E5=8C=85=E7=A7=BB=E6=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../images/educoder/project_packagesHead.jpg | Bin 0 -> 58861 bytes public/react/src/App.js | 9 + .../src/modules/projectPackages/MDEditors.js | 337 +++++++ .../PackageIndex/PackageBanner.js | 25 + .../PackageIndex/PackageConcent.js | 298 ++++++ .../PackageIndex/PackageIndex.js | 30 + .../NEITaskDetailsModel.js | 41 + .../PackageIndexNEITaskDetails.js | 485 +++++++++ .../img/gouxuan.png | Bin 0 -> 305 bytes .../img/weigouxuan.png | Bin 0 -> 281 bytes .../PackageIndexNEITaskDetails/newsone.png | Bin 0 -> 341 bytes .../PackageIndexNEITaskDetails/newstwo.png | Bin 0 -> 288 bytes .../PackageIndexNEITaskDetails/pds.css | 60 ++ .../PackageIndexNEIBanner.js | 41 + .../PackageIndexNEIBannerConcent.js | 932 ++++++++++++++++++ .../PackageIndexNEISubmit.js | 49 + .../PackageIndexNewandEditIndex.js | 61 ++ .../PackageIndexNewandEdit/PhoneModel.js | 140 +++ .../projectPackages/ProjectPackageIndex.js | 76 ++ .../projectPackages/packageconcnet.css | 338 +++++++ public/react/src/modules/tpm/NewHeader.js | 5 +- public/stylesheets/educoder/edu-all.css | 4 +- 22 files changed, 2929 insertions(+), 2 deletions(-) create mode 100644 public/images/educoder/project_packagesHead.jpg create mode 100644 public/react/src/modules/projectPackages/MDEditors.js create mode 100644 public/react/src/modules/projectPackages/PackageIndex/PackageBanner.js create mode 100644 public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js create mode 100644 public/react/src/modules/projectPackages/PackageIndex/PackageIndex.js create mode 100644 public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/NEITaskDetailsModel.js create mode 100644 public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js create mode 100644 public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/img/gouxuan.png create mode 100644 public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/img/weigouxuan.png create mode 100755 public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/newsone.png create mode 100755 public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/newstwo.png create mode 100644 public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/pds.css create mode 100644 public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBanner.js create mode 100644 public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js create mode 100644 public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js create mode 100644 public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js create mode 100644 public/react/src/modules/projectPackages/PackageIndexNewandEdit/PhoneModel.js create mode 100644 public/react/src/modules/projectPackages/ProjectPackageIndex.js create mode 100644 public/react/src/modules/projectPackages/packageconcnet.css diff --git a/public/images/educoder/project_packagesHead.jpg b/public/images/educoder/project_packagesHead.jpg new file mode 100644 index 0000000000000000000000000000000000000000..181045e03a3e1ca9a2e24e3034669186cbdff87d GIT binary patch literal 58861 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 import('./modules/projectPackages/ProjectPackageIndex'), + loading: Loading, +}) + class App extends Component { constructor(props) { super(props) @@ -296,6 +302,9 @@ class App extends Component { {/**/} + + {/*众包创新*/} + {/*认证*/} diff --git a/public/react/src/modules/projectPackages/MDEditors.js b/public/react/src/modules/projectPackages/MDEditors.js new file mode 100644 index 000000000..b6fee5582 --- /dev/null +++ b/public/react/src/modules/projectPackages/MDEditors.js @@ -0,0 +1,337 @@ +import React, {Component} from 'react'; + +import {Input, Select, Radio, Checkbox, Popconfirm, message, Modal} from 'antd'; + +import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom"; + +import { getImageUrl, toPath, getUrl } from 'educoder'; + +require('codemirror/lib/codemirror.css'); + +let origin = getUrl(); +let path = getUrl("/editormd/lib/") + + +const $ = window.$; + +let timeout; + +let currentValue; + +const Option = Select.Option; + +const RadioGroup = Radio.Group; + + + +// 保存数据 +function md_add_data(k,mdu,d){ + window.sessionStorage.setItem(k+mdu,d); +} + +// 清空保存的数据 +function md_clear_data(k,mdu,id){ + window.sessionStorage.removeItem(k+mdu); + var id1 = "#e_tip_"+id; + var id2 = "#e_tips_"+id; + if(k == 'content'){ + $(id2).html(" "); + }else{ + $(id1).html(" "); + } +} +window.md_clear_data = md_clear_data +// editor 存在了jquery对象上,应用不需要自己写md_rec_data方法了 +function md_rec_data(k, mdu, id) { + if (window.sessionStorage.getItem(k + mdu) !== null) { + var editor = $("#e_tips_" + id).data('editor'); + editor.setValue(window.sessionStorage.getItem(k + mdu)); + // debugger; + // /shixuns/b5hjq9zm/challenges/3977/tab=3 setValue可能导致editor样式问题 + md_clear_data(k, mdu, id); + } +} +window.md_rec_data = md_rec_data; + +function md_elocalStorage(editor,mdu,id){ + if (window.sessionStorage){ + var oc = window.sessionStorage.getItem('content'+mdu); + if(oc !== null ){ + console.log("#e_tips_"+id) + $("#e_tips_"+id).data('editor', editor); + var h = '您上次有已保存的数据,是否恢复 ? / 不恢复'; + $("#e_tips_"+id).html(h); + } + setInterval(function() { + var d = new Date(); + var h = d.getHours(); + var m = d.getMinutes(); + var s = d.getSeconds(); + h = h < 10 ? '0' + h : h; + m = m < 10 ? '0' + m : m; + s = s < 10 ? '0' + s : s; + if(editor.getValue().trim() != ""){ + md_add_data("content",mdu,editor.getValue()); + var id1 = "#e_tip_"+id; + var id2 = "#e_tips_"+id; + + var textStart = " 数据已于 " + var text = textStart + h + ':' + m + ':' + s +" 保存 "; + // 占位符 + var oldHtml = $(id2).html(); + if (oldHtml && oldHtml != ' ' && oldHtml.startsWith(textStart) == false) { + $(id2).html( oldHtml.split(' (')[0] + ` (${text})`); + } else { + $(id2).html(text); + } + // $(id2).html(""); + } + },10000); + + }else{ + $("#e_tip_"+id).after('您的浏览器不支持localStorage.无法开启自动保存草稿服务,请升级浏览器!'); + } +} + + +function create_editorMD(id, width, high, placeholder, imageUrl, callback, initValue, + onchange, watch, { noStorage, showNullButton }, that) { + // 还是出现了setting只有一份,被共用的问题 + + var editorName = window.editormd(id, { + width: width, + height: high===undefined?400:high, + path: path, // "/editormd/lib/" + markdown : initValue, + + dialogLockScreen: false, + watch:watch===undefined?true:watch, + syncScrolling: "single", + tex: true, + tocm: true, + emoji: true, + taskList: true, + codeFold: true, + searchReplace: true, + htmlDecode: "style,script,iframe", + sequenceDiagram: true, + autoFocus: false, + + // mine + + toolbarIcons: function (mdEditor) { + // + // let react_id = `react_${id}`; + // const __that = window[react_id] + + // Or return editormd.toolbarModes[name]; // full, simple, mini + // Using "||" set icons align right. + const icons = ["bold", "italic", "|", "list-ul", "list-ol", "|", "code", "code-block", "|", "testIcon", "testIcon1", '|', "image", "table", '|', "watch", "clear"]; + // if (__that.props.showNullButton) { + // icons.push('nullBtton') + // } + return icons + + + }, + toolbarCustomIcons: { + testIcon: "
", + testIcon1: "
", + nullBtton: "
点击插入填空项
", + }, + //这个配置在simple.html中并没有,但是为了能够提交表单,使用这个配置可以让构造出来的HTML代码直接在第二个隐藏的textarea域中,方便post提交表单。 + saveHTMLToTextarea: true, + // 用于增加自定义工具栏的功能,可以直接插入HTML标签,不使用默认的元素创建图标 + dialogMaskOpacity: 0.6, + placeholder: placeholder, + imageUpload: true, + imageFormats: ["jpg", "jpeg", "gif", "png", "bmp", "webp", "JPG", "JPEG", "GIF", "PNG", "BMP", "WEBP"], + imageUploadURL: imageUrl,//url + onchange: onchange, + onload: function() { + let _id = this.id // 如果要使用this,这里不能使用箭头函数 + let _editorName = this; + let react_id = `react_${_editorName.id}`; + const __that = window[react_id] + + // this.previewing(); + // let _id = id; + $("#" + _id + " [type=\"latex\"]").bind("click", function () { + _editorName.cm.replaceSelection("```latex"); + _editorName.cm.replaceSelection("\n"); + _editorName.cm.replaceSelection("\n"); + _editorName.cm.replaceSelection("```"); + var __Cursor = _editorName.cm.getDoc().getCursor(); + _editorName.cm.setCursor(__Cursor.line - 1, 0); + }); + + $("#" + _id + " [type=\"inline\"]").bind("click", function () { + _editorName.cm.replaceSelection("$$$$"); + var __Cursor = _editorName.cm.getDoc().getCursor(); + _editorName.cm.setCursor(__Cursor.line, __Cursor.ch - 2); + _editorName.cm.focus(); + }); + $("[type=\"inline\"]").attr("title", "行内公式"); + $("[type=\"latex\"]").attr("title", "多行公式"); + + if (__that.props.showNullButton) { + const NULL_CH = '▁' + // const NULL_CH = '〇' + // const NULL_CH = '🈳' + + $("#" + _id + " [type=\"nullBtton\"]").bind("click", function () { + _editorName.cm.replaceSelection(NULL_CH); + // var __Cursor = _editorName.cm.getDoc().getCursor(); + // _editorName.cm.setCursor(__Cursor.line - 1, 0); + }); + } + + if (noStorage == true) { + + } else { + md_elocalStorage(_editorName, `MDEditor__${_id}`, _id); + } + + callback && callback(_editorName) + } + }); + return editorName; +} + + +export default class MDEditors extends Component { + constructor(props) { + super(props) + this.state = { + initValue: '' + } + } + componentDidUpdate(prevProps, prevState) { + // 不能加,影响了试卷填空题 + // if (this.props.initValue != prevProps.initValue) { + // this.answers_editormd.setValue(this.props.initValue) + // } + } + + // react_mdEditor_ + componentDidMount = () => { + const { mdID, initValue, placeholder, showNullButton} = this.props; + + let _id = `mdEditor_${mdID}` + this.contentChanged = false; + const _placeholder = placeholder || ""; + // amp; + // 编辑时要传memoId + const imageUrl = `/upload_with_markdown?container_id=&container_type=Memo`; + // 创建editorMd + let react_id = `react_${_id}`; + + window[react_id] = this + const answers_editormd = create_editorMD(_id, '100%', this.props.height, _placeholder, imageUrl, (__editorName) => { + react_id = `react_${__editorName.id}`; + const that = window[react_id] + + setTimeout(() => { + console.log('timeout', __editorName.id) + __editorName.resize() + __editorName.cm && __editorName.cm.refresh() + }, that.props.refreshTimeout || 500) + if (that.props.initValue != undefined && that.props.initValue != '') { + __editorName.setValue(that.props.initValue) + } + if (that.state.initValue) { + __editorName.setValue(that.state.initValue) + } + __editorName.cm.on("change", (_cm, changeObj) => { + that.contentChanged = true; + if (that.state.showError) { + that.setState({showError: false}) + } + that.onEditorChange() + }) + that.props.onCMBlur && __editorName.cm.on('blur', () => { + that.props.onCMBlur() + }) + that.props.onCMBeforeChange && __editorName.cm.on('beforeChange', (cm,change) => { + that.props.onCMBeforeChange(cm,change) + }) + that.answers_editormd = __editorName; + window[_id] = __editorName; + }, initValue, this.onEditorChange,this.props.watch, { + noStorage: this.props.noStorage, + showNullButton: this.props.showNullButton + }, this); + + } + showError = () => { + this.setState({showError: true}) + } + onEditorChange = () => { + this.props.setcheckoutcontent() + if (!this.answers_editormd) return; + const val = this.answers_editormd.getValue(); + try { + this.props.onChange && this.props.onChange(val) + } catch(e) { + // http://localhost:3007/courses/1309/common_homeworks/6566/setting + // 从这个页面,跳转到编辑页面,再在编辑页面点击返回的时候,这里会报错 + console.error('出错') + console.error(e) + } + } + resize = () => { + if (!this.answers_editormd) { // 还未初始化 + return; + } + this.answers_editormd.resize() + this.answers_editormd.cm && this.answers_editormd.cm.refresh() + this.answers_editormd.cm.focus() + } + + getValue = () => { + try { + return this.answers_editormd.getValue() + } catch (e) { + return '' + } + } + setValue = (val) => { + try { + this.answers_editormd.setValue(val) + } catch (e) { + // TODO 这里多实例的时候,前一个实例的state会被后面这个覆盖 参考NewWork.js http://localhost:3007/courses/1309/homework/9300/edit/1 + // 未初始化 + this.setState({ initValue: val }) + } + } + + render() { + + let { + showError + } = this.state; + let { mdID, className, noStorage } = this.props; + let _style = {} + if (showError) { + _style.border = '1px solid red' + } + return ( + +
+ {/* padding10-20 */} +
+ +
+
+
+
+
+ {noStorage == true ? ' ' :

 

} + {/* {noStorage == true ? ' ' :

 

} */} +
+
+ ) + } +} + + diff --git a/public/react/src/modules/projectPackages/PackageIndex/PackageBanner.js b/public/react/src/modules/projectPackages/PackageIndex/PackageBanner.js new file mode 100644 index 000000000..bc5aee524 --- /dev/null +++ b/public/react/src/modules/projectPackages/PackageIndex/PackageBanner.js @@ -0,0 +1,25 @@ +import React, {Component} from 'react'; +import {Link} from "react-router-dom"; + +class PackageBanner extends Component { + constructor(props) { + super(props) + this.state = { + + } + } + componentDidMount() { + + + } + + + render() { + return ( +
+ ) + } +} + +export default PackageBanner; + diff --git a/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js new file mode 100644 index 000000000..46e36f90f --- /dev/null +++ b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js @@ -0,0 +1,298 @@ +import React, {Component} from 'react'; +import {Link} from "react-router-dom"; +import axios from 'axios'; +import { Input ,Icon,Button,Pagination} from 'antd'; +import moment from 'moment'; +import '../packageconcnet.css'; + +const { Search } = Input; +// let categorylist=[ +// {name:"全部",value:undefined}, +// {name:"前端开发",value:"front"}, +// {name:"后端开发",value:"backend"}, +// {name:"移动开发",value:"mobile"}, +// {name:"数据库",value:"database"}, +// {name:"云计算和大数据",value:"cloud_compute_and_big_data"}, +// {name:"人工智能",value:"ai"}, +// {name:"其他",value:"other"}, +// ] +// +// function setcategorylist(val){ +// let vals="" +// categorylist.some((item,key)=> { +// if (item.value === val) { +// vals=item.name +// return true +// } +// } +// ) +// +// return vals +// } + + + +class PackageConcent extends Component { + constructor(props) { + super(props) + this.state = { + data:undefined, + project_packages:undefined, + category:undefined, + keyword:undefined, + sort_by:"recently", + sort_direction:"desc", + page:1, + per_page:20, + categories:[] + } + } + //desc’, ‘desc’, ‘asc’ + //否 string 排序,默认最新, ‘recently’, ‘price’ + // 否 string 类型, front,backend,mobile,database, cloud_compute_and_big_data,devops_and_test,ai,other + componentDidMount() { + window.document.title = '众包创新' + let {category,keyword,sort_by,sort_direction,page}=this.state + this.setdatas(category,keyword,sort_by,sort_direction,page) + + let Url = `/project_package_categories.json`; + axios.get(Url).then((response) => { + // console.log(response) + this.setState({ + categories:response.data.categories + }) + }).catch((error) => { + console.log(error) + }) + + } + + setdatas=(category,keyword,sort_by,sort_direction,page)=>{ + + let Url = `/project_packages.json`; + axios.get(Url,{params:{ + category_id:category, + keyword:keyword, + sort_by:sort_by, + sort_direction:sort_direction, + page:page, + per_page:20, + }} + ).then((response) => { + this.setState({ + data:response.data, + project_packages:response.data.project_packages + }) + }).catch((error) => { + console.log(error) + }) + } + + setdatafuns=(value)=>{ + let {category,keyword,sort_by,sort_direction,page}=this.state + this.setState({ + keyword:value + }) + this.setdatas(category,value,sort_by,sort_direction,page) + } + + + setcategory=(value)=>{ + let {category,keyword,sort_by,sort_direction,page}=this.state + this.setState({ + category:value + }) + this.setdatas(value,keyword,sort_by,sort_direction,page) + } + + setsort_byfun=(value)=>{ + let {category,keyword,sort_by,sort_direction,page}=this.state + + this.setState({ + sort_by:value + }) + let sort_directionvalue; + if(value===sort_by){ + if(sort_direction==="desc"){ + this.setState({ + sort_direction:"asc" + }) + sort_directionvalue="asc"; + }else{ + this.setState({ + sort_direction:"desc" + }) + sort_directionvalue="desc"; + } + }else{ + this.setState({ + sort_direction:"desc" + }) + sort_directionvalue="desc"; + } + + this.setdatas(category,keyword,value,sort_directionvalue,page) + } + render() { + let {data,page,category,sort_by,sort_direction,project_packages}=this.state; + + return ( +
+ +
+
+
+
+
+ + + {/*concent*/} +
+
+

+

+ 搜索} + onSearch={ (value)=>this.setdatafuns(value)} /> + +

+

+
+
+ +
+

+

+ 类型: +

+
  • this.setcategory(undefined)}>全部
  • + {this.state.categories.map((item,key)=>{ + return( +
  • this.setcategory(item.id)}>{item.name}
  • + ) + })} + +
    +

    + +

    + 排序: +

    +
  • this.setsort_byfun("recently")}> + 最新 + + + + +
  • + +
  • this.setsort_byfun("price")}> + 价格 + + + + +
  • +
    +

    +

    +
    + + + {project_packages&&project_packages.map((item,key)=>{ + return( +
    + +
    + +
    + +
    + +
    + +
    + + + +
    + +
    + {item.min_price===null?"":¥{item.min_price}} + {item.max_price===null||item.min_price===null?"":~} + {item.max_price===null?"":¥{item.max_price}} + {item.min_price===null&&item.max_price===null?可议价:""} +
    + +
    + +
    +
    {item.category_name}
    +
    + +
    +
    + + {item.visit_count}人浏览 +
    +
    + + + {moment(item.deadline_at).endOf('day').fromNow()}竞标截止 + +
    +
    + + + {item.bidding_users_count}人竞标 + +
    +
    +
    + {item.published_at===null?更新于:{moment(item.updated_at).format("YYYY-MM-DD HH:mm")} : + 发布于:{moment(item.published_at).format("YYYY-MM-DD HH:mm")} } +
    +
    + +
    + +
    +
    + ) + })} + {project_packages&&project_packages.length===0?
    +
    + +

    暂无数据哦~

    +
    :""} + +
    + +
    + + +
    +
    +
    +
    +
    +
    + ) + } +} + +export default PackageConcent; + diff --git a/public/react/src/modules/projectPackages/PackageIndex/PackageIndex.js b/public/react/src/modules/projectPackages/PackageIndex/PackageIndex.js new file mode 100644 index 000000000..e6c7cdc98 --- /dev/null +++ b/public/react/src/modules/projectPackages/PackageIndex/PackageIndex.js @@ -0,0 +1,30 @@ +import React, { Component } from 'react'; +import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; + +//业务组件 +import PackageBanner from "./PackageBanner"; +import PackageConcent from "./PackageConcent"; + +class PackageIndex extends Component{ + constructor(props) { + super(props) + } + + componentDidMount(){ + window.document.title = '众包创新' + } + + render() { + return ( +
    +
    + {/*头部banner*/} + + {/*内容banner*/} + +
    +
    + ) + } +} +export default PackageIndex; \ No newline at end of file diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/NEITaskDetailsModel.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/NEITaskDetailsModel.js new file mode 100644 index 000000000..16e22dae0 --- /dev/null +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/NEITaskDetailsModel.js @@ -0,0 +1,41 @@ +import React, { Component } from 'react'; +import { Spin, Icon , Modal,Input,Button} from 'antd'; +class NEITaskDetailsModel extends Component { + + constructor(props) { + super(props); + this.state = { + + } + } + + render() { + + return( + +
    +

    +

    {this.props.applyvalue}
    +
    {this.props.applybottom}
    +

    +
    + 取消 + 确定 +
    + +
    +
    + ) + } +} + +export default NEITaskDetailsModel; \ No newline at end of file diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js new file mode 100644 index 000000000..4f06a0cba --- /dev/null +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -0,0 +1,485 @@ +import React, {Component} from 'react'; +import {Link} from "react-router-dom"; +import axios from 'axios'; +import { Input ,Icon,Button,Pagination,DatePicker,Breadcrumb} from 'antd'; +import { handleDateString,markdownToHTML,bytesToSize} from 'educoder'; +import NEITaskDetailsModel from './NEITaskDetailsModel'; +import moment from 'moment'; +import '../packageconcnet.css'; +import './pds.css' +import gouxuan from './img/gouxuan.png' +import weigouxuan from './img/weigouxuan.png' +const { Search } = Input; +// let categorylist=[ +// {name:"全部",value:undefined}, +// {name:"前端开发",value:"front"}, +// {name:"后端开发",value:"backend"}, +// {name:"移动开发",value:"mobile"}, +// {name:"数据库",value:"database"}, +// {name:"云计算和大数据",value:"cloud_compute_and_big_data"}, +// {name:"人工智能",value:"ai"}, +// {name:"其他",value:"other"}, +// ] +// +// function setcategorylist(val){ +// let vals="" +// categorylist.some((item,key)=> { +// if (item.value === val) { +// vals=item.name +// return true +// } +// } +// ) +// +// return vals +// } + +class PackageIndexNEITaskDetails extends Component { + constructor(props) { + super(props) + this.contentMdRef = React.createRef(); + this.state = { + data:undefined, + modalCancel: false, + overtype:false, + setbiddingmantype:false, + datalist:[] + } + } + + componentDidMount() { + this.getdatas() + window.document.title = '众包创新' + } + + getdatas=()=>{ + let url =`/project_packages/${this.props.match.params.id}.json`; + axios.get(url).then((response) => { + this.setState({ + data:response.data + }) + }).catch((error) => { + console.log(error); + + }) + } + + setbiddingman=()=>{ + this.setState({ + setbiddingmantype:true + }) + } + + notsetbiddingman=()=>{ + let {data} =this.state; + let gouxuans2=data.bidding_users + for (var i=0;i{ + this.setState({ + modalCancel:false + }) + } + + setbiddingusers=()=>{ + let{datalist}=this.state; + if(datalist.length>0){ + this.setState({ + applytype:true, + applyvalue:`选择的${datalist.length}个竞标者将被设定为“中标”`, + applybottom:"是否确认执行?", + applycancel:this.setApplycancel, + applyconfirm:this.setApplysumbit + }) + } + + } + + setApplysumbit=()=>{ + this.setState({ + applytype:false, + }) + let{datalist}=this.state; + let newlist=[]; + datalist.map((item,key)=>{ + newlist.push(item.id) + }) + + + let url=`/project_packages/${this.props.match.params.id}/bidding_users/win.json`; + axios.post(url,{ + user_ids:newlist + }).then((response) => { + if(response.data.status===0){ + this.props.showSnackbar("提交成功"); + this.setState({ + setbiddingmantype:false + }) + this.getdatas() + }else if(response.data.status===-1){ + this.props.showSnackbar(response.data.message); + } + }).catch((error) => { + console.log(error) + }) + + } + + + + Clickteacher2=(e)=>{ + let {data} =this.state; + let newlist=[] + let gouxuans2=data.bidding_users + for (var i=0;i{ + this.setState({ + overtype:true + }) + } + + setout=()=>{ + this.setState({ + overtype:false + }) + } + + deletePackages=()=>{ + this.setState({ + applytype:true, + applyvalue:"是否确认删除?", + applycancel:this.setApplycancel, + applyconfirm:this.setApplydelect + }) + } + + setApplydelect=()=>{ + this.setState({ + applytype:false, + }) + let url=`/project_packages/${this.props.match.params.id}.json`; + axios.delete(url ).then((response) => { + // const status = response.data.status + // console.log(response) + this.props.showSnackbar('删除成功'); + }).catch((error) => { + console.log(error) + }) + } + + setBiddingApply=()=>{ + this.setState({ + applytype:true, + applyvalue:"是否确认报名?", + applycancel:this.setApplycancel, + applyconfirm:this.setApplyconfirm + }) + } + + setApplycancel=()=>{ + this.setState({ + applytype:false, + }) + } + + setApplyconfirm=()=>{ + this.setState({ + applytype:false, + }) + let url=`/project_packages/${this.props.match.params.id}/bidding_users.json`; + axios.post(url).then((response) => { + if(response.data.status===0){ + this.props.showSnackbar("报名成功"); + this.getdatas() + }else if(response.data.status===-1){ + this.props.showSnackbar(response.data.message); + } + }).catch((error) => { + console.log(error) + }) + + } + goback = () => { + window.history.go(-1) + } + + render() { + let {overtype,data}=this.state; + // console.log(data&&data.creator.login) + // console.log(this.props.current_user.login) + return ( +
    +
    + +
    + + '} className={"fl"}> + {/*{this.props.current_user.username}*/} + + 众包创新 + + {data&&data.title} + + + 返回 +
    + +

    + +

    +
    + +
    + {data&&data.status==="pending"?
    +
    + + 未申请 +
    :data&&data.status==="applying"?
    +
    + + 待发布 +
    :""} + +
    +
    +
    + + + +
    + {data&&data.creator.name} +
    + + {data&&data.creator.login===this.props.current_user.login?"":
    + {overtype===false? 头像联系TA: + 头像联系TA} +
    } +
    + + +
    + +
    + +
    + +
    + {data&&data.title} + +
    + +
    + {data&&data.min_price===null?"":{data&&data.min_price}} + {data&&data.max_price===null||data&&data.min_price===null?"":~} + {data&&data.max_price===null?"":{data&&data.max_price}} + {data&&data.min_price===null&&data&&data.max_price===null?可议价:""} +
    + +
    + +
    +
    {data&&data.category_name}
    +
    + +
    +
    + {data&&data.published_at===null? + 更新时间:{moment(data&&data.updated_at).format("YYYY-MM-DD HH:mm")} + : + 发布时间:{moment(data&&data.published_at).format("YYYY-MM-DD HH:mm")} + } +
    +
    + 竞标截止时间:{moment(data&&data.deadline_at).format("YYYY-MM-DD HH:mm")} +
    +
    + +
    + +
    +
    + +
    +
    + + {/*详情*/} +
    +
    +
    + 需求详情: + + {data&&data.status==="pending"&&data&&data.operation.can_select_bidding_user===true?
    + 编辑 + 删除 +
    :""} + +
    +
    +
    +
    + +
    + + {data&&data.attachments.length>0?
    +
    + 需求文件: +
    + {data&&data.attachments.map((item,key)=>{ + return( + + )})} +
    :""} +
    + + + + {/*发布者和竞选者状态show*/} + {this.state.setbiddingmantype===false&&data&&data.published_at!=null?
    + {/*下面是头像*/} +
    +
    +
    + 报名列表({data&&data.bidding_users.length}) +
    +
    + {data&&data.operation.can_bidding===true?:""} + {data&&data.operation.can_select_bidding_user===true?:""} +
    +
    +
    + +
    +
    +
    +
    + + {data&&data.bidding_users.map((item,key)=>{ + return( +
    + {item.status==="bidding_won"?:""} + +

    {item.name}

    + {this.props.current_user.login!=item.login? + 头像联系TA + :""} +
    + ) + })} + + {data&&data.bidding_users.length===0?
    +
    + +

    暂无人员竞标~

    +
    :""} + + +
    +
    +
    +
    :""} + + + {this.state.setbiddingmantype===true?
    + {/*发布人选择状态*/} + {/*下面是头像*/} +
    +
    +
    + 报名列表({data&&data.bidding_users.length}) +
    + +
    +
    + 已选 ({this.state.datalist.length}) +
    + 取消 + +
    +
    +
    +
    +
    +
    +
    + {data&&data.bidding_users.map((item,key)=>{ + return( +
    + ) + })} + + {data&&data.bidding_users.length===0?
    +
    + +

    暂无人员竞标~

    +
    :""} + +
    +
    +
    +
    :""} + +

    + +
    + + +
    +
    +
    + ) + } +} + +export default PackageIndexNEITaskDetails; + + + diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/img/gouxuan.png b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/img/gouxuan.png new file mode 100644 index 0000000000000000000000000000000000000000..5bc53f0071f75c4dd701659b26d2ba98ecd1e35d GIT binary patch literal 305 zcmV-10nYx3P)sgC}i_l(fkVMb~e> z{PX(e5fc6=VGrL0b6&M!lF`;lE%-9oS<9I`^OUe~a$F*mbUtM2W zZOtFSo)Z2IWT1aEk0V=T_kPNc5?;Z*t+g2Cy;?T~8Y+Q)0s?mds)u_Tg(-mo=cX`) zYm3ZOqH&lK2;d-aZb|eC3|_ApPOjR+0F^@v!y_x$nPB>(I<`}sYK zG@dDKk_u)%pxCv@d%iKl+~S!XXBc19N;CE{%5-L|wv-K+YU(@L@N*8!3U1xgMr&5R z5@I!6X6A1uRg0kxZ-?X_SfO9l|QTQ z&vK5vzI1Du@r=WV6}~Zu9hA dzQO;D?9!xlqSLQ05Ci&^!PC{xWt~$(69CLvZsY&} literal 0 HcmV?d00001 diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/newsone.png b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/newsone.png new file mode 100755 index 0000000000000000000000000000000000000000..9aadd57c233cc86548948dd242ea0551816d7bc1 GIT binary patch literal 341 zcmV-b0jmCqP)Z2Ve_W5Uj_@vtYQdn>&XphN}b#OZG1SY-)(he?ztnO~JlI)e#NEj>Wm( zs01R92;=14lSJgAA)0|HV#+2#3WBrOh;k}m6Ikqx46vLyiNuLv?N5uXEhz*mMqYr_ z03ni5!(lC>`M8gfJI3Br;$3`Lp7^(}L!tGerz nv>Q^lY2Bw;KAu+Vr>DLH5AT6C@^UT000000NkvXXu0mjf1bLIw literal 0 HcmV?d00001 diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/newstwo.png b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/newstwo.png new file mode 100755 index 0000000000000000000000000000000000000000..8ac58b2c47ae8debb584b81251fe488a748c6fac GIT binary patch literal 288 zcmV+*0pI?KP)Y~4b<^`+W^>M* z&iv=$94uHI12a8xQ$U7#7?A-o# zipL*Fjsd8W3q1TAWEZzM#5u08hdY$~O>`RNJ(bjC3UY*#22#e~H2F4`20=!#r<7b{ zt)?@!u@TY9%qYkQYRN{8vxr!zqJkV?wF_akfj^;^s~xXpaztEyL%Oxk%&o@Un$CPg mJol5?3sN24upAL}_Kh#k3SewPv+2_S0000{ + debugger + console.log('onChange:', current); + this.setState({ current }); + }; + + render() { + const { current } = this.state; + return ( +
    +

    + + + + + +

    +
    + ) + } +} + +export default PackageIndexNEIBanner; + diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js new file mode 100644 index 000000000..e7e4b20a2 --- /dev/null +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -0,0 +1,932 @@ +import React, {Component} from 'react'; +import {Link} from "react-router-dom"; +import axios from 'axios'; +import { Input , Spin, Icon ,Button,Pagination,DatePicker} from 'antd'; +import { handleDateString,getUrl,bytesToSize} from 'educoder'; +import locale from 'antd/lib/date-picker/locale/zh_CN'; +import MDEditors from '../MDEditors'; +import PhoneModel from './PhoneModel'; +import moment from 'moment'; +import '../packageconcnet.css'; +const { Search } = Input; +const $ = window.$; +let origin = getUrl(); + +// load +if (!window.postUpMsg) { + $.getScript( + `${origin}/javascripts/attachments.js`, + (data, textStatus, jqxhr) => { + + }); +} + + +function checkPhone(phone){ + + if(!(/^1[3456789]\d{9}$/.test(phone))){ + // alert("手机号码有误,请重填"); + return false; + } +} + +function range(start, end) { + const result = []; + for (let i = start; i < end; i++) { + result.push(i); + } + return result; +} + +function disabledDateTime() { + return { + disabledMinutes: () => range(1, 30).concat(range(31, 60)), + }; +} +class PackageIndexNEIBannerConcent extends Component { + constructor(props) { + super(props) + this.contentMdRef = React.createRef(); + this.state = { + modalCancel:false, + getverificationcodes:true, + seconds:35, + springtype:false, + category:undefined, + title:undefined, + content:undefined, + attachment_ids:undefined, + deadline_at:undefined, + min_price:undefined, + max_price:undefined, + contact_name:undefined, + contact_phone:undefined, + code:undefined, + publish:false, + categories:[] + } + } + componentDidUpdate = (prevProps) => { + if(prevProps.current_user.username!=this.props.current_user.username){ + this.setState({ + contact_name:this.props.current_user.username + }) + } + } + + componentDidMount() { + window.document.title = '众包创新' + if(this.props.match.params.id!=undefined){ + + let url=`/project_packages/${this.props.match.params.id}.json` + axios.get((url)).then((response) => { + console.log(response) + let data=response.data + this.setState({ + category:data.category_id, + title:data.title, + content:data.content, + deadline_at:moment(data.deadline_at), + min_price:data.min_price, + max_price:data.max_price, + contact_name:data.contact_name==null||data.contact_name==undefined?this.props.current_user.username:data.contact_name, + phones:data.contact_phone, + attachments:data.attachments, + + }) + }).catch((error) => { + console.log(error); + + }) + }else{ + this.setState({ + contact_name:this.props.current_user.username + }) + } + + let Url = `/project_package_categories.json`; + axios.get(Url).then((response) => { + // console.log(response) + if(response.data.status===-1){ + + }else{ + this.setState({ + categories:response.data.categories + }) + } + + }).catch((error) => { + console.log(error) + }) + + // this.contentMdRef.current.setValue("测试赋值") + } + //获取验证码; + getverificationcode =()=>{ + // if (this.state.logins&&this.state.logins.length === 0) { + // // 判断没有输入手机号 + // return + // } + if(this.state.getverificationcodes === undefined){ + console.log("undefined"); + return; + } + if (this.state.getverificationcodes === true) { + this.setState({ + getverificationcodes: undefined, + }) + let timer = setInterval(() => { + this.setState((preState) => ({ + seconds: preState.seconds - 1, + }), () => { + if (this.state.seconds == 0) { + clearInterval(timer); + this.setState({ + getverificationcodes: false, + seconds: 35, + }) + } + }); + }, 1000) + //其他的网络请求也可以 + this.SMSverification(); + } else { + this.setState({ + getverificationcodes: undefined, + }) + let timer = setInterval(() => { + this.setState((preState) => ({ + seconds: preState.seconds - 1, + }), () => { + if (this.state.seconds == 0) { + clearInterval(timer); + this.setState({ + getverificationcodes: false, + seconds: 35, + + }) + } + }); + }, 1000) + //其他的网络请求也可以 + this.SMSverification(); + } + } + //短信验证 + SMSverification = () => { + let {contact_phone,code}=this.state; + var url = `/account/get_verification_code.json`; + axios.get((url), { + params: { + value: contact_phone, + type: 9, + } + }).then((result) => { + //验证有问题{"status":1,"message":"success"} + // console.log(result); + this.openNotification("验证码已发送,请注意查收!",2); + + + }).catch((error) => { + console.log(error); + + }) + } + + + onChangeTimePicker = (value, dateString) => { + if(value===null){ + this.setState({ + deadline_at:"" + }) + }else{ + if(moment(handleDateString(dateString))===undefined||moment(handleDateString(dateString))===null||moment(handleDateString(dateString))===""){ + this.setState({ + deadline_attypes:true + }) + }else{ + this.setState({ + deadline_attypes:false + }) + } + if(moment(handleDateString(dateString)){ + const content = this.contentMdRef.current.getValue().trim(); + if(content===undefined||content===null||content===""){ + this.setState({ + contenttypes:true + }) + }else{ + this.setState({ + contenttypes:false + }) + } + } + + + setcheckout=(min_price,max_price)=>{ + // if(min_price===undefined){ + // this.setState({ + // min_pricetype:true + // }) + // }else{ + // this.setState({ + // min_pricetype:false + // }) + // } + + + // if(parseInt(min_price)===undefined||parseInt(min_price)===null||parseInt(min_price)===""){ + // + // this.setState({ + // min_pricetype:true + // }) + // }else{ + // this.setState({ + // min_pricetype:false + // }) + // } + + // if(parseInt(max_price)===undefined||parseInt(max_price)===null||parseInt(max_price)===""){ + // + // this.setState({ + // min_pricetype:true + // }) + // + // }else{ + // this.setState({ + // min_pricetype:false + // }) + // } + + if(parseInt(min_price)<=0){ + this.setState({ + smallstype:true + }) + }else{ + this.setState({ + smallstype:false + }) + } + + if(parseInt(max_price){ + const content = this.contentMdRef.current.getValue().trim(); + // console.log(content) + // console.log(this.state.deadline_at._i) + this.setState({ + publish:type + }) + let types=type; + let {category,title,attachment_ids,deadline_at,min_price,max_price,contact_name,contact_phone,code,modalCancel}=this.state; + + if(category===undefined||category===null||category===""){ + this.setState({ + categorytypes:true + }) + this.scrollToAnchor("publishtimestart"); + return + } + + if(title===undefined||title===null||title===""){ + this.setState({ + titletypes:true + }) + this.scrollToAnchor("publishtimestart"); + return + } + + if(content===undefined||content===null||content===""){ + this.setState({ + contenttypes:true + }) + this.scrollToAnchor("publishtimestart"); + return + } + + if(deadline_at===undefined||deadline_at===null||deadline_at===""){ + this.setState({ + deadline_attypes:true + }) + this.scrollToAnchor("publishtime"); + return + } + + + if(moment(deadline_at) { + if(response.data.status===0){ + if(type===true){ + this.props.setPublicationfun(response.data.id) + }else{ + window.location.href="/crowdsourcing/"+response.data.id + } + this.setState({ + springtype:false + }) + }else if(response.data.status===-1){ + if(response.data.message==="无效的验证码"){ + this.setState({ + codeypesno:true, + springtype:false + }) + } + } + this.setState({ + springtype:false + }) + }).catch((error) => { + console.log(error) + this.setState({ + springtype:false + }) + }) + + + }else{ + + // edit + + const url = `/project_packages/${this.props.match.params.id}.json`; + + axios.put(url, { + category_id: category, + title: title, + content: content, + attachment_ids: attachment_ids, + deadline_at:deadline_at._i, + min_price:parseInt(min_price), + max_price:parseInt(max_price), + contact_name: contact_name===null||contact_name===undefined?this.props.current_user.username:contact_name, + contact_phone: contact_phone===undefined?this.props.current_user.phone:contact_phone, + code:code, + publish:types + } + ).then((response) => { + if(response.data.status===0){ + if(type===true){ + this.props.setPublicationfun(response.data.id) + }else{ + window.location.href="/crowdsourcing/"+response.data.id + } + this.setState({ + springtype:false + }) + }else if(response.data.status===-1){ + if(response.data.message==="无效的验证码"){ + this.setState({ + codeypesno:true, + springtype:false + }) + } + } + this.setState({ + springtype:false + }) + }).catch((error) => { + console.log(error) + this.setState({ + springtype:false + }) + }) + + + } + + + + } + + modalCancel=()=>{ + this.setState({ + modalCancel:false, + contact_phone:undefined, + code:undefined, + }) + } + + editmodels=()=>{ + this.setState({ + modalCancel:true + }) + } + + + setcategory=(value)=>{ + if(value===undefined||value===null||value===""){ + this.setState({ + categorytypes:true + }) + }else{ + this.setState({ + categorytypes:false + }) + } + this.setState({ + category:value + }) + } + + settitlefun=(e)=>{ + + if(e.target.value===undefined||e.target.value===null||e.target.value===""){ + this.setState({ + titletypes:true + }) + }else{ + this.setState({ + titletypes:false + }) + } + + this.setState({ + title:e.target.value + }) + } + + + onChangemin_prices=(e)=>{ + let{max_price}=this.state; + this.setState({ + min_price:e.target.value + }) + this.setcheckout(e.target.value,max_price) + + + } + onChangemax_prices=(e)=>{ + let{min_price}=this.state; + this.setState({ + max_price:e.target.value + }) + this.setcheckout(min_price,e.target.value) + + } + + onChangeContact_name=(e)=>{ + + if(e.target.value===undefined||e.target.value===""||e.target.value===null){ + this.setState({ + contact_nametype:true + }) + }else{ + this.setState({ + contact_nametype:false + }) + } + + + this.setState({ + contact_name:e.target.value + }) + } + + onChangeContact_phone=(e)=>{ + let {modalCancel}=this.state; + // if(modalCancel===false){ + // if(this.props.current_user.phone===undefined||this.props.current_user.phone===null||this.props.current_user.phone===""){ + // this.setState({ + // current_userphonetype:true + // }) + // }else{ + // this.setState({ + // current_userphonetype:false + // }) + // } + // } + if(modalCancel===true||this.props.current_user.phone===null){ + if(e.target.value===undefined||e.target.value===null||e.target.value===""){ + this.setState({ + contact_phonetype:true + }) + }else{ + this.setState({ + contact_phonetype:false + }) + } + + if(checkPhone(e.target.value)===false){ + this.setState({ + contact_phonetypes:true + }) + }else{ + this.setState({ + contact_phonetypes:false + }) + } + } + + + this.setState({ + contact_phone:e.target.value + }) + } + + onChangeCode=(e)=>{ + if(e.target.value===undefined||e.target.value===""||e.target.value===null){ + this.setState({ + codeypes:true + }) + }else{ + this.setState({ + codeypes:false + }) + } + this.setState({ + code:e.target.value + }) + } + + //跳转道描点的地方 + scrollToAnchor = (anchorName) => { + if (anchorName) { + // 找到锚点 + let anchorElement = document.getElementById(anchorName); + // 如果对应id的锚点存在,就跳转到锚点 + if(anchorElement) { anchorElement.scrollIntoView(); } + } + } + + render() { + let {modalCancel,seconds,getverificationcodes,attachments, + category,title}=this.state; + let categorylist=[ + {name:"前端开发",value:"front"}, + {name:"后端开发",value:"backend"}, + {name:"移动开发",value:"mobile"}, + {name:"数据库",value:"database"}, + {name:"云计算和大数据",value:"cloud_compute_and_big_data"}, + {name:"人工智能",value:"ai"}, + {name:"其他",value:"other"}, + ] + + + return ( + +
    + {/**/} + +

    + +

    +
    +
    + +
    + +

    +

    + {this.state.categories.map((item,key)=>{ + return( +
  • this.setcategory(item.id)}>{item.name}
  • + ) + })} +
    +

    + {this.state.categorytypes===true?
    请选择类型
    :""} + +
    + +
    + + + {this.state.titletypes===true?
    不能为空
    :""} + this.setcheckoutcontent()}> + {/* 请求status 422 */} + {this.state.contenttypes===true?
    不能为空
    :""} + {/*
    */} + {/* window.$('#_file').click()}*/} + {/*data-tip-down="请选择文件上传">*/} + {/*/!**!/*/} + {/*上传附件*/} + {/**/} + {/*(最多可添加 5 个图片/文件,每个大小不超过 10MB)*/} + {/*
    */} + {/*{attachments&&attachments.map((item,key)=>{*/} + {/*return(*/} + {/**/} + {/*)})}*/} + {/*
    */} + {/**/} + {/**/} + {/**/} + {/* {*/} + {/*debugger;*/} + {/*console.log(window.$('.file_selector')[0])*/} + {/*window.addInputFiles(window.$('.file_selector')[0])*/} + {/*}}*/} + {/*style={{'display': 'none'}}*/} + {/*type="file">*/} + {/**/} + {/**/} + {/*
    */} + + +
    +
    + +
    +
    +
    + +
    +

    + 竞标截止: + + + {this.state.deadline_attypes===true?

    不能为空
    :""} + + {this.state.deadline_attypexy===true?
    不能早于当前时间
    :""} +

    +

    + 支付费用: + this.onChangemin_prices(e)} + suffix={ + ¥ + } + /> + + this.onChangemax_prices(e)} + suffix={ + ¥ + } + />不填,则表示可议价 + {this.state.min_pricetype===true?

    不能为空
    :""} + {this.state.smallstype===true?
    不能小于零
    :""} + {this.state.minmaxtype===true?
    最高费用不能小于最低费用
    :""} +

    +
    + +
    +

    + 姓名: + this.onChangeContact_name(e)} + /> + {this.state.contact_nametype===true?

    不能为空
    :""} +

    + + {modalCancel===false&&this.props.current_user.phone!=null?

    + 手机号: + + + this.editmodels()}> + +

    :""} + {/*{this.state.current_userphonetype===true?
    不能为空
    :""}*/} + {modalCancel===true||this.props.current_user.phone===null?

    + + + {/*未注册才显示!*/} + + 手机号: + this.onChangeContact_phone(e)} + /> + {this.state.contact_phonetype===true?

    不能为空
    :""} + {this.state.contact_phonetypes===true?
    请输入正确的手机号
    :""} + + + + + 重新发送 ({seconds}s): getverificationcodes === true ?获取验证码 :重新发送} + onSearch={()=>this.getverificationcode()} + onInput={(e)=>this.onChangeCode(e)} + /> + {this.state.codeypes===true?
    验证码不能为空
    :""} + {this.state.codeypesno===true?
    验证码不正确
    :""} +
    + + {/**/} + + + + this.modalCancel()}>X + +

    :""} + + +
    +
    +

    + +
    + + this.setPublication(false)}>保存 +
    +
    +
    + + ) + } +} + +export default PackageIndexNEIBannerConcent; + +// attachments:[ +// { +// id: 206525, +// title: "412420b57ed8c141963d4c548bde551f", +// filesize: 18523, +// description: null, +// url: "/api/attachments/206525" +// } +// ] + diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js new file mode 100644 index 000000000..9f287e90e --- /dev/null +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js @@ -0,0 +1,49 @@ +import React, {Component} from 'react'; +import {Link} from "react-router-dom"; +import { Icon ,Button} from 'antd'; + +class PackageIndexNEISubmit extends Component { + constructor(props) { + super(props) + this.state = { + current:0 + } + } + componentDidMount() { + window.document.title = '众包创新' + } + setageload=(sum)=>{ + if(sum===undefined){ + window.location.href="/crowdsourcing/new" + }else{ + // this.props.history.push("/project_packages/"+sum) + window.location.href="/crowdsourcing/"+sum + } + + } + render() { + + return ( + + ) + } +} + +export default PackageIndexNEISubmit; + diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js new file mode 100644 index 000000000..1571fd77a --- /dev/null +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js @@ -0,0 +1,61 @@ +import React, { Component } from 'react'; +import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; + +//业务组件 +import PackageIndexNEIBanner from "./PackageIndexNEIBanner"; + +import PackageIndexNEIBannerConcent from "./PackageIndexNEIBannerConcent" + +import PackageIndexNEISubmit from './PackageIndexNEISubmit' +import '../packageconcnet.css'; +class PackageIndexNewandEditIndex extends Component{ + constructor(props) { + super(props) + this.state = { + setPublication:false, + id:undefined + } + } + + componentDidMount(){ + window.document.title = '众包创新' + } + + setPublicationfun=(ids)=>{ + this.setState({ + setPublication:true, + id:ids + }) + } + render() { + let {setPublication}=this.state; + return ( +
    +
    + {setPublication===false?
    + +

    + + {this.props.match.params.id!=undefined?"编辑":"新建"} +

    + + + + + +
    : +
    + +
    } +
    +
    + ) + } +} +export default PackageIndexNewandEditIndex; \ No newline at end of file diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PhoneModel.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PhoneModel.js new file mode 100644 index 000000000..99d63e7c2 --- /dev/null +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PhoneModel.js @@ -0,0 +1,140 @@ +import React, { Component } from 'react'; +import { Spin, Icon , Modal,Input,Button} from 'antd'; +class PhoneModel extends Component { + //getverificationcodes 是否是重新发送或者是获取验证码 + //多少秒 + constructor(props) { + super(props); + this.state = { + funmodalsType:false, + istype:false, + getverificationcodes:true, + seconds:35, + } + } + //获取验证码 + getverificationcode =()=>{ + // if (this.state.logins&&this.state.logins.length === 0) { + // 判断没有输入手机号 + // return + // } + + if (this.state.getverificationcodes === true) { + this.setState({ + getverificationcodes: undefined, + }) + let timer = setInterval(() => { + this.setState((preState) => ({ + seconds: preState.seconds - 1, + }), () => { + if (this.state.seconds == 0) { + clearInterval(timer); + this.setState({ + getverificationcodes: false, + seconds: 35, + }) + } + }); + }, 1000) + //其他的网络请求也可以 + this.SMSverification(); + } else { + this.setState({ + getverificationcodes: undefined, + }) + let timer = setInterval(() => { + this.setState((preState) => ({ + seconds: preState.seconds - 1, + }), () => { + if (this.state.seconds == 0) { + clearInterval(timer); + this.setState({ + getverificationcodes: false, + seconds: 35, + + }) + } + }); + }, 1000) + //其他的网络请求也可以 + this.SMSverification(); + } + } + //短信验证 + SMSverification = () => { + // var url = `/accounts/get_verification_code.json`; + // axios.get((url), { + // params: { + // login: this.state.logins, + // type: 1, + // } + // }).then((result) => { + // //验证有问题{"status":1,"message":"success"} + // // console.log(result); + // this.openNotification("验证码已发送,请注意查收!",2); + // + // + // }).catch((error) => { + // console.log(error); + // + // }) + } + render() { + let{getverificationcodes,seconds} =this.state; + const antIcons = + return( + +
    + + ) + } +} + +export default PhoneModel; \ No newline at end of file diff --git a/public/react/src/modules/projectPackages/ProjectPackageIndex.js b/public/react/src/modules/projectPackages/ProjectPackageIndex.js new file mode 100644 index 000000000..097e012e0 --- /dev/null +++ b/public/react/src/modules/projectPackages/ProjectPackageIndex.js @@ -0,0 +1,76 @@ +import React, { Component } from 'react'; + +import { Redirect } from 'react-router'; + +import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom"; + +import Loading from '../../Loading' + +import Loadable from 'react-loadable'; +import { TPMIndexHOC } from '../tpm/TPMIndexHOC' +import { SnackbarHOC } from 'educoder' + + +const PackageIndex = Loadable({ + loader: () => import('./PackageIndex/PackageIndex'), + loading: Loading, +}) + +const PackageIndexNewandEdit = Loadable({ + loader: () => import('./PackageIndexNewandEdit/PackageIndexNewandEditIndex'), + loading: Loading, +}) + +const PackageIndexNEITaskDetails = Loadable({ + loader: () => import('./PackageIndexNEITaskDetails/PackageIndexNEITaskDetails'), + loading: Loading, +}) + +class ProjectPackageIndex extends Component { + constructor(props) { + super(props) + } + + componentDidMount(){ + window.document.title = '众包创新' + } + + render() { + + return ( +
    + + + {/*众包首页*/} + + () + } + > + + () + } + > + + () + } + > + + () + } + > + + +
    + ); + } +} + +export default SnackbarHOC() (TPMIndexHOC (ProjectPackageIndex)) ; \ No newline at end of file diff --git a/public/react/src/modules/projectPackages/packageconcnet.css b/public/react/src/modules/projectPackages/packageconcnet.css new file mode 100644 index 000000000..c17d95c9b --- /dev/null +++ b/public/react/src/modules/projectPackages/packageconcnet.css @@ -0,0 +1,338 @@ +.width1240{ + width:1240px; +} +.packinput .ant-input{ + height: 50px; + width:749px; + border-color: #E1EDF8 !important; +} + +.packinput .ant-input-group-addon .ant-btn{ + width:140px !important; + font-size: 18px; + height: 50px; + background:rgba(76,172,255,1); + margin-right:18px; +} + +.setissues{ + width:280px; + height:50px; + background:rgba(76,172,255,1); + border-radius:4px; + margin-left: 15px; +} + +.pagetype li{ + color:#8F8F8F !important; +} + +.maxwidth700{ + max-width: 700px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.mbf10{ + margin-bottom:-10px; +} + +.PackageIndexNEIBanner{ + width:1200px; + height:110px; + background:rgba(255,255,255,1); + box-shadow:0px 2px 6px 0px rgba(125,125,125,0.26); + border-radius:8px; +} + +.padding110{ + padding: 39px 110px 0px; + box-sizing: border-box; +} + +.borderccc{ + border: 1px solid #ccc; +} + +.input-100-40s{ + width: 100%; + padding: 5px; + box-sizing: border-box; +} + +.fafafas{ + background-color: #fafafa!important; + height: 40px; +} + +.fafafas:focus{ + background-color: #fff!important; +} + +.fafas .ant-input{ + background-color: #fafafa!important; + height: 40px; +} + +.fafas .ant-input:focus{ + background-color: #fff!important; +} +.fafas .ant-input-group-addon .ant-btn{ + width:140px !important; + font-size: 14px; + height: 40px; + background:rgba(76,172,255,1); +} + +.newFormbox .upload_filename{ + line-height: 32px; +} + +.newFormbox .attachment span{ + line-height: 23px; +} + +.newFormbox .attachment .remove-upload{ + line-height: 28px; +} + +.pd26a0{ + padding: 26px 26px 16px 26px; +} + +.newFormbox .attachment .icon-fujian{ + font-size: 14px !important; + line-height: 14px; + margin-top: 9px; +} + +.newFormbox{ + height:20px +} + +.ml24{ + margin-left:24px; +} + +.defalutCancelbtns{ + display: block; + border: 1px solid #4CACFF !important; + background-color: #fff; + color: #4CACFF !important; + width:130px; + height:40px; + text-align: center; + line-height: 40px; + border-radius: 4px; +} + +.defalutSubmitbtns{ + background-color: #4CACFF; + height:40px; +} + +.defalutSubmitbtnmodels{ + width:127px; + height:30px; + background-color: #4CACFF; +} + +.ant-steps-item-process .ant-steps-item-icon{ + background-color: #4CACFF !important; +} + +.ant-steps-item-process .ant-steps-item-icon{ + background-color: #4CACFF !important; +} + +.padding200{ + padding: 115px 200px 215px 200px; +} + +.fontcircle{ + font-size: 80px; + display: inherit; +} + +.sumbtongs{ + font-size: 24px; + display: inherit; + text-align: center; +} + +.terraces{ + font-size: 16px; + display: inherit; + text-align: center; + color:#999; +} +.padding251{ + padding: 0px 251px; +} + +.ant-modal-title{ + text-align: center; +} +.ml17{ + margin-left: 17px; +} + +.project-package-items{ + display: -webkit-flex; + display: flex; + flex-direction: row; + margin:0px !important; + padding: 20px; + background: white; + margin-bottom:0px !important; + box-shadow: none !important; +} + +.mtf7{ + margin-top:-7px; +} + +.publicpart.orangeGreen { + border-left: 80px solid #29BD8B; +} + +.publicwords{ + left: 3px; + top: 18px; +} + +.project-packages-list .project-package-items .item-image{ + width:100px !important; +} + +.height185{ + height: 185px; +} + +.ContacttheTA{ + width: 80px; + height: 26px; + font-size: 14px; + line-height: 26px; + display: block; + border: 1px solid #4CACFF !important; + background-color: #fff; + color: #4CACFF !important; + text-align: center; + border-radius: 4px; +} +.ContacttheTAs{ + width: 80px; + height: 26px; + font-size: 14px; + line-height: 24px; + /*display: block;*/ + border: 1px solid #fff !important; + background-color: #4CACFF; + color: #fff !important; + text-align: center; + border-radius: 4px; +} +.ml28{ + margin-left: 28px; +} + +.longboxs{ + font-size: 16px; + font-family: MicrosoftYaHei-Bold; + font-weight: bold; + color: rgba(5,16,26,1); + border-left: 4px solid rgba(76,172,255,1); + padding-left: 10px; + margin-bottom: 20px; +} + +.padding020{ + padding: 0px 20px 20px; +} + +.mtf3{ + margin-top:-3px; +} + +.task-btn-nebules{ + background: #fff!important; + color: #4CACFF!important; + border: 1px solid #4CACFF!important; + margin-left: 20px; + cursor: pointer; + display: inline-block; + padding: 0 12px; + letter-spacing: 1px; + text-align: center; + font-size: 14px; + height: 30px; + line-height: 30px; + border-radius: 2px; +} + +.packageabsolute{ + position: absolute; + right: -16px; + top: -7px; +} +.relativef{ + position: relative; +} + +.homehove:hover .ptext{ + color: #4CACFF!important; +} + +.homehove:hover .ContacttheTAs{ + display: block; +} + +.topsj{ + position: absolute; + top: -6px; +} +.bottomsj{ + position: absolute; + bottom: -6px; +} +.touchSelect .ant-spin-dot-spin{ + margin-top: 30% !important; +} + +.pagenoedits{ + margin-left: 20px; + color: #ccc; +} + +.pagemancenter{ + text-align: center; +} + +.ml0{ + margin-left: 0px; +} +.tabelcli{ + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 850px; + display: table-cell; +} + +.mtf10{ + margin-top:-10px; +} + +.padding26{ + padding: 26px; + box-sizing: border-box; +} + +.pd26{ + padding: 26px; +} +.pd30a0{ + padding: 30px 30px 16px 30px; +} \ No newline at end of file diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index 3d1136371..379c70e27 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -716,7 +716,10 @@ submittojoinclass=(value)=>{ />
  • 教学案例
  • -
  • 众包创新
  • +
  • 众包创新
  • 交流问答
  • Date: Tue, 30 Jul 2019 10:21:56 +0800 Subject: [PATCH 03/10] b --- public/react/src/App.js | 2 +- .../src/modules/projectPackages/ProjectPackageIndex.js | 8 ++++---- .../react/src/modules/projectPackages/packageconcnet.css | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/public/react/src/App.js b/public/react/src/App.js index 6d1e2a521..e713cd0fd 100644 --- a/public/react/src/App.js +++ b/public/react/src/App.js @@ -304,7 +304,7 @@ class App extends Component { {/**/} {/*众包创新*/} - + {/*认证*/} diff --git a/public/react/src/modules/projectPackages/ProjectPackageIndex.js b/public/react/src/modules/projectPackages/ProjectPackageIndex.js index 097e012e0..6f2e32b8b 100644 --- a/public/react/src/modules/projectPackages/ProjectPackageIndex.js +++ b/public/react/src/modules/projectPackages/ProjectPackageIndex.js @@ -43,25 +43,25 @@ class ProjectPackageIndex extends Component { {/*众包首页*/} - () } > - () } > - () } > - () } diff --git a/public/react/src/modules/projectPackages/packageconcnet.css b/public/react/src/modules/projectPackages/packageconcnet.css index c17d95c9b..811771d4f 100644 --- a/public/react/src/modules/projectPackages/packageconcnet.css +++ b/public/react/src/modules/projectPackages/packageconcnet.css @@ -12,7 +12,6 @@ font-size: 18px; height: 50px; background:rgba(76,172,255,1); - margin-right:18px; } .setissues{ From a1ce03694e6e672ae6e727f84b1db531ba6fa2fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 10:29:08 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E4=BC=97=E5=8C=85=E7=A7=BB=E6=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../projectPackages/packageconcnet.css | 11 +- public/stylesheets/educoder/edu-all.css | 287 +++++++++++++++++- 2 files changed, 296 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/projectPackages/packageconcnet.css b/public/react/src/modules/projectPackages/packageconcnet.css index 811771d4f..498da9214 100644 --- a/public/react/src/modules/projectPackages/packageconcnet.css +++ b/public/react/src/modules/projectPackages/packageconcnet.css @@ -334,4 +334,13 @@ } .pd30a0{ padding: 30px 30px 16px 30px; -} \ No newline at end of file +} + +.shaiContent li.shaiItem:hover span{ + color: #fff !important; +} + +.shaiContent li.shaiItem:hover i.iconfont{ + color: #4CACFF!important +} + diff --git a/public/stylesheets/educoder/edu-all.css b/public/stylesheets/educoder/edu-all.css index 65db45900..65ff14a59 100644 --- a/public/stylesheets/educoder/edu-all.css +++ b/public/stylesheets/educoder/edu-all.css @@ -3055,4 +3055,289 @@ a.singlepublishtwo{ padding: 0px; } .project_packagesHead{width: 100%;margin-bottom:40px;background-size: 100% 100%;background-image: url("/images/educoder/project_packagesHead.jpg");height: 240px; - justify-content: center;align-items: center;display: -webkit-flex;} \ No newline at end of file + justify-content: center;align-items: center;display: -webkit-flex;} + + +/* 个人中心-众包 */ +.project-packages-list { +} +.project-packages-list .project-package-item { + display: -webkit-flex; + display: flex; + flex-direction: row; + margin-bottom: 20px; + padding: 20px; + background: white; + /*box-shadow:1px 3px 3px 1px rgba(156,156,156,0.16);*/ +} + +.project-packages-list .project-package-item:hover{ + box-shadow: 1px 6px 16px rgba(156,156,156,0.16); + opacity: 1; + border-radius: 2px; +} + +.project-packages-list .project-package-item .item-image { + width: 150px; + height: 110px; +} +.project-packages-list .project-package-item .item-body { + margin-left: 20px; + flex: 1; +} + +.project-package-item .item-body { + display: -webkit-flex; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.project-package-item .item-body .item-head { + display: -webkit-flex; + display: flex; + justify-content: space-between; + font-size: 20px; + height: 40px; +} +.project-package-item .item-head-title { + max-width: 700px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + transition: max-width .2s; + -moz-transition: max-width .2s; /* Firefox 4 */ + -webkit-transition: max-width .2s; /* Safari 和 Chrome */ + -o-transition: max-width .2s; /* Opera */ +} +.project-package-item .item-head-tags { + display: -webkit-flex; + display: flex; + align-items: center; +} +.project-package-item .item-head-tags span { + margin-left: 20px; + padding: 0 10px; + height: 28px; + font-size: 14px; + color: white; + border-radius: 5px; +} +.project-package-item .item-head-tags span.pending { background: lightcoral; } +.project-package-item .item-head-tags span.bidding_won { background: lightgreen; } +.project-package-item .item-head-tags span.bidding_lost { background: grey; } + +.project-package-item .item-head-blank { + flex: 1; +} +.project-package-item .item-head-price { + margin-left: 20px; + color: #F83B2D; + font-size: 28px; + font-weight: bold; +} +.project-package-item .item-head-price span { + font-size: 18px; +} +.project-package-item .item-category { + display: -webkit-flex; + display: flex; +} +.project-package-item .item-category-item { + padding: 0 10px; + color: #FF6800; + font-size: 14px; + background:rgba(255,235,213,1); + border-radius:13px; +} + +.project-package-item .item-other { + display: -webkit-flex; + display: flex; + justify-content: space-between; + color: #999999; +} +.project-package-item .item-group { + flex: 2; +} +.project-package-item .item-group.item-other-publish-at { + text-align: right; +} +.project-package-item .item-other-blank { + flex: 3 +} + +.project-package-item.with-operator .item-operator { + width: 0; + transition: width .2s; + -moz-transition: width .2s; /* Firefox 4 */ + -webkit-transition: width .2s; /* Safari 和 Chrome */ + -o-transition: width .2s; /* Opera */ +} +.project-package-item.with-operator:hover .item-operator { + margin: -20px -20px -20px 20px; + padding: 20px 0; + width: 100px; + display: flex; + justify-content: space-around; + flex-direction: column; + align-items: center; + background: #f0f0f0; +} +.project-package-item.with-operator .item-operator a { + display: none; +} +.project-package-item.with-operator:hover .item-operator a { + display: block; + font-size: 20px; +} +.project-package-item.with-operator:hover .item-head-title { + max-width: 600px; +} + +.list-count { + background: #fafafa; +} +.list-count span { + color: coral; + padding: 0 3px; +} + + +.applycompetitions{ + line-height: 30px; + border-radius: 14px; + color: #666; + background: rgba(41,189,139,1); + opacity: 0.8; + font-size: 14px; + font-family: MicrosoftYaHei; + font-weight: 400; + color: rgba(255,255,255,1); + position: absolute; + bottom: 139px; + left: 18px; + width: 73px; + height: 30px; + text-align: center; +} + +.noteDetailPoints{ + width: 70px; + height: 70px; + background-color: #4cacff; + border-radius: 50%; + color: #fff; + text-align: center; + margin: 0 auto; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 2px 0; + cursor: pointer; + line-height: 22px; + padding-top: 12px; +} + +.noteDetailPointsBCD1E3{ + width: 70px; + height: 70px; + background-color: #BCD1E3; + border-radius: 50%; + color: #fff; + text-align: center; + margin: 0 auto; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 2px 0; + cursor: pointer; + line-height: 22px; + padding-top: 12px; +} + +.-task-sidebars{ + position: fixed; + width: 40px; + height: 180px; + right: 0; + bottom: 30px; + z-index: 10; +} + +.winput150{ + width:150px; +} + + +.upload_Titles{ + position: relative; + float: left; + line-height: 35px; + font-size: 16px; + width: 50px; +} + +.lineheight35{ + line-height: 35px; +} + +.w120{ + width:120px; +} +.h90{ + width:90px; +} + +.decoration4CACFF{ + color: #4CACFF !important; + border-bottom: 1px solid #4CACFF; +} + +.surfacePlot{ + cursor: pointer; + width:122px; + height:92px; + background:rgba(250,250,250,1); + border:1px solid rgba(221,221,221,1); +} + +.marginuploading{ + padding: 28px 43px; + position: absolute; + z-index: 10; +} +.surfacePlot:hover .marginuploading.hidden{ + background: rgba(0,0,0, 0.1); +} + +.roundedRectangles { + position: absolute; + top: 10px; + right: -22px; +} + + +.edu-menu-lists .currentName{ + text-align: left; +} + +.edu-menu-lists li{ + text-align: left; +} + +.login_regs{ + width: 580px !important; +} + +.login_regs a{ + cursor: pointer; +} + +#member_block{ + height: 260px; + overflow-y: auto; +} + +#trophyreturn i{ + font-size: 16px!important; + color: #AAAAAA; +} \ No newline at end of file From 354d3a3b374e3d69c3dfbba4a95ec9f79c140a0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Tue, 30 Jul 2019 10:39:52 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/user/LoginRegisterComponent.js | 702 +++++++++--------- 1 file changed, 361 insertions(+), 341 deletions(-) diff --git a/public/react/src/modules/user/LoginRegisterComponent.js b/public/react/src/modules/user/LoginRegisterComponent.js index 99884e28e..48e1af926 100644 --- a/public/react/src/modules/user/LoginRegisterComponent.js +++ b/public/react/src/modules/user/LoginRegisterComponent.js @@ -14,12 +14,12 @@ import './common.css' import './commontwo.css' const { TabPane } = Tabs; const loginInputsyl = { -"width":"434px", -"height": "462px", -"-webkit-box-shadow": "3px 10px 21px 0px rgba(76,76,76,0.15)", -"box-shadow": "3px 10px 21px 0px rgba(76,76,76,0.15)", -"border-radius": "6px", -"background": "#fff" + "width":"434px", + "height": "462px", + "-webkit-box-shadow": "3px 10px 21px 0px rgba(76,76,76,0.15)", + "box-shadow": "3px 10px 21px 0px rgba(76,76,76,0.15)", + "border-radius": "6px", + "background": "#fff" } //父组件EducoderLogin.js @@ -66,6 +66,7 @@ class LoginRegisterComponent extends Component { pciphone:true, MyEduCoderModals:false, registered:undefined, + Phonenumberisnotcodmms:undefined, } } @@ -103,13 +104,14 @@ class LoginRegisterComponent extends Component { pciphone:true, MyEduCoderModals:false, registered:undefined, + Phonenumberisnotcodmms:undefined, } } } //判断是否是手机端 - IsPC=()=> { + IsPC=()=> { var userAgentInfo = navigator.userAgent; var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", @@ -162,7 +164,7 @@ class LoginRegisterComponent extends Component { StudyMakeMoney = () => { // 调用父组件方法 - this.props.Setshowbool(3); + // this.props.Setlogins(3); this.setState({ login: "", @@ -170,7 +172,12 @@ class LoginRegisterComponent extends Component { logins: "", passwords: "", codes: "", - }) + }); + try { + this.props.Setshowbool(3); + }catch (e) { + + } } onTabChange = (activeKey) => { console.log("onTabChange"); @@ -294,6 +301,7 @@ class LoginRegisterComponent extends Component { //登入接口 postLogin = () => { + if (this.state.login === undefined || this.state.login == "") { this.setState({ Phonenumberisnotco:"账号不能为空", @@ -310,34 +318,35 @@ class LoginRegisterComponent extends Component { login: this.state.login, password: this.state.password, }).then((response) => { + debugger if (response === undefined) { return } if(response.data.status === -2){ - if("该手机号尚未注册" || "该邮箱尚未注册"){ - this.setState({ - Phonenumberisnotco:response.data.message, - }) - return; - } - else if("错误的账号或密码"){ - this.setState({ - Phonenumberisnotco:response.data.message, - }) - return; - } - else if("违反平台使用规范,账号已被锁定"){ - this.setState({ - Phonenumberisnotco:response.data.message, - }) - - return; - } - else { - this.openNotification(response.data.message); - return; - } + if(response.data.message==="该手机号尚未注册" || response.data.message==="该邮箱尚未注册"){ + this.setState({ + Phonenumberisnotco:response.data.message, + }) + return; + } + else if(response.data.message==="错误的账号或密码"){ + this.setState({ + Phonenumberisnotcodmms:response.data.message, + }) + return; + } + else if(response.data.message==="违反平台使用规范,账号已被锁定"){ + this.setState({ + Phonenumberisnotco:response.data.message, + }) + + return; + } + else { + this.openNotification(response.data.message); + return; + } } @@ -474,7 +483,7 @@ class LoginRegisterComponent extends Component { // }) this.setMyEduCoderModals(); } - } + } }).catch((error) => { }) @@ -495,54 +504,54 @@ class LoginRegisterComponent extends Component { // this.setState({dragOk: true}) if(result){ - if(result.data.status===-2){ - if (id === 1) { - if(result.data.message==="该手机号码或邮箱已被注册"){ - this.setState({ - Phonenumberisnotco: undefined, - Phonenumberisnotcobool: false, - dragOk:true, - }) - }else { - this.setState({ - Phonenumberisnotco: result.data.message, - Phonenumberisnotcobool: true, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - console.log("s5"); - - } - return; - } else if (id === 2) { - this.setState({ - Phonenumberisnotcos: result.data.message, - Phonenumberisnotcobool: true, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - console.log("s6"); - - return; - } - }else { - if (id === 1) { - this.setState({ - Phonenumberisnotco: undefined, - Phonenumberisnotcobool: false, - dragOk:true, - }) - return; - } else if (id === 2) { - this.setState({ - Phonenumberisnotcos: undefined, - Phonenumberisnotcobool: false, - dragOk:true, - }) - return; - } - } - } + if(result.data.status===-2){ + if (id === 1) { + if(result.data.message==="该手机号码或邮箱已被注册"){ + this.setState({ + Phonenumberisnotco: undefined, + Phonenumberisnotcobool: false, + dragOk:true, + }) + }else { + this.setState({ + Phonenumberisnotco: result.data.message, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + console.log("s5"); + + } + return; + } else if (id === 2) { + this.setState({ + Phonenumberisnotcos: result.data.message, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + console.log("s6"); + + return; + } + }else { + if (id === 1) { + this.setState({ + Phonenumberisnotco: undefined, + Phonenumberisnotcobool: false, + dragOk:true, + }) + return; + } else if (id === 2) { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + dragOk:true, + }) + return; + } + } + } }).catch((error) => { @@ -603,12 +612,12 @@ class LoginRegisterComponent extends Component { }) return; } - if(this.state.pciphone===true) { - if (this.state.dragOk === false) { - this.openNotification("拖动滑块验证"); - return; - } - } + if(this.state.pciphone===true) { + if (this.state.dragOk === false) { + this.openNotification("拖动滑块验证"); + return; + } + } if (this.state.getverificationcodes === true) { this.setState({ @@ -666,12 +675,14 @@ class LoginRegisterComponent extends Component { this.setState({ Phonenumberisnotco: undefined, Phonenumberisnotcobool: false, + Phonenumberisnotcodmms:undefined, login: stirngt, }) }else{ this.setState({ login: stirngt, Phonenumberisnotco:undefined, + Phonenumberisnotcodmms:undefined, }) } @@ -681,61 +692,61 @@ class LoginRegisterComponent extends Component { this.Emailphonenumberverification(e.target.value, 1); } inputOnBlurzhuche = (e, id) => { - if (e.target.value.length === 0) { - this.setState({ - Phonenumberisnotcos: undefined, - Phonenumberisnotcobool: false, - }) - return; - } - // var telephone = $("#telephoneAdd.tianjia_phone").val(); - var regph = /^[1][3,4,5,6,7,8][0-9]{9}$/; - // var email = $("#add_email.tianjia_email").val(); - var regemail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; - - // [1]手机号开头必须是1 [3,4,5,6,7,8] 第二位是3-8中的一个 [0-9]{9} 后边9位可以是0-9的任意数字。 - var stringdata = undefined; - if (!regph.test(e.target.value)) { - stringdata = "手机号格式不正确"; - this.setState({ - Phonenumberisnotcos: stringdata, - Phonenumberisnotcobool: true, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - } else { - this.setState({ - Phonenumberisnotcos: undefined, - Phonenumberisnotcobool: false, + if (e.target.value.length === 0) { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + }) + return; + } + // var telephone = $("#telephoneAdd.tianjia_phone").val(); + var regph = /^[1][3,4,5,6,7,8][0-9]{9}$/; + // var email = $("#add_email.tianjia_email").val(); + var regemail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; - }) - return - } + // [1]手机号开头必须是1 [3,4,5,6,7,8] 第二位是3-8中的一个 [0-9]{9} 后边9位可以是0-9的任意数字。 + var stringdata = undefined; + if (!regph.test(e.target.value)) { + stringdata = "手机号格式不正确"; + this.setState({ + Phonenumberisnotcos: stringdata, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + } else { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, - if (!regemail.test(e.target.value)) { - if ((e.target.value.indexOf("@") != -1) === true) { - stringdata = "邮箱格式不正确"; - } else { - stringdata = "手机号格式不正确"; + }) + return + } - } - this.setState({ - Phonenumberisnotcos: stringdata, - Phonenumberisnotcobool: true, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - return + if (!regemail.test(e.target.value)) { + if ((e.target.value.indexOf("@") != -1) === true) { + stringdata = "邮箱格式不正确"; } else { - this.setState({ - Phonenumberisnotcos: undefined, - Phonenumberisnotcobool: false, + stringdata = "手机号格式不正确"; - }) - this.Emailphonenumberverification(e.target.value, id); - return } + this.setState({ + Phonenumberisnotcos: stringdata, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + return + } else { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + + }) this.Emailphonenumberverification(e.target.value, id); + return + } + this.Emailphonenumberverification(e.target.value, id); } //获取登入密码 passwordonChange = (e) => { @@ -750,6 +761,7 @@ class LoginRegisterComponent extends Component { this.setState({ password: stirngt, Phonenumberisnotcodmm:undefined, + Phonenumberisnotcodmms:undefined, }) // this.setState({ // password: e.target.value @@ -759,28 +771,28 @@ class LoginRegisterComponent extends Component { loginInputonChanges = (e) => { console.log(e.target.value); var stirngt; - if(e.target.value.length>0){ - var str= e.target.value.replace(/\s*/g,"") - stirngt=str; - }else{ - stirngt= e.target.value; - } - if (e.target.value.length === 0) { - this.setState({ - Phonenumberisnotcos: undefined, - Phonenumberisnotcobool: false, - logins: stirngt, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - }else{ - this.setState({ - logins: stirngt, - Phonenumberisnotcos: undefined, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - } + if(e.target.value.length>0){ + var str= e.target.value.replace(/\s*/g,"") + stirngt=str; + }else{ + stirngt= e.target.value; + } + if (e.target.value.length === 0) { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + logins: stirngt, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + }else{ + this.setState({ + logins: stirngt, + Phonenumberisnotcos: undefined, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + } } //获取注册密码 @@ -810,7 +822,7 @@ class LoginRegisterComponent extends Component { this.setState({ tab:e.key }) - console.log(e.key); + console.log(e.key); if(e.key === 0){ this.setState({ Phonenumberisnotcos:undefined @@ -868,6 +880,7 @@ class LoginRegisterComponent extends Component { // 注册 readAgreement, pciphone, + Phonenumberisnotcodmms, } = this.state // height: 346px; if (this.state.seconds === 0) { @@ -877,30 +890,30 @@ class LoginRegisterComponent extends Component { console.log(classpass); return ( -
    - - -
    - - 登录 - 注册 - - - { - parseInt(tab[0])==0 && -
    - + +
    + + 登录 + 注册 + + + { + parseInt(tab[0])==0 && +
    + - - this.inputOnBlur(e, 1)} - style={{marginTop: '30px', height: '38px'}}> - - { - Phonenumberisnotco && Phonenumberisnotco != "" ? -

    - {Phonenumberisnotco} -

    - :
    - } - - - { - Phonenumberisnotcodmm && Phonenumberisnotcodmm != "" ? -

    - {Phonenumberisnotcodmm} -

    - :
    - } - - - - -
    - } - - - { - parseInt(tab[0])==1 && -
    - this.inputOnBlurzhuche(e, 2)} - style={{marginTop: '30px' , height: '38px',color:'#999999',fontSize:"14px"}}> - { - Phonenumberisnotcos && Phonenumberisnotcos !== "" ? -

    - {Phonenumberisnotcos} -

    - :
    + } + + + this.inputOnBlur(e, 1)} + style={{marginTop: '30px', height: '38px'}}> + + { + Phonenumberisnotco && Phonenumberisnotco != "" ? +

    + {Phonenumberisnotco} +

    + :
    + } + + + { + Phonenumberisnotcodmm && Phonenumberisnotcodmm != "" ? +

    + {Phonenumberisnotcodmm} +

    + : (Phonenumberisnotcodmms=== undefined?
    :"") + } + { + Phonenumberisnotcodmms && Phonenumberisnotcodmms != "" ? +

    + {Phonenumberisnotcodmms} +

    + : "" + } + + + + +
    + } + + + { + parseInt(tab[0])==1 && +
    + this.inputOnBlurzhuche(e, 2)} + style={{marginTop: '30px' , height: '38px',color:'#999999',fontSize:"14px"}}> + { + Phonenumberisnotcos && Phonenumberisnotcos !== "" ? +

    + {Phonenumberisnotcos} +

    + :
    + + } + {this.state.MyEduCoderModals===true? {this.setNotcompleteds()}} + />:""} + + { + Whethertoverify===false&&pciphone===true? + + + : + "" - } - {this.state.MyEduCoderModals===true? {this.setNotcompleteds()}} - />:""} - - { - Whethertoverify===false&&pciphone===true? - - - : - "" - - } - { - Whethertoverify===true&&pciphone===true? - - + } + { + Whethertoverify===true&&pciphone===true? + + : "" - } + } -
    - { - pciphone===true? - ( - Phonenumberisnotcosytdhk && Phonenumberisnotcosytdhk !== "" ? +
    + { + pciphone===true? + ( + Phonenumberisnotcosytdhk && Phonenumberisnotcosytdhk !== "" ?

    {Phonenumberisnotcosytdhk}

    :
    - ) - :"" - } -
    - - - -
    - - - - { - getverificationcodes === undefined ? - - : getverificationcodes === true ? - - : - - } - -
    -
    - { - Phonenumberisnotcosyzm && Phonenumberisnotcosyzm !== "" ? -

    - {Phonenumberisnotcosyzm} -

    - :
    + ) + :"" + } +
    + + + +
    + + + + { + getverificationcodes === undefined ? + + : getverificationcodes === true ? + + : + + } + +
    +
    + { + Phonenumberisnotcosyzm && Phonenumberisnotcosyzm !== "" ? +

    + {Phonenumberisnotcosyzm} +

    + :
    - } -
    + } +
    - - this.Showandhide(key)}> - - }> - { - Phonenumberisnotcosymmm && Phonenumberisnotcosymmm !== "" ? -

    - {Phonenumberisnotcosymmm} -

    - :
    - - } - 我已阅读并同意 + } + + this.Showandhide(key)}> + + }> + { + Phonenumberisnotcosymmm && Phonenumberisnotcosymmm !== "" ? +

    + {Phonenumberisnotcosymmm} +

    + :
    + + } + 我已阅读并同意 《服务协议条款》 - + -
    - } -
    -
    +
    + } +
    + ); } } From aa1d4ebb7d67f506c3e1c80b09964d80b84aac70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 10:51:16 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E4=BC=97=E5=8C=85=E7=A7=BB=E6=A4=8D?= =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PackageIndexNEITaskDetails.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js index 4f06a0cba..23d7a095c 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -286,12 +286,12 @@ class PackageIndexNEITaskDetails extends Component { {data&&data.creator.name} - {data&&data.creator.login===this.props.current_user.login?"":
    - {overtype===false? 头像联系TA: - 头像 头像联系TA: + 头像联系TA}
    } @@ -404,7 +404,7 @@ class PackageIndexNEITaskDetails extends Component { {item.status==="bidding_won"?:""}

    {item.name}

    - {this.props.current_user.login!=item.login? + {this.props.current_user&&this.props.current_user.login!=item.login? 头像联系TA :""} From 6fa50089aa4526d14056bceb7737596bba6b06ce Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 30 Jul 2019 10:53:01 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/courses_controller.rb | 4 ++-- app/controllers/exercises_controller.rb | 2 +- app/controllers/graduation_tasks_controller.rb | 2 +- app/controllers/graduation_topics_controller.rb | 2 +- app/controllers/polls_controller.rb | 2 +- app/controllers/student_works_controller.rb | 4 ++-- app/helpers/export_helper.rb | 6 +++--- app/services/batch_export_shixun_report_service.rb | 2 +- app/services/exercise_user_pdf_service.rb | 4 ++-- app/services/export_exercises_service.rb | 2 +- app/services/export_shixun_report_service.rb | 2 +- 11 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index bdb367111..9ae909dbc 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -1029,8 +1029,8 @@ class CoursesController < ApplicationController normal_status(-1,"课堂暂时没有学生") else member_to_xlsx(@course, @all_members, @c_homeworks, @c_exercises, @c_tasks) - filename_ = "#{current_user.real_name}_#{@course.name}_全部成绩" - render xlsx: "#{format_sheet_name filename_.strip.first(30)}",template: "courses/export_member_scores_excel.xlsx.axlsx", + filename_ = "#{current_user.real_name}_#{@course.name}_全部成绩_#{Time.now.strftime('%Y%m%d_%H%M%S')}" + render xlsx: "#{format_sheet_name filename_.strip}",template: "courses/export_member_scores_excel.xlsx.axlsx", locals: {course_info:@course_info, activity_level:@user_activity_level, course_scores:@course_user_scores,shixun_works:@shixun_work_arrays, common_works:@common_work_arrays,group_works:@group_work_arrays,task_works:@task_work_arrays, diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index 03c943f8d..7c8c07d01 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -1262,7 +1262,7 @@ class ExercisesController < ApplicationController get_export_users(@exercise,@course,@export_ex_users) exercise_export_name_ = "#{current_user.real_name}_#{@course.name}_#{@exercise.exercise_name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" - render xlsx: "#{exercise_export_name_.strip.first(30)}",template: "exercises/exercise_lists.xlsx.axlsx",locals: {table_columns:@table_columns,exercise_users:@user_columns} + render xlsx: "#{exercise_export_name_.strip}",template: "exercises/exercise_lists.xlsx.axlsx",locals: {table_columns:@table_columns,exercise_users:@user_columns} } end end diff --git a/app/controllers/graduation_tasks_controller.rb b/app/controllers/graduation_tasks_controller.rb index ab99e8d86..aeb5c409d 100644 --- a/app/controllers/graduation_tasks_controller.rb +++ b/app/controllers/graduation_tasks_controller.rb @@ -137,7 +137,7 @@ class GraduationTasksController < ApplicationController format.xlsx{ graduation_work_to_xlsx(@work_excel,@task,current_user) task_export_name_ = "#{current_user.real_name}_#{@course.name}_#{@task.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" - render xlsx: "#{task_export_name_.strip.first(30)}",template: "graduation_tasks/tasks_list.xlsx.axlsx",locals: {table_columns:@head_cells_column, task_users:@task_cells_column} + render xlsx: "#{task_export_name_.strip}",template: "graduation_tasks/tasks_list.xlsx.axlsx",locals: {table_columns:@head_cells_column, task_users:@task_cells_column} } end end diff --git a/app/controllers/graduation_topics_controller.rb b/app/controllers/graduation_topics_controller.rb index 754b472c5..96816c2a6 100644 --- a/app/controllers/graduation_topics_controller.rb +++ b/app/controllers/graduation_topics_controller.rb @@ -271,7 +271,7 @@ class GraduationTopicsController < ApplicationController students = course.students.joins(user: :user_extension).order("user_extensions.student_id") graduation_topic_to_xlsx(students,course) topic_export_name_ = "#{current_user.real_name}_#{course.name}_毕设选题_#{Time.now.strftime('%Y%m%d_%H%M%S')}" - render xlsx: "#{topic_export_name_.strip.first(30)}",template: "graduation_topics/export.xlsx.axlsx",locals: {table_columns:@topic_head_cells,topic_users:@topic_body_cells} + render xlsx: "#{topic_export_name_.strip}",template: "graduation_topics/export.xlsx.axlsx",locals: {table_columns:@topic_head_cells,topic_users:@topic_body_cells} rescue Exception => e uid_logger(e.message) missing_template diff --git a/app/controllers/polls_controller.rb b/app/controllers/polls_controller.rb index 4348b3bfc..87435f743 100644 --- a/app/controllers/polls_controller.rb +++ b/app/controllers/polls_controller.rb @@ -950,7 +950,7 @@ class PollsController < ApplicationController format.xlsx{ polls_export_name_ = "#{current_user.real_name}_#{@course.name}_#{@poll.polls_name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" polls_user_commit = poll_commit_result(@poll,@poll_export_questions,@poll_users,@poll_commit_ids) - render xlsx: "#{polls_export_name_.strip.first(30)}",template: "polls/commit_result.xlsx.axlsx",locals: {polls_user_commit:polls_user_commit} + render xlsx: "#{polls_export_name_.strip}",template: "polls/commit_result.xlsx.axlsx",locals: {polls_user_commit:polls_user_commit} } end end diff --git a/app/controllers/student_works_controller.rb b/app/controllers/student_works_controller.rb index f9f4717a6..a5d46e46a 100644 --- a/app/controllers/student_works_controller.rb +++ b/app/controllers/student_works_controller.rb @@ -457,8 +457,8 @@ class StudentWorksController < ApplicationController @myself_eff = @echart_data[:efficiency_list].find { |item| item.last == @user.id } @myself_consume = @echart_data[:consume_list].find { |item| item.last == @user.id } - filename_ = "实训报告_#{@shixun&.name}_#{@use&.real_name}" - filename = Base64.urlsafe_encode64(filename_.strip.first(30)) + filename_ = "#{@use&.student_id}_#{@use&.real_name}_#{@shixun&.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" + filename = Base64.urlsafe_encode64(filename_.strip) stylesheets = %w(shixun_work/shixun_work.css shared/codemirror.css) render pdf: 'shixun_work/shixun_work', filename: filename, stylesheets: stylesheets end diff --git a/app/helpers/export_helper.rb b/app/helpers/export_helper.rb index 742deb85b..6af88de33 100644 --- a/app/helpers/export_helper.rb +++ b/app/helpers/export_helper.rb @@ -418,7 +418,7 @@ module ExportHelper end end - out_file_name = "#{Time.now.to_i}_#{homework_common.name}.zip" + out_file_name = "作品附件_#{homework_common&.course&.name}_#{homework_common.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}.zip" out_file_name.gsub!(" ", "-") out_file_name.gsub!("/", "_") out_file = find_or_pack(homework_common, homework_common.user_id, digests.sort){ @@ -496,8 +496,8 @@ module ExportHelper def make_zip_name(work, file_name="") Rails.logger.info("######################file_name: #{file_name}") - name = file_name === "" ? "" : (file_name[0, file_name.rindex('.')]+"_") - "#{name}#{work.user.real_name}_#{((work.user.student_id.nil?) ? "" : work.user.student_id)}" + # name = file_name === "" ? "" : (file_name[0, file_name.rindex('.')]+"_") + "#{work&.user&.student_id}_#{work.&user.&real_name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" end def zipping(zip_name_refer, files_paths, output_path, is_attachment=false, not_exist_file=[]) diff --git a/app/services/batch_export_shixun_report_service.rb b/app/services/batch_export_shixun_report_service.rb index d71235790..253eb4480 100644 --- a/app/services/batch_export_shixun_report_service.rb +++ b/app/services/batch_export_shixun_report_service.rb @@ -14,7 +14,7 @@ class BatchExportShixunReportService end def filename - @_filename ||= "#{homework.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" + @_filename ||= "实训报告_#{homework&.course&.name}_#{homework.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" end def zip diff --git a/app/services/exercise_user_pdf_service.rb b/app/services/exercise_user_pdf_service.rb index 73711192f..6891e53ea 100644 --- a/app/services/exercise_user_pdf_service.rb +++ b/app/services/exercise_user_pdf_service.rb @@ -15,8 +15,8 @@ class ExerciseUserPdfService end def filename - user_course = @course.course_members.find_by(user_id:@ex_user_user.id)&.course_group_name - exercise_user_name = "#{@ex_user_user.real_name}_#{user_course.present? ? user_course : "未分班"}_#{exercise.exercise_name}_#{Time.now.strftime('%Y%m%d_%H%M')}" + # user_course = @course.course_members.find_by(user_id:@ex_user_user.id)&.course_group_name + exercise_user_name = "#{@ex_user_user&.student_id}_#{@ex_user_user.real_name}_#{exercise.exercise_name}_#{Time.now.strftime('%Y%m%d_%H%M')}" "#{exercise_user_name.strip}.pdf" end diff --git a/app/services/export_exercises_service.rb b/app/services/export_exercises_service.rb index ca2d347a6..1f1e15326 100644 --- a/app/services/export_exercises_service.rb +++ b/app/services/export_exercises_service.rb @@ -10,7 +10,7 @@ class ExportExercisesService end def filename - exercise_export_name = "#{exercise.user.real_name}_#{exercise.exercise_name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" + exercise_export_name = "学生答题_#{exercise&.course&.name}_#{exercise.exercise_name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" "#{exercise_export_name.strip}.zip" end diff --git a/app/services/export_shixun_report_service.rb b/app/services/export_shixun_report_service.rb index f9da3d6f2..57b955762 100644 --- a/app/services/export_shixun_report_service.rb +++ b/app/services/export_shixun_report_service.rb @@ -10,7 +10,7 @@ class ExportShixunReportService end def filename - @_filename ||= "#{homework.name}-#{work.user&.student_id}-#{work.user.real_name}.pdf".gsub(' ', '-').gsub('/', '_') + @_filename ||= "#{work.user&.student_id}_#{work.user.real_name}_#{homework.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}.pdf".gsub(' ', '-').gsub('/', '_') end def prepare_binding From d7c0ef56f079a1e0f70b55c76c1763a938cd06fe Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 30 Jul 2019 11:21:11 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=BC=B9=E6=A1=86?= =?UTF-8?q?=E5=BA=94=E8=AF=A5=E4=BC=98=E5=85=88=E4=BA=8E=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E8=AF=BE=E5=A0=82=E5=BC=B9=E6=A1=86=EF=BC=8C=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=BA=94=E8=AF=A5=E4=BC=98=E5=85=88=E5=88=A4=E6=96=AD=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f01ad4b6b..e825d53da 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -38,6 +38,7 @@ class ApplicationController < ActionController::Base def user_course_identity @user_course_identity = current_user.course_identity(@course) if @user_course_identity > Course::STUDENT && @course.is_public == 0 + tip_exception(401, "..") unless User.current.logged? tip_exception(409, "您没有权限进入") end uid_logger("###############user_course_identity:#{@user_course_identity}") From 2ac2bbf5d87ead4360956f3967088192b949256a Mon Sep 17 00:00:00 2001 From: p31729568 Date: Tue, 30 Jul 2019 11:56:45 +0800 Subject: [PATCH 09/10] add phone to get user info apig --- app/views/users/get_user_info.json.jbuilder | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/users/get_user_info.json.jbuilder b/app/views/users/get_user_info.json.jbuilder index d9eb736ad..d12b950f9 100644 --- a/app/views/users/get_user_info.json.jbuilder +++ b/app/views/users/get_user_info.json.jbuilder @@ -7,6 +7,7 @@ json.is_teacher @user.user_extension&.teacher? json.user_identity @user.identity json.tidding_count 0 json.user_phone_binded @user.phone.present? +json.phone @user.phone json.profile_completed @user.profile_completed? if @course json.course_identity @course_identity From 275fb7e21c1c02bdcba3e9d4593a22400913e11c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 13:40:29 +0800 Subject: [PATCH 10/10] b --- public/react/src/AppConfig.js | 2 +- .../PackageIndex/PackageConcent.js | 4 +-- .../PackageIndexNEITaskDetails.js | 27 ++++++++++--------- .../PackageIndexNEITaskDetails/pds.css | 21 +++++++-------- .../PackageIndexNEIBannerConcent.js | 6 ++--- .../PackageIndexNEISubmit.js | 4 +-- public/react/src/modules/tpm/NewHeader.js | 2 +- 7 files changed, 32 insertions(+), 34 deletions(-) diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index 2ad7df0d5..363ff495d 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -41,7 +41,7 @@ export function initAxiosInterceptors(props) { // proxy = "http://testbdweb.trustie.net" // proxy = "http://testbdweb.educoder.net" // proxy = "https://testeduplus2.educoder.net" - proxy="http://47.96.87.25:48080/" + proxy="http://47.96.87.25:48080" // 在这里使用requestMap控制,避免用户通过双击等操作发出重复的请求; diff --git a/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js index 46e36f90f..3f31b442e 100644 --- a/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js @@ -157,7 +157,7 @@ class PackageConcent extends Component { enterButton={ 搜索} onSearch={ (value)=>this.setdatafuns(value)} />

    @@ -223,7 +223,7 @@ class PackageConcent extends Component { diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js index 23d7a095c..bec37a59a 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -229,7 +229,8 @@ class PackageIndexNEITaskDetails extends Component { } goback = () => { - window.history.go(-1) + // window.history.go(-1) + window.location.href="/crowdsourcings"; } render() { @@ -251,7 +252,7 @@ class PackageIndexNEITaskDetails extends Component { '} className={"fl"}> {/*{this.props.current_user.username}*/} - 众包创新 + 众包创新 {data&&data.title} @@ -351,7 +352,7 @@ class PackageIndexNEITaskDetails extends Component { 需求详情: {data&&data.status==="pending"&&data&&data.operation.can_select_bidding_user===true?:""} @@ -393,16 +394,16 @@ class PackageIndexNEITaskDetails extends Component { -
    -
    -
    +
    +
    +
    {data&&data.bidding_users.map((item,key)=>{ return( -
    +
    {item.status==="bidding_won"?:""} - +

    {item.name}

    {this.props.current_user&&this.props.current_user.login!=item.login? 头像联系TA @@ -442,15 +443,15 @@ class PackageIndexNEITaskDetails extends Component {
    -
    -
    -
    +
    +
    +
    {data&&data.bidding_users.map((item,key)=>{ return( -
    this.Clickteacher2(item.id)} key={key}> + ) diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/pds.css b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/pds.css index a6f9e10dc..504a78bed 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/pds.css +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/pds.css @@ -1,4 +1,4 @@ -.ysldivhome2{ +.ysldivhome2s{ display: flex; flex-flow: row wrap; align-content:stretch; @@ -6,20 +6,17 @@ margin-bottom: 20px; } -.ysllogin_register_contents{ - display: flex; - margin-top: 20px; - /*justify-content: center;*/ - background: #fff; -} - .ysllogin_register_contentss{ margin-top:0px !important; padding-top: 10px; padding-bottom: 10px; + display: flex; + margin-top: 20px; + /*justify-content: center;*/ + background: #fff; } -.ysldivhomediv1{ +.ysldivhomediv1s{ width: 80px; height: 130px; display: flex; @@ -33,10 +30,10 @@ margin-left: 64px; } -.yslgouxuanimg2{ +.yslgouxuanimg2s{ height: 20px; } -.div1img{ +.div1imgs{ display: flex; justify-content:center; width: 80px; @@ -53,7 +50,7 @@ .ptext{ width: 80px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } -.ysllogin_section { +.ysllogin_sections { display: flex; align-items: center; flex-direction: column; diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index e7e4b20a2..adde77b64 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -454,7 +454,7 @@ class PackageIndexNEIBannerConcent extends Component { if(type===true){ this.props.setPublicationfun(response.data.id) }else{ - window.location.href="/crowdsourcing/"+response.data.id + window.location.href="/crowdsourcings/"+response.data.id } this.setState({ springtype:false @@ -502,7 +502,7 @@ class PackageIndexNEIBannerConcent extends Component { if(type===true){ this.props.setPublicationfun(response.data.id) }else{ - window.location.href="/crowdsourcing/"+response.data.id + window.location.href="/crowdsourcings/"+response.data.id } this.setState({ springtype:false @@ -836,7 +836,7 @@ class PackageIndexNEIBannerConcent extends Component {

    - 姓名: + 姓名: { if(sum===undefined){ - window.location.href="/crowdsourcing/new" + window.location.href="/crowdsourcings/new" }else{ // this.props.history.push("/project_packages/"+sum) - window.location.href="/crowdsourcing/"+sum + window.location.href="/crowdsourcings/"+sum } } diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index 379c70e27..23330e779 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -718,7 +718,7 @@ submittojoinclass=(value)=>{

  • 教学案例
  • 众包创新
  • 交流问答