品牌模块

main
一杯沧海 1 year ago
parent 702cee4693
commit 1ca03dddf5
  1. 6
      src/app.config.ts
  2. 3
      src/pages/brand/list/components/BrandView.config.ts
  3. 176
      src/pages/brand/list/components/BrandView.tsx
  4. 4
      src/pages/brand/list/list.config.ts
  5. 43
      src/pages/brand/list/list.module.scss
  6. 84
      src/pages/brand/list/list.tsx

@ -69,6 +69,12 @@ export default defineAppConfig({
'userInfo/userInfo',
'courseAdmin/courseAdmin',
]
},
{
root: 'pages/brand',
pages: [
'list/list',
]
}
],
lazyCodeLoading: "requiredComponents"

@ -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…
Cancel
Save