提交 0b509adf 作者: 18928357778

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

...@@ -36,9 +36,9 @@ export default function request(url: string, method: String = 'get', data?: any, ...@@ -36,9 +36,9 @@ export default function request(url: string, method: String = 'get', data?: any,
return fetch(config.baseUrl + url, options) return fetch(config.baseUrl + url, options)
.then((r) => { .then((r) => {
try{ try {
return r.json() return r.json()
}catch(e){ } catch (e) {
console.error(e); console.error(e);
} }
return { return {
...@@ -48,6 +48,24 @@ export default function request(url: string, method: String = 'get', data?: any, ...@@ -48,6 +48,24 @@ export default function request(url: string, method: String = 'get', data?: any,
} }
}) })
.then((data) => { .then((data) => {
if (data.errors) {
//全局消息提示
window.messageApi.error('请求出错')
if (Array.isArray(data.errors)) {
data.errors.forEach((item: any) => {
if (item.defaultMessage){
window.messageApi.error(item.defaultMessage)
}
})
}
return {
code: '-1',
message: '请求失败',
result: null
}
}
return data; return data;
}) })
.catch(error => { .catch(error => {
......
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";
import { useRouter } from "next/router"; 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";
const items: TabsProps["items"] = [ const items: TabsProps["items"] = [
{ {
...@@ -39,22 +40,28 @@ const items: TabsProps["items"] = [ ...@@ -39,22 +40,28 @@ 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();
console.log("currentHash", currentPath); useEffect(() => {
setCurrentPath(router.route);
console.log("currentHash", currentPath);
}, [router.asPath])
const onChange = (key: string) => { const onChange = (key: string) => {
router.push(key); router.push(key);
}; };
const [isModalOpen, setIsModalOpen] = useState(false); const [openLoginModal, setPpenLoginModal] = useState(false); //登录modal
const [openPublishModal, setOpenPublishModal] = useState(false); //发布modal
const showModal = () => { const showModal = () => {
setIsModalOpen(true); setPpenLoginModal(true);
}; };
const handleCancel = () => { const handleCancel = () => {
setIsModalOpen(false); setPpenLoginModal(false);
}; };
return ( return (
...@@ -63,12 +70,16 @@ export default function NavHeader() { ...@@ -63,12 +70,16 @@ export default function NavHeader() {
<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}
/> />
<Space size={16} className={styles.btns}> <Space size={16} className={styles.btns}>
<Button type="primary" className={styles.btn1}> <Button
type="primary"
className={styles.btn1}
onClick={() => setOpenPublishModal(true)}
>
+ 发布需求 + 发布需求
</Button> </Button>
<Button className={styles.btn2}>加盟入驻</Button> <Button className={styles.btn2}>加盟入驻</Button>
...@@ -87,7 +98,8 @@ export default function NavHeader() { ...@@ -87,7 +98,8 @@ export default function NavHeader() {
</Button> </Button>
)} )}
</div> </div>
<LoginModal open={isModalOpen} onCancel={handleCancel}></LoginModal> <LoginModal open={openLoginModal} onCancel={handleCancel}></LoginModal>
<PublishModal open={openPublishModal} onCancel={() => {setOpenPublishModal(false)}}></PublishModal>
</div> </div>
); );
} }
import request, { Response } from "~/api/request"
export interface TypeResp {
id: number;
typeName: string;
}
export interface PublishParams {
userAccountId: number; //账号id
publishPhone: number; //手机号
publishName: string; //发布名称
requirementTypeId: number; //需求类型
requireDescription: string; //需求描述
}
export default {
/**
* 需求类型
* @returns
*/
listType(): Promise<Response<Array<TypeResp>>>{
return request('/release/requirements/listType')
},
/**
* 需求发布
* @param params
* @returns
*/
publish(params: PublishParams): Promise<Response<any>>{
return request('/release/requirements/publish', 'post', params);
}
}
\ No newline at end of file
.modal {
width: 460px;
:global .ant-modal-content {
border-radius: 0;
}
}
import { Button, Form, Input, Modal, Select } from "antd";
import { useEffect, useState } from "react";
import api, { PublishParams, TypeResp } from "./api";
import styles from "./index.module.scss";
type Props = {
open?: boolean;
onOk?: () => void;
onCancel?: () => void;
};
export default function PublishModal(props: Props) {
const [types, setTypes] = useState<Array<TypeResp>>([]); //需求类型
const [params, setParams] = useState<PublishParams>({
userAccountId: -1,
publishName: "",
publishPhone: -1,
requireDescription: "",
requirementTypeId: -1,
});
const [form] = Form.useForm();
console.log("form", form);
useEffect(() => {
api.listType().then((res) => {
setTypes(res.result || []);
});
}, []);
const onFinish = (values: any) => {
console.log("Success:", values);
values.publishPhone = Number(values.publishPhone);
api
.publish({
...params,
...values,
})
.then((res) => {
if (res.code !== "-1") {
props.onCancel && props.onCancel();
setTimeout(() => {
form.resetFields();
}, 500);
}
});
};
const onFinishFailed = (errorInfo: any) => {
console.log("Failed:", errorInfo);
};
return (
<Modal
open={props.open}
onOk={props.onOk}
onCancel={props.onCancel}
title="需求发布"
className={styles.modal}
width={460}
footer={null}
>
<Form
labelCol={{ span: 5 }}
labelAlign="left"
onFinish={onFinish}
onFinishFailed={onFinishFailed}
form={form}
>
<Form.Item
label="姓名"
name="publishName"
rules={[{ required: true, message: "请输入姓名!" }]}
>
<Input placeholder="输入姓名"></Input>
</Form.Item>
<Form.Item
label="手机号"
name="publishPhone"
rules={[{ required: true, message: "请输入手机号!" }]}
>
<Input placeholder="输入手机号"></Input>
</Form.Item>
<Form.Item
label="需求类型"
name="requirementTypeId"
rules={[{ required: true, message: "请选择需求类型!" }]}
>
<Select
placeholder="选择需求类型"
options={types}
fieldNames={{ label: "typeName", value: "id" }}
></Select>
</Form.Item>
<Form.Item
name="requireDescription"
rules={[{ required: true, message: "请输入需求描述!" }]}
>
<Input.TextArea
placeholder="项目需求描述"
style={{ height: 162 }}
></Input.TextArea>
</Form.Item>
<Form.Item>
<Button
type="primary"
htmlType="submit"
style={{ width: "100%", height: 40, borderRadius: 0 }}
>
立即发布
</Button>
</Form.Item>
</Form>
</Modal>
);
}
...@@ -35,6 +35,7 @@ const footerStyle: React.CSSProperties = { ...@@ -35,6 +35,7 @@ const footerStyle: React.CSSProperties = {
type Props = { type Props = {
children?: React.ReactNode; children?: React.ReactNode;
layoutStyle?: React.CSSProperties; layoutStyle?: React.CSSProperties;
hideFooter?: boolean;
}; };
export default function LayoutView(props: Props) { export default function LayoutView(props: Props) {
...@@ -50,9 +51,11 @@ export default function LayoutView(props: Props) { ...@@ -50,9 +51,11 @@ export default function LayoutView(props: Props) {
<NavHeader /> <NavHeader />
</Header> </Header>
<Content style={contentStyle}>{props.children}</Content> <Content style={contentStyle}>{props.children}</Content>
<Footer style={footerStyle}> {!props.hideFooter && (
<FooterView></FooterView> <Footer style={footerStyle}>
</Footer> <FooterView></FooterView>
</Footer>
)}
</Layout> </Layout>
</Space> </Space>
); );
......
...@@ -2,7 +2,20 @@ import '../public/antd.min.css'; ...@@ -2,7 +2,20 @@ import '../public/antd.min.css';
import '../styles/index.scss'; import '../styles/index.scss';
import type { AppProps } from 'next/app'; import type { AppProps } from 'next/app';
import withTheme from '../theme'; import withTheme from '../theme';
import { message } from 'antd';
import { useEffect } from 'react';
export default function App({ Component, pageProps }: AppProps) { export default function App({ Component, pageProps }: AppProps) {
return withTheme(<Component {...pageProps} />); const [messageApi, contextHolder] = message.useMessage();
useEffect(() => {
//全局消息提示
window.messageApi = messageApi;
}, [])
return withTheme(
<>
{contextHolder}
<Component {...pageProps} />
</>
);
} }
...@@ -100,7 +100,7 @@ export default function ProjectInfo() { ...@@ -100,7 +100,7 @@ export default function ProjectInfo() {
}); });
}; };
return ( return (
<Layout layoutStyle={{ backgroundColor: "#fff" }}> <Layout layoutStyle={{ backgroundColor: "#fff" }} hideFooter>
<div style={{ backgroundColor: "#fff", minHeight: 820 }}> <div style={{ backgroundColor: "#fff", minHeight: 820 }}>
<div className="page"> <div className="page">
<div className={styles.bannerWrap}> <div className={styles.bannerWrap}>
......
...@@ -17,7 +17,8 @@ ...@@ -17,7 +17,8 @@
"incremental": true, "incremental": true,
"paths": { "paths": {
"~/*": ["./*"] "~/*": ["./*"]
} },
"typeRoots": ["./typings"]
}, },
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": ["node_modules"] "exclude": ["node_modules"]
......
import { MessageInstance } from 'antd/es/message/interface';
declare global {
interface Window {
messageApi: MessageInstance;
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论