From 327066ea8d527cbefc3c7b346b8ca768ac33f378 Mon Sep 17 00:00:00 2001 From: SiyuanZhang Date: Sun, 9 Feb 2025 20:04:32 +0000 Subject: [PATCH 01/97] Update pom.xml Add dependency for SQLite --- backend/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/backend/pom.xml b/backend/pom.xml index 65792ca6..73e47e80 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -67,6 +67,11 @@ spring-security-test test + + org.xerial + sqlite-jdbc + 3.36.0.3 + From ebc86376811ee0313944660e6ed71cf65edf88ab Mon Sep 17 00:00:00 2001 From: SiyuanZhang Date: Sun, 9 Feb 2025 20:24:48 +0000 Subject: [PATCH 02/97] Update DatabaseController.java Add code to implement db. --- .../AILearningTool/DatabaseController.java | 88 +++++++++++++++---- 1 file changed, 72 insertions(+), 16 deletions(-) diff --git a/backend/src/main/java/com/UoB/AILearningTool/DatabaseController.java b/backend/src/main/java/com/UoB/AILearningTool/DatabaseController.java index cca875f7..a629a3dd 100644 --- a/backend/src/main/java/com/UoB/AILearningTool/DatabaseController.java +++ b/backend/src/main/java/com/UoB/AILearningTool/DatabaseController.java @@ -1,41 +1,99 @@ package com.UoB.AILearningTool; -import java.util.ArrayList; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import org.springframework.stereotype.Service; - -// Communication with SQL database. +// Communication with SQLite database. @Service public class DatabaseController { + private Connection connection; private Map users = new HashMap<>(); private Map chats = new HashMap<>(); - public User getUser(String userID) { - return users.get(userID); + public DatabaseController() { + try { + // Connect to a SQLite database. + String url = "jdbc:sqlite:UserInformation.db"; + connection = DriverManager.getConnection(url); + initializeDatabase(); + } catch (SQLException e) { + // Handle database connection failure + } } - public DatabaseController() { - // TODO: Connect to a MariaDB database. + private void initializeDatabase() { + try { + PreparedStatement stmt = connection.prepareStatement( + "CREATE TABLE IF NOT EXISTS users (" + + "id TEXT PRIMARY KEY," + + "consent BOOLEAN)" + ); + stmt.execute(); + stmt.close(); + + stmt = connection.prepareStatement( + "CREATE TABLE IF NOT EXISTS chats (" + + "id TEXT PRIMARY KEY," + + "userId TEXT," + + "initialMessage TEXT," + + "FOREIGN KEY(userId) REFERENCES users(id))" + ); + stmt.execute(); + stmt.close(); + } catch (SQLException e) { + // Handle SQL exception + } + } + + public User getUser(String userID) { + return users.get(userID); } // Create a new user and return their ID for cookie assignment public String addUser(boolean optionalConsent) { User user = new User(optionalConsent); String id = user.getID(); - // TODO: Add a user profile record to the MariaDB database. + try { + // Add a user profile record to the SQLite database. + PreparedStatement stmt = connection.prepareStatement( + "INSERT INTO users (id, consent) VALUES (?, ?)" + ); + stmt.setString(1, id); + stmt.setBoolean(2, optionalConsent); + stmt.executeUpdate(); + stmt.close(); + } catch (SQLException e) { + // Handle SQL exception for adding user + } users.put(id, user); return id; } // Remove all data stored about the user (profile, chat, etc.) public boolean removeUser(String id) { - // TODO: Remove a user profile record from the MariaDB database. - if (users.containsKey(id)) { - users.remove(id); - return true; - } else {return false;} + try { + // Remove a user profile record from the SQLite database. + PreparedStatement stmt = connection.prepareStatement( + "DELETE FROM users WHERE id = ?" + ); + stmt.setString(1, id); + int count = stmt.executeUpdate(); + stmt.close(); + if (count > 0) { + users.remove(id); + return true; + } else { + return false; + } + } catch (SQLException e) { + // Handle SQL exception for removing user + return false; + } } // Creates a new chat @@ -47,7 +105,6 @@ public String createChat(User user, String initialMessage) { // Deletes an existing chat public Boolean deleteChat(User user, String chatID) { - Boolean success; Chat chat = chats.get(chatID); if (chat != null) { if (chat.checkOwner(user)) { @@ -63,10 +120,9 @@ public Chat getChat(User user, String chatID) { if (chat != null) { if (chat.checkOwner(user)) { return chat; - } else {return null;} + } else { return null; } } else { return null; } } - } From 4b238076f71bd2b5497436eed63a8b95323d2cc0 Mon Sep 17 00:00:00 2001 From: WeifanLiu2270269 <123551283+Liuwf4319@users.noreply.github.com> Date: Tue, 11 Feb 2025 14:35:15 +0000 Subject: [PATCH 03/97] Update Login.vue Change the local data to the database --- frontend/src/Display interface/Login.vue | 164 ++++++++++------------- 1 file changed, 68 insertions(+), 96 deletions(-) diff --git a/frontend/src/Display interface/Login.vue b/frontend/src/Display interface/Login.vue index 038f7074..5b904799 100644 --- a/frontend/src/Display interface/Login.vue +++ b/frontend/src/Display interface/Login.vue @@ -1,31 +1,25 @@ @@ -11,24 +12,12 @@ - From 4d572855d9b2c3c8e6d0526ab0b3c4ee3234e6c8 Mon Sep 17 00:00:00 2001 From: SiyuanZhang Date: Sun, 2 Mar 2025 17:47:00 +0000 Subject: [PATCH 46/97] Update MainView.vue --- frontend/src/Display interface/MainView.vue | 130 +++++++++++++++----- 1 file changed, 96 insertions(+), 34 deletions(-) diff --git a/frontend/src/Display interface/MainView.vue b/frontend/src/Display interface/MainView.vue index 293511fc..53ecbbdb 100644 --- a/frontend/src/Display interface/MainView.vue +++ b/frontend/src/Display interface/MainView.vue @@ -1,65 +1,127 @@ + From 8167aba54030f6a3e71627124c5d1c9a515b13dd Mon Sep 17 00:00:00 2001 From: SiyuanZhang Date: Sun, 2 Mar 2025 17:49:20 +0000 Subject: [PATCH 49/97] Update SpringController.java --- .../UoB/AILearningTool/SpringController.java | 54 ++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/com/UoB/AILearningTool/SpringController.java b/backend/src/main/java/com/UoB/AILearningTool/SpringController.java index 449e81f7..78703d62 100644 --- a/backend/src/main/java/com/UoB/AILearningTool/SpringController.java +++ b/backend/src/main/java/com/UoB/AILearningTool/SpringController.java @@ -8,6 +8,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; +import java.util.List; +import java.util.ArrayList; + import java.util.Collections; import java.util.Map; import java.util.Optional; @@ -52,12 +55,23 @@ public ResponseEntity> loginUser(@RequestBody Map userOptional = userRepository.findById(username); if (userOptional.isPresent() && userOptional.get().getPassword().equals(password)) { - return ResponseEntity.ok(Collections.singletonMap("success", true)); + List chats = chatRepository.findByOwner(userOptional.get()); + List chatIDs = new ArrayList<>(); + + for (ChatEntity chat : chats) { + chatIDs.add(chat.getChatID()); + } + + return ResponseEntity.ok(Map.of( + "success", true, + "chatIDs", chatIDs + )); } else { return ResponseEntity.badRequest().body(Collections.singletonMap("message", "Invalid username or password")); } } + // Check if the user exists @GetMapping("/checkSession") public ResponseEntity> checkSession(@RequestParam String username) { @@ -91,6 +105,15 @@ public ResponseEntity> createChat(@RequestBody Map> createChat(@RequestBody Map> getChatHistory(@RequestParam String u return ResponseEntity.ok(Collections.singletonMap("history", chatHistory)); } + @GetMapping("/getUserChats") + public ResponseEntity> getUserChats(@RequestParam String username) { + Optional user = userRepository.findById(username); + if (user.isEmpty()) { + return ResponseEntity.status(404).body(Collections.singletonMap("message", "User not found")); + } + + List chats = chatRepository.findByOwner(user.get()); + List> chatList = new ArrayList<>(); + + for (ChatEntity chat : chats) { + String[] lines = chat.getMessageHistory().split("\n"); + String title = "New Chat"; + + for (String line : lines) { + if (!line.startsWith("<|")) { + title = line.trim(); + break; + } + } + + chatList.add(Map.of("chatID", chat.getChatID(), "title", title)); + } + + System.out.println("Returning chat history: " + chatList); + return ResponseEntity.ok(Collections.singletonMap("chats", chatList)); + } + } From 3082ed88212faa5df1ff96b687482c9d6ca50073 Mon Sep 17 00:00:00 2001 From: WeifanLiu2270269 <123551283+Liuwf4319@users.noreply.github.com> Date: Mon, 3 Mar 2025 13:27:22 +0000 Subject: [PATCH 50/97] Create language.js --- frontend/src/assets/language.js | 120 ++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 frontend/src/assets/language.js diff --git a/frontend/src/assets/language.js b/frontend/src/assets/language.js new file mode 100644 index 00000000..4bf4a5fa --- /dev/null +++ b/frontend/src/assets/language.js @@ -0,0 +1,120 @@ +import {colorSchemes} from "@/assets/color"; + +const translations = { + en: { + UNDEFINED: "Undefined", + SETTINGS: "Settings", + LANGUAGE: "Language", + HIGH_CONTRAST_MODE: "High contrast mode", + TURN_ON: "Turn on", + TURN_OFF: "Turn off", + LOG_IN: "Log in", + LOG_OUT: "Log out", + REGISTER: "Register", + CLOSE: "Close", + NEW_CONVERSATION: "New conversation", + I_NEED_HELP_WITH_CHOOSING_A_COURSE: "I need help with choosing a course", + I_NEED_HELP_WITH_PLATFORM: "I need help with IBM SkillsBuild platform", + I_HAVE_QUESTIONS_ABOUT_UNI_LIFE: "I have questions about university life", + USER: "User", + AI: "AI", + TYPE_YOUR_MESSAGE: "Type your message...", + SEND: "Send", + WELCOME_TO_WATSONX_AI: "Welcome to Watsonx AI!", + SELECT_INITIAL_TOPIC: "Select one of the topics below:", + USERNAME: "Username", + PASSWORD: "Password", + CONFIRM_PASSWORD: "Confirm Password", + DONT_HAVE_AN_ACCOUNT: "Don't have an account?", + ALREADY_HAVE_AN_ACCOUNT: "Already have an account?", + PLEASE_ACCEPT_COOKIES: "Please accept our cookie terms first.", + PASSWORDS_DO_NOT_MATCH: "Passwords do not match!", + REGISTRATION_ERROR: "An error occurred while trying to register.", + REGISTRATION_SUCCESS: "Registration successful! Please login.", + REGISTRATION_FAILED: "Registration failed!", + LOGIN_FAILED: "Login failed!", + COOKIE_DISCLAIMER: "Watsonx AI uses cookies. If you continue to use this site, you consent to the their storage in your browser.", + I_UNDERSTAND: "I understand", + PLEASE_ENTER_A_MESSAGE: "Please enter a message!", + FAILED_TO_SEND_MESSAGE: "Failed to send message. Please try again." + }, + zh: { + UNDEFINED: "未定义", + SETTINGS: "设置", + LANGUAGE: "语言", + HIGH_CONTRAST_MODE: "高专注模式", + TURN_ON: "打开", + TURN_OFF: "关闭", + LOG_IN: "登录", + LOG_OUT: "登出", + REGISTER: "注册", + CLOSE: "关闭", + NEW_CONVERSATION: "新对话", + I_NEED_HELP_WITH_CHOOSING_A_COURSE: "我在选择课程方面需要帮助", + I_NEED_HELP_WITH_PLATFORM: "我需要 IBM SkillsBuild 平台方面的帮助", + I_HAVE_QUESTIONS_ABOUT_UNI_LIFE: "我有关于大学生活的问题", + USER: "用户", + AI: "AI", + TYPE_YOUR_MESSAGE: "输入您想说的话...", + SEND: "发送", + WELCOME_TO_WATSONX_AI: "欢迎使用 Watsonx AI!", + SELECT_INITIAL_TOPIC: "请从以下主题中选择一个:", + USERNAME: "用户名", + PASSWORD: "密码", + CONFIRM_PASSWORD: "确认密码", + DONT_HAVE_AN_ACCOUNT: "没有账号?", + ALREADY_HAVE_AN_ACCOUNT: "已经有账户了?", + PLEASE_ACCEPT_COOKIES: "请先接受我们的 cookie 条款", + PASSWORDS_DO_NOT_MATCH: "密码不匹配!", + REGISTRATION_ERROR: "尝试注册时发生错误,请稍后再试!", + REGISTRATION_SUCCESS: "注册成功!请登录。", + REGISTRATION_FAILED: "注册失败!", + LOGIN_FAILED: "登录失败!", + COOKIE_DISCLAIMER: "Watsonx AI 使用 cookie。如果您继续使用本网站,即表示您同意将其存储在您的浏览器中。", + I_UNDERSTAND: "我了解", + PLEASE_ENTER_A_MESSAGE: "请输入信息!", + FAILED_TO_SEND_MESSAGE: "发送信息失败!请重试。" + }, + ru: { + UNDEFINED: "Перевод недоступен", + SETTINGS: "Настройки", + LANGUAGE: "Язык", + HIGH_CONTRAST_MODE: "Режим высокой контрастности", + TURN_ON: "Включить", + TURN_OFF: "Выключить", + LOG_IN: "Войти", + LOG_OUT: "Выйти из аккаунта", + REGISTER: "Зарегистрироваться", + CLOSE: "Закрыть", + NEW_CONVERSATION: "Новый чат", + I_NEED_HELP_WITH_CHOOSING_A_COURSE: "Мне нужна помощь с выбором онлайн-курса", + I_HAVE_QUESTIONS_ABOUT_UNI_LIFE: "У меня есть вопросы про университетскую жизнь", + USER: "Пользователь", + AI: "ИИ", + TYPE_YOUR_MESSAGE: "Введите ваше сообщение...", + SEND: "Отправить", + WELCOME_TO_WATSONX_AI: "Добро пожаловать в ИИ Watsonx!", + SELECT_INITIAL_TOPIC: "Выберете тему для нового чата:", + USERNAME: "Имя пользователя", + PASSWORD: "Пароль", + CONFIRM_PASSWORD: "Подтвердите пароль", + DONT_HAVE_AN_ACCOUNT: "Нет аккаунта?", + ALREADY_HAVE_AN_ACCOUNT: "Уже есть аккаунт?", + PLEASE_ACCEPT_COOKIES: "Пожалуйста ознакомьтесь с условиями использования файлов куки.", + PASSWORDS_DO_NOT_MATCH: "Пароли не совпадают!", + REGISTRATION_SUCCESS: "Регистрация прошла успешно. Теперь войдите в аккаунт.", + REGISTRATION_FAILED: "Регистрация не удалась.", + REGISTRATION_ERROR: "При попытке регистрации произошла ошибка.", + LOGIN_FAILED: "При попытке войти в аккаунт произошла ошибка.", + COOKIE_DISCLAIMER: "ИИ Watsonx использует файлы куки. Продолжая использовать наше веб-приложение, вы соглашаетесь на хранение куки-файлов в вашем браузере.", + I_UNDERSTAND: "Согласен", + PLEASE_ENTER_A_MESSAGE: "Пожалуйста введите сообщение!", + FAILED_TO_SEND_MESSAGE: "Не удалось отправить сообщение. Пожалуйста, попробуйте ещё раз." + } +}; + +// Export with a fallback function +const getTranslation = (langCode = "en", phraseCode = "UNDEFINED") => + translations[langCode][phraseCode] || translations["en"][phraseCode] || translations["en"]["UNDEFINED"]; + +export { translations, getTranslation }; From 790fefa983cf96b81069ed751c62faeccd2d6d4a Mon Sep 17 00:00:00 2001 From: WeifanLiu2270269 <123551283+Liuwf4319@users.noreply.github.com> Date: Mon, 3 Mar 2025 13:31:26 +0000 Subject: [PATCH 51/97] Update UserEntity.java --- .../src/main/java/com/UoB/AILearningTool/model/UserEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/com/UoB/AILearningTool/model/UserEntity.java b/backend/src/main/java/com/UoB/AILearningTool/model/UserEntity.java index 356f7ec8..fc65a2bd 100644 --- a/backend/src/main/java/com/UoB/AILearningTool/model/UserEntity.java +++ b/backend/src/main/java/com/UoB/AILearningTool/model/UserEntity.java @@ -9,7 +9,6 @@ public class UserEntity { @Id @Column(name = "username", unique = true, nullable = false) private String username; - @Column(name = "password", nullable = false) private String password; @@ -18,6 +17,7 @@ public class UserEntity { @OneToMany(mappedBy = "owner", cascade = CascadeType.ALL, orphanRemoval = true) private List chats; + public UserEntity() {} public UserEntity(String username, String password, boolean optionalConsent) { From 6a4d84e184cb60ae024f4047451ad46a47aa68c8 Mon Sep 17 00:00:00 2001 From: SiyuanZhang Date: Mon, 3 Mar 2025 13:33:18 +0000 Subject: [PATCH 52/97] Update HistorySidebar.vue --- frontend/src/components/HistorySidebar.vue | 228 ++++++++++++--------- 1 file changed, 134 insertions(+), 94 deletions(-) diff --git a/frontend/src/components/HistorySidebar.vue b/frontend/src/components/HistorySidebar.vue index 51b0ced5..524aec6f 100644 --- a/frontend/src/components/HistorySidebar.vue +++ b/frontend/src/components/HistorySidebar.vue @@ -1,58 +1,77 @@ + From b9e967c4992d847fe737be64e1f388af43c61aee Mon Sep 17 00:00:00 2001 From: WeifanLiu2270269 <123551283+Liuwf4319@users.noreply.github.com> Date: Mon, 3 Mar 2025 13:36:32 +0000 Subject: [PATCH 53/97] Update User.java --- .../src/main/java/com/UoB/AILearningTool/User.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/backend/src/main/java/com/UoB/AILearningTool/User.java b/backend/src/main/java/com/UoB/AILearningTool/User.java index e879b04c..32ff471c 100644 --- a/backend/src/main/java/com/UoB/AILearningTool/User.java +++ b/backend/src/main/java/com/UoB/AILearningTool/User.java @@ -21,17 +21,9 @@ public void updateLastActivityTime() { this.lastActivityTime = LocalDateTime.now(); } - // Existing constructor - public User(boolean optionalConsent) { + public User(String username, boolean optionalConsent) { updateLastActivityTime(); - this.id = StringTools.RandomString(25); - this.optionalConsent = optionalConsent; - } - - // New constructor for creating User with specific ID and consent status - public User(String id, boolean optionalConsent) { - updateLastActivityTime(); - this.id = id; + this.id = username; this.optionalConsent = optionalConsent; } } From b4bd47f9057b2e48926ac49a1e0d7a115bef1f70 Mon Sep 17 00:00:00 2001 From: SiyuanZhang Date: Mon, 3 Mar 2025 13:40:54 +0000 Subject: [PATCH 54/97] Update Login.vue --- frontend/src/Display interface/Login.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/Display interface/Login.vue b/frontend/src/Display interface/Login.vue index f2016a63..506a3e08 100644 --- a/frontend/src/Display interface/Login.vue +++ b/frontend/src/Display interface/Login.vue @@ -89,7 +89,8 @@ export default { const data = await response.json(); if (response.ok && data.success) { console.log("Login successful. Redirecting to /main..."); - this.router.push(`/main?username=${this.form.username}`); // ✅ 登录后带 `username` + localStorage.setItem("username", this.form.username); + this.router.push(`/main?username=${this.form.username}`); } else { alert(data.message || "Login failed!"); } From 4467a184676afb6b08c88ebdec6f0410b9513375 Mon Sep 17 00:00:00 2001 From: WeifanLiu2270269 <123551283+Liuwf4319@users.noreply.github.com> Date: Mon, 3 Mar 2025 13:43:35 +0000 Subject: [PATCH 55/97] Update DatabaseController.java --- .../AILearningTool/DatabaseController.java | 58 +++++++++++-------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/backend/src/main/java/com/UoB/AILearningTool/DatabaseController.java b/backend/src/main/java/com/UoB/AILearningTool/DatabaseController.java index 13c4d0c1..f837b3e6 100644 --- a/backend/src/main/java/com/UoB/AILearningTool/DatabaseController.java +++ b/backend/src/main/java/com/UoB/AILearningTool/DatabaseController.java @@ -6,8 +6,8 @@ import com.UoB.AILearningTool.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; - import java.util.Optional; +import java.util.UUID; @Service public class DatabaseController { @@ -20,45 +20,55 @@ public DatabaseController(UserRepository userRepository, ChatRepository chatRepo this.chatRepository = chatRepository; } - public UserEntity getUser(String userID) { - return userRepository.findById(userID).orElse(null); + + public UserEntity getUser(String username) { + return userRepository.findById(username).orElse(null); } public String addUser(String username, String password, boolean optionalConsent) { - if (userRepository.findByUsername(username).isPresent()) { - return null; - } UserEntity user = new UserEntity(username, password, optionalConsent); - UserEntity savedUser = userRepository.save(user); - if (savedUser != null && savedUser.getId() != null) { - return savedUser.getId(); - } else { - return null; - } + userRepository.save(user); + return username; } - public boolean removeUser(String id) { - if (userRepository.existsById(id)) { - userRepository.deleteById(id); + + public boolean removeUser(String username) { + if (userRepository.existsById(username)) { + userRepository.deleteById(username); return true; } return false; } - public String createChat(UserEntity user, String initialMessage) { + + public String createChat(String username, String initialMessage) { + + UserEntity user = userRepository.findById(username).orElse(null); + if (user == null) { + return null; + } + + ChatEntity chat = new ChatEntity(user, initialMessage); - chatRepository.save(chat); - return chat.getChatID(); + chatRepository.save(chat); + return chat.getChatID(); } - public ChatEntity getChat(UserEntity user, String chatID) { - Optional chat = chatRepository.findById(chatID); - return chat.orElse(null); + + public ChatEntity getChat(String username, String chatID) { + + Optional userOpt = userRepository.findById(username); + if (userOpt.isEmpty()) { + return null; + } + + Optional chatOpt = chatRepository.findById(chatID); + return chatOpt.filter(chat -> chat.getOwner().getUsername().equals(username)).orElse(null); } - public Boolean deleteChat(UserEntity user, String chatID) { - Optional chat = chatRepository.findById(chatID); - if (chat.isPresent() && chat.get().getOwner().equals(user)) { + public boolean deleteChat(String username, String chatID) { + Optional chatOpt = chatRepository.findById(chatID); + if (chatOpt.isPresent() && chatOpt.get().getOwner().getUsername().equals(username)) { chatRepository.deleteById(chatID); return true; } From a4e2437bbcd624b31069169aeeee635c89088c65 Mon Sep 17 00:00:00 2001 From: WeifanLiu2270269 <123551283+Liuwf4319@users.noreply.github.com> Date: Mon, 3 Mar 2025 13:44:18 +0000 Subject: [PATCH 56/97] Update main.js --- frontend/src/main.js | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/frontend/src/main.js b/frontend/src/main.js index 43e22092..159c04d3 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -7,9 +7,9 @@ const MainView = () => import('./Display interface/MainView.vue'); const Login = () => import('./Display interface/Login.vue'); const routes = [ - { path: '/', redirect: '/login' }, - { path: '/login', component: Login, meta: { title: 'Login' } }, - { path: '/main', component: MainView, meta: { title: 'Chatbot' } }, + { path: "/", redirect: "/login" }, + { path: "/login", component: Login, meta: { title: "Login" } }, + { path: "/main", component: MainView, meta: { title: "Chatbot" } }, ]; const router = createRouter({ @@ -17,23 +17,12 @@ const router = createRouter({ routes, }); -// Authentication check -router.beforeEach((to, from, next) => { - const isAuthenticated = localStorage.getItem('token'); - if (to.path !== '/login' && !isAuthenticated) { - next('/login'); - } else { - next(); - } -}); - -// Page title update router.afterEach((to) => { - document.title = to.meta.title || 'Default title'; + document.title = to.meta.title || "Default title"; }); const app = createApp(App); app.use(router); -app.mount('#app'); +app.mount("#app"); export default router; From ac4fe7d873e064a4c63422aaf1778eb8cc51aeb1 Mon Sep 17 00:00:00 2001 From: WeifanLiu2270269 <123551283+Liuwf4319@users.noreply.github.com> Date: Mon, 3 Mar 2025 13:45:03 +0000 Subject: [PATCH 57/97] Update App.vue --- frontend/src/App.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/App.vue b/frontend/src/App.vue index ae8167b3..8c3e6d62 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -3,6 +3,7 @@
+ From d2c243b45ca3c5a52b62112c01259101ac8efe7f Mon Sep 17 00:00:00 2001 From: SiyuanZhang Date: Mon, 3 Mar 2025 13:58:58 +0000 Subject: [PATCH 58/97] Update HistorySidebar.vue --- frontend/src/components/HistorySidebar.vue | 295 ++++++++++----------- 1 file changed, 133 insertions(+), 162 deletions(-) diff --git a/frontend/src/components/HistorySidebar.vue b/frontend/src/components/HistorySidebar.vue index 524aec6f..b1e5c25c 100644 --- a/frontend/src/components/HistorySidebar.vue +++ b/frontend/src/components/HistorySidebar.vue @@ -1,23 +1,31 @@