管理后台初始化,登录,团队管理,报价单管理 完成
This commit is contained in:
88
src/services/supabase/resource.js
Normal file
88
src/services/supabase/resource.js
Normal 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;
|
||||
}
|
||||
},
|
||||
};
|
||||
169
src/services/supabase/team.js
Normal file
169
src/services/supabase/team.js
Normal 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;
|
||||
},
|
||||
};
|
||||
48
src/services/supabase/teamMembership.js
Normal file
48
src/services/supabase/teamMembership.js
Normal 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;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user