提交 9cda4ee5 作者: 18928357778

Merge branch 'master' of ssh://git.mmcuav.cn:8222/root/sharefly-web-nextjs into caoyun

...@@ -8,11 +8,6 @@ export interface RegionResp { ...@@ -8,11 +8,6 @@ export interface RegionResp {
name: string; name: string;
pid: number; pid: number;
} }
export interface UserInfoParams {
userAccountId: number;
}
export interface UserInfoResp { export interface UserInfoResp {
id: number; id: number;
accountType: number; accountType: number;
...@@ -28,6 +23,17 @@ export interface UserInfoResp { ...@@ -28,6 +23,17 @@ export interface UserInfoResp {
remark: string; remark: string;
portType: number; portType: number;
createTime: string; createTime: string;
companyAuthStatus: number;
token: string;
}
export interface TestAppletLoginResp {
userAccountId: number;
token: string;
uid: string;
phoneNum?: string;
nickName: string;
sessionKey?: any;
} }
export default { export default {
...@@ -35,12 +41,41 @@ export default { ...@@ -35,12 +41,41 @@ export default {
region: (): Promise<Response<Array<RegionResp>>> => { region: (): Promise<Response<Array<RegionResp>>> => {
return request("/pms/webDevice/getSecondDistrictInfo"); return request("/pms/webDevice/getSecondDistrictInfo");
}, },
//测试-小程序unionId登录-注册
testAppletLogin: (): Promise<Response<TestAppletLoginResp>> => {
let params = new URLSearchParams();
params.append("unionId", "oQZEd5hy0Qrwaj10BGtP8xq8vH--s88888");
return request(
"/userapp/auth/testAppletLogin",
"post",
{},
{
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
body: params,
}
);
},
//生成小程序码
getAppletQRCode: (params: { randomLoginCode: string }) => {
return request("/userapp/wx/getAppletQRCode", "get", {
page: "page-identity/identity-empower/index",
scene: "randomLoginCode=" + params.randomLoginCode,
});
},
//查询登录信息
getLoginInfo: (params: { randomLoginCode: string }) => {
return request("/userapp/temp-auth/getLoginInfo", "get", params, {
hideError: true //隐藏错误提示
});
},
//获取用户基本信息 //获取用户基本信息
userInfo: (params: UserInfoParams): Promise<Response<UserInfoResp>> => { userInfo: (): Promise<Response<UserInfoResp>> => {
return request("/userapp/user-account/info", "get", params, {}); return request("/userapp/user-account/info", "get");
}, },
//图片上传地址 //图片上传地址
imgOss: () => { imgOss: () => {
return config.baseUrl + "/pms/upload/imgOss"; return config.baseUrl + "/pms/upload/imgOss";
} },
}; };
...@@ -8,8 +8,14 @@ import config from './config'; ...@@ -8,8 +8,14 @@ import config from './config';
* @param options 额外参数 * @param options 额外参数
* @returns Promise<Response> * @returns Promise<Response>
*/ */
export default function request(url: string, method: String = 'get', data?: any, options = {}): Promise<Response<any>> { export default function request(url: string, method: String = 'get', data?: any, options: any & { hideError?: boolean, headers?: { token?: string } } = {}): Promise<Response<any>> {
let token = localStorage.getItem('token') || '';
options = {
headers: {
token
},
...options,
}
switch (method.toLowerCase()) { switch (method.toLowerCase()) {
case 'get': case 'get':
let params = new URLSearchParams(); let params = new URLSearchParams();
...@@ -24,16 +30,22 @@ export default function request(url: string, method: String = 'get', data?: any, ...@@ -24,16 +30,22 @@ export default function request(url: string, method: String = 'get', data?: any,
case 'post': case 'post':
options = { options = {
...options,
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json' 'Content-Type': 'application/json'
}, },
body: JSON.stringify(data) body: JSON.stringify(data),
...options,
} }
break; break;
} }
function errMsg(msg: string) {
if (!options.hideError) {
errMsg(msg);
}
}
return fetch(config.baseUrl + url, options) return fetch(config.baseUrl + url, options)
.then((r) => { .then((r) => {
try { try {
...@@ -50,12 +62,12 @@ export default function request(url: string, method: String = 'get', data?: any, ...@@ -50,12 +62,12 @@ export default function request(url: string, method: String = 'get', data?: any,
.then((data) => { .then((data) => {
if (data.errors) { if (data.errors) {
//全局消息提示 //全局消息提示
window.messageApi.error('请求出错') errMsg('请求出错')
if (Array.isArray(data.errors)) { if (Array.isArray(data.errors)) {
data.errors.forEach((item: any) => { data.errors.forEach((item: any) => {
if (item.defaultMessage){ if (item.defaultMessage) {
window.messageApi.error(item.defaultMessage) errMsg(item.defaultMessage)
} }
}) })
} }
...@@ -66,6 +78,11 @@ export default function request(url: string, method: String = 'get', data?: any, ...@@ -66,6 +78,11 @@ export default function request(url: string, method: String = 'get', data?: any,
result: null result: null
} }
} }
if (data.code !== '200') {
errMsg(data.message || '请求出错');
}
return data; return data;
}) })
.catch(error => { .catch(error => {
......
import React, { useEffect, useState } from "react"; import React, { useContext, useEffect, useState } from "react";
import { Avatar, Button, Space, Tabs } from "antd"; import { Avatar, Button, Dropdown, 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";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
...@@ -7,6 +7,7 @@ import LoginModal from "~/components/loginModal"; ...@@ -7,6 +7,7 @@ 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"; import JoinModal from "./joinModal";
import { UserContext } from "~/lib/userProvider";
const items: TabsProps["items"] = [ const items: TabsProps["items"] = [
{ {
...@@ -42,30 +43,55 @@ const items: TabsProps["items"] = [ ...@@ -42,30 +43,55 @@ const items: TabsProps["items"] = [
export default function NavHeader() { export default function NavHeader() {
const router = useRouter(); const router = useRouter();
const [currentPath, setCurrentPath] = useState(""); const [currentPath, setCurrentPath] = useState("");
const user = useUser(); const { userInfo, testLogin, logout } = useContext(UserContext);
useEffect(() => { useEffect(() => {
setCurrentPath(router.route); setCurrentPath(router.route);
console.log("currentHash", currentPath); console.log("currentHash", currentPath);
}, [router.route]); }, [router.route]);
//导航更改
const onChange = (key: string) => { const onChange = (key: string) => {
router.push(key); router.push(key);
}; };
const [openLoginModal, setPpenLoginModal] = useState(false); //登录modal //退出登录
const [openPublishModal, setOpenPublishModal] = useState(false); //发布modal const onLogout = () => {
logout();
const showModal = () => {
setPpenLoginModal(true);
};
const handleCancel = () => {
setPpenLoginModal(false);
}; };
const [openLoginModal, setOpenLoginModal] = useState(false); //登录modal
const [openPublishModal, setOpenPublishModal] = useState(false); //发布modal
const [openJoinModal, setOpenJoinModal] = useState(false); //加盟modal const [openJoinModal, setOpenJoinModal] = useState(false); //加盟modal
//发布按钮事件
function onPublish() {
//登录判断
if (!userInfo) {
setOpenLoginModal(true);
} else {
if (userInfo.companyAuthStatus) {
setOpenPublishModal(true);
} else {
router.push("/certification");
}
}
}
//加盟按钮事件
function onJoin() {
//登录判断
if (!userInfo) {
setOpenLoginModal(true);
} else {
if (userInfo.companyAuthStatus) {
setOpenJoinModal(true);
} else {
router.push("/certification");
}
}
}
return ( return (
<div className={styles.navHeader}> <div className={styles.navHeader}>
<div className={styles.nav}> <div className={styles.nav}>
...@@ -77,39 +103,43 @@ export default function NavHeader() { ...@@ -77,39 +103,43 @@ export default function NavHeader() {
onChange={onChange} onChange={onChange}
/> />
<Space size={16} className={styles.btns}> <Space size={16} className={styles.btns}>
<Button <Button type="primary" className={styles.btn1} onClick={onPublish}>
type="primary"
className={styles.btn1}
onClick={() => setOpenPublishModal(true)}
>
+ 发布需求 + 发布需求
</Button> </Button>
<Button <Button className={styles.btn2} onClick={onJoin}>
className={styles.btn2}
onClick={() => setOpenJoinModal(true)}
>
加盟入驻 加盟入驻
</Button> </Button>
</Space> </Space>
{user ? ( {userInfo ? (
<div className={styles.haedImg}> <div className={styles.haedImg}>
<Dropdown
menu={{
items: [
{ key: "1", label: <div onClick={onLogout}>退出登录</div> },
],
}}
>
<Avatar <Avatar
size={36} size={36}
style={{ background: "#bdbdbd" }} style={{ background: "#bdbdbd" }}
src={user.userImg} src={userInfo.userImg}
></Avatar> ></Avatar>
</Dropdown>
</div> </div>
) : ( ) : (
<Button <Button
type="text" type="text"
onClick={showModal} onClick={() => testLogin()}
style={{ fontWeight: "bold", fontSize: 16 }} style={{ fontWeight: "bold", fontSize: 16 }}
> >
登录 登录
</Button> </Button>
)} )}
</div> </div>
<LoginModal open={openLoginModal} onCancel={handleCancel}></LoginModal> <LoginModal
open={openLoginModal}
onCancel={() => setOpenLoginModal(false)}
></LoginModal>
<PublishModal <PublishModal
open={openPublishModal} open={openPublishModal}
onCancel={() => { onCancel={() => {
......
import React, { useEffect, useState } from "react"; import React, { useContext, useEffect, useState } from "react";
import { AutoComplete, Modal } from "antd"; import { Modal, Image } from "antd";
import Image from "next/image";
import api from "~/api"; import api from "~/api";
import { UserContext } from "~/lib/userProvider";
type Props = { type Props = {
open: boolean; open: boolean;
...@@ -9,9 +9,13 @@ type Props = { ...@@ -9,9 +9,13 @@ type Props = {
}; };
export default function LoginModal(props: Props) { export default function LoginModal(props: Props) {
const [qrCode, setQrCode] = useState("");
const [randomLoginCode, setRandomLoginCode] = useState("");
const { userInfo, setUserInfo } = useContext(UserContext);
const [timeHandle, setTimeHandle] = useState<NodeJS.Timer | null>(null);
useEffect(() => { useEffect(() => {
if (props.open) { /* if (props.open) {
var obj = new window.WxLogin({ new window.WxLogin({
self_redirect: true, self_redirect: true,
id: "login_container", id: "login_container",
appid: "wx18b7883acd204278", appid: "wx18b7883acd204278",
...@@ -21,11 +25,56 @@ export default function LoginModal(props: Props) { ...@@ -21,11 +25,56 @@ export default function LoginModal(props: Props) {
style: "", style: "",
href: "", href: "",
}); });
} */
if (!props.open) {
return;
}
window.setUserId(1); setRandomLoginCode(String(Date.now()));
api
.getAppletQRCode({
randomLoginCode,
})
.then((res) => {
if (res.code == "200") {
setQrCode("data:image/png;base64," + res.result || "");
} }
});
}, [props.open]); }, [props.open]);
useEffect(() => {
if (randomLoginCode && !userInfo) {
if (timeHandle) {
clearTimeout(timeHandle);
}
const handle = setInterval(() => {
api
.getLoginInfo({
randomLoginCode: randomLoginCode,
})
.then((res) => {
if (res.code === "200") {
setUserInfo({
...res.result,
id: res.result?.userAccountId,
});
window.messageApi.success("登录成功");
clearInterval(handle);
setTimeHandle(null);
props.onCancel();
}
});
}, 1000);
setTimeHandle(handle);
}
}, [randomLoginCode]);
useEffect(() => {
if (!props.open && timeHandle) {
clearTimeout(timeHandle);
}
}, [timeHandle, props.open]);
return ( return (
<> <>
<Modal <Modal
...@@ -47,13 +96,12 @@ export default function LoginModal(props: Props) { ...@@ -47,13 +96,12 @@ export default function LoginModal(props: Props) {
> >
欢迎来到云享飞 欢迎来到云享飞
</div> </div>
<div <div id="login_container" style={{ margin: "auto", display: "table" }}>
id="login_container" <Image src={qrCode} width={150} height={150}></Image>
style={{ margin: "auto", display: "table" }} </div>
></div>
<div <div
style={{ style={{
marginTop: -120, // marginTop: -120,
marginBottom: 52, marginBottom: 52,
fontSize: 14, fontSize: 14,
fontFamily: "MicrosoftYaHei", fontFamily: "MicrosoftYaHei",
......
...@@ -14,10 +14,6 @@ export function useUser() { ...@@ -14,10 +14,6 @@ export function useUser() {
useEffect(() => { useEffect(() => {
setUserAccountId(Number(window.localStorage.getItem('userId'))); setUserAccountId(Number(window.localStorage.getItem('userId')));
window.setUserId = (id) => {
setUserAccountId(id);
window.localStorage.setItem('userId', id);
};
try { try {
let userInfo = JSON.parse(window.localStorage.getItem('userInfo') || '') || null; let userInfo = JSON.parse(window.localStorage.getItem('userInfo') || '') || null;
...@@ -26,16 +22,25 @@ export function useUser() { ...@@ -26,16 +22,25 @@ export function useUser() {
}, []) }, [])
useEffect(() => { useEffect(() => {
if (!user && userAccountId) { if (!user) {
api api
.userInfo({ .userInfo()
userAccountId: userAccountId,
})
.then((res) => { .then((res) => {
if(res.code == '200'){
setUser(res.result || null); setUser(res.result || null);
}else{
setUserAccountId('');
}
window.localStorage.setItem('userInfo', JSON.stringify(res.result || '')); window.localStorage.setItem('userInfo', JSON.stringify(res.result || ''));
}); });
} }
//退出登录
if(userAccountId === ''){
setUser(null);
window.localStorage.setItem('userInfo', '');
}
}, [userAccountId]); }, [userAccountId]);
return user; return user;
......
import React, { createContext, Dispatch, SetStateAction, useEffect, useState } from "react";
import api, { UserInfoResp } from "~/api";
export const UserContext = createContext<{
testLogin: () => void;
logout: () => void;
userInfo: UserInfoResp | null;
setUserInfo: Dispatch<SetStateAction<UserInfoResp | null>>;
}>({
testLogin() {},
logout() {},
userInfo: null,
setUserInfo() {},
});
type Props = {
children: React.ReactNode;
};
const UserProvider = ({ children }: Props) => {
const [userInfo, setUserInfo] = useState<UserInfoResp | null>(null);
useEffect(() => {
try {
setUserInfo(JSON.parse(window.localStorage.getItem("userInfo") || ""));
} catch (e) {}
}, []);
useEffect(() => {
localStorage.setItem("userInfo", JSON.stringify(userInfo || ""));
}, [userInfo]);
//测试登录
function testLogin() {
api.testAppletLogin().then((res) => {
if (res.code == "200") {
window.localStorage.setItem("token", res.result?.token || "");
api.userInfo().then((res) => {
setUserInfo(res.result || null);
});
}
});
}
//登出
function logout() {
localStorage.setItem("token", "");
setUserInfo(null);
}
return (
<UserContext.Provider value={{ userInfo, setUserInfo, testLogin, logout }}>
{children}
</UserContext.Provider>
);
};
export default UserProvider;
...@@ -27,6 +27,7 @@ const nextConfig = { ...@@ -27,6 +27,7 @@ const nextConfig = {
{ {
source: "/local/:path*", source: "/local/:path*",
destination: "https://iuav.mmcuav.cn/:path*", destination: "https://iuav.mmcuav.cn/:path*",
destination: "https://test.iuav.mmcuav.cn/:path*",
}, },
]; ];
}, },
......
...@@ -45,7 +45,7 @@ export default function JoinPolicy() { ...@@ -45,7 +45,7 @@ export default function JoinPolicy() {
className={styles.font1} className={styles.font1}
style={{ textAlign: "center", paddingTop: 40, paddingBottom: 30 }} style={{ textAlign: "center", paddingTop: 40, paddingBottom: 30 }}
> >
加盟入驻政策 加盟入驻福利
</div> </div>
<div <div
className={styles.font2} className={styles.font2}
......
...@@ -6,6 +6,7 @@ import { message } from 'antd'; ...@@ -6,6 +6,7 @@ import { message } from 'antd';
import { useEffect } from 'react'; import { useEffect } from 'react';
import Head from "next/head"; import Head from "next/head";
import Script from 'next/script'; import Script from 'next/script';
import UserProvider, { UserContext } from "~/lib/userProvider";
export default function App({ Component, pageProps }: AppProps) { export default function App({ Component, pageProps }: AppProps) {
const [messageApi, contextHolder] = message.useMessage(); const [messageApi, contextHolder] = message.useMessage();
...@@ -24,7 +25,9 @@ export default function App({ Component, pageProps }: AppProps) { ...@@ -24,7 +25,9 @@ export default function App({ Component, pageProps }: AppProps) {
</Head> </Head>
<Script src="https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></Script> <Script src="https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></Script>
{contextHolder} {contextHolder}
<UserProvider>
<Component {...pageProps} /> <Component {...pageProps} />
</UserProvider>
</> </>
); );
} }
...@@ -8,6 +8,7 @@ import Layout from "~/components/layout"; ...@@ -8,6 +8,7 @@ import Layout from "~/components/layout";
import api from "./api"; import api from "./api";
import styles from "./index.module.scss"; import styles from "./index.module.scss";
import gApi from '~/api'; import gApi from '~/api';
import Router from "next/router";
const beforeUpload = (file: RcFile) => { const beforeUpload = (file: RcFile) => {
const isJpgOrPng = file.type === "image/jpeg" || file.type === "image/png"; const isJpgOrPng = file.type === "image/jpeg" || file.type === "image/png";
...@@ -57,12 +58,14 @@ export default function Certification() { ...@@ -57,12 +58,14 @@ export default function Certification() {
.companyAuth({ .companyAuth({
...values, ...values,
licenseImg: imageUrl, licenseImg: imageUrl,
userAccountId: 1
}) })
.then((res) => { .then((res) => {
console.log('提交结果', res); console.log('提交结果', res);
if(res.result === '已通过'){ if(res.code === '200'){
window.messageApi.success(res.result); window.messageApi.success(res.result);
setTimeout(() => {
Router.push('/');
}, 1000)
} }
}); });
}; };
......
...@@ -6,22 +6,20 @@ import api, { Flying, SkillsType, RegionResp } from "../../../api"; ...@@ -6,22 +6,20 @@ import api, { Flying, SkillsType, RegionResp } from "../../../api";
interface BrushQuestionZoneType { interface BrushQuestionZoneType {
} }
export default function index() { export default function BrushQuestionZone() {
const [secondDistrictInfo, setSecondDistrictInfo] = useState( const [secondDistrictInfo, setSecondDistrictInfo] = useState(
Array<RegionResp> Array<RegionResp>
); );
const [skills, setSkills] = useState( const [skills, setSkills] = useState(Array<RegionResp>);
Array<RegionResp>
);
const [flightSkillsList, setFlightSkillsList] = useState(Array<SkillsType>); const [flightSkillsList, setFlightSkillsList] = useState(Array<SkillsType>);
const [list,setList] = useState<Array<BrushQuestionZoneType>>() const [list, setList] = useState<Array<BrushQuestionZoneType>>();
const handleChange = (value: string) => { const handleChange = (value: string) => {
console.log(`selected ${value}`); console.log(`selected ${value}`);
}; };
useEffect(() => { useEffect(() => {
setList([{},{},{},{},{},{}]) setList([{}, {}, {}, {}, {}, {}]);
api.region().then((res) => { api.region().then((res) => {
setSecondDistrictInfo(res.result || []); setSecondDistrictInfo(res.result || []);
}); });
...@@ -29,11 +27,11 @@ export default function index() { ...@@ -29,11 +27,11 @@ export default function index() {
setSkills(res.result || []); setSkills(res.result || []);
}); });
api.IndustryFlightSkills().then((res) => { api.IndustryFlightSkills().then((res) => {
const list = res.result?.map((item)=>{ const list = res.result?.map((item) => {
item.label = item.skillsName item.label = item.skillsName;
item.value = item.id item.value = item.id;
return item return item;
}) });
setFlightSkillsList(list || []); setFlightSkillsList(list || []);
}); });
}, []); }, []);
...@@ -82,7 +80,7 @@ export default function index() { ...@@ -82,7 +80,7 @@ export default function index() {
allowClear allowClear
placeholder="选择课程" placeholder="选择课程"
className="selectItem" className="selectItem"
style={{width:200}} style={{ width: 200 }}
size="large" size="large"
fieldNames={{ fieldNames={{
label: "name", label: "name",
...@@ -95,17 +93,15 @@ export default function index() { ...@@ -95,17 +93,15 @@ export default function index() {
/> />
</div> </div>
<div className="content"> <div className="content">
{ {list?.map((item, i) => (
list?.map(item=>( <div key={i} className="item">
<div className='item'> <div className="img-box"></div>
<div className='img-box'></div> <div className="item-content">
<div className='item-content'>
第一章 第1节 习题练习习题练习习题练习 第一章 第1节 习题练习习题练习习题练习
</div> </div>
</div> </div>
)) ))}
}
</div> </div>
</Box> </Box>
) );
} }
...@@ -5,21 +5,19 @@ interface MockExamType { ...@@ -5,21 +5,19 @@ interface MockExamType {
} }
export default function index() { export default function MockExam() {
const [list, setList] = useState<Array<MockExamType>>();
const [list,setList] = useState<Array<MockExamType>>() useEffect(() => {
setList([{}, {}, {}, {}, {}, {}]);
useEffect(()=>{ }, []);
setList([{},{},{},{},{},{}])
},[])
return ( return (
<Box> <Box>
<div className="content"> <div className="content">
{ {list?.map((item, i) => (
list?.map(item=>( <div key={i} className="item">
<div className='item'> <div className="img-box"></div>
<div className='img-box'></div> <div className="item-content">
<div className='item-content'>
<div className="top">云飞手行业认证考核</div> <div className="top">云飞手行业认证考核</div>
<div className="bottom"> <div className="bottom">
<div className="user-img"></div> <div className="user-img"></div>
...@@ -27,9 +25,8 @@ export default function index() { ...@@ -27,9 +25,8 @@ export default function index() {
</div> </div>
</div> </div>
</div> </div>
)) ))}
}
</div> </div>
</Box> </Box>
) );
} }
...@@ -96,8 +96,9 @@ export default function News(props: Props) { ...@@ -96,8 +96,9 @@ export default function News(props: Props) {
); );
})} })}
</Col> </Col>
{list.length === 0 && <Empty style={{ margin: "0 auto" }}></Empty>}
</Row> </Row>
{list.length === 0 && <Empty></Empty>}
<Pagination <Pagination
current={pageParams.pageNo} current={pageParams.pageNo}
defaultPageSize={pageParams.pageSize} defaultPageSize={pageParams.pageSize}
......
...@@ -4,7 +4,6 @@ declare global { ...@@ -4,7 +4,6 @@ declare global {
interface Window { interface Window {
messageApi: MessageInstance; //全局消息提示api messageApi: MessageInstance; //全局消息提示api
WxLogin: any; //微信登录对象 WxLogin: any; //微信登录对象
setUserId: (number) => void; //获取用户信息需要的userId
_AMapSecurityConfig: { securityJsCode: string }; //高德地图api密钥配置 _AMapSecurityConfig: { securityJsCode: string }; //高德地图api密钥配置
} }
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论