lvkun996 2 týždňov pred
rodič
commit
033a657384

+ 10 - 1
.eslintrc.js

@@ -13,6 +13,15 @@ module.exports = {
   },
   rules: {
     'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
-    'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
+    'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
+    quotes: 'off',
+    semi: 'off',
+    'comma-dangle': 'off',
+    "vue/multi-word-component-names": 'off',
+    "no-undef": 'off',
+    "vue/no-mutating-props": 'off',
+    "no-multiple-empty-lines": 'off',
+    "eol-last": "off",
+    "no-trailing-spaces": "off",
   }
 }

+ 2 - 0
package.json

@@ -9,6 +9,8 @@
   },
   "dependencies": {
     "core-js": "^3.8.3",
+    "postcss-px-to-viewport": "^1.1.1",
+    "vant": "^4.9.19",
     "vue": "^3.2.13",
     "vue-class-component": "^8.0.0-0",
     "vue-router": "^4.0.3"

+ 7 - 0
postcss.config.js

@@ -0,0 +1,7 @@
+module.exports = {
+  plugins: {
+    'postcss-px-to-viewport': {
+      viewportWidth: 375,
+    },
+  },
+};

+ 0 - 4
src/App.vue

@@ -1,8 +1,4 @@
 <template>
-  <nav>
-    <router-link to="/">Home</router-link> |
-    <router-link to="/about">About</router-link>
-  </nav>
   <router-view/>
 </template>
 

BIN
src/assets/avatar.jpg


+ 8 - 0
src/dist/main.js

@@ -0,0 +1,8 @@
+"use strict";
+exports.__esModule = true;
+var vant_1 = require("vant");
+require("vant/lib/index.css");
+var vue_1 = require("vue");
+var App_vue_1 = require("./App.vue");
+var router_1 = require("./router");
+vue_1.createApp(App_vue_1["default"]).use(router_1["default"]).use(vant_1.Button).mount('#app');

+ 6 - 4
src/main.ts

@@ -1,5 +1,7 @@
-import { createApp } from 'vue'
-import App from './App.vue'
-import router from './router'
+import { Button, Icon } from 'vant';
+import 'vant/lib/index.css';
+import { createApp } from 'vue';
+import App from './App.vue';
+import router from './router';
 
-createApp(App).use(router).mount('#app')
+createApp(App).use(router).use(Button).use(Icon).mount('#app')

+ 222 - 0
src/pages/chat-records/index.vue

@@ -0,0 +1,222 @@
+<template>
+  <div class="chat-page">
+
+    <!-- 聊天头部 -->
+    <div class="chat-header">
+      <div class="back-button">
+        <van-icon name="arrow-left" />
+      </div>
+      <div class="profile">
+        <div class="avatar-container">
+          <div class="avatar">
+            <img src="@/assets/avatar.jpg" alt="Esther Simpson" />
+          </div>
+          <span class="status-dot"></span>
+        </div>
+        <div class="user-info">
+          <div class="name">困困</div>
+          <div class="title">小逗ai</div>
+        </div>
+      </div>
+      <div class="more-options">
+        <van-icon name="ellipsis" />
+      </div>
+    </div>
+
+    <!-- 聊天内容 -->
+    <div class="chat-content">
+      <!-- 消息 1 -->
+      <div class="message-group">
+        <div class="sender-avatar">
+          <img src="@/assets/avatar.jpg" alt="Esther Simpson" />
+        </div>
+        <div class="message sender">
+          <div class="message-content">
+            你帅么
+          </div>
+        </div>
+      </div>
+
+      <!-- 消息 2 -->
+      <div class="message-group">
+        <div class="message receiver">
+          <div class="message-content">
+            我超级帅
+          </div>
+        </div>
+      </div>
+
+      <div class="message-group">
+        <div class="sender-avatar">
+          <img src="@/assets/avatar.jpg" alt="Esther Simpson" />
+        </div>
+        <div class="message sender">
+          <div class="message-content">
+            你一点也不帅
+          </div>
+        </div>
+      </div>
+
+      <!-- 消息 2 -->
+      <div class="message-group">
+        <div class="message receiver">
+          <div class="message-content">
+            我有1.帅
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script lang='ts' setup>
+// 这里可以添加需要的数据和方法
+</script>
+
+<style lang='less' scoped>
+@import '@/styles/var.less';
+.chat-page {
+  max-width: 414px;
+  margin: 0 auto;
+  height: 100vh;
+  display: flex;
+  flex-direction: column;
+  background-color: #f5f7fb;
+  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
+  position: relative;
+  border-radius: 30px;
+  overflow: hidden;
+}
+
+/* 聊天头部样式 */
+.chat-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 15px 20px;
+  background-color: white;
+  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05);
+
+  .back-button {
+    font-size: 20px;
+    cursor: pointer;
+  }
+
+  .profile {
+    display: flex;
+    align-items: center;
+    gap: 15px;
+
+    .avatar-container {
+      position: relative;
+
+      .avatar {
+        width: 50px;
+        height: 50px;
+        border-radius: 50%;
+        background-color: #ffcccc;
+        overflow: hidden;
+
+        img {
+          width: 100%;
+          height: 100%;
+          object-fit: cover;
+        }
+      }
+
+      .status-dot {
+        position: absolute;
+        width: 10px;
+        height: 10px;
+        background-color: #4caf50;
+        border-radius: 50%;
+        right: 0;
+        top: 5px;
+        border: 2px solid white;
+      }
+    }
+
+    .user-info {
+      display: flex;
+      flex-direction: column;
+
+      .name {
+        font-weight: 600;
+        font-size: 18px;
+      }
+
+      .title {
+        font-size: 14px;
+        color: #888;
+      }
+    }
+  }
+
+  .more-options {
+    font-size: 20px;
+    cursor: pointer;
+  }
+}
+
+/* 聊天内容样式 */
+.chat-content {
+  flex: 1;
+  padding: 20px;
+  overflow-y: auto;
+  display: flex;
+  flex-direction: column;
+  gap: 20px;
+}
+
+.message-group {
+  display: flex;
+  gap: 10px;
+
+  .sender-avatar {
+    width: 32px;
+    height: 32px;
+    border-radius: 50%;
+    overflow: hidden;
+
+    img {
+      width: 100%;
+      height: 100%;
+      object-fit: cover;
+    }
+  }
+
+  .message-column {
+    display: flex;
+    flex-direction: column;
+    gap: 8px;
+  }
+}
+
+.message {
+  max-width: 70%;
+  border-radius: 18px;
+  padding: 12px 16px;
+  position: relative;
+
+  &.sender {
+    background-color: @main-color;
+    color: white;
+    border-bottom-left-radius: 5px;
+  }
+
+  &.receiver {
+    background-color: white;
+    color: #333;
+    border-bottom-right-radius: 5px;
+    align-self: flex-end;
+    margin-left: auto;
+  }
+
+  .message-content {
+    font-size: 15px;
+    line-height: 1.4;
+  }
+
+}
+
+</style>

+ 289 - 0
src/pages/report/index.vue

@@ -0,0 +1,289 @@
+<template>
+  <div class="report-page">
+    <!-- 标题部分 -->
+    <div class="page-title">AI思维及学情报告</div>
+
+    <!-- 已玩卡片标签 -->
+    <div class="card-container">
+      <div class="card-header">
+        <div class="section-title">已玩卡片</div>
+      </div>
+      <div class="tags-container">
+        <span class="tag">逻小熊爱文化</span>
+        <span class="tag">逻辑思维提升</span>
+        <span class="tag">数学启蒙</span>
+      </div>
+    </div>
+
+    <!-- 数据总览 -->
+    <div class="data-overview">
+      <div class="section-title">数据总览</div>
+      <div class="stats-container">
+        <div class="stat-item">
+          <div class="stat-value">12</div>
+          <div class="stat-label">游戏主题</div>
+        </div>
+        <div class="stat-item">
+          <div class="stat-value">36</div>
+          <div class="stat-label">卡片数量</div>
+        </div>
+        <div class="stat-item">
+          <div class="stat-value">45</div>
+          <div class="stat-label">游戏时长(分钟)</div>
+        </div>
+        <div class="stat-item">
+          <div class="stat-value">85%</div>
+          <div class="stat-label">正确率</div>
+        </div>
+      </div>
+    </div>
+
+    <!-- 卡片详情列表 -->
+    <div class="card-details">
+      <div class="section-title">卡片详情</div>
+
+      <!-- 卡片项 -->
+      <div class="card-item">
+        <div class="card-header">
+          <div class="card-title">华夏美食的秘密</div>
+          <div class="card-stats">
+            <span>用时: <strong>6s</strong></span>
+            <span>正确率: <strong>75%</strong></span>
+          </div>
+        </div>
+
+        <!-- 正面游戏统计 -->
+        <div class="game-stats">
+          <div class="game-type">卡正面游戏</div>
+          <div class="game-accuracy">正确 <strong>2/6</strong></div>
+        </div>
+
+        <div class="card-results">
+          <div class="result-item correct">√</div>
+          <div class="result-item correct">√</div>
+          <div class="result-item wrong">×</div>
+          <div class="result-item wrong">×</div>
+          <div class="result-item wrong">×</div>
+          <div class="result-item wrong">×</div>
+        </div>
+
+        <!-- 反面游戏统计 -->
+        <div class="game-stats">
+          <div class="game-type">卡反面游戏</div>
+          <div class="game-accuracy">正确 <strong>2/6</strong></div>
+        </div>
+
+        <div class="card-results">
+          <div class="result-item correct">√</div>
+          <div class="result-item correct">√</div>
+          <div class="result-item wrong">×</div>
+          <div class="result-item correct">√</div>
+          <div class="result-item correct">√</div>
+          <div class="result-item wrong">×</div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script lang="ts" setup>
+// 这里可以添加需要的数据和方法
+</script>
+
+<style lang="less" scoped>
+@import '@/styles/var.less';
+.report-page {
+  max-width: 800px;
+  margin: 0 auto;
+  padding: 20px;
+  color: #333;
+  font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
+  background-color: @page-color;
+}
+
+.page-title {
+  padding: 8px;
+  box-sizing: border-box;
+  text-align: center;
+  color: @main-color;
+  font-size: 28px;
+  font-weight: 600;
+  position: relative;
+  background-color: #fff;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.section-title {
+  width: 100%;
+  font-size: 18px;
+  font-weight: 600;
+  color: #000;
+  font-weight: 600;
+  position: relative;
+  display: inline-block;
+  text-align: left;
+}
+
+// 卡片容器通用样式
+.card-container {
+  margin-top: 12px;
+}
+
+.card-header {
+  display: flex;
+  align-items: center;
+  margin-bottom: 16px;
+  color: #000;
+  border-bottom: 0.5px solid #ebeaea;
+  padding-bottom: 6px;
+}
+
+// 卡片标签样式
+.tags-container {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 12px;
+  margin: 16px 0;
+  border-radius: 12px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
+  padding: 16px;
+  background-color: #fff;
+
+  .tag {
+    background-color: #e8f5e9;
+    color: @main-color;
+    padding: 8px 16px;
+    border-radius: 20px;
+    font-size: 14px;
+    display: inline-block;
+  }
+}
+
+// 数据总览样式
+.data-overview {
+
+  .stats-container {
+    background-color: #fff;
+    display: grid;
+    grid-template-columns: repeat(4, 1fr);
+    gap: 16px;
+    margin-top: 16px;
+    padding: 16px;
+    border-radius: 12px;
+    padding: 16px;
+    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
+    @media (max-width: 768px) {
+      grid-template-columns: repeat(2, 1fr);
+    }
+
+    .stat-item {
+      background-color: #f0f8f3;
+      border-radius: 12px;
+      padding: 20px;
+      text-align: center;
+
+      .stat-value {
+        font-size: 24px;
+        font-weight: 600;
+        color: @main-color;
+        margin-bottom: 8px;
+      }
+
+      .stat-label {
+        font-size: 14px;
+        color: #666;
+      }
+    }
+  }
+}
+
+// 卡片详情样式
+.card-details {
+  margin: 16px 0;
+  .card-item {
+    background-color: #fff;
+    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
+    border-radius: 12px;
+    padding: 16px;
+    margin-top: 16px;
+    margin-bottom: 16px;
+
+    .card-header {
+      width: 100%;
+      display: flex;
+      justify-content: space-between ;
+      align-items: center ;
+      margin-bottom: 16px;
+
+      .card-title {
+        font-size: 16px;
+        font-weight: 600;
+        color: @main-color;
+      }
+
+      .card-stats {
+        font-size: 14px;
+        color: #666;
+        display: flex;
+        gap: 16px;
+
+        strong {
+          color: @main-color;
+        }
+      }
+    }
+
+    .card-results {
+      display: flex;
+      gap: 12px;
+
+      .result-item {
+        width: 36px;
+        height: 36px;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        border-radius: 50%;
+        font-size: 20px;
+        font-weight: bold;
+
+        &.correct {
+          background-color: #e8f5e9;
+          color: @main-color;
+        }
+
+        &.wrong {
+          background-color: #ffebee;
+          color: #e53935;
+        }
+      }
+    }
+  }
+}
+
+// 游戏统计样式
+.game-stats {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin: 12px 0;
+
+  .game-type {
+    font-size: 14px;
+    font-weight: 500;
+    color: #666;
+  }
+
+  .game-accuracy {
+    font-size: 14px;
+    color: #666;
+
+    strong {
+      color: @main-color;
+      font-weight: 600;
+    }
+  }
+}
+</style>

+ 15 - 0
src/router/dist/index.js

@@ -0,0 +1,15 @@
+"use strict";
+exports.__esModule = true;
+var vue_router_1 = require("vue-router");
+var routes = [
+    {
+        path: '/index',
+        name: '首页',
+        component: function () { return Promise.resolve().then(function () { return require('@/pages/report/index.vue'); }); }
+    },
+];
+var router = vue_router_1.createRouter({
+    history: vue_router_1.createWebHistory(process.env.BASE_URL),
+    routes: routes
+});
+exports["default"] = router;

+ 6 - 10
src/router/index.ts

@@ -1,19 +1,15 @@
 import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
-import HomeView from '../views/HomeView.vue'
 
 const routes: Array<RouteRecordRaw> = [
   {
-    path: '/',
-    name: 'home',
-    component: HomeView
+    path: '/report',
+    name: '数据',
+    component: () => import('@/pages/report/index.vue')
   },
   {
-    path: '/about',
-    name: 'about',
-    // route level code-splitting
-    // this generates a separate chunk (about.[hash].js) for this route
-    // which is lazy-loaded when the route is visited.
-    component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
+    path: '/chat-records',
+    name: '聊天记录',
+    component: () => import('@/pages/chat-records/index.vue')
   }
 ]
 

+ 0 - 0
src/styles/var.css


+ 30 - 0
src/styles/var.less

@@ -0,0 +1,30 @@
+@width-1: 370px;
+
+@btn-width-big: 332px;
+
+@btn-height-big: 48px;
+
+@image-width: 107px;
+
+@image-width-2: 66px;
+
+@page-color: #f6f6f6;
+
+@price-color: #f13f26;
+
+@main-color: #19c865;
+
+@fs-0: 14px;
+
+@fs-1: 16px;
+
+@fs-2: 18px;
+
+@desc-color: #b8b4b4;
+
+@color: #39bb25;
+
+@border-radius: 10px;
+
+
+@border-radius-big: 24px;

+ 0 - 5
src/views/AboutView.vue

@@ -1,5 +0,0 @@
-<template>
-  <div class="about">
-    <h1>This is an about page</h1>
-  </div>
-</template>

+ 0 - 18
src/views/HomeView.vue

@@ -1,18 +0,0 @@
-<template>
-  <div class="home">
-    <img alt="Vue logo" src="../assets/logo.png">
-    <HelloWorld msg="Welcome to Your Vue.js + TypeScript App"/>
-  </div>
-</template>
-
-<script lang="ts">
-import { Options, Vue } from 'vue-class-component'
-import HelloWorld from '@/components/HelloWorld.vue' // @ is an alias to /src
-
-@Options({
-  components: {
-    HelloWorld
-  }
-})
-export default class HomeView extends Vue {}
-</script>

+ 37 - 10
yarn.lock

@@ -1343,6 +1343,16 @@
     "@typescript-eslint/types" "5.62.0"
     eslint-visitor-keys "^3.3.0"
 
+"@vant/popperjs@^1.3.0":
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/@vant/popperjs/-/popperjs-1.3.0.tgz#e0eff017124b5b2352ef3b36a6df06277f4400f2"
+  integrity sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==
+
+"@vant/use@^1.6.0":
+  version "1.6.0"
+  resolved "https://registry.npmmirror.com/@vant/use/-/use-1.6.0.tgz#237df3091617255519552ca311ffdfea9de59001"
+  integrity sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA==
+
 "@vue/babel-helper-vue-jsx-merge-props@^1.4.0":
   version "1.4.0"
   resolved "https://registry.npmmirror.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz#8d53a1e21347db8edbe54d339902583176de09f2"
@@ -5136,7 +5146,7 @@ nth-check@^2.0.1:
   dependencies:
     boolbase "^1.0.0"
 
-object-assign@^4.0.1:
+object-assign@>=4.0.1, object-assign@^4.0.1:
   version "4.1.1"
   resolved "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
   integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
@@ -5651,6 +5661,14 @@ postcss-ordered-values@^5.1.3:
     cssnano-utils "^3.1.0"
     postcss-value-parser "^4.2.0"
 
+postcss-px-to-viewport@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/postcss-px-to-viewport/-/postcss-px-to-viewport-1.1.1.tgz#a25ca410b553c9892cc8b525cc710da47bf1aa55"
+  integrity sha512-2x9oGnBms+e0cYtBJOZdlwrFg/mLR4P1g2IFu7jYKvnqnH/HLhoKyareW2Q/x4sg0BgklHlP1qeWo2oCyPm8FQ==
+  dependencies:
+    object-assign ">=4.0.1"
+    postcss ">=5.0.2"
+
 postcss-reduce-initial@^5.1.2:
   version "5.1.2"
   resolved "https://registry.npmmirror.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6"
@@ -5702,15 +5720,7 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0:
   resolved "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
   integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
 
-postcss@^7.0.36:
-  version "7.0.39"
-  resolved "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309"
-  integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==
-  dependencies:
-    picocolors "^0.2.1"
-    source-map "^0.6.1"
-
-postcss@^8.2.6, postcss@^8.3.5, postcss@^8.4.33, postcss@^8.4.48:
+postcss@>=5.0.2, postcss@^8.2.6, postcss@^8.3.5, postcss@^8.4.33, postcss@^8.4.48:
   version "8.5.3"
   resolved "https://registry.npmmirror.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb"
   integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==
@@ -5719,6 +5729,14 @@ postcss@^8.2.6, postcss@^8.3.5, postcss@^8.4.33, postcss@^8.4.48:
     picocolors "^1.1.1"
     source-map-js "^1.2.1"
 
+postcss@^7.0.36:
+  version "7.0.39"
+  resolved "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309"
+  integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==
+  dependencies:
+    picocolors "^0.2.1"
+    source-map "^0.6.1"
+
 prelude-ls@^1.2.1:
   version "1.2.1"
   resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
@@ -6934,6 +6952,15 @@ validate-npm-package-license@^3.0.1:
     spdx-correct "^3.0.0"
     spdx-expression-parse "^3.0.0"
 
+vant@^4.9.19:
+  version "4.9.19"
+  resolved "https://registry.npmmirror.com/vant/-/vant-4.9.19.tgz#315bebe0e8a58237c8fffaec2d1c162b9f112a23"
+  integrity sha512-fRt32XI0fO0vB3/YGhZOpTnHKjplUiNuA05yZy8rPZntmbQE5GA57Y7iC7jmMDxSOaLebovynhgCvWnyk9zmDw==
+  dependencies:
+    "@vant/popperjs" "^1.3.0"
+    "@vant/use" "^1.6.0"
+    "@vue/shared" "^3.5.13"
+
 vary@~1.1.2:
   version "1.1.2"
   resolved "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"