perf: avatar

This commit is contained in:
archer
2023-05-29 23:40:22 +08:00
parent 2fc31a706d
commit d36a7cb177
15 changed files with 34 additions and 18 deletions

View File

@@ -21,7 +21,7 @@
| 文件拆分 | 0.025 | | 文件拆分 | 0.025 |
**其他问题** **其他问题**
请 WX 联系: fastgpt123 请 WX 联系: YNyiqi
| 交流群 | 小助手 | | 交流群 | 小助手 |
| ----------------------- | -------------------- | | ----------------------- | -------------------- |
| ![](https://otnvvf-imgs.oss.laf.run/wxqun300.jpg) | ![](https://otnvvf-imgs.oss.laf.run/wx300.jpg) | | ![](https://otnvvf-imgs.oss.laf.run/wxqun300.jpg) | ![](https://otnvvf-imgs.oss.laf.run/wx300.jpg) |

View File

@@ -27,7 +27,7 @@ FastGpt 项目完全开源,可随意私有化部署,去除平台风险忧虑
### 交流群/问题反馈 ### 交流群/问题反馈
如果群满了,可加个小助手,定时拉 如果群满了,可加个小助手,定时拉
wx 号: fastgpt123 wx 号: YNyiqi
| 交流群 | 小助手 | | 交流群 | 小助手 |
| ------------------------------------------------- | ---------------------------------------------- | | ------------------------------------------------- | ---------------------------------------------- |

View File

@@ -1,4 +1,10 @@
### Fast GPT V3.8 ### Fast GPT V3.8.1
- 新增 - 知识库引用反馈 1. 新增 - 自定义历史记录标题
- 新增 - 知识库与 AI 助手对多对关系,一个知识库可以被多个 AI 助手关联,一个 AI 助手可以关联多个知识库 2. 新增 - 置顶历史记录
3. 新增 - 自动置顶最近聊天的模型。
4. 优化 - 索引和 QA 队列,支持多节点和并发(目前线上大概 2500 条/分钟)
5. 优化 - 随机任务,不再按线性等待。
6. 优化 - 内容分段导入和进度查看,不再担心大文件无法导入
7. 优化 - 导出的 csv 大小。最大支持 100M 导出。
8. 知识库数量说明,由于线上数据太多,没法创建索引,所以目前如果超过 5w 组数据,大概率会失败。

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 52 KiB

View File

@@ -16,6 +16,7 @@ export interface InitChatResponse {
export interface InitShareChatResponse { export interface InitShareChatResponse {
maxContext: number; maxContext: number;
userAvatar: string;
model: { model: {
name: string; name: string;
avatar: string; avatar: string;

View File

@@ -1,16 +1,19 @@
import React from 'react'; import React from 'react';
import { Image } from '@chakra-ui/react'; import { Image } from '@chakra-ui/react';
import type { ImageProps } from '@chakra-ui/react'; import type { ImageProps } from '@chakra-ui/react';
import { LOGO_ICON } from '@/constants/chat';
const Avatar = ({ w = '30px', ...props }: ImageProps) => { const Avatar = ({ w = '30px', ...props }: ImageProps) => {
console.log(props.src);
return ( return (
<Image <Image
fallbackSrc="/icon/logo.png" fallbackSrc={LOGO_ICON}
borderRadius={'50%'} borderRadius={'50%'}
objectFit={'cover'} objectFit={'cover'}
alt="" alt=""
w={w} w={w}
h={w} h={w}
p={'1px'}
{...props} {...props}
/> />
); );

View File

@@ -5,6 +5,7 @@ import MyIcon from '../Icon';
import { useUserStore } from '@/store/user'; import { useUserStore } from '@/store/user';
import { useChatStore } from '@/store/chat'; import { useChatStore } from '@/store/chat';
import Avatar from '../Avatar'; import Avatar from '../Avatar';
import { HUMAN_ICON } from '@/constants/chat';
export enum NavbarTypeEnum { export enum NavbarTypeEnum {
normal = 'normal', normal = 'normal',
@@ -83,7 +84,7 @@ const Navbar = () => {
cursor={'pointer'} cursor={'pointer'}
onClick={() => router.push('/number')} onClick={() => router.push('/number')}
> >
<Avatar w={'36px'} h={'36px'} src={userInfo?.avatar} fallbackSrc={'/icon/human.png'} /> <Avatar w={'36px'} h={'36px'} src={userInfo?.avatar} fallbackSrc={HUMAN_ICON} />
</Box> </Box>
{/* 导航列表 */} {/* 导航列表 */}
<Box flex={1}> <Box flex={1}>

View File

@@ -31,7 +31,7 @@ const WxConcat = ({ onClose }: { onClose: () => void }) => {
<Box mt={2}> <Box mt={2}>
: :
<Box as={'span'} userSelect={'all'}> <Box as={'span'} userSelect={'all'}>
fastgpt123 YNyiqi
</Box> </Box>
</Box> </Box>
</ModalBody> </ModalBody>

File diff suppressed because one or more lines are too long

View File

@@ -1,9 +1,10 @@
import type { NextApiRequest, NextApiResponse } from 'next'; import type { NextApiRequest, NextApiResponse } from 'next';
import { jsonRes } from '@/service/response'; import { jsonRes } from '@/service/response';
import { connectToDatabase, ShareChat } from '@/service/mongo'; import { connectToDatabase, ShareChat, User } from '@/service/mongo';
import type { InitShareChatResponse } from '@/api/response/chat'; import type { InitShareChatResponse } from '@/api/response/chat';
import { authModel } from '@/service/utils/auth'; import { authModel } from '@/service/utils/auth';
import { hashPassword } from '@/service/utils/tools'; import { hashPassword } from '@/service/utils/tools';
import { HUMAN_ICON } from '@/constants/chat';
/* 初始化我的聊天框,需要身份验证 */ /* 初始化我的聊天框,需要身份验证 */
export default async function handler(req: NextApiRequest, res: NextApiResponse) { export default async function handler(req: NextApiRequest, res: NextApiResponse) {
@@ -40,9 +41,12 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
authOwner: false authOwner: false
}); });
const user = await User.findById(shareChat.userId, 'avatar');
jsonRes<InitShareChatResponse>(res, { jsonRes<InitShareChatResponse>(res, {
data: { data: {
maxContext: shareChat.maxContext, maxContext: shareChat.maxContext,
userAvatar: user?.avatar || HUMAN_ICON,
model: { model: {
name: model.name, name: model.name,
avatar: model.avatar, avatar: model.avatar,

View File

@@ -2,7 +2,6 @@ import React from 'react';
import { Card, Box, Flex } from '@chakra-ui/react'; import { Card, Box, Flex } from '@chakra-ui/react';
import { useMarkdown } from '@/hooks/useMarkdown'; import { useMarkdown } from '@/hooks/useMarkdown';
import Markdown from '@/components/Markdown'; import Markdown from '@/components/Markdown';
import { LOGO_ICON } from '@/constants/chat';
import Avatar from '@/components/Avatar'; import Avatar from '@/components/Avatar';
const Empty = ({ const Empty = ({

View File

@@ -36,7 +36,6 @@ import { streamFetch } from '@/api/fetch';
import MyIcon from '@/components/Icon'; import MyIcon from '@/components/Icon';
import { throttle } from 'lodash'; import { throttle } from 'lodash';
import { Types } from 'mongoose'; import { Types } from 'mongoose';
import { LOGO_ICON } from '@/constants/chat';
import { ChatModelMap } from '@/constants/model'; import { ChatModelMap } from '@/constants/model';
import { useChatStore } from '@/store/chat'; import { useChatStore } from '@/store/chat';
import { useLoading } from '@/hooks/useLoading'; import { useLoading } from '@/hooks/useLoading';
@@ -49,6 +48,7 @@ import SideBar from '@/components/SideBar';
import Avatar from '@/components/Avatar'; import Avatar from '@/components/Avatar';
import Empty from './components/Empty'; import Empty from './components/Empty';
import QuoteModal from './components/QuoteModal'; import QuoteModal from './components/QuoteModal';
import { HUMAN_ICON } from '@/constants/chat';
const PhoneSliderBar = dynamic(() => import('./components/PhoneSliderBar'), { const PhoneSliderBar = dynamic(() => import('./components/PhoneSliderBar'), {
ssr: false ssr: false
@@ -713,8 +713,8 @@ const Chat = ({ modelId, chatId }: { modelId: string; chatId: string }) => {
className="avatar" className="avatar"
src={ src={
item.obj === 'Human' item.obj === 'Human'
? userInfo?.avatar || '/icon/human.png' ? userInfo?.avatar || HUMAN_ICON
: chatData.model.avatar || LOGO_ICON : chatData.model.avatar
} }
w={['20px', '34px']} w={['20px', '34px']}
h={['20px', '34px']} h={['20px', '34px']}

View File

@@ -38,7 +38,6 @@ import { streamFetch } from '@/api/fetch';
import MyIcon from '@/components/Icon'; import MyIcon from '@/components/Icon';
import { throttle } from 'lodash'; import { throttle } from 'lodash';
import { Types } from 'mongoose'; import { Types } from 'mongoose';
import { LOGO_ICON } from '@/constants/chat';
import { useChatStore } from '@/store/chat'; import { useChatStore } from '@/store/chat';
import { useLoading } from '@/hooks/useLoading'; import { useLoading } from '@/hooks/useLoading';
import { fileDownload } from '@/utils/file'; import { fileDownload } from '@/utils/file';
@@ -49,6 +48,7 @@ import Markdown from '@/components/Markdown';
import SideBar from '@/components/SideBar'; import SideBar from '@/components/SideBar';
import Avatar from '@/components/Avatar'; import Avatar from '@/components/Avatar';
import Empty from './components/Empty'; import Empty from './components/Empty';
import { HUMAN_ICON } from '@/constants/chat';
const ShareHistory = dynamic(() => import('./components/ShareHistory'), { const ShareHistory = dynamic(() => import('./components/ShareHistory'), {
loading: () => <Loading fixed={false} />, loading: () => <Loading fixed={false} />,
@@ -101,7 +101,6 @@ const Chat = ({ shareId, historyId }: { shareId: string; historyId: string }) =>
const { copyData } = useCopyData(); const { copyData } = useCopyData();
const { isPc } = useGlobalStore(); const { isPc } = useGlobalStore();
const { Loading, setIsLoading } = useLoading(); const { Loading, setIsLoading } = useLoading();
const { userInfo } = useUserStore();
const { isOpen: isOpenSlider, onClose: onCloseSlider, onOpen: onOpenSlider } = useDisclosure(); const { isOpen: isOpenSlider, onClose: onCloseSlider, onOpen: onOpenSlider } = useDisclosure();
const { const {
isOpen: isOpenPassword, isOpen: isOpenPassword,
@@ -628,8 +627,8 @@ const Chat = ({ shareId, historyId }: { shareId: string; historyId: string }) =>
<Avatar <Avatar
src={ src={
item.obj === 'Human' item.obj === 'Human'
? userInfo?.avatar || '/icon/human.png' ? shareChatData.userAvatar || HUMAN_ICON
: shareChatData.model.avatar || LOGO_ICON : shareChatData.model.avatar
} }
w={['20px', '34px']} w={['20px', '34px']}
h={['20px', '34px']} h={['20px', '34px']}

View File

@@ -2,6 +2,7 @@ import { Schema, model, models, Model } from 'mongoose';
import { hashPassword } from '@/service/utils/tools'; import { hashPassword } from '@/service/utils/tools';
import { PRICE_SCALE } from '@/constants/common'; import { PRICE_SCALE } from '@/constants/common';
import { UserModelSchema } from '@/types/mongoSchema'; import { UserModelSchema } from '@/types/mongoSchema';
const UserSchema = new Schema({ const UserSchema = new Schema({
username: { username: {
// 可以是手机/邮箱,新的验证都只用手机 // 可以是手机/邮箱,新的验证都只用手机

View File

@@ -11,6 +11,7 @@ import {
ShareChatType ShareChatType
} from '@/types/chat'; } from '@/types/chat';
import { getChatHistory } from '@/api/chat'; import { getChatHistory } from '@/api/chat';
import { HUMAN_ICON } from '@/constants/chat';
type SetShareChatHistoryItem = { type SetShareChatHistoryItem = {
historyId: string; historyId: string;
@@ -57,6 +58,7 @@ const defaultChatData = {
}; };
const defaultShareChatData: ShareChatType = { const defaultShareChatData: ShareChatType = {
maxContext: 5, maxContext: 5,
userAvatar: HUMAN_ICON,
model: { model: {
name: '', name: '',
avatar: '/icon/logo.png', avatar: '/icon/logo.png',