feat: add candidate SQL table presets and script-building composable
This commit is contained in:
@@ -7,6 +7,7 @@ import { sources } from "../templates"
|
|||||||
import { Cache, Code, LANGUAGE, Status } from "../types"
|
import { Cache, Code, LANGUAGE, Status } from "../types"
|
||||||
import { atou, utoa } from "../utils"
|
import { atou, utoa } from "../utils"
|
||||||
import { isMobile } from "./breakpoints"
|
import { isMobile } from "./breakpoints"
|
||||||
|
import { buildSqlScript, resetSqlTableSelection } from "./sqlTable"
|
||||||
|
|
||||||
const defaultLanguage = "python"
|
const defaultLanguage = "python"
|
||||||
|
|
||||||
@@ -45,6 +46,7 @@ watch(
|
|||||||
code.value = cache.code[value].value
|
code.value = cache.code[value].value
|
||||||
output.value = ""
|
output.value = ""
|
||||||
status.value = Status.NotStarted
|
status.value = Status.NotStarted
|
||||||
|
if (value === "sql") resetSqlTableSelection()
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -116,8 +118,10 @@ export async function run() {
|
|||||||
} else {
|
} else {
|
||||||
output.value = ""
|
output.value = ""
|
||||||
status.value = Status.NotStarted
|
status.value = Status.NotStarted
|
||||||
|
const sourceCode =
|
||||||
|
code.language === "sql" ? buildSqlScript(cleanCode) : cleanCode
|
||||||
const result = await submit(
|
const result = await submit(
|
||||||
{ value: cleanCode, language: code.language },
|
{ value: sourceCode, language: code.language },
|
||||||
input.value.trim(),
|
input.value.trim(),
|
||||||
)
|
)
|
||||||
output.value = result.output || ""
|
output.value = result.output || ""
|
||||||
|
|||||||
15
src/composables/sqlTable.ts
Normal file
15
src/composables/sqlTable.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import { ref } from "vue"
|
||||||
|
import { defaultSqlTableId, sqlTables } from "../data/sqlTables"
|
||||||
|
|
||||||
|
export const selectedTableId = ref(defaultSqlTableId)
|
||||||
|
|
||||||
|
export function resetSqlTableSelection() {
|
||||||
|
selectedTableId.value = defaultSqlTableId
|
||||||
|
}
|
||||||
|
|
||||||
|
export function buildSqlScript(studentSql: string) {
|
||||||
|
const table =
|
||||||
|
sqlTables.find((item) => item.id === selectedTableId.value) ??
|
||||||
|
sqlTables[0]
|
||||||
|
return `${table.setupSql}\n\n${studentSql}\n\nSELECT * FROM ${table.tableName};`
|
||||||
|
}
|
||||||
86
src/data/sqlTables.ts
Normal file
86
src/data/sqlTables.ts
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
export interface SqlTablePreset {
|
||||||
|
id: string
|
||||||
|
label: string
|
||||||
|
description: string
|
||||||
|
tableName: string
|
||||||
|
setupSql: string
|
||||||
|
}
|
||||||
|
|
||||||
|
const studentsSetupSql = `CREATE TABLE students (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
name TEXT NOT NULL,
|
||||||
|
class TEXT NOT NULL,
|
||||||
|
score INTEGER NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO students (id, name, class, score) VALUES
|
||||||
|
(1, '张伟', '一班', 92),
|
||||||
|
(2, '王芳', '一班', 58),
|
||||||
|
(3, '李娜', '二班', 76),
|
||||||
|
(4, '刘洋', '二班', 45),
|
||||||
|
(5, '陈静', '一班', 88),
|
||||||
|
(6, '杨帆', '三班', 63),
|
||||||
|
(7, '赵敏', '二班', 39),
|
||||||
|
(8, '孙涛', '三班', 81);`
|
||||||
|
|
||||||
|
const employeesSetupSql = `CREATE TABLE employees (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
name TEXT NOT NULL,
|
||||||
|
department TEXT NOT NULL,
|
||||||
|
salary INTEGER NOT NULL,
|
||||||
|
hire_date TEXT NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO employees (id, name, department, salary, hire_date) VALUES
|
||||||
|
(1, '周明', '技术部', 12000, '2019-03-01'),
|
||||||
|
(2, '吴倩', '市场部', 8000, '2021-07-15'),
|
||||||
|
(3, '郑凯', '技术部', 15500, '2017-11-20'),
|
||||||
|
(4, '钱多多', '财务部', 9200, '2020-01-10'),
|
||||||
|
(5, '孙丽', '市场部', 7600, '2022-05-30'),
|
||||||
|
(6, '李强', '技术部', 10800, '2023-09-01'),
|
||||||
|
(7, '林小雨', '财务部', 8900, '2018-06-12'),
|
||||||
|
(8, '黄河', '市场部', 6800, '2024-02-18');`
|
||||||
|
|
||||||
|
const productsSetupSql = `CREATE TABLE products (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
name TEXT NOT NULL,
|
||||||
|
category TEXT NOT NULL,
|
||||||
|
price REAL NOT NULL,
|
||||||
|
stock INTEGER NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO products (id, name, category, price, stock) VALUES
|
||||||
|
(1, '无线鼠标', '电子产品', 59.9, 120),
|
||||||
|
(2, '机械键盘', '电子产品', 299.0, 45),
|
||||||
|
(3, '保温杯', '生活用品', 39.5, 0),
|
||||||
|
(4, '笔记本', '文具', 12.0, 300),
|
||||||
|
(5, '蓝牙耳机', '电子产品', 199.0, 0),
|
||||||
|
(6, '台灯', '生活用品', 89.0, 60),
|
||||||
|
(7, '钢笔', '文具', 25.0, 150),
|
||||||
|
(8, '充电宝', '电子产品', 129.0, 8);`
|
||||||
|
|
||||||
|
export const sqlTables: SqlTablePreset[] = [
|
||||||
|
{
|
||||||
|
id: "students",
|
||||||
|
label: "学生成绩表",
|
||||||
|
description: "适合练习按分数筛选、批量更新、删除不及格记录",
|
||||||
|
tableName: "students",
|
||||||
|
setupSql: studentsSetupSql,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "employees",
|
||||||
|
label: "员工工资表",
|
||||||
|
description: "适合练习按部门分组调薪、按入职日期筛选",
|
||||||
|
tableName: "employees",
|
||||||
|
setupSql: employeesSetupSql,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "products",
|
||||||
|
label: "商品库存表",
|
||||||
|
description: "适合练习新增商品、调整库存、下架缺货商品",
|
||||||
|
tableName: "products",
|
||||||
|
setupSql: productsSetupSql,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export const defaultSqlTableId = sqlTables[0].id
|
||||||
Reference in New Issue
Block a user