管理后台初始化,登录,团队管理,报价单管理 完成

This commit is contained in:
‘Liammcl’
2024-12-15 17:39:58 +08:00
commit 5882bf9548
91 changed files with 16260 additions and 0 deletions

View File

@@ -0,0 +1,88 @@
import { supabase } from '@/config/supabase';
export const resourceService = {
async getResources({ page = 1, pageSize = 10, orderBy = 'created_at', ascending = false, searchQuery = '' }) {
try {
let query = supabase
.from('resources')
.select('*', { count: 'exact' })
.eq('type','shorturl')
if (searchQuery) {
query = query.or(`external_id.ilike.%${searchQuery}%`);
}
if (orderBy) {
query = query.order(orderBy, { ascending });
}
const from = (page - 1) * pageSize;
query = query.range(from, from + pageSize - 1);
const { data, count, error } = await query;
if (error) throw error;
return {
data,
total: count || 0,
};
} catch (error) {
throw error;
}
},
async createResource(values) {
try {
const { data, error } = await supabase
.from('resources')
.insert([{
...values,
type: 'quota',
created_at: new Date().toISOString(),
updated_at: new Date().toISOString(),
}])
.select()
.single();
if (error) throw error;
return data;
} catch (error) {
throw error;
}
},
async updateResource(id, values) {
try {
const { data, error } = await supabase
.from('resources')
.update({
...values,
updated_at: new Date().toISOString(),
})
.eq('id', id)
.eq('type', 'quota')
.select()
.single();
if (error) throw error;
return data;
} catch (error) {
throw error;
}
},
async deleteResource(id) {
try {
const { error } = await supabase
.from('resources')
.update({
deleted_at: new Date().toISOString(),
})
.eq('id', id)
.eq('type', 'quota');
if (error) throw error;
return true;
} catch (error) {
throw error;
}
},
};

View File

@@ -0,0 +1,169 @@
import { supabase } from '@/config/supabase';
export const teamService = {
async getTeams({ page = 1, pageSize = 10, orderBy = 'created_at', ascending = false , searchQuery = ''
} = {}) {
const from = (page - 1) * pageSize;
const to = from + pageSize - 1;
let query = supabase
.from('teams')
.select(`
id,
name,
description,
attributes,
created_at,
updated_at,
deleted_at,
schema_version,
avatar_url,
team_membership(
id,
user_id,
role,
is_creator,
users(
id,
email
)
)
`, { count: 'exact' })
.is('deleted_at', null)
.order(orderBy, { ascending })
.range(from, to);
if (searchQuery) {
query = query.ilike('name', `%${searchQuery}%`);
}
const { data, error, count } = await query
.order(orderBy, { ascending })
.range(from, to);
if (error) {
console.error('Error fetching teams:', error);
throw error;
}
return {
data,
total: count || 0
};
},
// 创建团队
async createTeam({ name, description, userId }) {
const { data: team, error: teamError } = await supabase
.from('teams')
.insert([
{
name,
description
}
])
.select()
.single();
if (teamError) throw teamError;
// 创建团队成员关系(创建者)
const { error: membershipError } = await supabase
.from('team_membership')
.insert([
{
id:team.id,
team_id: team.id,
user_id: userId,
role: 'OWNER',
is_creator: true
}
]);
if (membershipError) throw membershipError;
return team;
},
// 获取单个团队详情
async getTeamById(teamId) {
const { data, error } = await supabase
.from('teams')
.select(`
id,
name,
description,
attributes,
created_at,
updated_at,
avatar_url,
team_membership(
id,
user_id,
role,
is_creator,
users(
id,
email
)
)
`)
.eq('id', teamId)
.single();
if (error) throw error;
return data;
},
// 更新团队信息
async updateTeam(teamId, updates) {
const { data, error } = await supabase
.from('teams')
.update(updates)
.eq('id', teamId)
.select()
.single();
if (error) throw error;
return data;
},
// 添加团队成员
async addTeamMember(teamId, userId, role = 'MEMBER') {
const { data, error } = await supabase
.from('team_membership')
.insert([
{
team_id: teamId,
user_id: userId,
role,
is_creator: false
}
])
.select()
.single();
if (error) throw error;
return data;
},
// 更新成员角色
async updateMemberRole(teamId, userId, role) {
const { data, error } = await supabase
.from('team_membership')
.update({ role })
.match({ team_id: teamId, user_id: userId })
.select()
.single();
if (error) throw error;
},
async deleteTeam(teamId) {
const { error: teamError } = await supabase
.from('teams')
.delete()
.eq('id', teamId)
.select()
if (teamError) throw teamError;
},
};

View File

@@ -0,0 +1,48 @@
import { supabase } from '@/config/supabase';
export const teamMembershipService = {
async getMemberships(teamId) {
const { data, error } = await supabase
.from('team_memberships')
.select(`
*,
user:users(id, email, name)
`)
.eq('teamId', teamId);
if (error) throw error;
return data;
},
async createMembership(membershipData) {
const { data, error } = await supabase
.from('team_memberships')
.insert([membershipData])
.select()
.single();
if (error) throw error;
return data;
},
async updateMembership(id, membershipData) {
const { data, error } = await supabase
.from('team_memberships')
.update(membershipData)
.eq('id', id)
.select()
.single();
if (error) throw error;
return data;
},
async deleteMembership(id) {
const { error } = await supabase
.from('team_memberships')
.delete()
.eq('id', id);
if (error) throw error;
}
};