立即联系
关于RMO
diff --git a/src/router/index.ts b/src/router/index.ts
index c602e3a..8dbbc2a 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -35,6 +35,7 @@ import LearningCenter from '@/views/LearningCenter.vue'
import Contact from '@/views/Contact.vue'
import PrivacyPolicy from '@/views/PrivacyPolicy.vue'
import Login from '@/views/Login.vue'
+import Register from '@/views/Register.vue'
// Dashboard
import Dashboard from '@/views/dashboard/Dashboard.vue'
@@ -50,6 +51,7 @@ import ProjectQuotes from '@/views/dashboard/ProjectQuotes.vue'
import QuoteCompare from '@/views/dashboard/QuoteCompare.vue'
import QuoteTaskList from '@/views/dashboard/smart-ops/QuoteTaskList.vue'
import QuoteTaskDetail from '@/views/dashboard/smart-ops/QuoteTaskDetail.vue'
+import UserApprovalList from '@/views/dashboard/smart-ops/UserApprovalList.vue'
import ICFEditor from '@/views/dashboard/ICFEditor.vue'
import RiskScoring from '@/views/dashboard/RiskScoring.vue'
import ProtocolRiskAssessment from '@/views/dashboard/ProtocolRiskAssessment.vue'
@@ -113,6 +115,7 @@ const router = createRouter({
{ path: 'privacy-policy', component: PrivacyPolicy },
{ path: 'overseas', component: Overseas },
{ path: 'login', component: Login },
+ { path: 'register', component: Register },
]
},
{
@@ -129,6 +132,7 @@ const router = createRouter({
{ path: 'quote-compare', component: QuoteCompare },
{ path: 'smart-ops/quote-tasks', component: QuoteTaskList },
{ path: 'smart-ops/quote-tasks/:id', component: QuoteTaskDetail },
+ { path: 'smart-ops/user-approvals', component: UserApprovalList },
{ path: 'projects', component: ProjectList },
{ path: 'projects/:id', component: ProjectDetail },
{ path: 'inquiries', component: InquiryList },
diff --git a/src/stores/registration.ts b/src/stores/registration.ts
new file mode 100644
index 0000000..b459391
--- /dev/null
+++ b/src/stores/registration.ts
@@ -0,0 +1,118 @@
+import { defineStore } from 'pinia'
+import { ref } from 'vue'
+
+export interface PendingRegistration {
+ id: string
+ organizationId: string
+ organizationName: string
+ name: string
+ phone: string
+ email: string
+ position: string
+ department: string
+ idCardFile?: string
+ workProofFile?: string
+ status: 'pending' | 'approved' | 'rejected'
+ rejectReason?: string
+ createdAt: string
+ updatedAt?: string
+}
+
+export interface Organization {
+ id: string
+ name: string
+}
+
+const STORAGE_KEY = 'rmo_pending_registrations'
+const ORGS_KEY = 'rmo_organizations'
+
+function loadRegistrations(): PendingRegistration[] {
+ try {
+ const raw = localStorage.getItem(STORAGE_KEY)
+ return raw ? JSON.parse(raw) : []
+ } catch {
+ return []
+ }
+}
+
+function saveRegistrations(list: PendingRegistration[]) {
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(list))
+}
+
+export const useRegistrationStore = defineStore('registration', () => {
+ const organizations = ref
([
+ { id: 'org1', name: '示例制药有限公司' },
+ { id: 'org2', name: '示例生物科技有限公司' },
+ { id: 'org3', name: '华泰保险经纪有限公司' },
+ { id: 'org4', name: '临研安(北京)科技有限公司' },
+ { id: 'org5', name: '太平洋财产保险股份有限公司' }
+ ])
+
+ const reservedEmails = ['admin@rmo.com', 'policyholder@rmo.com', 'insurer@rmo.com', 'tpa@vdano.com']
+
+ function getPendingRegistrations(): PendingRegistration[] {
+ return loadRegistrations().filter(r => r.status === 'pending')
+ }
+
+ function getAllRegistrations(): PendingRegistration[] {
+ return loadRegistrations()
+ }
+
+ function submitRegistration(data: Omit): Promise<{ success: boolean; message?: string }> {
+ return new Promise((resolve) => {
+ const list = loadRegistrations()
+ if (reservedEmails.includes(data.email.toLowerCase())) {
+ resolve({ success: false, message: '该邮箱已被注册' })
+ return
+ }
+ if (list.some(r => r.email.toLowerCase() === data.email.toLowerCase())) {
+ resolve({ success: false, message: '该邮箱已被注册' })
+ return
+ }
+ if (data.phone && list.some(r => r.phone === data.phone)) {
+ resolve({ success: false, message: '该手机号已被注册' })
+ return
+ }
+ const now = new Date().toISOString()
+ const reg: PendingRegistration = {
+ ...data,
+ id: `reg_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`,
+ status: 'pending',
+ createdAt: now
+ }
+ list.unshift(reg)
+ saveRegistrations(list)
+ resolve({ success: true })
+ })
+ }
+
+ function approveRegistration(id: string): void {
+ const list = loadRegistrations()
+ const idx = list.findIndex(r => r.id === id)
+ if (idx >= 0) {
+ list[idx].status = 'approved'
+ list[idx].updatedAt = new Date().toISOString()
+ saveRegistrations(list)
+ }
+ }
+
+ function rejectRegistration(id: string, reason?: string): void {
+ const list = loadRegistrations()
+ const idx = list.findIndex(r => r.id === id)
+ if (idx >= 0) {
+ list[idx].status = 'rejected'
+ list[idx].rejectReason = reason
+ list[idx].updatedAt = new Date().toISOString()
+ saveRegistrations(list)
+ }
+ }
+
+ return {
+ organizations,
+ getPendingRegistrations,
+ getAllRegistrations,
+ submitRegistration,
+ approveRegistration,
+ rejectRegistration
+ }
+})
diff --git a/src/views/Home.vue b/src/views/Home.vue
index 601fd5a..11d4cc6 100644
--- a/src/views/Home.vue
+++ b/src/views/Home.vue
@@ -98,7 +98,7 @@ const sections = [
{ class: 'solutions-section', title: '', subtitle: '' },
{ class: 'capabilities-section', title: '核心能力', subtitle: '' },
{ class: 'knowledge-section', title: '知识资源', subtitle: '分享我们对行业的洞见和风险资讯' },
- { class: 'contact-section', title: '联系我们', subtitle: '获取RMO最新资讯,第一时间了解我们的企业动态' }
+ { class: 'contact-section', title: '联系我们', subtitle: '获取RMO最新资讯,第一时间了解风险管理动态' }
]
const capabilities = [
diff --git a/src/views/Login.vue b/src/views/Login.vue
index 98b015e..24b3393 100644
--- a/src/views/Login.vue
+++ b/src/views/Login.vue
@@ -46,7 +46,7 @@