feat:使用字典

This commit is contained in:
1708-huayu 2024-12-31 21:53:20 +08:00
parent 7c0b6d2474
commit abc20d99c2
8 changed files with 91 additions and 22 deletions

View File

@ -1,23 +1,54 @@
import {Tag,} from "antd-mobile"; import {Tag,} from "antd-mobile";
import React from "react"; import React, {useEffect, useState} from "react";
import {useLocation, useNavigate} from 'react-router-dom'; import {useLocation, useNavigate} from 'react-router-dom';
import {CloseOutline, SearchOutline} from "antd-mobile-icons"; import {CloseOutline, SearchOutline} from "antd-mobile-icons";
import "./index.css" import "./index.css"
import {getDictionary} from "../../utils/dictUtil";
const DetailSearchBar = () => { const DetailSearchBar = (props) => {
const navigate = useNavigate(); // 从搜索设置中传来的search
const location = useLocation(); // const location = useLocation();
const search = location.state?.search; // const searchUpdate = location.state?.search;
// 父子传值从搜索框传来的search
const {search,updateSearch} = props;
console.log("DetailSearchBar.search", search) console.log("DetailSearchBar.search", search)
const [tags, setTags] = useState([]);
useEffect(() => {
if (search && search.data) {
Promise.all(
search.data.map(async (searchObj) => {
if (searchObj.name === "state") {
const dictionary = await getDictionary("2");
const items = searchObj.value.split(',');
const itemPromises = items.map((item) => {
const dict = dictionary.get(item);
return dict ? <Tag key={dict.id} color={dict.jsonValue?.color}>{dict.itemName}</Tag> : null;
});
return Promise.all(itemPromises);
}
})
).then((results) => {
// Flatten the results and filter out null values
const flattenedResults = results.flat().filter(Boolean);
console.log("flattenedResults", flattenedResults);
setTags(flattenedResults);
});
}
}, []);
const navigate = useNavigate();
return ( return (
<div className="detailSearchBar"> <div className="detailSearchBar">
<div className={"onSearchItem " + (search ? "onSearchItemWidth" : "onSearchItemOnlyWidth")} onClick={() => { <div className={"onSearchItem " + (search ? "onSearchItemWidth" : "onSearchItemOnlyWidth")} onClick={() => {
navigate("/detail/searchTask") navigate("/detail/searchTask", {state: {"search":search}});
}}> }}>
<SearchOutline/><Tag color={"danger"}>紧急重要</Tag> <SearchOutline/>
{/*根据search处理搜素框展示内容*/}
{tags}
</div> </div>
{search && <div className="CloseOutline-CloseOutline" onClick={() => { {search && <div className="CloseOutline-CloseOutline" onClick={() => {
console.log("CloseOutline-Close"); updateSearch(null);
setTags([]);
}}> }}>
<CloseOutline style={{float: "right"}}/> <CloseOutline style={{float: "right"}}/>
</div> </div>

View File

@ -38,11 +38,11 @@ const ParentTask = (props)=>{
// return // return
// } // }
const data = await getTaskByPid(v) const data = await getTaskByPid(v)
console.log("await getTaskByPid(v)",data.data.data.content) console.log("await getTaskByPid(v)",data.content)
const options = const options =
data.data.data.content.length === 0 data.content.length === 0
? null ? null
: data.data.data.content.map(task => ({ : data.content.map(task => ({
value: task.id, value: task.id,
label: task.name, label: task.name,
})) }))

View File

@ -6,20 +6,25 @@ import {CloseCircleFill} from "antd-mobile-icons";
import {useLocation, useNavigate, useOutletContext} from "react-router-dom"; import {useLocation, useNavigate, useOutletContext} from "react-router-dom";
const now = new Date() const now = new Date()
const DetailSearchContext = () => { const DetailSearchContext = () => {
// 使用Outlet,传值修改标题
const {setTitle} = useOutletContext(); const {setTitle} = useOutletContext();
setTitle("搜索查询") setTitle("搜索查询")
const navigate = useNavigate(); const navigate = useNavigate();
const [form] = Form.useForm(); const [form] = Form.useForm();
const [visible, setVisible] = React.useState(false); const [visible, setVisible] = React.useState(false);
const location = useLocation(); const location = useLocation();
const search = location.state?.search; console.log("DetailSearchContext",location);
const {search,updateSearch} = location.state;
console.log("DetailSearchContext.search",search) console.log("DetailSearchContext.search",search)
return ( return (
<Form <Form
form={form} form={form}
layout='horizontal' layout='horizontal'
onFinish={(values)=>{ onFinish={(values)=>{
navigate("/home/todo", { state: { search: values } }) // navigate("/home/todo", { state: { search: values } })
// 根据values处理search
// updateSearch()
navigate("/home/todo")
}} }}
footer={ footer={
<Button block type='submit' color='primary' size='large'> <Button block type='submit' color='primary' size='large'>

View File

@ -4,6 +4,7 @@ import './index.css'
import {Outlet} from 'react-router-dom' import {Outlet} from 'react-router-dom'
import DetailSearchBar from "../../components/DetailSearchBar"; import DetailSearchBar from "../../components/DetailSearchBar";
export default class Home extends React.Component { export default class Home extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
@ -17,10 +18,13 @@ export default class Home extends React.Component {
{"name":"expectedStartTime","value":"2024-12-29T16:00:00.000Z","operateType":"<="}]} {"name":"expectedStartTime","value":"2024-12-29T16:00:00.000Z","operateType":"<="}]}
}; };
} }
updateSearch = (values) => {
this.setState({search:values});
};
render() { render() {
return ( return (
<div className='body'> <div className='body'>
<DetailSearchBar/> <DetailSearchBar search={ this.state.search } updateSearch={this.updateSearch} />
<div style={{marginTop:"40px",marginBottom:"49px",width:"100%"}}> <div style={{marginTop:"40px",marginBottom:"49px",width:"100%"}}>
<Outlet/> <Outlet/>
</div> </div>

View File

@ -31,15 +31,15 @@ const ToDoList = () => {
console.log("ToDoList.search",search) console.log("ToDoList.search",search)
async function loadMore() { async function loadMore() {
getTaskList(pageNumber+1).then(result => { getTaskList(pageNumber+1).then(result => {
setTaskList(val => [...val, ...result.data.data.content]) setTaskList(val => [...val, ...result.content])
setHasMore(result.data.data.content.length > 0) setHasMore(result.content.length > 0)
}) })
setPageNumber(pageNumber + 1) setPageNumber(pageNumber + 1)
} }
useEffect(() => { useEffect(() => {
getTaskList(pageNumber).then(result => { getTaskList(pageNumber).then(result => {
setTaskList(result.data.data.content) setTaskList(result.content)
}) })
}, []) }, [])
const onDragEnd = (result) => { const onDragEnd = (result) => {
@ -54,7 +54,7 @@ const ToDoList = () => {
onRefresh={async () => { onRefresh={async () => {
getTaskList(1).then(result => { getTaskList(1).then(result => {
console.log("getTaskList()", result) console.log("getTaskList()", result)
setTaskList(result.data.data.content) setTaskList(result.content)
setPageNumber(1) setPageNumber(1)
setHasMore(true) setHasMore(true)
}) })

17
src/utils/dictUtil.js Normal file
View File

@ -0,0 +1,17 @@
import {requestUtil} from "./requestUtil";
const dict = new Map();
export const getDictionary= async (typeId) => {
if (dict.has(typeId)) {
return dict.get(typeId);
}
let search = encodeURI(`{"data":[{"code":"type_id","value":"${typeId}","operateType":"="}]}`)
let todo = await requestUtil.get(`/todo-server/search/dict_items?search=${search}`);
let context = todo.content;
let result;
if (context.length>0){
result = new Map(context.map(item => [item.itemCode, item]))
dict.set(typeId,result);
}
return result;
}

View File

@ -34,7 +34,5 @@ export const getTaskByPid = (pid) => {
} }
export const addTask = async (entity) => { export const addTask = async (entity) => {
// 使用 Axios 发送 POST 请求添加数据 // 使用 Axios 发送 POST 请求添加数据
const response = await requestUtil.post('/todo-server' + '/task', entity); return await requestUtil.post('/todo-server' + '/task', entity);
// 从响应中提取数据并返回
return response.data;
} }

View File

@ -5,3 +5,17 @@ export const requestUtil = axios.create({
timeout: 1000, timeout: 1000,
headers: {'Authorization': 'Bearer eyJraWQiOiIwNzdlYzBjMi1iZDQwLTRjODktOGE5OC05OTI1YmZkNzJlZjAiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJzaGl4aWFvaHVhIiwic3ViIjoie1wiaWRcIjpcIjM2OTg0Nzc3MTAxODAzNTIwXCIsXCJuaWNrbmFtZVwiOlwi5biI5pmT5Y2OXCIsXCJ1c2VybmFtZVwiOlwic2hpeGlhb2h1YVwifSJ9.WiNGZYbWlIdu3WL7ujtlKsGa42IblW93SG-Mf4jDOuECWrDHFNA0gJBKUQkWKQfpWWRaIzcBmUC78WkIM5yFIHiB2_wBXyywHyjVCWBYC3sTJghtWogLB9ceR69eNfCZanm_ZlrcIEWJ9rqCk-hmMEuWwIk9xJ-M4hFGHkoAr_ftYJiBkGqgKpXOeVE_Tish6SqYZtN-V6Dcnyny3k7T6lG1jzXGyhokEzg_0B5hYpRvvA-GJx14Q1RO6Sv3vgMFOX63bhKX3L7KCSwLO2NJ5GkFHXqcDCf_-pnbiHUtP1JrchzXGWpI_Blrlf_65CdrMWuyVSGtDJ6_Z-Ef4Uq_tQ'} headers: {'Authorization': 'Bearer eyJraWQiOiIwNzdlYzBjMi1iZDQwLTRjODktOGE5OC05OTI1YmZkNzJlZjAiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJzaGl4aWFvaHVhIiwic3ViIjoie1wiaWRcIjpcIjM2OTg0Nzc3MTAxODAzNTIwXCIsXCJuaWNrbmFtZVwiOlwi5biI5pmT5Y2OXCIsXCJ1c2VybmFtZVwiOlwic2hpeGlhb2h1YVwifSJ9.WiNGZYbWlIdu3WL7ujtlKsGa42IblW93SG-Mf4jDOuECWrDHFNA0gJBKUQkWKQfpWWRaIzcBmUC78WkIM5yFIHiB2_wBXyywHyjVCWBYC3sTJghtWogLB9ceR69eNfCZanm_ZlrcIEWJ9rqCk-hmMEuWwIk9xJ-M4hFGHkoAr_ftYJiBkGqgKpXOeVE_Tish6SqYZtN-V6Dcnyny3k7T6lG1jzXGyhokEzg_0B5hYpRvvA-GJx14Q1RO6Sv3vgMFOX63bhKX3L7KCSwLO2NJ5GkFHXqcDCf_-pnbiHUtP1JrchzXGWpI_Blrlf_65CdrMWuyVSGtDJ6_Z-Ef4Uq_tQ'}
}); });
// 添加响应拦截器
requestUtil.interceptors.response.use(function (response) {
// 2xx 范围内的状态码都会触发该函数。
// 对响应数据做点什么
console.log("response",response);
if (response.data.data.status !== 200){
}
return response.data.data;
}, function (error) {
// 超出 2xx 范围的状态码都会触发该函数。
// 对响应错误做点什么
return Promise.reject(error);
});