diff --git a/$null b/$null
new file mode 100644
index 0000000..32eecff
--- /dev/null
+++ b/$null
@@ -0,0 +1 @@
+mysql: [Warning] Using a password on the command line interface can be insecure.
diff --git a/.codebuddy/commands/mcp.md b/.codebuddy/commands/mcp.md
new file mode 100644
index 0000000..e69de29
diff --git a/backend/components.d.ts b/backend/components.d.ts
index 2f3d0d6..50d3e79 100644
--- a/backend/components.d.ts
+++ b/backend/components.d.ts
@@ -21,14 +21,12 @@ declare module 'vue' {
ElButton: typeof import('element-plus/es')['ElButton']
ElButtonGroup: typeof import('element-plus/es')['ElButtonGroup']
ElCard: typeof import('element-plus/es')['ElCard']
- ElCascader: typeof import('element-plus/es')['ElCascader']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
ElCol: typeof import('element-plus/es')['ElCol']
ElCollapse: typeof import('element-plus/es')['ElCollapse']
ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem']
ElCollapseTransition: typeof import('element-plus/es')['ElCollapseTransition']
- ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
ElContainer: typeof import('element-plus/es')['ElContainer']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
@@ -46,6 +44,7 @@ declare module 'vue' {
ElHeader: typeof import('element-plus/es')['ElHeader']
ElIcon: typeof import('element-plus/es')['ElIcon']
ElImage: typeof import('element-plus/es')['ElImage']
+ ElImageViewer: typeof import('element-plus/es')['ElImageViewer']
ElInput: typeof import('element-plus/es')['ElInput']
ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
ElLink: typeof import('element-plus/es')['ElLink']
diff --git a/backend/src/api/crmPipeline.js b/backend/src/api/crmPipeline.js
index c482bde..533a39c 100644
--- a/backend/src/api/crmPipeline.js
+++ b/backend/src/api/crmPipeline.js
@@ -82,6 +82,42 @@ export function deleteProject(id) {
return request({ url: `/backend/crm/project/${id}`, method: "delete" });
}
+/* --------------------------- 项目文档(OA 文档库) --------------------------- */
+
+/**
+ * 项目文档列表:对应文档库「共享文档 / 项目文档 / {项目名称}」文件夹(含子文件夹)。
+ * 存量项目在首次调用时自动补建文件夹。
+ */
+export function getProjectDocs(id, params) {
+ return request({ url: `/backend/crm/project/${id}/docs`, method: "get", params });
+}
+
+/**
+ * 上传项目文档:文件先经 POST /backend/uploadfile 上传,
+ * 再调用本接口写入文档库项目文件夹并同步登记 CRM 附件。
+ */
+export function uploadProjectDoc(id, data) {
+ return request({ url: `/backend/crm/project/${id}/doc-upload`, method: "post", data });
+}
+
+/** 删除项目文档:同步软删文档库文档与对应 CRM 附件记录 */
+export function deleteProjectDoc(id, data) {
+ return request({ url: `/backend/crm/project/${id}/doc-delete`, method: "post", data });
+}
+
+/**
+ * 新建项目文档文件夹(对应文档库中项目文件夹下的子分类),用于分类存放文档。
+ * data: { name, parent_id },parent_id 缺省时建在项目根文件夹下。
+ */
+export function createProjectDocFolder(id, data) {
+ return request({ url: `/backend/crm/project/${id}/doc-folder`, method: "post", data });
+}
+
+/** 删除项目文档文件夹(需为空:无子文件夹、无文档;项目根文件夹不可删除) */
+export function deleteProjectDocFolder(id, data) {
+ return request({ url: `/backend/crm/project/${id}/doc-folder-delete`, method: "post", data });
+}
+
/* --------------------------------- 回访 --------------------------------- */
export function getFollowList(params) {
diff --git a/backend/src/views/apps/crm/business/components/detail.vue b/backend/src/views/apps/crm/business/components/detail.vue
new file mode 100644
index 0000000..915b4d4
--- /dev/null
+++ b/backend/src/views/apps/crm/business/components/detail.vue
@@ -0,0 +1,170 @@
+
+
+
推进商机阶段,达成后可转化为项目;转化后商机将锁定不可编辑
+推进商机阶段,达成后可转化为项目
登记潜在客户线索,跟进后可转化为商机;转化后线索将锁定不可编辑
+登记潜在客户线索,跟进后可转化为商机