From 141ddbb059eee9293c08a4f03a001ad5f0fbdc3f Mon Sep 17 00:00:00 2001 From: "DESKTOP-V763RJ7\\Administrator" <835606593@qq.com> Date: Mon, 12 Jan 2026 15:19:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AC=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 19 +++ App.vue | 17 +++ config.js | 11 ++ index.html | 20 +++ main.js | 22 +++ manifest.json | 72 ++++++++++ pages.json | 51 +++++++ pages/index/index.vue | 296 +++++++++++++++++++++++++++++++++++++++ pages/login/login.vue | 194 +++++++++++++++++++++++++ pages/mine/mine.vue | 139 ++++++++++++++++++ static/logo.png | Bin 0 -> 4023 bytes uni.promisify.adaptor.js | 13 ++ uni.scss | 76 ++++++++++ utils/api.js | 118 ++++++++++++++++ utils/storage.js | 69 +++++++++ 15 files changed, 1117 insertions(+) create mode 100644 .gitignore create mode 100644 App.vue create mode 100644 config.js create mode 100644 index.html create mode 100644 main.js create mode 100644 manifest.json create mode 100644 pages.json create mode 100644 pages/index/index.vue create mode 100644 pages/login/login.vue create mode 100644 pages/mine/mine.vue create mode 100644 static/logo.png create mode 100644 uni.promisify.adaptor.js create mode 100644 uni.scss create mode 100644 utils/api.js create mode 100644 utils/storage.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..39972d2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +node_modules/ +unpackage/ +dist/ +.DS_Store +*.log +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +.idea/ +.vscode/ +*.local +.hbuilderx/ +.vite/ +.cache/ +temp/ +*.tmp +*.temp diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..8c2b732 --- /dev/null +++ b/App.vue @@ -0,0 +1,17 @@ + + + diff --git a/config.js b/config.js new file mode 100644 index 0000000..5806535 --- /dev/null +++ b/config.js @@ -0,0 +1,11 @@ +const config = { + baseUrl: 'http://127.0.0.1:8503', + api: { + login: '/gw/login', + getQuestion: '/user/get_question', + answerQuestion: '/user/answer_question' + }, + timeout: 30000 +} + +export default config diff --git a/index.html b/index.html new file mode 100644 index 0000000..b5d330d --- /dev/null +++ b/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + +
+ + + diff --git a/main.js b/main.js new file mode 100644 index 0000000..c1caf36 --- /dev/null +++ b/main.js @@ -0,0 +1,22 @@ +import App from './App' + +// #ifndef VUE3 +import Vue from 'vue' +import './uni.promisify.adaptor' +Vue.config.productionTip = false +App.mpType = 'app' +const app = new Vue({ + ...App +}) +app.$mount() +// #endif + +// #ifdef VUE3 +import { createSSRApp } from 'vue' +export function createApp() { + const app = createSSRApp(App) + return { + app + } +} +// #endif \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..4aff211 --- /dev/null +++ b/manifest.json @@ -0,0 +1,72 @@ +{ + "name" : "qgdzs", + "appid" : "", + "description" : "", + "versionName" : "1.0.0", + "versionCode" : "100", + "transformPx" : false, + /* 5+App特有相关 */ + "app-plus" : { + "usingComponents" : true, + "nvueStyleCompiler" : "uni-app", + "compilerVersion" : 3, + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + /* 模块配置 */ + "modules" : {}, + /* 应用发布信息 */ + "distribute" : { + /* android打包配置 */ + "android" : { + "permissions" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + /* ios打包配置 */ + "ios" : {}, + /* SDK配置 */ + "sdkConfigs" : {} + } + }, + /* 快应用特有相关 */ + "quickapp" : {}, + /* 小程序特有相关 */ + "mp-weixin" : { + "appid" : "", + "setting" : { + "urlCheck" : false + }, + "usingComponents" : true + }, + "mp-alipay" : { + "usingComponents" : true + }, + "mp-baidu" : { + "usingComponents" : true + }, + "mp-toutiao" : { + "usingComponents" : true + }, + "uniStatistics" : { + "enable" : false + }, + "vueVersion" : "3" +} diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..10beca0 --- /dev/null +++ b/pages.json @@ -0,0 +1,51 @@ +{ + "pages": [ + { + "path": "pages/index/index", + "style": { + "navigationBarTitleText": "首页" + } + }, + { + "path": "pages/mine/mine", + "style": { + "navigationBarTitleText": "我的" + } + }, + { + "path": "pages/login/login", + "style": { + "navigationBarTitleText": "登录", + "navigationStyle": "custom" + } + } + ], + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "qgdzs", + "navigationBarBackgroundColor": "#F8F8F8", + "backgroundColor": "#F8F8F8" + }, + "tabBar": { + "color": "#7A7E83", + "selectedColor": "#667eea", + "borderStyle": "black", + "backgroundColor": "#ffffff", + "fontSize": "14px", + "list": [ + { + "pagePath": "pages/index/index", + "iconPath": "", + "selectedIconPath": "", + "text": "首页" + }, + { + "pagePath": "pages/mine/mine", + "iconPath": "", + "selectedIconPath": "", + "text": "我的" + } + ] + }, + "uniIdRouter": {} +} diff --git a/pages/index/index.vue b/pages/index/index.vue new file mode 100644 index 0000000..0f7cd54 --- /dev/null +++ b/pages/index/index.vue @@ -0,0 +1,296 @@ + + + + + diff --git a/pages/login/login.vue b/pages/login/login.vue new file mode 100644 index 0000000..9c73f99 --- /dev/null +++ b/pages/login/login.vue @@ -0,0 +1,194 @@ + + + + + diff --git a/pages/mine/mine.vue b/pages/mine/mine.vue new file mode 100644 index 0000000..666afa3 --- /dev/null +++ b/pages/mine/mine.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/static/logo.png b/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b5771e209bb677e2ebd5ff766ad5ee11790f305a GIT binary patch literal 4023 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 SYs}WS&%*SCNx89m_ { + res.then((res) => { + if (!res) return resolve(res) + return res[0] ? reject(res[0]) : resolve(res[1]) + }); + }); + }, +}); \ No newline at end of file diff --git a/uni.scss b/uni.scss new file mode 100644 index 0000000..b9249e9 --- /dev/null +++ b/uni.scss @@ -0,0 +1,76 @@ +/** + * 这里是uni-app内置的常用样式变量 + * + * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 + * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App + * + */ + +/** + * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 + * + * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 + */ + +/* 颜色变量 */ + +/* 行为相关颜色 */ +$uni-color-primary: #007aff; +$uni-color-success: #4cd964; +$uni-color-warning: #f0ad4e; +$uni-color-error: #dd524d; + +/* 文字基本颜色 */ +$uni-text-color:#333;//基本色 +$uni-text-color-inverse:#fff;//反色 +$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 +$uni-text-color-placeholder: #808080; +$uni-text-color-disable:#c0c0c0; + +/* 背景颜色 */ +$uni-bg-color:#ffffff; +$uni-bg-color-grey:#f8f8f8; +$uni-bg-color-hover:#f1f1f1;//点击状态颜色 +$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 + +/* 边框颜色 */ +$uni-border-color:#c8c7cc; + +/* 尺寸变量 */ + +/* 文字尺寸 */ +$uni-font-size-sm:12px; +$uni-font-size-base:14px; +$uni-font-size-lg:16px; + +/* 图片尺寸 */ +$uni-img-size-sm:20px; +$uni-img-size-base:26px; +$uni-img-size-lg:40px; + +/* Border Radius */ +$uni-border-radius-sm: 2px; +$uni-border-radius-base: 3px; +$uni-border-radius-lg: 6px; +$uni-border-radius-circle: 50%; + +/* 水平间距 */ +$uni-spacing-row-sm: 5px; +$uni-spacing-row-base: 10px; +$uni-spacing-row-lg: 15px; + +/* 垂直间距 */ +$uni-spacing-col-sm: 4px; +$uni-spacing-col-base: 8px; +$uni-spacing-col-lg: 12px; + +/* 透明度 */ +$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 + +/* 文章场景相关 */ +$uni-color-title: #2C405A; // 文章标题颜色 +$uni-font-size-title:20px; +$uni-color-subtitle: #555555; // 二级标题颜色 +$uni-font-size-subtitle:26px; +$uni-color-paragraph: #3F536E; // 文章段落颜色 +$uni-font-size-paragraph:15px; diff --git a/utils/api.js b/utils/api.js new file mode 100644 index 0000000..b8d79b3 --- /dev/null +++ b/utils/api.js @@ -0,0 +1,118 @@ +import config from '../config.js' +import storage from './storage.js' + +const request = (options) => { + return new Promise((resolve, reject) => { + uni.request({ + url: config.baseUrl + options.url, + method: options.method || 'GET', + data: options.data || {}, + header: { + 'Content-Type': 'application/json', + 'Authorization': storage.getToken() ? `Bearer ${storage.getToken()}` : '', + ...options.header + }, + timeout: config.timeout, + success: (res) => { + const { statusCode, data } = res + + if (statusCode === 200) { + if (data.code === 0 || data.success === true) { + resolve(data) + } else { + uni.showToast({ + title: data.message || '请求失败', + icon: 'none' + }) + reject(data) + } + } else if (statusCode === 401) { + storage.removeToken() + storage.removeUserInfo() + uni.reLaunch({ + url: '/pages/login/login' + }) + reject(res) + } else { + uni.showToast({ + title: '网络错误', + icon: 'none' + }) + reject(res) + } + }, + fail: (err) => { + uni.showToast({ + title: '网络连接失败', + icon: 'none' + }) + reject(err) + } + }) + }) +} + +const api = { + login(phone, code) { + return request({ + url: config.api.login, + method: 'POST', + data: { + phone, + code + } + }) + }, + + getQuestion() { + return request({ + url: config.api.getQuestion, + method: 'POST' + }) + }, + + answerQuestion(sn, answer) { + return request({ + url: config.api.answerQuestion, + method: 'POST', + data: { + sn, + answer + } + }) + }, + + get(url, data = {}) { + return request({ + url, + method: 'GET', + data + }) + }, + + post(url, data = {}) { + return request({ + url, + method: 'POST', + data + }) + }, + + put(url, data = {}) { + return request({ + url, + method: 'PUT', + data + }) + }, + + delete(url, data = {}) { + return request({ + url, + method: 'DELETE', + data + }) + } +} + +export default api diff --git a/utils/storage.js b/utils/storage.js new file mode 100644 index 0000000..4ef40fb --- /dev/null +++ b/utils/storage.js @@ -0,0 +1,69 @@ +const TOKEN_KEY = 'access_token' +const USER_INFO_KEY = 'user_info' +const QUESTION_KEY = 'question' +const ANSWERED_QUESTIONS_KEY = 'answered_questions' + +const storage = { + setToken(token) { + uni.setStorageSync(TOKEN_KEY, token) + }, + + getToken() { + return uni.getStorageSync(TOKEN_KEY) || '' + }, + + removeToken() { + uni.removeStorageSync(TOKEN_KEY) + }, + + setUserInfo(userInfo) { + uni.setStorageSync(USER_INFO_KEY, userInfo) + }, + + getUserInfo() { + return uni.getStorageSync(USER_INFO_KEY) || null + }, + + removeUserInfo() { + uni.removeStorageSync(USER_INFO_KEY) + }, + + setQuestion(question) { + uni.setStorageSync(QUESTION_KEY, question) + }, + + getQuestion() { + return uni.getStorageSync(QUESTION_KEY) || null + }, + + removeQuestion() { + uni.removeStorageSync(QUESTION_KEY) + }, + + addAnsweredQuestion(sn) { + const answeredQuestions = this.getAnsweredQuestions() + if (!answeredQuestions.includes(sn)) { + answeredQuestions.push(sn) + uni.setStorageSync(ANSWERED_QUESTIONS_KEY, answeredQuestions) + } + }, + + getAnsweredQuestions() { + return uni.getStorageSync(ANSWERED_QUESTIONS_KEY) || [] + }, + + isQuestionAnswered(sn) { + const answeredQuestions = this.getAnsweredQuestions() + return answeredQuestions.includes(sn) + }, + + clearAnsweredQuestions() { + uni.removeStorageSync(ANSWERED_QUESTIONS_KEY) + }, + + clearAll() { + uni.clearStorageSync() + } +} + +export default storage