提交 045dbce7 作者: 余乾开

Merge branch 'master' into feature/chuck

...@@ -8,9 +8,34 @@ export interface RegionResp { ...@@ -8,9 +8,34 @@ export interface RegionResp {
pid: number; pid: number;
} }
export interface UserInfoParams {
userAccountId: number;
}
export interface UserInfoResp {
id: number;
accountType: number;
uid: string;
phoneNum: string;
userName: string;
nickName: string;
userImg: string;
userSex: number;
email: string;
source: number;
accountStatus: number;
remark: string;
portType: number;
createTime: string;
}
export default { export default {
//获取区域数据 //获取区域数据
region: (): Promise<Response<Array<RegionResp>>> => { region: (): Promise<Response<Array<RegionResp>>> => {
return request("/pms/webDevice/getSecondDistrictInfo"); return request("/pms/webDevice/getSecondDistrictInfo");
}, },
//获取用户基本信息
userInfo: (params: UserInfoParams): Promise<Response<UserInfoResp>> => {
return request("/userapp/user-account/info", "get", params, {});
},
}; };
...@@ -78,8 +78,4 @@ ...@@ -78,8 +78,4 @@
background: none; background: none;
} }
.headImg {
width: 48px;
height: 48px;
background: #ffffff;
}
import React, { useState } from "react"; import React, { useEffect, useState } from "react";
import { Avatar, Button, Space, Tabs } from "antd"; import { Avatar, Button, Space, Tabs } from "antd";
import type { TabsProps } from "antd"; import type { TabsProps } from "antd";
import styles from "./index.module.scss"; import styles from "./index.module.scss";
...@@ -6,6 +6,7 @@ import { useRouter } from "next/router"; ...@@ -6,6 +6,7 @@ import { useRouter } from "next/router";
import LoginModal from "~/components/loginModal"; import LoginModal from "~/components/loginModal";
import { useUser } from "~/lib/hooks"; import { useUser } from "~/lib/hooks";
import PublishModal from "./publishModal"; import PublishModal from "./publishModal";
import JoinModal from "./joinModal";
const items: TabsProps["items"] = [ const items: TabsProps["items"] = [
{ {
...@@ -40,10 +41,14 @@ const items: TabsProps["items"] = [ ...@@ -40,10 +41,14 @@ const items: TabsProps["items"] = [
export default function NavHeader() { export default function NavHeader() {
const router = useRouter(); const router = useRouter();
const currentPath = router.asPath; const [currentPath, setCurrentPath] = useState("");
const user = useUser(); const user = useUser();
useEffect(() => {
setCurrentPath(router.route);
console.log("currentHash", currentPath); console.log("currentHash", currentPath);
}, [router.route]);
const onChange = (key: string) => { const onChange = (key: string) => {
router.push(key); router.push(key);
}; };
...@@ -59,13 +64,15 @@ export default function NavHeader() { ...@@ -59,13 +64,15 @@ export default function NavHeader() {
setPpenLoginModal(false); setPpenLoginModal(false);
}; };
const [openJoinModal, setOpenJoinModal] = useState(false); //加盟modal
return ( return (
<div className={styles.navHeader}> <div className={styles.navHeader}>
<div className={styles.nav}> <div className={styles.nav}>
<div className={styles.logo}></div> <div className={styles.logo}></div>
<Tabs <Tabs
className={styles.tabs} className={styles.tabs}
defaultActiveKey={currentPath} activeKey={currentPath}
items={items} items={items}
onChange={onChange} onChange={onChange}
/> />
...@@ -77,11 +84,16 @@ export default function NavHeader() { ...@@ -77,11 +84,16 @@ export default function NavHeader() {
> >
+ 发布需求 + 发布需求
</Button> </Button>
<Button className={styles.btn2}>加盟入驻</Button> <Button
className={styles.btn2}
onClick={() => setOpenJoinModal(true)}
>
加盟入驻
</Button>
</Space> </Space>
{user ? ( {user ? (
<div className={styles.haedImg}> <div className={styles.haedImg}>
<Avatar size={48} style={{ background: "#fff" }}></Avatar> <Avatar size={36} style={{ background: "#bdbdbd" }}></Avatar>
</div> </div>
) : ( ) : (
<Button <Button
...@@ -94,7 +106,18 @@ export default function NavHeader() { ...@@ -94,7 +106,18 @@ export default function NavHeader() {
)} )}
</div> </div>
<LoginModal open={openLoginModal} onCancel={handleCancel}></LoginModal> <LoginModal open={openLoginModal} onCancel={handleCancel}></LoginModal>
<PublishModal open={openPublishModal} onCancel={() => {setOpenPublishModal(false)}}></PublishModal> <PublishModal
open={openPublishModal}
onCancel={() => {
setOpenPublishModal(false);
}}
></PublishModal>
<JoinModal
open={openJoinModal}
onCancel={() => {
setOpenJoinModal(false);
}}
></JoinModal>
</div> </div>
); );
} }
import request, { Response } from "~/api/request"
export interface ListTagResp {
id: number;
tagName: string;
tagImg?: string;
tagDescription: string;
createTime: string;
}
export default {
//加盟标签列表
listTag: (): Promise<Response<Array<ListTagResp>>> => {
return request('/userapp/cooperation/listTag')
}
}
\ No newline at end of file
.identityBtn {
box-sizing: border-box;
padding: 0 5px;
position: absolute;
bottom: 0;
left: 50%;
transform:translate(-50%, 0);
min-width: 100%;
height: 24px;
background: #e26329;
border-radius: 6px;
opacity: 0.95;
display: flex;
justify-content: center;
align-items: center;
font-size: 12px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #fff;
white-space: nowrap;
}
.modal {
:global .ant-modal-content {
border-radius: 6px;
.ant-modal-title{
text-align: center;
}
}
}
import { Col, Modal, Row } from "antd";
import Image from "next/image";
import styles from "./index.module.scss";
import img from "./assets/img.png";
import { useEffect, useState } from "react";
import api, { ListTagResp } from "./api";
type Props = {
open?: boolean;
onOk?: () => void;
onCancel?: () => void;
};
export default function JoinModal(props: Props) {
const test = [
{
name: '飞手培训机构',
id: 0
}
];
const [tagList, setTagList] = useState<ListTagResp[]>([]);
useEffect(() => {
api.listTag().then(res => {
setTagList(res.result || []);
})
}, [])
return (
<Modal
title="申请合作加盟"
open={props.open}
onOk={props.onOk}
onCancel={props.onCancel}
className={styles.modal}
width={460}
footer={null}
>
<Row style={{ padding: "22px 16px 20px 16px", gap: "16px 40px" }}>
{tagList.map((item) => {
return (
<Col
key={item.id}
style={{ cursor: "pointer", height: 100, padding: 0 }}
>
<Image src={img} width={100} height={100} alt=""></Image>
<div className={styles.identityBtn}>{item.tagName}{">"}</div>
</Col>
);
})}
</Row>
</Modal>
);
}
.modal { .modal {
width: 460px;
:global .ant-modal-content { :global .ant-modal-content {
border-radius: 0; border-radius: 0;
.ant-modal-title{
text-align: center;
}
} }
} }
import React, { useState } from "react"; import React, { useEffect, useState } from "react";
import { Modal } from "antd"; import { AutoComplete, Modal } from "antd";
import Image from "next/image"; import Image from "next/image";
type Props = { type Props = {
open: boolean; open: boolean;
onCancel: () => void; onCancel: () => void;
}; };
export default function loginModal(props: Props) { export default function LoginModal(props: Props) {
useEffect(() => {
if (props.open) {
var obj = new window.WxLogin({
self_redirect: true,
id: "login_container",
appid: "wx18b7883acd204278",
scope: "snsapi_login",
redirect_uri: encodeURIComponent("https://iuav.mmcuav.cn/"),
state: "",
style: "",
href: "",
});
}
}, [props.open]);
return ( return (
<> <>
<Modal <Modal
...@@ -30,16 +44,13 @@ export default function loginModal(props: Props) { ...@@ -30,16 +44,13 @@ export default function loginModal(props: Props) {
> >
欢迎来到云享飞 欢迎来到云享飞
</div> </div>
<Image <div
alt="" id="login_container"
src="" style={{ margin: "auto", display: "table" }}
width={160} ></div>
height={160}
style={{ margin: "auto", display: "block" }}
></Image>
<div <div
style={{ style={{
marginTop: 39, marginTop: -120,
marginBottom: 52, marginBottom: 52,
fontSize: 14, fontSize: 14,
fontFamily: "MicrosoftYaHei", fontFamily: "MicrosoftYaHei",
......
/* import { useEffect } from "react"; import { useEffect, useState } from "react";
import Router from "next/router"; import api, { UserInfoResp } from "~/api";
import request from '~/api/request';
import useSWR, { SWRResponse } from "swr"; */
/* /*
const fetcher = (url) => const fetcher = (url) =>
fetch(url) fetch(url)
...@@ -10,24 +8,18 @@ const fetcher = (url) => ...@@ -10,24 +8,18 @@ const fetcher = (url) =>
return { user: data?.user || null }; return { user: data?.user || null };
}); */ }); */
export function useUser({ redirectTo, redirectIfFound } = {}) { export function useUser() {
return {}; const [user, setUser] = useState(null);
/* const { data, error } = useSWR("/api/user", request);
const user = data?.user;
const finished = Boolean(data);
const hasUser = Boolean(user);
useEffect(() => { useEffect(() => {
if (!redirectTo || !finished) return; api
if ( .userInfo({
// If redirectTo is set, redirect if the user was not found. userAccountId: 0,
(redirectTo && !redirectIfFound && !hasUser) || })
// If redirectIfFound is also set, redirect if the user was found .then((res) => {
(redirectIfFound && hasUser) setUser(res.result);
) { });
Router.push(redirectTo); }, []);
}
}, [redirectTo, redirectIfFound, finished, hasUser]);
return error ? null : user; */ return user;
} }
...@@ -4,6 +4,8 @@ import type { AppProps } from 'next/app'; ...@@ -4,6 +4,8 @@ import type { AppProps } from 'next/app';
import withTheme from '../theme'; import withTheme from '../theme';
import { message } from 'antd'; import { message } from 'antd';
import { useEffect } from 'react'; import { useEffect } from 'react';
import Head from "next/head";
import Script from 'next/script';
export default function App({ Component, pageProps }: AppProps) { export default function App({ Component, pageProps }: AppProps) {
const [messageApi, contextHolder] = message.useMessage(); const [messageApi, contextHolder] = message.useMessage();
...@@ -14,6 +16,13 @@ export default function App({ Component, pageProps }: AppProps) { ...@@ -14,6 +16,13 @@ export default function App({ Component, pageProps }: AppProps) {
return withTheme( return withTheme(
<> <>
<Head>
<meta
name="viewport"
content="width=device-width,initial-scale=1"
></meta>
</Head>
<Script src="https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></Script>
{contextHolder} {contextHolder}
<Component {...pageProps} /> <Component {...pageProps} />
</> </>
......
...@@ -29,16 +29,29 @@ export interface ListPageFlyingInfoResp { ...@@ -29,16 +29,29 @@ export interface ListPageFlyingInfoResp {
export interface SkillsType { export interface SkillsType {
type: string; type: string;
id: 1, id: number,
skillsName: string skillsName: string,
label:string | number,
value:string | number
} }
export interface RegionResp { export interface RegionResp {
"childInfo": RegionResp[] | null, childInfo: RegionResp[] | null,
"id": number, id: number,
"level": number, level: number,
"name": string, name: string,
"pid": number pid: number
}
export interface PilotRegistrationParams {
city?: number,
drivingLicense?: number,
industryAppAuth?: Array<number>,
province?: number,
remark?: string,
telephone?: string,
uavLicenseLevelOne?: number,
uavLicenseLevelTwo?: number
} }
export default { export default {
...@@ -55,4 +68,7 @@ export default { ...@@ -55,4 +68,7 @@ export default {
IndustryFlightSkills: (): Promise<Response<Array<SkillsType>>> => { IndustryFlightSkills: (): Promise<Response<Array<SkillsType>>> => {
return request('/release/curriculum/getIndustryFlightSkills'); return request('/release/curriculum/getIndustryFlightSkills');
}, },
PilotRegistrations: (params:PilotRegistrationParams): Promise<Response<Array<SkillsType>>> => {
return request('/release/curriculum/pilotRegistration',"post",params);
},
} }
\ No newline at end of file
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { Box } from "./styled"; import { Box } from "./styled";
import Image from "next/image"; import Image from "next/image";
import { Button, Select, Space, Pagination, Cascader, Modal } from "antd"; import { Button, Select, Space, Pagination, Cascader, Modal , Form ,Input,Checkbox, message} from "antd";
import type { CheckboxValueType } from 'antd/es/checkbox/Group';
import Layout from "~/components/layout"; import Layout from "~/components/layout";
import ContentBox from "~/components/contentBox"; import ContentBox from "~/components/contentBox";
import api, { Flying, SkillsType, RegionResp } from "./api"; import api, { Flying, SkillsType, RegionResp } from "./api";
...@@ -13,6 +14,7 @@ interface FilterInfoParams { ...@@ -13,6 +14,7 @@ interface FilterInfoParams {
} }
export default function FlyingHandService() { export default function FlyingHandService() {
const {Option} = Select
const router = useRouter(); const router = useRouter();
const [list, setList] = useState([ const [list, setList] = useState([
"https://pad-video-x.oss-cn-shenzhen.aliyuncs.com/file/925072db-5872-44dd-8b71-e408ad3adf41.jpg", "https://pad-video-x.oss-cn-shenzhen.aliyuncs.com/file/925072db-5872-44dd-8b71-e408ad3adf41.jpg",
...@@ -163,7 +165,12 @@ export default function FlyingHandService() { ...@@ -163,7 +165,12 @@ export default function FlyingHandService() {
setSkills(res.result || []); setSkills(res.result || []);
}); });
api.IndustryFlightSkills().then((res) => { api.IndustryFlightSkills().then((res) => {
setFlightSkillsList(res.result || []); const list = res.result?.map((item)=>{
item.label = item.skillsName
item.value = item.id
return item
})
setFlightSkillsList(list || []);
}); });
}, []); }, []);
...@@ -185,18 +192,29 @@ export default function FlyingHandService() { ...@@ -185,18 +192,29 @@ export default function FlyingHandService() {
//报名 //报名
const [isModalOpen, setIsModalOpen] = useState(false); const [isModalOpen, setIsModalOpen] = useState(false);
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const handleOk = () => { const handleOk = async (values: any) => {
const value = form.getFieldsValue()
setLoading(true); setLoading(true);
setTimeout(() => { try{
const res = await api.PilotRegistrations(value)
setLoading(false); setLoading(false);
setIsModalOpen(false); setIsModalOpen(false);
}, 3000); form.resetFields()
message.success('报名成功')
}catch(e:any){
message.error(e.message)
}
}; };
const handleCancel = () => { const handleCancel = () => {
setIsModalOpen(false); setIsModalOpen(false);
}; };
const [form] = Form.useForm();
const onChangeCheck = (checkedValues: CheckboxValueType[]) => {
console.log('checked = ', checkedValues);
};
return ( return (
<Layout> <Layout>
<Box> <Box>
...@@ -272,7 +290,7 @@ export default function FlyingHandService() { ...@@ -272,7 +290,7 @@ export default function FlyingHandService() {
getContainer={false} getContainer={false}
footer={[ footer={[
<Button <Button
style={{ width: "100%" }} style={{ width: "100%" ,background: "linear-gradient(135deg, #278EFF 0%, #0052DA 100%)",height: 40 }}
key="submit" key="submit"
type="primary" type="primary"
loading={loading} loading={loading}
...@@ -282,9 +300,79 @@ export default function FlyingHandService() { ...@@ -282,9 +300,79 @@ export default function FlyingHandService() {
</Button>, </Button>,
]} ]}
> >
<p>Some contents...</p> <Form
<p>Some contents...</p> form={form}
<p>Some contents...</p> layout="vertical"
name="application"
initialValues={{ modifier: 'public' }}
>
<div style={{display:"flex",justifyContent:"space-between"}}>
<Form.Item style={{flex:1,marginRight:16}}
name="name"
rules={[{ required: true, message: 'Please input the title of collection!' }]}
>
<Input placeholder="姓名" />
</Form.Item>
<Form.Item style={{flex:1}} name="telephone">
<Input placeholder="手机号" />
</Form.Item>
</div>
<Form.Item
name="city"
rules={[{ required: true, message: 'Please select gender!' }]}
>
<Cascader
allowClear
placeholder="地域"
className="selectItem"
size="large"
fieldNames={{
label: "name",
value: "id",
children: "childInfo",
}}
options={secondDistrictInfo}
changeOnSelect
/>
</Form.Item>
<Form.Item
name="drivingLicense"
rules={[{ required: true, message: 'Please select gender!' }]}
>
<Select placeholder="是否有驾照">
<Option value="0"></Option>
<Option value="1"></Option>
</Select>
</Form.Item>
<Form.Item
name="uavLicenseLevelOne"
rules={[{ required: true, message: 'Please select gender!' }]}
>
<Cascader
allowClear
placeholder="是否有无人机执照"
className="selectItem"
size="large"
fieldNames={{
label: "licenseType",
value: "id",
children: "childLicenses",
}}
options={skills}
changeOnSelect
/>
</Form.Item>
<Form.Item name="industryAppAuth" label="行业应用认证(多选)" className="collection-create-form_last-form-item">
<Checkbox.Group
options={flightSkillsList}
onChange={onChangeCheck}
/>
</Form.Item>
<Form.Item name="remark">
<Input placeholder="备注" />
</Form.Item>
</Form>
</Modal> </Modal>
<ContentBox <ContentBox
......
import request, { Response } from "~/api/request"; import request, { Response } from "~/api/request";
export interface PositioningInfoParams { export interface PositioningInfoParams {
lat: number; lat?: number;
lon: number; lon?: number;
pageNo?:number,
pageSize?:number
} }
export interface Entiy { export interface Entiy {
...@@ -19,11 +21,46 @@ export interface ListPageJobInfoResp { ...@@ -19,11 +21,46 @@ export interface ListPageJobInfoResp {
locationList: Array<Entiy>; locationList: Array<Entiy>;
} }
export interface FlyerBitmapEntiy {
flyerName: string,
phoneNum: string,
lon: number,
lat: number,
distance: number
}
export interface UavBitmapEntiy {
uavName: string,
online: number,
lon: number,
lat: number,
distance: number,
id: string
}
export interface BitmapInfo<T> {
pageNo: number,
pageSize: number,
list: T[],
totalCount: number,
totalPage: number
}
export default { export default {
//web-作业服务-分页 //web-首页-地图-全国点位
listPositioningInfo: ( listPositioningInfo: (
params: PositioningInfoParams params: PositioningInfoParams
): Promise<Response<ListPageJobInfoResp[]>> => { ): Promise<Response<ListPageJobInfoResp[]>> => {
return request("/release/website/getWebsiteList", "get", params); return request("/release/website/getWebsiteList", "get", params);
}, },
//web-首页-地图-全国飞手
listFlyerBitmap: (
params: PositioningInfoParams
): Promise<Response<BitmapInfo<FlyerBitmapEntiy>>> => {
return request("/release/website/flyer/bitmap", "get", params);
},
//web-首页-地图-全国无人机
listUavBitmap: (
params: PositioningInfoParams
): Promise<Response<BitmapInfo<UavBitmapEntiy>>> => {
return request("/release/website/uav/bitmap", "get", params);
},
}; };
...@@ -129,8 +129,6 @@ export default function WaterfallFlowBody() { ...@@ -129,8 +129,6 @@ export default function WaterfallFlowBody() {
index: number, index: number,
option: [] option: []
) => { ) => {
console.log("跳转",value,index,option);
const [item] = option.filter((item: any) => item.name === value.value); const [item] = option.filter((item: any) => item.name === value.value);
routerPath(index, item); routerPath(index, item);
}; };
...@@ -156,37 +154,49 @@ export default function WaterfallFlowBody() { ...@@ -156,37 +154,49 @@ export default function WaterfallFlowBody() {
const resValuelist1 = res1 const resValuelist1 = res1
.map((item, index) => { .map((item, index) => {
if (item.code === "200") {
return item.result?.map((it) => { return item.result?.map((it) => {
it.type = eqApiTypeList[index]; it.type = eqApiTypeList[index];
return it; return it;
}); });
}
return {}
}) })
.flat(); .flat();
const resValuelist2 = res2 const resValuelist2 = res2
.map((item, index) => { .map((item, index) => {
if (item.code === "200") {
return item.result?.map((it) => { return item.result?.map((it) => {
it.type = mallApiTypeList[index]; it.type = mallApiTypeList[index];
return it; return it;
}); });
}
return {}
}) })
.flat(); .flat();
const resValuelist3 = res3 const resValuelist3 = res3
.map((item, index) => { .map((item, index) => {
if (item.code === "200") {
return item.result?.map((it) => { return item.result?.map((it) => {
it.type = flightApiTypeList[index]; it.type = flightApiTypeList[index];
it.name = it.name || it.skillsName || it.licenseType; it.name = it.name || it.skillsName || it.licenseType;
return it; return it;
}); });
}
return {}
}) })
.flat(); .flat();
const resValuelist4 = res4 const resValuelist4 = res4
.map((item, index) => { .map((item, index) => {
if (item.code === "200") {
return item.result?.map((it) => { return item.result?.map((it) => {
it.type = jobApiTypeList[index]; it.type = jobApiTypeList[index];
console.log(it);
it.name = it.name || it.appName; it.name = it.name || it.appName;
return it; return it;
}); });
}
return {}
}) })
.flat(); .flat();
...@@ -222,7 +232,6 @@ export default function WaterfallFlowBody() { ...@@ -222,7 +232,6 @@ export default function WaterfallFlowBody() {
resValuelist4, resValuelist4,
list2Option, list2Option,
]; ];
console.log(optionList);
setLeftDomList( setLeftDomList(
columns.map((item, index) => { columns.map((item, index) => {
...@@ -333,6 +342,7 @@ export default function WaterfallFlowBody() { ...@@ -333,6 +342,7 @@ export default function WaterfallFlowBody() {
}; };
const rightDom = (list: Array<NewsPageType>) => { const rightDom = (list: Array<NewsPageType>) => {
if(!list?.length) return;
return ( return (
<div key={1009} className="right-box-item right-item"> <div key={1009} className="right-box-item right-item">
<div className="title"> <div className="title">
...@@ -364,6 +374,7 @@ export default function WaterfallFlowBody() { ...@@ -364,6 +374,7 @@ export default function WaterfallFlowBody() {
}; };
const rightDom2 = (list: Array<NewsTenderType>) => { const rightDom2 = (list: Array<NewsTenderType>) => {
if(!list.length) return;
return ( return (
<div key={1008} className="right-box-item right-item-second"> <div key={1008} className="right-box-item right-item-second">
<div className="item-box"> <div className="item-box">
......
...@@ -102,6 +102,7 @@ export const Box = styled.div` ...@@ -102,6 +102,7 @@ export const Box = styled.div`
} }
} }
.right-item { .right-item {
background-color: #fff;
border-radius: 6px; border-radius: 6px;
.title { .title {
display: flex; display: flex;
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
flex-wrap: wrap; flex-wrap: wrap;
gap: 12px; gap: 12px;
height: 565px; height: 565px;
align-content: start;
.item { .item {
cursor: pointer; cursor: pointer;
......
...@@ -133,6 +133,7 @@ export default function Mall(props: Props) { ...@@ -133,6 +133,7 @@ export default function Mall(props: Props) {
showSizeChanger={false} showSizeChanger={false}
showQuickJumper showQuickJumper
total={count} total={count}
pageSize={pageParams.pageSize}
onChange={onPageChange} onChange={onPageChange}
hideOnSinglePage={true} hideOnSinglePage={true}
style={{ marginTop: 20 }} style={{ marginTop: 20 }}
......
...@@ -3,5 +3,6 @@ import { MessageInstance } from 'antd/es/message/interface'; ...@@ -3,5 +3,6 @@ import { MessageInstance } from 'antd/es/message/interface';
declare global { declare global {
interface Window { interface Window {
messageApi: MessageInstance; messageApi: MessageInstance;
WxLogin: any;
} }
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论