Ver código fonte

写不动了

shaogen1995 8 meses atrás
pai
commit
282ffbf955

+ 1 - 0
后台管理/src/pages/B1exhibit/B1edit/index.tsx

@@ -99,6 +99,7 @@ function B1edit({ list, closeFu, editTableFu }: Props) {
             <MyPopconfirm
               txtK='删除'
               onConfirm={() => {
+                if (listRes.length <= 1) return MessageFu.warning('至少需要一个时段!')
                 setListRes(listRes.filter(v => v.id !== item.id))
                 if (!item.id.includes('新')) {
                   delIds.current.push(item.id)

+ 3 - 0
展示端/src/assets/styles/base.css

@@ -181,3 +181,6 @@ textarea {
   pointer-events: none !important;
   color: #aeaeae !important;
 }
+.myTextBox p {
+  min-height: 20px;
+}

+ 7 - 0
展示端/src/assets/styles/base.less

@@ -219,3 +219,10 @@ textarea {
   pointer-events: none !important;
   color: #aeaeae !important;
 }
+
+// 富文本
+.myTextBox {
+  p {
+    min-height: 20px;
+  }
+}

+ 3 - 3
展示端/src/components/RouterOrder.tsx

@@ -34,14 +34,14 @@ const routerArr = [
   {
     id: 4,
     name: '选择课程',
-    path: '/selectCourse',
+    path: '/selectCourse/:bookDate/:bookTime',
     exact: true,
     Com: React.lazy(() => import('@/pages/A4selectCourse'))
   },
   {
     id: 5,
     name: '填写信息',
-    path: '/order',
+    path: '/order/:id/:bookDate/:bookTime',
     exact: true,
     Com: React.lazy(() => import('@/pages/A5order'))
   },
@@ -85,7 +85,7 @@ const routerArr = [
   {
     id: 11,
     name: '展馆-填写信息',
-    path: '/exhiForm/:T/:D',
+    path: '/exhiForm/:bookDate/:index',
     exact: true,
     Com: React.lazy(() => import('@/pages/B4form'))
   },

Diferenças do arquivo suprimidas por serem muito extensas
+ 19 - 6
展示端/src/pages/A2notice/index.tsx


+ 9 - 0
展示端/src/pages/A3selectDay/data.ts

@@ -0,0 +1,9 @@
+export const A3timeChageObj = {
+  周一: 'monday',
+  周二: 'tuesday',
+  周三: 'wednesday',
+  周四: 'thursday',
+  周五: 'friday',
+  周六: 'saturday',
+  周日: 'sunday'
+}

+ 1 - 0
展示端/src/pages/A3selectDay/index.module.scss

@@ -41,6 +41,7 @@
                 align-items: center;
               }
               .A3ac {
+                pointer-events: none;
                 background-color: var(--themeColor);
                 color: #fff;
               }

+ 119 - 52
展示端/src/pages/A3selectDay/index.tsx

@@ -1,61 +1,119 @@
-import React, { useState } from 'react'
+import React, { useCallback, useEffect, useState } from 'react'
 import styles from './index.module.scss'
 import TopCom from '@/components/TopCom'
 import ZFlooBtn from '@/components/ZFlooBtn'
 import classNames from 'classnames'
 import history from '@/utils/history'
+import { A3ListApiType, A3ListType } from './type'
+import getWeekList from '@/utils/timeChange'
+import { A3timeChageObj } from './data'
+import { A3_APIgetInfoByDay } from '@/store/action/all'
+import dayjs from 'dayjs'
+import { MessageFu } from '@/utils/message'
 
-const list = [
+// 待完善后端接口没有(还应该在 当该时间段存在已通过/待审核的申请 把num变成0)
+const baseList: A3ListApiType[] = [
   {
+    createTime: '2024-04-16 17:02:48',
+    creatorId: 1,
+    creatorName: '',
+    friday: 1,
     id: 1,
-    time: '12-02 周一',
-    shang: true,
-    xia: true
+    monday: 1,
+    saturday: 1,
+    sunday: 1,
+    thursday: 1,
+    time: 'am',
+    tuesday: 1,
+    updateTime: '2024-12-14 16:22:25',
+    wednesday: 0
   },
   {
+    createTime: '2024-04-16 18:07:02',
+    creatorId: 1,
+    creatorName: '',
+    friday: 0,
     id: 2,
-    time: '12-02 周二',
-    shang: true,
-    xia: false
-  },
-  {
-    id: 3,
-    time: '12-02 周三',
-    shang: true,
-    xia: true
-  },
-  {
-    id: 4,
-    time: '12-02 周四',
-    shang: true,
-    xia: true
-  },
-  {
-    id: 5,
-    time: '12-02 周五',
-    shang: true,
-    xia: true
-  },
-  {
-    id: 6,
-    time: '12-02 周六',
-    shang: true,
-    xia: true
-  },
-  {
-    id: 7,
-    time: '12-02 周日',
-    shang: true,
-    xia: true
+    monday: 0,
+    saturday: 1,
+    sunday: 1,
+    thursday: 0,
+    time: 'pm',
+    tuesday: 1,
+    updateTime: '2024-12-14 17:40:03',
+    wednesday: 0
   }
 ]
-
 function A3selectDay() {
+  const [list, setList] = useState<A3ListType[]>([])
+
+  const [loding, setLoding] = useState(false)
+
+  // 获取日期信息(过滤掉不可预约日期)
+  const getTimeRes = useCallback(async () => {
+    const res = await A3_APIgetInfoByDay(dayjs().format('YYYY-MM-DD'))
+    if (res.code === 0) {
+      let noTime: string = res.data.stopDate
+      noTime = noTime.replaceAll('月', '-').replaceAll('日', '')
+      const noTimeArr = noTime.split(',')
+
+      setTimeout(() => {
+        setLoding(true)
+
+        const arr: A3ListType[] = []
+
+        const arrTime = getWeekList('MM-DD')
+
+        // 上午obj
+        const AMobj = baseList[0]
+
+        // 下午obj
+        const PMobj = baseList[1]
+
+        arrTime.forEach(v => {
+          if (!noTimeArr.includes(v.date)) {
+            arr.push({
+              id: v.timeStamp,
+              time: v.date,
+              txt: v.name,
+              shangNum: Reflect.get(AMobj, Reflect.get(A3timeChageObj, v.name)),
+              xiaNum: Reflect.get(PMobj, Reflect.get(A3timeChageObj, v.name))
+            })
+          }
+        })
+        // if(dayjs())
+
+        const noeXisoShi = Number(dayjs(Date.now()).format('HH'))
+        if (noeXisoShi >= 12) arr[0].shangNum = -1
+        if (noeXisoShi >= 17) arr[0].xiaNum = -1
+
+        setList(arr)
+      }, 100)
+    }
+  }, [])
+
+  useEffect(() => {
+    getTimeRes()
+  }, [getTimeRes])
+
   const [acObj, setAcObj] = useState({
     id: 0,
-    txt: ''
+    AmPm: ''
   })
 
+  // 点击上午和下午
+  // 待完善 接口返回的 usable字段 含义不明确
+  const AmPmclick = useCallback(async (idCuo: number, val: 'am' | 'pm') => {
+    const time = dayjs(idCuo).format('YYYY-MM-DD')
+    const res = await A3_APIgetInfoByDay(time)
+
+    if (res.code === 0) {
+      const flag = res.data.time.usable
+      if (flag === 0) setAcObj({ id: idCuo, AmPm: val })
+      else MessageFu.info('当前预约时段已满')
+    }
+  }, [])
+
   return (
     <div className={styles.A3selectDay}>
       <TopCom txt='选择日期' />
@@ -65,38 +123,47 @@ function A3selectDay() {
           {list.length ? (
             <div className='mySorrl'>
               {list.map(item => (
-                <div className='A3row' key={item.id}>
-                  <div className='A3R1'>{item.time}</div>
+                <div
+                  className='A3row'
+                  key={item.id}
+                  hidden={item.shangNum <= 0 && item.xiaNum <= 0}
+                >
+                  <div className='A3R1'>
+                    {item.time} {item.txt}
+                  </div>
                   <div className='A3R2'>
                     <div
-                      onClick={() => setAcObj({ id: item.id, txt: '上午' })}
+                      onClick={() => AmPmclick(item.id, 'am')}
                       className={classNames(
-                        item.id === acObj.id && acObj.txt === '上午' ? 'A3ac' : '',
-                        item.shang ? '' : 'myBtnNo'
+                        item.id === acObj.id && acObj.AmPm === 'am' ? 'A3ac' : '',
+                        item.shangNum > 0 ? '' : 'myBtnNo'
                       )}
                     >
-                      上午{item.shang ? '' : '(已满)'}
+                      {item.shangNum < 0 ? '上午已超时' : '上午'}
+                      {item.shangNum ? '' : '(已满)'}
                     </div>
                     <div
-                      onClick={() => setAcObj({ id: item.id, txt: '下午' })}
+                      onClick={() => AmPmclick(item.id, 'pm')}
                       className={classNames(
-                        item.id === acObj.id && acObj.txt === '下午' ? 'A3ac' : '',
-                        item.xia ? '' : 'myBtnNo'
+                        item.id === acObj.id && acObj.AmPm === 'pm' ? 'A3ac' : '',
+                        item.xiaNum > 0 ? '' : 'myBtnNo'
                       )}
                     >
-                      下午{item.xia ? '' : '(已满)'}
+                      下午{item.xiaNum ? '' : '(已满)'}
                     </div>
                   </div>
                 </div>
               ))}
             </div>
           ) : (
-            <div className='A3listNo'>暂无可约日期</div>
+            <div className='A3listNo' hidden={!loding}>
+              暂无可约日期
+            </div>
           )}
         </div>
         <ZFlooBtn
           txt={acObj.id ? '下一步' : '请选择日期'}
-          clickFu={() => history.push('/selectCourse')}
+          clickFu={() => history.push(`/selectCourse/${acObj.id}/${acObj.AmPm}`)}
         />
       </div>
     </div>

+ 23 - 0
展示端/src/pages/A3selectDay/type.d.ts

@@ -0,0 +1,23 @@
+export type A3ListApiType = {
+  createTime: string
+  creatorId: number
+  creatorName: string
+  friday: number
+  id: number
+  monday: number
+  saturday: number
+  sunday: number
+  thursday: number
+  time: string
+  tuesday: number
+  updateTime: string
+  wednesday: number
+}
+
+export type A3ListType = {
+  id: number
+  time: string
+  txt: string
+  shangNum: number
+  xiaNum: number
+}

+ 1 - 0
展示端/src/pages/A4selectCourse/A4look/index.module.scss

@@ -34,6 +34,7 @@
         padding-left: 24px;
         height: calc(100% - 70px);
         & > div {
+          padding-bottom: 20px;
           padding-right: 24px;
           width: 100%;
           height: 100%;

+ 30 - 15
展示端/src/pages/A4selectCourse/A4look/index.tsx

@@ -1,11 +1,11 @@
-import React, { useEffect, useMemo, useRef, useState } from 'react'
+import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
 import styles from './index.module.scss'
-import { SonType } from '..'
 import TopCom from '@/components/TopCom'
 import classNames from 'classnames'
+import { A4LookType } from '../type'
 
 type Props = {
-  info: SonType
+  info: A4LookType
   closeFu: () => void
 }
 
@@ -20,28 +20,37 @@ function A4look({ info, closeFu }: Props) {
   }, [topAc])
 
   useEffect(() => {
-    const { txt1, txt2, txt3 } = info
+    const { introRtf, teamRtf, infoRtf } = info
     let arr: string[] = []
-    if (txt1) arr.push('课程简介')
-    if (txt2) arr.push('教师简介')
-    if (txt3) arr.push('预约须知')
+    if (introRtf) arr.push('课程简介')
+    if (teamRtf) arr.push('教师简介')
+    if (infoRtf) arr.push('预约须知')
     setTopArr(arr)
 
-    if (txt1) setTopAc('课程简介')
-    else if (txt2) setTopAc('教师简介')
-    else if (txt3) setTopAc('预约须知')
+    if (introRtf) setTopAc('课程简介')
+    else if (teamRtf) setTopAc('教师简介')
+    else if (infoRtf) setTopAc('预约须知')
   }, [info])
 
   const sollrRef = useRef<HTMLDivElement>(null)
 
+  const txtChange = useCallback((val: string) => {
+    let txt = ''
+    if (val) {
+      let obj = JSON.parse(val)
+      txt = obj.txtArr[0].txt
+    }
+    return txt
+  }, [])
+
   const txtRes = useMemo(() => {
     const obj = {
-      课程简介: info.txt1,
-      教师简介: info.txt2,
-      预约须知: info.txt3
+      课程简介: txtChange(info.introRtf),
+      教师简介: txtChange(info.teamRtf),
+      预约须知: txtChange(info.infoRtf)
     }
     return Reflect.get(obj, topAc)
-  }, [info, topAc])
+  }, [info, topAc, txtChange])
 
   return (
     <div id='openDom' className={styles.A4look}>
@@ -60,7 +69,13 @@ function A4look({ info, closeFu }: Props) {
         </div>
 
         <div className='A4Ltxt'>
-          {txtRes ? <div dangerouslySetInnerHTML={{ __html: txtRes }} ref={sollrRef}></div> : null}
+          {txtRes ? (
+            <div
+              className='myTextBox'
+              dangerouslySetInnerHTML={{ __html: txtRes }}
+              ref={sollrRef}
+            ></div>
+          ) : null}
         </div>
       </div>
     </div>

Diferenças do arquivo suprimidas por serem muito extensas
+ 135 - 65
展示端/src/pages/A4selectCourse/index.tsx


+ 25 - 0
展示端/src/pages/A4selectCourse/type.d.ts

@@ -0,0 +1,25 @@
+export type A4ListApiType = {
+  creatorName: string
+  dictTypeName: string
+  id: number
+  info: string
+  infoRtf: string
+  intro: string
+  introRtf: string
+  name: string
+  sort: number
+  team: string
+  teamRtf: string
+}
+
+export type A4ListType = {
+  id: string
+  son: A4ListApiType[]
+}
+
+export type A4LookType = {
+  id: number
+  introRtf: string
+  teamRtf: string
+  infoRtf: string
+}

+ 4 - 0
展示端/src/pages/A5order/index.module.scss

@@ -29,7 +29,11 @@
           font-size: 16px;
           color: #828282;
           & > p {
+            padding-right: 20px;
             margin-bottom: 6px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
             & > span {
               font-weight: 700;
               color: var(--themeColor2);

+ 36 - 2
展示端/src/pages/A5order/index.tsx

@@ -13,6 +13,8 @@ import htmlToPdf2 from '@/utils/htmlToPdf2'
 import { MessageFu } from '@/utils/message'
 import ZinfoPop from '@/components/ZinfoPop'
 import history from '@/utils/history'
+import { useParams } from 'react-router-dom'
+import { A5_APIgetInfo } from '@/store/action/all'
 
 type FormType = {
   name: string
@@ -25,6 +27,36 @@ type FormType = {
 }
 
 function A5order() {
+  // 获取路由参数
+  const [urlObj, setUrlObj] = useState({
+    id: 0,
+    bookDate: '',
+    bookTime: '',
+    name: ''
+  })
+
+  useEffect(() => {
+    console.log('获取参数', urlObj)
+  }, [urlObj])
+
+  const urlObjTemp: any = useParams()
+
+  const getInfo = useCallback(async () => {
+    const res = await A5_APIgetInfo(Number(urlObjTemp.id))
+    if (res.code === 0) {
+      setUrlObj({
+        id: Number(urlObjTemp.id),
+        bookDate: dayjs(Number(urlObjTemp.bookDate)).format('YYYY-MM-DD'),
+        bookTime: urlObjTemp.bookTime,
+        name: res.data.name
+      })
+    }
+  }, [urlObjTemp])
+
+  useEffect(() => {
+    getInfo()
+  }, [getInfo])
+
   useEffect(() => {
     FormBoxRef.current?.setFieldsValue({
       name: '王大锤',
@@ -100,10 +132,12 @@ function A5order() {
             {/* 顶部 */}
             <div className='A5lTop'>
               <p>
-                <span>预约日期:</span>11月21日上午
+                <span>预约日期:</span>
+                {urlObj.bookDate} {urlObj.bookTime === 'am' ? '上午' : '下午'}
               </p>
               <p>
-                <span>预约课程:</span>英语课程英语课程英语
+                <span>预约课程:</span>
+                {urlObj.name}
               </p>
               {time ? (
                 <p>

+ 3 - 1
展示端/src/pages/B1exhibit/index.module.scss

@@ -24,7 +24,9 @@
     .B1btn {
       position: absolute;
       bottom: 0;
-      left: 0;
+      left: 50%;
+      transform: translateX(-50%);
+      max-width: 500px;
       width: 100%;
       height: 100px;
       background-color: #fff;

Diferenças do arquivo suprimidas por serem muito extensas
+ 19 - 6
展示端/src/pages/B1exhibit/index.tsx


+ 166 - 99
展示端/src/pages/B3start/index.tsx

@@ -1,28 +1,14 @@
-import React, { useEffect, useMemo, useState } from 'react'
+import React, { useCallback, useEffect, useMemo, useState } from 'react'
 import styles from './index.module.scss'
 import ZexhiBtn from '@/components/ZexhiBtn'
 import dayjs from 'dayjs'
-import getWeekList from '@/utils/timeChange'
+import getWeekList, { TimeChageResType } from '@/utils/timeChange'
 import classNames from 'classnames'
 import history from '@/utils/history'
+import { B1_APIgetInfoByDay } from '@/store/action/all'
+import { B3ListApiType, B3TimeArrType } from './type'
 
-type ListType = {
-  createTime: string
-  creatorId: number
-  creatorName: string
-  friday: number
-  id: number
-  monday: number
-  saturday: number
-  sunday: number
-  thursday: number
-  time: string
-  tuesday: number
-  updateTime: string
-  wednesday: number
-}[]
-
-const listTemp = [
+export const listTemp = [
   {
     createTime: '2024-05-06 17:59:02',
     creatorId: 1,
@@ -34,8 +20,8 @@ const listTemp = [
     sunday: 100,
     thursday: 1,
     time: '08:00-09:00',
-    tuesday: 0,
-    updateTime: '2024-11-04 16:47:33',
+    tuesday: 20,
+    updateTime: '2024-12-13 16:50:32',
     wednesday: 100
   },
   {
@@ -50,7 +36,7 @@ const listTemp = [
     thursday: 100,
     time: '09:00-10:00',
     tuesday: 100,
-    updateTime: '2024-11-04 16:47:33',
+    updateTime: '2024-12-13 16:50:32',
     wednesday: 100
   },
   {
@@ -65,7 +51,7 @@ const listTemp = [
     thursday: 100,
     time: '10:00-11:00',
     tuesday: 100,
-    updateTime: '2024-11-04 16:47:33',
+    updateTime: '2024-12-13 16:50:32',
     wednesday: 100
   },
   {
@@ -80,7 +66,7 @@ const listTemp = [
     thursday: 100,
     time: '11:00-12:00',
     tuesday: 100,
-    updateTime: '2024-11-04 16:47:33',
+    updateTime: '2024-12-13 16:50:33',
     wednesday: 100
   },
   {
@@ -95,7 +81,7 @@ const listTemp = [
     thursday: 100,
     time: '14:00-15:00',
     tuesday: 100,
-    updateTime: '2024-11-04 16:47:33',
+    updateTime: '2024-12-13 16:50:33',
     wednesday: 100
   },
   {
@@ -110,7 +96,7 @@ const listTemp = [
     thursday: 100,
     time: '15:00-16:00',
     tuesday: 100,
-    updateTime: '2024-11-04 16:47:34',
+    updateTime: '2024-12-13 16:50:33',
     wednesday: 100
   },
   {
@@ -125,7 +111,7 @@ const listTemp = [
     thursday: 100,
     time: '16:00-17:00',
     tuesday: 100,
-    updateTime: '2024-11-04 16:47:34',
+    updateTime: '2024-12-13 16:50:33',
     wednesday: 100
   },
   {
@@ -140,40 +126,101 @@ const listTemp = [
     thursday: 100,
     time: '17:00-18:00',
     tuesday: 100,
-    updateTime: '2024-11-04 16:47:34',
+    updateTime: '2024-12-13 16:50:33',
+    wednesday: 100
+  },
+  {
+    createTime: '2024-12-13 16:15:31',
+    creatorId: 1,
+    creatorName: '',
+    friday: 0,
+    id: 17,
+    monday: 998,
+    saturday: 100,
+    sunday: 100,
+    thursday: 100,
+    time: '02:01-05:04',
+    tuesday: 100,
+    updateTime: '2024-12-13 16:50:33',
     wednesday: 100
   }
 ]
 
-type ZhouArrType = {
-  name: string
-  date: string
-  timeStamp: number
-}[]
+// 待完善列表接口信息
 
 function B3start() {
-  const [list, setList] = useState<ListType>([])
+  const [list, setList] = useState<B3ListApiType[]>([])
+
+  const [loding, setLoding] = useState(false)
+
+  // 获取日期信息(过滤掉不可预约日期)
+  const getTimeRes = useCallback(async () => {
+    const res = await B1_APIgetInfoByDay(dayjs().format('YYYY-MM-DD'))
+
+    if (res.code === 0) {
+      setTimeout(() => {
+        let noTime: string = res.data.stopDate
+        let noTimeArr = noTime.replaceAll('月', '.').replaceAll('日', '').split(',')
+        noTimeArr = noTimeArr.map(v => dayjs().format('YYYY') + '.' + v)
+        const arr = getWeekList()
+        let arrRes: TimeChageResType[] = []
+        arr.forEach(v => {
+          if (!noTimeArr.includes(v.date)) arrRes.push(v)
+        })
+
+        if (arrRes && arrRes.length) setNowTime(arrRes[0].date)
+
+        setZhouArr(arrRes)
+
+        setLoding(true)
+        setList(listTemp)
+      }, 100)
+    }
+  }, [])
+
+  useEffect(() => {
+    getTimeRes()
+  }, [getTimeRes])
 
   useEffect(() => {
     setTimeout(() => {
-      setList(listTemp)
-    }, 100)
+      const dom: HTMLDivElement = document.querySelector('.B3selDay')!
+      if (dom) {
+        dom.scrollTo({
+          left: 1000,
+          behavior: 'smooth'
+        })
+        setTimeout(() => {
+          dom.scrollTo({
+            left: 0,
+            behavior: 'smooth'
+          })
+        }, 500)
+      }
+    }, 500)
   }, [])
 
   // 获取当前时间
   const [nowTime, setNowTime] = useState('')
 
-  // 一周日期
-  const [zhouArr, setZhouArr] = useState<ZhouArrType>([])
+  // 当天往后延申的一共七天日期
+  const [zhouArr, setZhouArr] = useState<TimeChageResType[]>([])
 
-  // 当前选中时间 返回 索引
+  // 当前选中时间 返回 周几(用索引表示)
   const indexRes = useMemo(() => {
-    return zhouArr.findIndex(v => v.date === nowTime)
+    let num = -1
+    const obj = zhouArr.find(v => v.date === nowTime)
+    if (obj) {
+      num = dayjs(obj.timeStamp).day()
+      if (num === 0) num = 6
+      else num -= 1
+    }
+    return num
   }, [nowTime, zhouArr])
 
   // 一周的所有 时段 数字 合集
   const zhouObj = useMemo(() => {
-    const obj: { [key: string]: { name: string; num: number }[] } = {
+    const obj: { [key: string]: B3TimeArrType[] } = {
       0: [],
       1: [],
       2: [],
@@ -184,13 +231,13 @@ function B3start() {
     }
 
     list.forEach(v => {
-      obj[0].push({ name: v.time, num: v.monday })
-      obj[1].push({ name: v.time, num: v.tuesday })
-      obj[2].push({ name: v.time, num: v.wednesday })
-      obj[3].push({ name: v.time, num: v.thursday })
-      obj[4].push({ name: v.time, num: v.friday })
-      obj[5].push({ name: v.time, num: v.saturday })
-      obj[6].push({ name: v.time, num: v.sunday })
+      obj[0].push({ id: v.id, name: v.time, num: v.monday })
+      obj[1].push({ id: v.id, name: v.time, num: v.tuesday })
+      obj[2].push({ id: v.id, name: v.time, num: v.wednesday })
+      obj[3].push({ id: v.id, name: v.time, num: v.thursday })
+      obj[4].push({ id: v.id, name: v.time, num: v.friday })
+      obj[5].push({ id: v.id, name: v.time, num: v.saturday })
+      obj[6].push({ id: v.id, name: v.time, num: v.sunday })
     })
 
     return obj
@@ -198,7 +245,7 @@ function B3start() {
 
   // 返回的数据
   const numRes = useMemo(() => {
-    let arr: { name: string; num: number }[] = []
+    let arr: B3TimeArrType[] = []
 
     if (indexRes > -1) arr = zhouObj[indexRes]
     // console.log(123, arr)
@@ -207,70 +254,90 @@ function B3start() {
     // const index = nowTime.
   }, [indexRes, zhouObj])
 
-  useEffect(() => {
-    setNowTime(dayjs().format('YYYY.MM.DD'))
-
-    const nowWrrk = dayjs().day()
-    if ([0, 5, 6].includes(nowWrrk)) {
-      setTimeout(() => {
-        const dom: HTMLDivElement = document.querySelector('.B3selDay')!
-        if (dom)
-          dom.scrollTo({
-            left: 1000,
-            behavior: 'smooth'
-          })
-      }, 100)
-    }
-
-    const arr = getWeekList()
-    setZhouArr(arr)
-  }, [])
-
-  const [acInd, setAcInd] = useState(-1)
+  const [acInd, setAcInd] = useState({
+    index: -1,
+    id: 0
+  })
 
   const pageInd = useMemo(() => {
     let num = 0
-    if (numRes[acInd] && numRes[acInd].num) num = numRes[acInd].num
+    if (numRes[acInd.index] && numRes[acInd.index].num) num = numRes[acInd.index].num
     return num
   }, [acInd, numRes])
 
+  // 判断当天时间是否已经超时
+  const nowDayFlag = useCallback(
+    (time: string) => {
+      // true 表示当前时间已经超过了可预约时间
+      let flag = true
+      // 不是当天 直接为 false(表示全部可选择)
+      if (nowTime !== dayjs().format('YYYY.MM.DD')) flag = false
+      else {
+        const lastTime = Number(time.split('-')[1].split(':')[0])
+        const noeXisoShi = Number(dayjs(Date.now()).format('HH'))
+        if (lastTime > noeXisoShi) flag = false
+        // console.log(123, lastTime, noeXisoShi)
+      }
+
+      return flag
+    },
+    [nowTime]
+  )
+
   return (
     <div className={styles.B3start}>
       <div className='B3main'>
         <div className='B3tit'>选择日期</div>
         <div className='B3nowTime'>{nowTime}</div>
-        <div className='B3selDay'>
-          {zhouArr.map((item, index) => (
-            <div
-              key={item.name}
-              className={classNames('B3dayRow', nowTime === item.date ? 'B3dayRowAc' : '')}
-              onClick={() => setNowTime(item.date)}
-            >
-              <div>{item.name}</div>
-              <div>{item.date.slice(-2)}</div>
-            </div>
-          ))}
-        </div>
+
+        {zhouArr.length ? (
+          <div className='B3selDay'>
+            {zhouArr.map(item => (
+              <div
+                key={item.name}
+                className={classNames('B3dayRow', nowTime === item.date ? 'B3dayRowAc' : '')}
+                onClick={() => setNowTime(item.date)}
+              >
+                <div>{item.name}</div>
+                <div>{item.date.slice(-2)}</div>
+              </div>
+            ))}
+          </div>
+        ) : (
+          <div hidden={!loding} style={{ fontSize: '20px', marginBottom: '30px' }}>
+            无可预约日期
+          </div>
+        )}
+
         <div className='B3tit'>入馆时间</div>
-        <div className='B3time'>
-          {numRes.map((item, index) => (
-            <div
-              key={item.name}
-              onClick={() => setAcInd(index)}
-              className={classNames(
-                'B3timeRow',
-                acInd === index ? 'B3timeRowAc' : '',
-                item.num <= 0 ? 'myBtnNo' : ''
-              )}
-            >
-              {item.name}
 
-              {item.num <= 0 ? <p>预约已满</p> : ''}
-            </div>
-          ))}
-        </div>
+        {numRes.length ? (
+          <div className='B3time'>
+            {numRes.map((item, index) => (
+              <div
+                key={item.name}
+                onClick={() => setAcInd({ index, id: item.id })}
+                className={classNames(
+                  'B3timeRow',
+                  acInd.index === index ? 'B3timeRowAc' : '',
+                  item.num <= 0 || nowDayFlag(item.name) ? 'myBtnNo' : ''
+                )}
+              >
+                {item.name}
+                {item.num <= 0 ? <p>预约已满</p> : ''}
+              </div>
+            ))}
+          </div>
+        ) : (
+          <span hidden={!loding} style={{ fontSize: '20px' }}>
+            请先选择日期
+          </span>
+        )}
       </div>
-      <ZexhiBtn nextOk={!!pageInd} nextFu={() => history.push(`/exhiForm/${indexRes}/${acInd}`)} />
+      <ZexhiBtn
+        nextOk={!!pageInd}
+        nextFu={() => history.push(`/exhiForm/${nowTime.replaceAll('.', '_')}/${acInd.index}`)}
+      />
     </div>
   )
 }

+ 17 - 0
展示端/src/pages/B3start/type.d.ts

@@ -0,0 +1,17 @@
+export type B3ListApiType = {
+  createTime: string
+  creatorId: number
+  creatorName: string
+  friday: number
+  id: number
+  monday: number
+  saturday: number
+  sunday: number
+  thursday: number
+  time: string
+  tuesday: number
+  updateTime: string
+  wednesday: number
+}
+
+export type B3TimeArrType = { name: string; num: number; id: number }

+ 47 - 4
展示端/src/pages/B4form/index.module.scss

@@ -1,5 +1,48 @@
-.AAAAA{
-  :global{
-    
+.B4form {
+  position: relative;
+  background-image: url('../../assets/img/selectCourse/bg.jpg');
+  background-size: cover;
+  :global {
+    .B4main {
+      height: calc(100% - 100px);
+      padding: 26px 24px;
+      .B4top {
+        height: 130px;
+        position: relative;
+        left: -8px;
+        width: calc(100% + 16px);
+        background-image: url(../../assets/img/order/top.png);
+        background-size: 100% 100%;
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        padding: 0 0 4px 13%;
+        font-size: 16px;
+        color: #828282;
+        & > p {
+          padding-right: 20px;
+          margin-bottom: 6px;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          white-space: nowrap;
+          & > span {
+            font-weight: 700;
+            color: var(--themeColor2);
+          }
+        }
+      }
+      .B4addBtn {
+        height: 60px;
+        border-radius: 6px;
+        background-color: var(--themeColor2);
+        color: #fff;
+        font-size: 18px;
+        font-weight: 700;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        margin-bottom: 15px;
+      }
+    }
   }
-}
+}

+ 53 - 8
展示端/src/pages/B4form/index.tsx

@@ -1,14 +1,59 @@
-import React from "react";
-import styles from "./index.module.scss";
- function AAAAA() {
-  
+import React, { useEffect, useState } from 'react'
+import styles from './index.module.scss'
+import { useParams } from 'react-router-dom'
+// 待完善 上个页面的数组接口
+import { listTemp } from '../B3start'
+import ZexhiBtn from '@/components/ZexhiBtn'
+
+function B4form() {
+  // 获取路由参数 bookId待完善(存疑)
+  const [urlObj, setUrlObj] = useState({
+    bookDate: '',
+    bookId: 0,
+    time: ''
+  })
+
+  useEffect(() => {
+    console.log('获取参数', urlObj)
+  }, [urlObj])
+
+  const urlObjTemp: any = useParams()
+
+  useEffect(() => {
+    const index = Number(urlObjTemp.index)
+
+    setUrlObj({
+      bookDate: urlObjTemp.bookDate.replaceAll('_', '-'),
+      bookId: listTemp[index].id,
+      time: listTemp[index].time
+    })
+  }, [urlObjTemp])
+
   return (
-    <div className={styles.AAAAA}>
-      <h1>AAAAA</h1>
+    <div className={styles.B4form}>
+      <div className='B4main'>
+        <div className='B4top'>
+          <p>
+            <span>预约日期:</span>
+            {urlObj.bookDate}
+          </p>
+          <p>
+            <span>入馆时间:</span>
+            {urlObj.time}
+          </p>
+        </div>
+
+        {/* 按钮 */}
+        <div className='B4addBtn'>新增参观人(最多3位)</div>
+
+        <div>1234564</div>
+      </div>
+
+      <ZexhiBtn nextFu={() => {}} />
     </div>
   )
 }
 
-const MemoAAAAA = React.memo(AAAAA);
+const MemoB4form = React.memo(B4form)
 
-export default MemoAAAAA;
+export default MemoB4form

+ 2 - 2
展示端/src/pages/Z1login/index.tsx

@@ -2,13 +2,13 @@ import React, { useCallback, useEffect, useState } from 'react'
 import styles from './index.module.scss'
 import TopCom from '@/components/TopCom'
 import { Button } from 'antd'
-import history, { toHomeFu } from '@/utils/history'
+import { toHomeFu } from '@/utils/history'
 import { setTokenInfo } from '@/utils/storage'
 import { MessageFu } from '@/utils/message'
 function Z1login() {
   // 获取用户openID(微信授权)
   const getUserCode = useCallback(() => {
-    window.location.href = 'http://192.168.20.55:3000/#/login?code=xxxx'
+    window.location.href = 'http://192.168.20.55:3001/#/login?code=xxxx'
     //此处的ID是在文档的开发-基本配置里面
     // let appid = 'wx3d4f2e0cfc3b8e54'
     // let url = 'https://sit-wuxicishan.4dage.com/unityForPad/index.html'

+ 36 - 4
展示端/src/store/action/all.ts

@@ -1,8 +1,40 @@
 import http from '@/utils/http'
 
 /**
- * 获取浏览量
+ * 获取当前日期的配置信息(发送当天日期拿不可预约日期)
  */
-// export const getvisit = () => {
-//   return http.get('show/visit/add/visit')
-// }
+export const A3_APIgetInfoByDay = (day: string) => {
+  return http.get(`wx/book/config?date=${day}`)
+}
+
+/**
+ * 获取课堂列表(选择课程)
+ */
+export const A4_APIgetList = () => {
+  const obj = { pageNum: 1, pageSize: 99999 }
+
+  return http.post('wx/subject/pageList', obj)
+}
+
+/**
+ * 获取课堂详情-通过id
+ */
+export const A5_APIgetInfo = (id: number) => {
+  return http.get(`wx/subject/detail/${id}`)
+}
+
+/**
+ * 团体认证 - 检查
+ */
+export const A4_APIcheck = () => {
+  return http.get('wx/auth/check')
+}
+
+// ------------------展馆
+
+/**
+ * 获取当前日期的配置信息(发送当天日期拿不可预约日期)
+ */
+export const B1_APIgetInfoByDay = (day: string) => {
+  return http.get(`exhibition/book/config?date=${day}`)
+}

+ 2 - 2
展示端/src/utils/http.ts

@@ -6,8 +6,8 @@ import { domShowFu } from './domShow'
 
 const envFlag = process.env.NODE_ENV === 'development'
 
-const baseUrlTemp = 'https://sit-liushaoqibwg.4dage.com' // 测试环境
-// const baseUrlTemp = 'http://192.168.20.61:8072' // 线下环境
+// const baseUrlTemp = 'https://sit-liushaoqibwg.4dage.com' // 测试环境
+const baseUrlTemp = 'http://192.168.20.61:8091' // 线下环境
 
 const baseFlag = baseUrlTemp.includes('https://')
 

+ 64 - 35
展示端/src/utils/timeChange.ts

@@ -1,46 +1,75 @@
 import dayjs from 'dayjs'
 
 // 获取当天0点的时间戳
-const getStartTime = (time: number) => {
-  const nowTimeDate = new Date(time)
-  return nowTimeDate.setHours(0, 0, 0, 0)
-}
+// const getStartTime = (time: number) => {
+//   const nowTimeDate = new Date(time)
+//   return nowTimeDate.setHours(0, 0, 0, 0)
+// }
 // 时间戳转日期格式
-const timestampToTime = (timestamp: number) => {
-  return dayjs(timestamp).format('YYYY.MM.DD')
-}
+// const timestampToTime = (timestamp: number, str?: string) => {
+//   return dayjs(timestamp).format(str ? str : 'YYYY.MM.DD')
+// }
 // 获取一周的日期
-const getWeekList = () => {
-  let week = []
-  for (var i = 0; i < 7; i++) {
-    let weekObj = {
-      name: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'][i],
-      date: '',
-      timeStamp: 0
-    }
-    week.push(weekObj)
-  }
-  let today = getStartTime(Number(new Date())) // 当天时间戳
-  let today_week = new Date().getDay() // 当天星期几
-  if (today_week === 0) {
-    // 若当天为周日
-    week[6].timeStamp = today
-  } else {
-    week[today_week - 1].timeStamp = today
-  }
+// const getWeekList = (str?: string): TimeChageResType[] => {
+//   let week = []
+//   for (var i = 0; i < 7; i++) {
+//     let weekObj = {
+//       name: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'][i],
+//       date: '',
+//       timeStamp: 0
+//     }
+//     week.push(weekObj)
+//   }
+//   let today = getStartTime(Number(new Date())) // 当天时间戳
+//   let today_week = new Date().getDay() // 当天星期几
+//   if (today_week === 0) {
+//     // 若当天为周日
+//     week[6].timeStamp = today
+//   } else {
+//     week[today_week - 1].timeStamp = today
+//   }
 
-  var leftNum = today_week - 1 // 本周内今天的前几天的数量
-  var rightNum = 7 - today_week // 本周内今天的后几天的数量
+//   var leftNum = today_week - 1 // 本周内今天的前几天的数量
+//   var rightNum = 7 - today_week // 本周内今天的后几天的数量
 
-  for (var left = 0; left < leftNum; left++) {
-    week[left].timeStamp = today - (today_week - left - 1) * 1000 * 60 * 60 * 24
-  }
-  for (var right = 0; right < rightNum; right++) {
-    week[right + today_week].timeStamp = today + (right + 1) * 1000 * 60 * 60 * 24
+//   for (var left = 0; left < leftNum; left++) {
+//     week[left].timeStamp = today - (today_week - left - 1) * 1000 * 60 * 60 * 24
+//   }
+//   for (var right = 0; right < rightNum; right++) {
+//     week[right + today_week].timeStamp = today + (right + 1) * 1000 * 60 * 60 * 24
+//   }
+//   week.map(el => (el.date = timestampToTime(el.timeStamp, str)))
+//   const weekList = JSON.parse(JSON.stringify(week))
+//   return weekList
+// }
+
+// ---------以上为获取当前星期
+
+// ---------以下为往后延申6天
+
+const weekArr = ['日', '一', '二', '三', '四', '五', '六']
+
+const getWeekList = (str?: string): TimeChageResType[] => {
+  let today = Date.now() // 当天时间戳
+
+  let arr: TimeChageResType[] = []
+
+  for (var i = 0; i < 7; i++) {
+    let timeCuo = today + i * 1000 * 60 * 60 * 24
+    arr.push({
+      name: '周' + weekArr[dayjs(timeCuo).day()],
+      date: dayjs(timeCuo).format(str ? str : 'YYYY.MM.DD'),
+      timeStamp: timeCuo
+    })
   }
-  week.map(el => (el.date = timestampToTime(el.timeStamp)))
-  const weekList = JSON.parse(JSON.stringify(week))
-  return weekList
+
+  return arr
 }
 
 export default getWeekList
+
+export type TimeChageResType = {
+  name: string
+  date: string
+  timeStamp: number
+}