diff --git a/components.d.ts b/components.d.ts index 7c502dc..2ba3f2a 100644 --- a/components.d.ts +++ b/components.d.ts @@ -21,6 +21,7 @@ declare module 'vue' { AgentSettingsPanel: typeof import('./src/components/AgentSettingsPanel.vue')['default'] AgentSetupWizard: typeof import('./src/components/AgentSetupWizard.vue')['default'] AgentTaskListDropdown: typeof import('./src/components/AgentTaskListDropdown.vue')['default'] + AgreementPreviewDialog: typeof import('./src/components/tools/AgreementPreviewDialog.vue')['default'] AiChat: typeof import('./src/components/AiChat.vue')['default'] AiThinkingIndicator: typeof import('./src/components/tools/AiThinkingIndicator.vue')['default'] ElButton: typeof import('element-plus/es')['ElButton'] diff --git a/src/api/common.ts b/src/api/common.ts index 97f357b..f4e416d 100644 --- a/src/api/common.ts +++ b/src/api/common.ts @@ -118,3 +118,30 @@ export function uploadFileToOss(file: File, pathEnum: OssPathEnum = 'ResumeFile' headers: { 'Content-Type': 'multipart/form-data' }, }) } + +// ==================== 协议查询相关 ==================== + +/** 协议数据结构 */ +export interface AgreementDto { + /** 协议表ID */ + id?: number + /** 协议码,唯一标识一类协议 */ + agreementCode?: string + /** 修改版本 */ + version?: number + /** 协议名称 */ + agreementName?: string + /** 协议内容(富文本/Markdown) */ + content?: string + /** 状态 1=启用 0=禁用 */ + status?: number +} + +/** + * 根据协议码查询协议内容 + * GET /public/agreement?code=xxx + * @param code 协议码 + */ +export function fetchAgreement(code: string) { + return request.get>('/public/agreement', { params: { code } }) +} diff --git a/src/api/message.ts b/src/api/message.ts index 7066849..9853e9a 100644 --- a/src/api/message.ts +++ b/src/api/message.ts @@ -16,8 +16,8 @@ export interface MessageDto { bizId: number /** 是否已读 */ read: boolean - /** 创建时间 */ - createTime: { seconds: number; nanos: number } + /** 创建时间(毫秒时间戳) */ + createTime: number } /** 分页响应结构 */ diff --git a/src/assets/styles/components/agreement-preview-dialog.scss b/src/assets/styles/components/agreement-preview-dialog.scss new file mode 100644 index 0000000..2e18001 --- /dev/null +++ b/src/assets/styles/components/agreement-preview-dialog.scss @@ -0,0 +1,170 @@ +@use '../variables' as *; + +// 协议预览弹窗样式 +.agreement-preview-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + z-index: 2000; + display: flex; + align-items: center; + justify-content: center; +} + +.agreement-preview-dialog { + width: 7rem; + max-width: 90vw; + height: 80vh; + background: #fff; + border-radius: 0.12rem; + display: flex; + flex-direction: column; + overflow: hidden; + + // 顶部标题栏 + &__header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.16rem 0.24rem; + border-bottom: 1px solid #e5e7eb; + } + + &__title { + font-size: 0.18rem; + font-weight: 600; + color: $text-dark; + margin: 0; + } + + &__close { + font-size: 0.18rem; + color: #9ca3af; + cursor: pointer; + padding: 0.04rem; + transition: color 0.2s; + + &:hover { + color: #374151; + } + } + + // 内容区域 + &__body { + flex: 1; + overflow-y: auto; + padding: 0.24rem; + } + + &__loading { + text-align: center; + padding: 0.4rem 0; + color: #999; + font-size: 0.14rem; + } + + // Markdown 渲染内容样式 + &__content { + font-size: 0.13rem; + color: #555; + line-height: 1.8; + + h1, h2, h3, h4, h5, h6 { + color: $text-dark; + font-weight: 600; + margin: 0.14rem 0 0.08rem; + } + h1 { font-size: 0.2rem; } + h2 { font-size: 0.17rem; } + h3 { font-size: 0.15rem; } + h4 { font-size: 0.14rem; } + + p { + margin: 0 0 0.08rem; + text-align: justify; + &:last-child { margin-bottom: 0; } + } + + ul, ol { + padding-left: 0.2rem; + margin: 0.06rem 0; + } + + li { + margin-bottom: 0.04rem; + line-height: 1.8; + } + + strong { + font-weight: 700; + color: $text-dark; + } + + a { + color: #2563eb; + text-decoration: underline; + } + + blockquote { + border-left: 3px solid #cbd5e1; + padding-left: 0.1rem; + margin: 0.08rem 0; + color: #64748b; + } + + table { + border-collapse: collapse; + width: 100%; + margin: 0.1rem 0; + font-size: 0.12rem; + + th, td { + border: 1px solid #e5e7eb; + padding: 0.06rem 0.1rem; + text-align: left; + line-height: 1.6; + } + + th { + background: #f8fafc; + font-weight: 600; + color: $text-dark; + } + + tr:nth-child(even) { + background: #fafbfc; + } + } + + hr { + border: none; + border-top: 1px solid #e5e7eb; + margin: 0.1rem 0; + } + + code { + background: #f1f5f9; + padding: 0.01rem 0.04rem; + border-radius: 0.03rem; + font-size: 0.12rem; + } + + pre { + background: #1e293b; + color: #e2e8f0; + padding: 0.1rem 0.12rem; + border-radius: 0.06rem; + overflow-x: auto; + margin: 0.08rem 0; + + code { + background: none; + padding: 0; + color: inherit; + } + } + } +} diff --git a/src/assets/styles/components/ai-chat.scss b/src/assets/styles/components/ai-chat.scss index 06ab267..6a6f93b 100644 --- a/src/assets/styles/components/ai-chat.scss +++ b/src/assets/styles/components/ai-chat.scss @@ -163,14 +163,19 @@ th, td { border: 1px solid #e5e7eb; - padding: 0.04rem 0.08rem; + padding: 0.06rem 0.1rem; text-align: left; + line-height: 1.6; } th { background: #f8fafc; font-weight: 600; } + + tr:nth-child(even) { + background: #fafbfc; + } } hr { diff --git a/src/assets/styles/components/settings-dialog.scss b/src/assets/styles/components/settings-dialog.scss index bd96542..b03811d 100644 --- a/src/assets/styles/components/settings-dialog.scss +++ b/src/assets/styles/components/settings-dialog.scss @@ -487,5 +487,66 @@ line-height: 1.8; text-align: justify; } + + // Markdown 渲染额外样式 + h1, h2, h3, h5, h6 { + color: $text-dark; + margin: 0.14rem 0 0.08rem; + font-weight: 600; + } + h1 { font-size: 0.2rem; } + h2 { font-size: 0.17rem; } + h3 { font-size: 0.15rem; } + + ul, ol { + padding-left: 0.2rem; + margin: 0.06rem 0; + } + + li { + margin-bottom: 0.04rem; + line-height: 1.8; + } + + strong { + font-weight: 700; + color: $text-dark; + } + + a { + color: #2563eb; + text-decoration: underline; + } + + blockquote { + border-left: 3px solid #cbd5e1; + padding-left: 0.1rem; + margin: 0.08rem 0; + color: #64748b; + } + + table { + border-collapse: collapse; + width: 100%; + margin: 0.1rem 0; + font-size: 0.12rem; + + th, td { + border: 1px solid #e5e7eb; + padding: 0.06rem 0.1rem; + text-align: left; + line-height: 1.6; + } + + th { + background: #f8fafc; + font-weight: 600; + color: $text-dark; + } + + tr:nth-child(even) { + background: #fafbfc; + } + } } } diff --git a/src/assets/styles/components/side-nav.scss b/src/assets/styles/components/side-nav.scss index 426c77a..71d9569 100644 --- a/src/assets/styles/components/side-nav.scss +++ b/src/assets/styles/components/side-nav.scss @@ -184,7 +184,7 @@ // 左侧消息列表 .side-nav__message-list { - width: 2rem; + width: 2.1rem; border-right: 1px solid $border-color; overflow-y: auto; flex-shrink: 0; @@ -193,7 +193,7 @@ .side-nav__message-list-item { display: flex; align-items: center; - padding: 0.12rem 0.14rem; + padding: 0.12rem 0.10rem; cursor: pointer; border-bottom: 1px solid $border-color; transition: background 0.2s; diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index b10f06b..1cde998 100644 --- a/src/assets/styles/index.scss +++ b/src/assets/styles/index.scss @@ -36,6 +36,7 @@ @use './components/profile-welcome-dialog.scss'; @use './components/settings-invite-dialog.scss'; @use './components/resume-upload-dialog.scss'; +@use './components/agreement-preview-dialog.scss'; // 全局样式(优先级最高) @use './auto.scss'; diff --git a/src/components/MemberDialog.vue b/src/components/MemberDialog.vue index 29b2df1..6f40bb4 100644 --- a/src/components/MemberDialog.vue +++ b/src/components/MemberDialog.vue @@ -237,7 +237,7 @@ - 我已阅读并同意 《会员服务协议》 《自动续费协议》 + 我已阅读并同意 《会员服务协议》