提交 cf95e53f 作者: 18928357778

合并代码

......@@ -75,11 +75,7 @@ export default function NavHeader() {
if (!userInfo) {
setOpenLoginModal(true);
} else {
if (userInfo.companyAuthStatus) {
setOpenPublishModal(true);
} else {
router.push("/certification");
}
setOpenPublishModal(true);
}
}
......
......@@ -3,8 +3,8 @@ import { FilterOptionResp, RegionResp } from "./api";
import ResultItem from "./compoents/resultItem";
import RegionItem from "./compoents/regionItem";
import styles from "./index.module.scss";
import { useEffect, useState , forwardRef , useImperativeHandle } from "react";
import { useRouter } from 'next/router'
import React, { useEffect, useState, forwardRef, useImperativeHandle, Ref } from "react";
import { useRouter } from "next/router";
import BrandItem from "./compoents/brandItem";
import ModelItem from "./compoents/modelItem";
import PartItem from "./compoents/partItem";
......@@ -60,65 +60,74 @@ type Props = {
) => void; //筛选条件更改事件
};
const idArr = ["brandId","categoryId","modelId","partsId","productCategoryId","qualityId","industryId","appTypeId"]
const nameArr:any = {
brandId: {
type:"brandId",
typeObj:"brand",
typeName:"品牌:",
const idArr = [
"brandId",
"categoryId",
"modelId",
"partsId",
"productCategoryId",
"qualityId",
"industryId",
"appTypeId",
];
const nameArr: any = {
brandId: {
type: "brandId",
typeObj: "brand",
typeName: "品牌:",
},
// districtId: {
// districtId: {
// type:"districtId",
// typeObj:"region",
// typeName:"地域:",
// },
modelId:{
type:"modelId",
typeObj:"model",
typeName:"型号:",
modelId: {
type: "modelId",
typeObj: "model",
typeName: "型号:",
},
partsId: {
type:"partsId",
typeObj:"part",
typeName:"部件:",
partsId: {
type: "partsId",
typeObj: "part",
typeName: "部件:",
},
productCategoryId: {
type:"productCategoryId",
typeObj:"category",
typeName:"类目:",
productCategoryId: {
type: "productCategoryId",
typeObj: "category",
typeName: "类目:",
},
qualityId: {
type:"qualityId",
typeObj:"quality",
typeName:"成色:",
qualityId: {
type: "qualityId",
typeObj: "quality",
typeName: "成色:",
},
industryId: {
type:"industryId",
typeObj:"industryId",
typeName:"行业:",
industryId: {
type: "industryId",
typeObj: "industryId",
typeName: "行业:",
},
appTypeId: {
type:"appTypeId",
typeObj:"appTypeId",
typeName:"应用:",
appTypeId: {
type: "appTypeId",
typeObj: "appTypeId",
typeName: "应用:",
},
categoryId: {
type:"categoryId",
typeObj:"categoryId",
typeName:"类目:",
categoryId: {
type: "categoryId",
typeObj: "categoryId",
typeName: "类目:",
},
}
const Filter = forwardRef((props: Props,ref) => {
};
const Filter = (props: Props, ref: Ref<any>) => {
const router = useRouter();
useImperativeHandle(ref, () => ({
idArr:idArr,
clearRouter:clearRouter
}))
idArr: idArr,
clearRouter: clearRouter,
}));
const [result, setResult] = useState<FilterResult>({});
const onChange = (item: FilterOptionResp, type: string) => {
clearRouter()
clearRouter();
let data: { [key: string]: FilterOptionResp } = {};
data[type] = item;
......@@ -139,25 +148,28 @@ const nameArr:any = {
});
}, [result]);
useEffect(()=>{
useEffect(() => {
let queryVal = JSON.parse(JSON.stringify(router.query));
if (Object.keys(router.query).length) {
for (const key in queryVal) {
if (idArr.includes(key)) {
onChange({id:queryVal[key],name: nameArr[key].typeName + queryVal.name},nameArr[key].typeObj)
}
onChange(
{ id: queryVal[key], name: nameArr[key].typeName + queryVal.name },
nameArr[key].typeObj
);
}
}
}
},[router])
}, [router]);
const clearRouter = () => {
if (Object.keys(router.query).length) {
router.query = {}
router.replace(router.pathname)
router.query = {};
router.replace(router.pathname);
}
}
};
const onDel = (key: string) => {
clearRouter()
clearRouter();
//@ts-ignore
delete result[key];
setResult({
......@@ -236,7 +248,6 @@ const nameArr:any = {
</div>
</>
);
}
)
};
export default Filter
\ No newline at end of file
export default forwardRef(Filter);
......@@ -67,7 +67,7 @@ export default function LoginModal(props: Props) {
window.localStorage.setItem("token", res.result.token);
api.userInfo().then((res) => {
setUserInfo(res.result || "");
setUserInfo(res.result);
window.messageApi.success("登录成功");
props.onCancel();
});
......
......@@ -10,8 +10,8 @@ import api, { UserInfoResp } from "~/api";
export const UserContext = createContext<{
testLogin: () => void;
logout: () => void;
userInfo: UserInfoResp | null | "";
setUserInfo: Dispatch<SetStateAction<UserInfoResp | null | "">>;
userInfo: UserInfoResp | null | undefined;
setUserInfo: Dispatch<SetStateAction<UserInfoResp | null | undefined>>;
needLogin: Boolean;
setNeedLogin: Dispatch<SetStateAction<Boolean>>;
}>({
......@@ -27,12 +27,14 @@ type Props = {
children: React.ReactNode;
};
const UserProvider = ({ children }: Props) => {
const [userInfo, setUserInfo] = useState<UserInfoResp | null | ''>(null);
const [userInfo, setUserInfo] = useState<UserInfoResp | null | undefined>(null);
const [needLogin, setNeedLogin] = useState<Boolean>(false); //用于通知登录modal需要打开
useEffect(() => {
try {
setUserInfo(JSON.parse(window.localStorage.getItem("userInfo") || ""));
setUserInfo(
JSON.parse(window.localStorage.getItem("userInfo") || "") || undefined
);
} catch (e) {}
}, []);
......@@ -48,7 +50,7 @@ const UserProvider = ({ children }: Props) => {
if (res.code == "200") {
window.localStorage.setItem("token", res.result?.token || "");
api.userInfo().then((res) => {
setUserInfo(res.result || '');
setUserInfo(res.result || undefined);
});
}
});
......@@ -57,7 +59,7 @@ const UserProvider = ({ children }: Props) => {
//登出
function logout() {
localStorage.setItem("token", "");
setUserInfo('');
setUserInfo(undefined);
}
return (
......
......@@ -40,10 +40,9 @@ export interface CommentParams {
content: string; //评论内容
dynamicId: number; //动态id
parentId?: number; //父级评论
userId: number; //用户id
}
export interface ByDynamicParams {
export interface ByDynamicResp {
id: number;
dynamicId: number;
parentId: number;
......@@ -51,7 +50,12 @@ export interface ByDynamicParams {
content: string;
likesCount: number;
createTime: string;
children: ByDynamicParams[];
children: ByDynamicResp[];
userBaseInfoVO: {
id: number,
nickName: string,
userImg: string
}
}
export default {
......@@ -70,7 +74,14 @@ export default {
},
//根据动态查看评论
byDynamic(params: { dynamicId: number }): Promise<Response<Array<ByDynamicParams>>> {
byDynamic(params: {
dynamicId: number;
}): Promise<Response<Array<ByDynamicResp>>> {
return request("/release/dynamic/byDynamic", "get", params);
},
//点赞或取消点赞
likeOrCancel(params: { dynamicId: number }) {
return request("/release/dynamic/likeOrCancel", "get", params);
},
};
......@@ -15,14 +15,15 @@ import errImg from "~/assets/errImg";
import { RightOutlined } from "@ant-design/icons";
import { useContext, useEffect, useState } from "react";
import PublishMessage from "./components/publishMessage";
import api, { ByDynamicParams, Dynamic } from "./api";
import api, { ByDynamicResp, Dynamic } from "./api";
import InfiniteScroll from "react-infinite-scroll-component";
import { UserContext } from "~/lib/userProvider";
import moment from "moment";
interface Item extends Dynamic {
openComment?: boolean; //是否开启评论
showCommentAll?: boolean; //是否展示全部评论
commentList?: Array<ByDynamicParams>;
commentList?: Array<ByDynamicResp>; //评论列表
}
export default function Forum() {
......@@ -34,6 +35,7 @@ export default function Forum() {
});
const [count, setCount] = useState(0); //动态总数
const { userInfo, setNeedLogin } = useContext(UserContext);
const [form] = Form.useForm(); //评论区的form
useEffect(() => {
api
......@@ -78,27 +80,74 @@ export default function Forum() {
item.openComment = !item.openComment;
const temp = [...list];
setList(temp);
getCommentList(item);
};
//评论内容
const onComment = (values: any, id: number, i: number) => {
//获取评论列表
const getCommentList = (item: Item) => {
api
.byDynamic({
dynamicId: item.id,
})
.then((res) => {
if (res?.code === "200") {
item.commentList = res.result || [];
}
const temp = [...list];
setList(temp);
});
};
//展示所有评论
const showCommentAll = (item: Item) => {
item.showCommentAll = true;
const temp = [...list];
setList(temp);
};
//评论内容
const onComment = (values: any, item: Item) => {
if (userInfo) {
api
.comment({
content: values.content,
dynamicId: id,
userId: userInfo.id,
dynamicId: item.id,
})
.then((res) => {
if (res.code === "200") {
window.messageApi.success("评论成功");
form.resetFields(["content"]);
item.commentCount += 1;
getCommentList(item);
}
});
} else {
setNeedLogin(true);
}
};
//点赞或取消
const onLike = (item: Item) => {
if (userInfo) {
api
.likeOrCancel({
dynamicId: item.id,
})
.then((res) => {
if (res.code === "200") {
item.likes = !item.likes;
if (item.likes) {
item.likesCount++;
} else {
item.likesCount--;
}
const temp = [...list];
setList(temp);
}
});
}
};
return (
<Layout>
<div className={styles.forum}>
......@@ -169,7 +218,10 @@ export default function Forum() {
></div>
{item.commentCount}评论
</div>
<div className={styles.ctrlsItem}>
<div
className={styles.ctrlsItem}
onClick={() => onLike(item)}
>
<div
className={`${styles.ctrlsItemIcon} ${
styles.iconPraise
......@@ -183,8 +235,9 @@ export default function Forum() {
{item.openComment && (
<div className={styles.commentWrap}>
<Form
form={form}
onFinish={(values) => {
onComment(values, item.id, i);
onComment(values, item);
}}
>
<Form.Item
......@@ -213,38 +266,53 @@ export default function Forum() {
</Form>
<div className={styles.comments}>
<div className={styles.commentItem}>
<div className={styles.commentHeadImg}></div>
<div className={styles.info}>
<div className={styles.nameWrap}>
<div className={styles.commentName}>
无人机爱好者111:
<div className={styles.date}>05-16</div>
</div>
<div className={styles.commentContent}>
无人机记录生活
{/* 判断是否展示所有评论 */}
{item.commentList
?.filter((comment, i) => {
if (item.showCommentAll) {
return true;
} else {
if (i < 2) {
return true;
}
}
})
.map((comment) => {
return (
<div
key={comment.id}
className={styles.commentItem}
>
<div className={styles.commentHeadImg}>
<Image
src={comment.userBaseInfoVO?.userImg}
></Image>
</div>
<div className={styles.info}>
<div className={styles.nameWrap}>
<div className={styles.commentName}>
{comment.userBaseInfoVO?.nickName}
<div className={styles.date}>
{moment(comment.createTime).format(
"YYYY-MM-DD"
)}
</div>
</div>
<div className={styles.commentContent}>
{comment.content}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div className={styles.commentItem}>
<div className={styles.commentHeadImg}></div>
<div className={styles.info}>
<div className={styles.nameWrap}>
<div className={styles.commentName}>
无人机爱好者111:
<div className={styles.date}>05-16</div>
</div>
<div className={styles.commentContent}>
无人机记录生活
</div>
</div>
</div>
</div>
);
})}
</div>
{!item.showCommentAll && (
<div className={styles.showAll}>
查看全部15条评论
{!item.showCommentAll && item.commentCount > 2 && (
<div
className={styles.showAll}
onClick={() => showCommentAll(item)}
>
查看全部{item.commentCount}条评论
<RightOutlined size={14} />
</div>
)}
......
......@@ -22,13 +22,14 @@ export default function Bids(props: Props) {
const [count, setCount] = useState(0);
const [abort, setAbort] = useState<AbortController | null>(null);
const [loading, setLoading] = useState(false);
const {userInfo, setNeedLogin} = useContext(UserContext);
const { userInfo, setNeedLogin } = useContext(UserContext);
const [reload, setReload] = useState(false);
useEffect(() => {
//中断前一次请求
abort?.abort();
setAbort(new AbortController());
}, [pageParams, props.params]);
}, [pageParams, props.params, reload]);
useEffect(() => {
if (!abort) {
......@@ -70,6 +71,7 @@ export default function Bids(props: Props) {
.then((res) => {
if (res.code === "200") {
window.messageApi.success("申请成功");
setReload(!reload);
}
});
} else {
......
......@@ -24,6 +24,7 @@ export interface Item {
publishName: string;
publishPhone: string;
requireDescription: string;
requirementTypeName: string;
solved?: 0 | 1;
createTime: string;
updateTime?: string;
......@@ -31,7 +32,6 @@ export interface Item {
export interface SolveRequireParams {
requirementsInfoId: number, //需求id
userAccountId: number //用户id
}
......
......@@ -32,6 +32,7 @@
}
.desc {
width: fit-content;
font-size: 14px;
font-family: MicrosoftYaHei;
color: RGBA(135, 135, 135, 0.4);
......
import { Button, Empty, Pagination, Popconfirm, Spin } from "antd";
import { Button, Empty, Pagination, Popconfirm, Spin, Tooltip } from "antd";
import router from "next/router";
import React, { useState, useEffect } from "react";
import React, { useState, useEffect, useContext } from "react";
import { UserContext } from "~/lib/userProvider";
import api, { Item } from "./api";
import styles from "./index.module.scss";
......@@ -22,12 +23,8 @@ export default function Requirements(props: Props) {
});
const [count, setCount] = useState(0);
const [abort, setAbort] = useState<AbortController | null>(null);
const [userId, setUserId] = useState(-1);
const [reload, setReload] = useState(false);
useEffect(() => {
setUserId(Number(window.localStorage.getItem("userId") || -1));
}, []);
const { userInfo } = useContext(UserContext);
useEffect(() => {
//中断前一次请求
......@@ -72,7 +69,6 @@ export default function Requirements(props: Props) {
api
.solveRequire({
requirementsInfoId: item.id,
userAccountId: userId,
})
.then((res) => {
if (res.code === "200") {
......@@ -94,14 +90,16 @@ export default function Requirements(props: Props) {
<div className={styles.logo}></div>
<div className={styles.info}>
<div className={styles.title}>
项目需求:{item.requireDescription}
项目需求:{item.requirementTypeName}
</div>
{/*
<div className={styles.desc}>
具体需求:{item.requireDescription}
</div> */}
<Tooltip placement="top" title={item.requireDescription}>
<div className={styles.desc}>
具体需求:{item.requireDescription}
</div>
</Tooltip>
</div>
{item.userAccountId === userId ? (
{userInfo && item.userAccountId === userInfo.id ? (
<Popconfirm
title="提示"
description="确认该需求已经解决了吗?"
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论