💩 脑测样式&逻辑代码

This commit is contained in:
目棃
2024-03-22 17:14:37 +08:00
parent 1405b544be
commit b5a81503a8
4 changed files with 121 additions and 31 deletions

View File

@@ -85,6 +85,9 @@ async function displayBox(
data.text = params.text ?? ""; data.text = params.text ?? "";
data.mode = params.mode ?? "confirm"; data.mode = params.mode ?? "confirm";
data.otcancel = params.otcancel ?? true; data.otcancel = params.otcancel ?? true;
if (params.mode === "input" && params.input) {
inputVal.value = params.input;
}
show.value = true; show.value = true;
// 等待确认框关闭返回关闭后的confirmVal // 等待确认框关闭返回关闭后的confirmVal
return await new Promise<string | boolean | undefined>((resolve) => { return await new Promise<string | boolean | undefined>((resolve) => {

View File

@@ -42,21 +42,30 @@
<img :src="card.forum.icon" :alt="card.forum.name" /> <img :src="card.forum.icon" :alt="card.forum.name" />
<span>{{ card.forum.name }}</span> <span>{{ card.forum.name }}</span>
</div> </div>
<!-- todo 需要测试 -->
<div v-if="props.selectMode" class="tpc-select">
<v-checkbox-btn v-model="selectedList" :value="props.modelValue.post.post_id" />
</div>
</v-card> </v-card>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { onBeforeMount, ref } from "vue"; import { computed, onBeforeMount, ref } from "vue";
import { createPost } from "../../utils/TGWindow"; import { createPost } from "../../utils/TGWindow";
import TpAvatar from "../post/tp-avatar.vue"; import TpAvatar from "../post/tp-avatar.vue";
interface TPostCardProps { interface TPostCardProps {
modelValue: TGApp.Plugins.Mys.Post.FullData; modelValue: TGApp.Plugins.Mys.Post.FullData;
selectMode?: boolean;
selected?: string[];
} }
const props = defineProps<TPostCardProps>(); const props = withDefaults(defineProps<TPostCardProps>(), {
selectMode: false,
});
const isAct = ref<boolean>(false); const isAct = ref<boolean>(false);
const card = ref<TGApp.Plugins.Mys.News.RenderCard>(); const card = ref<TGApp.Plugins.Mys.News.RenderCard>();
const selectedList = computed(() => props.selected);
onBeforeMount(() => { onBeforeMount(() => {
card.value = getPostCard(props.modelValue); card.value = getPostCard(props.modelValue);
@@ -224,6 +233,15 @@ function getPostCard(item: TGApp.Plugins.Mys.Post.FullData): TGApp.Plugins.Mys.N
color: var(--tgc-white-1); color: var(--tgc-white-1);
} }
.tpc-select {
position: absolute;
top: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
}
.tpc-forum img { .tpc-forum img {
width: 20px; width: 20px;
height: 20px; height: 20px;

View File

@@ -15,6 +15,7 @@
</template> </template>
</v-select> </v-select>
<v-btn <v-btn
:disabled="selectedMode"
size="small" size="small"
class="pc-btn" class="pc-btn"
icon="mdi-refresh" icon="mdi-refresh"
@@ -22,14 +23,25 @@
@click="freshUser()" @click="freshUser()"
/> />
<v-btn <v-btn
:disabled="selectedMode"
size="small" size="small"
class="pc-btn" class="pc-btn"
icon="mdi-import" icon="mdi-import"
@click="freshOther" @click="freshOther"
title="导入其他用户收藏" title="导入其他用户收藏"
/> />
<v-btn size="small" class="pc-btn" icon="mdi-pencil" @click="toEdit()" title="编辑收藏" /> <v-btn size="small" class="pc-btn" icon="mdi-pencil" @click="toSelect()" title="编辑收藏" />
<v-btn <v-btn
:disabled="selectedMode"
size="small"
v-if="curSelect !== '未分类'"
class="pc-btn"
icon="mdi-info"
@click="toEdit()"
title="编辑分类"
/>
<v-btn
:disabled="selectedMode"
size="small" size="small"
v-if="curSelect !== '未分类'" v-if="curSelect !== '未分类'"
class="pc-btn" class="pc-btn"
@@ -41,14 +53,13 @@
</div> </div>
<div class="pc-posts"> <div class="pc-posts">
<div v-for="item in getPageItems()" :key="item.post.post_id"> <div v-for="item in getPageItems()" :key="item.post.post_id">
<TPostCard :model-value="item" /> <TPostCard :model-value="item" :selected="selectedPost" :select-mode="selectedMode" />
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { storeToRefs } from "pinia"; import { storeToRefs } from "pinia";
import Database from "tauri-plugin-sql-api";
import { computed, onBeforeMount, onMounted, ref, watch } from "vue"; import { computed, onBeforeMount, onMounted, ref, watch } from "vue";
import showConfirm from "../../components/func/confirm"; import showConfirm from "../../components/func/confirm";
@@ -65,7 +76,6 @@ const loading = ref(false);
const loadingTitle = ref("加载中..."); const loadingTitle = ref("加载中...");
const loadingSub = ref(""); const loadingSub = ref("");
const userStore = storeToRefs(useUserStore()); const userStore = storeToRefs(useUserStore());
const db = ref<Database | undefined>(undefined);
const collections = ref<TGApp.Sqlite.UserCollection.UFCollection[]>([]); const collections = ref<TGApp.Sqlite.UserCollection.UFCollection[]>([]);
const selected = ref<TGApp.Sqlite.UserCollection.UFPost[]>([]); const selected = ref<TGApp.Sqlite.UserCollection.UFPost[]>([]);
@@ -77,6 +87,9 @@ const view = computed(() => {
return length.value > 5 ? 5 : length.value; return length.value > 5 ? 5 : length.value;
}); });
const selectedMode = ref<boolean>(false);
const selectedPost = ref<Array<string>>([]);
onBeforeMount(async () => { onBeforeMount(async () => {
if (!(await TGSqlite.checkTableExist("UFPost"))) { if (!(await TGSqlite.checkTableExist("UFPost"))) {
await TGSqlite.update(); await TGSqlite.update();
@@ -87,36 +100,98 @@ onBeforeMount(async () => {
} }
}); });
onMounted(async () => { onMounted(async () => await load());
async function load(): Promise<void> {
loadingTitle.value = "获取收藏帖子..."; loadingTitle.value = "获取收藏帖子...";
loading.value = true; loading.value = true;
db.value = await TGSqlite.getDB();
if (!db.value) {
showSnackbar({
text: "数据库未初始化",
color: "error",
});
loading.value = false;
return;
}
loadingTitle.value = "获取收藏合集..."; loadingTitle.value = "获取收藏合集...";
collections.value = await TSUserCollection.getCollectList(); collections.value = await TSUserCollection.getCollectList();
loadingTitle.value = "获取未分类帖子..."; loadingTitle.value = "获取未分类帖子...";
const postUnCollect = await TSUserCollection.getUnCollectPostList(); const postUnCollect = await TSUserCollection.getUnCollectPostList();
if (postUnCollect.length > 0) { if (postUnCollect.length > 0) {
selected.value = postUnCollect; selected.value = postUnCollect;
curSelect.value = "未分类";
} else { } else {
selected.value = await TSUserCollection.getCollectPostList(collections.value[0].title); selected.value = await TSUserCollection.getCollectPostList(collections.value[0].title);
curSelect.value = collections.value[0].title;
} }
page.value = 1; page.value = 1;
loading.value = false; loading.value = false;
}); }
function toEdit() { function toSelect() {
showSnackbar({ if (!selectedMode.value) {
text: "功能开发中", selectedMode.value = true;
color: "info", } else {
// todo
console.log(selectedPost.value);
}
}
async function toEdit(): Promise<void> {
const collect = collections.value.find((c) => c.title === curSelect.value);
if (collect === undefined) {
showSnackbar({
text: "未找到合集信息!",
color: "error",
});
return;
}
let cTc = await showConfirm({
title: "修改分类标题",
mode: "input",
text: "请输入分类标题",
input: collect.title,
}); });
if (typeof cTc !== "string") cTc = collect.title;
if (cTc === "未分类") {
showSnackbar({
text: "该名称为保留名称,不可用于作为分类名!",
color: "error",
});
return;
}
if (cTc !== collect.title && collections.value.find((c) => c.title === cTc)) {
showSnackbar({
text: "分类名称重复!",
color: "error",
});
return;
}
let cTd = await showConfirm({
title: "修改分类描述",
mode: "input",
text: "请输入分类描述",
input: collect.desc,
});
if (typeof cTd !== "string") cTd = collect.desc;
const cc = await showConfirm({
title: "确定修改?",
text: `[${cTc}] ${cTd}`,
});
if (!cc) {
showSnackbar({
text: "取消修改分类信息",
color: "cancel",
});
return;
}
loadingTitle.value = "正在修改分类信息...";
loading.value = true;
const check = await TSUserCollection.updateCollect(collect.title, cTc, cTd);
loading.value = false;
if (!check) {
showSnackbar({
text: "修改分类信息失败!",
color: "error",
});
return;
}
showSnackbar({
text: "成功修改分类信息!",
});
await load();
} }
async function deleteCollect(): Promise<void> { async function deleteCollect(): Promise<void> {
@@ -137,7 +212,7 @@ async function deleteCollect(): Promise<void> {
text: "删除成功", text: "删除成功",
color: "success", color: "success",
}); });
window.location.reload(); await load();
} else { } else {
showSnackbar({ showSnackbar({
text: "删除失败", text: "删除失败",
@@ -152,13 +227,6 @@ async function freshPost(select: string | null): Promise<void> {
curSelect.value = "未分类"; curSelect.value = "未分类";
return; return;
} }
if (!db.value) {
showSnackbar({
text: "数据库未初始化",
color: "error",
});
return;
}
loadingTitle.value = `获取合集 ${select}...`; loadingTitle.value = `获取合集 ${select}...`;
loading.value = true; loading.value = true;
if (select === "未分类") { if (select === "未分类") {
@@ -277,7 +345,6 @@ async function mergePosts(
posts: TGApp.Plugins.Mys.Post.FullData[], posts: TGApp.Plugins.Mys.Post.FullData[],
collect: string, collect: string,
): Promise<void> { ): Promise<void> {
if (!db.value) return;
const title = `用户收藏-${collect}`; const title = `用户收藏-${collect}`;
for (const post of posts) { for (const post of posts) {
loadingTitle.value = `收藏帖子 [${post.post.post_id}]...`; loadingTitle.value = `收藏帖子 [${post.post.post_id}]...`;

View File

@@ -37,13 +37,15 @@ declare namespace TGApp.Component.Confirm {
/** /**
* @description Confirm 参数 - input mode * @description Confirm 参数 - input mode
* @interface ParamsInput * @interface ParamsInput
* @since Beta v0.3.3 * @since Beta v0.4.5
* @extends ParamsBase * @extends ParamsBase
* @property {"input"} mode * @property {"input"} mode
* @property {string} input 可选的配置默认输入值
* @return ParamsInput * @return ParamsInput
*/ */
interface ParamsInput extends ParamsBase { interface ParamsInput extends ParamsBase {
mode: "input"; mode: "input";
input?: string;
} }
/** /**