PC-questions-answers/js/index.js
A1300399510 546c52aab6
2023-11-24 18:51:45 +08:00

1025 lines
34 KiB
JavaScript

Object.assign(window, Vue)
const forumApp = Vue.createApp({
setup() {
const baseURL = "https://ask.gter.net"
let type = ref('list') // list details
onMounted(() => {
getUserData()
getList()
getListClass()
window.addEventListener('scroll', handleScroll);
getHistoricalSearchList()
})
onUnmounted(() => {
window.removeEventListener('scroll', handleScroll);
});
// 我的 数据 数量
let myCount = ref({}) //
// 获取用户数据
const getUserData = () => {
$ajax("/api/user").then(res => {
console.log("res", res);
if (res.code != 200) return
let data = res.data
console.log(data, "data");
myCount.value = data.count
})
}
// 是否是搜索模式
let isSearchMode = ref(false)
// 获取历史记录方法
const getHistoricalSearchList = () => {
const list = localStorage.getItem('historical-Search');
if (list) historicalSearchList.value = JSON.parse(list) || []
else historicalSearchList.value = []
}
// 存入历史记录 随便去重 和 限制长度 方法
const setHistoricalSearchList = () => {
historicalSearchList.value.unshift(keyword.value)
historicalSearchList.value = [...new Set(historicalSearchList.value)]
historicalSearchList.value = historicalSearchList.value.slice(0, 10)
localStorage.setItem('historical-Search', JSON.stringify(historicalSearchList.value));
}
// 搜索点击事件
const searchClick = () => {
if (keyword.value == "") return
setHistoricalSearchList()
page = 1
list.value = []
type.value = 'list'
pitchIndex.value = null
getList()
}
// 搜索获取焦点
const searchFocus = () => {
if (historicalSearchList.value.length == 0) return
historicalSearchState.value = true
}
// 搜索失去焦点
const searchBlur = () => {
setTimeout(() => historicalSearchState.value = false, 100)
}
// 点击历史记录 item
const handleClickHistoricalItem = (value) => {
keyword.value = value
searchClick()
}
// 点击清除搜索
const handleClickClear = () => {
keyword.value = ""
page = 1
list.value = []
type.value = 'list'
pitchIndex.value = null
getList()
}
let historicalSearchState = ref(false) // 历史记录弹窗状态
let historicalSearchList = ref([]) // 历史记录数据
let tabListFixeState = ref(false) // 顶部 类型的 固定状态
const handleScroll = () => {
const scrollTop = document.documentElement.scrollTop || document.body.scrollTop
const scrollHeight = document.documentElement.scrollHeight;
const clientHeight = document.documentElement.clientHeight;
// 列表下 滑动到底部 获取新数据
if (scrollTop + clientHeight >= scrollHeight) getList()
// 列表下 滚动到顶部 触发类型的固定状态
if (scrollTop > 115 && type.value == 'list') tabListFixeState.value = true
else tabListFixeState.value = false
}
let keyword = ref('') // 搜索的值
let list = ref([]) // 列表数据
let page = 1
let total = ref(0) // 回答总数
let loading = false
// 获取列表数据
const getList = () => {
if (page == 0 || loading) return
loading = true
$ajax("/api/lists",
{
page,
limit: 20,
keyword: keyword.value,
// type: 'all',
}
).then(res => {
if (res.code != 200) return
let data = res.data
list.value = list.value.concat(data.data || [])
total.value = data.count || 0
if (list.value.length != data['count']) page++
else page = 0
if (keyword.value) isSearchMode.value = true
else isSearchMode.value = false
}).finally(() => loading = false)
}
let typeList = ref([])
let typePitch = ref('')
// 获取分类数据 列表分类
const getListClass = () => {
$ajax("/api/common/typeList").then(res => {
if (res.code != 200) return
let data = res.data
console.log(data, "data");
data = [{
id: "all",
name: "All",
}, {
id: "all2",
name: "All",
}, {
id: "all3",
name: "All",
}, {
id: "all4",
name: "All",
}, {
id: "all5",
name: "All",
}, {
id: "all6",
name: "All",
}]
typeList.value = data
typePitch.value = data[0].id
getPageHeight()
})
}
let pageHeaderHeight = ref(0) // 头部的高度
let pageListHeight = ref(0) // 底部列表的高度
const getPageHeight = () => {
let pageHeader = document.querySelector("#pageHeader")
// let pageHeader = document.querySelector("#pageHeader")
pageHeaderHeight.value = pageHeader.clientHeight + 10
pageListHeight.value = window.innerHeight - pageHeaderHeight.value
}
let detailsInfo = ref({}) // 详情信息
let detailsIsanswered = ref(0) // 详情信息
let detailsIscollection = ref(0) // 详情信息
let detailsIsmyself = ref(0) // 详情信息
let detailsToken = '' // 详情信息
let detailShare = ref({}) // 详情信息
// 获取详情
const getDetails = (uniqid, index) => {
uniqid = "fubm5CnD05qj" // 标记一下
$ajax("/api/details", { uniqid }).then(res => {
if (res.code != 200) return
let data = res.data
console.log("data", data);
detailsInfo.value = data['info'] || {}
detailsIsanswered.value = data['isanswered'] || 0
detailsIscollection.value = data['iscollection'] || 0
detailsIsmyself.value = data['ismyself'] || 0
detailsToken = data['token'] || ''
detailShare.value = data['share'] || {}
type.value = 'details'
cut(index)
getAnswerList()
})
}
let answerList = ref([]) // 回答列表数据
// 获取详情的回答数据
const getAnswerList = () => {
$ajax("/api/details/answerList", { token: detailsToken }).then(res => {
if (res.code != 200) return
let data = res.data
data.data.forEach(element => {
element['commentList'] = []
})
// commentList
answerList.value = data.data
})
}
// 操作 - 点赞
const operateLike = (token, index) => {
$ajax("/api/operate/like", { token }).then(res => {
if (res.code != 200) return
let data = res.data
answerList.value[index]['islike'] = data['status']
answerList.value[index]['likenum'] = data['count']
})
}
let isNeedNewColletData = false // 是否需要获取新的收藏数据 ,顶部的我的弹窗需要
// 操作 - 收藏
const operateCollect = (token = detailsToken, index) => {
$ajax("/api/operate/collect", { token }).then(res => {
if (res.code != 200) return
let data = res.data
isNeedNewColletData = true
myCollectionPage = 1
myCollectionList.value = []
if (data['type'] == 'askquestioncollection') detailsIscollection.value = data['status']
else {
answerList.value[index]['iscollection'] = data['status']
answerList.value[index]['collectionnum'] = data['count']
}
})
}
// 操作 - 回答
const operateIAnswer = (token = detailsToken, index) => {
$ajax("/api/publish/answerSubmit", { token }).then(res => {
console.log("res", res);
})
}
let IAnswerState = ref(false) // 我来回答-弹窗的状态
let IAnswerEditState = ref(false) // 编辑回答-弹窗的状态
let IAnswerInfo = ref({}) // 我来回答-弹窗的信息
// 开启我来回答
const openIAnswer = (index, type) => {
if (index == null) {
IAnswerInfo.value = {
title: detailsInfo.value['title'],
content: detailsInfo.value['content'],
anonymous: 0,
}
IAnswerState.value = true
nextTick(() => {
handleInput()
})
} else {
// IAnswerInfo.value = answerList.value[index]
if (type == 'my') {
IAnswerInfo.value = {
title: detailsInfo.value['title'],
...myAnswerList.value[index],
text: myAnswerList.value[index]['content'],
content: detailsInfo.value['content'],
}
myType.value = ""
} else {
IAnswerInfo.value = {
title: detailsInfo.value['title'],
...answerList.value[index],
text: answerList.value[index]['content'],
content: detailsInfo.value['content'],
}
}
IAnswerEditState.value = true
}
}
// 关闭我来回答
const closeIAnswer = () => {
IAnswerState.value = false
IAnswerEditState.value = false
}
// 修改我来回答的匿名状态
const amendIAnswer = () => {
IAnswerInfo.value['anonymous'] = IAnswerInfo.value['anonymous'] == 0 ? 1 : 0
}
let isNeedNewAnswersData = false // 是否需要获取新的我的回答数据
// 提交回答
const submitAnswer = () => {
const questionTextarea = document.querySelector(".question-textarea")
IAnswerInfo.value['text'] = questionTextarea.innerHTML
$ajax("/api/publish/answerSubmit", {
token: IAnswerInfo.value['token'] || detailsToken,
anonymous: IAnswerInfo.value['anonymous'] || 0,
content: IAnswerInfo.value['text'],
}).then(res => {
console.log(res);
if (res.code == 200) {
getAnswerList()
closeIAnswer()
isNeedNewAnswersData = true
} else {
}
})
}
// 打开回答的评论
const openCommentState = index => {
if (answerList.value[index]['commentState']) answerList.value[index]['commentState'] = false
else answerList.value[index]['commentState'] = true
if (answerList.value[index]['commentList'].length == 0 && answerList.value[index]['commentnum'] != 0) getAnswerCommentList(index)
// answerList.value[index]['commentState'] = true
}
let answerCommentLimit = 3
// 获取回答评论的数据
const getAnswerCommentList = (index) => {
getAnswerCommentPublic(index).then(res => {
let data = res.data
answerList.value[index]['commentList'] = answerList.value[index]['commentList'].concat(data.data)
answerList.value[index]['commentCount'] = data['count']
})
}
// 获取全部评论
const handleAllComment = index => {
answerCommentLimit = 1000
getAnswerCommentPublic(index).then(res => {
if (res.code != 200) return
let data = res.data
answerList.value[index]['commentList'] = answerList.value[index]['commentList'].concat(data.data.slice(3))
})
}
// 获取评论数据的公共接口
const getAnswerCommentPublic = (index) => {
return new Promise((resolve, reject) => {
$ajax("/api/comment/lists", {
token: answerList.value[index]['token'],
limit: answerCommentLimit,
}).then(res => {
if (res.code != 200) return
resolve(res)
})
})
}
// 提交回答-评论
const submitAnswerComments = (index, ind, i) => {
// answerList.value[index]['commentState'] = true
const targetAnswerList = [...answerList.value]
let content = ""
let parentid = null
let token = targetAnswerList[index]['token']
if (i != null) {
content = targetAnswerList[index]['commentList'][ind]['child'][i]['commentInput']
parentid = targetAnswerList[index]['commentList'][ind]['child'][i]['id']
} else if (ind != null) {
content = targetAnswerList[index]['commentList'][ind]['commentInput']
parentid = targetAnswerList[index]['commentList'][ind]['id']
} else content = targetAnswerList[index]['commentInput']
$ajax("/api/comment/submit", {
content,
token,
parentid,
}).then(res => {
console.log("res", res);
if (res.code != 200) return
let data = res.data
if (i != null) {
let targetData = {
content,
isauthor: 1,
islike: 0,
likenum: 0,
reply: {
nickname: targetAnswerList[index]['commentList'][ind]['child'][i]['nickname']
},
...data,
}
targetAnswerList[index]['commentList'][ind]['child'].unshift(targetData)
} else if (ind != null) {
let targetData = {
content,
isauthor: 1,
islike: 0,
likenum: 0,
reply: [],
...data,
}
targetAnswerList[index]['commentList'][ind]['child'].unshift(targetData)
} else {
let targetData = {
content,
isauthor: 1,
islike: 0,
likenum: 0,
...data,
child: []
}
targetAnswerList[index]['commentList'].unshift(targetData)
}
closeAnswerCommentsChild()
console.log("targetAnswerList", targetAnswerList);
})
}
// 回答-评论 点赞 operateIAnswer
const operateAnswerCommentsLike = (token, index, ind, i) => {
$ajax("/api/comment/like", {
token,
}).then(res => {
console.log("res", res);
if (res.code != 200) return
let data = res.data
console.log("data", data);
const targetAnswerList = [...answerList.value]
if (i == null) {
targetAnswerList[index]['commentList'][ind]['islike'] = data['status']
targetAnswerList[index]['commentList'][ind]['likenum'] = data['likenum']
} else {
targetAnswerList[index]['commentList'][ind]['child'][i]['islike'] = data['status']
targetAnswerList[index]['commentList'][ind]['child'][i]['likenum'] = data['likenum']
}
answerList.value = targetAnswerList
})
}
// 打开 回答-评论 的子评论
const openAnswerCommentsChild = (index, ind, i) => {
console.log("");
closeAnswerCommentsChild()
if (i == null) {
answerList.value[index].commentList[ind]['childState'] = true
} else {
answerList.value[index].commentList[ind]['child'][i]['childState'] = true
}
}
// 关闭 回答-评论 的子评论
const closeAnswerCommentsChild = (index, ind, i) => {
const targetAnswerList = [...answerList.value]
targetAnswerList.forEach(element => {
if (element['commentList'] && element['commentList'].length != 0) {
element['commentList'].forEach(ele => {
ele['childState'] = false
if (ele['child'] && ele['child'].length != 0) {
ele['child'].forEach(el => {
el['childState'] = false
})
}
})
}
})
answerList.value = targetAnswerList
}
// 获取剩下的子评论
const alsoCommentsData = (index, ind) => {
const targetAnswerList = [...answerList.value]
const parentid = targetAnswerList[index]['commentList'][ind]['id']
const token = targetAnswerList[index]['commentList'][ind]['token']
$ajax("/api/comment/childrenList", {
token,
parentid,
limit: 20,
page: 1,
}).then(res => {
console.log("res", res);
if (res.code != 200) return
let data = res.data
targetAnswerList[index]['commentList'][ind]['child'] = targetAnswerList[index]['commentList'][ind]['child'].concat(data.data)
answerList.value = targetAnswerList
})
}
let myType = ref('') // collect answers questions
// 专门处理 我的 弹窗数据
const handleMy = (key) => {
// if ((key == 'collect' && isNeedNewColletData) || (key == 'collect' && myCollectionList.value.length == 0)) {
if (key == 'collect') {
myCollectionList.value = []
myCollectionPage = 1
getMyCollection()
return
} else if (key == 'answers') {
myAnswerList.value = []
myAnswerPage = 1
getMyAnswer()
return
} else if (key == 'questions') {
getMyQuestions()
return
}
myType.value = key
}
let myCollectionList = ref([]) // 我的收藏列表
let myCollectionCount = ref(0) // 我的收藏数量
let myCollectionPage = 1 // 我的收藏页数
// 获取我的收藏
const getMyCollection = () => {
if (myCollectionPage == 0) return
$ajax("/api/user/collect", {
limit: 20,
page: myCollectionPage,
}).then(res => {
if (res.code != 200) return
let data = res.data
myType.value = 'collect'
isNeedNewColletData = false
myCollectionList.value = myCollectionList.value.concat(data.data)
myCollectionCount.value = data.count
if (myCollectionList.value.length != data['count']) myCollectionPage++
else myCollectionPage = 0
})
}
// 取消收藏
const cancelCollection = (token, index) => {
$ajax("/api/user/deleteCollect", { token }).then(res => {
if (res.code == 200) {
myCollectionList.value.splice(index, 1)
myCollectionCount.value--
}
})
}
// 监听 我的收藏滚动到底部
const handleCollectionScroll = (e) => {
const el = e.target;
// 判断滚动到底部
if (el.scrollHeight - el.scrollTop !== el.clientHeight) return
getMyCollection()
}
let myAnswerList = ref([]) // 我的回答数据
let myAnswerCount = ref(0) // 我的回答数量
let myAnswerPage = 1
// 获取我的回答
const getMyAnswer = () => {
if (myAnswerPage == 0) return
$ajax("/api/user/answer", {
limit: 20,
page: myAnswerPage,
}).then(res => {
if (res.code != 200) return
let data = res.data
data.data.forEach(element => {
element['popupState'] = false
})
myAnswerList.value = myAnswerList.value.concat(data.data)
myAnswerCount.value = data.count
if (myAnswerList.value.length != data['count']) myAnswerPage++
else myAnswerPage = 0
console.log("myAnswerList", myAnswerList.value);
myType.value = 'answers'
isNeedNewAnswersData = false
})
}
const handleAnswersScroll = e => {
const el = e.target;
// 判断滚动到底部
if (el.scrollHeight - el.scrollTop !== el.clientHeight) return
getMyAnswer()
}
let answerIndexOld = null
// 切换 我的提问的公开匿名 弹窗状态
const cutAnswerPopupState = index => {
myAnswerList.value[index]['popupState'] = true
if (answerIndexOld == index) {
myAnswerList.value[index]['popupState'] = false
answerIndexOld = null
} else {
myAnswerList.value[index]['popupState'] = true
if (answerIndexOld != null) myAnswerList.value[answerIndexOld]['popupState'] = false
answerIndexOld = index
}
}
// 更改匿名状态
const changeAnonymous = (token, anonymous, index) => {
$ajax("/api/publish/changeAnonymous", { token, anonymous }).then(res => {
if (res.code != 200) return
let data = res.data
myAnswerList.value[index]['anonymous'] = anonymous
cutAnswerPopupState(index)
})
}
let myQuestionsList = ref([]) // 我的提问数据
let myQuestionsCount = ref(0) // 我的提问数量
// 获取我的提问
const getMyQuestions = () => {
$ajax("/api/user/questions").then(res => {
if (res.code != 200) return
let data = res.data
myQuestionsList.value = myQuestionsList.value.concat(data.data)
myQuestionsCount.value = data.count
myType.value = 'questions'
})
}
let questionsSetp = ref(0) // 提问的步骤
// 切换提问步骤
const cutQuestionsSetp = (value) => {
questionsSetp.value = value
}
let questionsTypeList = ref([]) // 提问的类型主题
let questionsObj = ref({ // 提问的内容
token: "",
title: "",
content: "",
tags: "",
tid: "",
anonymous: 0,
})
// 报 提问的初始化
const questionsInit = () => {
$ajax("/api/publish/questions").then(res => {
if (res.code != 200) return
let data = res.data
questionsObj.value['token'] = data['token']
questionsTypeList.value = data['typeList'] || []
cutQuestionsSetp(1)
})
}
// 选择提问主题
const choosingTheme = (id) => {
questionsObj.value.tid = id
cutQuestionsSetp(2)
}
// 切换匿名状态
const cutAnonymous = () => {
questionsObj.value.anonymous = questionsObj.value.anonymous == 0 ? 1 : 0
}
// 发布问题
const postingIssue = () => {
console.log("发布问题", questionsObj.value);
$ajax("/api/publish/questionsSubmit", questionsObj.value).then(res => {
console.log("res", res);
})
}
let pitchIndex = ref(null) // 选中的下标
const cut = index => {
// if (pitchIndex.value == null) type.value = type.value == 'list' ? 'details' : 'list'
pitchIndex.value = index
setTimeout(() => {
scrollLeftInMiddle()
}, 350)
}
// 滚动左边在中间
const scrollLeftInMiddle = () => {
// console.log(pitchIndex.value, "pitchIndex");
let list = document.querySelector(".list-box")
// console.log("list", list);
console.log(107 * pitchIndex.value, pageListHeight.value / 2);
list.scrollTo({
top: 128 * pitchIndex.value + 64 - 385,
behavior: 'smooth'
})
}
const listStyle = () => {
const newtype = type.value
let width = ""
let margin = ""
if (newtype == 'list') {
width = '1200px'
margin = '0 auto'
} else {
width = 'calc((100vw - 1200px) / 2 + 512px)'
margin = 'initial'
}
return {
width,
margin
}
}
const itemStyle = (index, content) => {
const newtype = type.value
// pitchIndex
// let itemHeight = content == "" ? 106 : 128
let obj = {}
if (newtype == 'list') {
let top = Math.floor(index / 2) * 128 + 'px'
obj['top'] = top
if (index % 2 == 0) obj['left'] = 0
else obj['left'] = 649 + 'px'
} else {
obj['top'] = index * 128 + 'px'
obj['left'] = 0
obj['width'] = '100%'
// obj['backgroundColor'] = '#fbfbfb'
obj['paddingLeft'] = 'calc((100vw - 1200px) / 2)'
}
return obj
};
// list-box
const listBoxStyle = () => {
const newtype = type.value
let obj = {}
if (newtype == 'list') {
obj['overflow'] = 'visible'
} else {
// obj['height'] = 'calc(100vh - ' + pageHeaderHeight.value + 'px)'
obj['height'] = pageListHeight.value + 'px'
}
return obj
}
const $ajax = (url, data) => {
url = url.indexOf('//') > -1 ? url : baseURL + url;
return new Promise(function (resolve, reject) {
axios.post(url, data, {
emulateJSON: true,
withCredentials: true,
headers: {
// authorization: "9l3vfdx6h5xhu2hbw4fv5ygbog1dhtly"
authorization: "194cdc367ed40c938f2eaaf1c6dfa5ff"
}
}).then(function (res) {
var data = null
try {
data = typeof res.data == 'string' ? JSON.parse(res.data) : res.data;
} catch (error) { }
resolve(data)
});
});
}
// 处理时间
const handleDate = (dateTimeStamp) => {
dateTimeStamp = dateTimeStamp ? dateTimeStamp : null;
var timestamp = new Date(dateTimeStamp)
timestamp = timestamp.getTime()
var minute = 1000 * 60;
var hour = minute * 60;
var day = hour * 24;
var now = new Date().getTime();
var diffValue = now - timestamp;
var result;
if (diffValue < 0) return;
var dayC = diffValue / day;
var hourC = diffValue / (hour + 1);
var minC = diffValue / minute;
if (dayC >= 7) {
let date = new Date(timestamp);
let Y = date.getFullYear() + '-';
let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
let D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' ';
let h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
let m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes());
result = "" + Y + M + D + h + m;
} else if (dayC >= 1) result = "" + Math.round(dayC) + "天前";
else if (hourC >= 1) result = "" + Math.round(hourC) + "小时前";
else if (minC >= 1) result = "" + Math.round(minC) + "分钟前";
else result = "刚刚";
return result;
}
// 问题的转发 弹窗状态
let questionsTransmitState = ref(false)
// 关闭转发状态
const closeTransmitState = () => {
answerList.value.forEach(element => {
element['transmitState'] = false
})
questionsTransmitState.value = !questionsTransmitState.value
}
// 开启和关闭回答的转发状态 type open close
const handleAnswerTransmitList = (Iindex, type) => {
// handleAnswerTransmitList
questionsTransmitState.value = false
answerList.value.forEach((element, index) => {
if (index != Iindex) element['transmitState'] = false
})
answerList.value[Iindex]['transmitState'] = !answerList.value[Iindex]['transmitState']
}
// 关闭详情模式
const closeDetailMode = () => {
type.value = 'list'
pitchIndex.value = null
}
const handleListScroll = (e) => {
const el = e.target;
// 判断滚动到底部
if (el.scrollHeight - el.scrollTop !== el.clientHeight) return
getList()
}
// 处理 回答弹窗的复制图片
const handlePaste = (event) => {
const items = (event.clipboardData || event.originalEvent.clipboardData).items;
for (const item of items) {
if (item.type.indexOf('image') === 0) {
const file = item.getAsFile();
const reader = new FileReader();
reader.onload = (e) => {
const img = new Image();
img.src = e.target.result;
const questionTextarea = document.querySelector(".question-textarea")
questionTextarea.appendChild(img);
handleInput()
// IAnswerInfo.value['text'] = questionTextarea.innerHTML
};
reader.readAsDataURL(file);
}
}
}
let questionPlaceholderState = ref(false)
const handleInput = (event) => {
// IAnswerInfo.value['text'] = event.target.innerHTML;
const questionTextarea = document.querySelector(".question-textarea")
const html = questionTextarea.innerHTML
if (html) questionPlaceholderState.value = false
else questionPlaceholderState.value = true
console.log("questionPlaceholderState", questionPlaceholderState);
}
return {
questionPlaceholderState,
handleInput,
handlePaste,
itemStyle,
listStyle,
listBoxStyle,
myType,
type,
pitchIndex,
cut,
list,
keyword,
getList,
total,
typeList,
typePitch,
getDetails,
detailsInfo,
detailsIsanswered,
detailsIscollection,
detailsIsmyself,
detailShare,
answerList,
operateLike,
operateCollect,
IAnswerState,
IAnswerEditState,
IAnswerInfo,
amendIAnswer,
openIAnswer,
closeIAnswer,
operateIAnswer,
submitAnswer,
openCommentState,
submitAnswerComments,
operateAnswerCommentsLike,
openAnswerCommentsChild,
closeAnswerCommentsChild,
alsoCommentsData,
handleAllComment,
myCollectionList,
myCollectionCount,
myQuestionsList,
myQuestionsCount,
myAnswerList,
myAnswerCount,
cutAnswerPopupState,
handleDate,
handleCollectionScroll,
handleAnswersScroll,
cancelCollection,
getMyCollection,
questionsSetp,
questionsObj,
cutAnonymous,
cutQuestionsSetp,
questionsTypeList,
postingIssue,
choosingTheme,
handleMy,
changeAnonymous,
pageHeaderHeight,
pageListHeight,
questionsTransmitState,
closeTransmitState,
handleAnswerTransmitList,
closeDetailMode,
tabListFixeState,
handleListScroll,
historicalSearchState,
historicalSearchList,
searchFocus,
searchBlur,
searchClick,
handleClickHistoricalItem,
handleClickClear,
isSearchMode,
questionsInit,
};
}
})
forumApp.mount("#answer-app"); //初始化