From e41518fced7a9b4dbfdd595dff686fb8f2d2fe5b Mon Sep 17 00:00:00 2001
From: htfc786 <2721672639@qq.com>
Date: Mon, 7 Aug 2023 11:02:05 +0800
Subject: [PATCH 1/3] =?UTF-8?q?add:=20=E6=B7=BB=E5=8A=A0=E6=9A=82=E5=AD=98?=
=?UTF-8?q?sql=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/SqlEditor.vue | 33 ++++++++++++++++++++++++++---
src/core/saveCode.ts | 41 ++++++++++++++++++++++++++++++++++++
2 files changed, 71 insertions(+), 3 deletions(-)
create mode 100644 src/core/saveCode.ts
diff --git a/src/components/SqlEditor.vue b/src/components/SqlEditor.vue
index efb20cc..07b69ec 100644
--- a/src/components/SqlEditor.vue
+++ b/src/components/SqlEditor.vue
@@ -7,6 +7,7 @@
格式化
重置
+ 暂存代码
@@ -29,6 +30,13 @@ import { QueryExecResult } from "sql.js";
// eslint-disable-next-line no-undef
import IStandaloneCodeEditor = monaco.editor.IStandaloneCodeEditor;
import { message } from "ant-design-vue";
+import {
+ saveCode,
+ readCode,
+ deleteCode,
+ setIsSaveCode,
+ getIsSaveCode,
+} from "../core/saveCode";
(self as any).MonacoEnvironment = {
getWorker(_: any, label: any) {
@@ -54,13 +62,20 @@ const { level, onSubmit } = toRefs(props);
const inputEditor = ref();
const editorRef = ref();
const db = ref();
+const isSaveCode = ref(getIsSaveCode()); // 是否暂存代码
watchEffect(async () => {
// 初始化 / 更新默认 SQL
if (inputEditor.value) {
- toRaw(inputEditor.value).setValue(
- "-- 请在此处输入 SQL\n" + level.value.defaultSQL
- );
+ //尝试去ls中读出暂存的sql代码 ####
+ var rowCode;
+ if (isSaveCode.value) {
+ rowCode = readCode();
+ }
+ if (!rowCode) {
+ rowCode = "-- 请在此处输入 SQL\n" + level.value.defaultSQL;
+ }
+ toRaw(inputEditor.value).setValue(rowCode);
}
// 初始化 / 更新 DB
db.value = await initDB(level.value.initSQL);
@@ -99,6 +114,10 @@ const doSubmit = () => {
}
const inputStr = toRaw(inputEditor.value).getValue();
console.log("inputStr", inputStr);
+ // 把代码保存到ls ####
+ if (isSaveCode.value) {
+ saveCode(inputStr);
+ }
try {
const result = runSQL(db.value, inputStr);
const answerResult = runSQL(db.value, level.value.answer);
@@ -111,6 +130,14 @@ const doSubmit = () => {
}
};
+const saveCodeChange = () => {
+ setIsSaveCode(isSaveCode.value);
+ if (!isSaveCode.value) {
+ // 清除ls中的代码 ####
+ deleteCode();
+ }
+};
+
onMounted(async () => {
// 初始化代码编辑器
if (editorRef.value) {
diff --git a/src/core/saveCode.ts b/src/core/saveCode.ts
new file mode 100644
index 0000000..a36e331
--- /dev/null
+++ b/src/core/saveCode.ts
@@ -0,0 +1,41 @@
+const codeStorage = "saveCode";
+const isSaveCodeStorage = "isSaveCode";
+
+export const saveCode = (code: string) => {
+ // 保存代码
+ localStorage.setItem(codeStorage, code);
+};
+
+export const readCode = () => {
+ // 读取代码
+ return localStorage.getItem(codeStorage);
+};
+
+export const deleteCode = () => {
+ // 删除代码
+ localStorage.removeItem(codeStorage);
+};
+
+export const setIsSaveCode = (isSaveCode: boolean) => {
+ // 设置是否保存代码
+ if (isSaveCode) {
+ localStorage.setItem(isSaveCodeStorage, "true");
+ return;
+ }
+ localStorage.setItem(isSaveCodeStorage, "false");
+};
+
+export const getIsSaveCode = () => {
+ // 读取是否保存代码
+ if (localStorage.getItem(isSaveCodeStorage) == "true") {
+ return true;
+ } else if (localStorage.getItem(isSaveCodeStorage) == "false") {
+ return false;
+ }
+ return true; //因为默认是true,localStorage里没有的就是没有执行过更改状态的,所以没有执行过修改的一定是true(默认),所以返回true
+};
+
+export const deleteIsSaveCode = () => {
+ // 删除是否保存代码
+ localStorage.removeItem(isSaveCodeStorage);
+};
From dfea94399bf160879bba06a295049ca8340b1e28 Mon Sep 17 00:00:00 2001
From: htfc786 <2721672639@qq.com>
Date: Wed, 9 Aug 2023 14:50:08 +0800
Subject: [PATCH 2/3] =?UTF-8?q?update:=20localStorage=E5=AD=98=E5=82=A8?=
=?UTF-8?q?=E6=94=B9=E4=B8=BApinia=E7=89=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/SqlEditor.vue | 37 ++++++++++++++++++++------------
src/core/saveCode.ts | 41 ------------------------------------
src/core/saveCodeStore.ts | 16 ++++++++++++++
3 files changed, 40 insertions(+), 54 deletions(-)
delete mode 100644 src/core/saveCode.ts
create mode 100644 src/core/saveCodeStore.ts
diff --git a/src/components/SqlEditor.vue b/src/components/SqlEditor.vue
index 07b69ec..9b89e9d 100644
--- a/src/components/SqlEditor.vue
+++ b/src/components/SqlEditor.vue
@@ -30,13 +30,8 @@ import { QueryExecResult } from "sql.js";
// eslint-disable-next-line no-undef
import IStandaloneCodeEditor = monaco.editor.IStandaloneCodeEditor;
import { message } from "ant-design-vue";
-import {
- saveCode,
- readCode,
- deleteCode,
- setIsSaveCode,
- getIsSaveCode,
-} from "../core/saveCode";
+import { saveCodeStore } from "../core/saveCodeStore";
+import { storeToRefs } from "pinia";
(self as any).MonacoEnvironment = {
getWorker(_: any, label: any) {
@@ -62,20 +57,23 @@ const { level, onSubmit } = toRefs(props);
const inputEditor = ref();
const editorRef = ref();
const db = ref();
-const isSaveCode = ref(getIsSaveCode()); // 是否暂存代码
+const store = saveCodeStore();
+const isSaveCode = ref(storeToRefs(store).isSaveCode); // 是否暂存代码
+let isIntnCode = false; //是否已经初始化过代码
watchEffect(async () => {
// 初始化 / 更新默认 SQL
- if (inputEditor.value) {
+ if (inputEditor.value && !isIntnCode) {
//尝试去ls中读出暂存的sql代码 ####
var rowCode;
if (isSaveCode.value) {
- rowCode = readCode();
+ rowCode = store.saveCode;
}
if (!rowCode) {
rowCode = "-- 请在此处输入 SQL\n" + level.value.defaultSQL;
}
toRaw(inputEditor.value).setValue(rowCode);
+ isIntnCode = true;
}
// 初始化 / 更新 DB
db.value = await initDB(level.value.initSQL);
@@ -116,7 +114,7 @@ const doSubmit = () => {
console.log("inputStr", inputStr);
// 把代码保存到ls ####
if (isSaveCode.value) {
- saveCode(inputStr);
+ store.saveCode = inputStr;
}
try {
const result = runSQL(db.value, inputStr);
@@ -131,10 +129,14 @@ const doSubmit = () => {
};
const saveCodeChange = () => {
- setIsSaveCode(isSaveCode.value);
+ store.isSaveCode = isSaveCode.value;
if (!isSaveCode.value) {
// 清除ls中的代码 ####
- deleteCode();
+ store.saveCode = "";
+ } else if (isSaveCode.value && inputEditor.value) {
+ // 开启功能,保存代码
+ const inputStr = toRaw(inputEditor.value).getValue();
+ store.saveCode = inputStr;
}
};
@@ -153,6 +155,15 @@ onMounted(async () => {
enabled: false,
},
});
+
+ inputEditor.value.onDidChangeModelContent(() => {
+ // 自动保存代码
+ if (inputEditor.value) {
+ const inputStr = toRaw(inputEditor.value).getValue();
+ store.saveCode = inputStr;
+ }
+ });
+
// 自动保存草稿
// 暂不开启,刷新后恢复当前关卡的默认 SQL
// setInterval(() => {
diff --git a/src/core/saveCode.ts b/src/core/saveCode.ts
deleted file mode 100644
index a36e331..0000000
--- a/src/core/saveCode.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-const codeStorage = "saveCode";
-const isSaveCodeStorage = "isSaveCode";
-
-export const saveCode = (code: string) => {
- // 保存代码
- localStorage.setItem(codeStorage, code);
-};
-
-export const readCode = () => {
- // 读取代码
- return localStorage.getItem(codeStorage);
-};
-
-export const deleteCode = () => {
- // 删除代码
- localStorage.removeItem(codeStorage);
-};
-
-export const setIsSaveCode = (isSaveCode: boolean) => {
- // 设置是否保存代码
- if (isSaveCode) {
- localStorage.setItem(isSaveCodeStorage, "true");
- return;
- }
- localStorage.setItem(isSaveCodeStorage, "false");
-};
-
-export const getIsSaveCode = () => {
- // 读取是否保存代码
- if (localStorage.getItem(isSaveCodeStorage) == "true") {
- return true;
- } else if (localStorage.getItem(isSaveCodeStorage) == "false") {
- return false;
- }
- return true; //因为默认是true,localStorage里没有的就是没有执行过更改状态的,所以没有执行过修改的一定是true(默认),所以返回true
-};
-
-export const deleteIsSaveCode = () => {
- // 删除是否保存代码
- localStorage.removeItem(isSaveCodeStorage);
-};
diff --git a/src/core/saveCodeStore.ts b/src/core/saveCodeStore.ts
new file mode 100644
index 0000000..c995c93
--- /dev/null
+++ b/src/core/saveCodeStore.ts
@@ -0,0 +1,16 @@
+import { defineStore } from "pinia";
+
+export const saveCodeStore = defineStore("saveCode", {
+ state: () => {
+ //数据
+ return {
+ saveCode: "",
+ isSaveCode: true,
+ };
+ },
+ persist: {
+ //存储位置
+ key: "saveCode",
+ storage: window.localStorage,
+ },
+});
From 52217edaaf56db318a976f228430bcca6891554a Mon Sep 17 00:00:00 2001
From: htfc786 <2721672639@qq.com>
Date: Thu, 24 Aug 2023 20:22:34 +0800
Subject: [PATCH 3/3] =?UTF-8?q?update=20=E6=B7=BB=E5=8A=A0=E6=89=8B?=
=?UTF-8?q?=E5=8A=A8=E5=8A=A0=E8=BD=BD=E6=8C=89=E9=92=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/SqlEditor.vue | 83 ++++++++++++++++++++++++------------
src/core/saveCodeStore.ts | 1 +
src/pages/IndexPage.vue | 43 +++++++++++++++++++
3 files changed, 99 insertions(+), 28 deletions(-)
diff --git a/src/components/SqlEditor.vue b/src/components/SqlEditor.vue
index 9b89e9d..c332b6e 100644
--- a/src/components/SqlEditor.vue
+++ b/src/components/SqlEditor.vue
@@ -7,7 +7,7 @@
格式化
重置
- 暂存代码
+ 加载暂存代码
@@ -20,7 +20,7 @@ import {
ref,
toRaw,
toRefs,
- watchEffect,
+ watch,
} from "vue";
import * as monaco from "monaco-editor";
import { format } from "sql-formatter";
@@ -59,26 +59,30 @@ const editorRef = ref();
const db = ref();
const store = saveCodeStore();
const isSaveCode = ref(storeToRefs(store).isSaveCode); // 是否暂存代码
+const autoLoadCode = ref(storeToRefs(store).autoLoadCode); // 是否自动加载代码
+var canSaveCode = true;
-let isIntnCode = false; //是否已经初始化过代码
-watchEffect(async () => {
+watch(level, () => {
+ initLevel();
+});
+
+const initLevel = async () => {
// 初始化 / 更新默认 SQL
- if (inputEditor.value && !isIntnCode) {
- //尝试去ls中读出暂存的sql代码 ####
- var rowCode;
- if (isSaveCode.value) {
- rowCode = store.saveCode;
- }
- if (!rowCode) {
- rowCode = "-- 请在此处输入 SQL\n" + level.value.defaultSQL;
+ if (inputEditor.value) {
+ if (autoLoadCode.value) {
+ loadSaveCode();
+ } else {
+ canSaveCode = false;
+ toRaw(inputEditor.value).setValue(
+ "-- 请在此处输入 SQL\n" + level.value.defaultSQL
+ );
+ canSaveCode = true;
}
- toRaw(inputEditor.value).setValue(rowCode);
- isIntnCode = true;
}
// 初始化 / 更新 DB
db.value = await initDB(level.value.initSQL);
- doSubmit();
-});
+ runSQLCode(); // 初始化结果
+};
/**
* SQL 格式化
@@ -105,17 +109,29 @@ const doReset = () => {
/**
* 提交结果
+ * 只有提交结果才可以保存
*/
const doSubmit = () => {
if (!inputEditor.value) {
return;
}
const inputStr = toRaw(inputEditor.value).getValue();
- console.log("inputStr", inputStr);
// 把代码保存到ls ####
if (isSaveCode.value) {
store.saveCode = inputStr;
}
+ runSQLCode();
+};
+
+/**
+ * 执行sql代码
+ */
+const runSQLCode = () => {
+ if (!inputEditor.value) {
+ return;
+ }
+ const inputStr = toRaw(inputEditor.value).getValue();
+ console.log("inputStr", inputStr);
try {
const result = runSQL(db.value, inputStr);
const answerResult = runSQL(db.value, level.value.answer);
@@ -126,19 +142,25 @@ const doSubmit = () => {
// 向外层传递结果
onSubmit?.value(inputStr, [], [], error.message);
}
-};
+}
-const saveCodeChange = () => {
- store.isSaveCode = isSaveCode.value;
+const loadSaveCode = () => {
+ if (!inputEditor.value) {
+ return;
+ }
+ //尝试去ls中读出暂存的sql代码 ####
+ var rowCode;
if (!isSaveCode.value) {
- // 清除ls中的代码 ####
- store.saveCode = "";
- } else if (isSaveCode.value && inputEditor.value) {
- // 开启功能,保存代码
- const inputStr = toRaw(inputEditor.value).getValue();
- store.saveCode = inputStr;
+ message.error("当前功能已关闭,请自行开启");
+ return;
}
-};
+ rowCode = store.saveCode;
+ if (!rowCode) {
+ message.error("暂无暂存代码");
+ return;
+ }
+ toRaw(inputEditor.value).setValue(rowCode);
+}
onMounted(async () => {
// 初始化代码编辑器
@@ -156,10 +178,14 @@ onMounted(async () => {
},
});
+ // 加载题目
+ initLevel();
+
inputEditor.value.onDidChangeModelContent(() => {
// 自动保存代码
- if (inputEditor.value) {
+ if (isSaveCode.value && canSaveCode && inputEditor.value) {
const inputStr = toRaw(inputEditor.value).getValue();
+ console.log(inputStr)
store.saveCode = inputStr;
}
});
@@ -171,6 +197,7 @@ onMounted(async () => {
// localStorage.setItem("draft", toRaw(inputEditor.value).getValue());
// }
// }, 3000);
+
}
});
diff --git a/src/core/saveCodeStore.ts b/src/core/saveCodeStore.ts
index c995c93..cee1b60 100644
--- a/src/core/saveCodeStore.ts
+++ b/src/core/saveCodeStore.ts
@@ -6,6 +6,7 @@ export const saveCodeStore = defineStore("saveCode", {
return {
saveCode: "",
isSaveCode: true,
+ autoLoadCode: false,
};
},
persist: {
diff --git a/src/pages/IndexPage.vue b/src/pages/IndexPage.vue
index f764614..5d27684 100644
--- a/src/pages/IndexPage.vue
+++ b/src/pages/IndexPage.vue
@@ -42,6 +42,11 @@
+
+ 代码保存设置:
+
暂存代码
+
自动加载代码
+
@@ -54,6 +59,8 @@ import { QueryExecResult } from "sql.js";
import { allLevels, getLevelByKey } from "../levels";
import { checkResult } from "../core/result";
import CodeEditor from "../components/CodeEditor.vue";
+import { saveCodeStore } from "../core/saveCodeStore";
+import { storeToRefs } from "pinia";
interface IndexPageProps {
levelKey?: string;
@@ -73,6 +80,9 @@ const errorMsgRef = ref();
const resultStatus = ref(-1);
const defaultActiveKeys = ["result"];
const activeKeys = ref([...defaultActiveKeys]);
+const store = saveCodeStore();
+const isSaveCode = ref(storeToRefs(store).isSaveCode); // 是否暂存代码
+const autoLoadCode = ref(storeToRefs(store).autoLoadCode); // 是否自动加载代码
/**
* 切换关卡时,重置状态
@@ -99,10 +109,43 @@ const onSubmit = (
errorMsgRef.value = errorMsg;
resultStatus.value = checkResult(res, answerRes);
};
+
+const saveCodeChange = () => {
+ store.isSaveCode = isSaveCode.value;
+ if (!isSaveCode.value) {
+ // 清除ls中的代码 ####
+ store.saveCode = "";
+ }
+ // else if (isSaveCode.value && inputEditor.value) {
+ // //this.$refs.sqlEditor
+ // // 开启功能,保存代码
+ // const inputStr = toRaw(inputEditor.value).getValue();
+ // store.saveCode = inputStr;
+ // }
+};
+
+// 开启自动加载代码必须先开启暂存代码
+// 关闭暂存代码必须先关闭自动加载代码
+watch(isSaveCode, (newValue, oldValue) => {
+ if (!newValue) {
+ autoLoadCode.value = false;
+ }
+});
+watch(autoLoadCode, (newValue, oldValue) => {
+ if (newValue) {
+ isSaveCode.value = true;
+ }
+});