feat: 完成所有页面的演示模式实现
- 更新 DashboardLayout 组件,统一使用演示模式布局 - 实现仪表盘页面的完整演示数据和功能 - 完成用户管理页面的演示模式,包含搜索、过滤、分页等功能 - 实现通话记录页面的演示数据和录音播放功能 - 完成翻译员管理页面的演示模式 - 实现订单管理页面的完整功能 - 完成发票管理页面的演示数据 - 更新文档管理页面 - 添加 utils.ts 工具函数库 - 完善 API 路由和数据库结构 - 修复各种 TypeScript 类型错误 - 统一界面风格和用户体验
This commit is contained in:
@@ -0,0 +1,179 @@
|
||||
# 数据库设置说明
|
||||
|
||||
## 概述
|
||||
|
||||
本项目使用 Supabase 作为后端数据库服务,提供 PostgreSQL 数据库、身份验证、实时订阅等功能。
|
||||
|
||||
## 数据库配置步骤
|
||||
|
||||
### 1. 创建 Supabase 项目
|
||||
|
||||
1. 访问 [Supabase Dashboard](https://supabase.com/dashboard)
|
||||
2. 创建新项目
|
||||
3. 记录项目的 URL 和 API 密钥
|
||||
|
||||
### 2. 执行数据库脚本
|
||||
|
||||
1. 在 Supabase Dashboard 中,进入 SQL Editor
|
||||
2. 将 `schema.sql` 文件的内容复制粘贴到编辑器中
|
||||
3. 点击 "Run" 执行脚本
|
||||
|
||||
### 3. 配置环境变量
|
||||
|
||||
在项目根目录的 `.env.local` 文件中配置以下变量:
|
||||
|
||||
```env
|
||||
# Supabase 配置
|
||||
NEXT_PUBLIC_SUPABASE_URL=https://your-project-id.supabase.co
|
||||
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
|
||||
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
|
||||
```
|
||||
|
||||
## 数据库表结构
|
||||
|
||||
### 核心表
|
||||
|
||||
1. **users** - 用户表
|
||||
- 存储用户基本信息
|
||||
- 支持个人用户、企业用户、管理员三种类型
|
||||
|
||||
2. **enterprises** - 企业表
|
||||
- 存储企业客户信息
|
||||
- 与用户表关联
|
||||
|
||||
3. **orders** - 订单表
|
||||
- 存储口译服务订单
|
||||
- 关联用户和译员
|
||||
|
||||
4. **invoices** - 发票表
|
||||
- 存储发票信息
|
||||
- 支持个人和企业发票
|
||||
|
||||
5. **interpreters** - 译员表
|
||||
- 存储译员信息和能力
|
||||
- 支持多语言和专业领域
|
||||
|
||||
6. **calls** - 通话记录表
|
||||
- 存储实际通话记录
|
||||
- 用于统计和质量评估
|
||||
|
||||
7. **documents** - 文档翻译表
|
||||
- 存储文档翻译任务
|
||||
- 跟踪翻译进度
|
||||
|
||||
### 辅助表
|
||||
|
||||
1. **enterprise_contracts** - 企业合同表
|
||||
2. **enterprise_bills** - 企业账单表
|
||||
3. **system_settings** - 系统设置表
|
||||
|
||||
## 安全策略
|
||||
|
||||
### 行级安全 (RLS)
|
||||
|
||||
所有表都启用了行级安全策略:
|
||||
|
||||
- **管理员权限**:管理员可以访问所有数据
|
||||
- **用户权限**:普通用户只能访问自己的数据
|
||||
- **企业权限**:企业用户可以访问所属企业的数据
|
||||
|
||||
### 身份验证
|
||||
|
||||
使用 Supabase Auth 进行用户身份验证:
|
||||
|
||||
- 支持邮箱密码注册/登录
|
||||
- 支持社交登录(可选)
|
||||
- JWT 令牌验证
|
||||
- 会话管理
|
||||
|
||||
## 数据库索引
|
||||
|
||||
为提高查询性能,已创建以下索引:
|
||||
|
||||
- 用户邮箱索引
|
||||
- 用户类型索引
|
||||
- 订单状态索引
|
||||
- 订单创建时间索引
|
||||
- 其他常用查询字段索引
|
||||
|
||||
## 触发器
|
||||
|
||||
自动更新 `updated_at` 字段的触发器已为所有表配置。
|
||||
|
||||
## 初始数据
|
||||
|
||||
系统会自动插入以下初始设置:
|
||||
|
||||
- 应用基本配置
|
||||
- 支持的语言列表
|
||||
- 默认货币设置
|
||||
- 税率配置
|
||||
|
||||
## 备份和恢复
|
||||
|
||||
Supabase 提供自动备份功能,建议:
|
||||
|
||||
1. 定期检查备份状态
|
||||
2. 测试恢复流程
|
||||
3. 导出重要数据作为额外备份
|
||||
|
||||
## 监控和维护
|
||||
|
||||
建议定期执行以下维护任务:
|
||||
|
||||
1. 检查数据库性能
|
||||
2. 清理过期数据
|
||||
3. 更新统计信息
|
||||
4. 监控存储使用情况
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 常见问题
|
||||
|
||||
1. **连接失败**
|
||||
- 检查环境变量配置
|
||||
- 确认 Supabase 项目状态
|
||||
|
||||
2. **权限错误**
|
||||
- 检查 RLS 策略
|
||||
- 确认用户角色设置
|
||||
|
||||
3. **查询性能问题**
|
||||
- 检查索引使用情况
|
||||
- 优化查询语句
|
||||
|
||||
### 调试工具
|
||||
|
||||
- Supabase Dashboard 中的 SQL Editor
|
||||
- 实时日志监控
|
||||
- 性能分析工具
|
||||
|
||||
## 扩展功能
|
||||
|
||||
### 实时订阅
|
||||
|
||||
项目支持实时数据订阅,可以监听:
|
||||
|
||||
- 新订单创建
|
||||
- 订单状态变更
|
||||
- 通话状态更新
|
||||
|
||||
### 全文搜索
|
||||
|
||||
可以启用 PostgreSQL 的全文搜索功能来搜索:
|
||||
|
||||
- 用户信息
|
||||
- 订单内容
|
||||
- 文档内容
|
||||
|
||||
### 地理位置
|
||||
|
||||
如需要地理位置功能,可以启用 PostGIS 扩展。
|
||||
|
||||
## 开发建议
|
||||
|
||||
1. 使用类型安全的查询构建器
|
||||
2. 实施适当的错误处理
|
||||
3. 使用事务处理复杂操作
|
||||
4. 定期更新依赖包
|
||||
5. 遵循数据库最佳实践
|
||||
@@ -0,0 +1,288 @@
|
||||
-- 口译服务管理平台数据库表结构
|
||||
-- 请在Supabase SQL编辑器中执行此脚本
|
||||
|
||||
-- 启用必要的扩展
|
||||
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||||
|
||||
-- 企业表(需要先创建,因为users表引用它)
|
||||
CREATE TABLE IF NOT EXISTS enterprises (
|
||||
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
|
||||
name VARCHAR(200) NOT NULL,
|
||||
contact_person VARCHAR(100),
|
||||
contact_email VARCHAR(255),
|
||||
contact_phone VARCHAR(20),
|
||||
address TEXT,
|
||||
tax_number VARCHAR(50),
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'inactive', 'suspended')),
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- 译员表(需要先创建,因为orders表引用它)
|
||||
CREATE TABLE IF NOT EXISTS interpreters (
|
||||
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
email VARCHAR(255) UNIQUE NOT NULL,
|
||||
phone VARCHAR(20),
|
||||
languages TEXT[] NOT NULL,
|
||||
specialties TEXT[],
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'inactive', 'busy')),
|
||||
rating DECIMAL(3,2) DEFAULT 0 CHECK (rating >= 0 AND rating <= 5),
|
||||
total_calls INTEGER DEFAULT 0,
|
||||
hourly_rate DECIMAL(8,2),
|
||||
currency VARCHAR(3) NOT NULL DEFAULT 'CNY',
|
||||
avatar_url TEXT,
|
||||
bio TEXT,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- 用户表
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
|
||||
email VARCHAR(255) UNIQUE NOT NULL,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
phone VARCHAR(20),
|
||||
user_type VARCHAR(20) NOT NULL DEFAULT 'individual' CHECK (user_type IN ('individual', 'enterprise', 'admin')),
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'inactive', 'suspended')),
|
||||
enterprise_id UUID REFERENCES enterprises(id),
|
||||
avatar_url TEXT,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- 企业合同表
|
||||
CREATE TABLE IF NOT EXISTS enterprise_contracts (
|
||||
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
|
||||
enterprise_id UUID NOT NULL REFERENCES enterprises(id) ON DELETE CASCADE,
|
||||
contract_number VARCHAR(50) UNIQUE NOT NULL,
|
||||
contract_type VARCHAR(50) NOT NULL,
|
||||
start_date DATE NOT NULL,
|
||||
end_date DATE NOT NULL,
|
||||
total_amount DECIMAL(10,2) NOT NULL,
|
||||
currency VARCHAR(3) NOT NULL DEFAULT 'CNY',
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'expired', 'terminated')),
|
||||
service_rates JSONB,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- 企业账单表
|
||||
CREATE TABLE IF NOT EXISTS enterprise_bills (
|
||||
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
|
||||
enterprise_id UUID NOT NULL REFERENCES enterprises(id) ON DELETE CASCADE,
|
||||
bill_number VARCHAR(50) UNIQUE NOT NULL,
|
||||
billing_period_start DATE NOT NULL,
|
||||
billing_period_end DATE NOT NULL,
|
||||
total_amount DECIMAL(10,2) NOT NULL,
|
||||
currency VARCHAR(3) NOT NULL DEFAULT 'CNY',
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'paid', 'overdue', 'cancelled')),
|
||||
items JSONB,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- 订单表
|
||||
CREATE TABLE IF NOT EXISTS orders (
|
||||
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
|
||||
order_number VARCHAR(50) UNIQUE NOT NULL,
|
||||
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
user_name VARCHAR(100) NOT NULL,
|
||||
user_email VARCHAR(255) NOT NULL,
|
||||
service_type VARCHAR(50) NOT NULL,
|
||||
service_name VARCHAR(100) NOT NULL,
|
||||
source_language VARCHAR(50) NOT NULL,
|
||||
target_language VARCHAR(50) NOT NULL,
|
||||
duration INTEGER, -- 分钟
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'confirmed', 'in_progress', 'completed', 'cancelled')),
|
||||
priority VARCHAR(10) NOT NULL DEFAULT 'normal' CHECK (priority IN ('low', 'normal', 'high', 'urgent')),
|
||||
cost DECIMAL(10,2) NOT NULL,
|
||||
currency VARCHAR(3) NOT NULL DEFAULT 'CNY',
|
||||
scheduled_time TIMESTAMP WITH TIME ZONE,
|
||||
started_time TIMESTAMP WITH TIME ZONE,
|
||||
completed_time TIMESTAMP WITH TIME ZONE,
|
||||
interpreter_id UUID REFERENCES interpreters(id),
|
||||
interpreter_name VARCHAR(100),
|
||||
notes TEXT,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- 发票表
|
||||
CREATE TABLE IF NOT EXISTS invoices (
|
||||
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
|
||||
invoice_number VARCHAR(50) UNIQUE NOT NULL,
|
||||
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
user_name VARCHAR(100) NOT NULL,
|
||||
user_email VARCHAR(255) NOT NULL,
|
||||
order_id UUID REFERENCES orders(id),
|
||||
invoice_type VARCHAR(20) NOT NULL CHECK (invoice_type IN ('personal', 'company')),
|
||||
personal_name VARCHAR(100),
|
||||
company_name VARCHAR(200),
|
||||
tax_number VARCHAR(50),
|
||||
company_address TEXT,
|
||||
subtotal DECIMAL(10,2) NOT NULL,
|
||||
tax_amount DECIMAL(10,2) NOT NULL DEFAULT 0,
|
||||
total_amount DECIMAL(10,2) NOT NULL,
|
||||
currency VARCHAR(3) NOT NULL DEFAULT 'CNY',
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'issued', 'sent', 'paid', 'cancelled')),
|
||||
issue_date DATE,
|
||||
due_date DATE,
|
||||
paid_date DATE,
|
||||
items JSONB,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- 通话记录表
|
||||
CREATE TABLE IF NOT EXISTS calls (
|
||||
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
|
||||
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
interpreter_id UUID NOT NULL REFERENCES interpreters(id) ON DELETE CASCADE,
|
||||
service_type VARCHAR(50) NOT NULL,
|
||||
source_language VARCHAR(50) NOT NULL,
|
||||
target_language VARCHAR(50) NOT NULL,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'active', 'completed', 'cancelled')),
|
||||
duration INTEGER DEFAULT 0, -- 秒
|
||||
cost DECIMAL(10,2) DEFAULT 0,
|
||||
currency VARCHAR(3) NOT NULL DEFAULT 'CNY',
|
||||
quality_rating INTEGER CHECK (quality_rating >= 1 AND quality_rating <= 5),
|
||||
started_at TIMESTAMP WITH TIME ZONE,
|
||||
ended_at TIMESTAMP WITH TIME ZONE,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- 文档翻译表
|
||||
CREATE TABLE IF NOT EXISTS documents (
|
||||
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
|
||||
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
filename VARCHAR(255) NOT NULL,
|
||||
original_name VARCHAR(255) NOT NULL,
|
||||
file_size BIGINT NOT NULL,
|
||||
file_type VARCHAR(50) NOT NULL,
|
||||
source_language VARCHAR(50) NOT NULL,
|
||||
target_language VARCHAR(50) NOT NULL,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'processing', 'completed', 'failed')),
|
||||
progress INTEGER DEFAULT 0 CHECK (progress >= 0 AND progress <= 100),
|
||||
cost DECIMAL(10,2) NOT NULL,
|
||||
currency VARCHAR(3) NOT NULL DEFAULT 'CNY',
|
||||
translated_file_url TEXT,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- 系统设置表
|
||||
CREATE TABLE IF NOT EXISTS system_settings (
|
||||
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
|
||||
key VARCHAR(100) UNIQUE NOT NULL,
|
||||
value TEXT NOT NULL,
|
||||
description TEXT,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- 创建索引
|
||||
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
|
||||
CREATE INDEX IF NOT EXISTS idx_users_user_type ON users(user_type);
|
||||
CREATE INDEX IF NOT EXISTS idx_users_enterprise_id ON users(enterprise_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_orders_user_id ON orders(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_orders_status ON orders(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_orders_created_at ON orders(created_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_invoices_user_id ON invoices(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_invoices_order_id ON invoices(order_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_calls_user_id ON calls(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_calls_interpreter_id ON calls(interpreter_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_documents_user_id ON documents(user_id);
|
||||
|
||||
-- 创建更新时间触发器函数
|
||||
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.updated_at = NOW();
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ language 'plpgsql';
|
||||
|
||||
-- 为所有表添加更新时间触发器
|
||||
CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users
|
||||
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||
|
||||
CREATE TRIGGER update_enterprises_updated_at BEFORE UPDATE ON enterprises
|
||||
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||
|
||||
CREATE TRIGGER update_enterprise_contracts_updated_at BEFORE UPDATE ON enterprise_contracts
|
||||
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||
|
||||
CREATE TRIGGER update_enterprise_bills_updated_at BEFORE UPDATE ON enterprise_bills
|
||||
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||
|
||||
CREATE TRIGGER update_orders_updated_at BEFORE UPDATE ON orders
|
||||
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||
|
||||
CREATE TRIGGER update_invoices_updated_at BEFORE UPDATE ON invoices
|
||||
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||
|
||||
CREATE TRIGGER update_interpreters_updated_at BEFORE UPDATE ON interpreters
|
||||
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||
|
||||
CREATE TRIGGER update_calls_updated_at BEFORE UPDATE ON calls
|
||||
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||
|
||||
CREATE TRIGGER update_documents_updated_at BEFORE UPDATE ON documents
|
||||
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||
|
||||
CREATE TRIGGER update_system_settings_updated_at BEFORE UPDATE ON system_settings
|
||||
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||
|
||||
-- 启用行级安全策略 (RLS)
|
||||
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE enterprises ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE enterprise_contracts ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE enterprise_bills ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE invoices ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE interpreters ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE calls ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE documents ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE system_settings ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- 创建基本的RLS策略(管理员可以访问所有数据)
|
||||
CREATE POLICY "管理员可以访问所有用户数据" ON users
|
||||
FOR ALL USING (
|
||||
EXISTS (
|
||||
SELECT 1 FROM users WHERE id = auth.uid() AND user_type = 'admin'
|
||||
)
|
||||
);
|
||||
|
||||
CREATE POLICY "用户可以访问自己的数据" ON users
|
||||
FOR ALL USING (id = auth.uid());
|
||||
|
||||
-- 为其他表创建类似的策略
|
||||
CREATE POLICY "管理员可以访问所有企业数据" ON enterprises
|
||||
FOR ALL USING (
|
||||
EXISTS (
|
||||
SELECT 1 FROM users WHERE id = auth.uid() AND user_type = 'admin'
|
||||
)
|
||||
);
|
||||
|
||||
CREATE POLICY "管理员可以访问所有订单数据" ON orders
|
||||
FOR ALL USING (
|
||||
EXISTS (
|
||||
SELECT 1 FROM users WHERE id = auth.uid() AND user_type = 'admin'
|
||||
)
|
||||
);
|
||||
|
||||
CREATE POLICY "用户可以访问自己的订单" ON orders
|
||||
FOR ALL USING (user_id = auth.uid());
|
||||
|
||||
-- 插入一些系统设置
|
||||
INSERT INTO system_settings (key, value, description) VALUES
|
||||
('app_name', '口译服务管理平台', '应用程序名称'),
|
||||
('app_version', '1.0.0', '应用程序版本'),
|
||||
('maintenance_mode', 'false', '维护模式开关'),
|
||||
('max_file_size', '10485760', '最大文件上传大小(字节)'),
|
||||
('supported_languages', '["中文", "英文", "日文", "韩文", "法文", "德文", "西班牙文", "俄文"]', '支持的语言列表'),
|
||||
('default_currency', 'CNY', '默认货币'),
|
||||
('tax_rate', '0.13', '税率')
|
||||
ON CONFLICT (key) DO NOTHING;
|
||||
Reference in New Issue
Block a user