Files
hjc-web/app/types/tender.ts
T
weicw1996 9299485899 feat(hjc-web): 标书详情加「收藏」按钮,「我的收藏」页与顶栏入口
后端接口是端无关的,本轮 **mp-java 零改动**,纯前端 + Nitro 代理。

- 新增 favorites.get/post/delete 三个站内代理,原样透传 ApiResult
  (HTTP 恒 200,按 body.code 判登录态与业务失败)。delete 用查询串传 projectId。
- detail.get.ts 补发 Authorization:详情接口内联了 favorited,而它此前是匿名调用,
  已收藏的项目会显示成「未收藏」。未登录时不带这个头,行为与改动前完全一致
  (返回体仍整体返回 data,favorited 正是靠这一点透传的)。
- 「我的收藏」做成**模板无关的公共路由** app/pages/tender/favorites.vue(10 套模板共用),
  顶栏 HjcUserBar 在「我的订单」后加入口。列表按收藏时间倒序 + 加载更多;
  只渲染后端算好的 saleState/purchased(前端不再判一遍);失效项目**保留条目**、
  点击只提示不进详情、仍可取消;取消收藏弹二次确认(复用 HjcConfirmDialog)。
  取数用 useRequestFetch —— 裸 $fetch 在 SSR 不转发 cookie,会被代理当成匿名调用,
  拿到 401 后 handleAuthCode 会清凭据跳登录,等于刷新页面把自己登出。
- template-07 详情页加收藏按钮(heart SVG 两态,不引图标库),未登录点它跳登录、
  回跳带 favorite=1 后自动补一次收藏(只在客户端 onMounted 做,不改写 URL——
  详情壳是 :key="route.fullPath",改 query 会重挂载并与收藏请求赛跑)。
  取数同样改用 useRequestFetch,否则首屏 favorited 恒为 false。
- 只改 template-07:10 套模板里只有它有 TenderDetail.vue,其余按需再补。
2026-09-17 17:37:10 +08:00

98 lines
2.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/** 汇吉采标书项目(前端视图模型,与 mp-java HjcBidProject 对齐) */
export interface Tender {
id: number
/** 项目编号 */
projectNo: string
/** 项目名称 */
projectName: string
/** 分类:服务类/工程类/货物类 */
category?: string
/** 发布时间 */
publishTime?: string
/** 投标截止时间 */
deadlineTime?: string
/** 招标人 */
tenderer?: string
/** 中标公司 */
winnerSupplier?: string
/** 中标金额 */
bidAmount?: number
/** 公告标题 */
bulletinTitle?: string
/** 公告正文 */
bulletinContent?: string
/** 公告附件(JSON字符串) */
bulletinFileList?: string
/** 标书价格(信息服务费) */
tenderPrice?: number
/** 标书附件(JSON字符串) */
tenderFile?: string
/** 开售时间 */
onsaleTime?: string
/** 停售时间 */
offsaleTime?: string
/** 售卖方式:1公司财务 2公众号 3交易中心 4政采云 */
sellingMethod?: number
/** 是否卖标书 */
needSell?: number
/** 状态:1上架 0停售 */
status?: number
/** 来源 */
dataSource?: string
/** 已售数量(下单即加、从不回退;当前已无展示用途,历史字段) */
saleCount?: number
/**
* 购买人数:后端实时统计的**已付款订单数**`COUNT(*) WHERE pay_status=1`)。
* 口径与「人数」字面有偏差(同一企业买 2 单计 2),这是明确拍定的取值。
*/
buyerCount?: number
/**
* 当前登录企业是否已收藏本项目(后端**内联**在详情响应里的非表字段)。
* 未登录恒为 `false` —— 详情是公开接口,不因为没登录而报错。
*/
favorited?: boolean
}
/** 「我的收藏」单条(对应 mp-java HjcFavoriteVo */
export interface HjcFavorite {
/** 收藏行 id(排查用,不是项目 id) */
id: number
/** 标书项目 id(进详情要用它,不是 id) */
projectId: number
/** 收藏时间 */
createTime?: string
/** 项目已被物理删除时为 null */
projectName?: string
projectNo?: string
category?: string
tenderPrice?: number
deadlineTime?: string
offsaleTime?: string
/**
* 售卖状态,由**后端**算好(口径只有一份):`onsale` 在售 / `ended` 已结束 / `removed` 已下架。
* 前端只渲染文案,不要自己比 status 或算时间。
*/
saleState?: 'onsale' | 'ended' | 'removed'
/**
* 本企业是否已购买该项目(已付款订单口径,与详情页「购买人数」同一口径)。
* 已购**不会**从收藏夹移除——收藏是存档,不是购物车。
*/
purchased?: boolean
}
/** 分页返回结构 */
export interface TenderPage {
list: Tender[]
count: number
}
/** 登录用户(对应后端 common.system.User 关键字段) */
export interface HjcUser {
userId: number
username: string
nickname?: string
phone?: string
tenantId?: number
[key: string]: any
}