# 数据库初始化脚本

本目录包含用于初始化数据库的脚本，包括用户认证相关的表和微信用户表等。

## 用户表初始化

用户数据现在存储在PostgreSQL数据库中，表名为`users`。有两种方式可以初始化用户表：

### 1. 使用Python脚本

运行以下命令可以自动创建用户表和相关索引：

```bash
# 在项目根目录执行
python app/scripts/init_db.py
```

这将自动创建以下内容：
- 用户表结构
- 用户名索引

### 2. 使用SQL脚本

如果你想直接在PostgreSQL客户端中执行，可以使用提供的SQL脚本：

```bash
# 使用psql命令行工具执行
psql -U postgres -d dataops -f app/scripts/create_user_table.sql

# 或者直接在pgAdmin或其他PostgreSQL客户端中复制粘贴脚本内容执行
```

## 数据库连接配置

数据库连接配置在`app/core/system/auth.py`文件中的`get_pg_connection`函数中定义：

```python
pg_pool = psycopg2.pool.SimpleConnectionPool(
    1, 20,
    host="localhost",
    database="dataops",
    user="postgres",
    password="postgres",
    port="5432"
)
```

在生产环境中，建议将这些连接参数移至配置文件或环境变量中。

## 用户表结构

用户表（`users`）具有以下字段：

- `id` (VARCHAR(100)): 用户唯一标识符，主键
- `username` (VARCHAR(50)): 用户名，唯一非空
- `password` (VARCHAR(100)): 密码（使用base64编码），非空
- `created_at` (FLOAT): 创建时间戳，非空
- `last_login` (FLOAT): 最后登录时间戳
- `is_admin` (BOOLEAN): 是否为管理员，默认为false

## 用户数据迁移

如果您之前使用的是文件存储方式，可以使用以下命令将用户数据迁移到数据库：

```bash
python app/scripts/migrate_users.py
```

这个脚本会：
1. 读取`app/data/users.json`文件中的用户数据
2. 将数据导入到PostgreSQL数据库的`users`表中
3. 备份原始JSON文件

## 安全建议

在生产环境中，建议进行以下安全增强：

1. 使用更强的密码哈希算法（如bcrypt）替代base64编码
2. 将数据库连接参数存储在环境变量或安全的配置文件中
3. 为数据库用户设置最小权限原则
4. 启用PostgreSQL的SSL连接
5. 定期备份用户数据

## 微信用户表初始化

微信用户数据存储在PostgreSQL数据库中，表名为`wechat_users`。有以下几种方式可以初始化微信用户表：

### 1. 使用Flask应用上下文脚本（推荐）

运行以下命令可以在Flask应用上下文中创建微信用户表：

```bash
# 在项目根目录执行
python app/scripts/create_wechat_user_table.py --action create
```

检查表是否存在：

```bash
python app/scripts/create_wechat_user_table.py --action check
```

删除表（谨慎使用）：

```bash
python app/scripts/create_wechat_user_table.py --action drop
```

### 2. 使用PostgreSQL连接脚本

运行以下命令可以直接通过psycopg2连接数据库创建表：

```bash
# 在项目根目录执行
python app/scripts/migrate_wechat_users.py --action migrate
```

回滚表（删除表）：

```bash
python app/scripts/migrate_wechat_users.py --action rollback
```

### 3. 使用SQL脚本

如果你想直接在PostgreSQL客户端中执行，可以使用提供的SQL脚本：

```bash
# 使用psql命令行工具执行
psql -U postgres -d dataops -f database/create_wechat_users.sql

# 或者直接在pgAdmin或其他PostgreSQL客户端中复制粘贴脚本内容执行
```

## 微信用户表结构

微信用户表（`wechat_users`）具有以下字段：

- `id` (SERIAL): 主键ID，自增
- `wechat_code` (VARCHAR(255)): 微信授权码/openid，唯一标识，非空且唯一
- `phone_number` (VARCHAR(20)): 用户手机号码，可选
- `id_card_number` (VARCHAR(18)): 用户身份证号码，可选
- `login_status` (BOOLEAN): 当前登录状态，默认false，非空
- `login_time` (TIMESTAMP WITH TIME ZONE): 最后登录时间
- `user_status` (VARCHAR(20)): 用户账户状态，默认'active'，非空
  - `active`: 活跃
  - `inactive`: 非活跃
  - `suspended`: 暂停
  - `deleted`: 已删除
- `created_at` (TIMESTAMP WITH TIME ZONE): 账户创建时间，默认当前时间，非空
- `updated_at` (TIMESTAMP WITH TIME ZONE): 信息更新时间，默认当前时间，非空

## 微信用户表索引

为了提高查询性能，表包含以下索引：

- `idx_wechat_users_wechat_code`: 微信授权码索引
- `idx_wechat_users_phone_number`: 手机号码索引
- `idx_wechat_users_login_status`: 登录状态索引
- `idx_wechat_users_user_status`: 用户状态索引

## 微信用户表触发器

表包含自动更新`updated_at`字段的触发器，每次更新记录时会自动设置为当前时间。

## 微信用户功能使用

在代码中可以使用以下方式操作微信用户：

```python
from app.core.data_parse.calendar import (
    register_wechat_user, 
    login_wechat_user, 
    logout_wechat_user,
    get_wechat_user_info,
    update_wechat_user_info
)

# 注册用户
result = register_wechat_user("wx_openid_123", "13800138000", "110101199001011234")

# 用户登录
result = login_wechat_user("wx_openid_123")

# 用户登出
result = logout_wechat_user("wx_openid_123")

# 获取用户信息
result = get_wechat_user_info("wx_openid_123")

# 更新用户信息
result = update_wechat_user_info("wx_openid_123", {"phone_number": "13900139000"})
``` 