diff --git a/public/react/src/common/components/Cropper.js b/public/react/src/common/components/Cropper.js index c9514e52a..2fe71ea2b 100644 --- a/public/react/src/common/components/Cropper.js +++ b/public/react/src/common/components/Cropper.js @@ -7,6 +7,11 @@ let _url_origin = getUrl2() // let _url_origin = `http://47.96.87.25:48080`; if (!window.Cropper) { + $.ajaxSetup({ + cache: true + }); + + $('head').append($('') .attr('href', `${_url_origin}/react/public/js/cropper/cropper.min.css`)); @@ -61,7 +66,14 @@ function save_avatar(){ // }); // } } - +/** + props 说明: + imageId 源图片标签的id + previewId crop后预览dom的id + imageSrc 源图片src + width 数字格式 + height 数字格式 +*/ class Cropper extends Component { state = { }; @@ -70,26 +82,31 @@ class Cropper extends Component { } componentDidMount() { - setTimeout(() => { - const image = document.getElementById('image'); - const cropper = new window.Cropper(image, { - aspectRatio: 1, - crop(event) { - // console.log(event.detail.x); - // console.log(event.detail.y); - // console.log(event.detail.width); - // console.log(event.detail.height); - // console.log(event.detail.rotate); - // console.log(event.detail.scaleX); - // console.log(event.detail.scaleY); - }, + this.options = { + aspectRatio: 1, + crop(event) { + // console.log(event.detail.x); + // console.log(event.detail.y); + // console.log(event.detail.width); + // console.log(event.detail.height); + // console.log(event.detail.rotate); + // console.log(event.detail.scaleX); + // console.log(event.detail.scaleY); + }, - preview: '.img-preview', - }); - }, 3000) + preview: this.props.previewId ? `#${this.props.previewId}` : '.img-preview', + } + setTimeout(() => { + const image = document.getElementById(this.props.imageId || '__image'); + this.cropper = new window.Cropper(image, this.options); + }, 1000) } + renew = (image) => { + this.cropper && this.cropper.destroy(); + this.cropper = new window.Cropper(image, this.options); + } render() { const { width, height, previewId, imageSrc } = this.props; @@ -98,8 +115,8 @@ class Cropper extends Component { {/* This rule is very important, please do not ignore this! */}
{/* http://localhost:3007/images/footNavLogo.png 图片转了后不对 */} - +
{/* background: 'aquamarine', 'border-radius': '128px' @@ -124,7 +141,7 @@ class Cropper extends Component { {/* */} {/*
*/} - + {/* */} ); } diff --git a/public/react/src/common/course/ActionBtn.js b/public/react/src/common/course/ActionBtn.js index 2c0664863..03da0d3e7 100644 --- a/public/react/src/common/course/ActionBtn.js +++ b/public/react/src/common/course/ActionBtn.js @@ -1,7 +1,9 @@ import React, { Component } from 'react'; import {Link} from 'react-router-dom' -const map={"blue":"blueFull","greyBack":"greyBack","grey":"greyWidthFixed","green":"greenBack"} +const map={"blue":"blueFull","greyBack":"greyBack","grey":"greyWidthFixed","green":"greenBack", + 'colorBlue': 'colorBlue', // 蓝字白底 +} class ActionBtn extends Component { constructor(props) { super(props); diff --git a/public/react/src/common/educoder.js b/public/react/src/common/educoder.js index db93b4d56..f5b8d0430 100644 --- a/public/react/src/common/educoder.js +++ b/public/react/src/common/educoder.js @@ -28,6 +28,7 @@ export { EDU_ADMIN, EDU_BUSINESS, EDU_SHIXUN_MANAGER, EDU_SHIXUN_MEMBER, EDU_CER , EDU_GAME_MANAGER, EDU_TEACHER, EDU_NORMAL} from './Const' export { ModalHOC } from './components/ModalHOC' +export { default as Cropper } from './components/Cropper' export { default as ConditionToolTip } from './components/ConditionToolTip' export { default as DragValidator } from './components/DragValidator' diff --git a/public/react/src/modules/courses/css/Courses.css b/public/react/src/modules/courses/css/Courses.css index 11ba24c5d..3e6945e0d 100644 --- a/public/react/src/modules/courses/css/Courses.css +++ b/public/react/src/modules/courses/css/Courses.css @@ -677,6 +677,11 @@ a.white-btn.use_scope-btn:hover{ color: #fff!important; } +.colorBlue { + background-color: #fff; + color: #4CACFF; + border: 1px solid #4CACFF; +} .greyBack{ /* 不要固定宽度 */ /* width: 64px; */ diff --git a/public/react/src/modules/test/TestCrop.js b/public/react/src/modules/test/TestCrop.js index b7f442363..b539ef2b4 100644 --- a/public/react/src/modules/test/TestCrop.js +++ b/public/react/src/modules/test/TestCrop.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import Cropper from '../../common/components/Cropper' - +import ChangeHeaderPicModal from '../user/account/ChangeHeaderPicModal' class TestCrop extends Component { state = { }; @@ -14,6 +14,8 @@ class TestCrop extends Component { const props = this.props; return (
+ +
); diff --git a/public/react/src/modules/user/account/ChangeHeaderPicModal.js b/public/react/src/modules/user/account/ChangeHeaderPicModal.js index e69de29bb..32532f904 100644 --- a/public/react/src/modules/user/account/ChangeHeaderPicModal.js +++ b/public/react/src/modules/user/account/ChangeHeaderPicModal.js @@ -0,0 +1,163 @@ +import React, { Component } from "react"; +import { Modal } from "antd"; +import axios from 'axios' +import ModalWrapper from "../../courses/common/ModalWrapper" +import { Cropper } from 'educoder' + +const imageId = 'changeHeaderPic' +const previewId = 'changeHeader_imagePreview' +let uploadedImageType; +let uploadedImageName; +let uploadedImageURL; +class ChangeHeaderPicModal extends Component{ + constructor(props){ + super(props); + this.state={ + + } + } + init = () => { + var inputImage = document.getElementById('inputImage'); + const that = this; + inputImage.onchange = function () { + var files = this.files; + var file; + + // cropper && + if (files && files.length) { + file = files[0]; + + if (/^image\/\w+/.test(file.type)) { + uploadedImageType = file.type; + uploadedImageName = file.name; + + if (uploadedImageURL) { + URL.revokeObjectURL(uploadedImageURL); + } + const image = document.getElementById( imageId ); + image.src = uploadedImageURL = URL.createObjectURL(file); + that.refs['cropper'].renew(image) + // cropper.destroy(); + // cropper = new Cropper(image, options); + inputImage.value = null; + } else { + // TODO noti + window.alert('Please choose an image file.'); + } + } + }; + } + componentDidMount() { + } + setVisible = (visible) => { + + this.refs['modalWrapper'].setVisible(visible) + if (visible) { + setTimeout(() => { + this.init() + }, 300) + } + } + + onSendOk = () => { + + + } + + onOk = () => { + var img_lg = document.getElementById(previewId); + // 截图小的显示框内的内容 + window.html2canvas(img_lg).then((canvas) => { + var dataUrl = canvas.toDataURL("image/jpeg"); + console.log(dataUrl) + + const url = `/users/accounts/${this.props.userLogin || 'kosasa'}/avatar.json` + axios.put(url, { + image: dataUrl + }) + .then((response) => { + // {"status":0,"message":"success","avatar_url":"avatars/User/15739"} + if (response.data.status == 0) { + // TODO noti + } + }) + .catch(function (error) { + console.log(error); + }); + }); + } + + render(){ + const { course_lists } = this.state + const { moduleName } = this.props + return( + + +
+
+ + 仅支持JPG、GIF、PNG,且文件小于2M +
+
+
+
+
头像预览
+
+ +
+
+
+ ) + } +} + +export default ChangeHeaderPicModal; + +