From d03105a7d03715aae8cb57a9ffae923d587cca5a Mon Sep 17 00:00:00 2001 From: czm <2192718639@qq.com> Date: Sat, 7 May 2022 18:51:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=B2=E5=AF=B9=E6=8E=A5=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E5=92=8C=E4=B8=8B=E5=8D=95=E9=80=89=E6=8B=A9=E5=95=86=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/login.ts | 4 +- src/api/user.ts | 31 ++++ src/common/constant.js | 3 +- src/common/util.js | 1 - src/components/search/index.tsx | 2 +- .../details/components/counter/index.tsx | 17 +- .../components/orderCount/index.module.scss | 6 + .../details/components/orderCount/index.tsx | 86 +++++++--- src/pages/details/index.tsx | 5 + src/pages/index/index.tsx | 5 +- src/reducers/userInfo.ts | 18 +- src/use/useHttp.ts | 20 ++- src/use/useLogin.ts | 154 ++++++++++-------- src/use/useUserInfo.ts | 2 +- 14 files changed, 228 insertions(+), 126 deletions(-) create mode 100644 src/api/user.ts diff --git a/src/api/login.ts b/src/api/login.ts index b45eca6..a7cb935 100644 --- a/src/api/login.ts +++ b/src/api/login.ts @@ -4,9 +4,9 @@ import { useRequest } from "@/use/useHttp" * 登录 * @returns */ -export const Login = () => { +export const LoginApi = () => { return useRequest({ url: `/v1/mall/login`, method: "post", }) -} \ No newline at end of file +} diff --git a/src/api/user.ts b/src/api/user.ts new file mode 100644 index 0000000..c97e29e --- /dev/null +++ b/src/api/user.ts @@ -0,0 +1,31 @@ +import { useRequest } from "@/use/useHttp" + +/** + * 解密用户微信信息 + */ + export const GetWxUserInfoApi = () => { + return useRequest({ + url: `/v1/mall/user/decrypt`, + method: "post", + }) +} + +/** + * 获取后台返回的用户信息 + */ + export const GetSelfUserInfoApi = () => { + return useRequest({ + url: `/v1/mall/user/info`, + method: "get", + }) +} + +/** + * 获取后台返回的用户手机号码信息 + */ + export const GetPhoneNumberApi = () => { + return useRequest({ + url: `/v1/mall/user/phoneNumber`, + method: "post", + }) +} diff --git a/src/common/constant.js b/src/common/constant.js index 77ea9a4..4ce9f4c 100644 --- a/src/common/constant.js +++ b/src/common/constant.js @@ -5,10 +5,11 @@ // export const BASE_URL = `http://192.168.0.89:40001/lymarket` // export const BASE_URL = `http://192.168.1.165:40001/lymarket` // 王霞 // export const BASE_URL = `https://test.zzfzyc.com/lymarket` // 测试环境 -export const BASE_URL = `http://192.168.1.30:40001/lymarket` // 发 +// export const BASE_URL = `http://192.168.1.30:40001/lymarket` // 发 // export const BASE_URL = `https://dev.zzfzyc.com/lymarket` // 开发环境 // export const BASE_URL = `https://www.zzfzyc.com/lymarket` // 正式环境 // export const BASE_URL = `http://192.168.1.165:40001/lymarket` // 王霞 +export const BASE_URL = `http://192.168.1.224:50001/lymarket` // 添 // CDN // 生成密钥 diff --git a/src/common/util.js b/src/common/util.js index 323856d..14921f7 100644 --- a/src/common/util.js +++ b/src/common/util.js @@ -44,7 +44,6 @@ export const throttle = (fn, delay) => { for(let key in val) { if(val[key]!=undefined&&val[key]!=null&&(!arr.includes(key))){ if(val[key] instanceof Number){ - console.log("+++",val[key]); if(!isNaN(val[key])) { res[key] = val[key] } diff --git a/src/components/search/index.tsx b/src/components/search/index.tsx index 75b5958..0138c7e 100644 --- a/src/components/search/index.tsx +++ b/src/components/search/index.tsx @@ -16,7 +16,7 @@ type Params = { showBtn?: false|true, btnStyle?: Object, btnTitle?: string, - debounceTime?: number //防抖时间,不设默认wei'ling + debounceTime?: number //防抖时间,不设默认为零 } export default memo(({ diff --git a/src/pages/details/components/counter/index.tsx b/src/pages/details/components/counter/index.tsx index 3640a59..d7f632d 100644 --- a/src/pages/details/components/counter/index.tsx +++ b/src/pages/details/components/counter/index.tsx @@ -3,18 +3,19 @@ import { useEffect, useMemo, useRef, useState } from "react" import Big from 'big.js' import styles from "./index.module.scss" type params = { - minNum?: number, - maxNum?: number, - step?: number, - defaultNum?: number, + minNum?: number, //最小值 + maxNum?: number, //最大值 + step?: number, //步长 + defaultNum?: number, //默认值 digits?: number //多少位小数 - onChange?:(val:number) => void, - onBlue?:(val:number) => void, - onClickBtn?:(val:number) => void, + onChange?:(val:number) => void, + onBlue?:(val:number) => void, //失去焦点触发 + onClickBtn?:(val:number) => void, unit?: string } export default ({minNum = 0, maxNum = 100, step=1, digits = 0, defaultNum = 0, onChange, onBlue, onClickBtn, unit = ''}: params) => { const [value, setValue] = useState({count:defaultNum}) + const onPlus = () => { let {count} = value let num_res = Big(count).add(step).toNumber() @@ -27,7 +28,7 @@ export default ({minNum = 0, maxNum = 100, step=1, digits = 0, defaultNum = 0, o const minus = () => { let {count} = value let num_res = Big(count).minus(step).toNumber() - num_res = num_res <= minNum?minNum:num_res + num_res = num_res < minNum?0:num_res setValue({...value, count:num_res}) onChange?.(parseFloat(num_res)) onClickBtn?.(parseFloat(num_res)) diff --git a/src/pages/details/components/orderCount/index.module.scss b/src/pages/details/components/orderCount/index.module.scss index 25fef03..8c745e2 100644 --- a/src/pages/details/components/orderCount/index.module.scss +++ b/src/pages/details/components/orderCount/index.module.scss @@ -102,6 +102,12 @@ font-size: $font_size; color: $color_main; } + .priceText{ + font-size: $font_size_big; + Text{ + font-size: $font_size_min; + } + } } .btn_con{ display: flex; diff --git a/src/pages/details/components/orderCount/index.tsx b/src/pages/details/components/orderCount/index.tsx index 731752f..9ebddbf 100644 --- a/src/pages/details/components/orderCount/index.tsx +++ b/src/pages/details/components/orderCount/index.tsx @@ -1,4 +1,4 @@ -import {Image, ScrollView, View } from "@tarojs/components" +import {Image, ScrollView, View, Text } from "@tarojs/components" import Popup from "@/components/popup" import LoadingCard from "@/components/loadingCard"; import Search from "@/components/search"; @@ -7,9 +7,12 @@ import Counter from "../counter"; import Big from 'big.js' import classnames from "classnames"; import styles from "./index.module.scss" -import { memo, useEffect, useRef, useState } from "react"; +import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react"; import {GetColorList} from "@/api/materialColor" import { useRouter } from "@tarojs/taro"; +import UseLogin from "@/use/useLogin" +import { formatHashTag, formatMillionYuan } from "@/common/fotmat"; +import { getFilterData } from "@/common/util"; type param = { show?: true|false, @@ -19,9 +22,9 @@ type param = { } export default memo(({show = false, onClose, title = '', productId = 0}: param) => { const selectList = [ - {id: 0, step:1, digits:0, title:'大货', unit:'件', eunit:'kg'}, - {id: 1, step:1, digits:2, title:'剪板', unit:'米', eunit:'m'}, - {id: 2, step:1, digits:2, title:'散剪', unit:'米', eunit:'m'}, + {id: 0, step:1, digits:0, maxNum:100000, defaultNum:1, title:'大货', unit:'件', eunit:'kg'}, + {id: 1, step:1, digits:2, maxNum:9.99, defaultNum:1, title:'剪板', unit:'米', eunit:'m'}, + {id: 2, step:1, digits:2, minNum:10, maxNum:100000, defaultNum:10, title:'散剪', unit:'米', eunit:'kg'}, ] const [selectIndex, setSelectIndex] = useState(0) const selectProduct = (index:number) => { @@ -32,33 +35,31 @@ export default memo(({show = false, onClose, title = '', productId = 0}: param) const {fetchData:colorFetchData} = GetColorList() const [list, setList] = useState([]) const [loading, setLoading] = useState(false) - const condition = useRef({physical_warehouse:1, sale_mode:selectIndex, product_id:0}) + const condition = useRef({physical_warehouse:1, sale_mode:selectIndex, product_id:0, code_or_name:null}) const getColorList = async () => { setLoading(() => true) - let {data} = await colorFetchData(condition.current) + console.log('数据:::',getFilterData(condition.current)) + let {data} = await colorFetchData(getFilterData(condition.current)) setList([...data.list]) setLoading(() => false) } - + const [showPopup, setShowPopup] = useState(false) + //显示获取 useEffect(() => { if(show) { condition.current.product_id = productId getColorList() - } + } + setShowPopup(show) }, [show]) + //卸载清空 useEffect(() => { return () => { setList([]) } }, []) - const [showPopup, setShowPopup] = useState(false) - useEffect(() => { - setShowPopup(show) - }, [show]) - - //popup关闭 const closePopup = () => { onClose?.() @@ -90,8 +91,9 @@ export default memo(({show = false, onClose, title = '', productId = 0}: param) } const onAdd = (item) => { item.show = true - item.count = item.count == 0?1:item.count - setList([...list]) + item.count = selectList[selectIndex].defaultNum + console.log('aa:::',item.count) + setList((list) => [...list]) } //搜索显示与隐藏 @@ -100,11 +102,41 @@ export default memo(({show = false, onClose, title = '', productId = 0}: param) setSearchShow(true) } - const addShopCart = () => { - + //添加购物车 + const {getSelfUserInfo} = UseLogin() + const addShopCart = () => { + getSelfUserInfo() + } + + //显示金额 + const priceFormat = useCallback((item) => { + let price = 0 + if(selectIndex == 0) { + price = formatMillionYuan(item.bulk_price, 100).num + } else if(selectIndex == 1) { + price = formatMillionYuan(item.length_cut_price, 100).num + } else { + price = formatMillionYuan(item.weight_cut_price, 100).num + } + return ¥{Number(price) }{' /' + selectList[selectIndex].eunit} + }, [list, selectIndex]) + + //重置数据 + useEffect(() => { + const newList = list.map(item => { + item.count = 0 + item.show = false + return item + }) + setList([...newList]) + }, [selectIndex]) + + //筛选数据 + const searchInput = (e) => { + condition.current.code_or_name = e + getColorList() } - return ( @@ -121,26 +153,26 @@ export default memo(({show = false, onClose, title = '', productId = 0}: param) {searchShow&& - + searchInput(e)} debounceTime={400}/> setSearchShow(false)}>取消 } 颜色分类 (13) {list.length} - changeSearchShow()}> + {!searchShow&& changeSearchShow()}>} - {list.length > 0&& + {list.length > 0&& {list.map(item => { return - + - {item.title} - ¥25.5/m + {formatHashTag(item.code, item.name)} + {priceFormat(item)} {!item.show&& onAdd(item)}>添加 @@ -152,6 +184,8 @@ export default memo(({show = false, onClose, title = '', productId = 0}: param) digits={selectList[selectIndex].digits} onClickBtn={(e) => getInputValue(e, item)} unit={selectList[selectIndex].unit} + minNum={selectList[selectIndex].minNum} + maxNum={selectList[selectIndex].maxNum} /> } diff --git a/src/pages/details/index.tsx b/src/pages/details/index.tsx index 670b51a..b2210cb 100644 --- a/src/pages/details/index.tsx +++ b/src/pages/details/index.tsx @@ -13,6 +13,7 @@ import useManualPullDownRefresh from '@/use/useManualPullDownRefresh'; import { goLink } from '@/common/common'; import useUserInfo from '@/use/useUserInfo'; import {GetProductDetailApi} from '@/api/material' +import useLogin from '@/use/useLogin'; type item = {title:string, img:string, url:string, id:number} @@ -22,6 +23,10 @@ type params = { style?: Object } export default (props:params) => { + const {checkLogin} = useLogin() + useDidShow(() => { + checkLogin() + }) const router = useRouter() diff --git a/src/pages/index/index.tsx b/src/pages/index/index.tsx index b3d42dc..f443e28 100644 --- a/src/pages/index/index.tsx +++ b/src/pages/index/index.tsx @@ -18,8 +18,9 @@ export default () => { const {checkLogin} = useLogin() - useDidShow(() => { - checkLogin() + useDidShow(async () => { + await checkLogin() + // categoryList() }) useEffect(() => { diff --git a/src/reducers/userInfo.ts b/src/reducers/userInfo.ts index cd46829..107eab3 100644 --- a/src/reducers/userInfo.ts +++ b/src/reducers/userInfo.ts @@ -10,14 +10,20 @@ import { } from '../constants/userInfo' export type UserParam = { - name?:string, + nickName?:string, phone?:string, avatarUrl?:string, + city?: string, + country?: string, + province?: string, + gender?: number, + language?: string, + timestamp?: number } export type DataParam = { token?: string - sessionkey?: string, + session_key?: string, userInfo: UserParam } @@ -31,7 +37,7 @@ type Action = { const INIT_USER = { userInfo: Taro.getStorageSync('userInfo')?JSON.parse(Taro.getStorageSync('userInfo')):null, token: Taro.getStorageSync('token')||'', - session_key: Taro.getStorageSync('sessionkey')||'', + session_key: Taro.getStorageSync('session_key')||'', } export default function counter (state = INIT_USER, action: Action) { @@ -41,16 +47,16 @@ export default function counter (state = INIT_USER, action: Action) { Taro.setStorageSync('userInfo',JSON.stringify(data?.userInfo)) return {...state,...data} case SET_TOKEN: - Taro.setStorageSync('token',JSON.stringify(data?.token)) + Taro.setStorageSync('token',data?.token) return {...state,...data} case SET_SESSIONKEY: - Taro.setStorageSync('sessionkey',JSON.stringify(data?.sessionkey)) + Taro.setStorageSync('session_key',data?.session_key) return {...state,...data} case CLEAR_TOKEN: Taro.removeStorageSync('token') return {...state, token:''} case CLEAR_SESSIONKEY: - Taro.removeStorageSync('sessionkey') + Taro.removeStorageSync('session_key') return {...state, session_key:''} case CLEAR_USERINFO: Taro.removeStorageSync('userInfo') diff --git a/src/use/useHttp.ts b/src/use/useHttp.ts index 9999d05..feea9e9 100644 --- a/src/use/useHttp.ts +++ b/src/use/useHttp.ts @@ -1,6 +1,6 @@ -import Taro from '@tarojs/taro' +import Taro, { useRouter } from '@tarojs/taro' import { useRef, useState } from 'react' import {BASE_URL, WX_APPID} from '@/common/constant' import useUserInfo from "./useUserInfo" @@ -120,7 +120,8 @@ export const useRequest = (options:option = { const stateRef = useRef({...params}) const [state, setState] = useState({...stateRef.current}) - const {removeToken} = useUserInfo() + const {removeToken, removeSessionKey} = useUserInfo() + const router = useRouter() // 请求函数 const fetchData = async (sub_options?:any) => { stateRef.current.loading = true @@ -166,16 +167,19 @@ export const useRequest = (options:option = { stateRef.current.data = data stateRef.current.total = data?.list ? data?.total : 0 }else{ - Taro.showToast({ - title: `错误:${showStatus(statusCode)}` - }) if (statusCode === 401) { removeToken() - Taro.reLaunch({ - url: '/pages/index/index' + removeSessionKey() + // remove + // Taro.reLaunch({ + // url: router.path +'?' + qs.stringify(router.params) + // }) + } else { + Taro.showToast({ + title: `错误:${showStatus(statusCode)}`, + icon: 'none' }) } - } } catch (e) { diff --git a/src/use/useLogin.ts b/src/use/useLogin.ts index 8cf3c09..bced551 100644 --- a/src/use/useLogin.ts +++ b/src/use/useLogin.ts @@ -2,8 +2,9 @@ import { useEffect, useState } from "react" import { WX_APPID } from "@/common/constant" import useUserInfo from "./useUserInfo" import Taro, { useRouter } from "@tarojs/taro" -import { Login } from "@/api/login" - +import { LoginApi } from "@/api/login" +import { GetWxUserInfoApi } from "@/api/user" +import qs from 'qs'; export default () => { const {setToken, setSessionKey, setUserInfo, userInfo} = useUserInfo() @@ -12,91 +13,104 @@ export default () => { console.log('userInfo::',userInfo.token) }, [userInfo]) + const router = useRouter() //登录请求 - const {fetchData} = Login() - const loginRequest = async (code) => { - const {data, success} = await fetchData({js_code: code}) - if(success) { - setToken(data.token) - setSessionKey(data.session_key) - } else { - Taro.showToast({ - title:'登录失败', - icon:"none" - }) - } - } - + const {fetchData} = LoginApi() //微信登录 const wxLogin = () => { - Taro.login({ - success: function async (res) { - if (res.code) { - loginRequest(res.code) - } else { - console.log('登录失败!' + res.errMsg) - } - }, - fail: function(e) { - console.log('登录失败!::',e) - } - }) - } - - const router = useRouter() - //登录加checkLogin检查 - const checkLogin = () => { - if(!userInfo.token) { - wxLogin() - if(router.path != '/pages/index/index') { - Taro.reLaunch({ - url: '/pages/index/index' - }) - } - } else { - Taro.checkSession({ - fail () { - wxLogin() + return new Promise((reslove, reject) => { + Taro.login({ + success: async (res) => { + if (res.code) { + const {data, success, msg} = await fetchData({js_code: res.code}) + if(success) { + console.log('token::',data.token) + setToken(data.token) + setSessionKey(data.session_key) + reslove(data) + Taro.reLaunch({ + url: router.path +'?' + qs.stringify(router.params) + }) + } else { + Taro.showToast({ + title:'登录失败', + icon:"none" + }) + reject(msg) + } + } else { + console.log('登录失败!' + res.errMsg) + reject(res.errMsg) + } + }, + fail: function(e) { + console.log('登录失败!::',e) + reject(e) } }) - } + }) } - //获取用户头像等信息数据 - const getUserInfo = () => { - Taro.getUserProfile({ - desc: '用于完善会员资料', - success: (res) => { - Taro.request({ - url: 'https://dev.zzfzyc.com/lymarket/v1/mall/user/decrypt', - method: 'POST', - data: { - session_key: userInfo.sessionkey, - raw_data: res.rawData, - signature: res.signature, - encrypted_data: res.encryptedData, - iv: res.iv + + //登录加checkLogin检查 + const checkLogin = () => { + return new Promise( async (reslove) => { + if(!userInfo.token) { + await wxLogin() + reslove(true) + } else { + Taro.checkSession({ + success: async () => { + reslove(true) }, - header: { - platform: 6, - Authorization: userInfo.token, - Appid: WX_APPID - }, - success: (e) => { - setUserInfo({}) - }, - fail: (e) => { - console.log(e) + fail: async () => { + await wxLogin() + reslove(true) } }) } }) + + + } + + //获取用户头像等信息数据 + const {fetchData: fetchDataUserInfo} = GetWxUserInfoApi() + const getSelfUserInfo = async () => { + return new Promise((reslove, reject) => { + if(!userInfo.userInfo) { + Taro.getUserProfile({ + desc: '用于完善会员资料', + success: async (res) => { + if(!userInfo.session_key) { + await wxLogin() + } + const {data} = await fetchDataUserInfo({ + session_key: userInfo.session_key, + raw_data: res.rawData, + signature: res.signature, + encrypted_data: res.encryptedData, + iv: res.iv + }) + setUserInfo({...data}) + reslove(data) + }, + fail:(e) => { + reject(e) + } + }) + } else { + reslove(true) + } + }) + + } return { checkLogin, wxLogin, - getUserInfo + getSelfUserInfo } } diff --git a/src/use/useUserInfo.ts b/src/use/useUserInfo.ts index 4caf5a4..690a8ce 100644 --- a/src/use/useUserInfo.ts +++ b/src/use/useUserInfo.ts @@ -10,7 +10,7 @@ export default () => { } const setSessionKey = (sessionkey: string) => { - dispatch({type:SET_SESSIONKEY, data:{sessionkey}}) + dispatch({type:SET_SESSIONKEY, data:{session_key: sessionkey}}) } const setUserInfo = (userInfo: UserParam) => {