【全栈】SprintBoot+vue3迷你商城(9)

莱莱  论坛元老 | 2025-1-26 12:46:25 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1026|帖子 1026|积分 3078

【全栈】SprintBoot+vue3迷你商城(9)

往期的文章都在这里啦,各人有兴趣可以看一下
后端部分:
【全栈】SprintBoot+vue3迷你商城(1)
【全栈】SprintBoot+vue3迷你商城(2)
【全栈】SprintBoot+vue3迷你商城-扩展:使用python爬虫爬取商品数据
【全栈】SprintBoot+vue3迷你商城(3)
【全栈】SprintBoot+vue3迷你商城(4)
【全栈】SprintBoot+vue3迷你商城(5)
【全栈】SprintBoot+vue3迷你商城(6)
前端部分:
【全栈】SprintBoot+vue3迷你商城-扩展:vue的基本用法
【全栈】SprintBoot+vue3迷你商城-扩展:vue3项目创建及目次先容
【全栈】SprintBoot+vue3迷你商城(7)
【全栈】SprintBoot+vue3迷你商城(8)
本期我们来写用户基本信息显示以及购物车显示的页面

  
1.用户基本信息显示页面的开发

1.1.搭建页面,绑定数据与函数

/src/views/user/UserInfo.vue
  1. <script lang="ts" setup>
  2. import { ref } from 'vue'
  3. import { ElMessage } from 'element-plus'
  4. import { Plus } from '@element-plus/icons-vue'
  5. import type { UploadProps } from 'element-plus'
  6. import { useUserInfoStore } from '@/stores/userInfo';
  7. const userInfoStore = useUserInfoStore();
  8. const userInfoModel= ref(userInfoStore.info)
  9. const imageUrl = ref('')
  10. const handleAvatarSuccess: UploadProps['onSuccess'] = (
  11.   response,
  12.   uploadFile
  13. ) => {
  14.   imageUrl.value = URL.createObjectURL(uploadFile.raw!)
  15. }
  16. const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
  17.   if (rawFile.type !== 'image/jpeg') {
  18.     ElMessage.error('Avatar picture must be JPG format!')
  19.     return false
  20.   } else if (rawFile.size / 1024 / 1024 > 2) {
  21.     ElMessage.error('Avatar picture size can not exceed 2MB!')
  22.     return false
  23.   }
  24.   return true
  25. }
  26. const activeIndex = ref('1')
  27. const handleSelect = (key: string, keyPath: string[]) => {
  28.   console.log(key, keyPath)
  29. }
  30. import { useRouter } from 'vue-router';
  31. const router=useRouter();
  32. import { Avatar,  SwitchButton } from '@element-plus/icons-vue';
  33. import { useTokenStore } from '@/stores/token';
  34. const tokenStore=useTokenStore();
  35. const showLogoutDialog = ref(false);
  36. const logout = () => {
  37.   ElMessage.success('成功退出登录');
  38.   tokenStore.removeToken();
  39.   router.push('/login');
  40.   showLogoutDialog.value = false;
  41. };
  42. const handleClose = (done) => {
  43.   ElMessage({
  44.     message: '对话框已关闭',
  45.     type: 'warning'
  46.   });
  47.   done();
  48. };
  49. </script>
  50. <template>
  51.   <div class="common-layout">
  52.     <el-container class="bg">
  53.       <el-header>
  54.         <el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" :ellipsis="false"
  55.           @select="handleSelect">
  56.           <el-menu-item index="0" @click="router.push('/')">
  57.             <el-icon><ShoppingTrolley /></el-icon>
  58.             <img style="width: 100px" src="@/assets/logo2.jpg" alt="logo" />
  59.           </el-menu-item>
  60.           <span style="font-size: medium;">
  61.               <el-avatar style="margin-top:5px" :src="userInfoModel.userPic"  />
  62.             
  63.             {{ userInfoModel.userType }}:{{ userInfoModel.username }}
  64.           </span>
  65.           <el-menu-item index="1" @click="router.push('/user/info')"><el-icon>
  66.               <Avatar />
  67.             </el-icon>我的</el-menu-item>
  68.           <el-sub-menu index="2">
  69.             <template #title>工具栏</template>
  70.             <el-menu-item v-if="userInfoModel.userType==='商家'" index="2-1" @click="router.push('/user/goods')">我的商品</el-menu-item>
  71.             <el-menu-item index="2-2" @click="router.push('/user/cart')">购物车</el-menu-item>
  72.             <el-menu-item index="2-3" @click="showLogoutDialog = true;">
  73.                             <el-icon>
  74.                                 <SwitchButton />
  75.                             </el-icon>
  76.                             退出登录
  77.                         </el-menu-item>
  78.           </el-sub-menu>
  79.         </el-menu>
  80.         <el-dialog title="确认退出登录" v-model="showLogoutDialog" width="30%" :before-close="handleClose">
  81.               <span>确定要退出登录吗?</span>
  82.               <template #footer>
  83.                 <span class="dialog-footer">
  84.                   <el-button @click="showLogoutDialog = false">取消</el-button>
  85.                   <el-button type="primary" @click="logout">确定</el-button>
  86.                 </span>
  87.               </template>
  88.             </el-dialog>
  89.       </el-header>
  90.       <el-main>
  91.         <el-card class="page-container" style="background-color: coral;">
  92.           <template #header>
  93.             <div class="header">
  94.               <span>基本资料</span>
  95.             </div>
  96.           </template>
  97.           <p>用户头像:</p>
  98.           <el-upload class="avatar-uploader" action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
  99.             :show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload">
  100.             <img v-if="userInfoModel.userPic" :src="userInfoModel.userPic" class="avatar" />
  101.             <el-icon v-else class="avatar-uploader-icon">
  102.               <Plus />
  103.             </el-icon>
  104.           </el-upload>
  105.           <el-row>
  106.             <el-col :span="12">
  107.               <el-form label-width="100px" size="large">
  108.                 <el-form-item label="用户名">
  109.                   <el-input disabled :value="userInfoModel.username"></el-input>
  110.                 </el-form-item>
  111.                 <el-form-item label="用户类型">
  112.                   <el-input :value="userInfoModel.userType"></el-input>
  113.                 </el-form-item>
  114.                 <el-form-item label="用户手机号">
  115.                   <el-input :value="userInfoModel.phoneNumber"></el-input>
  116.                 </el-form-item>
  117.                 <el-form-item>
  118.                   <el-button type="primary">提交修改</el-button>
  119.                 </el-form-item>
  120.               </el-form>
  121.             </el-col>
  122.           </el-row>
  123.         </el-card>
  124.       </el-main>
  125.     </el-container>
  126.   </div>
  127.   <hr>
  128.   <div style="width: 300px;height: 200px;margin-left: auto;margin-right: auto;">
  129.     <div style="margin-top: 100px;">
  130.       <p style="text-align: center;margin-top: 10px;filter: opacity(50%);font-size: small;">迷你商城,本网站为练习网站。
  131.         本站商品全在淘宝:"https://www.taobao.com"中获取,若对站内商品感兴趣,请到淘宝搜索相关商品并购买</p>
  132.     </div>
  133.   </div>
  134. </template>
  135. <style>
  136. .avatar-uploader .avatar {
  137.   width: 178px;
  138.   height: 178px;
  139.   display: block;
  140. }
  141. </style>
  142. <style>
  143. .avatar-uploader .el-upload {
  144.   margin-bottom: 100px;
  145.   margin-left: 200px;
  146.   border: 1px dashed var(--el-border-color);
  147.   border-radius: 6px;
  148.   cursor: pointer;
  149.   position: relative;
  150.   overflow: hidden;
  151.   transition: var(--el-transition-duration-fast);
  152. }
  153. .avatar-uploader .el-upload:hover {
  154.   border-color: var(--el-color-primary);
  155. }
  156. .el-icon.avatar-uploader-icon {
  157.   font-size: 28px;
  158.   color: #8c939d;
  159.   width: 178px;
  160.   height: 178px;
  161.   text-align: center;
  162. }
  163. .el-menu--horizontal>.el-menu-item:nth-child(1) {
  164.   margin-right: auto;
  165. }
  166. .bg {
  167.   background-color: pink;
  168. }
  169. .el-menu-demo {
  170.   background-color: coral;
  171. }
  172. </style>
复制代码
1.2.制定与后端接口交互的函数

/src/api/user.js
  1. export const userInfoService=()=>{
  2.     return request.get('/user/userInfo');
  3. }
复制代码
1.3.效果展示


2.购物车显示的页面开发

2.1.搭建页面,绑定数据与函数

/src/views/user/UserCart.vue
  1. <script lang="ts" setup>
  2. import { ref } from 'vue'
  3. import { useRouter } from 'vue-router';
  4. const router=useRouter();
  5. const activeIndex = ref('2-2')
  6. const handleSelect = (key: string, keyPath: string[]) => {
  7.   console.log(key, keyPath)
  8. }
  9. import { useUserInfoStore } from '@/stores/userInfo';
  10. const userInfoStore = useUserInfoStore();
  11. const userInfoModel= ref(userInfoStore.info)
  12. import {userCartService} from '@/api/user'
  13. const userCartList=ref([])
  14. const userCart=async()=>{
  15.   let result = await userCartService();
  16.   userCartList.value=result.data;
  17.   }
  18. userCart();
  19. import { ElMessage } from 'element-plus';
  20. import { Avatar,  SwitchButton } from '@element-plus/icons-vue';
  21. import { useTokenStore } from '@/stores/token';
  22. const tokenStore=useTokenStore();
  23. const showLogoutDialog = ref(false);
  24. const logout = () => {
  25.   ElMessage.success('成功退出登录');
  26.   tokenStore.removeToken();
  27.   router.push('/login');
  28.   showLogoutDialog.value = false;
  29. };
  30. const handleClose = (done) => {
  31.   ElMessage({
  32.     message: '对话框已关闭',
  33.     type: 'warning'
  34.   });
  35.   done();
  36. };
  37. </script>
  38. <template>
  39.   <div class="common-layout">
  40.     <el-container class="bg">
  41.       <el-header>
  42.         <el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" :ellipsis="false"
  43.           @select="handleSelect">
  44.           <el-menu-item index="0" @click="router.push('/')">
  45.             <el-icon><ShoppingTrolley /></el-icon>
  46.             <img style="width: 100px" src="@/assets/logo2.jpg" alt="logo" />
  47.           </el-menu-item>
  48.           <span style="font-size: medium;">
  49.               <el-avatar style="margin-top:5px" :src="userInfoModel.userPic"  />
  50.             
  51.             {{ userInfoModel.userType }}:{{ userInfoModel.username }}
  52.           </span>
  53.           <el-menu-item index="1" @click="router.push('/user/info')"><el-icon>
  54.               <Avatar />
  55.             </el-icon>我的</el-menu-item>
  56.           <el-sub-menu index="2">
  57.             <template #title>工具栏</template>
  58.             <el-menu-item v-if="userInfoModel.userType==='商家'" index="2-1" @click="router.push('/user/goods')">我的商品</el-menu-item>
  59.             <el-menu-item index="2-2" @click="router.push('/user/cart')">购物车</el-menu-item>
  60.             <el-menu-item index="2-3" @click="showLogoutDialog = true;">
  61.                             <el-icon>
  62.                                 <SwitchButton />
  63.                             </el-icon>
  64.                             退出登录
  65.                         </el-menu-item>
  66.           </el-sub-menu>
  67.         </el-menu>
  68.         <el-dialog title="确认退出登录" v-model="showLogoutDialog" width="30%" :before-close="handleClose">
  69.               <span>确定要退出登录吗?</span>
  70.               <template #footer>
  71.                 <span class="dialog-footer">
  72.                   <el-button @click="showLogoutDialog = false">取消</el-button>
  73.                   <el-button type="primary" @click="logout">确定</el-button>
  74.                 </span>
  75.               </template>
  76.             </el-dialog>
  77.       </el-header>
  78.       <el-main>
  79.         <div style="font-size: 50px;">
  80.           <el-icon><ShoppingTrolley /></el-icon>
  81.           购物车
  82.         
  83.         </div>
  84.         <el-descriptions direction="vertical" border style="margin-top: 20px" v-for="userCartModel in userCartList">
  85.           <el-descriptions-item :rowspan="2" :width="140" label="商品图片" align="center">
  86.             <el-image style="width: 100px; height: 100px"
  87.               :src="userCartModel.goodsImgUrl" />
  88.           </el-descriptions-item>
  89.          
  90.          <el-descriptions-item label="商品名/价格">
  91.           {{ userCartModel.goodsName }}
  92.           <span style="font-size: large;margin-left: 100px;">{{userCartModel.goodsPrice}}¥</span>
  93.         </el-descriptions-item>
  94.           <el-descriptions-item label="商家">{{ userCartModel.merchantName }}</el-descriptions-item>
  95.         </el-descriptions>
  96.       </el-main>
  97.     </el-container>
  98.   </div>
  99.   <hr>
  100.   <div style="width: 300px;height: 200px;margin-left: auto;margin-right: auto;">
  101.     <div style="margin-top: 100px;">
  102.       <p style="text-align: center;margin-top: 10px;filter: opacity(50%);font-size: small;">迷你商城,本网站为练习网站。
  103.         本站商品全在淘宝:"https://www.taobao.com"中获取,若对站内商品感兴趣,请到淘宝搜索相关商品并购买</p>
  104.     </div>
  105.   </div>
  106. </template>
  107. <style>
  108. .el-menu--horizontal>.el-menu-item:nth-child(1) {
  109.   margin-right: auto;
  110. }
  111. .bg {
  112.   background-color: pink;
  113. }
  114. .el-menu-demo {
  115.   background-color: coral;
  116. }
  117. </style>
复制代码
2.2.制定与后端接口交互的函数

/src/api/user.js
  1. export const userCartService=()=>{
  2.     return request.get('/user/cart');
  3. }
复制代码
2.3.效果展示


3.总结

本期我们举行了用户基本信息显示与购物车显示的页面的开发,下期我们将搭建其余基本的页面。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表