开始补全后端与前端交互代码
This commit is contained in:
parent
1c72434102
commit
ec78c47b3d
@ -1 +1,31 @@
|
|||||||
Page({})
|
const app = getApp()
|
||||||
|
|
||||||
|
Page({
|
||||||
|
data: {
|
||||||
|
result: null,
|
||||||
|
fileName: '',
|
||||||
|
},
|
||||||
|
chooseFile() {
|
||||||
|
wx.chooseMessageFile({
|
||||||
|
count: 1,
|
||||||
|
type: 'file',
|
||||||
|
success: (res) => {
|
||||||
|
const file = res.tempFiles[0]
|
||||||
|
this.setData({ fileName: file.name })
|
||||||
|
wx.uploadFile({
|
||||||
|
url: `${app.globalData.baseUrl}/api/v1/entries/upload-file`,
|
||||||
|
filePath: file.path,
|
||||||
|
name: 'file',
|
||||||
|
header: { 'X-OpenID': app.globalData.openid || '' },
|
||||||
|
success: (uploadRes) => {
|
||||||
|
try {
|
||||||
|
this.setData({ result: JSON.parse(uploadRes.data) })
|
||||||
|
} catch (e) {
|
||||||
|
this.setData({ result: { total: 0, success: 0, failed: 0 } })
|
||||||
|
}
|
||||||
|
},
|
||||||
|
})
|
||||||
|
},
|
||||||
|
})
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|||||||
@ -1 +1,14 @@
|
|||||||
Page({})
|
const app = getApp()
|
||||||
|
|
||||||
|
Page({
|
||||||
|
data: {
|
||||||
|
stats: null,
|
||||||
|
},
|
||||||
|
onShow() {
|
||||||
|
wx.request({
|
||||||
|
url: `${app.globalData.baseUrl}/api/v1/checkin/stats`,
|
||||||
|
header: { 'X-OpenID': app.globalData.openid || '' },
|
||||||
|
success: (res) => this.setData({ stats: res.data }),
|
||||||
|
})
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|||||||
@ -1 +1,38 @@
|
|||||||
Page({})
|
const app = getApp()
|
||||||
|
|
||||||
|
Page({
|
||||||
|
data: {
|
||||||
|
entryType: 'word',
|
||||||
|
enText: '',
|
||||||
|
zhText: '',
|
||||||
|
exampleText: '',
|
||||||
|
},
|
||||||
|
goBack() {
|
||||||
|
wx.navigateBack()
|
||||||
|
},
|
||||||
|
onEnInput(e) {
|
||||||
|
this.setData({ enText: e.detail.value })
|
||||||
|
},
|
||||||
|
onZhInput(e) {
|
||||||
|
this.setData({ zhText: e.detail.value })
|
||||||
|
},
|
||||||
|
onExampleInput(e) {
|
||||||
|
this.setData({ exampleText: e.detail.value })
|
||||||
|
},
|
||||||
|
save() {
|
||||||
|
wx.request({
|
||||||
|
url: `${app.globalData.baseUrl}/api/v1/entries`,
|
||||||
|
method: 'POST',
|
||||||
|
header: { 'Content-Type': 'application/json', 'X-OpenID': app.globalData.openid || '' },
|
||||||
|
data: {
|
||||||
|
entry_type: this.data.entryType,
|
||||||
|
en_text: this.data.enText,
|
||||||
|
zh_text: this.data.zhText,
|
||||||
|
example_text: this.data.exampleText,
|
||||||
|
source_type: 'manual',
|
||||||
|
upload_date: new Date().toISOString().slice(0, 10),
|
||||||
|
},
|
||||||
|
success: () => wx.showToast({ title: '已保存', icon: 'success' }),
|
||||||
|
})
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|||||||
@ -1,4 +1,21 @@
|
|||||||
|
const app = getApp()
|
||||||
|
|
||||||
Page({
|
Page({
|
||||||
|
data: {
|
||||||
|
stats: { total_entries: 0, review_count: 0, mastered_count: 0, checkin_count: 0, review_records: 0 },
|
||||||
|
},
|
||||||
|
onShow() {
|
||||||
|
this.loadStats()
|
||||||
|
},
|
||||||
|
loadStats() {
|
||||||
|
wx.request({
|
||||||
|
url: `${app.globalData.baseUrl}/api/v1/home/stats`,
|
||||||
|
header: { 'X-OpenID': app.globalData.openid || '' },
|
||||||
|
success: (res) => {
|
||||||
|
if (res.data) this.setData({ stats: res.data })
|
||||||
|
},
|
||||||
|
})
|
||||||
|
},
|
||||||
goToReview() {
|
goToReview() {
|
||||||
wx.navigateTo({ url: '/pages/review-config/review-config' })
|
wx.navigateTo({ url: '/pages/review-config/review-config' })
|
||||||
},
|
},
|
||||||
|
|||||||
27
me/me.js
27
me/me.js
@ -5,13 +5,28 @@ Page({
|
|||||||
name: '',
|
name: '',
|
||||||
days: 0,
|
days: 0,
|
||||||
badges: 0,
|
badges: 0,
|
||||||
|
openid: '',
|
||||||
|
},
|
||||||
|
onShow() {
|
||||||
|
this.loadProfile()
|
||||||
|
},
|
||||||
|
loadProfile() {
|
||||||
|
wx.request({
|
||||||
|
url: `${app.globalData.baseUrl}/api/v1/auth/wx-login`,
|
||||||
|
method: 'POST',
|
||||||
|
data: { code: app.globalData.wxCode || 'dev-code' },
|
||||||
|
success: (res) => {
|
||||||
|
app.globalData.openid = res.data.openid
|
||||||
|
this.setData({ openid: res.data.openid, name: '考研搭子' })
|
||||||
|
},
|
||||||
|
})
|
||||||
|
wx.request({
|
||||||
|
url: `${app.globalData.baseUrl}/api/v1/achievements`,
|
||||||
|
header: { 'X-OpenID': app.globalData.openid || '' },
|
||||||
|
success: (res) => {
|
||||||
|
const badges = (res.data || []).filter((i) => i.is_unlocked).length
|
||||||
|
this.setData({ badges })
|
||||||
},
|
},
|
||||||
onLoad() {
|
|
||||||
const { userInfo } = app.globalData
|
|
||||||
this.setData({
|
|
||||||
name: userInfo.name,
|
|
||||||
days: userInfo.days,
|
|
||||||
badges: userInfo.badges,
|
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
goTo(e) {
|
goTo(e) {
|
||||||
|
|||||||
@ -1 +1,23 @@
|
|||||||
Page({})
|
const app = getApp()
|
||||||
|
|
||||||
|
Page({
|
||||||
|
data: {
|
||||||
|
reviewList: [],
|
||||||
|
masteredList: [],
|
||||||
|
},
|
||||||
|
onShow() {
|
||||||
|
this.loadData()
|
||||||
|
},
|
||||||
|
loadData() {
|
||||||
|
wx.request({
|
||||||
|
url: `${app.globalData.baseUrl}/api/v1/progress/review`,
|
||||||
|
header: { 'X-OpenID': app.globalData.openid || '' },
|
||||||
|
success: (res) => this.setData({ reviewList: res.data || [] }),
|
||||||
|
})
|
||||||
|
wx.request({
|
||||||
|
url: `${app.globalData.baseUrl}/api/v1/progress/mastered`,
|
||||||
|
header: { 'X-OpenID': app.globalData.openid || '' },
|
||||||
|
success: (res) => this.setData({ masteredList: res.data || [] }),
|
||||||
|
})
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|||||||
@ -2,7 +2,7 @@ const app = getApp()
|
|||||||
|
|
||||||
Page({
|
Page({
|
||||||
data: {
|
data: {
|
||||||
timeRanges: ['今日', '本周', '自定义区间'],
|
timeRanges: ['今日', '本周', '本月', '自定义区间'],
|
||||||
activeTimeRange: 0,
|
activeTimeRange: 0,
|
||||||
contentTypes: ['单词', '句子'],
|
contentTypes: ['单词', '句子'],
|
||||||
activeContentType: 0,
|
activeContentType: 0,
|
||||||
@ -52,19 +52,39 @@ Page({
|
|||||||
this.persistPatch({ shuffle })
|
this.persistPatch({ shuffle })
|
||||||
},
|
},
|
||||||
onQuestionCountInput(e) {
|
onQuestionCountInput(e) {
|
||||||
const questionCount = e.detail.value
|
const questionCount = Number(e.detail.value || 0)
|
||||||
this.setData({ questionCount })
|
this.setData({ questionCount })
|
||||||
this.persistPatch({ questionCount })
|
this.persistPatch({ questionCount })
|
||||||
},
|
},
|
||||||
startReview() {
|
startReview() {
|
||||||
app.globalData.reviewSession = {
|
const scopeTypeMap = ['today', 'week', 'month', 'custom']
|
||||||
deck: [],
|
const contentTypeMap = ['word', 'sentence']
|
||||||
currentIndex: 0,
|
const questionModeMap = ['A', 'B', 'C']
|
||||||
correctCount: 0,
|
const scope_type = scopeTypeMap[this.data.activeTimeRange]
|
||||||
wrongCount: 0,
|
const content_type = contentTypeMap[this.data.activeContentType]
|
||||||
completed: false,
|
const question_mode = questionModeMap[this.data.activeMode]
|
||||||
currentAnswer: '',
|
const today = new Date()
|
||||||
}
|
const yyyy = today.getFullYear()
|
||||||
|
const mm = String(today.getMonth() + 1).padStart(2, '0')
|
||||||
|
const dd = String(today.getDate()).padStart(2, '0')
|
||||||
|
const scope_config = scope_type === 'custom' ? { start_date: `${yyyy}-${mm}-${dd}`, end_date: `${yyyy}-${mm}-${dd}` } : {}
|
||||||
|
wx.request({
|
||||||
|
url: `${app.globalData.baseUrl}/api/v1/review/generate`,
|
||||||
|
method: 'POST',
|
||||||
|
header: { 'Content-Type': 'application/json', 'X-OpenID': app.globalData.openid || '' },
|
||||||
|
data: {
|
||||||
|
scope_type,
|
||||||
|
scope_config,
|
||||||
|
content_type,
|
||||||
|
question_mode,
|
||||||
|
review_strategy: this.data.onlyReview ? 'review_only' : 'all',
|
||||||
|
sort_mode: this.data.shuffle ? 'shuffle' : 'sequential',
|
||||||
|
total_count: this.data.questionCount,
|
||||||
|
},
|
||||||
|
success: (res) => {
|
||||||
|
app.globalData.reviewSessionMeta = res.data
|
||||||
wx.navigateTo({ url: '/pages/review-session/review-session' })
|
wx.navigateTo({ url: '/pages/review-session/review-session' })
|
||||||
},
|
},
|
||||||
|
})
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,13 +1,5 @@
|
|||||||
const app = getApp()
|
const app = getApp()
|
||||||
|
|
||||||
const deckTemplate = [
|
|
||||||
{ word: 'prosperity', meaning: 'n. 繁荣, 兴旺', answer: 'pe' },
|
|
||||||
{ word: 'sustainable', meaning: 'adj. 可持续的', answer: 'sus' },
|
|
||||||
{ word: 'acquire', meaning: 'v. 获取, 获得', answer: 'ac' },
|
|
||||||
{ word: 'abstract', meaning: 'adj. 抽象的', answer: 'ab' },
|
|
||||||
{ word: 'benevolent', meaning: 'adj. 仁慈的', answer: 'be' },
|
|
||||||
]
|
|
||||||
|
|
||||||
Page({
|
Page({
|
||||||
data: {
|
data: {
|
||||||
progress: 0,
|
progress: 0,
|
||||||
@ -20,23 +12,25 @@ Page({
|
|||||||
showFeedback: false,
|
showFeedback: false,
|
||||||
completed: false,
|
completed: false,
|
||||||
masterHint: false,
|
masterHint: false,
|
||||||
|
questions: [],
|
||||||
},
|
},
|
||||||
onLoad() {
|
onLoad() {
|
||||||
if (!app.globalData.reviewSession.deck.length) {
|
this.loadQuestions()
|
||||||
const { questionCount, shuffle } = app.globalData.reviewPlan
|
},
|
||||||
let deck = deckTemplate.slice(0, Math.max(1, Math.min(questionCount, deckTemplate.length)))
|
loadQuestions() {
|
||||||
if (shuffle) deck = deck.slice().sort(() => Math.random() - 0.5)
|
const session = app.globalData.reviewSessionMeta
|
||||||
app.globalData.reviewSession = {
|
if (!session) return
|
||||||
deck,
|
wx.request({
|
||||||
currentIndex: 0,
|
url: `${app.globalData.baseUrl}/api/v1/review/questions?session_id=${session.id}`,
|
||||||
correctCount: 0,
|
header: { 'X-OpenID': app.globalData.openid || '' },
|
||||||
wrongCount: 0,
|
success: (res) => {
|
||||||
completed: false,
|
const questions = res.data || []
|
||||||
currentAnswer: '',
|
app.globalData.reviewSession = { deck: questions, currentIndex: 0, correctCount: 0, wrongCount: 0, completed: false, currentAnswer: '' }
|
||||||
}
|
this.setData({ questions })
|
||||||
}
|
|
||||||
this.syncSession()
|
this.syncSession()
|
||||||
},
|
},
|
||||||
|
})
|
||||||
|
},
|
||||||
syncSession() {
|
syncSession() {
|
||||||
const session = app.globalData.reviewSession
|
const session = app.globalData.reviewSession
|
||||||
const current = session.deck[session.currentIndex]
|
const current = session.deck[session.currentIndex]
|
||||||
@ -45,8 +39,8 @@ Page({
|
|||||||
progress: Math.round((session.currentIndex / total) * 100),
|
progress: Math.round((session.currentIndex / total) * 100),
|
||||||
current: session.currentIndex + 1,
|
current: session.currentIndex + 1,
|
||||||
total,
|
total,
|
||||||
word: current?.word || '',
|
word: current?.prompt || '',
|
||||||
meaning: current?.meaning || '',
|
meaning: current?.answer_hint || '',
|
||||||
answer: session.currentAnswer || '',
|
answer: session.currentAnswer || '',
|
||||||
feedback: '',
|
feedback: '',
|
||||||
showFeedback: false,
|
showFeedback: false,
|
||||||
@ -63,20 +57,38 @@ Page({
|
|||||||
const session = app.globalData.reviewSession
|
const session = app.globalData.reviewSession
|
||||||
const current = session.deck[session.currentIndex]
|
const current = session.deck[session.currentIndex]
|
||||||
if (!current) return
|
if (!current) return
|
||||||
const correct = (this.data.answer || '').trim().toLowerCase() === current.answer.toLowerCase()
|
wx.request({
|
||||||
session.correctCount += correct ? 1 : 0
|
url: `${app.globalData.baseUrl}/api/v1/review/submit`,
|
||||||
session.wrongCount += correct ? 0 : 1
|
method: 'POST',
|
||||||
|
header: { 'Content-Type': 'application/json', 'X-OpenID': app.globalData.openid || '' },
|
||||||
|
data: {
|
||||||
|
session_id: app.globalData.reviewSessionMeta.id,
|
||||||
|
entry_id: current.entry_id,
|
||||||
|
question_mode: current.question_mode,
|
||||||
|
user_answer: this.data.answer,
|
||||||
|
},
|
||||||
|
success: (res) => {
|
||||||
|
const result = res.data || {}
|
||||||
|
session.correctCount += result.is_correct ? 1 : 0
|
||||||
|
session.wrongCount += result.is_correct ? 0 : 1
|
||||||
this.setData({
|
this.setData({
|
||||||
feedback: correct ? '回答正确' : `正确答案:${current.answer}`,
|
feedback: result.is_correct ? '回答正确' : `正确答案:${result.correct_answer}`,
|
||||||
showFeedback: true,
|
showFeedback: true,
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
})
|
||||||
|
},
|
||||||
nextQuestion() {
|
nextQuestion() {
|
||||||
const session = app.globalData.reviewSession
|
const session = app.globalData.reviewSession
|
||||||
if (!session.deck.length) return
|
if (!session.deck.length) return
|
||||||
if (session.currentIndex >= session.deck.length - 1) {
|
if (session.currentIndex >= session.deck.length - 1) {
|
||||||
session.completed = true
|
session.completed = true
|
||||||
wx.navigateTo({ url: '/pages/review-result/review-result' })
|
wx.request({
|
||||||
|
url: `${app.globalData.baseUrl}/api/v1/review/finish?session_id=${app.globalData.reviewSessionMeta.id}`,
|
||||||
|
method: 'POST',
|
||||||
|
header: { 'X-OpenID': app.globalData.openid || '' },
|
||||||
|
success: () => wx.navigateTo({ url: '/pages/review-result/review-result' }),
|
||||||
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
session.currentIndex += 1
|
session.currentIndex += 1
|
||||||
|
|||||||
@ -1 +1,26 @@
|
|||||||
Page({})
|
const app = getApp()
|
||||||
|
|
||||||
|
Page({
|
||||||
|
data: {
|
||||||
|
settings: null,
|
||||||
|
},
|
||||||
|
onShow() {
|
||||||
|
wx.request({
|
||||||
|
url: `${app.globalData.baseUrl}/api/v1/settings`,
|
||||||
|
header: { 'X-OpenID': app.globalData.openid || '' },
|
||||||
|
success: (res) => {
|
||||||
|
this.setData({ settings: res.data })
|
||||||
|
},
|
||||||
|
})
|
||||||
|
},
|
||||||
|
save() {
|
||||||
|
const settings = this.data.settings || {}
|
||||||
|
wx.request({
|
||||||
|
url: `${app.globalData.baseUrl}/api/v1/settings`,
|
||||||
|
method: 'PUT',
|
||||||
|
header: { 'Content-Type': 'application/json', 'X-OpenID': app.globalData.openid || '' },
|
||||||
|
data: settings,
|
||||||
|
success: () => wx.showToast({ title: '已保存', icon: 'success' }),
|
||||||
|
})
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|||||||
@ -1 +1,31 @@
|
|||||||
Page({})
|
const app = getApp()
|
||||||
|
|
||||||
|
Page({
|
||||||
|
data: {
|
||||||
|
list: [],
|
||||||
|
},
|
||||||
|
onShow() {
|
||||||
|
this.loadList()
|
||||||
|
},
|
||||||
|
loadList() {
|
||||||
|
wx.request({
|
||||||
|
url: `${app.globalData.baseUrl}/api/v1/entries`,
|
||||||
|
header: { 'X-OpenID': app.globalData.openid || '' },
|
||||||
|
success: (res) => {
|
||||||
|
this.setData({ list: res.data || [] })
|
||||||
|
},
|
||||||
|
})
|
||||||
|
},
|
||||||
|
goAdd() {
|
||||||
|
wx.navigateTo({ url: '/pages/entry-edit/entry-edit' })
|
||||||
|
},
|
||||||
|
goBatch() {
|
||||||
|
wx.navigateTo({ url: '/pages/batch-upload/batch-upload' })
|
||||||
|
},
|
||||||
|
goProgress() {
|
||||||
|
wx.navigateTo({ url: '/pages/progress-list/progress-list' })
|
||||||
|
},
|
||||||
|
goSettings() {
|
||||||
|
wx.navigateTo({ url: '/pages/settings/settings' })
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user