Browse Source

详情页添加购买,仍需修改

Csy817 6 years ago
parent
commit
d77bfa70bd

+ 13 - 3
src/app.css

@@ -67,14 +67,19 @@ a {
     bottom: 0;
 }
 
-.selected_button {
+.selected_button-red {
     width: 30px;
     height: 30px;
-    /*background-color: #fff;*/
     color: white;
     background-color: #f44;
     border: none;
-    /*border: 1px solid #ebedf0;*/
+}
+
+.selected_button-white {
+    width: 30px;
+    height: 30px;
+    background-color: #fff;
+    border: 1px solid #ebedf0;
 }
 
 .selected_button:active {
@@ -94,4 +99,9 @@ a {
     color: black;
     font-size: 14px;
     text-align: center;
+}
+
+.ant-message-notice-content {
+    background: rgba(0,0,0,.7);
+    color: white;
 }

+ 34 - 17
src/pages/cart/all/detail/index.js

@@ -1,5 +1,6 @@
 import React, {Component} from 'react'
 import {withRouter} from 'react-router-dom'
+import {message} from 'antd'
 import {Checkbox, WhiteSpace} from 'antd-mobile'
 import classNames from 'classnames' 
 
@@ -24,7 +25,7 @@ class CartDetail extends Component {
         let cartListLength = cartList ? cartList.length : 0
 
         this.setState({
-            cartList: cartList || this.props.cartList
+            cartList: this.props.cartList || cartList
         },()=>{
             if(cartListLength){
                 this.sumPrice(false)
@@ -169,21 +170,25 @@ class CartDetail extends Component {
     sumPrice=(update)=>{
         if(update) localStorage.setItem("cartList",JSON.stringify(this.state.cartList))
 
-        let totalPrice=0,selectedCount=0,checkedCount=0
+        let totalPrice=0, selectedCount=0, checkedCount=0, cartCount=0
         let cartListLength = this.state.cartList.length
+        let isSelectAll = false
         this.state.cartList.forEach((item,index)=>{
+            cartCount+=item.count
             if(item.checked===true){
                 totalPrice+=item.count*item.product_id.price
                 selectedCount+=item.count
                 checkedCount++
             }
-        })
-        // console.log('isSelectAll',cartListLength,checkedCount)
-        let isSelectAll = cartListLength === checkedCount ? true : false
-        this.setState({
-            totalPrice,
-            selectedCount,
-            isSelectAll
+            if(index === cartListLength - 1){
+                localStorage.setItem("cartCount",JSON.stringify(cartCount))
+                isSelectAll = cartListLength === checkedCount
+                this.setState({
+                    totalPrice,
+                    selectedCount,
+                    isSelectAll
+                })
+            }
         })
     } 
 
@@ -196,13 +201,15 @@ class CartDetail extends Component {
             }
         }) 
         // console.log('cartList',this.state.cartList)
-        // console.log('shopping',shopping)
-        sessionStorage.setItem("shopping",JSON.stringify(shopping))
+        console.log('shopping',shopping)
+        sessionStorage.setItem("cartSelected",JSON.stringify(shopping))
         sessionStorage.setItem("totalPrice",JSON.stringify(this.state.totalPrice))
         sessionStorage.setItem("totalCount",JSON.stringify(this.state.selectedCount))
         this.props.history.push({
             pathname: '/cart/orders',
-            state:{}
+            state:{
+                dataType: 'cartSelected'
+            }
         })
     } 
 
@@ -235,14 +242,24 @@ class CartDetail extends Component {
                                             <div className="selected">
                                                 <button
                                                     className={classNames({
-                                                        'selected_button': true,
+                                                        'selected_button-white': true,
                                                         'selected_button-disabled': item.count <= 1
                                                     })}
-                                                    disabled={item.count <= 1}
-                                                    onClick={(e)=>{this.reduce(e,index)}}
+                                                    // disabled={item.count <= 1}
+                                                    onClick={(e)=>{
+                                                        if(item.count > 1){
+                                                            this.reduce(e,index)
+                                                        }else {
+                                                            message.warning('数量不能小于1个')
+                                                        }
+                                                    }}
                                                 >-</button>
-                                                <input className="selected_input" type="text" value={item.count} onChange={(e)=>{this.getInputValue(e,index)}}/>
-                                                <button className="selected_button" onClick={(e)=>{this.augment(e,index)}}>+</button>
+                                                <input className="selected_input" type="text"
+                                                       min={1} step={1} max={item.specificationStock_id.stock}
+                                                       value={item.count}
+                                                       onChange={(e)=>{this.getInputValue(e,index)}}
+                                                />
+                                                <button className="selected_button-white" onClick={(e)=>{this.augment(e,index)}}>+</button>
                                             </div>
                                         </div>
                                     </div>

+ 35 - 11
src/pages/cart/all/edit/index.js

@@ -1,4 +1,5 @@
 import React, {Component} from 'react'
+import {message} from 'antd'
 import {Checkbox, WhiteSpace, Modal, Toast} from 'antd-mobile'
 import classNames from 'classnames'
 import {Mutation} from "react-apollo"
@@ -7,6 +8,11 @@ import gql from "graphql-tag"
 import '../index.css'
 import {delete_userCart_by_id} from "../../../../utils/gql"
 const alert = Modal.alert
+message.config({
+    top: '45%',
+    duration: 2,
+    maxCount: 2,
+})
 
 class CartEdit extends Component {
     constructor(props) {
@@ -74,9 +80,9 @@ class CartEdit extends Component {
 
     // 删除
     delete=(delete_userCart_by_id)=>{
-        let {cartList} = this.state
+        let {cartList, selectedCount} = this.state
 
-        alert('', `确定要删除这${this.state.selectedCount}种商品吗?`, [
+        alert('', `确定要删除这${selectedCount}种商品吗?`, [
             { text: '取消', onPress: () => console.log('cancel') },
             {
                 text: '确定',
@@ -92,6 +98,8 @@ class CartEdit extends Component {
                         let num = data.data.delete_userCart.replace(/[^0-9]/ig,"")
                         if(num){
                             Toast.info('删除成功', 1)
+                            let cartCount = localStorage.getItem("cartCount")*1 - num
+                            localStorage.setItem("cartCount",cartCount)
 
                             this.setState({
                                 cartList:cartList1,
@@ -185,7 +193,7 @@ class CartEdit extends Component {
     }
 
     render() {
-        let {cartList} = this.state
+        let {cartList, isSelectAll, selectedCount} = this.state
         let listLength = cartList.length
 
         return (
@@ -197,7 +205,7 @@ class CartEdit extends Component {
                     <div className="cart-content-wrap">
                         <div className='cart-content'>
                             {
-                                this.state.cartList.map((item,index)=>{
+                                cartList.map((item,index)=>{
                                     return(
                                         <div key={item.id+'edit'}>
                                             <div className="cart-list">
@@ -220,14 +228,20 @@ class CartEdit extends Component {
                                                     <div className="selected">
                                                         <button
                                                             className={classNames({
-                                                                'selected_button': true,
+                                                                'selected_button-white': true,
                                                                 'selected_button-disabled': item.count <= 1
                                                             })}
-                                                            disabled={item.count <= 1}
-                                                            onClick={(e)=>{this.reduce(e,index)}}
+                                                            // disabled={item.count <= 1}
+                                                            onClick={(e)=>{
+                                                                if(item.count > 1){
+                                                                    this.reduce(e,index)
+                                                                }else {
+                                                                    message.warning('数量不能小于1个')
+                                                                }
+                                                            }}
                                                         >-</button>
                                                         <input className="selected_input" type="text" value={item.count} onChange={(e)=>{this.getInputValue(e,index)}}/>
-                                                        <button className="selected_button" onClick={(e)=>{this.augment(e,index)}}>+</button>
+                                                        <button className="selected_button-white" onClick={(e)=>{this.augment(e,index)}}>+</button>
                                                     </div>
                                                 </div>
                                             </div>
@@ -243,7 +257,7 @@ class CartEdit extends Component {
                                     <div className="jiesuan">
                                         <div className="jiesuan-checkbox">
                                             <Checkbox
-                                                checked={this.state.isSelectAll}
+                                                checked={isSelectAll}
                                                 onChange={(e)=>{this.checkedAll(e,'')}}
                                                 style={{marginLeft:15}}
                                             />
@@ -251,8 +265,18 @@ class CartEdit extends Component {
                                         </div>
                                         <div className="jiesuan-total">
                                         </div>
-                                        <button className="jiesuan-button" onClick={()=>{this.delete(delete_userCart_by_id)}}>
-                                            <span>删除({this.state.selectedCount})</span>
+                                        <button
+                                            className={classNames({
+                                                'jiesuan-button': true,
+                                                'jiesuan-disabled': !selectedCount
+                                            })}
+                                            onClick={()=>{
+                                                if(selectedCount){
+                                                    this.delete(delete_userCart_by_id)
+                                                }
+                                            }}
+                                        >
+                                            <span>删除({selectedCount})</span>
                                         </button>
                                     </div>
                                 </div>:''

+ 0 - 2
src/pages/cart/all/index.js

@@ -56,8 +56,6 @@ class All extends Component {
 
     renderPage = (data, refetch) => {
         let {page,updateData} = this.state
-        let cartListLength = data.cartList.length
-        localStorage.setItem("cartCount",cartListLength)
 
         switch (page) {
             case 'detail':

+ 18 - 13
src/pages/cart/orders/index.js

@@ -43,7 +43,8 @@ class CartOrders extends Component {
 
     componentWillMount() {
         // console.log('CartOrders componentWillMount',this.props)
-        let cartList = JSON.parse(sessionStorage.getItem("shopping"))
+        let type = this.props.history.location.state.dataType
+        let cartList = JSON.parse(sessionStorage.getItem(type))
         if (cartList.length > 3) {
             let cartList1 = cartList.slice(0, 3)
             let unfoldList = cartList.slice(3)
@@ -90,10 +91,6 @@ class CartOrders extends Component {
         let tag = telephone ? telephone.replace(/[^0-9]/ig, "").slice(-4) : Math.random().toString(10).substr(2,4)
         const orderId = createdAt.replace(/[^0-9]/ig, "").substr(2) + tag
 
-        let shopping = JSON.parse(sessionStorage.getItem("shopping"))
-        let shoppingLength = shopping.length
-        let deleteIdList = shopping.map(item => item.id)
-
         const orderContent = {
              remark,
              deliveryTime: "",
@@ -110,24 +107,30 @@ class CartOrders extends Component {
              user_id,
              productTotalPay: totalPrice,
              orderPay_id: "",
-             deleteId:deleteIdList
+             deleteId:[]
         }
 
+        let type = this.props.history.location.state.dataType
+        let shopping = JSON.parse(sessionStorage.getItem(type))
+        if(type === 'cartSelected') orderContent.deleteId = shopping.map(item => item.id)
+
+        // console.log('createOrder orderContent',orderContent)
+
         let createOrder = create_order({variables:orderContent})
 
         let createOrderProduct = shopping.map((item,index) => {
             let createdAt = moment().format('YYYY-MM-DD HH:mm:ss')
             let orderProductId =  createdAt.replace(/[^0-9]/ig, "").substr(2) + tag +index
-            let {count, id:productId, product_id:productData, specificationStock_id:specData} = item
-            let {img, name, price, unit} = productData
+            let {count, product_id:productData, specificationStock_id:specData} = item
+            let {id:product_id, img, name, price, unit} = productData
             let {id:specId, color, size} = specData
-            console.log('product',index,item,productId)
+            // console.log('product',index,item,product_id)
 
             const orderProduct = {
                 updatedAt: "",
                 productColor: color,
                 unit,
-                product_id:productId,
+                product_id,
                 specificationStock_id:specId,
                 productSize:size,
                 orderPay: price,
@@ -152,9 +155,11 @@ class CartOrders extends Component {
 
         Promise.all([createOrder, createOrderProduct]).then((data)=> {
             console.log('onSubmitOrderAndProduct data',data);
-            let cartCount = localStorage.getItem("cartCount") - shoppingLength
-            localStorage.setItem("cartCount",cartCount)
-            localStorage.removeItem("cartList")
+            if(type === 'cartSelected'){
+                let cartCount = JSON.parse(localStorage.getItem("cartCount"))*1 - totalCount
+                localStorage.setItem("cartCount",cartCount)
+                localStorage.removeItem("cartList")
+            }
 
             this.props.history.push({
                 pathname:'/cart/pay',

+ 153 - 38
src/pages/home/detail/index.js

@@ -1,11 +1,14 @@
 import React, {Component} from 'react'
 import {withRouter} from 'react-router-dom'
-import {Query} from "react-apollo"
+import {Query, Mutation} from "react-apollo"
 import gql from "graphql-tag"
+import {message} from 'antd'
 import {NavBar, Icon, ActivityIndicator, Badge, Modal} from 'antd-mobile'
 import classNames from 'classnames'
+import moment from 'moment'
 
-import {productAndSpec_by_id} from "../../../utils/gql"
+import {productAndSpec_by_id, create_userCart} from "../../../utils/gql"
+import {idGen} from '../../../utils/func'
 import './index.css'
 
 class Detail extends Component {
@@ -71,27 +74,36 @@ class DetailRender extends Component {
         super(props)
         this.state = {
             cartCount: localStorage.getItem('cartCount'),
-            openSelect: false
+            openSelect: false,
+            buttonType: 'add'
         }
     }
 
-    showModal = key => (e) => {
+    showModal = (e,key) => {
         e.preventDefault(); // 修复 Android 上点击穿透
         this.setState({
             [key]: true,
-        });
+        })
+    }
+
+    changeModalState = (state,val) => {
+        this.setState({
+            [state]:val
+        })
     }
 
-    onClose = key => () => {
+    changeBottomButtonType = (e,val) => {
         this.setState({
-            [key]: false,
-        });
+            buttonType:val
+        })
+        this.showModal(e,'openSelect')
     }
 
     render() {
         let {data} = this.props
         let {name, img, price, stock} = data.productbyid
-        let {cartCount, openSelect} = this.state
+        let {cartCount, openSelect, buttonType} = this.state
+        // console.log('DetailRender openSelect',openSelect)
 
         return (
             <div className='detail-wrapper content-wrap'>
@@ -121,9 +133,17 @@ class DetailRender extends Component {
                                  <span style={{display: 'inline-block' }} />
                             </Badge>
                         </span>
-                        <span className='detail-bottom-button add' onClick={this.showModal('openSelect')}>加入购物袋</span>
-                        <span className='detail-bottom-button buy' onClick={this.showModal('openSelect')}>立即购买</span>
-                        <SelectModal onClose={this.onClose} openSelect={openSelect} goods={data.spec} price={price} img={img}/>
+                        <span className='detail-bottom-button add' onClick={(e)=>{this.changeBottomButtonType(e,'add')}}>加入购物袋</span>
+                        <span className='detail-bottom-button buy' onClick={(e)=>{this.changeBottomButtonType(e,'buy')}}>立即购买</span>
+                        <SelectModal
+                            changeModalState={this.changeModalState}
+                            openSelect={openSelect}
+                            buttonType={buttonType}
+                            productData={data}
+                            price={price}
+                            img={img}
+                            history={this.props.history}
+                        />
                     </div>
                 </div>
             </div>
@@ -137,31 +157,31 @@ class SelectModal extends Component {
         this.state = {
             count: 1,
             selectColor: '',
+            selectSpec:{},
             specList: [],
-            colorList: [],
-            goods: []
+            colorList: []
         }
     }
 
     componentWillMount() {
-        let {goods} = this.props
-        this.handleData(goods)
+        let {productData} = this.props
+        this.handleData(productData.spec)
     }
 
-    handleData = (goods) => {
+    // 规格表处理
+    handleData = (specs) => {
         let flag = true, selectFlag = true
         let specObject = {}, i = 0, specList = []
         let colorObject = {}, j = 0, colorList = [], selectColor = ''
-        goods.forEach((item) => {
+        specs.forEach((item) => {
             let {id,color,size,stock,status} = item
             if(flag && status > 0) {
                 selectColor = color
                 flag = false
             }
-            specObject[color] ? specList[specObject[color] - 1].spec.push({size, stock, status}) : specObject[color] = ++i && specList.push({
-                id,
+            specObject[color] ? specList[specObject[color] - 1].spec.push({id, size, stock, status}) : specObject[color] = ++i && specList.push({
                 color,
-                spec: [{size, stock, status}],
+                spec: [{id, size, stock, status}],
             })
             if(!colorObject[color]) {
                 colorObject[color] = ++j
@@ -220,8 +240,84 @@ class SelectModal extends Component {
         })
     }
 
+    // 添加至购物袋
+    onCreateUserCart = (create_userCart) => {
+        console.log('add cart')
+        let id = idGen('cart')
+        let user_id = "obR_j5GbxDfGlOolvSeTdZUwfpKA"
+        let {productData} = this.props
+        let product_id = productData.productbyid.id
+        let {count, selectColor, specList} = this.state
+        let specFilter = specList.filter(item=>item.color === selectColor)[0].spec.filter(item=> item.select && item.status > 0)[0]
+        let specificationStock_id =  specFilter.id
+        let createdAt = moment().format('YYYY-MM-DD HH:mm:ss')
+
+        const cartContent = {
+            id,
+            user_id,
+            product_id,
+            specificationStock_id,
+            count,
+            createdAt,
+            updatedAt: ""
+        }
+        console.log('cartContent',cartContent)
+
+        this.props.changeModalState('openSelect')
+        create_userCart({variables:cartContent}).then((data)=>{
+            console.log('create_userCart data',data)
+            let cartCount = localStorage.getItem("cartCount")*1 + count
+            console.log('cartCount',cartCount)
+            localStorage.setItem("cartCount",cartCount)
+        })
+    }
+
+    // 立即购买
+    buyNow = () => {
+        console.log('buyNow')
+        let {count, selectColor, specList} = this.state
+        let createdAt = moment().format('YYYY-MM-DD HH:mm:ss')
+        let id = idGen('cart')
+        let {productData} = this.props
+        let {id:product_id, img, intro, name, price, status, stock, unit} = productData.productbyid
+        let specFilter = specList.filter(item=>item.color === selectColor)[0].spec.filter(item=> item.select && item.status > 0)[0]
+        let {id:specificationStock_id, size, stock:specStock, status:specStatus} =  specFilter
+
+        let buyNowContent = [{
+            count,
+            createdAt,
+            id,
+            product_id:{
+                id:product_id,
+                img,
+                intro,
+                name,
+                price,
+                status,
+                stock,
+                unit
+            },
+            specificationStock_id:{
+                id:specificationStock_id,
+                color:selectColor,
+                size,
+                stock:specStock,
+                status:specStatus
+            }
+        }]
+        console.log('buyNowContent',buyNowContent)
+        sessionStorage.setItem("buyNowContent",JSON.stringify(buyNowContent))
+        this.props.changeModalState('openSelect')
+        this.props.history.push({
+            pathname: '/cart/orders',
+            state:{
+                dataType: 'buyNowContent'
+            }
+        })
+    }
+
     render() {
-        let {price, img} = this.props
+        let {price, img, buttonType} = this.props
         let {count, selectColor, specList, colorList} = this.state
         let specFilter = specList.filter(item=>item.color === selectColor)[0].spec.filter(item=> item.select && item.status > 0)[0]
         let specStock =  specFilter.stock || 0
@@ -231,13 +327,13 @@ class SelectModal extends Component {
             <Modal
                 popup
                 visible={this.props.openSelect}
-                onClose={this.props.onClose('openSelect')}
+                onClose={()=>this.props.changeModalState('openSelect',false)}
                 animationType="slide-up"
                 afterClose={() => { console.log('close model')}}
             >
                 <div className="popup-box" >
                     <div className="main-goods-box">
-                        <div className="close-popup" onClick={this.props.onClose('openSelect')}>
+                        <div className="close-popup" onClick={()=>this.props.changeModalState('openSelect',false)}>
                             ×
                         </div>
                         <div className="goods-box">
@@ -284,27 +380,45 @@ class SelectModal extends Component {
                                     <div className="edit-product-count">
                                         <button
                                             className={classNames({
-                                                'selected_button': true,
+                                                'selected_button-red': true,
                                                 'selected_button-disabled': count <= 1
                                             })}
-                                            disabled={count <= 1}
-                                            onClick={this.reduce}
+                                            // disabled={count <= 1}
+                                            onClick={()=>{
+                                                if(count > 1){
+                                                    this.reduce()
+                                                }else {
+                                                    message.warning('数量不能小于1个')
+                                                }
+                                            }}
                                         >-</button>
                                         <input className="selected_input" type="text" value={count} onChange={(e)=>{this.getInputValue(e)}}/>
-                                        <button className="selected_button" onClick={this.augment}>+</button>
+                                        <button className="selected_button-red" onClick={this.augment}>+</button>
                                     </div>
                                 </div>
                             </div>
                         </div>
                     </div>
-                    <div className='confirm-footer'>
-                        <button
-                            className='confirm-button'
-                            onClick={()=>{
-                            }}>
-                            <span>确认</span>
-                        </button>
-                    </div>
+                    <Mutation mutation={gql(create_userCart)}
+                              onError={error=>console.log('error',error)}
+                    >
+                        {(create_userCart,{ loading, error }) => (
+                            <div className='confirm-footer'>
+                                <button
+                                    className='confirm-button'
+                                    onClick={()=>{
+                                        if(buttonType === 'add'){
+                                            this.onCreateUserCart(create_userCart)
+                                        }else if(buttonType === 'buy'){
+                                            this.buyNow()
+                                        }
+                                    }}
+                                >
+                                    <span>确认</span>
+                                </button>
+                            </div>
+                        )}
+                    </Mutation>
                 </div>
             </Modal>
         )
@@ -332,7 +446,8 @@ class Specification extends Component {
             spec: prevState.spec.map((item,index)=>{
                 if(index===i){
                     item.select=true
-                    this.props.changeState('selectSize',item.size)
+                    console.log('select item',item)
+                    this.props.changeState('selectSpec',item)
                 }else {
                     item.select=false
                 }
@@ -356,7 +471,7 @@ class Specification extends Component {
                                     'spec-gray': item.status < 1,
                                     'spec-red': item.status > 0 && item.select
                                 })}
-                                key={'spec'+index}
+                                key={'spec'+item.id}
                                 onClick={()=>{
                                     if(item.status > 0)  this.changeSelectedStatus(index)
                                 }}

+ 1 - 4
src/pages/my/tools/address/index.js

@@ -108,10 +108,7 @@ class AddressRender extends Component {
     changeOrdersAddress =(address) => {
         sessionStorage.setItem('ordersAddress',JSON.stringify(address))
 
-        this.props.history.push({
-            pathname:'/cart/orders',
-            state:{}
-        })
+        this.props.history.go(-2)
     }
 
     render() {

+ 36 - 0
src/utils/gql.js

@@ -54,6 +54,41 @@ const productAndSpec_by_id = `
     }
 `
 
+const create_userCart = `
+    mutation createuserCart($id: ID!, $user_id: ID, $product_id: ID, $specificationStock_id: ID, $count: Int, $createdAt: String, $updatedAt: String) {
+        createuserCart: create_userCart(id: $id user_id: $user_id product_id: $product_id specificationStock_id: $specificationStock_id count: $count createdAt: $createdAt updatedAt: $updatedAt) {
+            result
+            userCart {
+                id
+                user_id {
+                    id
+                }
+                product_id {
+                    recommend
+                    unit
+                    name
+                    status
+                    id
+                    intro
+                    price
+                    img
+                    stock
+                }
+                specificationStock_id {
+                    id
+                    color
+                    size
+                    stock
+                    status
+                }
+                count
+                createdAt
+                updatedAt
+            }
+        }
+    }
+`
+
 const cart_by_userid = `
     query findUserCart($user_id:ID){
         cartList:userCart_by_props(user_id:$user_id){
@@ -363,6 +398,7 @@ export {
     category_by_props,
     productbyprops,
     productAndSpec_by_id,
+    create_userCart,
     cart_by_userid,
     delete_userCart_by_id,
     userAddressbyprops,