diff --git a/web/src/hooks/userSettingHook.ts b/web/src/hooks/userSettingHook.ts
index f45337f89dfa2b275ba9bcb17dcec9e999fa865f..2bba749c3b67db28665fe46fba1743c017d937db 100644
--- a/web/src/hooks/userSettingHook.ts
+++ b/web/src/hooks/userSettingHook.ts
@@ -64,3 +64,13 @@ export const useSelectParserList = (): Array<{
 
   return parserList;
 };
+
+export const useLogout = () => {
+  const dispatch = useDispatch();
+
+  const logout = useCallback((): number => {
+    return dispatch<any>({ type: 'loginModel/logout' });
+  }, [dispatch]);
+
+  return logout;
+};
diff --git a/web/src/layouts/components/user/index.tsx b/web/src/layouts/components/user/index.tsx
index 260fab6a3299c4536272c0b3679c34db3c4c4a41..3dc4dd1e3b2bb9de798c3d295e82dffc85b73724 100644
--- a/web/src/layouts/components/user/index.tsx
+++ b/web/src/layouts/components/user/index.tsx
@@ -1,19 +1,27 @@
-import { useFetchUserInfo, useSelectUserInfo } from '@/hooks/userSettingHook';
+import {
+  useFetchUserInfo,
+  useLogout,
+  useSelectUserInfo,
+} from '@/hooks/userSettingHook';
 import authorizationUtil from '@/utils/authorizationUtil';
 import type { MenuProps } from 'antd';
 import { Avatar, Button, Dropdown } from 'antd';
-import React, { useMemo } from 'react';
+import React, { useCallback, useMemo } from 'react';
 import { useTranslation } from 'react-i18next';
 import { history } from 'umi';
 
 const App: React.FC = () => {
   const { t } = useTranslation();
   const userInfo = useSelectUserInfo();
+  const logout = useLogout();
 
-  const logout = () => {
-    authorizationUtil.removeAll();
-    history.push('/login');
-  };
+  const handleLogout = useCallback(async () => {
+    const retcode = await logout();
+    if (retcode === 0) {
+      authorizationUtil.removeAll();
+      history.push('/login');
+    }
+  }, [logout]);
 
   const toSetting = () => {
     history.push('/setting');
@@ -23,7 +31,7 @@ const App: React.FC = () => {
     return [
       {
         key: '1',
-        onClick: logout,
+        onClick: handleLogout,
         label: <Button type="text">{t('header.logout')}</Button>,
       },
       {
@@ -32,7 +40,7 @@ const App: React.FC = () => {
         label: <Button type="text">{t('header.setting')}</Button>,
       },
     ];
-  }, [t]);
+  }, [t, handleLogout]);
 
   useFetchUserInfo();
 
diff --git a/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-card/index.less b/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-card/index.less
index 1ee2e3f5ba91faadf8dac7ddd6b5c73f9ca2da00..956caaa73a5a6a0ad7b52727c5cfbeb29c5a3f2a 100644
--- a/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-card/index.less
+++ b/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-card/index.less
@@ -12,6 +12,10 @@
   .chunkText;
 }
 
+.chunkCard {
+  width: 100%;
+}
+
 .cardSelected {
   background-color: @selectedBackgroundColor;
 }
diff --git a/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-card/index.tsx b/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-card/index.tsx
index d021e4768799ed960f49cd2443e0b0ea2c38b917..c1aaf2c73c6f2caa08121b85cc60201c59d7a5f1 100644
--- a/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-card/index.tsx
+++ b/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-card/index.tsx
@@ -1,7 +1,9 @@
 import Image from '@/components/image';
 import { IChunk } from '@/interfaces/database/knowledge';
 import { Card, Checkbox, CheckboxProps, Flex, Popover, Switch } from 'antd';
+import classNames from 'classnames';
 import { useState } from 'react';
+
 import styles from './index.less';
 
 interface IProps {
@@ -44,33 +46,35 @@ const ChunkCard = ({
   };
 
   return (
-    <div>
-      <Card className={selected ? styles.cardSelected : ''}>
-        <Flex gap={'middle'} justify={'space-between'}>
-          <Checkbox onChange={handleCheck} checked={checked}></Checkbox>
-          {item.img_id && (
-            <Popover
-              placement="topRight"
-              content={
-                <Image id={item.img_id} className={styles.imagePreview}></Image>
-              }
-            >
-              <Image id={item.img_id} className={styles.image}></Image>
-            </Popover>
-          )}
+    <Card
+      className={classNames(styles.chunkCard, {
+        [styles.cardSelected]: selected,
+      })}
+    >
+      <Flex gap={'middle'} justify={'space-between'}>
+        <Checkbox onChange={handleCheck} checked={checked}></Checkbox>
+        {item.img_id && (
+          <Popover
+            placement="topRight"
+            content={
+              <Image id={item.img_id} className={styles.imagePreview}></Image>
+            }
+          >
+            <Image id={item.img_id} className={styles.image}></Image>
+          </Popover>
+        )}
 
-          <section
-            onDoubleClick={handleContentDoubleClick}
-            onClick={handleContentClick}
-            className={styles.content}
-            dangerouslySetInnerHTML={{ __html: item.content_with_weight }}
-          ></section>
-          <div>
-            <Switch checked={enabled} onChange={onChange} />
-          </div>
-        </Flex>
-      </Card>
-    </div>
+        <section
+          onDoubleClick={handleContentDoubleClick}
+          onClick={handleContentClick}
+          className={styles.content}
+          dangerouslySetInnerHTML={{ __html: item.content_with_weight }}
+        ></section>
+        <div>
+          <Switch checked={enabled} onChange={onChange} />
+        </div>
+      </Flex>
+    </Card>
   );
 };
 
diff --git a/web/src/pages/add-knowledge/components/knowledge-chunk/index.less b/web/src/pages/add-knowledge/components/knowledge-chunk/index.less
index c97956dd87666d182bdbe1f66232d953c9d2fce0..4864046e1353fc17a4f24ee56964fbf441247c77 100644
--- a/web/src/pages/add-knowledge/components/knowledge-chunk/index.less
+++ b/web/src/pages/add-knowledge/components/knowledge-chunk/index.less
@@ -12,6 +12,10 @@
     justify-content: space-between;
   }
 
+  .pagePdfWrapper {
+    width: 60%;
+  }
+
   .pageContent {
     flex: 1;
     width: 100%;
@@ -29,12 +33,11 @@
   }
 
   .chunkContainer {
-    height: calc(100vh - 320px);
-    overflow: auto;
-    width: 100%;
+    height: calc(100vh - 332px);
   }
 
   .pageFooter {
+    padding-top: 10px;
     height: 32px;
   }
 }
diff --git a/web/src/pages/add-knowledge/components/knowledge-chunk/index.tsx b/web/src/pages/add-knowledge/components/knowledge-chunk/index.tsx
index 01873cec7662dd751c074d8a25f748069cd9ba2d..ffd330bc87dfcd7bc57c85fb9d08d8e720413b1b 100644
--- a/web/src/pages/add-knowledge/components/knowledge-chunk/index.tsx
+++ b/web/src/pages/add-knowledge/components/knowledge-chunk/index.tsx
@@ -38,6 +38,7 @@ const Chunk = () => {
   const { removeChunk } = useDeleteChunkByIds();
   const documentInfo = useSelectDocumentInfo();
   const { handleChunkCardClick, selectedChunkId } = useHandleChunkCardClick();
+  const isPdf = documentInfo.type === 'pdf';
 
   const getChunkList = useCallback(() => {
     const payload: PayloadType = {
@@ -164,7 +165,7 @@ const Chunk = () => {
         ></ChunkToolBar>
         <Divider></Divider>
         <Flex flex={1} gap={'middle'}>
-          <Flex flex={1} vertical>
+          <Flex vertical className={isPdf ? styles.pagePdfWrapper : ''}>
             <div className={styles.pageContent}>
               <Spin spinning={loading} className={styles.spin} size="large">
                 <Space
@@ -204,7 +205,7 @@ const Chunk = () => {
             </div>
           </Flex>
 
-          {documentInfo.type === 'pdf' && (
+          {isPdf && (
             <section className={styles.documentPreview}>
               <DocumentPreview
                 selectedChunkId={selectedChunkId}
diff --git a/web/src/pages/chat/chat-container/index.tsx b/web/src/pages/chat/chat-container/index.tsx
index c084e2d9736bfd69cd42eed091dccb818878bac2..79edd5a7ec7445100c621d98807cfe8236efe623 100644
--- a/web/src/pages/chat/chat-container/index.tsx
+++ b/web/src/pages/chat/chat-container/index.tsx
@@ -177,7 +177,7 @@ const MessageItem = ({
           <Flex vertical gap={8} flex={1}>
             <b>{isAssistant ? '' : userInfo.nickname}</b>
             <div className={styles.messageText}>
-              {item.content ? (
+              {item.content !== '' ? (
                 <Markdown
                   rehypePlugins={[rehypeWrapReference]}
                   components={
diff --git a/web/src/pages/login/model.ts b/web/src/pages/login/model.ts
index 0c2dd4abd1e7cd4ae6a2431f3123279fecfdf74d..8faf0778df8c83ed053d03b177d54bf3bff65009 100644
--- a/web/src/pages/login/model.ts
+++ b/web/src/pages/login/model.ts
@@ -25,18 +25,13 @@ const model: DvaModel<LoginModelState> = {
       };
     },
   },
-  subscriptions: {
-    setup({ dispatch, history }) {
-      history.listen((location) => {});
-    },
-  },
   effects: {
-    *login({ payload = {} }, { call, put }) {
+    *login({ payload = {} }, { call }) {
       const { data, response } = yield call(userService.login, payload);
       const { retcode, data: res } = data;
       const authorization = response.headers.get(Authorization);
       if (retcode === 0) {
-        message.success('登录成功!');
+        message.success('logged!');
         const token = res.access_token;
         const userInfo = {
           avatar: res.avatar,
@@ -51,15 +46,23 @@ const model: DvaModel<LoginModelState> = {
       }
       return retcode;
     },
-    *register({ payload = {} }, { call, put }) {
-      const { data, response } = yield call(userService.register, payload);
+    *register({ payload = {} }, { call }) {
+      const { data } = yield call(userService.register, payload);
       console.log();
-      const { retcode, data: res, retmsg } = data;
+      const { retcode } = data;
       if (retcode === 0) {
         message.success('注册成功!');
       }
       return retcode;
     },
+    *logout({ payload = {} }, { call }) {
+      const { data } = yield call(userService.logout, payload);
+      const { retcode } = data;
+      if (retcode === 0) {
+        message.success('logout');
+      }
+      return retcode;
+    },
   },
 };
 export default model;
diff --git a/web/src/services/userService.ts b/web/src/services/userService.ts
index 6e11f7344d13b36cbb2df05b7120588a929bb428..665a7d5876bdfe70c391b9561e3357bcfed577f8 100644
--- a/web/src/services/userService.ts
+++ b/web/src/services/userService.ts
@@ -4,6 +4,7 @@ import request from '@/utils/request';
 
 const {
   login,
+  logout,
   register,
   setting,
   user_info,
@@ -20,6 +21,10 @@ const methods = {
     url: login,
     method: 'post',
   },
+  logout: {
+    url: logout,
+    method: 'get',
+  },
   register: {
     url: register,
     method: 'post',
diff --git a/web/src/utils/api.ts b/web/src/utils/api.ts
index 7e90d78ce0599e01da3b7c13f304721451895854..3b1ec9be42745100110976b112b31f292fe0a43b 100644
--- a/web/src/utils/api.ts
+++ b/web/src/utils/api.ts
@@ -5,6 +5,7 @@ export { api_host };
 export default {
   // 用户
   login: `${api_host}/user/login`,
+  logout: `${api_host}/user/logout`,
   register: `${api_host}/user/register`,
   setting: `${api_host}/user/setting`,
   user_info: `${api_host}/user/info`,