feat:新增客户查看图片页面,新增反馈表查看上传图片

main
ybc 1 month ago
parent db8b978ff2
commit a6cde1f8fb

@ -1,5 +1,5 @@
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { Upload, List, Button, Space,Popconfirm } from "antd"; import { Upload, List, Button, Popconfirm , Col , Row } from "antd";
import { UploadOutlined, FileTextOutlined,DeleteOutlined } from "@ant-design/icons"; import { UploadOutlined, FileTextOutlined,DeleteOutlined } from "@ant-design/icons";
import { Image } from "antd"; import { Image } from "antd";
import { fetchJSON } from "@/utils/request"; import { fetchJSON } from "@/utils/request";
@ -21,9 +21,9 @@ const simple_encrypt = text => {
}; };
// //
const getImageList = async key => { const getImageList = async (key,type='111') => {
try { try {
const { errcode, result } = await fetchJSON(`${HT3_HOST}/oss/list_unique_key?key=${key}`); const { errcode, result } = await fetchJSON(`${HT3_HOST}/oss/list_unique_key?key=${key}&type=${type}`);
if (errcode === 0) { if (errcode === 0) {
return result return result
.map(file => ({ .map(file => ({
@ -220,12 +220,15 @@ export const ImageUploader = props => {
export const ImageViewer = props => { export const ImageViewer = props => {
const [fileList, setFileList] = useState([]); const [fileList, setFileList] = useState([]);
const key = simple_encrypt(props.osskey); const key = props.osskey;
const type = props.type || '111';
// //
useEffect(() => { useEffect(() => {
const loadImages = async () => { const loadImages = async () => {
const images = await getImageList(key); const images = await getImageList(key,type);
setFileList(images); setFileList(images);
if (props.onChange) { if (props.onChange) {
// //
@ -241,20 +244,24 @@ export const ImageViewer = props => {
return ( return (
<> <>
<Image.PreviewGroup> <Image.PreviewGroup>
<Space> <Row gutter={[20, 20]}>
{fileList && {fileList &&
fileList.map(item => { fileList.map(item => {
return item.key.match(/\.(jpg|jpeg|png|gif|bmp|webp)$/i) ? ( return (
<Image key={item.encrypt_key} width={200} src={item.url} /> <Col key={item.encrypt_key}>
) : ( {item.key.match(/\.(jpg|jpeg|png|gif|bmp|webp)$/i) ? (
<a key={item.encrypt_key} href={item.url} download> <Image width={200} src={item.url} />
<Button type="primary" icon={<FileTextOutlined />} size="large" title={item.key.replace(/^.*[\\/]/, '')}> ) : (
...{item.key.slice(-10)} <a href={item.url} download>
</Button> <Button type="primary" icon={<FileTextOutlined />} size="large" title={item.key.replace(/^.*[\\\/]/, '')}>
</a> ...{item.key.slice(-10)}
); </Button>
})} </a>
</Space> )}
</Col>
);
})}
</Row>
</Image.PreviewGroup> </Image.PreviewGroup>
</> </>
); );

@ -46,6 +46,7 @@ import ProductsManage from '@/views/products/Manage';
import ProductsDetail from '@/views/products/Detail'; import ProductsDetail from '@/views/products/Detail';
import ProductsAudit from '@/views/products/Audit'; import ProductsAudit from '@/views/products/Audit';
import ImageViewer from '@/views/ImageViewer'; import ImageViewer from '@/views/ImageViewer';
import CustomerImageViewer from '@/views/CustomerImageViewer';
import PickYear from './views/products/PickYear' import PickYear from './views/products/PickYear'
import { PERM_ACCOUNT_MANAGEMENT, PERM_ROLE_NEW, PERM_OVERSEA,PERM_TRAIN_TICKET, PERM_AIR_TICKET, PERM_PRODUCTS_MANAGEMENT, PERM_PRODUCTS_OFFER_PUT } from '@/config' import { PERM_ACCOUNT_MANAGEMENT, PERM_ROLE_NEW, PERM_OVERSEA,PERM_TRAIN_TICKET, PERM_AIR_TICKET, PERM_PRODUCTS_MANAGEMENT, PERM_PRODUCTS_OFFER_PUT } from '@/config'
@ -107,6 +108,7 @@ const initRouter = async () => {
{ path: '/login', element: <Login /> }, { path: '/login', element: <Login /> },
{ path: '/logout', element: <Logout /> }, { path: '/logout', element: <Logout /> },
{ path: '/image-viewer/:GRI_SN/:GRI_No', element: <ImageViewer /> }, { path: '/image-viewer/:GRI_SN/:GRI_No', element: <ImageViewer /> },
{ path: '/customer-image/:key', element: <CustomerImageViewer /> },
] ]
} }
]) ])

@ -0,0 +1,47 @@
import React, { useState, useEffect } from 'react';
import { Input, Button, Card, Typography, Space, Alert } from 'antd';
import { useParams } from 'react-router-dom';
import {ImageViewer} from '@/components/ImageUploader';
const { Title, Text } = Typography;
const CustomerImageViewer = () => {
const [ossKey, setOssKey] = useState('');
const [showUploader, setShowUploader] = useState(false);
const { key } = useParams();
useEffect(() => {
console.log(key);
// const key = `temp/tour-guide/2025-6/31278`;
setOssKey(key);
setShowUploader(true);
}, []);
return (
<div>
<Alert
message="信息提示"
description="您可以在此页面查看与旅行相关的所有图片,支持点击放大等操作。"
type="info"
showIcon
/>
<br/>
{showUploader ? (
<div>
<ImageViewer osskey={ossKey} type='222' />
</div>
) : (
<div>
<Text style={{ display: 'block', color: '#874d00', fontSize: '16px' }}>
无法提取客户信息
</Text>
</div>
)}
</div>
);
};
export default CustomerImageViewer;

@ -6,7 +6,7 @@ import * as config from '@/config';
import { getFeedbackDetail, getCustomerFeedbackDetail, getFeedbackImages, getFeedbackInfo, removeFeedbackImages, postFeedbackInfo } from '@/stores/Feedback'; import { getFeedbackDetail, getCustomerFeedbackDetail, getFeedbackImages, getFeedbackInfo, removeFeedbackImages, postFeedbackInfo } from '@/stores/Feedback';
import BackBtn from '@/components/BackBtn'; import BackBtn from '@/components/BackBtn';
import { usingStorage } from '@/hooks/usingStorage'; import { usingStorage } from '@/hooks/usingStorage';
import {ImageUploader} from '@/components/ImageUploader';
const { Title, Text, Paragraph } = Typography; const { Title, Text, Paragraph } = Typography;
function Detail() { function Detail() {
@ -21,6 +21,11 @@ function Detail() {
const [feedbackReview, setFeedbackReview] = useState({}); const [feedbackReview, setFeedbackReview] = useState({});
const [feedbackImages, setFeedbackImages] = useState([]); const [feedbackImages, setFeedbackImages] = useState([]);
const [feedbackInfo, setFeedbackInfo] = useState({}); const [feedbackInfo, setFeedbackInfo] = useState({});
const [ossKey, setOssKey] = useState('');
useEffect(() => {
const key = `temp/tour-guide/2025-6/31278`;
setOssKey(key);
}, []);
useEffect(() => { useEffect(() => {
// console.info('Detail.useEffect: ' + GRI_SN); // console.info('Detail.useEffect: ' + GRI_SN);
@ -173,12 +178,9 @@ function Detail() {
listType='picture-card' listType='picture-card'
onChange={handleChange} onChange={handleChange}
onRemove={handRemove}> onRemove={handRemove}>
<div>
<PlusOutlined />
<div style={{ marginTop: 8 }}>Upload photos</div>
</div>
</Upload> </Upload>
</Form.Item> </Form.Item>
<ImageUploader osskey={ossKey} style={{margin: '16px'}}/>
<Form.Item <Form.Item
name='info_content' name='info_content'
rules={[ rules={[

@ -6,6 +6,7 @@ import * as config from "@/config";
import { getFeedbackDetail, getFeedbackImages, getFeedbackInfo, removeFeedbackImages, postFeedbackInfo } from '@/stores/Feedback'; import { getFeedbackDetail, getFeedbackImages, getFeedbackInfo, removeFeedbackImages, postFeedbackInfo } from '@/stores/Feedback';
import BackBtn from "@/components/BackBtn"; import BackBtn from "@/components/BackBtn";
import { usingStorage } from "@/hooks/usingStorage"; import { usingStorage } from "@/hooks/usingStorage";
import {ImageUploader} from '@/components/ImageUploader';
const { Title, Text, Paragraph } = Typography; const { Title, Text, Paragraph } = Typography;
function Detail() { function Detail() {
@ -20,6 +21,11 @@ function Detail() {
const [feedbackReview, setFeedbackReview] = useState({}); const [feedbackReview, setFeedbackReview] = useState({});
const [feedbackImages, setFeedbackImages] = useState([]); const [feedbackImages, setFeedbackImages] = useState([]);
const [feedbackInfo, setFeedbackInfo] = useState({}); const [feedbackInfo, setFeedbackInfo] = useState({});
const [ossKey, setOssKey] = useState('');
useEffect(() => {
const key = `temp/tour-guide/2025-6/31278`;
setOssKey(key);
}, []);
useEffect(() => { useEffect(() => {
// console.info("Detail.useEffect: " + GRI_SN); // console.info("Detail.useEffect: " + GRI_SN);
@ -171,12 +177,9 @@ function Detail() {
listType="picture-card" listType="picture-card"
onChange={handleChange} onChange={handleChange}
onRemove={handRemove}> onRemove={handRemove}>
<div>
<PlusOutlined />
<div style={{ marginTop: 8 }}>Upload photos</div>
</div>
</Upload> </Upload>
</Form.Item> </Form.Item>
<ImageUploader osskey={ossKey} />
<Form.Item <Form.Item
name="info_content" name="info_content"
rules={[ rules={[

Loading…
Cancel
Save