diff --git a/src/api/addressList.ts b/src/api/addressList.ts new file mode 100644 index 0000000..4ff2e32 --- /dev/null +++ b/src/api/addressList.ts @@ -0,0 +1,12 @@ + +import { useRequest } from "@/use/useHttp" + +/** + * 获取行政地区列表 + */ + export const GetAddressListApi = () => { + return useRequest({ + url: `/v1/mall/district/list`, + method: "get", + }) +} \ No newline at end of file diff --git a/src/api/order.ts b/src/api/order.ts new file mode 100644 index 0000000..770d977 --- /dev/null +++ b/src/api/order.ts @@ -0,0 +1,11 @@ +import { useRequest } from "@/use/useHttp" + +/** + * 下单现货销售单 + */ + export const SaleOrderApi = () => { + return useRequest({ + url: `/v1/mall/saleOrder`, + method: "post", + }) +} \ No newline at end of file diff --git a/src/api/shopCart.ts b/src/api/shopCart.ts index 8d292bf..87e0d32 100644 --- a/src/api/shopCart.ts +++ b/src/api/shopCart.ts @@ -9,4 +9,26 @@ export const GetShoppingCartApi = () => { url: `/v1/mall/shoppingCart/productColor`, method: "get", }) +} + +/** + * 批量添加面料颜色到物车列表 + * @returns +*/ +export const AddShoppingCartApi = () => { + return useRequest({ + url: `/v1/mall/shoppingCart/productColor/list`, + method: "post", + }) +} + +/** + * 批量删除购物车面料颜色 + * @returns +*/ +export const DelShoppingCartApi = () => { + return useRequest({ + url: `/v1/mall/shoppingCart/productColor`, + method: "delete", + }) } \ No newline at end of file diff --git a/src/api/user.ts b/src/api/user.ts index c97e29e..c131c2f 100644 --- a/src/api/user.ts +++ b/src/api/user.ts @@ -13,7 +13,7 @@ import { useRequest } from "@/use/useHttp" /** * 获取后台返回的用户信息 */ - export const GetSelfUserInfoApi = () => { + export const GetAdminUserInfoApi = () => { return useRequest({ url: `/v1/mall/user/info`, method: "get", diff --git a/src/app copy.tsx b/src/app copy.tsx new file mode 100644 index 0000000..563e573 --- /dev/null +++ b/src/app copy.tsx @@ -0,0 +1,32 @@ +import { Component } from 'react' +import ContextBlueTooth from "@/use/contextBlueTooth" +import { Provider } from 'react-redux' +import configStore from './store' + +import './app.scss' + +const store = configStore() +class App extends Component { + + componentDidMount () {} + + componentDidShow () {} + + componentDidHide () {} + + componentDidCatchError () {} + + // this.props.children 是将要会渲染的页面 + render () { + return ( + + + + {this.props.children} + + + ) + } +} + +export default App \ No newline at end of file diff --git a/src/app.tsx b/src/app.tsx index 563e573..c5cff86 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -1,4 +1,4 @@ -import { Component } from 'react' +import { FC } from 'react' import ContextBlueTooth from "@/use/contextBlueTooth" import { Provider } from 'react-redux' import configStore from './store' @@ -6,27 +6,14 @@ import configStore from './store' import './app.scss' const store = configStore() -class App extends Component { - - componentDidMount () {} - - componentDidShow () {} - - componentDidHide () {} - - componentDidCatchError () {} - - // this.props.children 是将要会渲染的页面 - render () { - return ( - +const App:FC = ({children}) => { + return ( - {this.props.children} + {children} - ) - } + ) } export default App \ No newline at end of file diff --git a/src/common/constant.js b/src/common/constant.js index 4ce9f4c..7c65e86 100644 --- a/src/common/constant.js +++ b/src/common/constant.js @@ -5,11 +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` // 添 +// export const BASE_URL = `http://192.168.1.224:50002/lymarket` // 添 // CDN // 生成密钥 @@ -17,7 +17,7 @@ export const GET_UPLOAD_SIGN = `/upyun/getsign` // 请求签名 url export const UPLOAD_CDN_URL = `https://v0.api.upyun.com/` // 前缀 -export const IMG_CND_Prefix = "http://test.cdn.zzfzyc.com/" +export const IMG_CND_Prefix = "http://test.cdn.zzfzyc.com" // 上传图片视频 diff --git a/src/common/fotmat.js b/src/common/fotmat.js index 8bef05c..3cff723 100644 --- a/src/common/fotmat.js +++ b/src/common/fotmat.js @@ -1,3 +1,5 @@ +import { IMG_CND_Prefix } from "./constant"; + /** * 移除井号 * @param {String} val code 编码 @@ -133,3 +135,12 @@ export const toDecimal2 = (x) => { } return f; } + +/** + * 格式化图片路径 + * @param {*} url + * @returns + */ +export const formatImgUrl = (url) => { + return IMG_CND_Prefix + url +} \ No newline at end of file diff --git a/src/common/util.js b/src/common/util.js index 14921f7..6c131c9 100644 --- a/src/common/util.js +++ b/src/common/util.js @@ -42,7 +42,7 @@ export const throttle = (fn, delay) => { export const getFilterData = (val = {}, arr = []) => { let res = {} for(let key in val) { - if(val[key]!=undefined&&val[key]!=null&&(!arr.includes(key))){ + if(val[key]!==undefined&&val[key]!==null&&val[key]!==''&&(!arr.includes(key))){ if(val[key] instanceof Number){ if(!isNaN(val[key])) { res[key] = val[key] diff --git a/src/components/address/index.tsx b/src/components/address/index.tsx index ba44aa5..9d4725f 100644 --- a/src/components/address/index.tsx +++ b/src/components/address/index.tsx @@ -4,6 +4,8 @@ import Drawer from "@/components/popup"; import styles from "./index.module.scss" import classnames from "classnames"; import Taro from "@tarojs/taro"; +import { GetAddressListApi } from "@/api/addressList"; + type Params = { addressOnSelect?: ({}:{name: string, id:string|number}) => void, @@ -15,90 +17,47 @@ export default memo(({ addressOnSelect, addressOnClose, show = false - }: Params) => { - const list1 = [ - { - name:'广东1', - id:1 - }, - { - name:'广东2', - id:2 - }, - { - name:'广东3', - id:3 - }, - { - name:'广东4', - id:4 - }, - { - name:'广东5', - id:5 - }, - { - name:'广东6', - id:6 - } - ] - const list2 = [ - { - name:'佛山1佛山1佛山1佛山1佛山1', - id:7 - }, - { - name:'佛山2', - id:8 - }, - { - name:'佛山3', - id:9 - }, - { - name:'佛山4', - id:10 - }, - { - name:'佛山5', - id:11 - }, - { - name:'佛山6', - id:12 - } - ] + //获取地址 + const {fetchData} = GetAddressListApi() + useEffect(() => { + getAddressList() + setList(provinceList) + }, []) - const list3 = [ - { - name:'禅城区1', - id:13 - }, - { - name:'禅城区2', - id:14 - }, - { - name:'禅城区3', - id:15 - }, - { - name:'禅城区4', - id:16 - }, - { - name:'禅城区5', - id:17 - }, - { - name:'禅城区6', - id:18 + const condition = useRef({parent_id:1}) + const getAddressList = async () => { + let res = await fetchData(condition.current) + const lists = res.data.list||[] + if(selectIndex == 0) { + setProvinceList(lists) + } else if(selectIndex == 1) { + setCityList(lists) + } else { + setAreaList(lists) } - ] + setList(lists) + } - const [list, setList] = useState(list1) + + type AddresParam = { + ad_code?: string, + id?: number, + level?: number, + level_name?: string, + name?: string, + parent_id?: number + } + //省 + const [provinceList, setProvinceList] = useState([]) + //市 + const [cityList, setCityList] = useState([]) + //区 + const [areaList, setAreaList] = useState([]) + + + const [list, setList] = useState([]) const [selectIndex, setSelectIndex] = useState(0) //0 省, 1 市,2 区 const [selectId, setSelectId] = useState(0) //选中的id const [selectArr, setSelectArr] = useState([]) //选中的省市区 @@ -132,8 +91,7 @@ export default memo(({ useEffect(() => { if(selectIndex == 0) { - setList(list1) - // getDomDes('#address_tab_0') + setList(provinceList) } else if (selectIndex == 1) { getCity() } else { @@ -142,27 +100,22 @@ export default memo(({ }, [selectIndex]) //获取市 - const getCity = () => { - - setTimeout(() => { - if(list2.length > 0) { - setSelectIndex(1) - setList(() => { return list2 }) - setCityStatus(true) - getDomDes('#address_tab_1') - } else { - setCityStatus(false) - } - },10) + const getCity = async () => { + await getAddressList() + if(cityList.length > 0) { + setSelectIndex(1) + setCityStatus(true) + getDomDes('#address_tab_1') + } else { + setCityStatus(false) + } } //获取区 const area = () => { - // setAreaStatus(false) setTimeout(() => { - if(list3.length > 0) { + if(areaList.length > 0) { setSelectIndex(2) - setList(() => { return list3 }) setAreaStatus(true) getDomDes('#address_tab_2') } else { diff --git a/src/components/checkbox/index.module.scss b/src/components/checkbox/index.module.scss index 72809eb..345ad92 100644 --- a/src/components/checkbox/index.module.scss +++ b/src/components/checkbox/index.module.scss @@ -1,6 +1,6 @@ .checkbox_main{ - width: 60px; - height: 60px; + width: 50px; + height: 50px; display: flex; justify-content: center; align-items: center; @@ -13,14 +13,18 @@ text-align: center; line-height: 40px; } +.no_checkbox_item{ + border:0; + background-color: #DDDDDD; +} .checkbox_item_select{ background-color: $color_main; border: 0; color: #fff; - width: 44px; - height: 44px; + width: 40px; + height: 40px; text-align: center; - line-height: 44px; + line-height: 40px; .miconfont{ font-size: 26px; } diff --git a/src/components/checkbox/index.tsx b/src/components/checkbox/index.tsx index ec557d5..e79a1a4 100644 --- a/src/components/checkbox/index.tsx +++ b/src/components/checkbox/index.tsx @@ -4,13 +4,15 @@ import { useEffect, useState } from "react"; import styles from "./index.module.scss" type params = { - onSelect?: () => void, - onClose?: () => void, - status?: false|true + onSelect?: () => void, //选择触发 + onClose?: () => void, //取消触发 + status?: false|true //是否选中 + disabled?: false|true //是否禁用 } -export default ({onSelect, onClose, status = false}: params) => { +export default ({onSelect, onClose, status = false, disabled = false}: params) => { const [selected, SetSelected] = useState(false) const onSelectEven = () => { + if(disabled) return false let res = !selected if(res) { onSelect?.() @@ -25,8 +27,8 @@ export default ({onSelect, onClose, status = false}: params) => { return ( <> onSelectEven()}> - - {selected&&} + + {selected&&} diff --git a/src/components/closeBtn/index.module.scss b/src/components/closeBtn/index.module.scss index 7c001f4..0c9a68a 100644 --- a/src/components/closeBtn/index.module.scss +++ b/src/components/closeBtn/index.module.scss @@ -9,4 +9,8 @@ display: flex; justify-content: center; align-items: center; + .icon_a_btn{ + font-size: 30px; + margin-top: 3px; + } } \ No newline at end of file diff --git a/src/components/closeBtn/index.tsx b/src/components/closeBtn/index.tsx index 90fdc42..396ab6d 100644 --- a/src/components/closeBtn/index.tsx +++ b/src/components/closeBtn/index.tsx @@ -1,4 +1,4 @@ -import { View } from "@tarojs/components" +import { View, Text } from "@tarojs/components" import { memo } from "react" import style from "./index.module.scss" @@ -11,8 +11,10 @@ export default memo(({onClose, styleObj = {}}:Params) => { return ( + > + + ) }) \ No newline at end of file diff --git a/src/components/popup/index.tsx b/src/components/popup/index.tsx index 43349cb..227f12e 100644 --- a/src/components/popup/index.tsx +++ b/src/components/popup/index.tsx @@ -1,18 +1,19 @@ import { View } from "@tarojs/components"; import style from "./index.module.scss" import classnames from "classnames"; -import { memo, ReactNode, useMemo } from "react"; +import { memo, ReactNode, useEffect, useMemo, useRef } from "react"; import CloseBtnIcon from "@/components/closeBtn" export interface Params { - title?: string, - show?: false|true, - showTitle?: false|true, - onClose?:() => void, - children?: ReactNode, - IconButton?: ReactNode, - showIconButton?: false|true, - position?: 'bottom'|'top'|'right' + title?: string, //标题 + show?: false|true, //显示显示弹窗 + showTitle?: false|true, //是否显示标题 + onClose?:() => void, //关闭事件 + children?: ReactNode, //插槽内容 + // IconButton?: ReactNode, // + showIconButton?: false|true, //是否显示关闭按钮 + position?: 'bottom'|'top'|'right', //弹出位置 + animationEnd?: () => void //弹出动画结束 } export default memo(( { @@ -22,9 +23,26 @@ export default memo(( onClose, showIconButton = false, children, - position = 'bottom' + position = 'bottom', + animationEnd }:Params) => { + const animationTime = useRef(null) + useEffect(() => { + if(show) { + animationTime.current = setTimeout(() => { + animationEnd?.() + }, 260) + } else { + clearTimeout(animationTime.current) + } + }, [show]) + + useEffect(() => { + return () => { + clearTimeout(animationTime.current) + } + }, []) return ( <> diff --git a/src/components/search/index.tsx b/src/components/search/index.tsx index 0138c7e..4ba8daa 100644 --- a/src/components/search/index.tsx +++ b/src/components/search/index.tsx @@ -3,7 +3,7 @@ import styles from "./index.module.scss" import CloseBtn from "@/components/closeBtn" import classnames from "classnames"; import { debounce } from "@/common/util"; -import { memo, useEffect, useRef, useState } from "react"; +import { forwardRef, memo, useEffect, useImperativeHandle, useRef, useState } from "react"; type Params = { clickOnSearch?: (val: string) => void @@ -19,7 +19,7 @@ type Params = { debounceTime?: number //防抖时间,不设默认为零 } -export default memo(({ +export default forwardRef(({ clickOnSearch, changeOnSearch, disabled = false, @@ -29,8 +29,8 @@ export default memo(({ btnStyle = {}, placeIcon = 'inner', btnTitle = '搜索', - debounceTime = 0 -}:Params) => { + debounceTime = 0, +}:Params, ref) => { const [inputCon , setInputCon] = useState('') const debounceTimeRef = useRef(0) @@ -43,6 +43,10 @@ export default memo(({ changeData(value) } + useImperativeHandle(ref, () => ({ + clearInput + })) + const clearInput = () => { setInputCon('') changeOnSearch?.('') diff --git a/src/components/shopCart/index.module.scss b/src/components/shopCart/index.module.scss index 61142a4..ca891ed 100644 --- a/src/components/shopCart/index.module.scss +++ b/src/components/shopCart/index.module.scss @@ -41,7 +41,7 @@ } .con{ padding:30px; - padding-bottom: 0; + padding-bottom: 100px; box-sizing: border-box; flex:1; height: 0; @@ -54,12 +54,11 @@ display: flex; justify-content: space-between; &:nth-child(n+2) { - margin-top: 30px; + margin-top: 37px; } .checkbox{ display: flex; align-items: center; - } .img{ width: 126px; @@ -77,9 +76,12 @@ flex-direction: column; justify-content: space-between; margin-left: 20px; + padding-right: 10px; + box-sizing: border-box; .title{ font-size: $font_size; color: $color_font_one; + @include common_ellipsis; } .subtitle{ color: $color_font_two; @@ -97,10 +99,14 @@ } } } + .no_product_item_select{ + opacity: 0.3; + } .count{ display: flex; flex-direction: column; justify-content: space-between; + align-items: flex-end; .price{ font-size: $font_size; font-weight: 700; diff --git a/src/components/shopCart/index.tsx b/src/components/shopCart/index.tsx index 5dba441..16c6880 100644 --- a/src/components/shopCart/index.tsx +++ b/src/components/shopCart/index.tsx @@ -5,22 +5,47 @@ import MCheckbox from "@/components/checkbox"; import LoadingCard from "@/components/loadingCard"; import InfiniteScroll from "@/components/infiniteScroll"; import styles from "./index.module.scss" -import { useEffect, useState } from "react"; +import { useCallback, useEffect, useRef, useState } from "react"; import Taro from "@tarojs/taro"; import { goLink } from "@/common/common"; -import {GetShoppingCartApi} from "@/api/shopCart" +import {GetShoppingCartApi, DelShoppingCartApi} from "@/api/shopCart" +import { formatHashTag, formatImgUrl, formatMillionYuan } from "@/common/fotmat"; type param = { show?: true|false, onClose?: () => void } export default ({show = false, onClose}: param) => { - const selectList = ['不限', '剪板', '散剪', '大货'] - const [selectIndex, setSelectIndex] = useState(0) + const selectList = [ + {value:-1, title:'不限', unit:'', eunit:''}, + {value:0, title:'大货', unit:'件', eunit:'kg'}, + {value:1,title:'剪板', unit:'米', eunit:'m'}, + {value:2,title:'散剪', unit:'米', eunit:'kg'}, + + ] + + const [selectIndex, setSelectIndex] = useState(-1) const selectProduct = (index:number) => { setSelectIndex(index) } + useEffect(() => { + resetList() + setSelectStatus(true) + }, [selectIndex]) + + //重置勾选数据 + const resetList = () => { + list?.map(item => { + if(selectIndex == item.sale_mode || selectIndex == -1) { + item.select = true + } else { + item.select = false + } + }) + setList([...list]) + } + //获取数据 const [list, setList] = useState([]) const [loading, setLoading] = useState(false) @@ -28,14 +53,29 @@ export default ({show = false, onClose}: param) => { const getShoppingCart = async () => { setLoading(true) const {data} = await fetchData() - setList(data) + let color_list = data.color_list||[] + initList(color_list) + setList(color_list) setLoading(false) } + //初始化全部数据 + const initList = (color_list) => { + if(selectIndex == -1) { + color_list?.map(item => { + item.select = true + }) + } + } + //显示是展示数据 useEffect(() => { - if(!show) return - getShoppingCart() + if(!show) { + setList([]) + setSelectIndex(-1) + } else { + getShoppingCart() + } }, [show]) useEffect(() => { @@ -49,11 +89,12 @@ export default ({show = false, onClose}: param) => { setShowPopup(show) }, [show]) - + //全选反选 const [selectStatus, setSelectStatus] = useState(false) const selectAll = () => { list.map(item => { - item.select = !selectStatus + if(selectIndex == item.sale_mode || selectIndex == -1) + item.select = !selectStatus }) setSelectStatus(!selectStatus) setList([...list]) @@ -62,12 +103,29 @@ export default ({show = false, onClose}: param) => { //checkbox选中回调 const selectCallBack = (item) => { item.select = true + checkSelect() setList([...list]) } + //checkbox选中判断是否全部选中,全部选中后是全选,否则反选 + const checkSelect = () => { + let list_count = 0 + let select_count = 0 + list?.map(item => { + if(selectIndex == -1 || selectIndex == item.sale_mode) { + list_count ++ + if(item.select) select_count++ + } + }) + console.log('list_count::',list_count) + console.log('select_count::',select_count) + setSelectStatus(select_count == list_count) + } + //checkbox关闭回调 const colseCallBack = (item) => { item.select = false + checkSelect() setList([...list]) } @@ -77,16 +135,28 @@ export default ({show = false, onClose}: param) => { setShowPopup(false) } + //删除购物车内容 + const {fetchData:delShopFetchData} = DelShoppingCartApi() const delSelect = () => { Taro.showModal({ content: '删除所选商品?', - success: function (res) { + success: async function (res) { if (res.confirm) { - Taro.showToast({ - title: '成功', - icon: 'success', - duration: 2000 - }) + getSelectId() + const res = await delShopFetchData({id:selectIds.current}) + if(res.success) { + getShoppingCart() + Taro.showToast({ + title: '成功', + icon: 'success', + }) + } else { + Taro.showToast({ + title: res.msg, + icon: 'none', + }) + } + } else if (res.cancel) { console.log('用户点击取消') } @@ -94,11 +164,30 @@ export default ({show = false, onClose}: param) => { }) } - + //获取面料选中的id + const selectIds = useRef([]) + const getSelectId = () => { + list?.map(item => { + if(selectIndex == -1 || selectIndex == item.sale_mode) { + item.select&&selectIds.current.push(item.id) + } + }) + } + + //格式化金额 + const formatPirce = useCallback((price) => { + const {num} = formatMillionYuan(price, 100) + return Number(num) + }, []) + + //格式化数量 + const formatCount = useCallback((item) => { + return item.sale_mode == 0? item.roll + '件': item.length + 'm' + }, []) return ( - closePopup()}> + closePopup()} > {!selectStatus?'全选':'反选'} @@ -108,37 +197,36 @@ export default ({show = false, onClose}: param) => { - {selectList.map((item, index) => { - return selectProduct(index)} className={classnames(styles.search_item, (selectIndex==index)&&styles.search_item_select)}>{item} + {selectList.map((item) => { + return selectProduct(item.value)} className={classnames(styles.search_item, (selectIndex==item.value)&&styles.search_item_select)}>{item.title} })} - {loading&&} - {!loading&&list.length > 0&& {console.log('触底了')}} paddingBottom={100}> + {!loading&&list?.length > 0&& - {list.map((item, index) => { - return + {list?.map((item, index) => { + return - selectCallBack(item)} onClose={() => colseCallBack(item)}/> + selectCallBack(item)} onClose={() => colseCallBack(item)}/> - + - {item.title} - 07703# 21S单面平纹(食毛) - 剪板 + {formatHashTag(item.product_code, item.product_name)} + {item.product_color_code +' ' + item.product_color_name} + {item.sale_mode_name} - 40.5/kg - ×12m + {formatPirce(item.sale_price)}/kg + ×{formatCount(item)} })} } - {!loading&&list.length == 0 && + {!loading&&list?.length == 0 && 暂未选择商品 去选购 } diff --git a/src/constants/userInfo.ts b/src/constants/userInfo.ts index 77585a2..b2f5338 100644 --- a/src/constants/userInfo.ts +++ b/src/constants/userInfo.ts @@ -1,6 +1,8 @@ export const SET_USERINFO = 'setUserInfo' +export const SET_ADMINUSERINFO = 'setAdminUserInfo' export const SET_TOKEN = 'setToken' export const SET_SESSIONKEY = 'setSessionkey' export const CLEAR_TOKEN = 'clearToken' export const CLEAR_SESSIONKEY = 'clearSessionkey' -export const CLEAR_USERINFO = 'clearUserInfo' \ No newline at end of file +export const CLEAR_USERINFO = 'clearUserInfo' +export const CLEAR_ADMINUSERINFO = 'clearAdminUserInfo' \ No newline at end of file diff --git a/src/pages/details/components/orderCount/index.tsx b/src/pages/details/components/orderCount/index.tsx index 9ebddbf..6f5233a 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, Text } from "@tarojs/components" +import {Image, ScrollView, View, Text, CustomWrapper } from "@tarojs/components" import Popup from "@/components/popup" import LoadingCard from "@/components/loadingCard"; import Search from "@/components/search"; @@ -8,12 +8,16 @@ import Big from 'big.js' import classnames from "classnames"; import styles from "./index.module.scss" import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { useSelector } from "@/reducers/hooks" import {GetColorList} from "@/api/materialColor" -import { useRouter } from "@tarojs/taro"; +import {AddShoppingCartApi} from "@/api/shopCart" +import Taro, { 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, onClose?: () => void, @@ -21,39 +25,69 @@ type param = { productId?: number } export default memo(({show = false, onClose, title = '', productId = 0}: param) => { - const selectList = [ - {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 {adminUserInfo} = useSelector(state => state.userInfo) + + const [selectList, setSelectList] = useState([ + {id: 0, step:1, digits:0, maxNum:100000, defaultNum:1, title:'大货', unit:'件', eunit:'kg', priceField:'bulk_price'}, + {id: 1, step:1, digits:2, maxNum:9.99, defaultNum:1, title:'剪板', unit:'米', eunit:'m', priceField:'length_cut_price'}, + {id: 2, step:1, digits:2, minNum:10, maxNum:100000, defaultNum:10, title:'散剪', unit:'米', eunit:'kg', priceField:'weight_cut_price'}, + ]) const [selectIndex, setSelectIndex] = useState(0) const selectProduct = (index:number) => { - setSelectIndex(index) + setSelectIndex(() => index) + } + + //重置数据 + useEffect(() => { + const newList = initList(list) + setList([...newList]) + condition.current.code_or_name = null + setSearchShow(false) + }, [selectIndex]) //获取面料颜色列表 - const {fetchData:colorFetchData} = GetColorList() + const {fetchData:colorFetchData, state: colorState} = GetColorList() const [list, setList] = useState([]) const [loading, setLoading] = useState(false) - const condition = useRef({physical_warehouse:1, sale_mode:selectIndex, product_id:0, code_or_name:null}) + const condition = useRef({physical_warehouse:adminUserInfo?.physical_warehouse, sale_mode:selectIndex, product_id:0, code_or_name:null}) const getColorList = async () => { setLoading(() => true) console.log('数据:::',getFilterData(condition.current)) let {data} = await colorFetchData(getFilterData(condition.current)) - setList([...data.list]) + let lists = initList(data.list) + setList([...lists]) setLoading(() => false) } const [showPopup, setShowPopup] = useState(false) + + useEffect(() => { + console.log('colorState::',colorState) + }, [colorState]) + //显示获取 useEffect(() => { if(show) { + setSelectIndex(0) + condition.current.code_or_name = null + setSearchShow(false) condition.current.product_id = productId getColorList() } setShowPopup(show) }, [show]) - //卸载清空 + //初始化列表数据 + const initList = useCallback((list) => { + const newList = list.map(item => { + item.count = 0 + item.show = false + return item + }) + return newList + }, []) + + //卸载数据 useEffect(() => { return () => { setList([]) @@ -64,22 +98,28 @@ export default memo(({show = false, onClose, title = '', productId = 0}: param) const closePopup = () => { onClose?.() setShowPopup(false) + setList([]) } //计算总数量和总米/件数 - const [selectCount, setSelectCount] = useState({ + const [selectCount, setSelectCount] = useState<{sumCount:number, kindCount:number, color_list:any[]}>({ sumCount: 0, - kindCount: 0 + kindCount: 0, + color_list: [] }) useEffect(() => { - let sumCount = 0, kindCount = 0 + let sumCount = 0, kindCount = 0, color_list:any[] = [] + let color_list_info = {} list.map(item => { if(item.count > 0) { sumCount = Big(sumCount).add(item.count).toNumber() kindCount ++ + color_list_info = selectIndex == 0? {product_color_id:item.id, roll:item.count}:{product_color_id:item.id, length:item.count} + color_list.push(color_list_info) + } }) - setSelectCount({sumCount, kindCount}) + setSelectCount({...selectCount, sumCount, kindCount, color_list}) }, [list]) //计数组件 @@ -92,7 +132,6 @@ export default memo(({show = false, onClose, title = '', productId = 0}: param) const onAdd = (item) => { item.show = true item.count = selectList[selectIndex].defaultNum - console.log('aa:::',item.count) setList((list) => [...list]) } @@ -104,32 +143,42 @@ export default memo(({show = false, onClose, title = '', productId = 0}: param) //添加购物车 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 + const {fetchData:addFetchData} = AddShoppingCartApi() + const addShopCart = async () => { + try { + await getSelfUserInfo() + } catch(msg) { + Taro.showToast({ + icon:'none', + title:msg + }) + return false } - return ¥{Number(price) }{' /' + selectList[selectIndex].eunit} - }, [list, selectIndex]) - - //重置数据 - useEffect(() => { - const newList = list.map(item => { - item.count = 0 - item.show = false - return item + + if(selectCount.sumCount == 0) { + Taro.showToast({ + icon:'none', + title:'请选择面料颜色!' + }) + return false + } + const state = await addFetchData({ + "sale_mode": selectIndex, + color_list: selectCount.color_list }) - setList([...newList]) - }, [selectIndex]) + if(state.success) { + Taro.showToast({ + title:'添加成功' + }) + onClose?.() + } else { + Taro.showToast({ + icon:'none', + title: state.msg + }) + } + + } //筛选数据 const searchInput = (e) => { @@ -137,10 +186,24 @@ export default memo(({show = false, onClose, title = '', productId = 0}: param) getColorList() } + //清空搜索内容 + const searchRef = useRef(null) + const clearSearch = () => { + searchRef.current.clearInput() + setSearchShow(false) + } + + //格式化金额 + const formatPrice = useCallback((item) => { + const price = Number(formatMillionYuan(item[selectList[selectIndex].priceField], 100).num) + return ¥{price} /{selectList[selectIndex].eunit} + }, [selectIndex]) + + return ( - closePopup()}> + closePopup()} > {title} @@ -153,47 +216,52 @@ export default memo(({show = false, onClose, title = '', productId = 0}: param) {searchShow&& - searchInput(e)} debounceTime={400}/> + searchInput(e)} debounceTime={400}/> - setSearchShow(false)}>取消 + clearSearch()}>取消 } - 颜色分类 (13) {list.length} + 颜色分类 ({list.length}) {!searchShow&& changeSearchShow()}>} - {list.length > 0&& - - {list.map(item => { - return - - + {(list.length <= 0 && colorState.loading)&&} + {(list.length > 0&& !colorState.loading)&& + + + + {list.map(item => { + return + + + + + {formatHashTag(item.code, item.name)} + + {formatPrice(item)} + + + + {!item.show&& onAdd(item)}>添加 + || + getInputValue(e, item)} + defaultNum={item.count} + step={selectList[selectIndex].step} + digits={selectList[selectIndex].digits} + onClickBtn={(e) => getInputValue(e, item)} + unit={selectList[selectIndex].unit} + minNum={selectList[selectIndex].minNum} + maxNum={selectList[selectIndex].maxNum} + /> + } + - - {formatHashTag(item.code, item.name)} - {priceFormat(item)} - - - {!item.show&& onAdd(item)}>添加 - || - getInputValue(e, item)} - defaultNum={item.count} - step={selectList[selectIndex].step} - digits={selectList[selectIndex].digits} - onClickBtn={(e) => getInputValue(e, item)} - unit={selectList[selectIndex].unit} - minNum={selectList[selectIndex].minNum} - maxNum={selectList[selectIndex].maxNum} - /> - } - - - })} - - || - 暂无此商品} + })} + + } + {(list.length <= 0 && !colorState.loading)&&暂无此商品} diff --git a/src/pages/details/components/swiper/index.tsx b/src/pages/details/components/swiper/index.tsx index f0788dd..7fa0497 100644 --- a/src/pages/details/components/swiper/index.tsx +++ b/src/pages/details/components/swiper/index.tsx @@ -1,3 +1,4 @@ +import { formatImgUrl } from "@/common/fotmat" import { Image, Swiper, SwiperItem, View } from "@tarojs/components" import { useMemo, useRef, useState } from "react" import styles from './index.module.scss' @@ -18,7 +19,6 @@ export default ({list = []}: params) => { const swiperChange = (e) => { setPageIndex(e.detail.current + 1) - pageRef.current.innerHTML = 2 } @@ -28,7 +28,7 @@ export default ({list = []}: params) => { {list.map((item) => { return - + })} diff --git a/src/pages/details/index.module.scss b/src/pages/details/index.module.scss index 2ac32b4..750aefa 100644 --- a/src/pages/details/index.module.scss +++ b/src/pages/details/index.module.scss @@ -145,7 +145,13 @@ background-color: $color_main; font-size: $font_size; color: #fff; - + position: relative; + .phoneBtn{ + background-color: rgba(0, 0, 0, 0); + position: absolute; + width: 100%; + height: 100%; + } } } } \ No newline at end of file diff --git a/src/pages/details/index.tsx b/src/pages/details/index.tsx index b2210cb..75f1899 100644 --- a/src/pages/details/index.tsx +++ b/src/pages/details/index.tsx @@ -1,6 +1,6 @@ -import { Button, Image, RichText, ScrollView, Swiper, SwiperItem, Text, View } from '@tarojs/components' -import Taro, { useDidShow, useRouter, useShareAppMessage } from '@tarojs/taro'; +import { Button, CustomWrapper, Image, RichText, ScrollView, Swiper, SwiperItem, Text, View } from '@tarojs/components' +import Taro, { useDidShow, usePullDownRefresh, useRouter, useShareAppMessage } from '@tarojs/taro'; import classnames from "classnames"; import DesSwiper from './components/swiper'; import OrderCount from './components/orderCount'; @@ -23,7 +23,8 @@ type params = { style?: Object } export default (props:params) => { - const {checkLogin} = useLogin() + const {checkLogin, getPhoneNumber, userInfo} = useLogin() + useDidShow(() => { checkLogin() }) @@ -39,6 +40,7 @@ export default (props:params) => { const getProductDetail = async () => { let {data} = await fetchData({id: router.params.id}) setProductInfo(data) + Taro.stopPullDownRefresh() } //面料名称 @@ -46,27 +48,11 @@ export default (props:params) => { return formatHashTag(productInfo.code, productInfo.name) },[productInfo]) - const list = [ - { - title:'数据', - img:'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2F811%2F021315104H2%2F150213104H2-3-1200.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1651817947&t=5467a207f845ddfc7737d55934e6b26d', - url:'', - id:1 - }, - { - title:'数据', - img:'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2F811%2F021315104H2%2F150213104H2-3-1200.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1651817947&t=5467a207f845ddfc7737d55934e6b26d', - url:'', - id:2 - } - ] - const [showCart, setShowCart] = useState(false) const [showOrderCount, setShowOrderCount] = useState(false) - const html = `

这里是详情

-
你好啊啊
+ const html = ` ` @@ -99,14 +85,36 @@ export default (props:params) => { return { title: '自定义转发标题', path: '/pages/details/index?id=10', - imageUrl: list[0].img + imageUrl: '' } }) + //开始下单 + const placeOrder = async (e:any) => { + try { + await getPhoneNumber(e.detail.code) + } catch(msg) { + Taro.showToast({ + icon:"none", + title: msg + }) + return false + } + setShowOrderCount(true) + } + + + //页面下拉刷新 + usePullDownRefresh(() => { + getProductDetail() + + }) + + return ( - + {productName} @@ -154,9 +162,17 @@ export default (props:params) => { 购物车 - setShowOrderCount(true)}>开始下单 + { + !userInfo.adminUserInfo?.is_authorize_phone&& + + 开始下单 + + || placeOrder(e)}>开始下单 + } - setShowOrderCount(false)} title={productName} productId={productInfo.id}/> + + setShowOrderCount(false)} title={productName} productId={productInfo.id}/> + setShowCart(false)}/> setShowPreview(false)}/> diff --git a/src/reducers/hooks.ts b/src/reducers/hooks.ts new file mode 100644 index 0000000..b882f8f --- /dev/null +++ b/src/reducers/hooks.ts @@ -0,0 +1,8 @@ + +//该方法纯粹只是个Ts类型定义文件 +import { useSelector as useReduxSelector, TypedUseSelectorHook } from 'react-redux'; +import { DataParam } from './userInfo'; +type Params = { + userInfo: DataParam +} +export const useSelector: TypedUseSelectorHook = useReduxSelector; \ No newline at end of file diff --git a/src/reducers/index.ts b/src/reducers/index.ts index 8964c5d..2af35af 100644 --- a/src/reducers/index.ts +++ b/src/reducers/index.ts @@ -2,5 +2,5 @@ import { combineReducers } from 'redux' import userInfo from './userInfo' export default combineReducers({ - userInfo + userInfo }) \ No newline at end of file diff --git a/src/reducers/userInfo.ts b/src/reducers/userInfo.ts index 107eab3..5fbd4db 100644 --- a/src/reducers/userInfo.ts +++ b/src/reducers/userInfo.ts @@ -2,11 +2,13 @@ import Taro from '@tarojs/taro' import { SET_USERINFO, + SET_ADMINUSERINFO, SET_TOKEN, SET_SESSIONKEY, CLEAR_TOKEN, CLEAR_USERINFO, - CLEAR_SESSIONKEY + CLEAR_SESSIONKEY, + CLEAR_ADMINUSERINFO, } from '../constants/userInfo' export type UserParam = { @@ -18,13 +20,30 @@ export type UserParam = { province?: string, gender?: number, language?: string, - timestamp?: number + timestamp?: number, + physical_warehouse?: number, + physical_warehouse_name?: string, +} + +export type UserAdminParam = { + avatar_url?: string, + open_id?: string, + physical_warehouse?: number, + physical_warehouse_name?: string, + union_id?: string, + user_code?: string, + user_id?: number, + user_name?: string, + wechat_user_open_id?: number + is_authorize_name?: false|true, + is_authorize_phone?: false|true } export type DataParam = { token?: string session_key?: string, - userInfo: UserParam + userInfo: UserParam, + adminUserInfo: UserAdminParam } type Action = { @@ -36,6 +55,7 @@ type Action = { const INIT_USER = { userInfo: Taro.getStorageSync('userInfo')?JSON.parse(Taro.getStorageSync('userInfo')):null, + adminUserInfo: Taro.getStorageSync('adminUserInfo')?JSON.parse(Taro.getStorageSync('adminUserInfo')):null, token: Taro.getStorageSync('token')||'', session_key: Taro.getStorageSync('session_key')||'', } @@ -43,25 +63,31 @@ const INIT_USER = { export default function counter (state = INIT_USER, action: Action) { const {type, data} = action switch (type) { - case SET_USERINFO: - Taro.setStorageSync('userInfo',JSON.stringify(data?.userInfo)) - return {...state,...data} - case SET_TOKEN: - Taro.setStorageSync('token',data?.token) - return {...state,...data} - case SET_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('session_key') - return {...state, session_key:''} - case CLEAR_USERINFO: - Taro.removeStorageSync('userInfo') - return {...state, userInfo: null} - default: - return state + case SET_USERINFO: + Taro.setStorageSync('userInfo',JSON.stringify(data?.userInfo)) + return {...state,...data} + case SET_ADMINUSERINFO: + Taro.setStorageSync('adminUserInfo',JSON.stringify(data?.adminUserInfo)) + return {...state,...data} + case SET_TOKEN: + Taro.setStorageSync('token',data?.token) + return {...state,...data} + case SET_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('session_key') + return {...state, session_key:''} + case CLEAR_USERINFO: + Taro.removeStorageSync('userInfo') + return {...state, userInfo: null} + case CLEAR_ADMINUSERINFO: + Taro.removeStorageSync('adminUserInfo') + return {...state, adminUserInfo: null} + default: + return state } } \ No newline at end of file diff --git a/src/styles/bak/iconfont.scss b/src/styles/bak/iconfont.scss new file mode 100644 index 0000000..868bd5f --- /dev/null +++ b/src/styles/bak/iconfont.scss @@ -0,0 +1,89 @@ +@font-face { + font-family: "iconfont"; /* Project id 2987621 */ + src: + url('iconfont.ttf?t=1650013104232') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-yifahuo:before { + content: "\e65b"; +} + +.icon-daipeibu:before { + content: "\e662"; +} + +.icon-yaoqingtuandui:before { + content: "\e65a"; +} + +.icon-a-tuikuanshouhou:before { + content: "\e65c"; +} + +.icon-daifukuan:before { + content: "\e65d"; +} + +.icon-shezhi:before { + content: "\e65e"; +} + +.icon-yanseduibi:before { + content: "\e65f"; +} + +.icon-daifahuo:before { + content: "\e660"; +} + +.icon-baoguo:before { + content: "\e661"; +} + +.icon-tick-pressed:before { + content: "\e652"; +} + +.icon-wode-pressed:before { + content: "\e655"; +} + +.icon-fenlei-pressed:before { + content: "\e656"; +} + +.icon-sousuo:before { + content: "\e647"; +} + +.icon-fenxiang:before { + content: "\e648"; +} + +.icon-shaixuan:before { + content: "\e649"; +} + +.icon-gouwuche:before { + content: "\e64a"; +} + +.icon-qingkong:before { + content: "\e64c"; +} + +.icon-jia:before { + content: "\e64d"; +} + +.icon-jian:before { + content: "\e64e"; +} \ No newline at end of file diff --git a/src/styles/bak/iconfont.ttf b/src/styles/bak/iconfont.ttf new file mode 100644 index 0000000..02f0408 Binary files /dev/null and b/src/styles/bak/iconfont.ttf differ diff --git a/src/styles/download (2)/font_2987621_ti92prbgh6/demo.css b/src/styles/download (2)/font_2987621_ti92prbgh6/demo.css new file mode 100644 index 0000000..a67054a --- /dev/null +++ b/src/styles/download (2)/font_2987621_ti92prbgh6/demo.css @@ -0,0 +1,539 @@ +/* Logo 字体 */ +@font-face { + font-family: "iconfont logo"; + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); +} + +.logo { + font-family: "iconfont logo"; + font-size: 160px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* tabs */ +.nav-tabs { + position: relative; +} + +.nav-tabs .nav-more { + position: absolute; + right: 0; + bottom: 0; + height: 42px; + line-height: 42px; + color: #666; +} + +#tabs { + border-bottom: 1px solid #eee; +} + +#tabs li { + cursor: pointer; + width: 100px; + height: 40px; + line-height: 40px; + text-align: center; + font-size: 16px; + border-bottom: 2px solid transparent; + position: relative; + z-index: 1; + margin-bottom: -1px; + color: #666; +} + + +#tabs .active { + border-bottom-color: #f00; + color: #222; +} + +.tab-container .content { + display: none; +} + +/* 页面布局 */ +.main { + padding: 30px 100px; + width: 960px; + margin: 0 auto; +} + +.main .logo { + color: #333; + text-align: left; + margin-bottom: 30px; + line-height: 1; + height: 110px; + margin-top: -50px; + overflow: hidden; + *zoom: 1; +} + +.main .logo a { + font-size: 160px; + color: #333; +} + +.helps { + margin-top: 40px; +} + +.helps pre { + padding: 20px; + margin: 10px 0; + border: solid 1px #e7e1cd; + background-color: #fffdef; + overflow: auto; +} + +.icon_lists { + width: 100% !important; + overflow: hidden; + *zoom: 1; +} + +.icon_lists li { + width: 100px; + margin-bottom: 10px; + margin-right: 20px; + text-align: center; + list-style: none !important; + cursor: default; +} + +.icon_lists li .code-name { + line-height: 1.2; +} + +.icon_lists .icon { + display: block; + height: 100px; + line-height: 100px; + font-size: 42px; + margin: 10px auto; + color: #333; + -webkit-transition: font-size 0.25s linear, width 0.25s linear; + -moz-transition: font-size 0.25s linear, width 0.25s linear; + transition: font-size 0.25s linear, width 0.25s linear; +} + +.icon_lists .icon:hover { + font-size: 100px; +} + +.icon_lists .svg-icon { + /* 通过设置 font-size 来改变图标大小 */ + width: 1em; + /* 图标和文字相邻时,垂直对齐 */ + vertical-align: -0.15em; + /* 通过设置 color 来改变 SVG 的颜色/fill */ + fill: currentColor; + /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 + normalize.css 中也包含这行 */ + overflow: hidden; +} + +.icon_lists li .name, +.icon_lists li .code-name { + color: #666; +} + +/* markdown 样式 */ +.markdown { + color: #666; + font-size: 14px; + line-height: 1.8; +} + +.highlight { + line-height: 1.5; +} + +.markdown img { + vertical-align: middle; + max-width: 100%; +} + +.markdown h1 { + color: #404040; + font-weight: 500; + line-height: 40px; + margin-bottom: 24px; +} + +.markdown h2, +.markdown h3, +.markdown h4, +.markdown h5, +.markdown h6 { + color: #404040; + margin: 1.6em 0 0.6em 0; + font-weight: 500; + clear: both; +} + +.markdown h1 { + font-size: 28px; +} + +.markdown h2 { + font-size: 22px; +} + +.markdown h3 { + font-size: 16px; +} + +.markdown h4 { + font-size: 14px; +} + +.markdown h5 { + font-size: 12px; +} + +.markdown h6 { + font-size: 12px; +} + +.markdown hr { + height: 1px; + border: 0; + background: #e9e9e9; + margin: 16px 0; + clear: both; +} + +.markdown p { + margin: 1em 0; +} + +.markdown>p, +.markdown>blockquote, +.markdown>.highlight, +.markdown>ol, +.markdown>ul { + width: 80%; +} + +.markdown ul>li { + list-style: circle; +} + +.markdown>ul li, +.markdown blockquote ul>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown>ul li p, +.markdown>ol li p { + margin: 0.6em 0; +} + +.markdown ol>li { + list-style: decimal; +} + +.markdown>ol li, +.markdown blockquote ol>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown code { + margin: 0 3px; + padding: 0 5px; + background: #eee; + border-radius: 3px; +} + +.markdown strong, +.markdown b { + font-weight: 600; +} + +.markdown>table { + border-collapse: collapse; + border-spacing: 0px; + empty-cells: show; + border: 1px solid #e9e9e9; + width: 95%; + margin-bottom: 24px; +} + +.markdown>table th { + white-space: nowrap; + color: #333; + font-weight: 600; +} + +.markdown>table th, +.markdown>table td { + border: 1px solid #e9e9e9; + padding: 8px 16px; + text-align: left; +} + +.markdown>table th { + background: #F7F7F7; +} + +.markdown blockquote { + font-size: 90%; + color: #999; + border-left: 4px solid #e9e9e9; + padding-left: 0.8em; + margin: 1em 0; +} + +.markdown blockquote p { + margin: 0; +} + +.markdown .anchor { + opacity: 0; + transition: opacity 0.3s ease; + margin-left: 8px; +} + +.markdown .waiting { + color: #ccc; +} + +.markdown h1:hover .anchor, +.markdown h2:hover .anchor, +.markdown h3:hover .anchor, +.markdown h4:hover .anchor, +.markdown h5:hover .anchor, +.markdown h6:hover .anchor { + opacity: 1; + display: inline-block; +} + +.markdown>br, +.markdown>p>br { + clear: both; +} + + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #a71d5d; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +/* 代码高亮 */ +/* PrismJS 1.15.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre)>code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre)>code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/src/styles/download (2)/font_2987621_ti92prbgh6/demo_index.html b/src/styles/download (2)/font_2987621_ti92prbgh6/demo_index.html new file mode 100644 index 0000000..15451a7 --- /dev/null +++ b/src/styles/download (2)/font_2987621_ti92prbgh6/demo_index.html @@ -0,0 +1,855 @@ + + + + + iconfont Demo + + + + + + + + + + + + + +
+

+ + +

+ +
+
+
    + +
  • + +
    已发货
    +
    &#xe65b;
    +
  • + +
  • + +
    待配布
    +
    &#xe662;
    +
  • + +
  • + +
    邀请团队
    +
    &#xe65a;
    +
  • + +
  • + +
    退款、售后
    +
    &#xe65c;
    +
  • + +
  • + +
    待付款
    +
    &#xe65d;
    +
  • + +
  • + +
    设置
    +
    &#xe65e;
    +
  • + +
  • + +
    颜色对比
    +
    &#xe65f;
    +
  • + +
  • + +
    待发货
    +
    &#xe660;
    +
  • + +
  • + +
    包裹
    +
    &#xe661;
    +
  • + +
  • + +
    tick-pressed
    +
    &#xe652;
    +
  • + +
  • + +
    我的-pressed
    +
    &#xe655;
    +
  • + +
  • + +
    分类-pressed
    +
    &#xe656;
    +
  • + +
  • + +
    搜索
    +
    &#xe647;
    +
  • + +
  • + +
    分享
    +
    &#xe648;
    +
  • + +
  • + +
    筛选
    +
    &#xe649;
    +
  • + +
  • + +
    购物车
    +
    &#xe64a;
    +
  • + +
  • + +
    清空
    +
    &#xe64c;
    +
  • + +
  • + +
    +
    &#xe64d;
    +
  • + +
  • + +
    +
    &#xe64e;
    +
  • + +
  • + +
    收藏-pressed
    +
    &#xe64f;
    +
  • + +
  • + +
    收藏
    +
    &#xe650;
    +
  • + +
  • + +
    phone
    +
    &#xe651;
    +
  • + +
  • + +
    tick
    +
    &#xe653;
    +
  • + +
  • + +
    more,back
    +
    &#xe654;
    +
  • + +
  • + +
    分类
    +
    &#xe657;
    +
  • + +
  • + +
    编辑
    +
    &#xe658;
    +
  • + +
  • + +
    我的
    +
    &#xe659;
    +
  • + +
  • + +
    排序,升序
    +
    &#xea4c;
    +
  • + +
  • + +
    排序,降序
    +
    &#xea4d;
    +
  • + +
+
+

Unicode 引用

+
+ +

Unicode 是字体在网页端最原始的应用方式,特点是:

+
    +
  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • +
  • 默认情况下不支持多色,直接添加多色图标会自动去色。
  • +
+
+

注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)

+
+

Unicode 使用步骤如下:

+

第一步:拷贝项目下面生成的 @font-face

+
@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1652068398646') format('woff2'),
+       url('iconfont.woff?t=1652068398646') format('woff'),
+       url('iconfont.ttf?t=1652068398646') format('truetype');
+}
+
+

第二步:定义使用 iconfont 的样式

+
.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+

第三步:挑选相应图标并获取字体编码,应用于页面

+
+<span class="iconfont">&#x33;</span>
+
+
+

"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    + 已发货 +
    +
    .icon-yifahuo +
    +
  • + +
  • + +
    + 待配布 +
    +
    .icon-daipeibu +
    +
  • + +
  • + +
    + 邀请团队 +
    +
    .icon-yaoqingtuandui +
    +
  • + +
  • + +
    + 退款、售后 +
    +
    .icon-a-tuikuanshouhou +
    +
  • + +
  • + +
    + 待付款 +
    +
    .icon-daifukuan +
    +
  • + +
  • + +
    + 设置 +
    +
    .icon-shezhi +
    +
  • + +
  • + +
    + 颜色对比 +
    +
    .icon-yanseduibi +
    +
  • + +
  • + +
    + 待发货 +
    +
    .icon-daifahuo +
    +
  • + +
  • + +
    + 包裹 +
    +
    .icon-baoguo +
    +
  • + +
  • + +
    + tick-pressed +
    +
    .icon-tick-pressed +
    +
  • + +
  • + +
    + 我的-pressed +
    +
    .icon-wode-pressed +
    +
  • + +
  • + +
    + 分类-pressed +
    +
    .icon-fenlei-pressed +
    +
  • + +
  • + +
    + 搜索 +
    +
    .icon-sousuo +
    +
  • + +
  • + +
    + 分享 +
    +
    .icon-fenxiang +
    +
  • + +
  • + +
    + 筛选 +
    +
    .icon-shaixuan +
    +
  • + +
  • + +
    + 购物车 +
    +
    .icon-gouwuche +
    +
  • + +
  • + +
    + 清空 +
    +
    .icon-qingkong +
    +
  • + +
  • + +
    + 加 +
    +
    .icon-jia +
    +
  • + +
  • + +
    + 减 +
    +
    .icon-jian +
    +
  • + +
  • + +
    + 收藏-pressed +
    +
    .icon-shoucang-pressed +
    +
  • + +
  • + +
    + 收藏 +
    +
    .icon-shoucang +
    +
  • + +
  • + +
    + phone +
    +
    .icon-phone +
    +
  • + +
  • + +
    + tick +
    +
    .icon-tick +
    +
  • + +
  • + +
    + more,back +
    +
    .icon-a-moreback +
    +
  • + +
  • + +
    + 分类 +
    +
    .icon-fenlei +
    +
  • + +
  • + +
    + 编辑 +
    +
    .icon-bianji +
    +
  • + +
  • + +
    + 我的 +
    +
    .icon-wode +
    +
  • + +
  • + +
    + 排序,升序 +
    +
    .icon-sort-up-full +
    +
  • + +
  • + +
    + 排序,降序 +
    +
    .icon-sort-down-full +
    +
  • + +
+
+

font-class 引用

+
+ +

font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。

+

与 Unicode 使用方式相比,具有如下特点:

+
    +
  • 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
  • +
  • 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 fontclass 代码:

+
<link rel="stylesheet" href="./iconfont.css">
+
+

第二步:挑选相应图标并获取类名,应用于页面:

+
<span class="iconfont icon-xxx"></span>
+
+
+

" + iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    已发货
    +
    #icon-yifahuo
    +
  • + +
  • + +
    待配布
    +
    #icon-daipeibu
    +
  • + +
  • + +
    邀请团队
    +
    #icon-yaoqingtuandui
    +
  • + +
  • + +
    退款、售后
    +
    #icon-a-tuikuanshouhou
    +
  • + +
  • + +
    待付款
    +
    #icon-daifukuan
    +
  • + +
  • + +
    设置
    +
    #icon-shezhi
    +
  • + +
  • + +
    颜色对比
    +
    #icon-yanseduibi
    +
  • + +
  • + +
    待发货
    +
    #icon-daifahuo
    +
  • + +
  • + +
    包裹
    +
    #icon-baoguo
    +
  • + +
  • + +
    tick-pressed
    +
    #icon-tick-pressed
    +
  • + +
  • + +
    我的-pressed
    +
    #icon-wode-pressed
    +
  • + +
  • + +
    分类-pressed
    +
    #icon-fenlei-pressed
    +
  • + +
  • + +
    搜索
    +
    #icon-sousuo
    +
  • + +
  • + +
    分享
    +
    #icon-fenxiang
    +
  • + +
  • + +
    筛选
    +
    #icon-shaixuan
    +
  • + +
  • + +
    购物车
    +
    #icon-gouwuche
    +
  • + +
  • + +
    清空
    +
    #icon-qingkong
    +
  • + +
  • + +
    +
    #icon-jia
    +
  • + +
  • + +
    +
    #icon-jian
    +
  • + +
  • + +
    收藏-pressed
    +
    #icon-shoucang-pressed
    +
  • + +
  • + +
    收藏
    +
    #icon-shoucang
    +
  • + +
  • + +
    phone
    +
    #icon-phone
    +
  • + +
  • + +
    tick
    +
    #icon-tick
    +
  • + +
  • + +
    more,back
    +
    #icon-a-moreback
    +
  • + +
  • + +
    分类
    +
    #icon-fenlei
    +
  • + +
  • + +
    编辑
    +
    #icon-bianji
    +
  • + +
  • + +
    我的
    +
    #icon-wode
    +
  • + +
  • + +
    排序,升序
    +
    #icon-sort-up-full
    +
  • + +
  • + +
    排序,降序
    +
    #icon-sort-down-full
    +
  • + +
+
+

Symbol 引用

+
+ +

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 + 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:

+
    +
  • 支持多色图标了,不再受单色限制。
  • +
  • 通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
  • +
  • 兼容性较差,支持 IE9+,及现代浏览器。
  • +
  • 浏览器渲染 SVG 的性能一般,还不如 png。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 symbol 代码:

+
<script src="./iconfont.js"></script>
+
+

第二步:加入通用 CSS 代码(引入一次就行):

+
<style>
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+</style>
+
+

第三步:挑选相应图标并获取类名,应用于页面:

+
<svg class="icon" aria-hidden="true">
+  <use xlink:href="#icon-xxx"></use>
+</svg>
+
+
+
+ +
+
+ + + diff --git a/src/styles/download (2)/font_2987621_ti92prbgh6/iconfont.css b/src/styles/download (2)/font_2987621_ti92prbgh6/iconfont.css new file mode 100644 index 0000000..2af8fda --- /dev/null +++ b/src/styles/download (2)/font_2987621_ti92prbgh6/iconfont.css @@ -0,0 +1,131 @@ +@font-face { + font-family: "iconfont"; /* Project id 2987621 */ + src: url('iconfont.woff2?t=1652068398646') format('woff2'), + url('iconfont.woff?t=1652068398646') format('woff'), + url('iconfont.ttf?t=1652068398646') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-yifahuo:before { + content: "\e65b"; +} + +.icon-daipeibu:before { + content: "\e662"; +} + +.icon-yaoqingtuandui:before { + content: "\e65a"; +} + +.icon-a-tuikuanshouhou:before { + content: "\e65c"; +} + +.icon-daifukuan:before { + content: "\e65d"; +} + +.icon-shezhi:before { + content: "\e65e"; +} + +.icon-yanseduibi:before { + content: "\e65f"; +} + +.icon-daifahuo:before { + content: "\e660"; +} + +.icon-baoguo:before { + content: "\e661"; +} + +.icon-tick-pressed:before { + content: "\e652"; +} + +.icon-wode-pressed:before { + content: "\e655"; +} + +.icon-fenlei-pressed:before { + content: "\e656"; +} + +.icon-sousuo:before { + content: "\e647"; +} + +.icon-fenxiang:before { + content: "\e648"; +} + +.icon-shaixuan:before { + content: "\e649"; +} + +.icon-gouwuche:before { + content: "\e64a"; +} + +.icon-qingkong:before { + content: "\e64c"; +} + +.icon-jia:before { + content: "\e64d"; +} + +.icon-jian:before { + content: "\e64e"; +} + +.icon-shoucang-pressed:before { + content: "\e64f"; +} + +.icon-shoucang:before { + content: "\e650"; +} + +.icon-phone:before { + content: "\e651"; +} + +.icon-tick:before { + content: "\e653"; +} + +.icon-a-moreback:before { + content: "\e654"; +} + +.icon-fenlei:before { + content: "\e657"; +} + +.icon-bianji:before { + content: "\e658"; +} + +.icon-wode:before { + content: "\e659"; +} + +.icon-sort-up-full:before { + content: "\ea4c"; +} + +.icon-sort-down-full:before { + content: "\ea4d"; +} + diff --git a/src/styles/download (2)/font_2987621_ti92prbgh6/iconfont.js b/src/styles/download (2)/font_2987621_ti92prbgh6/iconfont.js new file mode 100644 index 0000000..573da06 --- /dev/null +++ b/src/styles/download (2)/font_2987621_ti92prbgh6/iconfont.js @@ -0,0 +1 @@ +!function(a){var t,h,o,l,i,e='',d=(d=document.getElementsByTagName("script"))[d.length-1].getAttribute("data-injectcss"),p=function(a,t){t.parentNode.insertBefore(a,t)};if(d&&!a.__iconfont__svg__cssinject__){a.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}function n(){i||(i=!0,o())}function m(){try{l.documentElement.doScroll("left")}catch(a){return void setTimeout(m,50)}n()}t=function(){var a,t=document.createElement("div");t.innerHTML=e,e=null,(t=t.getElementsByTagName("svg")[0])&&(t.setAttribute("aria-hidden","true"),t.style.position="absolute",t.style.width=0,t.style.height=0,t.style.overflow="hidden",t=t,(a=document.body).firstChild?p(t,a.firstChild):a.appendChild(t))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(t,0):(h=function(){document.removeEventListener("DOMContentLoaded",h,!1),t()},document.addEventListener("DOMContentLoaded",h,!1)):document.attachEvent&&(o=t,l=a.document,i=!1,m(),l.onreadystatechange=function(){"complete"==l.readyState&&(l.onreadystatechange=null,n())})}(window); \ No newline at end of file diff --git a/src/styles/download (2)/font_2987621_ti92prbgh6/iconfont.json b/src/styles/download (2)/font_2987621_ti92prbgh6/iconfont.json new file mode 100644 index 0000000..d3e99a9 --- /dev/null +++ b/src/styles/download (2)/font_2987621_ti92prbgh6/iconfont.json @@ -0,0 +1,212 @@ +{ + "id": "2987621", + "name": "电子商城", + "font_family": "iconfont", + "css_prefix_text": "icon-", + "description": "", + "glyphs": [ + { + "icon_id": "29349174", + "name": "已发货", + "font_class": "yifahuo", + "unicode": "e65b", + "unicode_decimal": 58971 + }, + { + "icon_id": "29349143", + "name": "待配布", + "font_class": "daipeibu", + "unicode": "e662", + "unicode_decimal": 58978 + }, + { + "icon_id": "29346808", + "name": "邀请团队", + "font_class": "yaoqingtuandui", + "unicode": "e65a", + "unicode_decimal": 58970 + }, + { + "icon_id": "29346810", + "name": "退款、售后", + "font_class": "a-tuikuanshouhou", + "unicode": "e65c", + "unicode_decimal": 58972 + }, + { + "icon_id": "29346811", + "name": "待付款", + "font_class": "daifukuan", + "unicode": "e65d", + "unicode_decimal": 58973 + }, + { + "icon_id": "29346812", + "name": "设置", + "font_class": "shezhi", + "unicode": "e65e", + "unicode_decimal": 58974 + }, + { + "icon_id": "29346813", + "name": "颜色对比", + "font_class": "yanseduibi", + "unicode": "e65f", + "unicode_decimal": 58975 + }, + { + "icon_id": "29346814", + "name": "待发货", + "font_class": "daifahuo", + "unicode": "e660", + "unicode_decimal": 58976 + }, + { + "icon_id": "29346815", + "name": "包裹", + "font_class": "baoguo", + "unicode": "e661", + "unicode_decimal": 58977 + }, + { + "icon_id": "29240262", + "name": "tick-pressed", + "font_class": "tick-pressed", + "unicode": "e652", + "unicode_decimal": 58962 + }, + { + "icon_id": "29240263", + "name": "我的-pressed", + "font_class": "wode-pressed", + "unicode": "e655", + "unicode_decimal": 58965 + }, + { + "icon_id": "29240264", + "name": "分类-pressed", + "font_class": "fenlei-pressed", + "unicode": "e656", + "unicode_decimal": 58966 + }, + { + "icon_id": "29240057", + "name": "搜索", + "font_class": "sousuo", + "unicode": "e647", + "unicode_decimal": 58951 + }, + { + "icon_id": "29240058", + "name": "分享", + "font_class": "fenxiang", + "unicode": "e648", + "unicode_decimal": 58952 + }, + { + "icon_id": "29240059", + "name": "筛选", + "font_class": "shaixuan", + "unicode": "e649", + "unicode_decimal": 58953 + }, + { + "icon_id": "29240060", + "name": "购物车", + "font_class": "gouwuche", + "unicode": "e64a", + "unicode_decimal": 58954 + }, + { + "icon_id": "29240062", + "name": "清空", + "font_class": "qingkong", + "unicode": "e64c", + "unicode_decimal": 58956 + }, + { + "icon_id": "29240063", + "name": "加", + "font_class": "jia", + "unicode": "e64d", + "unicode_decimal": 58957 + }, + { + "icon_id": "29240064", + "name": "减", + "font_class": "jian", + "unicode": "e64e", + "unicode_decimal": 58958 + }, + { + "icon_id": "29240065", + "name": "收藏-pressed", + "font_class": "shoucang-pressed", + "unicode": "e64f", + "unicode_decimal": 58959 + }, + { + "icon_id": "29240066", + "name": "收藏", + "font_class": "shoucang", + "unicode": "e650", + "unicode_decimal": 58960 + }, + { + "icon_id": "29240067", + "name": "phone", + "font_class": "phone", + "unicode": "e651", + "unicode_decimal": 58961 + }, + { + "icon_id": "29240069", + "name": "tick", + "font_class": "tick", + "unicode": "e653", + "unicode_decimal": 58963 + }, + { + "icon_id": "29240070", + "name": "more,back", + "font_class": "a-moreback", + "unicode": "e654", + "unicode_decimal": 58964 + }, + { + "icon_id": "29240073", + "name": "分类", + "font_class": "fenlei", + "unicode": "e657", + "unicode_decimal": 58967 + }, + { + "icon_id": "29240074", + "name": "编辑", + "font_class": "bianji", + "unicode": "e658", + "unicode_decimal": 58968 + }, + { + "icon_id": "29240075", + "name": "我的", + "font_class": "wode", + "unicode": "e659", + "unicode_decimal": 58969 + }, + { + "icon_id": "18174913", + "name": "排序,升序", + "font_class": "sort-up-full", + "unicode": "ea4c", + "unicode_decimal": 59980 + }, + { + "icon_id": "18174920", + "name": "排序,降序", + "font_class": "sort-down-full", + "unicode": "ea4d", + "unicode_decimal": 59981 + } + ] +} diff --git a/src/styles/download (2)/font_2987621_ti92prbgh6/iconfont.ttf b/src/styles/download (2)/font_2987621_ti92prbgh6/iconfont.ttf new file mode 100644 index 0000000..1b0a908 Binary files /dev/null and b/src/styles/download (2)/font_2987621_ti92prbgh6/iconfont.ttf differ diff --git a/src/styles/download (2)/font_2987621_ti92prbgh6/iconfont.woff b/src/styles/download (2)/font_2987621_ti92prbgh6/iconfont.woff new file mode 100644 index 0000000..4f85924 Binary files /dev/null and b/src/styles/download (2)/font_2987621_ti92prbgh6/iconfont.woff differ diff --git a/src/styles/download (2)/font_2987621_ti92prbgh6/iconfont.woff2 b/src/styles/download (2)/font_2987621_ti92prbgh6/iconfont.woff2 new file mode 100644 index 0000000..ad5776c Binary files /dev/null and b/src/styles/download (2)/font_2987621_ti92prbgh6/iconfont.woff2 differ diff --git a/src/styles/iconfont.scss b/src/styles/iconfont.scss index c0db91d..946f59f 100644 --- a/src/styles/iconfont.scss +++ b/src/styles/iconfont.scss @@ -1,7 +1,6 @@ @font-face { font-family: "iconfont"; /* Project id 2987621 */ - src: - url('iconfont.ttf?t=1650013104232') format('truetype'); + src:url('iconfont.ttf?t=1652068398646') format('truetype'); } .iconfont { @@ -139,4 +138,4 @@ .icon-jian:before { content: "\e64e"; -} \ No newline at end of file +} diff --git a/src/use/useLogin.ts b/src/use/useLogin.ts index 386657d..45847ef 100644 --- a/src/use/useLogin.ts +++ b/src/use/useLogin.ts @@ -3,12 +3,12 @@ import { WX_APPID } from "@/common/constant" import useUserInfo from "./useUserInfo" import Taro, { useRouter } from "@tarojs/taro" import { LoginApi } from "@/api/login" -import { GetWxUserInfoApi } from "@/api/user" +import { GetWxUserInfoApi, GetAdminUserInfoApi, GetPhoneNumberApi } from "@/api/user" import qs from 'qs'; export default () => { - const {setToken, setSessionKey, setUserInfo, userInfo} = useUserInfo() - + const {setToken, setSessionKey, setUserInfo, setAdminUserInfo, userInfo} = useUserInfo() + useEffect(() => { console.log('userInfo::',userInfo.token) }, [userInfo]) @@ -16,6 +16,7 @@ export default () => { const router = useRouter() //登录请求 const {fetchData} = LoginApi() + //微信登录 const wxLogin = () => { return new Promise((reslove, reject) => { @@ -40,6 +41,9 @@ export default () => { url: router.path +'?' + qs.stringify(params) }) } + getAdminUserInfo() + + //todo 删除本地授权用户信息,获取最新授权信息 } else { Taro.showToast({ @@ -62,6 +66,12 @@ export default () => { } + //获取用户信息 + const {fetchData: useFetchData} = GetAdminUserInfoApi() + const getAdminUserInfo = async () => { + let res = await useFetchData() + setAdminUserInfo(res.data) + } //登录加checkLogin检查 const checkLogin = () => { @@ -89,38 +99,66 @@ export default () => { 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) + if(userInfo.adminUserInfo?.is_authorize_name) { + reslove(true) + return true } + Taro.getUserProfile({ + desc: '用于完善会员资料', + success: async (res) => { + if(!userInfo.session_key) { + await wxLogin() + } + const user_res = await fetchDataUserInfo({ + session_key: userInfo.session_key, + raw_data: res.rawData, + signature: res.signature, + encrypted_data: res.encryptedData, + iv: res.iv + }) + if(user_res.success) { + setUserInfo({...user_res.data}) + reslove(user_res.data) + getAdminUserInfo() + } else { + reject(user_res.msg) + } + + }, + fail:(e) => { + reject(e) + } + }) }) } + //获取手机号码 + const {fetchData: fetchDataUserPhone} = GetPhoneNumberApi() + const getPhoneNumber = (code) =>{ + return new Promise( async (reslove, reject) => { + if(userInfo.adminUserInfo?.is_authorize_phone) { + reslove(true) + return true + } + const res = await fetchDataUserPhone({code}) + if(res.success) { + setUserInfo({...userInfo.userInfo, phone:res.data.phone_number}) + getAdminUserInfo() + reslove(res.data) + } else { + reject(res.msg) + } + + }) + } + return { checkLogin, wxLogin, - getSelfUserInfo + getSelfUserInfo, + getPhoneNumber, + userInfo } } diff --git a/src/use/useUserInfo.ts b/src/use/useUserInfo.ts index 690a8ce..9e03fc7 100644 --- a/src/use/useUserInfo.ts +++ b/src/use/useUserInfo.ts @@ -1,6 +1,6 @@ import { useDispatch, useSelector } from 'react-redux' -import { CLEAR_SESSIONKEY, SET_USERINFO, SET_TOKEN, SET_SESSIONKEY, CLEAR_USERINFO, CLEAR_TOKEN} from '@/constants/userInfo' -import {DataParam, UserParam} from '@/reducers/userInfo' +import { CLEAR_SESSIONKEY, SET_USERINFO, SET_TOKEN, SET_SESSIONKEY, CLEAR_USERINFO, CLEAR_TOKEN, SET_ADMINUSERINFO} from '@/constants/userInfo' +import {DataParam, UserParam, UserAdminParam} from '@/reducers/userInfo' export default () => { const userInfo = useSelector((state:DataParam) => state.userInfo) as DataParam const dispatch = useDispatch() @@ -17,6 +17,10 @@ export default () => { dispatch({type:SET_USERINFO, data:{userInfo}}) } + const setAdminUserInfo = (adminUserInfo: UserAdminParam) => { + dispatch({type:SET_ADMINUSERINFO, data:{adminUserInfo}}) + } + const removeUserInfo = () => { dispatch({type:CLEAR_USERINFO}) } @@ -32,6 +36,7 @@ export default () => { return { setToken, setUserInfo, + setAdminUserInfo, setSessionKey, removeUserInfo, removeToken,