Align frontend API calls with app-prefixed backend routes.

Update service URLs and the Vite proxy rewrite so requests match /content/, /cms/, and /common/ mounts after /api is stripped.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
aifeilong 2026-10-15 08:42:37 +08:00
parent 82efbb9e24
commit 00d5558fe2
3 changed files with 128 additions and 126 deletions

View File

@ -6,116 +6,116 @@ const unwrap = (data) => {
return data;
};
export const listArticles = (params) => get("/api/articles/", params).then(unwrap);
export const getArticle = (id) => get(`/api/articles/${id}/`);
export const listArticles = (params) => get("/api/content/articles/", params).then(unwrap);
export const getArticle = (id) => get(`/api/content/articles/${id}/`);
/** 前台详情阅读上报(与 GET 详情分离,避免重复计数) */
export const recordArticleRead = (id) => post(`/api/articles/${id}/record-read/`);
export const recordArticleRead = (id) => post(`/api/content/articles/${id}/record-read/`);
/** 会员点赞/取消点赞(需登录) */
export const toggleArticleLike = (id) => post(`/api/articles/${id}/toggle-like/`);
export const toggleArticleLike = (id) => post(`/api/content/articles/${id}/toggle-like/`);
/** 会员收藏/取消收藏(需登录) */
export const toggleArticleCollect = (id) =>
post(`/api/articles/${id}/toggle-collect/`);
post(`/api/content/articles/${id}/toggle-collect/`);
/** 分享计数(同人同文献只计一次;传 visitorKey 便于未登录去重) */
export const recordArticleShare = (id, visitorKey) =>
post(`/api/articles/${id}/record-share/`, {
post(`/api/content/articles/${id}/record-share/`, {
visitor_key: visitorKey || undefined,
});
/** 当前会员收藏列表 */
export const myArticleCollections = (params) =>
get("/api/articles/my-collections/", params).then(unwrap);
get("/api/content/articles/my-collections/", params).then(unwrap);
/** 批量查询点赞/收藏状态,ids 为文献 id 数组 */
export const myArticleEngagement = (ids) =>
get("/api/articles/my-engagement/", {
get("/api/content/articles/my-engagement/", {
ids: Array.isArray(ids) ? ids.join(",") : ids,
});
export const homeArticles = () => get("/api/articles/home/");
export const articleFacets = (params) => get("/api/articles/facets/", params);
export const homeArticles = () => get("/api/content/articles/home/");
export const articleFacets = (params) => get("/api/content/articles/facets/", params);
export const articleRanking = (params) =>
get("/api/articles/ranking/", params).then(unwrap);
export const createArticle = (data) => post("/api/articles/", data);
export const updateArticle = (id, data) => patch(`/api/articles/${id}/`, data);
export const deleteArticle = (id) => remove(`/api/articles/${id}/`);
get("/api/content/articles/ranking/", params).then(unwrap);
export const createArticle = (data) => post("/api/content/articles/", data);
export const updateArticle = (id, data) => patch(`/api/content/articles/${id}/`, data);
export const deleteArticle = (id) => remove(`/api/content/articles/${id}/`);
export const listOrganizes = (params) => get("/api/organizes/", params).then(unwrap);
export const getOrganize = (id) => get(`/api/organizes/${id}/`);
export const listOrganizes = (params) => get("/api/content/organizes/", params).then(unwrap);
export const getOrganize = (id) => get(`/api/content/organizes/${id}/`);
export const organizeRanking = (params) =>
get("/api/organizes/ranking/", params).then(unwrap);
export const createOrganize = (data) => post("/api/organizes/", data);
export const updateOrganize = (id, data) => patch(`/api/organizes/${id}/`, data);
export const deleteOrganize = (id) => remove(`/api/organizes/${id}/`);
get("/api/content/organizes/ranking/", params).then(unwrap);
export const createOrganize = (data) => post("/api/content/organizes/", data);
export const updateOrganize = (id, data) => patch(`/api/content/organizes/${id}/`, data);
export const deleteOrganize = (id) => remove(`/api/content/organizes/${id}/`);
export const listMagazines = (params) => get("/api/magazines/", params).then(unwrap);
export const listMagazines = (params) => get("/api/content/magazines/", params).then(unwrap);
export const magazineRanking = (params) =>
get("/api/magazines/ranking/", params).then(unwrap);
export const createMagazine = (data) => post("/api/magazines/", data);
export const updateMagazine = (id, data) => patch(`/api/magazines/${id}/`, data);
export const deleteMagazine = (id) => remove(`/api/magazines/${id}/`);
get("/api/content/magazines/ranking/", params).then(unwrap);
export const createMagazine = (data) => post("/api/content/magazines/", data);
export const updateMagazine = (id, data) => patch(`/api/content/magazines/${id}/`, data);
export const deleteMagazine = (id) => remove(`/api/content/magazines/${id}/`);
export const listWorkGroups = (params) =>
get("/api/work-groups/", params).then(unwrap);
export const createWorkGroup = (data) => post("/api/work-groups/", data);
export const updateWorkGroup = (id, data) => patch(`/api/work-groups/${id}/`, data);
export const deleteWorkGroup = (id) => remove(`/api/work-groups/${id}/`);
get("/api/content/work-groups/", params).then(unwrap);
export const createWorkGroup = (data) => post("/api/content/work-groups/", data);
export const updateWorkGroup = (id, data) => patch(`/api/content/work-groups/${id}/`, data);
export const deleteWorkGroup = (id) => remove(`/api/content/work-groups/${id}/`);
export const listWorkGroupTerms = (params) =>
get("/api/work-group-terms/", params).then(unwrap);
export const createWorkGroupTerm = (data) => post("/api/work-group-terms/", data);
get("/api/content/work-group-terms/", params).then(unwrap);
export const createWorkGroupTerm = (data) => post("/api/content/work-group-terms/", data);
export const updateWorkGroupTerm = (id, data) =>
patch(`/api/work-group-terms/${id}/`, data);
export const deleteWorkGroupTerm = (id) => remove(`/api/work-group-terms/${id}/`);
patch(`/api/content/work-group-terms/${id}/`, data);
export const deleteWorkGroupTerm = (id) => remove(`/api/content/work-group-terms/${id}/`);
export const listWorkGroupMemberships = (params) =>
get("/api/work-group-memberships/", params).then(unwrap);
get("/api/content/work-group-memberships/", params).then(unwrap);
export const createWorkGroupMembership = (data) =>
post("/api/work-group-memberships/", data);
post("/api/content/work-group-memberships/", data);
export const updateWorkGroupMembership = (id, data) =>
patch(`/api/work-group-memberships/${id}/`, data);
patch(`/api/content/work-group-memberships/${id}/`, data);
export const deleteWorkGroupMembership = (id) =>
remove(`/api/work-group-memberships/${id}/`);
remove(`/api/content/work-group-memberships/${id}/`);
export const listProfessors = (params) =>
get("/api/professors/", params).then(unwrap);
export const getProfessor = (id) => get(`/api/professors/${id}/`);
export const createProfessor = (data) => post("/api/professors/", data);
export const updateProfessor = (id, data) => patch(`/api/professors/${id}/`, data);
export const deleteProfessor = (id) => remove(`/api/professors/${id}/`);
get("/api/content/professors/", params).then(unwrap);
export const getProfessor = (id) => get(`/api/content/professors/${id}/`);
export const createProfessor = (data) => post("/api/content/professors/", data);
export const updateProfessor = (id, data) => patch(`/api/content/professors/${id}/`, data);
export const deleteProfessor = (id) => remove(`/api/content/professors/${id}/`);
export const listColumns = (params) => get("/api/columns/", params).then(unwrap);
export const navColumns = (params) => get("/api/columns/nav/", params);
export const createColumn = (data) => post("/api/columns/", data);
export const updateColumn = (id, data) => patch(`/api/columns/${id}/`, data);
export const deleteColumn = (id) => remove(`/api/columns/${id}/`);
export const listColumns = (params) => get("/api/content/columns/", params).then(unwrap);
export const navColumns = (params) => get("/api/content/columns/nav/", params);
export const createColumn = (data) => post("/api/content/columns/", data);
export const updateColumn = (id, data) => patch(`/api/content/columns/${id}/`, data);
export const deleteColumn = (id) => remove(`/api/content/columns/${id}/`);
export const listSubjects = (params) =>
get("/api/subjects/", params).then(unwrap);
export const createSubject = (data) => post("/api/subjects/", data);
export const updateSubject = (id, data) => patch(`/api/subjects/${id}/`, data);
export const deleteSubject = (id) => remove(`/api/subjects/${id}/`);
get("/api/content/subjects/", params).then(unwrap);
export const createSubject = (data) => post("/api/content/subjects/", data);
export const updateSubject = (id, data) => patch(`/api/content/subjects/${id}/`, data);
export const deleteSubject = (id) => remove(`/api/content/subjects/${id}/`);
export const listArticleTypes = (params) =>
get("/api/article-types/", params).then(unwrap);
export const createArticleType = (data) => post("/api/article-types/", data);
get("/api/content/article-types/", params).then(unwrap);
export const createArticleType = (data) => post("/api/content/article-types/", data);
export const updateArticleType = (id, data) =>
patch(`/api/article-types/${id}/`, data);
export const deleteArticleType = (id) => remove(`/api/article-types/${id}/`);
patch(`/api/content/article-types/${id}/`, data);
export const deleteArticleType = (id) => remove(`/api/content/article-types/${id}/`);
export const listOrganizeCategories = (params) =>
get("/api/organize-categories/", params).then(unwrap);
get("/api/content/organize-categories/", params).then(unwrap);
export const createOrganizeCategory = (data) =>
post("/api/organize-categories/", data);
post("/api/content/organize-categories/", data);
export const updateOrganizeCategory = (id, data) =>
patch(`/api/organize-categories/${id}/`, data);
patch(`/api/content/organize-categories/${id}/`, data);
export const deleteOrganizeCategory = (id) =>
remove(`/api/organize-categories/${id}/`);
remove(`/api/content/organize-categories/${id}/`);
export const listMagazineCategories = (params) =>
get("/api/magazine-categories/", params).then(unwrap);
get("/api/content/magazine-categories/", params).then(unwrap);
export const createMagazineCategory = (data) =>
post("/api/magazine-categories/", data);
post("/api/content/magazine-categories/", data);
export const updateMagazineCategory = (id, data) =>
patch(`/api/magazine-categories/${id}/`, data);
patch(`/api/content/magazine-categories/${id}/`, data);
export const deleteMagazineCategory = (id) =>
remove(`/api/magazine-categories/${id}/`);
remove(`/api/content/magazine-categories/${id}/`);
/** @deprecated 使用 listSubjects / listOrganizeCategories */
export const listCategories = (params) => {
const type = params?.type;
@ -125,86 +125,86 @@ export const listCategories = (params) => {
return listSubjects(params);
};
export const listNews = (params) => get("/api/news/", params).then(unwrap);
export const getNews = (id) => get(`/api/news/${id}/`);
export const createNews = (data) => post("/api/news/", data);
export const updateNews = (id, data) => patch(`/api/news/${id}/`, data);
export const deleteNews = (id) => remove(`/api/news/${id}/`);
export const listNews = (params) => get("/api/cms/news/", params).then(unwrap);
export const getNews = (id) => get(`/api/cms/news/${id}/`);
export const createNews = (data) => post("/api/cms/news/", data);
export const updateNews = (id, data) => patch(`/api/cms/news/${id}/`, data);
export const deleteNews = (id) => remove(`/api/cms/news/${id}/`);
export const listPublications = (params) =>
get("/api/publications/", params).then(unwrap);
export const getPublication = (id) => get(`/api/publications/${id}/`);
export const createPublication = (data) => post("/api/publications/", data);
get("/api/cms/publications/", params).then(unwrap);
export const getPublication = (id) => get(`/api/cms/publications/${id}/`);
export const createPublication = (data) => post("/api/cms/publications/", data);
export const updatePublication = (id, data) =>
patch(`/api/publications/${id}/`, data);
export const deletePublication = (id) => remove(`/api/publications/${id}/`);
patch(`/api/cms/publications/${id}/`, data);
export const deletePublication = (id) => remove(`/api/cms/publications/${id}/`);
export const listReports = (params) => get("/api/reports/", params).then(unwrap);
export const getReport = (id) => get(`/api/reports/${id}/`);
export const createReport = (data) => post("/api/reports/", data);
export const updateReport = (id, data) => patch(`/api/reports/${id}/`, data);
export const deleteReport = (id) => remove(`/api/reports/${id}/`);
export const listReports = (params) => get("/api/cms/reports/", params).then(unwrap);
export const getReport = (id) => get(`/api/cms/reports/${id}/`);
export const createReport = (data) => post("/api/cms/reports/", data);
export const updateReport = (id, data) => patch(`/api/cms/reports/${id}/`, data);
export const deleteReport = (id) => remove(`/api/cms/reports/${id}/`);
export const getAbout = () => get("/api/about/current/");
export const listAbout = (params) => get("/api/about/", params).then(unwrap);
export const createAbout = (data) => post("/api/about/", data);
export const updateAbout = (id, data) => patch(`/api/about/${id}/`, data);
export const getAbout = () => get("/api/cms/about/current/");
export const listAbout = (params) => get("/api/cms/about/", params).then(unwrap);
export const createAbout = (data) => post("/api/cms/about/", data);
export const updateAbout = (id, data) => patch(`/api/cms/about/${id}/`, data);
export const getCopyright = () => get("/api/copyright/current/");
export const getCopyright = () => get("/api/cms/copyright/current/");
export const listCopyright = (params) =>
get("/api/copyright/", params).then(unwrap);
export const createCopyright = (data) => post("/api/copyright/", data);
export const updateCopyright = (id, data) => patch(`/api/copyright/${id}/`, data);
get("/api/cms/copyright/", params).then(unwrap);
export const createCopyright = (data) => post("/api/cms/copyright/", data);
export const updateCopyright = (id, data) => patch(`/api/cms/copyright/${id}/`, data);
export const getContact = () => get("/api/contact/current/");
export const listContact = (params) => get("/api/contact/", params).then(unwrap);
export const createContact = (data) => post("/api/contact/", data);
export const updateContact = (id, data) => patch(`/api/contact/${id}/`, data);
export const getContact = () => get("/api/cms/contact/current/");
export const listContact = (params) => get("/api/cms/contact/", params).then(unwrap);
export const createContact = (data) => post("/api/cms/contact/", data);
export const updateContact = (id, data) => patch(`/api/cms/contact/${id}/`, data);
export const listLinks = (params) => get("/api/links/", params).then(unwrap);
export const createLink = (data) => post("/api/links/", data);
export const updateLink = (id, data) => patch(`/api/links/${id}/`, data);
export const deleteLink = (id) => remove(`/api/links/${id}/`);
export const listLinks = (params) => get("/api/cms/links/", params).then(unwrap);
export const createLink = (data) => post("/api/cms/links/", data);
export const updateLink = (id, data) => patch(`/api/cms/links/${id}/`, data);
export const deleteLink = (id) => remove(`/api/cms/links/${id}/`);
export const listBanners = () => get("/api/banners/");
export const createBanner = (data) => post("/api/banners/", data);
export const updateBanner = (id, data) => patch(`/api/banners/${id}/`, data);
export const deleteBanner = (id) => remove(`/api/banners/${id}/`);
export const listBanners = () => get("/api/cms/banners/");
export const createBanner = (data) => post("/api/cms/banners/", data);
export const updateBanner = (id, data) => patch(`/api/cms/banners/${id}/`, data);
export const deleteBanner = (id) => remove(`/api/cms/banners/${id}/`);
export const uploadBannerImage = (formData) =>
upload("/api/banners/upload/", formData);
upload("/api/cms/banners/upload/", formData);
/** 通用媒体上传;formData 可含 file / category / kind */
export const uploadMedia = (formData) => upload("/api/uploads/", formData);
export const uploadMedia = (formData) => upload("/api/common/uploads/", formData);
export const listKeywords = (params) => get("/api/keywords/", params).then(unwrap);
export const createKeyword = (data) => post("/api/keywords/", data);
export const updateKeyword = (id, data) => patch(`/api/keywords/${id}/`, data);
export const deleteKeyword = (id) => remove(`/api/keywords/${id}/`);
export const listKeywords = (params) => get("/api/cms/keywords/", params).then(unwrap);
export const createKeyword = (data) => post("/api/cms/keywords/", data);
export const updateKeyword = (id, data) => patch(`/api/cms/keywords/${id}/`, data);
export const deleteKeyword = (id) => remove(`/api/cms/keywords/${id}/`);
export const listSpecialties = (params) =>
get("/api/specialties/", params).then(unwrap);
export const createSpecialty = (data) => post("/api/specialties/", data);
export const updateSpecialty = (id, data) => patch(`/api/specialties/${id}/`, data);
export const deleteSpecialty = (id) => remove(`/api/specialties/${id}/`);
get("/api/content/specialties/", params).then(unwrap);
export const createSpecialty = (data) => post("/api/content/specialties/", data);
export const updateSpecialty = (id, data) => patch(`/api/content/specialties/${id}/`, data);
export const deleteSpecialty = (id) => remove(`/api/content/specialties/${id}/`);
export const listStarRules = (params) =>
get("/api/star-rules/", params).then(unwrap);
export const getStarRule = (id) => get(`/api/star-rules/${id}/`);
export const createStarRule = (data) => post("/api/star-rules/", data);
export const updateStarRule = (id, data) => patch(`/api/star-rules/${id}/`, data);
export const deleteStarRule = (id) => remove(`/api/star-rules/${id}/`);
get("/api/content/star-rules/", params).then(unwrap);
export const getStarRule = (id) => get(`/api/content/star-rules/${id}/`);
export const createStarRule = (data) => post("/api/content/star-rules/", data);
export const updateStarRule = (id, data) => patch(`/api/content/star-rules/${id}/`, data);
export const deleteStarRule = (id) => remove(`/api/content/star-rules/${id}/`);
export const listRuleBands = (params) =>
get("/api/rule-bands/", params).then(unwrap);
export const createRuleBand = (data) => post("/api/rule-bands/", data);
export const updateRuleBand = (id, data) => patch(`/api/rule-bands/${id}/`, data);
export const deleteRuleBand = (id) => remove(`/api/rule-bands/${id}/`);
get("/api/content/rule-bands/", params).then(unwrap);
export const createRuleBand = (data) => post("/api/content/rule-bands/", data);
export const updateRuleBand = (id, data) => patch(`/api/content/rule-bands/${id}/`, data);
export const deleteRuleBand = (id) => remove(`/api/content/rule-bands/${id}/`);
export const listArticleComments = (params) =>
get("/api/article-comments/", params).then(unwrap);
export const createArticleComment = (data) => post("/api/article-comments/", data);
get("/api/content/article-comments/", params).then(unwrap);
export const createArticleComment = (data) => post("/api/content/article-comments/", data);
export const updateArticleComment = (id, data) =>
patch(`/api/article-comments/${id}/`, data);
export const deleteArticleComment = (id) => remove(`/api/article-comments/${id}/`);
patch(`/api/content/article-comments/${id}/`, data);
export const deleteArticleComment = (id) => remove(`/api/content/article-comments/${id}/`);
export const searchAll = (params) => get("/api/search/", params);
export const searchAll = (params) => get("/api/cms/search/", params);

View File

@ -4,11 +4,11 @@ import { store } from "@/store";
/** 必须带前台会员 token 的接口(staff token 会被 IsMember 拒绝为 403) */
function isMemberAuthApi(url = "") {
if (url.includes("/api/auth/member/")) return true;
if (url.includes("/api/articles/my-engagement")) return true;
if (url.includes("/api/articles/my-collections")) return true;
if (/\/api\/articles\/[^/]+\/toggle-(like|collect)\/?/.test(url)) return true;
if (url.includes("/api/content/articles/my-engagement")) return true;
if (url.includes("/api/content/articles/my-collections")) return true;
if (/\/api\/content\/articles\/[^/]+\/toggle-(like|collect)\/?/.test(url)) return true;
// 分享去重依赖会员身份;有 member token 时优先带上
if (/\/api\/articles\/[^/]+\/record-share\/?/.test(url)) return true;
if (/\/api\/content\/articles\/[^/]+\/record-share\/?/.test(url)) return true;
return false;
}

View File

@ -14,9 +14,11 @@ export default defineConfig({
open: "/",
host: "0.0.0.0", //wsl中使用
proxy: {
// 前端仍请求 /api/*,转发到 Django 时剥掉 /api(与线上网关一致)
"/api": {
target: "http://127.0.0.1:8000",
changeOrigin: true,
rewrite: (p) => p.replace(/^\/api/, ""),
},
"/media": {
target: "http://127.0.0.1:8000",