Ver código fonte

feat: 添加 arc-bottom.svg 资源,更新环境配置,优化个人页面和荣誉详情页样式,整合徽章和证书数据加载

EvilDragon 3 meses atrás
pai
commit
2250c3e5b1

+ 1 - 1
packages/app/env/.env.development

@@ -7,7 +7,7 @@ VITE_SHOW_SOURCEMAP = true
 
 VITE_SERVER_BASEURL = 'https://www.zhuchaohui.com'
 # VITE_SERVER_BASEURL = 'http://39.106.91.179:48080'
-# VITE_SERVER_BASEURL = 'http://192.168.2.34:48080'
+# VITE_SERVER_BASEURL = 'http://192.168.2.50:48080'
 # 王超
 # VITE_SERVER_BASEURL = 'http://192.168.2.39:48080'
 # VITE_SERVER_BASEURL = 'http://192.168.0.157:48080'

+ 3 - 0
packages/app/src/core/libs/net-images.ts

@@ -8,4 +8,7 @@ export enum NetImages {
   DefaultAvatar = 'https://image.zhuchaohui.com/zhucaohui/0b57771c2fbe60157e592a5b0e51a2b2b6c5263300663ad33efd55b235a2402a.png',
   InviteBg = 'https://image.zhuchaohui.com/zhucaohui/b8f5350f9c09c1210adfa1417aaba4160b583928765df14194be2227ee928305.png',
   Logo = 'https://image.zhuchaohui.com/zhucaohui/186acb6fdb8c8499c5ea77af317bfdab426edea94a009f8575877ab5179092d0.png',
+  TopSpotlight = 'https://image.zhuchaohui.com/zhucaohui/3a561f2dcbfd84474e44ff8f031c6ac749a874cb27c8a2f94f26a42a4633302b.png',
+  Stars = 'https://image.zhuchaohui.com/zhucaohui/dc15a86a2034ddc17e2825b56319902af1635c20e065919750ebbe51ee95f635.png',
+  HonorsHeader = 'https://image.zhuchaohui.com/zhucaohui/3945d2a7643317aca126c4b766139c4560c6ce2c051b7e03ee0ac664abe966c3.png',
 }

+ 7 - 9
packages/app/src/pages/mine/homepage/index.vue

@@ -251,19 +251,19 @@ defineExpose({
         {{ designerInfo?.designDesc }}
       </div>
 
-      <div class="h-10.5 relative mr--3.5">
+      <div class="h-[42px] relative mr--3.5">
         <div
-          class="h-full left-0 pl-20 pr-4 right-20 top-0 absolute bg-gradient-to-r from-[#ffe9e9] via-[#fff7f7] to-[#fff8f8] rounded-tl-md rounded-bl-md flex flex-col justify-center"
+          class="h-full left-0 pl-20 pr-6 right-20 top-0 bottom-0 absolute bg-gradient-to-r from-[#ffe9e9] via-[#fff7f7] to-[#fff8f8] rounded-tl-md rounded-bl-md flex flex-col justify-center"
         >
           <div class="">
             <div class="flex justify-between">
               <template v-for="(it, i) in [1, 2, 3, 4]" :key="i">
                 <div class="bg-[#fa9d3b]">
-                  <wd-img width="28" height="24" src=""></wd-img>
+                  <wd-img width="26" mode="widthFix" src=""></wd-img>
                 </div>
               </template>
-              <div>
-                <wd-img width="28" mode="widthFix" :src="more"></wd-img>
+              <div class="flex">
+                <wd-img custom-class="m-a" width="26" mode="widthFix" :src="more"></wd-img>
               </div>
             </div>
           </div>
@@ -277,12 +277,10 @@ defineExpose({
           荣誉徽章
         </div>
         <div
-          class="w-[76px] h-[30px] px-3 py-[3px] right-0 top-1.25 absolute bg-black/90 rounded-tl-[30px] rounded-bl-[30px] justify-center items-center gap-2.5 inline-flex"
+          class="w-[76px] h-[30px] px-3 right-0 top-1.5 absolute bg-black/90 rounded-tl-[30px] rounded-bl-[30px] justify-center items-center gap-2.5 inline-flex"
           @click="router.push('/pages/mine/honors/index')"
         >
-          <div
-            class="text-center text-white text-xs font-normal font-['PingFang_SC'] leading-normal"
-          >
+          <div class="text-center text-white text-xs font-normal font-['PingFang_SC']">
             查看荣誉
           </div>
         </div>

+ 45 - 46
packages/app/src/pages/mine/honors/detail/index.vue

@@ -11,6 +11,8 @@ import NavbarEvo from '@/components/navbar-evo.vue'
 import Card from '@/components/card.vue'
 import SectionHeading from '@/components/section-heading.vue'
 import { getBadges, getCertificates } from '../../../../core/libs/requests'
+import { Badge } from '../../../../core/libs/models'
+import { NetImages } from '@/core/libs/net-images'
 
 const active = ref('badge')
 const tabs = ref([
@@ -33,55 +35,52 @@ const { data: badges, run: setBadges } = useRequest(() => getBadges({}), {
 const { data: certificates, run: setCertificates } = useRequest(() => getCertificates({}), {
   initialData: [],
 })
-onMounted(async () => {
-  await setBadges()
-  await setCertificates()
-  console.log(badges.value)
+const data = ref<Badge | undefined>()
+onLoad(async (query: { data: string }) => {
+  data.value = JSON.parse(query.data) as Badge
+  console.log(data.value)
 })
 </script>
 <template>
-  <div class="flex-grow bg-gradient-to-b from-[#181614] to-[#0f0f0f] flex flex-col gap-4 p-3.5">
-    <NavbarEvo dark placeholder transparent></NavbarEvo>
-    <wd-tabs v-model="active">
-      <template v-for="(it, i) in tabs" :key="i">
-        <wd-tab :title="it.label" :name="it.value"></wd-tab>
-      </template>
-    </wd-tabs>
-    <template v-if="active === 'badge'">
-      <Card custom-class="border border-solid bg-[#25221f]! border-[rgba(255,236,185,0.20)]"></Card>
-      <template v-for="([key, it], index) in Object.entries(badges)" :key="index">
-        <Card
-          custom-class="bg-[#171615]! text-white border border-solid border-[rgba(255,236,185,0.20)]"
-        >
-          <div class="flex items-center gap-2 py-4">
-            <div class="w-1.5 h-1.5 bg-[#ffecb9] rounded-full"></div>
-            <SectionHeading :title="key.toString()" dark></SectionHeading>
-          </div>
-          <div class="grid grid-cols-3 gap-y-6">
-            <template v-for="(item, i) in it" :key="i">
-              <div class="w-full px-4 box-border">
-                <wd-img width="100%" mode="widthFix" :src="item.badgeNotObtainedImage"></wd-img>
-                <div
-                  class="text-center text-white text-xs font-normal font-['PingFang_SC'] leading-relaxed"
-                >
-                  <!-- 清华大学 -->
-                  {{ item.badgeName }}
-                </div>
-              </div>
-            </template>
-          </div>
-          <!-- {{ it }} -->
-        </Card>
-      </template>
-    </template>
-    <template v-if="active === 'certificate'">
-      <div>
-        <template v-for="(it, i) in certificates" :key="i">
-          <div class="grid grid-cols-2">
-            <wd-img width="100%" :src="it.certificateImage" mode="widthFix"></wd-img>
-          </div>
-        </template>
+  <div
+    class="flex-grow bg-[#100f18] backdrop-blur-2xl flex flex-col items-center justify-between py-32 gap-4 relative"
+  >
+    <div class="absolute top-0 left-0 right-0">
+      <wd-img
+        width="100%"
+        mode="widthFix"
+        custom-clas="vertical-bottom"
+        :src="NetImages.TopSpotlight"
+      ></wd-img>
+    </div>
+    <div class="absolute top-20 left-0 right-0 flex flex-col items-center">
+      <wd-img
+        width="40%"
+        mode="widthFix"
+        custom-clas="vertical-bottom mx-auto"
+        :src="NetImages.Stars"
+      ></wd-img>
+    </div>
+    <NavbarEvo fixed dark transparent></NavbarEvo>
+    <wd-img width="42%" mode="widthFix" :src="data.badgeYesObtainedImage"></wd-img>
+    <div class="flex flex-col items-center gap-1">
+      <div class="text-white text-[26px] font-normal font-['PingFang_SC'] uppercase">
+        东方研习营
       </div>
-    </template>
+      <div class="text-center text-white text-sm font-normal font-['PingFang_SC'] uppercase">
+        参加东方艺术设计研学营
+      </div>
+      <div class="mt-6 flex items-center gap-4">
+        <div class="w-4 h-0.25 bg-white"></div>
+        <div class="text-center text-white text-sm font-normal font-['PingFang_SC'] uppercase">
+          2024年10月2日获得
+        </div>
+        <div class="w-4 h-0.25 bg-white"></div>
+      </div>
+      <div class="text-center text-white text-sm font-normal font-['PingFang_SC'] uppercase">
+        累计参与3次
+      </div>
+    </div>
+    <wd-button custom-class="w-[161px] h-12 bg-[#0cbe7c]! rounded-[30px]">去分享</wd-button>
   </div>
 </template>

+ 126 - 5
packages/app/src/pages/mine/honors/index.vue

@@ -11,7 +11,12 @@ import NavbarEvo from '@/components/navbar-evo.vue'
 import Card from '@/components/card.vue'
 import SectionHeading from '@/components/section-heading.vue'
 import { getBadges, getCertificates } from '../../../core/libs/requests'
+import { useRouter } from '../../../core/utils/router'
+import arcBottom from '@designer-hub/assets/src/libs/assets/arcBottom'
+import { NetImages } from '../../../core/libs/net-images'
+import ProgressEvo from '@/components/progress-evo.vue'
 
+const router = useRouter()
 const active = ref('badge')
 const tabs = ref([
   { label: '徽章', value: 'badge' },
@@ -50,14 +55,127 @@ onMounted(async () => {
 </script>
 <template>
   <div class="flex-grow bg-gradient-to-b from-[#181614] to-[#0f0f0f] flex flex-col gap-4 p-3.5">
-    <NavbarEvo dark placeholder transparent></NavbarEvo>
-    <wd-tabs v-model="active">
+    <div class="aspect-[1.63/1] m--3.5 overflow-hidden relative">
+      <wd-img width="100%" mode="widthFix" :src="NetImages.HonorsHeader"></wd-img>
+      <div class="absolute left-7 bottom-6.5">
+        <div
+          class="text-white text-3xl font-bold font-['Alimama_ShuHeiTi'] leading-relaxed pr-2.5"
+          style="
+            background: linear-gradient(92deg, #fff 0.4%, #ffebb2 107.42%);
+            -webkit-background-clip: text;
+            background-clip: text;
+            -webkit-text-fill-color: transparent;
+          "
+        >
+          荣誉主页
+        </div>
+        <div class="mt-4 flex justify-between">
+          <template
+            v-for="(it, i) in [
+              { label: '获得徽章', value: 10, unit: '枚' },
+              { label: '获得证书', value: 10, unit: '个' },
+            ]"
+            :key="i"
+          >
+            <div class="flex flex-col items-center gap-1.25">
+              <div
+                class="text-center text-[#f6e8da]/80 text-xs font-normal font-['PingFang SC'] leading-snug"
+              >
+                {{ it.label }}
+              </div>
+              <div class="flex items-end gap-1">
+                <div class="text-center text-white text-2xl font-medium font-['DIN'] leading-6">
+                  {{ it.value }}
+                </div>
+                <div
+                  class="text-center text-[#f6e8da]/80 text-xs font-normal font-['PingFang SC'] leading-snug"
+                >
+                  {{ it.unit }}
+                </div>
+              </div>
+            </div>
+          </template>
+        </div>
+      </div>
+    </div>
+    <NavbarEvo dark fixed transparent></NavbarEvo>
+    <!-- <wd-tabs v-model="active">
       <template v-for="(it, i) in tabs" :key="i">
         <wd-tab :title="it.label" :name="it.value"></wd-tab>
       </template>
-    </wd-tabs>
+    </wd-tabs> -->
+    <div class="flex items-center justify-around">
+      <template v-for="(it, i) in tabs" :key="i">
+        <div class="flex flex-col items-center gap-1" @click="active = it.value">
+          <div
+            class="text-center font-normal font-['PingFang_SC']"
+            :class="`${it.value === active ? 'text-white text-lg leading-relaxed ' : 'text-white/60 text-base leading-normal'}`"
+          >
+            {{ it.label }}
+          </div>
+          <wd-img v-if="it.value === active" width="17" height="5.6" :src="arcBottom"></wd-img>
+        </div>
+      </template>
+    </div>
     <template v-if="active === 'badge'">
-      <Card custom-class="border border-solid bg-[#25221f]! border-[rgba(255,236,185,0.20)]"></Card>
+      <Card custom-class="border border-solid bg-[#25221f]! border-[rgba(255,236,185,0.20)]">
+        <div class="grid grid-cols-[90px_1fr] gap-x-4">
+          <div class="grid-row-start-1 grid-row-end-4 col-start-1">
+            <wd-img width="90" height="90" src="https://via.placeholder.com/86x91"></wd-img>
+          </div>
+          <div class="row-start-1 col-start-2 flex items-center justify-between">
+            <div
+              class="text-center text-[#ffecb9] text-lg font-normal font-['PingFang_SC'] leading-relaxed"
+            >
+              学习大师
+            </div>
+            <div
+              class="h-[26px] px-2.5 rounded-[30px] border border-solid border-[#ffecb9] justify-center items-center gap-2.5 inline-flex"
+            >
+              <div
+                class="text-center text-[#ffecb9] text-xs font-normal font-['PingFang_SC'] leading-relaxed"
+              >
+                获取条件
+              </div>
+            </div>
+          </div>
+          <div class="row-start-2 col-start-2">
+            <div
+              class="text-start text-white/60 text-xs font-normal font-['PingFang_SC'] leading-relaxed"
+            >
+              参加游学解锁典藏徽章
+            </div>
+          </div>
+          <div class="row-start-3 col-start-2 flex items-center gap-4">
+            <div class="flex-1">
+              <ProgressEvo
+                :height="5"
+                :model-value="0.2 * 100"
+                color="linear-gradient(90deg, #FFDA72 0%, #FFECB9 100%)"
+              ></ProgressEvo>
+            </div>
+            <div>
+              <span class="text-white text-xs font-normal font-['PingFang SC'] leading-none">
+                2
+              </span>
+              <span class="text-[#a1a1a1] text-xs font-normal font-['PingFang SC'] leading-none">
+                /8
+              </span>
+            </div>
+          </div>
+          <div class="row-start-4 col-start-1 flex items-center justify-center">
+            <div
+              class="w-[59px] h-[21px] px-2.5 bg-[#524c3b] rounded-[30px] shadow shadow-inner justify-center items-center gap-0.5 inline-flex"
+            >
+              <div
+                class="text-center text-[#ffecb9] text-[10px] font-normal font-['PingFang SC'] leading-relaxed"
+              >
+                获取榜
+              </div>
+            </div>
+          </div>
+        </div>
+      </Card>
       <template v-for="([key, it], index) in Object.entries(badges)" :key="index">
         <Card
           custom-class="bg-[#171615]! text-white border border-solid border-[rgba(255,236,185,0.20)]"
@@ -68,7 +186,10 @@ onMounted(async () => {
           </div>
           <div class="grid grid-cols-3 gap-y-6">
             <template v-for="(item, i) in it" :key="i">
-              <div class="w-full px-4 box-border">
+              <div
+                class="w-full px-4 box-border"
+                @click="router.push(`/pages/mine/honors/detail/index?data=${JSON.stringify(item)}`)"
+              >
                 <wd-img width="100%" mode="widthFix" :src="item.badgeNotObtainedImage"></wd-img>
                 <div
                   class="text-center text-white text-xs font-normal font-['PingFang_SC'] leading-relaxed"

+ 1 - 0
packages/app/src/pages/mine/index.vue

@@ -178,6 +178,7 @@ const handleClickScan = async () => {
     if (!features.value.checkInAtStoreTask) return router.push('/pages/mine/authentication/index')
     try {
       await storeAndPunchIn({ id: options.id })
+      // await storeAndPunchIn({ id: 24 })
       router.push(`/pages/mine/scan/result/index?result=${result}`)
     } catch (e) {
       if (e.code === 1000) {

+ 3 - 0
packages/assets/src/assets/arc-bottom.svg

@@ -0,0 +1,3 @@
+<svg width="17" height="6" viewBox="0 0 17 6" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path id="Vector" d="M14.8449 0.390247C13.176 2.15093 10.9238 3.12167 8.50003 3.12167C6.07669 3.12167 3.82377 2.15087 2.15515 0.390247C1.6808 -0.111353 0.890391 -0.131751 0.390316 0.34262C-0.110686 0.815756 -0.132203 1.60618 0.342091 2.10668C2.48682 4.37124 5.38445 5.61796 8.49996 5.61796C11.6161 5.61796 14.5131 4.37117 16.6578 2.10668C17.1322 1.60614 17.1106 0.815679 16.6102 0.34262C16.1097 -0.131731 15.3199 -0.110157 14.8449 0.390247Z" fill="#FFECB9"/>
+</svg>

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 26
packages/assets/src/assets/more.svg


+ 2 - 0
packages/assets/src/libs/assets/arcBottom.ts

@@ -0,0 +1,2 @@
+import arcBottom from '../../assets/arc-bottom.svg' 
+ export default arcBottom

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff