Commit 9049c51c authored by baixian's avatar baixian

积分管理

parents f098606d 5eef852b
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>轻校</title><link rel="shortcut icon" href="https://cdn.img.shangjiadao.cn/qingxiao/biz/image/qxlogo4.png"><meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0;" name="viewport"><meta http-equiv="X-UA-Compatible" content="IE=edge"><!-- Polyfills --><!--[if lt IE 10]>
<script src="js/console-polyfill.js"></script>
<![endif]--><script charset="utf-8" src="https://map.qq.com/api/js?v=2.exp&key=XSZBZ-5LHCV-5I2P7-UQHPW-6456F-JBB3B"></script><link href="https://cdn.img.shangjiadao.cn/qingxiao/biz/dist/index.css?1566982589664" rel="stylesheet"><script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/lib/vendor.dll.js?3" charset="utf-8"></script><script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/js/console-polyfill.js?3" charset="utf-8"></script><script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/js/es6-shim.min.js?3" charset="utf-8"></script><script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/js/es5-shim.js?3" charset="utf-8"></script><script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/js/es5-sham.min.js?3" charset="utf-8"></script><script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/js/json3.min.js?3" charset="utf-8"></script><script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/js/html5shiv.min.js?3" charset="utf-8"></script><script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/js/polyfill.js?3" charset="utf-8"></script></head><body><div id="root"></div><script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/dist/index.js?1566982589664" charset="utf-8"></script></body></html>
\ No newline at end of file
<![endif]--><script charset="utf-8" src="https://map.qq.com/api/js?v=2.exp&key=XSZBZ-5LHCV-5I2P7-UQHPW-6456F-JBB3B"></script><link href="https://cdn.img.shangjiadao.cn/qingxiao/biz/dist/index.css?1567578508350" rel="stylesheet"><script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/lib/vendor.dll.js?3" charset="utf-8"></script><script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/js/console-polyfill.js?3" charset="utf-8"></script><script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/js/es6-shim.min.js?3" charset="utf-8"></script><script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/js/es5-shim.js?3" charset="utf-8"></script><script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/js/es5-sham.min.js?3" charset="utf-8"></script><script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/js/json3.min.js?3" charset="utf-8"></script><script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/js/html5shiv.min.js?3" charset="utf-8"></script><script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/js/polyfill.js?3" charset="utf-8"></script></head><body><div id="root"></div><script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/dist/index.js?1567578508350" charset="utf-8"></script></body></html>
\ No newline at end of file
......@@ -10,15 +10,12 @@ if (ENVIRONMENT == 'pro') {
api = 'https://test.wp53.cn/v2/api/';
dakaapi = 'https:clock.wp53.cn/v3/';
}
// const api = 'https://test.wp53.cn/v2/api/';
// const dakaapi = 'https:clock.wp53.cn/v3/';
// const api = 'https://wx.m.shangjiadao.cn/v2/api/';
// const dakaapi = 'https://qxapi.qingxiao.online/daka/v3/';
export default {
userRegister: `${api}service/user/register`,
getVerifyCode: `${api}service/user/verify_code`,
resetPassword: `${api}service/user/reset_password`,
replenish: `${api}v1/user/replenish`,
verifyCodeLogin: `${api}service/user/clock_login`,
login: `${api}service/user/login`,
videoupload: `${dakaapi}member/media_access`,
imgupload: `${dakaapi}member/oss/access`,
......
......@@ -1183,7 +1183,7 @@ export default {
},
* saveClass({ payload }, { call, put, select }) {
const { sid } = yield select(state => state.webapp);
const { classSubmitting, classId } = yield select(state => state.classdetail);
const { classSubmitting, classId, classDetail } = yield select(state => state.classdetail);
if (classSubmitting) {
return;
}
......@@ -1218,6 +1218,20 @@ export default {
yield put({
type: 'queryClassDetail',
});
if (classDetail.course_id != values.course_id) {
yield put({
type: 'queryCoursePlansList',
payload: {
params: {},
},
});
yield put({
type: 'queryClassStudentList',
payload: {
params: {},
},
});
}
} else {
yield put({
type: 'webapp/errorrequestresolve',
......
This diff is collapsed.
......@@ -60,12 +60,15 @@ export default {
mobile,
union_id: 1,
};
let ajax = null;
if (type == 'verify') {
param.verify_code = verifycode;
ajax = login.verifyCodeLogin;
} else {
param.password = password;
ajax = login.login;
}
const loginData = yield call(login.login, param);
const loginData = yield call(ajax, param);
// 判断用户是否完善信息
if (!loginData.code) {
if (loginData.data && loginData.data.token) {
......@@ -80,7 +83,6 @@ export default {
logining: false,
},
});
console.log(userInfo, 'userInfo1');
if (newLoginData.code == 200) {
if (newLoginData.data && newLoginData.data.token) {
LocalStorage.setItem('user', {
......
......@@ -540,7 +540,7 @@ export default {
* studentModelCoursesBuyOrRenew({ payload }, { call, put, select }) {
const { values, callBack } = payload;
const { selectdeStudent } = yield select(state => state.students);
const loadmessage = message.loading('续课中...', 0);
const loadmessage = message.loading('购买中...', 0);
const buyOrRenewData = yield call(courseAjax.coursesBuyOrRenew, Object.assign(values, {
class_ids: (values.class_ids && values.class_ids.join(',')) || '',
student_id: selectdeStudent.id,
......
......@@ -171,9 +171,6 @@ export default {
const {
bannerImg, course, orgdescs,
} = yield select(state => state.officialweb);
const {
goodsBanner,
} = yield select(state => state.integral);
const {
cropperUrl, filename, uploadtype, orgType, orgIndex, imgIndex, action,
} = yield select(state => state.uploader);
......@@ -239,12 +236,10 @@ export default {
},
});
} else if (uploadtype == 'goodBannerupload') {
const newbannerImg = JSON.parse(JSON.stringify(goodsBanner));
newbannerImg.push(`${filename}?x-oss-process=${cropperUrl}`);
yield put({
type: 'integral/updateGoodBanner',
payload: {
avatar: newbannerImg,
goodImage: `${filename}?x-oss-process=${cropperUrl}`,
},
});
}
......
......@@ -39,6 +39,8 @@ export default {
previewQrcode: '',
businessIsBind: false,
checkoutVerifyCode: false,
nicknameChangeShow: false,
nicknameSubmitting: false,
},
subscriptions: {
setup({ dispatch, history }) { // eslint-disable-line
......@@ -161,13 +163,62 @@ export default {
message.error(errorcode[data.code].cn, 1);
}
},
* updateNickname({ payload }, { call, put, select }) {
const { nickname, callBack } = payload;
const { userInfo } = yield select(state => state.webapp);
const { nicknameSubmitting } = yield select(state => state.usersetting);
if (nicknameSubmitting) {
return;
}
yield put({
type: 'updateState',
payload: {
nicknameSubmitting: true,
},
});
const loading = message.loading('昵称修改中...');
const updateAvatarDate = yield call(usersettingajax.updateAvatar, {
nickname,
});
setTimeout(loading);
yield put({
type: 'updateState',
payload: {
nicknameSubmitting: false,
},
});
if (updateAvatarDate.code == 200) {
message.success('修改成功', 1);
userInfo.nickname = nickname;
yield put({
type: 'webapp/updateState',
payload: {
userInfo: { ...userInfo },
nicknameChangeShow: false,
},
});
yield put({
type: 'updateState',
payload: {
nicknameChangeShow: false,
},
});
const user = LocalStorage.getItem('user');
user.nickname = nickname;
LocalStorage.setItem('user', user);
if (callBack && (typeof callBack == 'function')) {
callBack();
}
} else {
message.error('昵称修改失败');
}
},
* updateUserAvatar({ payload }, { call, put, select }) {
const { userInfo } = yield select(state => state.webapp);
const { avatar } = payload;
const loading = message.loading('头像上传中...');
const updateAvatarDate = yield call(usersettingajax.updateAvatar, {
avatar,
nickname: userInfo.nickname,
});
setTimeout(loading);
if (updateAvatarDate.code == 200) {
......
......@@ -117,7 +117,7 @@ class EditClassModal extends React.Component {
initialValue: editClassInfo.course_id,
rules: [{ required: true, message: '课程不能为空' }],
})(
(isEdit == 1 || isStudentClass == 1) ?
(isStudentClass == 1) ?
<span>{ courseList.find(ele => ele.id == editClassInfo.course_id) && courseList.find(ele => ele.id == editClassInfo.course_id).title }</span> :
<Select>
<Option value="">请选择课程名称</Option>
......
......@@ -100,7 +100,7 @@ class ClassMgtForm extends React.Component {
};
return (
<div className={pageStyle.container}>
<Tabs defaultActiveKey="1" onChange={this.callback} tabBarExtraContent={operations}>
<Tabs defaultActiveKey="1" onChange={this.callback} tabBarExtraContent={operations} animated={false}>
<TabPane tab="积分设置" key="1">
<Integralsetting />
</TabPane>
......
.container {
background-color: #fff;
padding: 24px 0 30px;
padding: 24px 0 0;
position: relative;
overflow-y: hidden;
}
......@@ -24,6 +24,8 @@
color:rgba(0,0,0,0.85);
line-height:24px;
margin-right: 30px;
width: 106px;
min-width: 106px;
}
.topheadright {
font-size:14px;
......@@ -45,17 +47,18 @@
display: flex;
align-items: center;
margin-top: 15px;
margin-left: 20px;
.formflex,.formflex1 {
display: flex;
align-items: center;
margin-left: 40px;
margin-bottom: 20px;
.number {
border: 1px solid #D9D9D9;
width: 40px;
height: 24px;
line-height: 24px;
}
.numberActive {
border: 1px solid red;
width: 56px;
height: 32px;
line-height: 32px;
......@@ -69,6 +72,7 @@
color: #5E5E5E;
line-height: 24px;
text-align: center;
cursor: pointer;
}
.switchActive {
background-color: #1890FF;
......@@ -79,6 +83,7 @@
color: #fff;
line-height: 32px;
text-align: center;
cursor: pointer;
}
.sprit {
padding: 0 15px;
......@@ -97,4 +102,30 @@
line-height: 24px;
}
}
.checkLeftTip {
margin-left: 24px;
}
.direction {
text-align: right;
}
.checkboxWrap {
padding: 0 10px;
margin-top: 35px;
}
@media (max-width: 768px) {
.direction {
text-align: left;
margin: 15px 0;
}
}
@media (max-width: 600px) {
.formItem {
.formflex, .formflex1 {
margin-left: 20px;
margin-bottom: 20px;
}
}
.checkboxWrap {
padding: 0;
}
}
......@@ -41,7 +41,6 @@ class StoreMgt extends React.Component {
recordListTotal,
classListQueryParams,
} = this.props;
console.log(recordList);
const columns = [
{
title: '姓名',
......
......@@ -29,7 +29,6 @@ class CouponAddModal extends React.Component {
const {
form, save, editCouponInfo, couponImg,
} = this.props;
console.log(this.props, 'this.props');
if (editCouponInfo.id == 0 && (couponImg == '' || couponImg == undefined)) {
message.error('请上传卡券封面', 0.5);
return;
......@@ -79,9 +78,9 @@ class CouponAddModal extends React.Component {
couponImg,
uploadAvator,
editCouponInfo,
submitting,
form: { getFieldDecorator, getFieldValue },
} = this.props;
console.log(this.props);
const { classRoomId, title } = this.state;
const formItemModalLineLayout = {
labelCol: {
......@@ -97,7 +96,8 @@ class CouponAddModal extends React.Component {
<Modal
visible={visible}
title={isEdit == 1 ? '编辑卡券' : '新增卡券'}
okText="确定"
okText={!submitting ? '保存' : '保存中...'}
confirmLoading={submitting}
onCancel={this.close}
onOk={this.save}
className="modifyclassModal"
......@@ -119,7 +119,7 @@ class CouponAddModal extends React.Component {
<img className={pageStyle.avatar} src={imagify(couponImg) ? imagify(couponImg) : imagify(editCouponInfo.cover)} alt="" />
<span className={pageStyle.uploadThumb}>
<input type="file" id="uploadinput" className={pageStyle.fileuploadinput} onChange={(e) => { this.uploadAvator(e); }} accept="image/*" />
新增图片
{isEdit == 1 ? '修改图片' : '新增图片'}
</span>
<div className={pageStyle.thumbTip}><span>建议尺寸:310*270 最多上传1 </span></div>
</div>
......
.thumb {
display: flex;
position: relative;
margin-bottom: 15px;
.thumbTip {
position: absolute;
font-size:14px;
......
import { connect } from 'dva';
import React from 'react';
import PropTypes from 'prop-types';
import { message, Row, Col, Input, Select, Modal, Form, InputNumber, Carousel } from 'antd';
import { message, Row, Col, Input, Select, Modal, Form, InputNumber, Carousel, Icon } from 'antd';
import { imagify, pageIn } from '../../../utils/index';
import pageStyle from './GoodsAddModal.less';
import PageStyle from '../../officialweb/pagecomponent/OrgdescEditor.less';
const { Option } = Select;
const { TextArea } = Input;
const FormItem = Form.Item;
class GoodsAddModal extends React.Component {
state = {
};
constructor(props) {
super(props);
this.state = {
currentIndex: -1,
};
}
componentWillMount() {
}
componentDidUpdate() {
......@@ -27,13 +32,15 @@ class GoodsAddModal extends React.Component {
const {
form, save, editCouponInfo, couponImg, goodsBanner,
} = this.props;
this.setState({
currentIndex: -1,
});
if (editCouponInfo.id == 0 && (couponImg == '' || couponImg == undefined)) {
message.error('请上传卡券封面', 0.5);
return;
}
form.validateFields((err, values) => {
if (!err) {
console.log(values, 'values');
const {
price,
title,
......@@ -61,6 +68,9 @@ class GoodsAddModal extends React.Component {
close = () => {
const { form, close } = this.props;
form.resetFields();
this.setState({
currentIndex: -1,
});
close();
}
uploadAvator = (e) => {
......@@ -77,6 +87,36 @@ class GoodsAddModal extends React.Component {
uploadtype: 'goodBannerupload',
});
};
imgToUpdate= () => {
this.setState({
currentIndex: 4,
});
}
imgCancelUpdate= () => {
this.setState({
currentIndex: -1,
});
}
moveGoodsimg = (index, direction) => {
const { dispatch } = this.props;
dispatch({
type: 'integral/moveGoodsimg',
payload: {
index,
direction,
},
});
}
deleteGoodsImg = (index) => {
const { dispatch } = this.props;
dispatch({
type: 'integral/deleteGoodsImg',
payload: {
index,
},
});
}
render() {
const {
visible,
......@@ -86,9 +126,11 @@ class GoodsAddModal extends React.Component {
uploadBanner,
editCouponInfo,
goodsBanner,
dispatch,
submitting,
form: { getFieldDecorator, getFieldValue },
} = this.props;
const { classRoomId, title } = this.state;
const { currentIndex } = this.state;
const formItemModalLineLayout = {
labelCol: {
xs: { span: 24 },
......@@ -111,8 +153,9 @@ class GoodsAddModal extends React.Component {
<Modal
visible={visible}
title={isEdit == 1 ? '编辑商品' : '新增商品'}
okText="确定"
okText={!submitting ? '保存' : '保存中...'}
onCancel={this.close}
confirmLoading={submitting}
onOk={this.save}
className="modifyclassModal"
maskClosable={false}
......@@ -133,7 +176,7 @@ class GoodsAddModal extends React.Component {
<img className={pageStyle.avatar} src={imagify(couponImg) ? imagify(couponImg) : imagify(editCouponInfo.cover)} alt="" />
<span className={pageStyle.uploadThumb}>
<input type="file" id="uploadinput" className={pageStyle.fileuploadinput} onChange={(e) => { this.uploadAvator(e); }} accept="image/*" />
新增图片
{isEdit == 1 ? '修改图片' : '新增图片'}
</span>
<div className={pageStyle.thumbTip}><span>建议尺寸:310*270 最多上传1 </span></div>
</div>
......@@ -148,42 +191,66 @@ class GoodsAddModal extends React.Component {
sm: { span: 24 },
}}
>
{
editCouponInfo.banner.length > 0 ?
<div className={pageStyle.banner}>
<div className={pageStyle.bannerBox}>
<Carousel>
{ editCouponInfo.banner.length > 0 && (JSON.parse(editCouponInfo.banner)).map((item, index) => (
<div>
<img className={pageStyle.avatar} src={imagify(item)} alt="" />
</div>
))}
</Carousel>,
<div className={pageStyle.banner}>
<div className={pageStyle.bannerBox}>
{ editCouponInfo.banner.length > 0 &&
<div>
<img className={pageStyle.avatar} src={imagify(editCouponInfo.banner[0])} alt="" />
<div className={pageStyle.imgdelandupdate}>
<div className={pageStyle.imgupdate} onClick={() => { this.imgToUpdate(); }}>修改</div>
</div>
<span className={pageStyle.uploadThumb}>
<input type="file" id="uploadinput" className={pageStyle.fileuploadinput} onChange={(e) => { this.uploadBanner(e); }} accept="image/*" />
新增图片
</span>
<div className={pageStyle.thumbTip}><span>建议尺寸:750*310 最多上传4 </span></div>
</div> :
<div className={pageStyle.banner}>
<div className={pageStyle.bannerBox}>
<Carousel>
{ goodsBanner.map((item, index) => (
<div>
<img className={pageStyle.avatar} src={imagify(item)} alt="" />
</div>
))}
</Carousel>,
</div>
<span className={pageStyle.uploadThumb}>
<input type="file" id="uploadinput" className={pageStyle.fileuploadinput} onChange={(e) => { this.uploadBanner(e); }} accept="image/*" />
新增图片
</span>
<div className={pageStyle.thumbTip}><span>建议尺寸:750*310 最多上传4 </span></div>
</div>
}
}
</div>
{ currentIndex >= editCouponInfo.banner.length && editCouponInfo.banner.length > 0 &&
<div className={pageStyle.smallImgBox}>
<Icon className={pageStyle.smallImgBoxClose} onClick={this.imgCancelUpdate} type="close" />
{editCouponInfo.banner.map((img, i) => (
<div className={pageStyle.smallImgItem}>
<div className={pageStyle.smallImgItembox}>
<img alt="" src={imagify(img)} />
<div className={pageStyle.imgdelandupdate}>
<div className={pageStyle.imgdel} onClick={() => this.deleteGoodsImg(i)}>删除</div>
</div>
</div>
{editCouponInfo.banner.length > 1 &&
<div className={pageStyle.imgmovebox}>
{i > 0 &&
<div className={pageStyle.arowbox} onClick={() => this.moveGoodsimg(i, 'left')}>
<Icon type="arrow-left" />
</div>
}
{i == 0 &&
<div className={`${pageStyle.arowbox} ${pageStyle.arowboxgrey}`}>
<Icon type="arrow-left" />
</div>
}
{i < editCouponInfo.banner.length - 1 &&
<div className={pageStyle.arowbox} onClick={() => this.moveGoodsimg(i, 'right')}>
<Icon type="arrow-right" />
</div>
}
{i == editCouponInfo.banner.length - 1 &&
<div className={`${pageStyle.arowbox} ${pageStyle.arowboxgrey}`}>
<Icon type="arrow-right" />
</div>
}
</div>}
</div>
))}
</div>
}
{editCouponInfo.banner.length < 4 ?
<span className={pageStyle.uploadThumb}>
<input type="file" id="uploadinput" className={pageStyle.fileuploadinput} onChange={(e) => { this.uploadBanner(e); }} accept="image/*" />
新增图片
</span> :
<span className={pageStyle.uploadThumb}>
已上传4
</span>
}
<div className={pageStyle.thumbTip}><span>建议尺寸:750*310 最多上传4 </span></div>
</div>
</FormItem>
{getFieldDecorator('type', { initialValue: 1 })(<Input type="hidden" />)}
{getFieldDecorator('status', { initialValue: 1 })(<Input type="hidden" />)}
......@@ -241,8 +308,13 @@ GoodsAddModal.propTypes = {
GoodsAddModal.defaultProps = {
isEdit: false,
};
function mapStateToProps(state) {
// eslint-disable-next-line no-empty-pattern
const {
} = state.integral;
return {
};
}
const ClassMgt = Form.create()(GoodsAddModal);
export default ClassMgt;
export default connect(mapStateToProps)(ClassMgt);
.thumb {
display: flex;
position: relative;
margin-bottom: 15px;
.thumbTip {
position: absolute;
font-size:14px;
......@@ -23,10 +24,12 @@
height: 92px;
background-color: #D8D8D8;
margin-right: 30px;
position: relative;
}
.banner {
display: flex;
position: relative;
margin-bottom: 15px;
.thumbTip {
position: absolute;
font-size:14px;
......@@ -82,4 +85,395 @@
background-color: #D8D8D8;
}
}
@import '../../../less/variables.less';
@images: '@{imagesroot}/webapp/';
.SchoolInfoEditorcontainer {
}
.header {
color: #000;
font-size: 14px;
font-weight: 700;
line-height: 50px;
padding-left: 20px;
border-bottom: 1px solid rgba(0,0,0,0.05);
}
.FormBox {
padding: 14px 0 0;
}
.itemlistbox {
max-height: 400px;
overflow-y: scroll;
padding-bottom: 10px;
}
.FormItemClass {
padding-left: 30px;
margin-bottom: 8px;
display: flex;
align-items: center;
}
.FormItemInputClass {
// height: 46px;
// line-height: 46px;
}
.divideLine {
border-bottom: 1px solid rgba(0,0,0,0.05);
// padding-top: 10px;
}
.btnbox {
text-align: right;
padding: 14px 35px 12px 0;
}
.SubmitBtn {
// background-color: #ECECEC;
// width: 70px;
height: 34px;
line-height: 34px;
background-color: #FFFFFF;
color: #000000;
font-size: 14px;
border: 1px solid #ECECEC;
height: 34px;
line-height: 34px;
&:hover {
background-color: #FFFFFF;
color: #000000;
font-size: 14px;
border: 1px solid #ECECEC;
}
&:active {
background-color: #FFFFFF;
color: #000000;
font-size: 14px;
border: 1px solid #ECECEC;
}
&:focus {
background-color: #FFFFFF;
color: #000000;
font-size: 14px;
border: 1px solid #ECECEC;
}
}
.operatebox {
padding: 35px 0 20px 30px;
}
.fileuploadbox {
width: 104px;
height: 104px;
position: relative;
background-color: #dedede;
border-radius: 7px;
cursor: pointer;
}
.fileuploadinput{
// height: 32px;
width: 100%;
height: 100%;
opacity: 0;
z-index: 3;
position: absolute;
cursor: pointer;
}
.fileuploadlayer{
width: 100%;
height: 100%;
z-index: 2;
position: absolute;
line-height: 1;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
text-align: center;
color: #19B5FE;
font-size: 14px;
cursor: pointer;
}
.uploadcount {
color: #A5A5A5;
font-size: 14px;
line-height: 1;
margin-top: 17px;
}
.selfradiabox {
display: flex;
align-items: center;
justify-content: space-around;
}
.selfradiaitem {
display: flex;
align-items: center;
}
.selfradia {
width: 20px;
height: 20px;
border-radius: 50%;
border: 2px solid #9A9A9A;
}
.selfradiaitemactive {
.selfradia {
border: 6px solid #19B5FE;
}
}
.radianame {
color: #000;
font-size: 14px;
padding-left: 9px;
}
.operateitembox {
display: flex;
}
.imgbox {
width: 104px;
height: 104px;
border-radius: 10px;
margin-right: 12px;
position: relative;
background-color: #dedede;
overflow: hidden;
cursor: pointer;
}
.img {
width: 104px;
height: 104px;
display: block;
}
.imgoperatebox {
height: 104px;
width: 41px;
border-radius: 10px;
background-color: #fff;
margin-right: 24px;
display: flex;
flex-direction: column;
overflow: hidden;
}
.blockOperateItem {
flex: 1;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
&:hover {
background-color: #19B5FE;
.blockOperateItemIcon {
color: #fff;
}
}
}
.imgbox:hover {
.imgdelandupdate {
bottom: 0;
}
}
.imgdelandupdate {
position: absolute;
bottom: 0;
left: 0;
height: 30px;
background-color: rgba(0,0,0,0.5);
width: 100%;
color: #fff;
padding: 8px 0;
display: flex;
align-items: center;
line-height: 1;
font-size: 14px;
cursor: pointer;
transition: bottom 0.2s;
}
.imgdel {
//border-right: 1px solid #fff;
flex: 1;
text-align: center;
}
.imgupdate {
flex: 1;
text-align: center;
}
.Addbox {
height: 120px;
width: 509px;
margin: 10px auto 14px;
background-color: #fff;
border-radius: 7px;
color: #19B5FE;
font-size: 14px;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
position: relative;
border:1px solid rgba(236,236,236,1);
&:hover {
.AddFloatbox {
display: block;
}
}
}
.AddFloatbox {
border-radius: 4px;
width: 152px;
height: 88px;
background-color: #fff;
box-shadow:0px 2px 10px 0px rgba(0, 0, 0, 0.14);
position: absolute;
left: 50%;
top: 64%;
display: none;
}
.AddItem {
line-height: 44px;
text-align: center;
font-size: 14px;
// padding-left: 20px;
color: #000000;
&:hover {
color: #19B5FE;
}
}
.AddVideoItem {
border-bottom: 1px solid rgba(0,0,0,0.05);
}
.mediaeditbox {
width: 509px;
margin: 0 auto 14px;
position: relative;
}
.mediadit {
background-color: #fff;
border-radius: 7px;
height: 120px;
padding: 8px 0 8px 8px;
display: flex;
align-items: flex-start;
position: relative;
&:hover {
.delicon {
display: block;
}
}
}
.mediaditboxtitle {
color: #9A9A9A;
font-weight: 700;
line-height: 1;
margin-bottom: 12px;
font-size: 14px;
}
.titlebox {
display: flex;
// align-items: center;
span {
font-size: 14px;
color: #000;
padding-right: 10px;
padding-left: 16px;
line-height: 39px;
}
}
.titleinput {
width: 270px;
}
.uploadinput {
cursor: pointer;
}
.continueAdImg {
color: #19B5FE;
font-size: 14px;
position: absolute;
left: 125px;
bottom: 8px;
line-height: 1;
cursor: pointer;
}
:global {
.ant-form-item {
margin-bottom: 0;
.ant-form-item-children {
padding-left: 0;
}
}
}
.smallImgBox {
position: absolute;
z-index: 4;
padding: 19px 19px 10px 19px;
background-color: #fff;
display: inline-block;
width: auto;
max-width: 600px;
overflow-x: auto;
border-radius: 10px;
box-shadow:0px 2px 10px 0px rgba(0, 0, 0, 0.14);
// height: 160px;
left: 65px;
top: 165px;
// display: none;
}
.smallImgItem {
width: 104px;
margin-right: 16px;
display: inline-block;
cursor: pointer;
}
.smallImgItembox {
width: 104px;
height: 104px;
position: relative;
overflow: hidden;
border-radius: 4px;
img {
width: 104px;
height: 104px;
display: block;
}
}
.imgmovebox {
display: flex;
align-items: center;
justify-content: center;
}
.arowbox {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
cursor: pointer;
height: 30px;
&:hover {
background-color: #19B5FE;
color: #fff;
}
&.arowboxgrey {
color: #E5E5E5;
&:hover {
background-color: #fff;
}
}
}
.smallImgItembox:hover {
.imgdelandupdate {
bottom: 0;
}
}
.smallImgBoxClose {
position: absolute;
right: 5px;
top: 5px;
font-size: 20px;
cursor: pointer;
}
.delicon {
background-image: url('@{imagesroot}delicon.png');
background-size: 100% 100%;
width: 27px;
height: 27px;
position: absolute;
top: -13px;
right: -13px;
display: none;
}
......@@ -233,6 +233,7 @@ class StoreMgt extends React.Component {
editCouponInfo,
editGoodsModalShow,
goodsBanner,
goodSaveSubmiting,
} = this.props;
const {
previewVisible, previewImage, isEdit, type,
......@@ -242,6 +243,13 @@ class StoreMgt extends React.Component {
title: '商品名称',
dataIndex: 'title',
},
{
title: '类型',
dataIndex: 'type',
render: (text) => {
return (<div>{text == 1 && '商品'}{text == 2 && '卡券'}</div>);
},
},
{
title: '图片展示',
dataIndex: 'cover',
......@@ -314,17 +322,16 @@ class StoreMgt extends React.Component {
<CouponAddModal
visible={editCouponModalShow}
isEdit={isEdit}
studentSubmiting={studentSubmiting}
close={this.closeCouponModal}
save={this.save}
uploadAvator={this.uploadAvator}
couponImg={couponImg}
editCouponInfo={editCouponInfo}
submitting={goodSaveSubmiting}
/>
<GoodsAddModal
visible={editGoodsModalShow}
isEdit={isEdit}
studentSubmiting={studentSubmiting}
close={this.closeGoodsModal}
save={this.save}
uploadAvator={this.uploadAvator}
......@@ -332,6 +339,7 @@ class StoreMgt extends React.Component {
couponImg={couponImg}
goodsBanner={goodsBanner}
editCouponInfo={editCouponInfo}
submitting={goodSaveSubmiting}
/>
{cropperboxShow && <Cropper
avatorUploader={this.state.avatorUploader}
......@@ -362,6 +370,7 @@ function mapStateToProps(state) {
couponImg,
editGoodsModalShow,
goodsBanner,
goodSaveSubmiting,
} = state.integral;
return {
goodsList,
......@@ -374,6 +383,7 @@ function mapStateToProps(state) {
editCouponInfo,
editGoodsModalShow,
goodsBanner,
goodSaveSubmiting,
};
}
export default connect(mapStateToProps)(StoreMgt);
......
......@@ -75,7 +75,7 @@ class LoginForm extends React.Component {
dispatch({
type: 'register/getverifycode',
payload: {
type: 4,
type: 5,
mobile,
dispatch,
},
......
......@@ -158,11 +158,14 @@ class StudentMgt extends React.Component {
dispatch({
type: 'students/studentModelCoursesBuyOrRenew',
payload: {
values,
values: {
...values,
buy: values.buy || 0,
give: values.give || 0,
},
callBack,
},
});
// form.resetFields();
}
// ShowModeType = (value) => {
// if (value == 3) {
......
import React from 'react';
import { connect } from 'dva';
import { Row, Col, Modal, Form, Input, Button, message } from 'antd';
import pageStyles from './BindWx.less';
import Cropper from '../../components/Cropper';
import { pageIn, imagify } from '../../utils/index';
const { Search } = Input;
const FormItem = Form.Item;
class UpdateNicknameForm extends React.Component {
constructor(props) {
super(props);
this.state = {
};
}
componentDidMount() {
}
componentWillUnmount() {
const { dispatch } = this.props;
}
sureBindWx = () => {
const { form, updateNickname } = this.props;
form.validateFields((err, values) => {
if (!err) {
updateNickname(values, () => {
form.resetFields();
});
}
});
}
onCancel = () => {
const { form, onCancel } = this.props;
form.resetFields();
onCancel(false);
}
render() {
const {
nickname,
nicknameChangeShow,
nicknameSubmitting,
} = this.props;
const { getFieldDecorator } = this.props.form;
return (
<div>
<Modal
visible={nicknameChangeShow}
title="修改昵称"
okText={nicknameSubmitting ? '提交中...' : '提交'}
cancelText="关闭"
zIndex={110}
onOk={this.sureBindWx}
onCancel={this.onCancel}
maskClosable={false}
confirmLoading={nicknameSubmitting}
width="540px"
>
<Form className="modalform" labelAlign="left">
<Form.Item
label="昵称"
labelCol={{ span: 3 }}
wrapperCol={{ span: 21 }}
>
<Row gutter={8}>
<Col span={15}>
{getFieldDecorator('nickname', {
initialValue: nickname,
rules: [
{ required: true, message: '请输入昵称' },
],
})(<Input type="text" maxLength={20} placeholder="请输入昵称" />)}
</Col>
</Row>
</Form.Item>
</Form>
</Modal>
</div>
);
}
}
UpdateNicknameForm.propTypes = {
};
const UpdateNickname = Form.create()(UpdateNicknameForm);
export default UpdateNickname;
......@@ -3,6 +3,7 @@ import { connect } from 'dva';
import { Row, Col, Modal, Form, Input, Button, message } from 'antd';
import pageStyles from './index.less';
import BindWx from './BindWx';
import UpdateNickname from './UpdateNickname';
import Cropper from '../../components/Cropper';
import QrcodeShow from '../../components/qrcodeShow';
import { pageIn, imagify } from '../../utils/index';
......@@ -201,6 +202,25 @@ class UserSettingForm extends React.Component {
},
});
}
updateNickname = (value, callBack) => {
const { dispatch } = this.props;
dispatch({
type: 'usersetting/updateNickname',
payload: {
nickname: value.nickname,
callBack,
},
});
}
toupdateNickanem = (visible) => {
const { dispatch } = this.props;
dispatch({
type: 'usersetting/updateState',
payload: {
nicknameChangeShow: visible,
},
});
}
render() {
const {
cropperboxShow,
......@@ -218,6 +238,8 @@ class UserSettingForm extends React.Component {
previewQrcode,
businessIsBind,
checkoutVerifyCode,
nicknameChangeShow,
nicknameSubmitting,
} = this.props;
const { getFieldDecorator } = this.props.form;
return (
......@@ -243,11 +265,15 @@ class UserSettingForm extends React.Component {
</div>
</div>
<div className={pageStyles.infoline}>
<div className={pageStyles.infodetail}>&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;{userInfo.mobile}</div>
<div className={pageStyles.infodetail}>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;称:&nbsp;&nbsp;{userInfo.nickname}</div>
<div className={pageStyles.infooperate} onClick={() => this.toupdateNickanem(true)}>修改昵称</div>
</div>
<div className={pageStyles.infoline}>
<div className={pageStyles.infodetail}>&nbsp;&nbsp;&nbsp;&nbsp;号:&nbsp;&nbsp;{userInfo.mobile}</div>
<div className={pageStyles.infooperate} onClick={() => this.toResetPsd(true)}>修改密码</div>
</div>
<div className={pageStyles.infoline}>
<div className={pageStyles.infodetail}>绑定微信:&nbsp;&nbsp;{businessIsBind ? '已绑定' : '未绑定'}</div>
<div className={pageStyles.infodetail}>绑定微信&nbsp;&nbsp;{businessIsBind ? '已绑定' : '未绑定'}</div>
{!businessIsBind && <div className={pageStyles.infooperate} onClick={() => this.BindWxDiaVisible(true)}>立即绑定</div>}
{businessIsBind && <div className={pageStyles.infooperate} style={{ opacity: 0 }}>立即绑定</div>}
</div>
......@@ -378,6 +404,13 @@ class UserSettingForm extends React.Component {
bindWxPost={this.bindWxPost}
checkoutVerifyCode={checkoutVerifyCode}
/>
<UpdateNickname
nickname={userInfo.nickname}
updateNickname={this.updateNickname}
nicknameChangeShow={nicknameChangeShow}
onCancel={() => this.toupdateNickanem(false)}
nicknameSubmitting={nicknameSubmitting}
/>
</Row>
);
}
......@@ -411,6 +444,8 @@ function mapStateToProps(state) {
previewQrcode,
businessIsBind,
checkoutVerifyCode,
nicknameChangeShow,
nicknameSubmitting,
} = state.usersetting;
return {
cropperboxShow,
......@@ -430,6 +465,8 @@ function mapStateToProps(state) {
previewQrcode,
businessIsBind,
checkoutVerifyCode,
nicknameChangeShow,
nicknameSubmitting,
};
}
export default connect(mapStateToProps)(UserSetting);
......@@ -10,6 +10,15 @@ export function login(params) {
data,
});
}
export function verifyCodeLogin(params) {
const data = qs.stringify(params);
return request({
url: `${api.verifyCodeLogin}`,
method: 'POST',
needAuth: false,
data,
});
}
export function newLogin(params) {
const data = qs.stringify(params);
return request({
......
......@@ -27,7 +27,7 @@ function exportExcel(headers, data, fileName = 'XXX.xlsx', type) {
teacher: item.school_teachers ? item.school_teachers.map(ele => ele.nickname).join(',') : '',
capacity: `${item.class_student_count || 0}/${item.capacity || 0}`,
expended: `${item.graduation_status == 1 ? (item.total || '') : '-'}`,
total: `${item.already_attend_expended || 0}/${item.total || 0}`,
total: `${item.expended || 0}/${item.already_attend_expended || 0}`,
};
});
break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment