diff --git a/src/hooks/resource/useResource.js b/src/hooks/resource/useResource.js
index f131734..d1fb8b1 100644
--- a/src/hooks/resource/useResource.js
+++ b/src/hooks/resource/useResource.js
@@ -24,8 +24,6 @@ export const useResources = (initialPagination, initialSorter, type) => {
setCurrentPagination(newPagination);
setCurrentSorter(newSorter);
- console.log(params.searchQuery,'params.searchQuery');
-
const { data, total: newTotal } = await resourceService.getResources({
page: newPagination.current,
pageSize: newPagination.pageSize,
@@ -77,8 +75,6 @@ export const useResources = (initialPagination, initialSorter, type) => {
const deleteResource = async (id) => {
try {
const data= await resourceService.deleteResource(id, type);
- console.log(data,data.length,'data');
-
if(data?.length>0){
const newCurrent =
resources.length === 1 && currentPagination.current > 1
@@ -87,7 +83,7 @@ export const useResources = (initialPagination, initialSorter, type) => {
await fetchResources({ current: newCurrent });
message.success("删除成功");
}else{
- throw new Error("no level");
+ throw new Error("暂无权限");
}
} catch (error) {
throw error;
diff --git a/src/hooks/supabaseService.js b/src/hooks/supabaseService.js
index 4b0790a..926ca6c 100644
--- a/src/hooks/supabaseService.js
+++ b/src/hooks/supabaseService.js
@@ -1,5 +1,5 @@
import { supabase } from "@/config/supabase";
-
+import { message } from "antd";
class SupabaseService {
async select(table, options = {}) {
try {
@@ -60,12 +60,22 @@ class SupabaseService {
.from(table)
.insert(data)
.select();
+ if (error) {
+ if (error.code === '42501' || error.status === 403) {
+ throw new Error('暂无权限:您没有执行此操作的权限');
- if (error) throw error;
+ }
+ throw new Error(error.message || '数据库操作失败');
+ }
+ if (result?.length === 0) {
+ throw new Error('暂无权限:您没有执行此操作的权限');
+ }
return result;
} catch (error) {
- console.error(`Error inserting into ${table}:`, error.message);
- throw error;
+ // 确保错误始终是 Error 对象
+ const errorMessage = error instanceof Error ? error.message : String(error);
+ console.error(`Insert error for table ${table}:`, errorMessage);
+ throw new Error(errorMessage);
}
}
@@ -83,22 +93,21 @@ class SupabaseService {
}
const { data, error } = await query.select();
-
+ if(data.length===0) throw '暂无权限' ;
if (error) throw error;
return data;
} catch (error) {
- console.error(`Error updating ${table}:`, error.message);
- throw error;
+ throw new Error('更新失败');
}
}
// 通用 DELETE 请求
async delete(table, match) {
try {
- const { error } = await supabase.from(table).delete().match(match);
-
+ const { data,error } = await supabase.from(table).delete().match(match).select();
+ if(data.length===0) throw '暂无权限';
if (error) throw error;
- return true;
+ return data;
} catch (error) {
console.error(`Error deleting from ${table}:`, error.message);
throw error;
diff --git a/src/pages/company/project/detail/index.jsx b/src/pages/company/project/detail/index.jsx
index fd8382a..294c4ff 100644
--- a/src/pages/company/project/detail/index.jsx
+++ b/src/pages/company/project/detail/index.jsx
@@ -228,8 +228,7 @@ export default function ProjectDetail() {
.select();
}
- if (result.error) throw result.error;
-
+ if (result.error||result.data.length===0) throw 'error';
message.success("保存成功");
navigate("/company/project");
} catch (error) {
diff --git a/src/pages/company/quotation/detail/index.jsx b/src/pages/company/quotation/detail/index.jsx
index 63809ab..97c6061 100644
--- a/src/pages/company/quotation/detail/index.jsx
+++ b/src/pages/company/quotation/detail/index.jsx
@@ -268,7 +268,10 @@ const QuotationForm = () => {
}
if (result.error) throw result.error;
-
+ if(result.length===0){
+ message.error('暂无权限');
+ return;
+ };
message.success("保存成功");
navigate("/company/quotation");
} catch (error) {
diff --git a/src/pages/company/service/detail/components/ProjectTemplate.jsx b/src/pages/company/service/detail/components/ProjectTemplate.jsx
index 31a9f8c..89ed9ad 100644
--- a/src/pages/company/service/detail/components/ProjectTemplate.jsx
+++ b/src/pages/company/service/detail/components/ProjectTemplate.jsx
@@ -8,9 +8,9 @@ const ProjectTemplate = ({ form, id, isView }) => {
layout="vertical"
disabled={isView}
>
- {/* 专案模板特有的字段和组件 */}
+
- {/* 项目阶段、时间线等内容 */}
+
);
diff --git a/src/pages/company/service/detail/components/QuotationTemplate.jsx b/src/pages/company/service/detail/components/QuotationTemplate.jsx
index 52f48ce..aaa8f44 100644
--- a/src/pages/company/service/detail/components/QuotationTemplate.jsx
+++ b/src/pages/company/service/detail/components/QuotationTemplate.jsx
@@ -103,21 +103,17 @@ const QuotationTemplate = ({ id, isView, onCancel,isEdit }) => {
};
if (id) {
- // 更新
- await supabaseService.update('resources',
- { id },
- serviceData
- );
+ await supabaseService.update('resources', { id }, serviceData);
} else {
- // 新增
await supabaseService.insert('resources', serviceData);
}
message.success("保存成功");
onCancel();
} catch (error) {
+ const errorMsg = error instanceof Error ? error.message : '保存失败';
console.error("保存失败:", error);
- message.error("保存失败");
+ message.error(errorMsg);
} finally {
setLoading(false);
}
diff --git a/src/pages/company/service/detail/components/TaskTemplate.jsx b/src/pages/company/service/detail/components/TaskTemplate.jsx
index 72e384c..b9104b4 100644
--- a/src/pages/company/service/detail/components/TaskTemplate.jsx
+++ b/src/pages/company/service/detail/components/TaskTemplate.jsx
@@ -104,15 +104,14 @@ const TaskTemplate = ({ id, isView, onCancel,isEdit }) => {
serviceData
);
} else {
- // 新增
await supabaseService.insert('resources', serviceData);
}
message.success("保存成功");
onCancel();
} catch (error) {
+ message.error('保存失败');
console.error("保存失败:", error);
- message.error("保存失败");
} finally {
setLoading(false);
}
diff --git a/src/pages/company/service/detail/index.jsx b/src/pages/company/service/detail/index.jsx
index 81d37ed..ff2092a 100644
--- a/src/pages/company/service/detail/index.jsx
+++ b/src/pages/company/service/detail/index.jsx
@@ -7,7 +7,6 @@ import TaskTemplate from './components/TaskTemplate';
const { Title } = Typography;
-// 模板类型配置
const TEMPLATE_CONFIG = {
quotation: {
title: '报价单模板',
@@ -36,7 +35,6 @@ const ServiceForm = () => {
if (!currentTemplate) {
return
无效的模板类型
;
}
-
return (
{
setData(services || []);
} catch (error) {
console.error("获取服务模板失败:", error);
- message.error("获取服���模板失败");
+ message.error("获取服务模板失败");
} finally {
setLoading(false);
}
@@ -127,7 +127,7 @@ const ServicePage = () => {
fetchServices();
} catch (error) {
console.error("删除失败:", error);
- message.error("删除失败");
+ message.error(error);
}
};
@@ -173,7 +173,7 @@ const ServicePage = () => {
}
} catch (error) {
console.error("保存失败:", error);
- message.error("保存失败");
+ message.error(error);
}
};
diff --git a/src/pages/company/supplier/detail/index.jsx b/src/pages/company/supplier/detail/index.jsx
index 18adcb3..78a46ec 100644
--- a/src/pages/company/supplier/detail/index.jsx
+++ b/src/pages/company/supplier/detail/index.jsx
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
-import { Form, Input, Select, Button, Space, Card, Typography } from 'antd';
+import { Form, Input, Select, Button, Space, Card, Typography, message } from 'antd';
import { ArrowLeftOutlined, SaveOutlined } from '@ant-design/icons';
import { supabase } from '@/config/supabase';
import { useNavigate, useParams, useSearchParams } from 'react-router-dom';
@@ -22,9 +22,8 @@ const SupplierForm = () => {
.select('*')
.eq('id', id)
.single();
-
if (error) throw error;
-
+
if (id) {
// 设置表单初始值
form.setFieldsValue({
@@ -74,10 +73,14 @@ const SupplierForm = () => {
.insert([supplierData])
.select();
}
-
+ if(result.data.length===0){
+ message.error('暂无权限');
+ return;
+ };
if (result.error) throw result.error;
navigate('/company/supplier');
} catch (error) {
+ message.error('暂无权限');
console.error('保存失败:', error);
}
};
diff --git a/src/pages/company/task/index.jsx b/src/pages/company/task/index.jsx
index fb89a1b..96a6112 100644
--- a/src/pages/company/task/index.jsx
+++ b/src/pages/company/task/index.jsx
@@ -251,9 +251,7 @@ const TaskPage = () => {
setLoading(true);
const newAttributes = JSON.parse(JSON.stringify(record.attributes));
- // 修改任务名称,添加"副本"标识
newAttributes.taskName = `${newAttributes.taskName} (副本)`;
-
const { data, error } = await supabase
.from("resources")
.insert([
@@ -261,10 +259,12 @@ const TaskPage = () => {
type: "task",
attributes: newAttributes,
},
- ]);
-
+ ]).select()
+ if(!data||data?.length===0){
+ message.error('暂无权限');
+ return;
+ };
if (error) throw error;
-
message.success("复制成功");
fetchTasks(); // 刷新列表
} catch (error) {
diff --git a/src/pages/resource/role/index.jsx b/src/pages/resource/role/index.jsx
index 88b1a36..d738048 100644
--- a/src/pages/resource/role/index.jsx
+++ b/src/pages/resource/role/index.jsx
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
-import { Card, App, Table, Button, Modal, Form, Select, message, Input, Divider } from 'antd';
+import { Card, App, Table, Button, Modal, Form, Select, message, Input, Divider, Popconfirm } from 'antd';
import { PlusOutlined, DeleteOutlined, EditOutlined } from '@ant-design/icons';
import { supabase } from '@/config/supabase';
@@ -377,12 +377,19 @@ export default function PermissionManagement() {
setModalVisible(true);
}}
/>
- }
- onClick={() => handleDelete(record.id)}
- />
+ handleDelete(record.id)}
+ >
+ }
+ />
+
),
},
diff --git a/src/routes/routes.js b/src/routes/routes.js
index ae7f2c2..9e59c97 100644
--- a/src/routes/routes.js
+++ b/src/routes/routes.js
@@ -119,6 +119,14 @@ export const allRoutes = [
icon: "appstore",
key: "company/serviceTemplate",
},
+ {
+ path: "serviceTemplateInfo/:id?",
+ hidden: true,
+ component: lazy(() => import("@/pages/company/service/detail")),
+ name: "服务模版详情",
+ icon: "container",
+ key: "company/serviceTemplateInfo",
+ },
{
path: "supplier",
component: lazy(() => import("@/pages/company/supplier")),