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 ...
随机推荐
- Oracle 配置监听和本地网络服务
一.配置监听 在oracle的配置和移植工具中打开Net Configuration Assistant,然后点击下一步. 点击下一步,然后输入监听的名称点击下一步 点击下一步后如图 点击下一步如图 ...
- C. Permute Digits dfs大模拟
http://codeforces.com/contest/915/problem/C 这题麻烦在前导0可以直接删除,比如 1001 100 应该输出11就好 我的做法是用dfs,每一位每一位的比较. ...
- python3+Appium自动化13-H5元素定位实践案例
测试场景 启动钉钉app进入工作H5页面,点击考勤签到 查看webview上元素 1.电脑上打开chrome浏览器输入:chrome://inspect/#devices 2.Discover USB ...
- Murano为镜像包添加Root用户密码
1. 安装dib-utils Dib Utils 是 diskimage-builder 工程的一部分,但是他们也用于 diskimage-builder 工程外部. 因为基于云的磁盘空间已经溢出,推 ...
- aop动态代理 事务 threadlocal
第一:package com.itheima.utils; import java.sql.Connection; import java.sql.SQLException; /** * 处理事务 的 ...
- Day5下
T1 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> ...
- plupload2.1.2文件合并
1.前端 (1)依赖文件: <link type="text/css" rel="stylesheet" href="~/Content/plu ...
- code first关系表达
1.一对多关系 [Table("classInfo")] public class ClassInfo { public int Id { get; set; } public s ...
- windows常用命令行总结
cmd下的命令行 1.查看当前目录下的子目录 dir 或 dir /b 类似Linux 下的 ls 或者 ls -l 2.盘符切换 d: 3.进入目录 cd [目录名] 退一个目录 cd .. ...
- springboot微信支付,支付二维码生成
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1 微信扫码支付开发者文档,里面会有支付流程的教程 接口链接 URL地址:htt ...