React后台管理系统-添加商品组件
引入了CategorySelector 二级联动组件、FileUploader图片上传组件和RichEditor富文本编辑组件
- import React from 'react';
- import MUtil from 'util/mm.jsx'
- import Product from 'service/product-service.jsx'
- import PageTitle from 'component/page-title/index.jsx';
- import CategorySelector from './category-selector.jsx';
- import FileUploader from 'util/file-uploader/index.jsx'
- import RichEditor from 'util/rich-editor/index.jsx'
- import './save.scss';
- const _mm = new MUtil();
- const _product = new Product();
- class ProductSave extends React.Component{
- constructor(props){
- super(props);
- this.state = {
- name : '',
- subtitle : '',
- categoryId : 0,
- parentCategoryId : 0,
- subImages : [],
- detail : '',
- price : '',
- stock : '',
- detail : '',
- status : 1 //商品状态1为在售
- }
- }
- componentDidMount(){
- this.loadProduct();
- }
- // 加载商品详情
- loadProduct(){
- // 有id的时候,表示是编辑功能,需要表单回填
- if(this.state.id){
- _product.getProduct(this.state.id).then((res) => {
- let images = res.subImages.split(',');
- res.subImages = images.map((imgUri) => {
- return {
- uri: imgUri,
- url: res.imageHost + imgUri
- }
- });
- res.defaultDetail = res.detail;
- this.setState(res);
- }, (errMsg) => {
- _mm.errorTips(errMsg);
- });
- }
- }
- getSubImagesString(){
- return this.state.subImages.map((image) => image.uri).join(',');
- }
- //提交
- onSubmit(e){
- let product = {
- name : this.state.name,
- subtitle : this.state.subtitle,
- categoryId : parseInt(this.state.categoryId),
- subImages : this.getSubImagesString(),
- detail : this.state.detail,
- price : parseFloat(this.state.price),
- stock : parseInt(this.state.stock),
- status : this.state.status
- }
- let productCheckResult = _product.checkProduct(product);
- // 表单验证成功
- if(productCheckResult.status){
- _product.saveProduct(product).then((res) => {
- _mm.successTips(res);
- this.props.history.push('/product/index');
- }, (errMsg) => {
- _mm.errorTips(errMsg);
- });
- }
- }
- //简单字段的改变,比如商品名称描述价格库存onValueChange
- onValueChange(e){
- let name = e.target.name,
- value = e.target.value.trim();
- this.setState({
- [name] : value
- });
- }
- //品类改变事件
- onCategoryChange(categoryId,parentCategoryId){
- this.setState({
- categoryId : categoryId,
- parentCategoryId : parentCategoryId
- });
- }
- //上传图片成功
- onUploadSuccess(res){
- let subImages = this.state.subImages;
- subImages.push(res);
- this.setState({
- subImages : subImages
- });
- }
- //上传图片失败
- onUploadError(res){
- _mm.errorTips(errMsg);
- }
- // 删除图片
- onImageDelete(e){
- let index = parseInt(e.target.getAttribute('index')),
- subImages = this.state.subImages;
- subImages.splice(index, 1);
- this.setState({
- subImages : subImages
- });
- }
- //富文本编辑器
- onDetailValueChange(value){
- this.setState({
- detail : value
- })
- }
- render(){
- return (
- <div id="page-wrapper">
- <PageTitle title={this.state.id ? '编辑商品' : '添加商品'} />
- <div className="form-horizontal">
- <div className="form-group">
- <label className="col-md-2 control-label">商品名称</label>
- <div className="col-md-5">
- <input type="text" className="form-control"
- placeholder="请输入商品名称"
- name="name"
- value={this.state.name}
- onChange={(e) => this.onValueChange(e)}/>
- </div>
- </div>
- <div className="form-group">
- <label className="col-md-2 control-label">商品描述</label>
- <div className="col-md-5">
- <input type="text" className="form-control"
- placeholder="请输入商品描述"
- name="subtitle"
- value={this.state.subtitle}
- onChange={(e) => this.onValueChange(e)}/>
- </div>
- </div>
- <div className="form-group">
- <label className="col-md-2 control-label">所属分类</label>
- <CategorySelector
- categoryId={this.state.categoryId}
- parentCategoryId={this.state.parentCategoryId}
- onCategoryChange={ (categoryId,parentCategoryId) => this.onCategoryChange(categoryId,parentCategoryId)} />
- </div>
- <div className="form-group">
- <label className="col-md-2 control-label">商品价格</label>
- <div className="col-md-3">
- <div className="input-group">
- <input type="number" className="form-control"
- placeholder="价格"
- name="price"
- value={this.state.price}
- onChange={(e) => this.onValueChange(e)}/>
- <span className="input-group-addon">元</span>
- </div>
- </div>
- </div>
- <div className="form-group">
- <label className="col-md-2 control-label">商品库存</label>
- <div className="col-md-3">
- <div className="input-group">
- <input type="number" className="form-control"
- placeholder="库存"
- name="stock"
- value={this.state.stock}
- onChange={(e) => this.onValueChange(e)}/>
- <span className="input-group-addon">件</span>
- </div>
- </div>
- </div>
- <div className="form-group">
- <label className="col-md-2 control-label">商品图片</label>
- <div className="col-md-10">
- {
- this.state.subImages.length ? this.state.subImages.map(
- (image, index) => (
- <div className="img-con" key={index}>
- <img className="img" src={image.url} />
- <i className="fa fa-close" index={index} onClick={(e) => this.onImageDelete(e)}></i>
- </div>)
- ) : (<div>请上传图片</div>)
- }
- </div>
- <div className="col-md-offset-2 col-md-10 file-upload-con">
- <FileUploader onSuccess={(res) => this.onUploadSuccess(res)}
- onError={(errMsg) => this.onUploadError(errMsg)}/>
- </div>
- </div>
- <div className="form-group">
- <label className="col-md-2 control-label">商品详情</label>
- <div className="col-md-10">
- <RichEditor onValueChange={(value) => {this.onDetailValueChange(value)}}/>
- </div>
- </div>
- <div className="form-group">
- <div className="col-md-offset-2 col-md-10">
- <button type="submit" className="btn btn-primary"
- onClick={(e) => {this.onSubmit(e)}}>提交</button>
- </div>
- </div>
- </div>
- </div>
- )
- }
- }
- export default ProductSave;
React后台管理系统-添加商品组件的更多相关文章
- React后台管理系统- rc-pagination分页组件封装
1.用户列表页面使用的rc-pagination分页组件 Github地址: https://github.com/react-component/pagination 2.安装 cnpm insta ...
- React后台管理系统-首页Home组件
1.Home组件要显示用户总数.商品总数和订单总数,数据请求后端的 /manage/statistic/base_count.do接口,返回的是 this.state = { u ...
- React后台管理系统-商品管理列表组件
1.商品列表页面结构 <div id="page-wrapper"> <PageTitle title="商品列表" ...
- 《React后台管理系统实战 :一》:目录结构、引入antd、引入路由、写login页面、使用antd的form登录组件、form前台验证、高阶函数/组件
实战 上接,笔记:https://blog.csdn.net/u010132177/article/details/104150177 https://gitee.com/pasaulis/react ...
- 《React后台管理系统实战 :四》产品分类管理页:添加产品分类、修改(更新)产品分类
一.静态页面 目录结构 F:\Test\react-demo\admin-client\src\pages\admin\category add-cate-form.jsx index.jsx ind ...
- 【共享单车】—— React后台管理系统开发手记:主页面架构设计
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...
- react后台管理系统路由方案及react-router原理解析
最近做了一个后台管理系统主体框架是基于React进行开发的,因此系统的路由管理,选用了react-router(4.3.1)插件进行路由页面的管理配置. 实现原理剖析 1.hash的方式 ...
- React后台管理系统-商品列表搜索框listSearch组件
1.商品列表搜索框 2.搜索框页面的结构为 <div className="row search-wrap"> <div classN ...
- 《React后台管理系统实战 :二》antd左导航:cmd批量创建子/目录、用antd进行页面布局、分离左导航为单独组件、子路由、动态写左导航、css样式相对陷阱
一.admin页面布局及路由创建 0)cmd批量创建目录及子目录 //创建各个目录,及charts和子目录bar md home category product role user charts\b ...
随机推荐
- Android中的时间格式的校验
public class MainActivity extends Activity implements OnClickListener{ private Button btn1; private ...
- hdu 2222 ac自动机更新模板 for onSite contest
http://acm.split.hdu.edu.cn/showproblem.php?pid=2222 #include <cstdio> #include <cstdlib> ...
- Apache Beam的特点
不多说,直接上干货! Apache Beam 有两大特点: 1.统一了数据批处理(batch)和流处理(stream)编程范式: 2.能在任何执行引擎上运行. 它不仅为模型设计.更为执行一系列数据导向 ...
- Spring核心-IOC-AOP-模版
1. POM- 1.1 中央仓库 1.2 各包作用 spring-core.jar 核心工具类 spring-beans.jar 是所有应用都要用到的,它包含访问配置文件.创建和管理bean 以及进行 ...
- Machine learning preface
Machine learning Preface Definition T: Task E: Experience P: Performance Sequence: T -> E -> P ...
- mysql 使用 unix 方式显示日期和时间
1.UNIX中文为时间戳.该方式显示从1970年1月1日开始经过的秒数. 2.函数 UNIX_TIMESTAMP() 返回时间戳格式的时间, FROM_UNIXTIME() 将时间戳格式的时间转换为普 ...
- 【转载】了解CSS/CSS3原生变量var
文章转载自:鑫空间鑫生活(https://www.zhangxinxu.com/) 原文链接:http://www.zhangxinxu.com/wordpress/?p=5804 内容摘要: 在任何 ...
- FTPUtil 多文件上传参考代码
import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java ...
- Struts2_HelloWorld_5
1.设置开发模式: 更换配置文件中的 action name="hello_struts",重新访问会出错,因为配置没有立刻响应文件的即时修改. 需要加上配置 <consta ...
- selenium鼠标拖动
var builder = new Actions(_driver); builder.MoveToElement(_driver.GetElementByCssSelector("#com ...