perf: refresh page.img mode.collection filter
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import type { NextApiRequest, NextApiResponse } from 'next';
|
||||
import { jsonRes } from '@/service/response';
|
||||
import { connectToDatabase, SplitData, Model } from '@/service/mongo';
|
||||
import { authToken } from '@/service/utils/auth';
|
||||
import { authModel, authToken } from '@/service/utils/auth';
|
||||
import { generateVector } from '@/service/events/generateVector';
|
||||
import { generateQA } from '@/service/events/generateQA';
|
||||
import { PgClient } from '@/service/pg';
|
||||
@@ -23,15 +23,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
||||
const userId = await authToken(req);
|
||||
|
||||
// 验证是否是该用户的 model
|
||||
const model = await Model.findOne({
|
||||
_id: modelId,
|
||||
await authModel({
|
||||
modelId,
|
||||
userId
|
||||
});
|
||||
|
||||
if (!model) {
|
||||
throw new Error('无权操作该模型');
|
||||
}
|
||||
|
||||
if (mode === 'qa') {
|
||||
// 批量QA拆分插入数据
|
||||
await SplitData.create({
|
||||
|
||||
@@ -22,9 +22,13 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse<
|
||||
).sort({
|
||||
_id: -1
|
||||
}),
|
||||
Collection.find({
|
||||
userId
|
||||
}).populate('modelId', '_id avatar name chat.systemPrompt')
|
||||
Collection.find({ userId })
|
||||
.populate({
|
||||
path: 'modelId',
|
||||
select: '_id avatar name chat.systemPrompt',
|
||||
match: { 'share.isShare': true }
|
||||
})
|
||||
.then((res) => res.filter((item) => item.modelId))
|
||||
]);
|
||||
|
||||
jsonRes<ModelListResponse>(res, {
|
||||
|
||||
@@ -28,7 +28,13 @@ const Empty = ({
|
||||
>
|
||||
<Card p={4} mb={10}>
|
||||
<Flex mb={2} alignItems={'center'} justifyContent={'center'}>
|
||||
<Image src={avatar || LOGO_ICON} w={'32px'} h={'32px'} alt={''} />
|
||||
<Image
|
||||
src={avatar || LOGO_ICON}
|
||||
w={'32px'}
|
||||
maxH={'40px'}
|
||||
objectFit={'contain'}
|
||||
alt={''}
|
||||
/>
|
||||
<Box ml={3} fontSize={'3xl'} fontWeight={'bold'}>
|
||||
{name}
|
||||
</Box>
|
||||
|
||||
@@ -488,9 +488,6 @@ const Chat = ({
|
||||
modelId && setLastChatModelId(modelId);
|
||||
setLastChatId(chatId);
|
||||
|
||||
// focus scroll bottom
|
||||
chatId && scrollToBottom('auto');
|
||||
|
||||
/* get mode and chat into ↓ */
|
||||
|
||||
// phone: history page
|
||||
@@ -640,7 +637,7 @@ const Chat = ({
|
||||
/>
|
||||
</MenuButton>
|
||||
<MenuList fontSize={'sm'}>
|
||||
{chatData.model.canUse && (
|
||||
{chatData.model.canUse && item.obj === 'AI' && (
|
||||
<MenuItem onClick={() => router.push(`/model?modelId=${chatData.modelId}`)}>
|
||||
AI助手详情
|
||||
</MenuItem>
|
||||
@@ -675,6 +672,7 @@ const Chat = ({
|
||||
</Box>
|
||||
)}
|
||||
</Box>
|
||||
{/* copy and clear icon */}
|
||||
{isPc && (
|
||||
<Flex h={'100%'} flexDirection={'column'} ml={2} w={'14px'} height={'100%'}>
|
||||
<Box minH={'40px'} flex={1}>
|
||||
@@ -815,8 +813,6 @@ const Chat = ({
|
||||
);
|
||||
};
|
||||
|
||||
export default Chat;
|
||||
|
||||
Chat.getInitialProps = ({ query, req }: any) => {
|
||||
return {
|
||||
modelId: query?.modelId || '',
|
||||
@@ -824,3 +820,5 @@ Chat.getInitialProps = ({ query, req }: any) => {
|
||||
isPcDevice: !/Mobile/.test(req ? req.headers['user-agent'] : navigator.userAgent)
|
||||
};
|
||||
};
|
||||
|
||||
export default Chat;
|
||||
|
||||
@@ -6,6 +6,7 @@ import { useScreen } from '@/hooks/useScreen';
|
||||
import type { ResLogin } from '@/api/response/user';
|
||||
import { useRouter } from 'next/router';
|
||||
import { useUserStore } from '@/store/user';
|
||||
import { useChatStore } from '@/store/chat';
|
||||
import LoginForm from './components/LoginForm';
|
||||
import dynamic from 'next/dynamic';
|
||||
const RegisterForm = dynamic(() => import('./components/RegisterForm'));
|
||||
@@ -16,16 +17,33 @@ const Login = ({ isPcDevice }: { isPcDevice: boolean }) => {
|
||||
const { lastRoute = '' } = router.query as { lastRoute: string };
|
||||
const { isPc } = useScreen({ defaultIsPc: isPcDevice });
|
||||
const [pageType, setPageType] = useState<`${PageTypeEnum}`>(PageTypeEnum.login);
|
||||
const { setUserInfo } = useUserStore();
|
||||
const { setUserInfo, setLastModelId, loadMyModels } = useUserStore();
|
||||
const { setLastChatId, setLastChatModelId, loadHistory } = useChatStore();
|
||||
|
||||
const loginSuccess = useCallback(
|
||||
(res: ResLogin) => {
|
||||
// init store
|
||||
setLastChatId('');
|
||||
setLastModelId('');
|
||||
setLastChatModelId('');
|
||||
loadMyModels(true);
|
||||
loadHistory({ pageNum: 1, init: true });
|
||||
|
||||
setUserInfo(res.user);
|
||||
setTimeout(() => {
|
||||
router.push(lastRoute ? decodeURIComponent(lastRoute) : '/model');
|
||||
}, 100);
|
||||
},
|
||||
[lastRoute, router, setUserInfo]
|
||||
[
|
||||
lastRoute,
|
||||
loadHistory,
|
||||
loadMyModels,
|
||||
router,
|
||||
setLastChatId,
|
||||
setLastChatModelId,
|
||||
setLastModelId,
|
||||
setUserInfo
|
||||
]
|
||||
);
|
||||
|
||||
function DynamicComponent({ type }: { type: `${PageTypeEnum}` }) {
|
||||
|
||||
@@ -55,8 +55,8 @@ const ModelEditForm = ({
|
||||
try {
|
||||
const base64 = await compressImg({
|
||||
file,
|
||||
maxW: 40,
|
||||
maxH: 60
|
||||
maxW: 100,
|
||||
maxH: 100
|
||||
});
|
||||
setValue('avatar', base64);
|
||||
setRefresh((state) => !state);
|
||||
|
||||
@@ -57,8 +57,8 @@ const NumberSetting = () => {
|
||||
try {
|
||||
const base64 = await compressImg({
|
||||
file,
|
||||
maxW: 40,
|
||||
maxH: 60
|
||||
maxW: 100,
|
||||
maxH: 100
|
||||
});
|
||||
onclickSave({
|
||||
...userInfo,
|
||||
@@ -100,8 +100,8 @@ const NumberSetting = () => {
|
||||
src={userInfo?.avatar}
|
||||
alt={'avatar'}
|
||||
w={['28px', '36px']}
|
||||
h={['28px', '36px']}
|
||||
objectFit={'cover'}
|
||||
maxH={'40px'}
|
||||
objectFit={'contain'}
|
||||
cursor={'pointer'}
|
||||
title={'点击切换头像'}
|
||||
onClick={onOpenSelectFile}
|
||||
|
||||
Reference in New Issue
Block a user