parent
541be630b5
commit
3924f35f18
@ -0,0 +1,3 @@ |
|||||||
|
export default definePageConfig({ |
||||||
|
navigationBarTitleText: '登记', |
||||||
|
}) |
@ -0,0 +1,176 @@ |
|||||||
|
import {FC, useCallback, useEffect, useState} from "react"; |
||||||
|
import {Form, Input, View} from "@tarojs/components"; |
||||||
|
import Taro, {useRouter} from "@tarojs/taro"; |
||||||
|
import {userApi, loginApi, LoginParams, meetingAPi, Meeting} from "@/api"; |
||||||
|
import {Profile} from '@/store' |
||||||
|
import {regexTel} from "@/utils/regu"; |
||||||
|
import MyButton from "@/components/button/MyButton"; |
||||||
|
|
||||||
|
interface Params { |
||||||
|
meeting_id: string |
||||||
|
phone_number?: string |
||||||
|
user_name?: string |
||||||
|
} |
||||||
|
|
||||||
|
const MeetingLogin: FC = () => { |
||||||
|
const {setUser, setToken, setCompany} = Profile.useContainer() |
||||||
|
const [codeTime, setCodeTime] = useState(0) |
||||||
|
const [phone_number, setPhone_number] = useState<number | null>() |
||||||
|
const [userName, setUserName] = useState('') |
||||||
|
const [code, setCode] = useState('') |
||||||
|
const [h5params, setH5Params] = useState<LoginParams | null>(null) |
||||||
|
const [meeting, setMeeting] = useState<Meeting | null>(null) |
||||||
|
const params = useRouter().params as unknown as Params |
||||||
|
|
||||||
|
useEffect(() => { |
||||||
|
loginApi.getMeetingParams().then((res) => { |
||||||
|
setH5Params(res) |
||||||
|
}) |
||||||
|
if (params.user_name && params.phone_number) { |
||||||
|
setPhone_number(Number(params.phone_number)) |
||||||
|
setUserName(params.user_name) |
||||||
|
Taro.showToast({title: '验证码错误', icon: 'error'}) |
||||||
|
} |
||||||
|
}, []) |
||||||
|
|
||||||
|
|
||||||
|
useEffect(() => { |
||||||
|
if (codeTime > 0) { |
||||||
|
setTimeout(() => { |
||||||
|
setCodeTime(codeTime - 1) |
||||||
|
}, 1000) |
||||||
|
} |
||||||
|
}, [codeTime]) |
||||||
|
|
||||||
|
Taro.useLoad(() => { |
||||||
|
meetingAPi.meetingInfo(params.meeting_id).then(res => { |
||||||
|
if (res.type !== 1) { |
||||||
|
Taro.showModal({ |
||||||
|
title: res.type === 0 ? '暂未开始' : '二维码已过期', |
||||||
|
success() { |
||||||
|
Taro.reLaunch({url: '/pages/login/login'}) |
||||||
|
} |
||||||
|
}) |
||||||
|
return |
||||||
|
} |
||||||
|
setMeeting(res.data) |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
function submit(e) { |
||||||
|
const value = e.detail.value |
||||||
|
if (!value.user_name) { |
||||||
|
Taro.showToast({title: '请写用户名', icon: "error"}) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
if (!regexTel.exec(value.phone_number)) { |
||||||
|
Taro.showToast({title: '手机号错误', icon: 'error'}) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
if (!value.phone_code) { |
||||||
|
Taro.showToast({title: '请获取手机验证码', icon: 'error'}) |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (process.env.TARO_ENV === 'h5') { |
||||||
|
if (h5params == null) { |
||||||
|
Taro.showToast({title: '页面参数错误,请刷新页面!', icon: 'error'}) |
||||||
|
return; |
||||||
|
} |
||||||
|
location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?" + |
||||||
|
"appid=" + h5params!.appid + |
||||||
|
"&redirect_uri=" + |
||||||
|
encodeURIComponent( |
||||||
|
h5params!.route + |
||||||
|
`?dep_id=${meeting?.dep_id}&company_id=${meeting?.companyId}&phone_number=${value.phone_number}&user_name=${value.user_name}&meeting_id=${params.meeting_id}&phone_code=${value.phone_code}` |
||||||
|
) + |
||||||
|
"&response_type=code" + |
||||||
|
"&scope=snsapi_userinfo" + |
||||||
|
"#wechat_redirect"; |
||||||
|
} else { |
||||||
|
Taro.login({ |
||||||
|
success: async (res) => { |
||||||
|
const data = await userApi.meetingSave({ |
||||||
|
...value, |
||||||
|
code: res.code, |
||||||
|
meeting_id: params.meeting_id |
||||||
|
}) |
||||||
|
setCompany(data.company) |
||||||
|
setUser(data.user) |
||||||
|
setToken(data.token) |
||||||
|
Taro.switchTab({url: '/pages/index/index'}) |
||||||
|
}, |
||||||
|
fail: () => { |
||||||
|
Taro.showToast({title: '获取微信登录失败', icon: "error"}) |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
const getCode = useCallback(async () => { |
||||||
|
if (codeTime > 0) return; |
||||||
|
if (!phone_number || !regexTel.exec(String(phone_number))) { |
||||||
|
Taro.showToast({title: '请输入正确的手机号', icon: 'error'}) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
await userApi.getCode(phone_number) |
||||||
|
Taro.showToast({title: '请注意查收', icon: "none"}) |
||||||
|
setCodeTime(60) |
||||||
|
} catch (e) { |
||||||
|
Taro.showToast({title: '获取短信验证码失败', icon: "error"}) |
||||||
|
} |
||||||
|
}, [codeTime, phone_number]) |
||||||
|
|
||||||
|
return ( |
||||||
|
<View style={{position: 'fixed', top: 0, left: 0, bottom: 0, right: 0, padding: "0 15px", background: '#fff'}}> |
||||||
|
<Form className='form' onSubmit={submit}> |
||||||
|
|
||||||
|
<View className='item'> |
||||||
|
<View>用户名</View> |
||||||
|
<Input |
||||||
|
placeholder='请输入用户名' |
||||||
|
focus |
||||||
|
name='user_name' |
||||||
|
value={userName} |
||||||
|
onInput={(e) => setUserName(e.detail.value)}/> |
||||||
|
</View> |
||||||
|
|
||||||
|
<View className='item'> |
||||||
|
<View>手机号</View> |
||||||
|
<Input |
||||||
|
type='number' |
||||||
|
name='phone_number' |
||||||
|
placeholder={'请输入手机号'} |
||||||
|
value={phone_number as unknown as string} |
||||||
|
onInput={(e) => setPhone_number(Number(e.detail.value))}/> |
||||||
|
</View> |
||||||
|
|
||||||
|
|
||||||
|
<View className='item'> |
||||||
|
<View>验证码</View> |
||||||
|
<View className='flex flex-1'> |
||||||
|
<Input |
||||||
|
type='number' |
||||||
|
name='phone_code' |
||||||
|
className='flex-1 mr-2' |
||||||
|
value={code} |
||||||
|
onInput={(e) => setCode(e.detail.value)} |
||||||
|
placeholder='输入验证码'/> |
||||||
|
<View onClick={getCode}> |
||||||
|
{codeTime > 0 ? `${codeTime}` : '获取验证码'} |
||||||
|
</View> |
||||||
|
</View> |
||||||
|
</View> |
||||||
|
|
||||||
|
<MyButton className='mt-3' formType='submit'>登记</MyButton> |
||||||
|
</Form> |
||||||
|
</View> |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
export default MeetingLogin |
@ -0,0 +1,4 @@ |
|||||||
|
export default definePageConfig({ |
||||||
|
navigationBarTitleText: '见面会记录', |
||||||
|
onReachBottomDistance: 30 |
||||||
|
}) |
@ -0,0 +1,43 @@ |
|||||||
|
.meeting { |
||||||
|
display: flex; |
||||||
|
justify-content: space-between; |
||||||
|
margin-bottom: 20rpx; |
||||||
|
} |
||||||
|
|
||||||
|
.title { |
||||||
|
position: relative; |
||||||
|
flex: 1; |
||||||
|
width: 70%; |
||||||
|
background: #fff; |
||||||
|
padding: 20rpx; |
||||||
|
border-radius: 10rpx; |
||||||
|
overflow: hidden; |
||||||
|
box-sizing: border-box; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
.overdue { |
||||||
|
position: absolute; |
||||||
|
top: 0; |
||||||
|
bottom: 0; |
||||||
|
right: 0; |
||||||
|
left: 0; |
||||||
|
text-align: center; |
||||||
|
color: #fff; |
||||||
|
display: flex; |
||||||
|
justify-content: center; |
||||||
|
align-items: center; |
||||||
|
background: rgba(#000, .8); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
.del { |
||||||
|
border-radius: 10rpx; |
||||||
|
background: #FF3A2F; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
color: #fff; |
||||||
|
width: 100rpx; |
||||||
|
justify-content: center; |
||||||
|
margin-left: 20rpx; |
||||||
|
} |
@ -0,0 +1,84 @@ |
|||||||
|
import {FC, useCallback, useEffect, useState} from "react"; |
||||||
|
import {View} from "@tarojs/components"; |
||||||
|
import {Meeting, meetingAPi} from "@/api"; |
||||||
|
import styles from './meetings.module.scss' |
||||||
|
import Taro, {useReachBottom} from "@tarojs/taro"; |
||||||
|
import Empty from "@/components/empty/empty"; |
||||||
|
import {formatDate} from "@/utils/time"; |
||||||
|
|
||||||
|
const MeetingsConfig: FC = () => { |
||||||
|
const [page, setPage] = useState(1) |
||||||
|
const [meeting, setMeeting] = useState<Meeting[]>([]) |
||||||
|
const [total, setTotal] = useState(0) |
||||||
|
|
||||||
|
const getData = useCallback(async () => { |
||||||
|
try { |
||||||
|
const res = await meetingAPi.setList(1, 10) |
||||||
|
setTotal(res.total) |
||||||
|
setMeeting([ |
||||||
|
...(meeting || []), |
||||||
|
...res.data |
||||||
|
]) |
||||||
|
} catch (e) { |
||||||
|
} |
||||||
|
}, [page]) |
||||||
|
|
||||||
|
function del(id: number, index: number) { |
||||||
|
try { |
||||||
|
Taro.showModal({ |
||||||
|
title: '确定删除', |
||||||
|
async success({confirm}) { |
||||||
|
if (confirm) { |
||||||
|
await meetingAPi.del(id) |
||||||
|
|
||||||
|
const oldMeeting: Meeting[] = JSON.parse(JSON.stringify(meeting)) |
||||||
|
oldMeeting.splice(index, 1) |
||||||
|
setMeeting(oldMeeting) |
||||||
|
} |
||||||
|
} |
||||||
|
}) |
||||||
|
} catch (e) { |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function jumpInfo(item: Meeting) { |
||||||
|
if (Date.now() > item.estimate_end_time || item.status > 0) { |
||||||
|
return |
||||||
|
} |
||||||
|
Taro.navigateTo({url: `/pages/manage/spotMeeting/spotMeeting?id=${item.id}`}) |
||||||
|
} |
||||||
|
|
||||||
|
useReachBottom(useCallback(() => { |
||||||
|
if (meeting?.length < total) { |
||||||
|
setPage(page + 1) |
||||||
|
} |
||||||
|
}, [total, meeting])) |
||||||
|
|
||||||
|
useEffect(() => { |
||||||
|
getData() |
||||||
|
}, [page]) |
||||||
|
|
||||||
|
return ( |
||||||
|
<View className='p-2'> |
||||||
|
|
||||||
|
{ |
||||||
|
meeting.length ? |
||||||
|
meeting.map((d, index) => <View className={styles.meeting} key={d.id}> |
||||||
|
<View className={styles.title} onClick={() => jumpInfo(d)}> |
||||||
|
<View className='font-weight mb-1'>{d.name}</View> |
||||||
|
<View>{formatDate(new Date(d.estimate_start_time), "MM-dd")} 至 {formatDate(new Date(d.estimate_start_time), "MM-dd")}</View> |
||||||
|
{ |
||||||
|
(Date.now() > d.estimate_end_time || d.status > 1) && <View className={styles.overdue}> |
||||||
|
{d.status > 1 ? '已结束' : "已过期"} |
||||||
|
</View> |
||||||
|
} |
||||||
|
</View> |
||||||
|
<View className={styles.del} onClick={() => del(d.id, index)}>删除</View> |
||||||
|
</View>) |
||||||
|
: <Empty name='无历史记录'/> |
||||||
|
} |
||||||
|
</View> |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
export default MeetingsConfig |
Loading…
Reference in new issue