mirror of
https://github.com/Megghy/vtsuru.live.git
synced 2025-12-06 18:36:55 +08:00
412 lines
11 KiB
TypeScript
412 lines
11 KiB
TypeScript
import { useAccount } from '@/api/account'
|
|
import { QAInfo, ViolationTypes } from '@/api/api-models'
|
|
import { QueryGetAPI, QueryPostAPI } from '@/api/query'
|
|
import { ACCOUNT_API_URL, QUESTION_API_URL } from '@/data/constants'
|
|
import { List } from 'linqts'
|
|
import { useMessage } from 'naive-ui'
|
|
import { defineStore } from 'pinia'
|
|
import { computed, ref } from 'vue'
|
|
|
|
export type QATagInfo = {
|
|
name: string
|
|
createAt: number
|
|
visiable: boolean
|
|
}
|
|
//SENSITIVE_TERM, HATE, VIOLENCE, PORNOGRAPHY, POLITICS, ADVERTISING, AGGRESSION, EMOTIONAL
|
|
|
|
export const useQuestionBox = defineStore('QuestionBox', () => {
|
|
const isLoading = ref(false)
|
|
const isRepling = ref(false)
|
|
const isChangingPublic = ref(false)
|
|
|
|
const accountInfo = useAccount()
|
|
|
|
const recieveQuestions = ref<QAInfo[]>([])
|
|
const sendQuestions = ref<QAInfo[]>([])
|
|
const trashQuestions = ref<QAInfo[]>([])
|
|
const tags = ref<QATagInfo[]>([])
|
|
const reviewing = ref(0)
|
|
|
|
const onlyFavorite = ref(false)
|
|
const onlyPublic = ref(false)
|
|
const onlyUnread = ref(false)
|
|
|
|
const recieveQuestionsFiltered = computed(() => {
|
|
const result = recieveQuestions.value.filter((q) => {
|
|
/*if (q.id == displayQuestion.value?.id) {
|
|
return false
|
|
}*/
|
|
return (
|
|
(q.isFavorite || !onlyFavorite.value) &&
|
|
(q.isPublic || !onlyPublic.value) &&
|
|
(!q.isReaded || !onlyUnread.value) &&
|
|
(!displayTag.value || q.tag == displayTag.value)
|
|
)
|
|
})
|
|
return result
|
|
//displayQuestion排在最前面
|
|
//return displayQuestion.value ? [displayQuestion.value, ...result] : result
|
|
})
|
|
const currentQuestion = ref<QAInfo>()
|
|
const displayQuestion = ref<QAInfo>()
|
|
const displayTag = ref<string>()
|
|
|
|
let isRevieveGetted = false
|
|
//const isSendGetted = false
|
|
|
|
const message = window.$message
|
|
|
|
async function GetRecieveQAInfo() {
|
|
isLoading.value = true
|
|
await QueryGetAPI<{ questions: QAInfo[]; reviewCount: number }>(
|
|
QUESTION_API_URL + 'get-recieve'
|
|
)
|
|
.then((data) => {
|
|
if (data.code == 200) {
|
|
if (data.data.questions.length > 0) {
|
|
recieveQuestions.value = new List(data.data.questions)
|
|
.OrderBy((d) => d.isReaded)
|
|
//.ThenByDescending(d => d.isFavorite)
|
|
.Where(
|
|
(d) => !d.reviewResult || d.reviewResult.isApproved == true
|
|
) //只显示审核通过的
|
|
.ThenByDescending((d) => d.sendAt)
|
|
.ToArray()
|
|
reviewing.value = data.data.reviewCount
|
|
trashQuestions.value = data.data.questions.filter(
|
|
(d) => d.reviewResult && d.reviewResult.isApproved == false
|
|
)
|
|
|
|
const displayId =
|
|
accountInfo.value?.settings.questionDisplay.currentQuestion
|
|
if (displayId && displayQuestion.value?.id != displayId) {
|
|
displayQuestion.value = recieveQuestions.value.find(
|
|
(q) => q.id == displayId
|
|
)
|
|
}
|
|
}
|
|
//message.success('共收取 ' + data.data.length + ' 条提问')
|
|
isRevieveGetted = true
|
|
} else {
|
|
message.error(data.message)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
message.error('发生错误: ' + err)
|
|
})
|
|
.finally(() => {
|
|
isLoading.value = false
|
|
})
|
|
}
|
|
async function GetSendQAInfo() {
|
|
isLoading.value = true
|
|
await QueryGetAPI<QAInfo[]>(QUESTION_API_URL + 'get-send')
|
|
.then((data) => {
|
|
if (data.code == 200) {
|
|
sendQuestions.value = data.data
|
|
//message.success('共发送 ' + data.data.length + ' 条提问')
|
|
} else {
|
|
message.error(data.message)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
message.error('发生错误: ' + err)
|
|
})
|
|
.finally(() => {
|
|
isLoading.value = false
|
|
})
|
|
}
|
|
async function DelQA(id: number) {
|
|
await QueryGetAPI(QUESTION_API_URL + 'del', {
|
|
id: id
|
|
})
|
|
.then((data) => {
|
|
if (data.code == 200) {
|
|
message.success('删除成功')
|
|
recieveQuestions.value = recieveQuestions.value.filter(
|
|
(q) => q.id != id
|
|
)
|
|
} else {
|
|
message.error(data.message)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
message.error('发生错误: ' + err)
|
|
})
|
|
}
|
|
async function GetTags() {
|
|
isLoading.value = true
|
|
await QueryGetAPI<QATagInfo[]>(QUESTION_API_URL + 'get-tags', {
|
|
id: accountInfo.value?.id
|
|
})
|
|
.then((data) => {
|
|
if (data.code == 200) {
|
|
tags.value = data.data
|
|
} else {
|
|
message.error(data.message)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
message.error('发生错误: ' + err)
|
|
})
|
|
.finally(() => {
|
|
isLoading.value = false
|
|
})
|
|
}
|
|
function getViolationString(violation: ViolationTypes) {
|
|
//SENSITIVE_TERM, HATE, VIOLENCE, PORNOGRAPHY, POLITICS, ADVERTISING, AGGRESSION
|
|
switch (violation) {
|
|
case ViolationTypes.SENSITIVE_TERM:
|
|
return '敏感词'
|
|
case ViolationTypes.HATE:
|
|
return '辱骂'
|
|
case ViolationTypes.VIOLENCE:
|
|
return '暴力'
|
|
case ViolationTypes.PORNOGRAPHY:
|
|
return '色情'
|
|
case ViolationTypes.POLITICS:
|
|
return '政治'
|
|
case ViolationTypes.ADVERTISING:
|
|
return '广告'
|
|
case ViolationTypes.AGGRESSION:
|
|
return '攻击性'
|
|
}
|
|
}
|
|
async function addTag(tag: string) {
|
|
if (!tag) {
|
|
message.warning('请输入标签')
|
|
return
|
|
}
|
|
if (tags.value.find((t) => t.name == tag)) {
|
|
message.warning('标签已存在')
|
|
return
|
|
}
|
|
await QueryGetAPI(QUESTION_API_URL + 'add-tag', {
|
|
tag: tag
|
|
})
|
|
.then((data) => {
|
|
if (data.code == 200) {
|
|
message.success('添加成功')
|
|
GetTags()
|
|
} else {
|
|
message.error('添加失败: ' + data.message)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
message.error('添加失败: ' + err)
|
|
})
|
|
}
|
|
async function delTag(tag: string) {
|
|
if (!tag) {
|
|
message.warning('请输入标签')
|
|
return
|
|
}
|
|
if (!tags.value.find((t) => t.name == tag)) {
|
|
message.warning('标签不存在')
|
|
return
|
|
}
|
|
await QueryGetAPI(QUESTION_API_URL + 'del-tag', {
|
|
tag: tag
|
|
})
|
|
.then((data) => {
|
|
if (data.code == 200) {
|
|
message.success('删除成功')
|
|
GetTags()
|
|
} else {
|
|
message.error('删除失败: ' + data.message)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
message.error('删除失败: ' + err)
|
|
})
|
|
}
|
|
async function updateTagVisiable(tag: string, visiable: boolean) {
|
|
if (!tag) {
|
|
message.warning('请输入标签')
|
|
return
|
|
}
|
|
if (!tags.value.find((t) => t.name == tag)) {
|
|
message.warning('标签不存在')
|
|
return
|
|
}
|
|
await QueryGetAPI(QUESTION_API_URL + 'update-tag-visiable', {
|
|
tag: tag,
|
|
visiable: visiable
|
|
})
|
|
.then((data) => {
|
|
if (data.code == 200) {
|
|
message.success('修改成功')
|
|
GetTags()
|
|
} else {
|
|
message.error('修改失败: ' + data.message)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
message.error('修改失败: ' + err)
|
|
})
|
|
}
|
|
async function reply(id: number, msg: string) {
|
|
isRepling.value = true
|
|
await QueryPostAPI<QAInfo>(QUESTION_API_URL + 'reply', {
|
|
Id: id,
|
|
Message: msg
|
|
})
|
|
.then((data) => {
|
|
if (data.code == 200) {
|
|
const index = recieveQuestions.value.findIndex((q) => q.id == id)
|
|
if (index > -1) {
|
|
recieveQuestions.value[index] = data.data
|
|
}
|
|
message.success('回复成功')
|
|
currentQuestion.value = undefined
|
|
//replyModalVisiable.value = false
|
|
} else {
|
|
message.error('发送失败: ' + data.message)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
message.error('发送失败: ' + err)
|
|
})
|
|
.finally(() => {
|
|
isRepling.value = false
|
|
})
|
|
}
|
|
async function read(question: QAInfo, read: boolean) {
|
|
await QueryGetAPI(QUESTION_API_URL + 'read', {
|
|
id: question.id,
|
|
read: read ? 'true' : 'false'
|
|
})
|
|
.then((data) => {
|
|
if (data.code == 200) {
|
|
question.isReaded = read
|
|
if (read && displayQuestion.value?.id == question.id) {
|
|
setCurrentQuestion(question) //取消设为当前展示的问题
|
|
}
|
|
} else {
|
|
message.error('修改失败: ' + data.message)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
message.error('修改失败: ' + err)
|
|
})
|
|
}
|
|
async function favorite(question: QAInfo, fav: boolean) {
|
|
await QueryGetAPI(QUESTION_API_URL + 'favorite', {
|
|
id: question.id,
|
|
favorite: fav
|
|
})
|
|
.then((data) => {
|
|
if (data.code == 200) {
|
|
question.isFavorite = fav
|
|
} else {
|
|
message.error('修改失败: ' + data.message)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
message.error('修改失败: ' + err)
|
|
})
|
|
}
|
|
async function setPublic(pub: boolean) {
|
|
isChangingPublic.value = true
|
|
await QueryGetAPI(QUESTION_API_URL + 'public', {
|
|
id: currentQuestion.value?.id,
|
|
public: pub
|
|
})
|
|
.then((data) => {
|
|
if (data.code == 200) {
|
|
if (currentQuestion.value) currentQuestion.value.isPublic = pub
|
|
message.success('已修改公开状态')
|
|
} else {
|
|
message.error('修改失败: ' + data.message)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
message.error('修改失败: ' + err)
|
|
})
|
|
.finally(() => {
|
|
isChangingPublic.value = false
|
|
})
|
|
}
|
|
async function blacklist(question: QAInfo) {
|
|
await QueryGetAPI(ACCOUNT_API_URL + 'black-list/add', {
|
|
id: question.sender.id
|
|
})
|
|
.then(async (data) => {
|
|
if (data.code == 200) {
|
|
await QueryGetAPI(QUESTION_API_URL + 'del', {
|
|
id: question.id
|
|
}).then((data) => {
|
|
if (data.code == 200) {
|
|
message.success('已拉黑 ' + question.sender.name)
|
|
} else {
|
|
message.error('修改失败: ' + data.message)
|
|
}
|
|
})
|
|
} else {
|
|
message.error('拉黑失败: ' + data.message)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
message.error('拉黑失败: ' + err)
|
|
})
|
|
}
|
|
async function setCurrentQuestion(item: QAInfo | undefined) {
|
|
const isCurrent = displayQuestion.value?.id == item?.id
|
|
if (!isCurrent) {
|
|
displayQuestion.value = item
|
|
} else {
|
|
displayQuestion.value = undefined
|
|
}
|
|
try {
|
|
const data = await QueryGetAPI(
|
|
QUESTION_API_URL + 'set-current',
|
|
isCurrent || !item
|
|
? null
|
|
: {
|
|
id: item.id
|
|
}
|
|
)
|
|
if (data.code == 200) {
|
|
//message.success('设置成功')
|
|
} else {
|
|
message.error('设置失败: ' + data.message)
|
|
}
|
|
} catch (err) {
|
|
message.error('设置失败:' + err)
|
|
}
|
|
}
|
|
|
|
return {
|
|
currentQuestion,
|
|
isLoading,
|
|
isRevieveGetted,
|
|
isRepling,
|
|
isChangingPublic,
|
|
recieveQuestions,
|
|
recieveQuestionsFiltered,
|
|
sendQuestions,
|
|
trashQuestions,
|
|
reviewing,
|
|
tags,
|
|
onlyFavorite,
|
|
onlyPublic,
|
|
onlyUnread,
|
|
displayQuestion,
|
|
displayTag,
|
|
GetRecieveQAInfo,
|
|
GetSendQAInfo,
|
|
DelQA,
|
|
GetTags,
|
|
addTag,
|
|
delTag,
|
|
updateTagVisiable,
|
|
reply,
|
|
read,
|
|
favorite,
|
|
setPublic,
|
|
blacklist,
|
|
setCurrentQuestion,
|
|
getViolationString
|
|
}
|
|
})
|