清理/jingrow/开头的无效api

This commit is contained in:
jingrow 2025-12-27 22:15:20 +08:00
parent d3b7cdb229
commit 59041b57d0
8 changed files with 62 additions and 547 deletions

View File

@ -51,37 +51,7 @@ export const loginApi = async (username: string, password: string): Promise<void
// 登录状态通过 cookie 判断 // 登录状态通过 cookie 判断
} }
// 获取用户信息 // 获取用户信息 - 已删除,使用 cookie 中的 user_id 判断登录状态
export const getUserInfoApi = async (): Promise<UserInfo> => {
const response = await fetch(`/jingrow/user-info`, {
method: 'GET',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
credentials: 'include'
})
if (!response.ok) {
// 401或403表示cookie过期或未授权
if (response.status === 401 || response.status === 403) {
const error = new Error('Cookie已过期请重新登录')
// @ts-ignore
error.status = response.status
throw error
}
const errorData = await response.json().catch(() => ({}))
throw new Error(errorData.detail || errorData.message || '获取用户信息失败')
}
const data = await response.json()
if (data.success && data.user_info) {
return data.user_info
} else {
throw new Error(data.message || data.detail || '获取用户信息失败')
}
}
// 登出 // 登出
export const logoutApi = async (): Promise<void> => { export const logoutApi = async (): Promise<void> => {
@ -100,83 +70,7 @@ export const logoutApi = async (): Promise<void> => {
} }
} }
// 注册接口 // 注册接口 - 已删除,/jingrow/signup API 无效
export interface SignupRequest {
username: string
password: string
email?: string
phone_number?: string
}
export interface SignupResponse {
success: boolean
message?: string
error?: string
user?: UserInfo
}
export const signupApi = async (data: SignupRequest): Promise<SignupResponse> => {
try {
const response = await fetch(`/jingrow/signup`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
},
credentials: 'include',
body: JSON.stringify(data)
})
// 先克隆响应,以便可以多次读取(如果需要)
const responseClone = response.clone()
let result: any = {}
// 尝试解析响应体
try {
result = await response.json()
} catch (e) {
// 如果JSON解析失败尝试读取文本
try {
const text = await responseClone.text()
return {
success: false,
error: text || `注册请求失败 (HTTP ${response.status})`
}
} catch (textError) {
return {
success: false,
error: `注册请求失败 (HTTP ${response.status})`
}
}
}
// 如果响应不成功,提取错误消息
if (!response.ok) {
// FastAPI HTTPException 返回格式: {"detail": "错误消息"}
const errorMsg = result.detail || `注册请求失败 (HTTP ${response.status})`
return { success: false, error: errorMsg }
}
// 检查业务逻辑错误success 为 false
if (result.success === false) {
const errorMsg = result.error || result.message || '注册失败'
return { success: false, error: errorMsg }
}
return {
success: true,
message: result.message || '注册成功',
user: result.user || undefined
}
} catch (error: any) {
// 处理网络错误或其他异常
return {
success: false,
error: error.message || '网络错误,请检查网络连接后重试'
}
}
}
// 仅使用会话Cookie的最小鉴权头部不影响现有API Key逻辑 // 仅使用会话Cookie的最小鉴权头部不影响现有API Key逻辑
export function get_session_api_headers() { export function get_session_api_headers() {

View File

@ -3,37 +3,10 @@ import { get_session_api_headers } from './auth'
// 统一使用相对路径,通过 Vite 代理转发到后端 // 统一使用相对路径,通过 Vite 代理转发到后端
// 删除记录的通用函数 // 删除记录的通用函数 - /jingrow/bulk-delete API 已删除
export const deleteRecords = async (pagetype: string, names: string[]): Promise<{ success: boolean; message?: string }> => { export const deleteRecords = async (pagetype: string, names: string[]): Promise<{ success: boolean; message?: string }> => {
try { // 批量删除功能已移除,/jingrow/bulk-delete API 无效
if (!names || names.length === 0) { return { success: false, message: '批量删除功能已移除' }
return { success: false, message: '未提供要删除的记录' }
}
const response = await axios.post(
`/jingrow/bulk-delete`,
{
pagetype: pagetype,
names: names
},
{
headers: get_session_api_headers(),
withCredentials: true,
validateStatus: (status) => status === 200 || status === 207 // 允许207状态码
}
)
const result = response.data
// 207 状态码表示部分成功
const isPartialSuccess = response.status === 207
return {
success: !isPartialSuccess,
message: result?.message || (isPartialSuccess ? '部分删除成功' : '删除完成')
}
} catch (error: any) {
return { success: false, message: error.response?.data?.detail || error.message || '删除失败' }
}
} }
// 创建记录的通用函数 // 创建记录的通用函数
@ -113,40 +86,15 @@ export const getRecordAttachments = async (pagetype: string, name: string): Prom
} }
} }
// 上传附件 // 上传附件 - /jingrow/upload_file API 已删除
export const uploadAttachment = async ( export const uploadAttachment = async (
file: File, file: File,
pagetype: string, pagetype: string,
docname: string, docname: string,
isPrivate: boolean = false isPrivate: boolean = false
): Promise<{ success: boolean; data?: any; message?: string }> => { ): Promise<{ success: boolean; data?: any; message?: string }> => {
try { // 上传附件功能已移除,/jingrow/upload_file API 无效
const formData = new FormData() return { success: false, message: '上传附件功能已移除' }
formData.append('file', file)
formData.append('pagetype', pagetype)
formData.append('docname', docname)
formData.append('is_private', isPrivate ? '1' : '0')
formData.append('folder', 'Home')
const response = await axios.post(
`/jingrow/upload_file`,
formData,
{
headers: {
...get_session_api_headers(),
'Content-Type': 'multipart/form-data'
},
withCredentials: true
}
)
return { success: true, data: response.data.message }
} catch (error: any) {
return {
success: false,
message: error.response?.data?.message || error.message || '上传附件失败'
}
}
} }
// 删除附件 // 删除附件
@ -170,56 +118,22 @@ export const getWorkspace = async (name: string): Promise<{ success: boolean; da
return getRecord('Workspace', name) return getRecord('Workspace', name)
} }
// 获取记录总数的通用函数 // 获取记录总数的通用函数 - /jingrow/get-count API 已删除
export const getCount = async (pagetype: string): Promise<{ success: boolean; count?: number; message?: string }> => { export const getCount = async (pagetype: string): Promise<{ success: boolean; count?: number; message?: string }> => {
// 获取记录总数功能已移除,/jingrow/get-count API 无效
// 可以通过 getRecords 获取总数
try { try {
const response = await axios.post( const result = await getRecords(pagetype, [], [], 'modified desc', 0, 1)
`/jingrow/get-count`, return { success: true, count: result.total || 0 }
null, } catch {
{ return { success: false, count: 0, message: '获取记录总数失败' }
params: {
pagetype: pagetype
},
headers: get_session_api_headers(),
withCredentials: true
}
)
const count = response.data?.message
return { success: true, count: count || 0 }
} catch (error: any) {
return {
success: false,
count: 0,
message: error.response?.data?.detail || error.response?.data?.message || error.message || '获取记录总数失败'
}
} }
} }
// 获取Local Job总数的专用函数 - 通过专用端点获取 // 获取Local Job总数的专用函数 - /jingrow/local-job-count API 已删除
export const getLocalJobCount = async (): Promise<{ success: boolean; count?: number; message?: string }> => { export const getLocalJobCount = async (): Promise<{ success: boolean; count?: number; message?: string }> => {
try { // 通过 getRecords 获取 Local Job 总数
const response = await axios.get( return getCount('Local Job')
`/jingrow/local-job-count`,
{
headers: get_session_api_headers(),
withCredentials: true
}
)
const count = response.data?.count || 0
return {
success: true,
count: count,
message: '获取Local Job总数成功'
}
} catch (error: any) {
return {
success: false,
count: 0,
message: error.response?.data?.detail || error.response?.data?.message || error.message || '获取Local Job总数失败'
}
}
} }
// 获取记录列表的通用函数 // 获取记录列表的通用函数
@ -297,75 +211,14 @@ export const downloadImageToLocal = async (
} }
} }
// 上传文件到 Jingrow 服务器 // 上传文件到 Jingrow 服务器 - /jingrow/upload_file API 已删除
export const uploadFileToJingrow = async ( export const uploadFileToJingrow = async (
file: File, file: File,
attachedToPagetype?: string, attachedToPagetype?: string,
attachedToName?: string, attachedToName?: string,
attachedToField?: string attachedToField?: string
): Promise<{ success: boolean; file_url?: string; file_name?: string; local_path?: string; error?: string }> => { ): Promise<{ success: boolean; file_url?: string; file_name?: string; local_path?: string; error?: string }> => {
try { // 上传文件功能已移除,/jingrow/upload_file API 无效
const formData = new FormData() return { success: false, error: '上传文件功能已移除' }
formData.append('file', file)
formData.append('file_name', file.name)
formData.append('is_private', '0')
// 如果有关联记录,添加到请求数据中
if (attachedToPagetype && attachedToName) {
formData.append('pagetype', attachedToPagetype)
formData.append('docname', attachedToName)
}
if (attachedToField) {
formData.append('fieldname', attachedToField)
}
const response = await axios.post(
`/jingrow/upload_file`,
formData,
{
headers: {
...get_session_api_headers(),
'Content-Type': 'multipart/form-data'
},
withCredentials: true,
timeout: 30000
}
)
if (response.status === 200) {
const result = response.data
// 检查session是否过期
if (result.session_expired) {
return { success: false, error: 'Session已过期请重新登录' }
}
if (result.message) {
const uploadResult: { success: boolean; file_url: string; file_name: string; local_path?: string } = {
success: true,
file_url: result.message.file_url,
file_name: result.message.file_name
}
// 上传成功后,自动下载图片到本地
const downloadResult = await downloadImageToLocal(result.message.file_url, result.message.file_name)
if (downloadResult.success) {
uploadResult.local_path = downloadResult.local_path
}
return uploadResult
} else {
return { success: false, error: 'API响应格式错误' }
}
} else {
return { success: false, error: `API请求失败 (HTTP ${response.status}): ${response.statusText}` }
}
} catch (error: any) {
return {
success: false,
error: error.response?.data?.message || error.message || '上传文件失败'
}
}
} }

View File

@ -1,63 +1,26 @@
import axios from 'axios' import axios from 'axios'
import { get_session_api_headers } from './auth' import { get_session_api_headers } from './auth'
// 内部函数调用文本转向量API // 内部函数调用文本转向量API - /jingrow/embedding/batch API 已删除
const callEmbeddingApi = async (texts: string[]) => { const callEmbeddingApi = async (texts: string[]) => {
try { console.warn('callEmbeddingApi: /jingrow/embedding/batch API 已删除')
const response = await axios.post( return {
`/jingrow/embedding/batch`, success: false,
{ texts }, message: 'Embedding API 已移除'
{
headers: get_session_api_headers(),
withCredentials: true
}
)
return {
success: true,
data: response.data?.data || []
}
} catch (error: any) {
console.error('调用 Embedding API 异常:', error)
return {
success: false,
message: error.response?.data?.detail || error.message || '调用API失败'
}
} }
} }
// 内部函数:向量搜索 // 内部函数:向量搜索 - /jingrow/embedding/search API 已删除
const searchVectors = async ( const searchVectors = async (
queryVector: number[], queryVector: number[],
collectionName: string = 'knowledge_base', collectionName: string = 'knowledge_base',
limit: number = 10, limit: number = 10,
scoreThreshold: number = 0.7 scoreThreshold: number = 0.7
) => { ) => {
try { console.warn('searchVectors: /jingrow/embedding/search API 已删除')
const response = await axios.post( return {
`/jingrow/embedding/search`, success: false,
{ message: '向量搜索 API 已移除'
collection_name: collectionName,
query_vector: queryVector,
limit,
score_threshold: scoreThreshold
},
{
headers: get_session_api_headers(),
withCredentials: true
}
)
return {
success: true,
data: response.data?.data || []
}
} catch (error: any) {
console.error('向量搜索失败:', error)
return {
success: false,
message: error.response?.data?.detail || error.message || '搜索失败'
}
} }
} }

View File

@ -3,75 +3,27 @@ import { get_session_api_headers } from './auth'
// 统一使用相对路径,通过 Vite 代理转发到后端 // 统一使用相对路径,通过 Vite 代理转发到后端
// 获取节点Schema字段 // 所有 /jingrow/node/* API 已删除,以下函数已失效
// 获取节点Schema字段 - /jingrow/node/schema-fields API 已删除
export const getNodeSchemaFields = async (nodeType: string): Promise<any[]> => { export const getNodeSchemaFields = async (nodeType: string): Promise<any[]> => {
try { console.warn('getNodeSchemaFields: /jingrow/node/schema-fields API 已删除')
const response = await axios.get( return []
`/jingrow/node/schema-fields/${encodeURIComponent(nodeType)}`,
{ headers: get_session_api_headers(), withCredentials: true }
)
return response.data?.fields || []
} catch (error) {
console.error('获取节点Schema字段失败:', error)
return []
}
} }
// 一键导入本地节点(由后端扫描并创建) // 一键导入本地节点 - /jingrow/node/import-local API 已删除
export const importLocalNodes = async (): Promise<{ success: boolean; matched: number; imported: number; skipped_existing: number; errors?: string[] }> => { export const importLocalNodes = async (): Promise<{ success: boolean; matched: number; imported: number; skipped_existing: number; errors?: string[] }> => {
try { console.warn('importLocalNodes: /jingrow/node/import-local API 已删除')
const response = await axios.post( throw new Error('导入本地节点功能已移除')
`/jingrow/node/import-local`,
{},
{ headers: get_session_api_headers(), withCredentials: true }
)
return response.data
} catch (error) {
console.error('导入本地节点失败:', error)
throw error
}
} }
// 打包节点为zip文件 // 打包节点为zip文件 - /jingrow/node/package API 已删除
export const packageNode = async (nodeType: string): Promise<{ blob: Blob; filename: string }> => { export const packageNode = async (nodeType: string): Promise<{ blob: Blob; filename: string }> => {
try { console.warn('packageNode: /jingrow/node/package API 已删除')
const response = await axios.post( throw new Error('打包节点功能已移除')
`/jingrow/node/package/${encodeURIComponent(nodeType)}`,
{},
{
headers: get_session_api_headers(),
withCredentials: true,
responseType: 'blob'
}
)
// 从 Content-Disposition header 中提取文件名
let filename = `${nodeType}.zip`
const contentDisposition = response.headers['content-disposition']
if (contentDisposition) {
const filenameMatch = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/)
if (filenameMatch && filenameMatch[1]) {
filename = filenameMatch[1].replace(/['"]/g, '')
// 处理 URL 编码的文件名
try {
filename = decodeURIComponent(filename)
} catch {
// 如果解码失败,使用原始值
}
}
}
return {
blob: response.data,
filename
}
} catch (error) {
console.error('打包节点失败:', error)
throw error
}
} }
// 发布节点到节点市场 // 发布节点到节点市场 - /jingrow/node/publish API 已删除
export const publishNodeToMarketplace = async (data: { export const publishNodeToMarketplace = async (data: {
node_type: string node_type: string
title: string title: string
@ -81,31 +33,7 @@ export const publishNodeToMarketplace = async (data: {
repository_url?: string repository_url?: string
node_image?: string node_image?: string
}): Promise<{ success: boolean; message?: string }> => { }): Promise<{ success: boolean; message?: string }> => {
try { console.warn('publishNodeToMarketplace: /jingrow/node/publish API 已删除')
const formData = new FormData() return { success: false, message: '发布节点功能已移除' }
formData.append('node_type', data.node_type)
formData.append('title', data.title)
if (data.subtitle) formData.append('subtitle', data.subtitle)
if (data.description) formData.append('description', data.description)
formData.append('file_url', data.file_url)
if (data.repository_url) formData.append('repository_url', data.repository_url)
if (data.node_image) formData.append('node_image', data.node_image)
const response = await axios.post(
`/jingrow/node/publish`,
formData,
{
headers: {
...get_session_api_headers(),
'Content-Type': 'multipart/form-data'
},
withCredentials: true
}
)
return response.data
} catch (error: any) {
console.error('发布节点失败:', error)
throw error
}
} }

View File

@ -1,110 +0,0 @@
import axios from 'axios'
import { get_session_api_headers } from './auth'
export interface EnvironmentConfig {
jingrow_server_url: string
jingrow_api_key: string
jingrow_api_secret: string
jingrow_cloud_url: string
jingrow_cloud_api_url: string
jingrow_cloud_api_key: string
jingrow_cloud_api_secret: string
jingrow_db_host: string
jingrow_db_port: string
jingrow_db_name: string
jingrow_db_user: string
jingrow_db_password: string
jingrow_db_type: string
qdrant_host: string
qdrant_port: number
run_mode: string
environment: string
log_level: string
backend_host: string
backend_port: number
backend_reload: boolean
worker_processes: number
worker_threads: number
watch: boolean
}
// 获取环境配置
export const getEnvironmentConfig = async (): Promise<{ success: boolean; data?: EnvironmentConfig; message?: string }> => {
try {
const response = await axios.get(
`/jingrow/system/environment-config`,
{
headers: get_session_api_headers(),
withCredentials: true
}
)
if (response.data?.success) {
return { success: true, data: response.data.data }
}
return { success: false, message: response.data?.message || '获取环境配置失败' }
} catch (error: any) {
if (error.response?.status === 403) {
return { success: false, message: '仅系统管理员可以访问此功能' }
}
if (error.response?.status === 401) {
return { success: false, message: '认证失败,请重新登录' }
}
return { success: false, message: error.response?.data?.detail || error.message || '获取环境配置失败' }
}
}
// 更新环境配置
export const updateEnvironmentConfig = async (config: Partial<EnvironmentConfig>): Promise<{ success: boolean; message?: string }> => {
try {
const response = await axios.post(
`/jingrow/system/environment-config`,
config,
{
headers: get_session_api_headers(),
withCredentials: true
}
)
if (response.data?.success) {
return { success: true, message: response.data.message || '环境配置已更新' }
}
return { success: false, message: response.data?.message || '更新环境配置失败' }
} catch (error: any) {
if (error.response?.status === 403) {
return { success: false, message: '仅系统管理员可以访问此功能' }
}
if (error.response?.status === 401) {
return { success: false, message: '认证失败,请重新登录' }
}
return { success: false, message: error.response?.data?.detail || error.message || '更新环境配置失败' }
}
}
// 重启环境
export const restartEnvironment = async (): Promise<{ success: boolean; message?: string }> => {
try {
const response = await axios.post(
`/jingrow/system/restart-environment`,
{},
{
headers: get_session_api_headers(),
withCredentials: true
}
)
if (response.data?.success) {
return { success: true, message: response.data.message || '环境重启请求已提交' }
}
return { success: false, message: response.data?.message || '重启环境失败' }
} catch (error: any) {
if (error.response?.status === 403) {
return { success: false, message: '仅系统管理员可以访问此功能' }
}
if (error.response?.status === 401) {
return { success: false, message: '认证失败,请重新登录' }
}
return { success: false, message: error.response?.data?.detail || error.message || '重启环境失败' }
}
}

View File

@ -1,7 +1,7 @@
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import { ref, computed } from 'vue' import { ref, computed } from 'vue'
import router from '../../app/router' import router from '../../app/router'
import { loginApi, getUserInfoApi, logoutApi, isCookieExpired } from '../api/auth' import { loginApi, logoutApi } from '../api/auth'
export interface User { export interface User {
id: string id: string
@ -123,17 +123,14 @@ export const useAuthStore = defineStore('auth', () => {
} }
const updateUserInfo = async () => { const updateUserInfo = async () => {
if (!isLoggedIn.value) return // 用户信息从 cookie 获取,不需要更新
// 如果需要更新,可以从 localStorage 读取
try { const savedUser = localStorage.getItem('jingrow_user')
const userInfo = await getUserInfoApi() if (savedUser) {
user.value = userInfo try {
localStorage.setItem('jingrow_user', JSON.stringify(userInfo)) user.value = JSON.parse(savedUser)
} catch (error: any) { } catch {
console.error('更新用户信息失败:', error) // 解析失败,忽略
// 如果是401/403错误说明cookie已过期
if (error.status === 401 || error.status === 403 || error.message?.includes('过期')) {
await logout()
} }
} }
} }

View File

@ -133,23 +133,8 @@ onMounted(async () => {
return return
} }
// // /jingrow/server-config API
try { //
const response = await fetch('/jingrow/server-config')
if (response.ok) {
// Content-Type JSON
const contentType = response.headers.get('content-type')
if (contentType && contentType.includes('application/json')) {
const data = await response.json()
if (data.success && data.jingrow_server_url === 'https://cloud.jingrow.com') {
showSignupLink.value = true
}
}
}
} catch (error) {
//
// console.error('Failed to get server config:', error)
}
}) })
</script> </script>

View File

@ -113,7 +113,7 @@ import { NForm, NFormItem, NInput, NButton, NText, useMessage } from 'naive-ui'
import { Icon } from '@iconify/vue' import { Icon } from '@iconify/vue'
import { useAuthStore } from '../../shared/stores/auth' import { useAuthStore } from '../../shared/stores/auth'
import { t, getCurrentLocale } from '../../shared/i18n' import { t, getCurrentLocale } from '../../shared/i18n'
import { signupApi } from '../../shared/api/auth' // signupApi /jingrow/signup API
const router = useRouter() const router = useRouter()
const message = useMessage() const message = useMessage()
@ -218,12 +218,17 @@ const handleSignup = async () => {
await formRef.value?.validate() await formRef.value?.validate()
loading.value = true loading.value = true
// signupApi /jingrow/signup API
message.error(t('注册功能已移除,/jingrow/signup API 无效'))
return
/*
const result = await signupApi({ const result = await signupApi({
username: formData.username, username: formData.username,
password: formData.password, password: formData.password,
email: formData.email || undefined, email: formData.email || undefined,
phone_number: isEnglish.value ? (formData.phoneNumber || undefined) : formData.phoneNumber phone_number: isEnglish.value ? (formData.phoneNumber || undefined) : formData.phoneNumber
}) })
*/
if (result.success) { if (result.success) {
message.success(t('Sign up successful')) message.success(t('Sign up successful'))