| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557 |
- import React, { PureComponent as Component } from 'react';
- import { Row, Col, Input, Button, Select, message, Upload, Tooltip } from 'antd';
- import axios from 'axios';
- import { formatTime } from '../../common.js';
- import PropTypes from 'prop-types';
- import { setBreadcrumb, setImageUrl } from '../../reducer/modules/user';
- import { connect } from 'react-redux';
- const EditButton = props => {
- const { isAdmin, isOwner, onClick, name, admin } = props;
- if (isOwner) {
- // 本人
- if (admin) {
- return null;
- }
- return (
- <Button
- icon="edit"
- onClick={() => {
- onClick(name, true);
- }}
- >
- 修改
- </Button>
- );
- } else if (isAdmin) {
- // 管理员
- return (
- <Button
- icon="edit"
- onClick={() => {
- onClick(name, true);
- }}
- >
- 修改
- </Button>
- );
- } else {
- return null;
- }
- };
- EditButton.propTypes = {
- isAdmin: PropTypes.bool,
- isOwner: PropTypes.bool,
- onClick: PropTypes.func,
- name: PropTypes.string,
- admin: PropTypes.bool
- };
- @connect(
- state => {
- return {
- curUid: state.user.uid,
- userType: state.user.type,
- curRole: state.user.role
- };
- },
- {
- setBreadcrumb
- }
- )
- class Profile extends Component {
- static propTypes = {
- match: PropTypes.object,
- curUid: PropTypes.number,
- userType: PropTypes.string,
- setBreadcrumb: PropTypes.func,
- curRole: PropTypes.string,
- upload: PropTypes.bool
- };
- constructor(props) {
- super(props);
- this.state = {
- usernameEdit: false,
- emailEdit: false,
- secureEdit: false,
- roleEdit: false,
- userinfo: {}
- };
- }
- componentDidMount() {
- this._uid = this.props.match.params.uid;
- this.handleUserinfo(this.props);
- }
- componentWillReceiveProps(nextProps) {
- if (!nextProps.match.params.uid) {
- return;
- }
- if (this._uid !== nextProps.match.params.uid) {
- this.handleUserinfo(nextProps);
- }
- }
- handleUserinfo(props) {
- const uid = props.match.params.uid;
- this.getUserInfo(uid);
- }
- handleEdit = (key, val) => {
- var s = {};
- s[key] = val;
- this.setState(s);
- };
- getUserInfo = id => {
- var _this = this;
- const { curUid } = this.props;
- axios.get('/api/user/find?id=' + id).then(res => {
- _this.setState({
- userinfo: res.data.data,
- _userinfo: res.data.data
- });
- if (curUid === +id) {
- this.props.setBreadcrumb([{ name: res.data.data.username }]);
- } else {
- this.props.setBreadcrumb([{ name: '管理: ' + res.data.data.username }]);
- }
- });
- };
- updateUserinfo = name => {
- var state = this.state;
- let value = this.state._userinfo[name];
- let params = { uid: state.userinfo.uid };
- params[name] = value;
- axios.post('/api/user/update', params).then(
- res => {
- let data = res.data;
- if (data.errcode === 0) {
- let userinfo = this.state.userinfo;
- userinfo[name] = value;
- this.setState({
- userinfo: userinfo
- });
- this.handleEdit(name + 'Edit', false);
- message.success('更新用户信息成功');
- } else {
- message.error(data.errmsg);
- }
- },
- err => {
- message.error(err.message);
- }
- );
- };
- changeUserinfo = e => {
- let dom = e.target;
- let name = dom.getAttribute('name');
- let value = dom.value;
- this.setState({
- _userinfo: {
- ...this.state._userinfo,
- [name]: value
- }
- });
- };
- changeRole = val => {
- let userinfo = this.state.userinfo;
- userinfo.role = val;
- this.setState({
- _userinfo: userinfo
- });
- this.updateUserinfo('role');
- };
- updatePassword = () => {
- let old_password = document.getElementById('old_password').value;
- let password = document.getElementById('password').value;
- let verify_pass = document.getElementById('verify_pass').value;
- if (password != verify_pass) {
- return message.error('两次输入的密码不一样');
- }
- let params = {
- uid: this.state.userinfo.uid,
- password: password,
- old_password: old_password
- };
- axios.post('/api/user/change_password', params).then(
- res => {
- let data = res.data;
- if (data.errcode === 0) {
- this.handleEdit('secureEdit', false);
- message.success('修改密码成功');
- if (this.props.curUid === this.state.userinfo.uid) {
- location.reload();
- }
- } else {
- message.error(data.errmsg);
- }
- },
- err => {
- message.error(err.message);
- }
- );
- };
- render() {
- let ButtonGroup = Button.Group;
- let userNameEditHtml, emailEditHtml, secureEditHtml, roleEditHtml;
- const Option = Select.Option;
- let userinfo = this.state.userinfo;
- let _userinfo = this.state._userinfo;
- let roles = { admin: '管理员', member: '会员' };
- let userType = '';
- if (this.props.userType === 'third') {
- userType = false;
- } else if (this.props.userType === 'site') {
- userType = true;
- } else {
- userType = false;
- }
- // 用户名信息修改
- if (this.state.usernameEdit === false) {
- userNameEditHtml = (
- <div>
- <span className="text">{userinfo.username}</span>
- {/*<span className="text-button" onClick={() => { this.handleEdit('usernameEdit', true) }}><Icon type="edit" />修改</span>*/}
- {/* {btn} */}
- {/* 站点登陆才能编辑 */}
- {userType && (
- <EditButton
- userType={userType}
- isOwner={userinfo.uid === this.props.curUid}
- isAdmin={this.props.curRole === 'admin'}
- onClick={this.handleEdit}
- name="usernameEdit"
- />
- )}
- </div>
- );
- } else {
- userNameEditHtml = (
- <div>
- <Input
- value={_userinfo.username}
- name="username"
- onChange={this.changeUserinfo}
- placeholder="用户名"
- />
- <ButtonGroup className="edit-buttons">
- <Button
- className="edit-button"
- onClick={() => {
- this.handleEdit('usernameEdit', false);
- }}
- >
- 取消
- </Button>
- <Button
- className="edit-button"
- onClick={() => {
- this.updateUserinfo('username');
- }}
- type="primary"
- >
- 确定
- </Button>
- </ButtonGroup>
- </div>
- );
- }
- // 邮箱信息修改
- if (this.state.emailEdit === false) {
- emailEditHtml = (
- <div>
- <span className="text">{userinfo.email}</span>
- {/*<span className="text-button" onClick={() => { this.handleEdit('emailEdit', true) }} ><Icon type="edit" />修改</span>*/}
- {/* {btn} */}
- {/* 站点登陆才能编辑 */}
- {userType && (
- <EditButton
- admin={userinfo.role === 'admin'}
- isOwner={userinfo.uid === this.props.curUid}
- isAdmin={this.props.curRole === 'admin'}
- onClick={this.handleEdit}
- name="emailEdit"
- />
- )}
- </div>
- );
- } else {
- emailEditHtml = (
- <div>
- <Input
- placeholder="Email"
- value={_userinfo.email}
- name="email"
- onChange={this.changeUserinfo}
- />
- <ButtonGroup className="edit-buttons">
- <Button
- className="edit-button"
- onClick={() => {
- this.handleEdit('emailEdit', false);
- }}
- >
- 取消
- </Button>
- <Button
- className="edit-button"
- type="primary"
- onClick={() => {
- this.updateUserinfo('email');
- }}
- >
- 确定
- </Button>
- </ButtonGroup>
- </div>
- );
- }
- if (this.state.roleEdit === false) {
- roleEditHtml = (
- <div>
- <span className="text">{roles[userinfo.role]}</span>
- </div>
- );
- } else {
- roleEditHtml = (
- <Select defaultValue={_userinfo.role} onChange={this.changeRole} style={{ width: 150 }}>
- <Option value="admin">管理员</Option>
- <Option value="member">会员</Option>
- </Select>
- );
- }
- if (this.state.secureEdit === false) {
- let btn = '';
- if (userType) {
- btn = (
- <Button
- icon="edit"
- onClick={() => {
- this.handleEdit('secureEdit', true);
- }}
- >
- 修改
- </Button>
- );
- }
- secureEditHtml = btn;
- } else {
- secureEditHtml = (
- <div>
- <Input
- style={{
- display: this.props.curRole === 'admin' && userinfo.role != 'admin' ? 'none' : ''
- }}
- placeholder="旧的密码"
- type="password"
- name="old_password"
- id="old_password"
- />
- <Input placeholder="新的密码" type="password" name="password" id="password" />
- <Input placeholder="确认密码" type="password" name="verify_pass" id="verify_pass" />
- <ButtonGroup className="edit-buttons">
- <Button
- className="edit-button"
- onClick={() => {
- this.handleEdit('secureEdit', false);
- }}
- >
- 取消
- </Button>
- <Button className="edit-button" onClick={this.updatePassword} type="primary">
- 确定
- </Button>
- </ButtonGroup>
- </div>
- );
- }
- return (
- <div className="user-profile">
- <div className="user-item-body">
- {userinfo.uid === this.props.curUid ? (
- <h3>个人设置</h3>
- ) : (
- <h3>{userinfo.username} 资料设置</h3>
- )}
- <Row className="avatarCon" type="flex" justify="start">
- <Col span={24}>
- {userinfo.uid === this.props.curUid ? (
- <AvatarUpload uid={userinfo.uid}>点击上传头像</AvatarUpload>
- ) : (
- <div className="avatarImg">
- <img src={`/api/user/avatar?uid=${userinfo.uid}`} />
- </div>
- )}
- </Col>
- </Row>
- <Row className="user-item" type="flex" justify="start">
- <div className="maoboli" />
- <Col span={4}>用户id</Col>
- <Col span={12}>{userinfo.uid}</Col>
- </Row>
- <Row className="user-item" type="flex" justify="start">
- <div className="maoboli" />
- <Col span={4}>用户名</Col>
- <Col span={12}>{userNameEditHtml}</Col>
- </Row>
- <Row className="user-item" type="flex" justify="start">
- <div className="maoboli" />
- <Col span={4}>Email</Col>
- <Col span={12}>{emailEditHtml}</Col>
- </Row>
- <Row
- className="user-item"
- style={{ display: this.props.curRole === 'admin' ? '' : 'none' }}
- type="flex"
- justify="start"
- >
- <div className="maoboli" />
- <Col span={4}>角色</Col>
- <Col span={12}>{roleEditHtml}</Col>
- </Row>
- <Row
- className="user-item"
- style={{ display: this.props.curRole === 'admin' ? '' : 'none' }}
- type="flex"
- justify="start"
- >
- <div className="maoboli" />
- <Col span={4}>登陆方式</Col>
- <Col span={12}>{userinfo.type === 'site' ? '站点登陆' : '第三方登陆'}</Col>
- </Row>
- <Row className="user-item" type="flex" justify="start">
- <div className="maoboli" />
- <Col span={4}>创建账号时间</Col>
- <Col span={12}>{formatTime(userinfo.add_time)}</Col>
- </Row>
- <Row className="user-item" type="flex" justify="start">
- <div className="maoboli" />
- <Col span={4}>更新账号时间</Col>
- <Col span={12}>{formatTime(userinfo.up_time)}</Col>
- </Row>
- {userType ? (
- <Row className="user-item" type="flex" justify="start">
- <div className="maoboli" />
- <Col span={4}>密码</Col>
- <Col span={12}>{secureEditHtml}</Col>
- </Row>
- ) : (
- ''
- )}
- </div>
- </div>
- );
- }
- }
- @connect(
- state => {
- return {
- url: state.user.imageUrl
- };
- },
- {
- setImageUrl
- }
- )
- class AvatarUpload extends Component {
- constructor(props) {
- super(props);
- }
- static propTypes = {
- uid: PropTypes.number,
- setImageUrl: PropTypes.func,
- url: PropTypes.any
- };
- uploadAvatar(basecode) {
- axios
- .post('/api/user/upload_avatar', { basecode: basecode })
- .then(() => {
- // this.setState({ imageUrl: basecode });
- this.props.setImageUrl(basecode);
- })
- .catch(e => {
- console.log(e);
- });
- }
- handleChange(info) {
- if (info.file.status === 'done') {
- // Get this url from response in real world.
- getBase64(info.file.originFileObj, basecode => {
- this.uploadAvatar(basecode);
- });
- }
- }
- render() {
- const { url } = this.props;
- let imageUrl = url ? url : `/api/user/avatar?uid=${this.props.uid}`;
- // let imageUrl = this.state.imageUrl ? this.state.imageUrl : `/api/user/avatar?uid=${this.props.uid}`;
- // console.log(this.props.uid);
- return (
- <div className="avatar-box">
- <Tooltip
- placement="right"
- title={<div>点击头像更换 (只支持jpg、png格式且大小不超过200kb的图片)</div>}
- >
- <div>
- <Upload
- className="avatar-uploader"
- name="basecode"
- showUploadList={false}
- action="/api/user/upload_avatar"
- beforeUpload={beforeUpload}
- onChange={this.handleChange.bind(this)}
- >
- {/*<Avatar size="large" src={imageUrl} />*/}
- <div style={{ width: 100, height: 100 }}>
- <img className="avatar" src={imageUrl} />
- </div>
- </Upload>
- </div>
- </Tooltip>
- <span className="avatarChange" />
- </div>
- );
- }
- }
- function beforeUpload(file) {
- const isJPG = file.type === 'image/jpeg';
- const isPNG = file.type === 'image/png';
- if (!isJPG && !isPNG) {
- message.error('图片的格式只能为 jpg、png!');
- }
- const isLt2M = file.size / 1024 / 1024 < 0.2;
- if (!isLt2M) {
- message.error('图片必须小于 200kb!');
- }
- return (isPNG || isJPG) && isLt2M;
- }
- function getBase64(img, callback) {
- const reader = new FileReader();
- reader.addEventListener('load', () => callback(reader.result));
- reader.readAsDataURL(img);
- }
- export default Profile;
|