Browse Source

Merge branch 'wangyi/feature-20251026183100-deepmate王毅' into milestone-20251031-简版功能开发

lihuilin/feature-20251024095243-我的
Ethereal 4 weeks ago
parent
commit
54f823f3e7
  1. 2
      .hbuilderx/launch.json
  2. 0
      api/deepMate.js
  3. 68
      api/deepMate/deepMate.js
  4. 116
      api/start/login.js
  5. 42
      components/DeepMate.vue
  6. 8
      components/MarketOverview.vue
  7. 45
      components/footerBar.vue
  8. 167
      components/login-prompt.vue
  9. 8
      main.js
  10. 13
      manifest.json
  11. 271
      package-lock.json
  12. 7
      package.json
  13. 108
      pages.json
  14. 23
      pages/blank/blank.vue
  15. 1648
      pages/deepMate/deepMate.vue
  16. 64
      pages/home/deepExploration.vue
  17. 26
      pages/home/home.vue
  18. 1023
      pages/start/Registration/Registration.vue
  19. 1341
      pages/start/Registration/list.js
  20. 13
      pages/start/agreement/agreement.vue
  21. 56
      pages/start/index/index.vue
  22. 1341
      pages/start/login/list.js
  23. 1160
      pages/start/login/login.vue
  24. 69
      pages/start/login/verification.js
  25. 13
      pages/start/privacy/privacy.vue
  26. 1012
      pages/start/recoverPassword/recoverPassword.vue
  27. 170
      pages/start/select/select.vue
  28. 64
      pages/start/startup/startup.vue
  29. 138
      server/login.json
  30. BIN
      static/flag/ad.png
  31. BIN
      static/flag/ae.png
  32. BIN
      static/flag/af.png
  33. BIN
      static/flag/ag.png
  34. BIN
      static/flag/ai.png
  35. BIN
      static/flag/al.png
  36. BIN
      static/flag/am.png
  37. BIN
      static/flag/an.png
  38. BIN
      static/flag/ao.png
  39. BIN
      static/flag/aq.png
  40. BIN
      static/flag/ar.png
  41. BIN
      static/flag/as.png
  42. BIN
      static/flag/at.png
  43. BIN
      static/flag/au.png
  44. BIN
      static/flag/aw.png
  45. BIN
      static/flag/ax.png
  46. BIN
      static/flag/az.png
  47. BIN
      static/flag/ba.png
  48. BIN
      static/flag/bb.png
  49. BIN
      static/flag/bd.png
  50. BIN
      static/flag/be.png
  51. BIN
      static/flag/bf.png
  52. BIN
      static/flag/bg.png
  53. BIN
      static/flag/bh.png
  54. BIN
      static/flag/bi.png
  55. BIN
      static/flag/bj.png
  56. BIN
      static/flag/bl.png
  57. BIN
      static/flag/bm.png
  58. BIN
      static/flag/bn.png
  59. BIN
      static/flag/bo.png
  60. BIN
      static/flag/bq.png
  61. BIN
      static/flag/br.png
  62. BIN
      static/flag/bs.png
  63. BIN
      static/flag/bt.png
  64. BIN
      static/flag/bv.png
  65. BIN
      static/flag/bw.png
  66. BIN
      static/flag/by.png
  67. BIN
      static/flag/bz.png
  68. BIN
      static/flag/ca.png
  69. BIN
      static/flag/cc.png
  70. BIN
      static/flag/cd.png
  71. BIN
      static/flag/cf.png
  72. BIN
      static/flag/cg.png
  73. BIN
      static/flag/ch.png
  74. BIN
      static/flag/ci.png
  75. BIN
      static/flag/ck.png
  76. BIN
      static/flag/cl.png
  77. BIN
      static/flag/cm.png
  78. BIN
      static/flag/cn.png
  79. BIN
      static/flag/co.png
  80. BIN
      static/flag/cr.png
  81. BIN
      static/flag/cu.png
  82. BIN
      static/flag/cv.png
  83. BIN
      static/flag/cw.png
  84. BIN
      static/flag/cx.png
  85. BIN
      static/flag/cy.png
  86. BIN
      static/flag/cz.png
  87. BIN
      static/flag/de.png
  88. BIN
      static/flag/dj.png
  89. BIN
      static/flag/dk.png
  90. BIN
      static/flag/dm.png
  91. BIN
      static/flag/do.png
  92. BIN
      static/flag/dz.png
  93. BIN
      static/flag/ec.png
  94. BIN
      static/flag/ee.png
  95. BIN
      static/flag/eg.png
  96. BIN
      static/flag/eh.png
  97. BIN
      static/flag/er.png
  98. BIN
      static/flag/es.png
  99. BIN
      static/flag/et.png
  100. BIN
      static/flag/eu.png

2
.hbuilderx/launch.json

@ -5,6 +5,8 @@
"customPlaygroundType" : "device",
"playground" : "standard",
"type" : "uni-app:app-android"
// "playground" : "standard",
// "type" : "uni-app:app-ios"
}
]
}

0
api/deepMate.js

68
api/deepMate/deepMate.js

@ -0,0 +1,68 @@
import { http } from '../../utils/http'
export const getData = () => {
return http({
method: 'GET',
url: '/ka',
})
}
/**
* 意图识别
* POST /api/deepMate/dmFirst
* headers: token, content-type: application/json, contentType: application/json, version, client
* body: { content, language, marketList }
*/
export const postIntent = (data) => {
return http({
method: 'POST',
url: '/api/deepMate/dmFirst',
data
})
}
/**
* 获取股票信息
* headers: token, content-type: application/json, contentType: application/json, version, client
* body: { language, token, recordId, parentId, stockId }
*/
export const postStock = (data) => {
return http({
method: 'POST',
url: '/api/coze/decodingSecond',
data
})
}
/**
* 获取历史记录
*/
export const postHistory = (data) => {
return http({
method: 'POST',
url: '/api/deepMate/dmList',
data
})
}
/**
* 历史记录详情
*/
export const postHistoryDetail = (data) => {
return http({
method: 'POST',
url: '/api/deepMate/clickRecord',
data
})
}

116
api/start/login.js

@ -0,0 +1,116 @@
import { http } from '../../utils/http'
/**
*
* @param data 模拟手机号码
* {
"loginType":"EMAIL", //登录方式
"account":"q614588746@163.com" , //登陆账号 手机号/邮箱/dccode
"verifyCode":"837012", //验证码
"password":"", //密码
"useCode":"true", //是否使用验证码 true/false
"idToken":"", //第三方登录idToken
}
*/
export const LoginApi = (data) => {
return http({
method: 'POST',
url: '/UserLogin/login',
data:
data
,
})
}
/**
* 发送邮箱验证码
* @param {*} email
* @returns
*/
export const SendEmailCodeApi = (data) => {
return http({
method: 'POST',
url: '/UserLogin/sendEmail',
data: data
})
}
/**
* 发送手机验证码
* @param {*} email
* @returns
*/
export const SendPhoneCodeApi = (data) => {
return http({
method: 'POST',
url: '/UserLogin/sendPhone',
data:data
})
}
/**
* 注册
*/
export const registerApi = (data) => {
return http({
method: 'POST',
url: '/UserLogin/register',
data: data,
})
}
/**
* 修改密码
*
*/
export const updatePassword = (data) => {
return http({
method: 'GET',
url: '/updatePassword',
data: {
data
},
})
}
/**
* 通过苹果登录
*/
export const postLoginAppleSimpleAPI = (phoneNumber) => {
return http({
method: 'POST',
url: '/login',
data: {
phoneNumber,
},
})
}
/**
* 通过谷歌登录
*/
export const postLoginGoogleSimpleAPI = (phoneNumber) => {
return http({
method: 'POST',
url: '/login/wxMin/simple',
data: {
phoneNumber,
},
})
}

42
components/DeepMate.vue

@ -8,12 +8,7 @@
<text class="deepmate-subtitle">您的市场最佳顾问~</text>
</view>
<view class="title-right">
<view class="icon-container">
<view class="ripple-effect ripple-1"></view>
<view class="ripple-effect ripple-2"></view>
<view class="ripple-effect ripple-3"></view>
<image class="deepmate-icon" src="https://d31zlh4on95l9h.cloudfront.net/images/7faa683450cc071bcc746fea8191ff6b.png" mode="aspectFit"></image>
</view>
<image class="deepmate-icon" src="https://d31zlh4on95l9h.cloudfront.net/images/7faa683450cc071bcc746fea8191ff6b.png" mode="aspectFit"></image>
</view>
</view>
</view>
@ -31,16 +26,16 @@
<view class="hotspot-item">
<text>市场风险提示</text>
</view>
<!-- <view class="hotspot-item">
<view class="hotspot-item">
<text>投资策略建议</text>
</view>
<view class="hotspot-item">
<text>财经新闻解读</text>
</view> -->
</view>
</view>
<view class="deepmate-action">
<input class="stock-input" type="text" v-model="stockInput" placeholder="请输入股票代码/名称,获取AI洞察" />
<view class="send-button-container" @click="sendStockQuery">
<input class="stock-input" type="text" placeholder="请输入股票代码/名称,获取AI洞察" />
<view class="send-button-container">
<image class="send-button" src="https://d31zlh4on95l9h.cloudfront.net/images/3da018821a5c82b06a1d6ddc81b960ac.png" mode="aspectFit"></image>
</view>
</view>
@ -50,31 +45,14 @@
</template>
<script>
export default {
name: 'DeepMate',
data() {
return {
stockInput: ''
}
},
methods: {
sendStockQuery() {
//
if (!this.stockInput.trim()) {
uni.showToast({
title: '请输入股票代码或名称',
icon: 'none'
});
return;
}
export default {
name: 'DeepMate',
data() {
return {
//
uni.navigateTo({
url: `/pages/home/deepExploration?query=${encodeURIComponent(this.stockInput)}`
});
}
}
}
}
</script>
<style>

8
components/MarketOverview.vue

@ -54,7 +54,7 @@
<text class="analysis-dot blue"></text>
<text class="analysis-text">市场风险评级: 需警惕潜在风险</text>
</view>
<view class="analysis-item" @click="goToMorningMarketAnalysis">
<view class="analysis-item">
<text class="analysis-dot green"></text>
<text class="analysis-text">早盘解析: 今日高开, 芯片稀土公共</text>
</view>
@ -142,12 +142,6 @@ export default {
this.showSelector = false;
this.$refs.marketPopup.close();
},
goToMorningMarketAnalysis() {
//
uni.navigateTo({
url: '/pages/morningMarketAnalysis/morningMarketAnalysis'
});
},
getSelectedMarketName() {
if (!this.selectedMarket) return '';
return this.marketData[this.selectedMarket].name;

45
components/footerBar.vue

@ -1,4 +1,45 @@
<template>
<!-- #ifdef H5 -->
<view class="static-footer-bar" :style="{ 'padding-bottom': safeAreaInsets.bottom + 'px' }">
<view class="static-footer-li" @click="tabChange(1)">
<image src="../static/footBar-image/home.png" class="static-footer-li-icon" v-if="type != 'home'"></image>
<image src="../static/footBar-image/home-selected.png" class="static-footer-li-icon" v-if="type == 'home'"></image>
<view :class="type == 'home' ? 'static-footer-li-title1' : 'static-footer-li-title'">
首页</view>
</view>
<view class="static-footer-li" @click="tabChange(2)">
<image src="../static/footBar-image/marketSituation.png" class="static-footer-li-icon" v-if="type != 'marketSituation'">
</image>
<image src="../static/footBar-image/marketSituation-selected.png" class="static-footer-li-icon"
v-if="type == 'marketSituation'"></image>
<view :class="type == 'marketSituation' ? 'static-footer-li-title1' : 'static-footer-li-title'">
行情</view>
</view>
<view class="static-footer-li static-footer-li-special" @click="tabChange(3)">
<image src="../static/footBar-image/deepMate.png" class="static-footer-li-icon static-footer-li-icon-special" v-if="type != 'deepMate'"></image>
<image src="../static/footBar-image/deepMate-selected.png" class="static-footer-li-icon static-footer-li-icon-special" v-if="type == 'deepMate'">
</image>
<view :class="type == 'deepMate' ? 'static-footer-li-title1' : 'static-footer-li-title'">
DeepMate</view>
</view>
<view class="static-footer-li" @click="tabChange(4)">
<image src="../static/footBar-image/deepExploration.png" class="static-footer-li-icon" v-if="type != 'deepExploration'">
</image>
<image src="../static/footBar-image/deepExploration-selected.png" class="static-footer-li-icon"
v-if="type == 'deepExploration'"></image>
<view :class="type == 'deepExploration' ? 'static-footer-li-title1' : 'static-footer-li-title'">
深度探索</view>
</view>
<view class="static-footer-li" @click="tabChange(5)">
<image src="../static/footBar-image/member.png" class="static-footer-li-icon" v-if="type != 'member'"></image>
<image src="../static/footBar-image/member-selected.png" class="static-footer-li-icon" v-if="type == 'member'"></image>
<view :class="type == 'member' ? 'static-footer-li-title1' : 'static-footer-li-title'">
我的</view>
</view>
</view>
<!-- #endif -->
<!-- #ifndef H5 -->
<view class="static-footer-bar" :style="{ 'padding-bottom': safeAreaInsets.bottom + 'px' }">
<view class="static-footer-li" @click="tabChange(1)">
<image src="../static/footBar-image/home.png" class="static-footer-li-icon" v-if="type != 'home'"></image>
@ -36,6 +77,8 @@
{{ $t('components.footerBar.member') }}</view>
</view>
</view>
<!-- #endif -->
</template>
<script setup>
@ -73,7 +116,7 @@ const tabChange = (value) => {
})
} else if (value == 3) { //DeepMate
uni.redirectTo({
url: '/pages/home/deepMate',
url: '/pages/deepMate/deepMate',
animationType: 'fade-in'
})
} else if (value == 4) { //

167
components/login-prompt.vue

@ -0,0 +1,167 @@
<template>
<view class="login-prompt" v-if="showPrompt">
<view class="mask" :class="{ 'mask-show': showAnimation }"></view>
<view class="prompt-content" :class="{ 'slide-up': showAnimation }">
<text class="prompt-title">登录以获得更好的体验</text>
<button class="login-btn" @click="goLogin">登录</button>
<button class="visitor-btn" @click="continueAsVisitor">
以访客身份继续
</button>
<text class="prompt-title-small" @click="goRegister"
>如果您还没有账号点击注册</text
>
</view>
</view>
</template>
<script setup>
import { ref, nextTick, onMounted } from "vue";
import { useUserStore } from "../stores/modules/userInfo";
const userStore = useUserStore();
//
onMounted(() => {
if (!userStore.userInfo) {
show();
}
});
//
const showPrompt = ref(false);
const showAnimation = ref(false);
//
const show = () => {
showPrompt.value = true;
//
nextTick(() => {
setTimeout(() => {
showAnimation.value = true;
}, 10);
});
};
//
const hide = () => {
showAnimation.value = false;
//
setTimeout(() => {
showPrompt.value = false;
}, 300);
};
//
const goLogin = () => {
uni.navigateTo({
url: "/pages/start/login/login",
});
hide();
};
//
const goRegister = () => {
uni.navigateTo({
url: "/pages/start/Registration/Registration",
});
hide();
};
// 访
const continueAsVisitor = () => {
// 访
uni.setStorageSync("visitorMode", true);
hide();
};
// 使
defineExpose({
show,
hide,
});
</script>
<style scoped>
.login-prompt {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 999;
}
.mask {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.8);
opacity: 0;
transition: opacity 0.3s ease;
}
.mask.mask-show {
opacity: 1;
}
.prompt-content {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 400rpx;
border-radius: 20rpx 20rpx 0 0;
background-color: white;
padding: 20rpx 70rpx;
transform: translateY(100%);
transition: transform 0.3s ease;
box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.3);
}
.prompt-content.slide-up {
transform: translateY(0);
}
.prompt-title {
display: block;
text-align: center;
font-size: 40rpx;
font-weight: 700;
color: #000000;
margin-top: 30rpx;
margin-bottom: 40rpx;
}
.login-btn {
width: 100%;
height: 80rpx;
background-color: rgb(0, 0, 0);
color: white;
font-size: 32rpx;
line-height: 80rpx;
border-radius: 40rpx;
margin-bottom: 20rpx;
}
.visitor-btn {
width: 100%;
height: 80rpx;
background-color: #f5f5f5;
color: #333;
font-size: 32rpx;
line-height: 80rpx;
border-radius: 40rpx;
}
.prompt-title-small {
display: block;
text-align: center;
font-size: 24rpx;
color: #6a6a6a;
margin-top: 30rpx;
margin-bottom: 40rpx;
line-height: 15.5px;
letter-spacing: 0.3px;
font-style: normal;
font-family: "PingFang SC";
}
</style>

8
main.js

@ -1,4 +1,5 @@
import pinia from './stores/index.js'
// #ifndef VUE3
import Vue from 'vue'
import App from './App'
@ -6,15 +7,17 @@ import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
...App
...App,
pinia
})
app.use(ElementPlus)
for (const [key, component] of Object.entries(ElementPlusIconsVue{
for (const [key, component] of Object.entries(ElementPlusIconsVue)){
app.component(key, component)
}
app.$mount()
@ -110,6 +113,7 @@ const i18n = createI18n({
})
export function createApp() {
const app = createSSRApp(App)
app.use(pinia)
app.use(i18n)
return {
app

13
manifest.json

@ -16,7 +16,9 @@
"autoclose" : true,
"delay" : 0
},
"modules" : {},
"modules" : {
"OAuth" : {}
},
/* */
"distribute" : {
/* */
@ -42,7 +44,14 @@
},
"ios" : {},
/* ios */
"sdkConfigs" : {}
"sdkConfigs" : {
"oauth" : {
"apple" : {},
"google" : {
"clientid" : "135"
}
}
}
}
},
/* SDK */

271
package-lock.json

@ -8,13 +8,14 @@
"@dcloudio/uni-ui": "^1.5.11",
"@element-plus/icons-vue": "^2.3.2",
"element-plus": "^2.11.5",
"marked": "^2.0.1",
"pinia": "^3.0.3",
"pinia-plugin-persistedstate": "^4.5.0",
"vue-i18n": "^9.14.5"
}
},
"node_modules/@babel/helper-string-parser": {
"version": "7.27.1",
"resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
"license": "MIT",
"peer": true,
"engines": {
@ -22,9 +23,7 @@
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.27.1",
"resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
"integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
"version": "7.28.5",
"license": "MIT",
"peer": true,
"engines": {
@ -32,13 +31,11 @@
}
},
"node_modules/@babel/parser": {
"version": "7.28.4",
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.4.tgz",
"integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
"version": "7.28.5",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/types": "^7.28.4"
"@babel/types": "^7.28.5"
},
"bin": {
"parser": "bin/babel-parser.js"
@ -48,14 +45,12 @@
}
},
"node_modules/@babel/types": {
"version": "7.28.4",
"resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.4.tgz",
"integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
"version": "7.28.5",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
"@babel/helper-validator-identifier": "^7.27.1"
"@babel/helper-validator-identifier": "^7.28.5"
},
"engines": {
"node": ">=6.9.0"
@ -63,7 +58,7 @@
},
"node_modules/@ctrl/tinycolor": {
"version": "3.6.1",
"resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
"resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
"integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==",
"license": "MIT",
"engines": {
@ -72,13 +67,13 @@
},
"node_modules/@dcloudio/uni-ui": {
"version": "1.5.11",
"resolved": "https://registry.npmjs.org/@dcloudio/uni-ui/-/uni-ui-1.5.11.tgz",
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-ui/-/uni-ui-1.5.11.tgz",
"integrity": "sha512-DBtk046ofmeFd82zRI7d89SoEwrAxYzUN3WVPm1DIBkpLPG5F5QDNkHMnZGu2wNrMEmGBjBpUh3vqEY1L3jaMw==",
"license": "Apache-2.0"
},
"node_modules/@element-plus/icons-vue": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz",
"resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz",
"integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==",
"license": "MIT",
"peerDependencies": {
@ -87,7 +82,7 @@
},
"node_modules/@floating-ui/core": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz",
"resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.3.tgz",
"integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==",
"license": "MIT",
"dependencies": {
@ -96,7 +91,7 @@
},
"node_modules/@floating-ui/dom": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz",
"resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.4.tgz",
"integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==",
"license": "MIT",
"dependencies": {
@ -106,7 +101,7 @@
},
"node_modules/@floating-ui/utils": {
"version": "0.2.10",
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz",
"resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.10.tgz",
"integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
"license": "MIT"
},
@ -156,15 +151,13 @@
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.5",
"resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
"license": "MIT",
"peer": true
},
"node_modules/@popperjs/core": {
"name": "@sxzz/popperjs-es",
"version": "2.11.7",
"resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
"resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
"integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==",
"license": "MIT",
"funding": {
@ -174,13 +167,13 @@
},
"node_modules/@types/lodash": {
"version": "4.17.20",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz",
"resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.20.tgz",
"integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==",
"license": "MIT"
},
"node_modules/@types/lodash-es": {
"version": "4.17.12",
"resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
"resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz",
"integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
"license": "MIT",
"dependencies": {
@ -189,14 +182,12 @@
},
"node_modules/@types/web-bluetooth": {
"version": "0.0.16",
"resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
"resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
"integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==",
"license": "MIT"
},
"node_modules/@vue/compiler-core": {
"version": "3.5.22",
"resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.22.tgz",
"integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==",
"license": "MIT",
"peer": true,
"dependencies": {
@ -209,8 +200,6 @@
},
"node_modules/@vue/compiler-dom": {
"version": "3.5.22",
"resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz",
"integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==",
"license": "MIT",
"peer": true,
"dependencies": {
@ -220,8 +209,6 @@
},
"node_modules/@vue/compiler-sfc": {
"version": "3.5.22",
"resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz",
"integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==",
"license": "MIT",
"peer": true,
"dependencies": {
@ -238,8 +225,6 @@
},
"node_modules/@vue/compiler-ssr": {
"version": "3.5.22",
"resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz",
"integrity": "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==",
"license": "MIT",
"peer": true,
"dependencies": {
@ -248,15 +233,34 @@
}
},
"node_modules/@vue/devtools-api": {
"version": "6.6.4",
"resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
"integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
"license": "MIT"
"version": "7.7.7",
"license": "MIT",
"dependencies": {
"@vue/devtools-kit": "^7.7.7"
}
},
"node_modules/@vue/devtools-kit": {
"version": "7.7.7",
"license": "MIT",
"dependencies": {
"@vue/devtools-shared": "^7.7.7",
"birpc": "^2.3.0",
"hookable": "^5.5.3",
"mitt": "^3.0.1",
"perfect-debounce": "^1.0.0",
"speakingurl": "^14.0.1",
"superjson": "^2.2.2"
}
},
"node_modules/@vue/devtools-shared": {
"version": "7.7.7",
"license": "MIT",
"dependencies": {
"rfdc": "^1.4.1"
}
},
"node_modules/@vue/reactivity": {
"version": "3.5.22",
"resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.22.tgz",
"integrity": "sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==",
"license": "MIT",
"peer": true,
"dependencies": {
@ -265,8 +269,6 @@
},
"node_modules/@vue/runtime-core": {
"version": "3.5.22",
"resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.22.tgz",
"integrity": "sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==",
"license": "MIT",
"peer": true,
"dependencies": {
@ -276,8 +278,6 @@
},
"node_modules/@vue/runtime-dom": {
"version": "3.5.22",
"resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.22.tgz",
"integrity": "sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==",
"license": "MIT",
"peer": true,
"dependencies": {
@ -289,8 +289,6 @@
},
"node_modules/@vue/server-renderer": {
"version": "3.5.22",
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.22.tgz",
"integrity": "sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==",
"license": "MIT",
"peer": true,
"dependencies": {
@ -303,14 +301,12 @@
},
"node_modules/@vue/shared": {
"version": "3.5.22",
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.22.tgz",
"integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==",
"license": "MIT",
"peer": true
},
"node_modules/@vueuse/core": {
"version": "9.13.0",
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz",
"resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz",
"integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
"license": "MIT",
"dependencies": {
@ -325,7 +321,7 @@
},
"node_modules/@vueuse/core/node_modules/vue-demi": {
"version": "0.14.10",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
"resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
"hasInstallScript": true,
"license": "MIT",
@ -351,7 +347,7 @@
},
"node_modules/@vueuse/metadata": {
"version": "9.13.0",
"resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz",
"resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
"integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==",
"license": "MIT",
"funding": {
@ -360,7 +356,7 @@
},
"node_modules/@vueuse/shared": {
"version": "9.13.0",
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz",
"resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz",
"integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
"license": "MIT",
"dependencies": {
@ -372,7 +368,7 @@
},
"node_modules/@vueuse/shared/node_modules/vue-demi": {
"version": "0.14.10",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
"resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
"hasInstallScript": true,
"license": "MIT",
@ -398,26 +394,54 @@
},
"node_modules/async-validator": {
"version": "4.2.5",
"resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz",
"resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz",
"integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==",
"license": "MIT"
},
"node_modules/birpc": {
"version": "2.6.1",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/copy-anything": {
"version": "4.0.5",
"license": "MIT",
"dependencies": {
"is-what": "^5.2.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/mesqueeb"
}
},
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"license": "MIT",
"peer": true
},
"node_modules/dayjs": {
"version": "1.11.18",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz",
"integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==",
"license": "MIT"
},
"node_modules/deep-pick-omit": {
"version": "1.2.1",
"license": "MIT"
},
"node_modules/defu": {
"version": "6.1.4",
"license": "MIT"
},
"node_modules/destr": {
"version": "2.0.5",
"license": "MIT"
},
"node_modules/element-plus": {
"version": "2.11.5",
"resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.11.5.tgz",
"resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.11.5.tgz",
"integrity": "sha512-O+bIVHQCjUDm4GiIznDXRoS8ar2TpWLwfOGnN/Aam0VXf5kbuc4SxdKKJdovWNxmxeqbcwjsSZPKgtXNcqys4A==",
"license": "MIT",
"dependencies": {
@ -442,8 +466,6 @@
},
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"license": "BSD-2-Clause",
"peer": true,
"engines": {
@ -455,26 +477,38 @@
},
"node_modules/estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"license": "MIT",
"peer": true
},
"node_modules/hookable": {
"version": "5.5.3",
"license": "MIT"
},
"node_modules/is-what": {
"version": "5.5.0",
"license": "MIT",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/mesqueeb"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"license": "MIT"
},
"node_modules/lodash-es": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
"resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
"license": "MIT"
},
"node_modules/lodash-unified": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz",
"resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz",
"integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
"license": "MIT",
"peerDependencies": {
@ -484,25 +518,35 @@
}
},
"node_modules/magic-string": {
"version": "0.30.19",
"resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.19.tgz",
"integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==",
"version": "0.30.21",
"license": "MIT",
"peer": true,
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.5"
}
},
"node_modules/marked": {
"version": "2.0.1",
"license": "MIT",
"bin": {
"marked": "bin/marked"
},
"engines": {
"node": ">= 8.16.2"
}
},
"node_modules/memoize-one": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
"resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
"integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
"license": "MIT"
},
"node_modules/mitt": {
"version": "3.0.1",
"license": "MIT"
},
"node_modules/nanoid": {
"version": "3.3.11",
"resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz",
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"funding": [
{
"type": "github",
@ -520,21 +564,65 @@
},
"node_modules/normalize-wheel-es": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
"resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
"integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==",
"license": "BSD-3-Clause"
},
"node_modules/perfect-debounce": {
"version": "1.0.0",
"license": "MIT"
},
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"license": "ISC",
"peer": true
},
"node_modules/pinia": {
"version": "3.0.3",
"license": "MIT",
"dependencies": {
"@vue/devtools-api": "^7.7.2"
},
"funding": {
"url": "https://github.com/sponsors/posva"
},
"peerDependencies": {
"typescript": ">=4.4.4",
"vue": "^2.7.0 || ^3.5.11"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/pinia-plugin-persistedstate": {
"version": "4.5.0",
"license": "MIT",
"dependencies": {
"deep-pick-omit": "^1.2.1",
"defu": "^6.1.4",
"destr": "^2.0.5"
},
"peerDependencies": {
"@nuxt/kit": ">=3.0.0",
"@pinia/nuxt": ">=0.10.0",
"pinia": ">=3.0.0"
},
"peerDependenciesMeta": {
"@nuxt/kit": {
"optional": true
},
"@pinia/nuxt": {
"optional": true
},
"pinia": {
"optional": true
}
}
},
"node_modules/postcss": {
"version": "8.5.6",
"resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz",
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
"funding": [
{
"type": "opencollective",
@ -560,19 +648,36 @@
"node": "^10 || ^12 || >=14"
}
},
"node_modules/rfdc": {
"version": "1.4.1",
"license": "MIT"
},
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/speakingurl": {
"version": "14.0.1",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/superjson": {
"version": "2.2.3",
"license": "MIT",
"dependencies": {
"copy-anything": "^4"
},
"engines": {
"node": ">=16"
}
},
"node_modules/vue": {
"version": "3.5.22",
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.22.tgz",
"integrity": "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==",
"license": "MIT",
"peer": true,
"dependencies": {
@ -610,6 +715,12 @@
"peerDependencies": {
"vue": "^3.0.0"
}
},
"node_modules/vue-i18n/node_modules/@vue/devtools-api": {
"version": "6.6.4",
"resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
"integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
"license": "MIT"
}
}
}

7
package.json

@ -3,6 +3,11 @@
"@dcloudio/uni-ui": "^1.5.11",
"@element-plus/icons-vue": "^2.3.2",
"element-plus": "^2.11.5",
"vue-i18n": "^9.14.5"
"vue-i18n": "^9.14.5",
"marked": "^2.0.1",
"pinia": "^3.0.3",
"pinia-plugin-persistedstate": "^4.5.0"
}
}

108
pages.json

@ -3,35 +3,45 @@
"^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue"
},
"pages": [{
"path": "pages/home/home",
"path": "pages/start/startup/startup",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom",
"navigationBarBackgroundColor": "#000000",
"navigationBarTextStyle": "white",
"disableSwipeBack": true,
"titleNView": false,
"bounce": false
}
},
{
"path": "pages/home/marketSituation",
"path": "pages/start/select/select",
"style": {
"navigationBarBackgroundColor": "#000000",
"navigationBarTitleText": "",
"animationType": "pop-in",
"navigationStyle": "custom",
"disableSwipeBack": true,
"titleNView": false,
"bounce": false
}
},
{
"path": "pages/home/deepMate",
"path": "pages/start/index/index",
"style": {
"navigationStyle": "custom",
"navigationBarTitleText": "uni-app",
"disableSwipeBack": true,
"titleNView": false,
"bounce": false
}
},
{
"path": "pages/home/deepExploration",
"path": "pages/start/Registration/Registration",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom",
"disableSwipeBack": true,
"titleNView": false,
@ -39,32 +49,47 @@
}
},
{
"path": "pages/home/member",
"path": "pages/start/login/login",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom",
"disableSwipeBack": true,
"titleNView": false,
"bounce": false
}
},
{
"path" : "pages/morningMarketAnalysis/morningMarketAnalysis",
"style" :
{
"navigationBarTitleText" : ""
"path": "pages/start/agreement/agreement",
"style": {
"navigationBarTitleText": "",
"disableSwipeBack": true,
"titleNView": false,
"bounce": false
}
},
{
"path": "pages/start/privacy/privacy",
"style": {
"navigationBarTitleText": "",
"disableSwipeBack": true,
"titleNView": false,
"bounce": false
}
},
{
"path": "pages/home/globalIndex",
"path": "pages/deepMate/deepMate",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom",
"disableSwipeBack": true,
"titleNView": false,
"bounce": false
}
},
{
"path": "pages/home/marketDetail",
"path": "pages/home/home",
"style": {
"navigationStyle": "custom",
"disableSwipeBack": true,
@ -73,6 +98,61 @@
}
},
{
"path": "pages/home/marketSituation",
"style": {
"navigationStyle": "custom",
"disableSwipeBack": true,
"titleNView": false,
"bounce": false
}
},
{
"path": "pages/home/deepMate",
"style": {
"navigationStyle": "custom",
"disableSwipeBack": true,
"titleNView": false,
"bounce": false
}
},
{
"path": "pages/home/deepExploration",
"style": {
"navigationStyle": "custom",
"disableSwipeBack": true,
"titleNView": false,
"bounce": false
}
},
{
"path": "pages/home/member",
"style": {
"navigationStyle": "custom",
"disableSwipeBack": true,
"titleNView": false,
"bounce": false
}
},
{
"path": "pages/blank/blank",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom",
"disableSwipeBack": true,
"titleNView": false,
"bounce": false
}
},
{
"path" : "pages/start/recoverPassword/recoverPassword",
"style" :
{
"navigationBarTitleText": "",
"navigationStyle": "custom",
"titleNView": false
}
},
{
"path": "pages/setting/general",
"style": {
"navigationBarTitleText": "通用设置"
@ -196,5 +276,11 @@
"app-plus": {
"background": "#efeff4"
}
},
"style": {
"app-plus": {
"animationType": "fade-in",
"animationDuration": 500
}
}
}

23
pages/blank/blank.vue

@ -0,0 +1,23 @@
<template>
<view class="blank-page">
<text class="tip">当前特斯拉该如何布局</text>
</view>
</template>
<script setup>
//
</script>
<style scoped>
.blank-page {
display: flex;
align-items: center;
justify-content: center;
height: 100vh;
background-color: #ffffff;
}
.tip {
color: #999999;
font-size: 28rpx;
}
</style>

1648
pages/deepMate/deepMate.vue
File diff suppressed because it is too large
View File

64
pages/home/deepExploration.vue

@ -1,28 +1,56 @@
<template>
<view class="main">
<!-- 顶部状态栏占位 -->
<view class="top" :style="{height:iSMT+'px'}"></view>
<view>深度探索</view>
<footerBar class="static-footer" :type="type"></footerBar>
</view>
<view class="content">
<view class="text-area">
</view>
<LoginPrompt ref="loginPrompt"></LoginPrompt>
<button @click="showLoginPrompt">deepMate</button>
<text class="title" @click="showLoginPrompt">{{ title }}</text>
</view>
</template>
<script setup>
import { ref,onMounted } from 'vue'
import footerBar from '../../components/footerBar.vue'
import { ref } from "vue";
import { useUserStore } from "../../stores/modules/userInfo";
const title = ref("请先登录");
const loginPrompt = ref(null);
const type = ref('deepExploration')
const iSMT = ref(0)
const userStore = useUserStore();
function showLoginPrompt() {
userStore.clearUserInfo();
}
onMounted(() => {
//
iSMT.value = uni.getSystemInfoSync().statusBarHeight;
})
function toDeepMate() {
uni.navigateTo({
url: "/pages/deepMate/deepMate",
});
}
</script>
<style scoped>
.static-footer {
position: fixed;
bottom: 0;
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
}
.title {
font-size: 36rpx;
color: #8f8f94;
}
</style>

26
pages/home/home.vue

@ -46,7 +46,7 @@
<text class="section-title">深度探索</text>
</view>
<view class="header-right">
<text class="more-btn" @click="goToDeepExploration">查看更多</text>
<text class="more-btn">查看更多</text>
</view>
</view>
</view>
@ -80,7 +80,7 @@
<view class="section-header-container">
<view class="section-header">
<text class="section-title">我的自选</text>
<text class="more-btn" @click="goToMarketSituation">添加自选股</text>
<text class="more-btn">添加自选股</text>
</view>
</view>
@ -115,8 +115,7 @@
<view class="report-status">{{report.status}}</view>
</view>
<view class="view-more">
<view><text>查看更多 >></text></view>
<view><text class="disclaimer-text">免责声明以上数据由AI生成不作为最终投资建议决策需独立</text></view>
<text>查看更多 >></text>
</view>
</view>
</view>
@ -204,18 +203,6 @@ export default {
},
methods: {
goToDeepExploration() {
//
uni.navigateTo({
url: '/pages/home/deepExploration'
});
},
goToMarketSituation() {
//
uni.navigateTo({
url: '/pages/home/marketSituation'
});
},
//
debounce(fn, delay = 300) {
if (this.debounceTimer) clearTimeout(this.debounceTimer)
@ -713,13 +700,6 @@ export default {
height: 60px;
}
/* 免责声明样式 */
.disclaimer-text {
font-size: 8px;
color: #999999;
text-align: center;
}
/* 底部导航 */
.static-footer {
position: fixed;

1023
pages/start/Registration/Registration.vue
File diff suppressed because it is too large
View File

1341
pages/start/Registration/list.js
File diff suppressed because it is too large
View File

13
pages/start/agreement/agreement.vue

@ -0,0 +1,13 @@
<template>
<view>
用户协议
</view>
</template>
<script setup>
</script>
<style>
</style>

56
pages/start/index/index.vue

@ -0,0 +1,56 @@
<template>
<view class="content">
<image class="logo" src="/static/logo.png"></image>
<view class="text-area">
<text class="title" @click="showLoginPrompt">{{ title }}</text>
</view>
<LoginPrompt ref="loginPrompt"></LoginPrompt>
<button @click="toDeepMate">deepMate</button>
</view>
</template>
<script setup>
import { ref } from "vue";
import { useUserStore } from "../../../stores/modules/userInfo";
const title = ref("请先登录");
const loginPrompt = ref(null);
const userStore = useUserStore();
function showLoginPrompt() {
userStore.clearUserInfo();
}
function toDeepMate() {
uni.navigateTo({
url: "/pages/deepMate/deepMate",
});
}
</script>
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
}
.title {
font-size: 36rpx;
color: #8f8f94;
}
</style>

1341
pages/start/login/list.js
File diff suppressed because it is too large
View File

1160
pages/start/login/login.vue
File diff suppressed because it is too large
View File

69
pages/start/login/verification.js

@ -0,0 +1,69 @@
function verificationPhone(countryCode,phoneNumber) {
switch (countryCode) {
case '+86':
return verificationChina(phoneNumber);
case '+1':
return verificationAmerica(phoneNumber);
case '+65':
return verificationSingapore(phoneNumber);
case '+60':
return verificationMalaysia(phoneNumber);
case '+66':
return verificationThailand(phoneNumber);
case '+852':
return verificationHongKong(phoneNumber);
case '+84':
return verificationVietnam(phoneNumber);
default:
return true;
}
}
function verificationChina(phoneNumber){
const phoneRegex = /^1[3-9]\d{9}$/;
return phoneRegex.test(phoneNumber);
}
function verificationAmerica(phoneNumber){
const phoneRegex = /^[2-9]\d{2}[- ]?\d{4}$/;
return phoneRegex.test(phoneNumber);
}
function verificationSingapore(phoneNumber){
const phoneRegex = /^[89]\d{7}$/;
return phoneRegex.test(phoneNumber);
}
function verificationMalaysia(phoneNumber){
const phoneRegex = /^01\d{8}$/;
return phoneRegex.test(phoneNumber);
}
function verificationHongKong(phoneNumber){
const phoneRegex = /^0[896]\d{8}$/;
return phoneRegex.test(phoneNumber);
}
function verificationThailand(phoneNumber){
const phoneRegex = /^[5-9]\d{7}$/;
return phoneRegex.test(phoneNumber);
}
function verificationVietnam(phoneNumber){
const phoneRegex = /^(0)?[3-9]\d{8}$/;
return phoneRegex.test(phoneNumber);
}
function verificationEmail(email) {
const emailRegex = /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/;
return emailRegex.test(email);
}
export {verificationPhone,verificationEmail}

13
pages/start/privacy/privacy.vue

@ -0,0 +1,13 @@
<template>
<view>
隐私政策
</view>
</template>
<script setup>
</script>
<style>
</style>

1012
pages/start/recoverPassword/recoverPassword.vue
File diff suppressed because it is too large
View File

170
pages/start/select/select.vue

@ -0,0 +1,170 @@
<template>
<view class="login-container">
<!-- 顶部标题 -->
<view class="title-section">
<text class="main-title">DeepChart</text>
</view>
<view class="subtitle-section">
<text class="subtitle">您的股市随身顾问</text>
</view>
<!-- 手机卡片样式 -->
<view class="phone-card"> </view>
<!-- 登录注册按钮 -->
<view class="button-group">
<button class="login-button" @click="toLogin">登录</button>
<button class="register-button" @click="toRegistration">注册</button>
</view>
<footerBar class="static-footer" :type="type"></footerBar>
</view>
</template>
<script setup>
import footerBar from "../../../components/footerBar";
import { ref, reactive, toRefs, watch } from "vue";
const type = ref("member");
function toRegistration() {
uni.redirectTo({
url: "/pages/start/Registration/Registration",
});
}
function toLogin() {
uni.redirectTo({
url: "/pages/start/login/login",
});
}
</script>
<style scoped>
.login-container {
display: flex;
flex-direction: column;
align-items: center;
/* justify-content: space-between; */
padding: 40rpx;
height: 90vh;
background-color: #ffffff;
overflow: hidden;
max-height: 100vh;
-webkit-overflow-scrolling: none;
}
.title-section {
text-align: center;
margin-top: 120rpx;
margin-bottom: 20rpx;
}
.main-title {
text-align: center;
font-size: 64rpx;
font-weight: 300;
color: #000000;
margin-bottom: 10rpx;
}
.subtitle-section {
margin-bottom: 80rpx;
}
.subtitle {
/* font-weight: bold; */
font-size: 32rpx;
color: #333333;
}
.phone-card {
background-image: url("/static/select.png");
background-repeat: no-repeat;
background-size: contain;
background-position: center;
/* background-position: center; */
/* min-width: 300rpx; */
width: 420rpx;
height: 786rpx;
border-radius: 50rpx;
padding: 40rpx;
/* box-shadow: 0 20rpx 40rpx rgba(0, 0, 0, 0.3); */
position: relative;
overflow: hidden;
}
.button-group {
display: flex;
gap: 40rpx;
margin: 80rpx 0;
width: 100%;
max-width: 600rpx;
}
.login-button {
flex: 1;
background-color: #f5f5f5;
color: #000000;
border-radius: 60rpx;
font-size: 32rpx;
padding: 20rpx;
}
.register-button {
flex: 1;
background-color: #000000;
color: #ffffff;
border-radius: 60rpx;
font-size: 32rpx;
padding: 20rpx;
}
.bottom-nav {
display: flex;
justify-content: space-around;
align-items: center;
width: 100%;
height: 100rpx;
background-color: #ffffff;
position: fixed;
bottom: 0;
left: 0;
border-top: 1rpx solid #e5e5e5;
}
.nav-item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 10rpx;
}
.nav-item.active .nav-icon {
transform: scale(1.2);
}
.nav-icon {
width: 40rpx;
height: 40rpx;
margin-bottom: 10rpx;
}
.nav-text {
font-size: 24rpx;
color: #666666;
}
.nav-item.active .nav-text {
color: #000000;
}
.static-footer {
position: fixed;
bottom: 0;
left: 0;
right: 0;
}
</style>

64
pages/start/startup/startup.vue

@ -0,0 +1,64 @@
<template>
<view class="background">
<image
class="logo"
src="../../../static/icons/start-logo.png"
mode="scaleToFill"
/>
<view class="logo-text"> DeepChart </view>
</view>
</template>
<script setup>
import { onShow } from "@dcloudio/uni-app";
import { useUserStore } from "../../../stores/modules/userInfo";
onShow(() => {
setTimeout(() => {
const userStore = useUserStore();
if (!userStore.userInfo)
uni.redirectTo({
url: "/pages/start/select/select",
animationType: "slide-in-right",
animationDuration: 1000,
});
else {
uni.redirectTo({
url: "/pages/home/home",
animationType: "slide-in-right",
animationDuration: 1000,
});
}
}, 1500);
});
</script>
<style>
.background {
background: linear-gradient(180deg, #fb6967, #fb6967);
width: 100vw;
height: 100vh;
}
.logo-text {
display: flex;
justify-content: center;
align-items: center;
color: white;
font-weight: bold;
font-size: 24px;
position: absolute;
bottom: 5%;
left: 50%;
transform: translateX(-50%);
}
.logo {
width: 320rpx;
height: 200rpx;
position: absolute;
top: 30%;
left: 50%;
transform: translate(-50%, -50%);
}
</style>

138
server/login.json

@ -0,0 +1,138 @@
{
"loginSuccessByEmail": {
"code": 200,
"message": "c3e9ed50ad72073b94dfb04860562b58",
"data": {
"loginType": null,
"device": "unknown",
"dccode": "90047686",
"account": null,
"password": null,
"verifyCode": null,
"useCode": false,
"idToken": null,
"token": "c3e9ed50ad72073b94dfb04860562b58",
"market": "新加坡",
"phone": "17861484516",
"email": "q614588746@163.com",
"language": "中文",
"avatar": "123"
}
},
"loginFailureEmailNotFound": {
"code": 404,
"message": "账号不存在",
"interface": "login"
},
"loginFailureWrongCode": {
"code": 400,
"message": "验证码错误",
"interface": "login"
},
"loginSuccessByPhone": {
"code": 200,
"message": "登录成功",
"interface": "login",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"userInfo": {
"id": "987654321",
"username": "13800138000",
"phone": "13800138000"
}
}
},
"loginSuccessByPassword": {
"code": 200,
"message": "登录成功",
"interface": "login",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"userInfo": {
"id": "556677889",
"username": "testuser"
}
}
},
"sendCodeSuccess": {
"code": 200,
"message": "验证码发送成功",
"interface": "sendCode",
"data": {
"expireTime": 180
}
},
"sendCodeFailureInvalidFormat": {
"code": 400,
"message": "手机号格式错误",
"interface": "sendCode"
},
"sendCodeFailureTooFrequent": {
"code": 429,
"message": "发送频率过高,请稍后再试",
"interface": "sendCode"
},
"registerSuccess": {
"code": 200,
"message": "注册成功",
"interface": "register",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"userInfo": {
"id": "112233445",
"username": "newuser",
"email": "newuser@example.com"
}
}
},
"registerFailureEmailExist": {
"code": 400,
"message": "邮箱已被注册",
"interface": "register"
},
"registerFailurePhoneExist": {
"code": 400,
"message": "手机号已被注册",
"interface": "register"
},
"registerFailureWrongCode": {
"code": 400,
"message": "验证码错误",
"interface": "register"
},
"updatePasswordSuccess": {
"code": 200,
"message": "密码修改成功",
"interface": "updatePassword"
},
"updatePasswordFailureWrongOldPassword": {
"code": 400,
"message": "旧密码错误",
"interface": "updatePassword"
},
"updatePasswordFailureWrongCode": {
"code": 400,
"message": "验证码错误",
"interface": "updatePassword"
},
"forgotPasswordSuccessByEmail": {
"code": 200,
"message": "密码重置成功,新密码已发送至邮箱",
"interface": "forgotPassword"
},
"forgotPasswordSuccessByPhone": {
"code": 200,
"message": "密码重置成功,新密码已发送至手机",
"interface": "forgotPassword"
},
"forgotPasswordFailureAccountNotFound": {
"code": 404,
"message": "账号不存在",
"interface": "forgotPassword"
},
"forgotPasswordFailureWrongCode": {
"code": 400,
"message": "验证码错误",
"interface": "forgotPassword"
}
}

BIN
static/flag/ad.png

After

Width: 100  |  Height: 70  |  Size: 2.1 KiB

BIN
static/flag/ae.png

After

Width: 100  |  Height: 50  |  Size: 170 B

BIN
static/flag/af.png

After

Width: 100  |  Height: 67  |  Size: 2.6 KiB

BIN
static/flag/ag.png

After

Width: 100  |  Height: 67  |  Size: 2.0 KiB

BIN
static/flag/ai.png

After

Width: 100  |  Height: 50  |  Size: 1.3 KiB

BIN
static/flag/al.png

After

Width: 100  |  Height: 71  |  Size: 1.7 KiB

BIN
static/flag/am.png

After

Width: 100  |  Height: 50  |  Size: 122 B

BIN
static/flag/an.png

After

Width: 100  |  Height: 67  |  Size: 610 B

BIN
static/flag/ao.png

After

Width: 100  |  Height: 67  |  Size: 1.4 KiB

BIN
static/flag/aq.png

After

Width: 100  |  Height: 100  |  Size: 6.0 KiB

BIN
static/flag/ar.png

After

Width: 100  |  Height: 63  |  Size: 991 B

BIN
static/flag/as.png

After

Width: 100  |  Height: 50  |  Size: 2.0 KiB

BIN
static/flag/at.png

After

Width: 100  |  Height: 67  |  Size: 133 B

BIN
static/flag/au.png

After

Width: 100  |  Height: 50  |  Size: 1.1 KiB

BIN
static/flag/aw.png

After

Width: 100  |  Height: 67  |  Size: 658 B

BIN
static/flag/ax.png

After

Width: 100  |  Height: 65  |  Size: 279 B

BIN
static/flag/az.png

After

Width: 100  |  Height: 50  |  Size: 451 B

BIN
static/flag/ba.png

After

Width: 100  |  Height: 50  |  Size: 741 B

BIN
static/flag/bb.png

After

Width: 100  |  Height: 67  |  Size: 791 B

BIN
static/flag/bd.png

After

Width: 100  |  Height: 60  |  Size: 367 B

BIN
static/flag/be.png

After

Width: 100  |  Height: 87  |  Size: 168 B

BIN
static/flag/bf.png

After

Width: 100  |  Height: 67  |  Size: 560 B

BIN
static/flag/bg.png

After

Width: 100  |  Height: 60  |  Size: 106 B

BIN
static/flag/bh.png

After

Width: 100  |  Height: 60  |  Size: 303 B

BIN
static/flag/bi.png

After

Width: 100  |  Height: 60  |  Size: 1.3 KiB

BIN
static/flag/bj.png

After

Width: 100  |  Height: 67  |  Size: 169 B

BIN
static/flag/bl.png

After

Width: 100  |  Height: 67  |  Size: 6.2 KiB

BIN
static/flag/bm.png

After

Width: 100  |  Height: 50  |  Size: 2.0 KiB

BIN
static/flag/bn.png

After

Width: 100  |  Height: 50  |  Size: 2.3 KiB

BIN
static/flag/bo.png

After

Width: 100  |  Height: 68  |  Size: 1.4 KiB

BIN
static/flag/bq.png

After

Width: 100  |  Height: 67  |  Size: 159 B

BIN
static/flag/br.png

After

Width: 100  |  Height: 70  |  Size: 2.0 KiB

BIN
static/flag/bs.png

After

Width: 100  |  Height: 50  |  Size: 553 B

BIN
static/flag/bt.png

After

Width: 100  |  Height: 67  |  Size: 4.0 KiB

BIN
static/flag/bv.png

After

Width: 100  |  Height: 73  |  Size: 260 B

BIN
static/flag/bw.png

After

Width: 100  |  Height: 67  |  Size: 172 B

BIN
static/flag/by.png

After

Width: 100  |  Height: 50  |  Size: 1.4 KiB

BIN
static/flag/bz.png

After

Width: 100  |  Height: 67  |  Size: 5.6 KiB

BIN
static/flag/ca.png

After

Width: 100  |  Height: 50  |  Size: 765 B

BIN
static/flag/cc.png

After

Width: 100  |  Height: 50  |  Size: 1.3 KiB

BIN
static/flag/cd.png

After

Width: 100  |  Height: 75  |  Size: 796 B

BIN
static/flag/cf.png

After

Width: 100  |  Height: 67  |  Size: 554 B

BIN
static/flag/cg.png

After

Width: 100  |  Height: 67  |  Size: 354 B

BIN
static/flag/ch.png

After

Width: 100  |  Height: 100  |  Size: 172 B

BIN
static/flag/ci.png

After

Width: 100  |  Height: 67  |  Size: 165 B

BIN
static/flag/ck.png

After

Width: 100  |  Height: 50  |  Size: 1.9 KiB

BIN
static/flag/cl.png

After

Width: 100  |  Height: 67  |  Size: 517 B

BIN
static/flag/cm.png

After

Width: 100  |  Height: 67  |  Size: 482 B

BIN
static/flag/cn.png

After

Width: 100  |  Height: 67  |  Size: 763 B

BIN
static/flag/co.png

After

Width: 100  |  Height: 67  |  Size: 158 B

BIN
static/flag/cr.png

After

Width: 100  |  Height: 60  |  Size: 109 B

BIN
static/flag/cu.png

After

Width: 100  |  Height: 50  |  Size: 793 B

BIN
static/flag/cv.png

After

Width: 100  |  Height: 59  |  Size: 1.0 KiB

BIN
static/flag/cw.png

After

Width: 100  |  Height: 67  |  Size: 633 B

BIN
static/flag/cx.png

After

Width: 100  |  Height: 50  |  Size: 1.5 KiB

BIN
static/flag/cy.png

After

Width: 100  |  Height: 67  |  Size: 1.6 KiB

BIN
static/flag/cz.png

After

Width: 100  |  Height: 67  |  Size: 394 B

BIN
static/flag/de.png

After

Width: 100  |  Height: 60  |  Size: 106 B

BIN
static/flag/dj.png

After

Width: 100  |  Height: 67  |  Size: 1.1 KiB

BIN
static/flag/dk.png

After

Width: 100  |  Height: 76  |  Size: 200 B

BIN
static/flag/dm.png

After

Width: 100  |  Height: 50  |  Size: 1.2 KiB

BIN
static/flag/do.png

After

Width: 100  |  Height: 67  |  Size: 700 B

BIN
static/flag/dz.png

After

Width: 100  |  Height: 67  |  Size: 891 B

BIN
static/flag/ec.png

After

Width: 100  |  Height: 67  |  Size: 2.5 KiB

BIN
static/flag/ee.png

After

Width: 100  |  Height: 64  |  Size: 158 B

BIN
static/flag/eg.png

After

Width: 100  |  Height: 67  |  Size: 1.1 KiB

BIN
static/flag/eh.png

After

Width: 100  |  Height: 50  |  Size: 656 B

BIN
static/flag/er.png

After

Width: 100  |  Height: 50  |  Size: 1.4 KiB

BIN
static/flag/es.png

After

Width: 100  |  Height: 67  |  Size: 1.7 KiB

BIN
static/flag/et.png

After

Width: 100  |  Height: 50  |  Size: 1.3 KiB

BIN
static/flag/eu.png

After

Width: 100  |  Height: 67  |  Size: 1.4 KiB

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save