端午假期整理了仿天猫H5 APP项目vue.js+express+mongo

news2024/11/18 23:45:05

效果

请添加图片描述

源码

源码太多,放github上了点击

遇到的问题

连接mongodb数据库多个集合(model文件)

  1. mongodb与mysql数据库连接不同,sql在定义查询语句时可以连接不同的表
  2. mongodb需要在开始定义好连接要用到的表
module.exports = {
    dbProduct: mongoose.model('runoob',mongoSchema,'product'),
    dbRotation: mongoose.model('runoob',mongoSchema,'rotation'),
    dbUsers:mongoose.model('runoob',mongoSchema,'users'),
  };

发送验证码需要开启QQ邮箱SMTP(email文件)

  • 登录QQ邮箱
  • 点击左上角设置
  • 选择账户栏往下翻
  • 有一个POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务栏,选择IMAP/SMTP服务开启选项,如图.记得记录给你的授权码,填入pass
// 创建发送邮件对象
let transporter=nodemailer.createTransport({
    service:'qq',
    secure: true,
    auth:{
        user:'XXX@qq.com',  // QQ邮箱
        pass:'XXXXXXX',  // 授权码
    },
})

在通用返回组件通过获取当前激活路由信息来改变界面标题(components文件夹)

this.$route.meta.title;

在底部通用导航中,通过获取路由携带的信息来渲染底部组件(components文件夹)

<template>
  <div class="my-tabbar">
   <my-tabbar :list="list" selectedColor="#f00"></my-tabbar>
  </div>
</template>

<script>
/***************************/
/* 应用中各页面复用的tabbar */
/***************************/
import routes from '@/router/router' // 从router中获取信息
export default {
    name: 'app-tab-bar',
    computed:{
      list(){
        return routes.filter(route=>route.meta?.inTabbar).map(item=>({ // 循环遍历拿到信息
          pagePath: item.path,
          text: item.meta.title,
          icon: item.meta.icon,
        }))
      },
    },
}
</script>

<style lang="less">
</style>

根据路由激活后isActive来确定是否选中(components文件夹)

:class="['tab-bar-item', isActive && 'router-link-active', isExactActive && 'router-link-exact-active']"

只有isActive,isExactActive为真才会有属性router-link-active,router-link-exact-active也就是渲染样式

放置全局前置守卫来判定是否登录(router文件夹)

// 全局前置路由守卫,实现页面拦截
router.beforeEach((to,from,next)=>{
  if(to.meta?.permission){ // 在登录后才能访问的路由中有meta={permission:true}
    if(store.state.shoppingCart.token){
      next()
    }else{
      next('/login')
    }
  }else{
    next()
  }
})
  • to要到达的路由
  • from从那个路由来
  • next下一步(无论哪种状态都必须执行下一步操作,不然会阻止程序继续执行)

store仓库,仓库中的数据在启用命名空间后只能在store中进行更改,并且调用时要加上仓库名称

  • 启用命名空间
namespaced: true, // 命名空间(名字空间) 
  • 配置文件也有相应配置
export default new Vuex.Store({
  strict: process.env.NODE_ENV !== 'production', // 启用严格模式,保证在mutation中更改数据
  modules: {
    shoppingCart, //shoppingCart 是这个模块命名空间
  },
  plugins: [createPersistedState({
    storage: sessionStorage, // 默认是向 localStorage 中保存数据
    paths:[
      'shoppingCart.token',
      'shoppingCart.name',
    ],
  })],
})
  • 调用store时要加上名字
import { mapActions,mapGetters } from 'vuex' // 引入映射
export default {
  name:'cart',
  computed:{
    carts(){
      return this.$store.state.shoppingCart.carts
    },
    ...mapGetters('shoppingCart',['allChecked','allMoney']), // 前面加入模块名shoppingCart
  },
  methods:{
    ...mapActions('shoppingCart',['removeCart','changNumCart','changCheckedSingle','changCheckedAll']), 
    // 前面加入模块名shoppingCart
    onSubmit(){
      console.log("提交订单");
    },
    onClickEditAddress(){
      console.log('修改地址');
    },
  },
}

分类页面刚进入就显示商品信息

 created(){
    this.$router.push({
      name:'sub',
      params:{
        name:this.navList[0],
      },
    })
  },

也就是在分类页面加载好后即向子路由发送网络请求拿到第一个分类商品中的数据

项目结构

  • BE(back-end后端)
    • bin 后端启动目录
      • www
    • email
      • email.js(发送验证码)
    • model
      • index.js(配置连接数据库)
    • public(默认的一些样式)
    • routes
      • index.js(公共的获取商品数据和轮播图)
      • private.js(私有的需要登录后获取用户信息)
      • user.js(登录与注册模块)
    • views(默认配置视图)
    • app.js(入口文件)
    • config.js(密钥存放文件)
    • package-lock.json(配置文件)
    • package.json(三方包资源)
  • dist(打包文件存放)
  • public (前端启动目录)
    • favicon.ico(图标存放)
    • index.html(前端主界面)
  • src(前端资源存放)
    • api(网络资源统一适配)
      • constants.js(前端放送网络请求用到的接口)
      • rotation.js(获取轮播图与商品模块)
      • search.js(搜索模块)
      • user.js(处理与用户信息相关模块)
    • assets(存放静态资源)
    • components (存放组件)
      • app-nav-bar(同步返回通用组件)
        • index.vue
      • app-tab-bar(拿到路由中信息并处理)
        • index.vue
      • tab-bar (其他一些组件)
        • index.vue(自定义插件)
        • search.vue(搜索功能,除主界面使用)
        • search-box.vue(搜索功能,主界面使用)
        • tab-bar.vue (底部导航)
    • router(路由)
      • index.js(路由模块)
      • router.js(路由分配)
    • store(仓库)
      • modules
        • shopping-cart.js(购物车逻辑处理模块)
      • index.js(仓库配置)
    • utils(工具模块)
      • request.js(封装axios)
      • vant-import.js(引入vant组件)
    • views(视图模块)
      • cart
        • index.vue(购物车视图)
      • category
        • index.vue(商品分类左边)
        • sub-category.vue(商品分类右边)
      • detail
        • index.vue(商品详情)
      • home
        • index.vue(主界面)
      • login
        • index.vue(登录与注册)
      • mine
        • changAvatar.vue(更改用户头像)
        • index.vue(我的页面)
      • not-found
        • index.vue(路径错误是404界面)
      • searchResult
        • searchResult.vue(搜索结果页面)
    • app.vue(主界面)
    • main.js(入口配置文件)
  • babel.config.js(配置文件)
  • jsconfig.json(JS配置文件)
  • package-lock.json(配置文件)
  • package.json(三方包资源)
  • vue.config.js(vue配置文件)

移动端适配

直接通过PC端写的代码在移动端不同的设备上,布局会出现问题

让不同设备的视口取得最佳CSS像素

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">

安装 postcss,postcss-pxtorem,postcss-loader,postcss-import,postcss-url一系列插件

npm install postcss@8.2.6 --save
npm install postcss-import@14.0.0 --save
npm install postcss-loader@5.0.0 --save
npm install postcss-pxtorem@5.1.1 --save
npm install postcss-url@10.1.1 --save

在项目根目录下添加 .postcssrc.js 文件

module.exports = {
  plugins: {
    'postcss-pxtorem': {
      rootValue: 32, //根目录的字体大小设为32px
      propList: ['*'], //proplist:是那些属性需要转换成rem,全部
      minPixelValue: 2 //最小转换单位.2px
    }
  }
};

在项目中index.html的头部添加下面这段js代码:

<script>(function () {
    function autoRootFontSize() {
      document.documentElement.style.fontSize = Math.min(screen.width, document.documentElement
        .getBoundingClientRect().width) / 470 * 32 + 'px';
      // 取screen.width和document.documentElement.getBoundingClientRect().width的最小值;
      // 除以470,乘以32;意思就是相对于470大小的32px;
    }
    window.addEventListener('resize', autoRootFontSize);
    autoRootFontSize();
  })();</script>

注:设计师制作的效果图常为750px,为了方便直接读取UI标好的像素大小,根目录的字体大小就设置为32px;

打包

HBuilder X

新建项目

  • 文件 => 新建 => 项目
  • 选择模板请添加图片描述
  • 将打包好的dist里面的文件放入到项目里

调试

  • 可以先连接手机,打开手机开发者模式,打开usb调试
  • HBuilder X 运行 => 运行到手机或模拟器 => 运行到Android App基座
  • 会在手机上安装一个调试工具,安装后点击运行就能在手机上看到效果

打包

  • 配置manifest.json
  • 配置应用标识(一般自带)

请添加图片描述

  • 配置应用图标
    请添加图片描述

  • 点击 发行 => 原生App-云打包

  • 如果没有账号的话,需要先注册个账号(邮箱和电话必须验证)

  • 打包配置
    请添加图片描述

  • 如果打包出现要实名认证可以取消通讯录
    请添加图片描述

  • 打包成功
    请添加图片描述

  • 点击地址下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/409366.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

echarts-wordcloud 血泪总结使用说明 (配置项及其不足点优化)

基本使用方法 echarts-wordcloud是基于echarts的一个词云库&#xff0c;是我常用的一个组件&#xff0c;业务上用的多一点&#xff0c;但是这个库在echarts的官网文档里面没有说明&#xff0c;git上的说明也很少&#xff0c;有些配置需要自己摸索&#xff0c;下面都是我的血泪…

css动画效果

动画1&#xff08;沿着椭圆转动&#xff09; 其实是个2D转动&#xff0c;只不过咱们设置椭圆&#xff0c;然后加上scale缩放&#xff08;近大远小&#xff09;&#xff0c;看上去就是3D效果 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head…

使用Node.js手撸一个建静态Web服务器,内部CV指南

文章里有全部代码&#xff0c;也可以积分下载操作步骤如上图文章结束 话说这个键盘真漂亮~~ 文章目录使用Node.js手撸一个建静态Web服务器一、动静态服务器的概念1.1 静态Web服务器概念1.2 静态Web服务器的优点1.3 快速搭建的途径二、 手撸指南2.1 框架搭建2.2 CtrlC/V2.3 启动…

Vue使用ElementUI对table的指定列进行合算

前言 最近有一个想法&#xff0c;就是记录自己花销的时候&#xff0c;table中有一项内容是花销的金额。然后想在table的底部有一项内容是该金额的总计。 然后我就顺着elementui的table组件寻找相关的demo&#xff0c;还真发现了一个这样的demo。 对于这个demo&#xff0c;官方…

css实现轮播图

轮播图&#xff1a;就是多张图片按照一定的时间和顺序依次从某个窗口来向用户展示图片 轮播图的实现代码&#xff1a; 1&#xff09;创建一个容器来进行轮播图的展示 这里的容器就是最外部的盒子 注意最外部盒子设置宽高时要与我们进行展示的图片的宽高保持一致&#xff0c…

npm i 安装不上依赖怎么办

起因 在github上下载的项目需要使用npm i来安装依赖。但是安装过程需要很久&#xff0c;然后安装完了又发现安装过程报错了。导致项目跑不起来。原因是某些依赖没有成功的安装上去 解决办法&#xff08;依次试&#xff0c;每次试新的命令最好把上次安装node_modules删掉&#…

threejs三维地图大屏项目分享

这是最近公司的一个项目。客户的需求是基于总公司和子公司的数据&#xff0c;开发一个数据展示大屏。 大屏两边都是一些图表展示数据&#xff0c;中间部分是一个三维中国地图&#xff0c;点击中国地图的某个省份&#xff0c;可以下钻到省份地图的展示。 地图上&#xff0c;会做…

(Select)解决:Element-ui 中 Select 选择器下拉框样式及输入框样式的修改问题(背景色透明与悬停背景色变化与下拉框边距变化等操作)

Ⅰ、Element-ui 提供的组件与想要目标情况的对比&#xff1a; 1、Element-ui 提供组件情况&#xff1a; 其一、Element-ui 自提供的代码情况为(示例的代码)&#xff1a; // Element-ui 自提供的代码&#xff1a; <template><el-select v-model"value" pla…

JS对象详解

JS对象详解 js的对象是什么&#xff1f;js的对象类型有哪些&#xff1f;具体实例是什么&#xff1f; 一、ECMA-262对JS对象的定义&#xff1a; 属性的无序集合&#xff0c;每个属性存放一个原始值、对象或函数&#xff1b; 对象是无特定顺序的值的数组&#xff1b; 对象是一…

用 JSP 连接 MySQL 登入注册项目实践(JSP + HTML + CSS + MySQL)

目录 一、写在前面 二、效果图 三、实现思路 四、实现代码 1、login总界面 2、registercheck总代码 3、logoutcheck总代码 4、amendcheck总代码 相关文章 jsp实现简单登入注册界面功能用jsp实现简单登入注册界面功能&#xff08;css美化&#xff09;&#xff08;软件i…

【前端点击穿透】pointer-events属性详解

什么是pointer-events&#xff1f; pointer-events 属性是一个指针属性&#xff0c;是用于控制在什么条件下特定的图形元素可以成为指针事件的目标。 This CSS property,when set to “none” allows elements to not receive hover/click events,instead the event will occur…

使用Three.js实现web端显示点云

需要了解html、js、websocket的基本使用&#xff0c;建议浏览three.js文档中场景、渲染器、光源、相机以点模型、Buffergeometry的相关知识 第一步&#xff0c;创建html文件 <!DOCTYPE html> <html><head><meta charset"utf-8"><title&…

vue3+vite在main.ts或者main.js文件中引入/App.vue报错(/App.vue不是模块)

vscode报错&#xff1a;./APP.vue不是模块场景复现情况一、vue3.0js情况二、vue3.0ts方案一&#xff1a;根目录新建env.d.ts方案二&#xff1a;根目录新建tsconfig.jsonvue3报错提示 找不到模块“/App.vue”或其相应的类型声明 场景复现 在使用 vue3➕vite➕ts 或者 js 搭建前…

微信小程序--》从零实现小程序项目案例

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;微信小程序 &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&…

react-前端excel 文件/PDF文件 导入 --导出,照片上传

需要了解&#xff0c;new FormData() --上传时&#xff0c;将内容转为文件流 new FileReader()--base64压缩&#xff0c;目前不了解 一、excel文件导出 三种导出: 一种是纯粹前端导出&#xff1b;两种后端导出: 分为 后端给地址导出&#xff0c;还有就是文件流的形式导出&…

攻防世界web新手 - very_easy_sql(非常详细的wp)

文章目录攻防世界web新手XCTF - very_easy_sql知识点解题思路ssrf发现ssrf详解什么是ssrfssrf的利用产生SSRF漏洞的函数ssrf漏洞利用gopher协议报错注入查数据库查表查列名查内容分割读取攻防世界web新手XCTF - very_easy_sql 题目知识点确实很多&#xff0c;我想我这个wp大概…

【Vue全家桶】Vuex状态管理

&#x1f373;作者&#xff1a;贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛\color{#FF0000}{贤蛋 大眼萌 &#xff0c;一名很普通但不想普通的程序媛}贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛&#x1f933; &#x1f64a;语录&#xff1a;多一些不为什么的…

windows10下安装和配置nodejs环境

一、下载安装node.js 官方下载地址:下载最新LTS windows版本: 16.15.0 (includes npm 8.5.5) Node.js ,如下图安装可以更改安装路径(我的是默认地址C:\Program Files\) 其余的都是选择 下一步, 安装 测试是否安装 成功 打开开始菜单中输入cmd&#xff0c;打开cmd命令窗口&a…

微信小程序实现客服功能(客服消息)

纯前端操作&#xff0c;无后端接入的情况下实现此功能 1&#xff0c;需要一个按钮button&#xff0c;加上open-type“contact”属性 <button open-type"contact">咨询</button> 需在真机上测试&#xff0c;点击按钮就可以进入客服页面。 2&#xff0c…

猿创征文|前端之行,任重道远(来自大三学长的万字自述)

&#x1f9d1;‍&#x1f4bc;个人简介&#xff1a;本科大三学生、全栈领域优质创作者、华为云享专家、阿里云专家博主、第十三届蓝桥杯国赛三等奖获得者&#xff0c;拥有软件著作权1项。一个不甘平庸的平凡人&#x1f36c; &#x1f4d6; 前言 目前正值开学季&#xff0c;很多…