diff --git a/src/renderer/components/LoginDialog.vue b/src/renderer/components/LoginDialog.vue
index 804b442..9700dc5 100644
--- a/src/renderer/components/LoginDialog.vue
+++ b/src/renderer/components/LoginDialog.vue
@@ -11,6 +11,16 @@
登录后体验更多功能
+
+
+
+
+
@@ -56,6 +66,10 @@
import { ref, watch } from 'vue';
import { User } from '@element-plus/icons-vue';
import { ElMessage } from 'element-plus';
+import { useSparkStore } from '@/stores/spark';
+import { loginAction } from '@/http/api.js';
+
+const sparkStore = useSparkStore();
const props = defineProps({
modelValue: {
@@ -78,11 +92,13 @@ const loading = ref(false);
const agreed = ref(false);
const form = ref({
+ sparkDevice: sparkStore.selectedDevice?.name || '',
username: '',
password: '',
});
const rules = {
+ sparkDevice: [{ required: true, message: '请选择设备', trigger: 'change' }],
username: [{ required: true, message: '请输入账号', trigger: 'blur' }],
password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
};
@@ -96,10 +112,16 @@ async function handleLogin() {
if (!valid) return;
loading.value = true;
try {
- // TODO: 替换为真实登录接口
- await new Promise((r) => setTimeout(r, 800));
- ElMessage.success('登录成功');
- emit('login-success', { username: form.value.username });
+ const device = sparkStore.devices.find((d) => d.name === form.value.sparkDevice);
+ if (device) sparkStore.selectDevice(device);
+
+ const url = sparkStore.selectedDeviceUrl;
+ console.log('[Login] spark device:', device);
+ console.log('[Login] target url:', url);
+
+ await loginAction({ email: form.value.username, password: form.value.password }, url);
+ ElMessage.success(`登录成功 | ${url ?? '未选择设备'}`);
+ emit('login-success', { username: form.value.username, device });
visible.value = false;
} catch (err) {
ElMessage.error('登录失败,请重试');
diff --git a/src/renderer/http/api.js b/src/renderer/http/api.js
index fa3d73b..7c75b73 100644
--- a/src/renderer/http/api.js
+++ b/src/renderer/http/api.js
@@ -4,6 +4,9 @@ import url, { getBaseUrl } from './url.js';
// 健康检查
export const getHealthAction = () => getAction(url.health);
+// 用户登录
+export const loginAction = (data, sparkBaseUrl) => postAction(url.user.login, data, {}, sparkBaseUrl);
+
// 会话
export const createSessionAction = (data) => postAction(url.session.create, data);
export const getSessionAction = (id) => getAction(url.session.detail(id));
diff --git a/src/renderer/http/manage.js b/src/renderer/http/manage.js
index 63cbd3d..5d639e7 100644
--- a/src/renderer/http/manage.js
+++ b/src/renderer/http/manage.js
@@ -1,17 +1,17 @@
-import request from './index.js'
+import request from './index.js';
export function getAction(url, params) {
- return request({ url, method: 'GET', params })
+ return request({ url, method: 'GET', params });
}
-export function postAction(url, data, headers = {}) {
- return request({ url, method: 'POST', data, headers })
+export function postAction(url, data, headers = {}, baseURL) {
+ return request({ url, method: 'POST', data, headers, ...(baseURL ? { baseURL } : {}) });
}
export function putAction(url, data) {
- return request({ url, method: 'PUT', data })
+ return request({ url, method: 'PUT', data });
}
export function deleteAction(url, params) {
- return request({ url, method: 'DELETE', params })
+ return request({ url, method: 'DELETE', params });
}
diff --git a/src/renderer/http/url.js b/src/renderer/http/url.js
index d3b6b74..476cf4e 100644
--- a/src/renderer/http/url.js
+++ b/src/renderer/http/url.js
@@ -22,6 +22,11 @@ const url = {
list: (sessionId) => `/session/${sessionId}/message`,
},
+ // 用户
+ user: {
+ login: '/v1/user/login',
+ },
+
// SSE 事件流
event: '/event',
};