vue+element实现电商商城礼品代发网,商品、订单管理

news2025/6/22 18:33:11

一、项目效果图

1.首页

在这里插入图片描述

2.登录

在这里插入图片描述
版本2:
在这里插入图片描述

3.注册

在这里插入图片描述

4.找回密码

在这里插入图片描述

5.立即下单

在这里插入图片描述

6.商品详情

在这里插入图片描述
在这里插入图片描述

7.个人中心-工作台

在这里插入图片描述

8.个人中心-订单列表

在这里插入图片描述

9.订单中心-包裹列表

在这里插入图片描述

10.个人中心-工单管理

在这里插入图片描述

11.我的钱包

在这里插入图片描述

12.实名认证

在这里插入图片描述

13.升级vip

在这里插入图片描述

14.个人中心-推广赚钱

在这里插入图片描述

二、关键源码

1.路由配置

import Vue from 'vue'
import Router from 'vue-router'
import Layout from '@/components/index/index'
Vue.use(Router)


export const constantRoutes = [
    {
      path: '/index',
      component: Layout,
      children: [{
        path: '',
        name: '主页',
        component: () =>
          import( /* webpackChunkName: "views" */ '@/views/home/index'),
      }]
    },
    {
      path: '/',
      name: '主页',
      redirect: '/index'
    },
    {
      path: '/type',
      component: Layout,
      children: [{
        path: '',
        name: '分类',
        component: () =>
          import( /* webpackChunkName: "views" */ '@/views/type/index'),
      }]
    },
    {
      path: '/productDetail',
      component: Layout,
      children: [{
        path: '',
        name: '商品详情',
        component: () =>
          import( /* webpackChunkName: "views" */ '@/views/product_detail/index'),
      }]
    },
    {
      path: '/personal',
      component: Layout,
      redirect: '/personal/staging',
      children: [{
        path: 'staging',
        name: '个人中心',
        component: () =>
          import( /* webpackChunkName: "views" */ '@/views/personal/index'),
        redirect: '/personal/staging',
        children:[
          {
            path: '/personal/staging',
            name: '工作台',
            component: () => import( '@/views/personal/staging.vue')
          },
          {
            path: '/personal/order',
            name: '订单列表',
            component: () => import( '@/views/personal/order.vue')
          },
          {
            path: '/personal/package',
            name: '包裹列表',
            component: () => import( '@/views/personal/package.vue')
          },
          {
            path: '/personal/merchant',
            name: '工单管理',
            component: () => import( '@/views/personal/merchant.vue')
          },
          {
            path: '/personal/myWallet',
            name: '我的钱包',
            component: () => import( '@/views/personal/my_wallet.vue')
          },
          {
            path: '/personal/auth',
            name: '实名认证',
            component: () => import( '@/views/personal/auth.vue')
          },
          {
            path: '/personal/vip',
            name: '升级VIP',
            component: () => import( '@/views/personal/vip.vue')
          },
          {
            path: '/personal/popMoney',
            name: '推广赚钱',
            component: () => import( '@/views/personal/pop_money.vue')
          }
        ]
      }]
    },
  ];

const createRouter = () => new Router({
  // mode: 'history', // require service support
  scrollBehavior: () => ({
    y: 0
  }),
  routes: constantRoutes
})

const router = createRouter()

// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
export function resetRouter() {
  const newRouter = createRouter()
  router.matcher = newRouter.matcher // reset router
}

export default router

2.登录注册窗口

<template>
    <div>
      <!-- 登录弹窗 -->
      <el-dialog
        class="form-dialog"
        title=""
        :visible.sync="box"
        width="500px"
        :close-on-click-modal="false"
        center>
        <div>
          <div v-show="modalType === 'forget'" class="form-title"> 找回密码 </div>
          <div class="tabs-group">
            <a :class="'tab-link el-link el-link--danger '+(modalType === 'login'?'active':'')" @click="changeModalType('login')">
              <!---->
              <span class="el-link--inner"> 登录 </span>
              <!---->
            </a>
            <div class="tab-divider el-divider el-divider--vertical">
              <!---->
            </div>
            <a :class="'tab-link el-link el-link--danger '+(modalType === 'register'?'active':'')" @click="changeModalType('register')">
              <!---->
              <span class="el-link--inner"> 注册 </span>
              <!---->
            </a>
          </div>
          <el-form v-show="modalType === 'login'" class="login-form"
                   status-icon
                   :rules="loginRules"
                   ref="loginForm"
                   :model="loginForm"
                   label-width="0">
            <el-form-item prop="phone">
              <el-input size="small"
                        v-model="loginForm.phone"
                        auto-complete="off"
                        placeholder="请输入您的手机号">
                <i slot="prefix" class="el-icon-user el-icon--right"/>
              </el-input>
            </el-form-item>
            <el-form-item prop="password" v-show="loginType === 'pwd'">
              <el-input size="small"
                        :type="passwordType"
                        v-model="loginForm.password"
                        auto-complete="off"
                        placeholder="请输入您的密码">
                <i class="el-icon-view el-input__icon" slot="suffix" @click="showPassword"/>
                <i slot="prefix" class="el-icon-lock el-icon--right"/>
              </el-input>
            </el-form-item>
            <el-form-item prop="validCode" v-show="loginType === 'code'">
              <el-input size="small" placeholder="请输入验证码" v-model="loginForm.validCode" class="input-with-select">
                <i slot="prefix" class="el-icon-user el-icon--right" style="line-height: 32px;"/>
                <el-button slot="append" @click="sendValidCode">发送验证码</el-button>
              </el-input>
            </el-form-item>
            <el-form-item>
              <el-row :span="24">
                <el-col :span="12">
                  <el-checkbox v-show="loginType === 'pwd'" v-model="loginForm.autoLogin">保存密码</el-checkbox>
                </el-col>
                <el-col :span="loginType === 'pwd'?12:24" style="text-align: right;">
                  <el-button type="text"
                             style="width: 100px;color: #606266;"
                             @click.native.prevent="changeModalType('forget')"
                             class="login-submit">
                    忘记密码
                  </el-button>
                </el-col>
              </el-row>
              <el-row :span="24">
                <el-col :span="24" style="text-align: right;">
                  <el-button type="primary"
                             style="width: 100%;height: 40px;"
                             @click.native.prevent="handleLogin"
                             class="login-submit">
                    登录
                  </el-button>
                </el-col>
              </el-row>
            </el-form-item>
          </el-form>

          <el-form v-show="modalType === 'register'" class="login-form"
                   status-icon
                   :rules="registerRules"
                   ref="registerForm"
                   :model="registerForm"
                   label-width="0">
            <el-form-item prop="phone">
              <el-input size="small"
                        v-model="registerForm.phone"
                        auto-complete="off"
                        placeholder="请输入您的手机号">
                <i slot="prefix" class="el-icon-user el-icon--right"/>
              </el-input>
            </el-form-item>
            <el-form-item prop="validCode">
              <el-input size="small" placeholder="请输入验证码" v-model="registerForm.validCode" class="input-with-select">
                <i slot="prefix" class="el-icon-user el-icon--right" style="line-height: 32px;"/>
                <el-button slot="append" @click="sendValidCode">发送验证码</el-button>
              </el-input>
            </el-form-item>
            <el-form-item prop="password">
              <el-input size="small"
                        :type="passwordType"
                        v-model="registerForm.password"
                        auto-complete="off"
                        placeholder="6-20位密码">
                <i class="el-icon-view el-input__icon" slot="suffix" @click="showPassword"/>
                <i slot="prefix" class="el-icon-lock el-icon--right"/>
              </el-input>
            </el-form-item>
            <el-form-item prop="passwordConfirm">
              <el-input size="small"
                        :type="passwordType"
                        v-model="registerForm.passwordConfirm"
                        auto-complete="off"
                        placeholder="请输入确认密码">
                <i class="el-icon-view el-input__icon" slot="suffix" @click="showPassword"/>
                <i slot="prefix" class="el-icon-lock el-icon--right"/>
              </el-input>
            </el-form-item>
            <el-form-item>
              <el-row :span="24">
                <el-col :span="24" style="text-align: right;">
                  <el-button type="primary"
                             style="width: 100%;height: 40px;"
                             @click.native.prevent="handleRegister"
                             class="login-submit">
                    注册
                  </el-button>
                </el-col>
              </el-row>
            </el-form-item>
          </el-form>

          <div v-show="modalType === 'login' || modalType === 'register'" class="login-type-change">
            <a class="el-link el-link--info" @click="changeLoginType('pwd')">
              <!---->
              <span class="el-link--inner">密码登录</span>
              <!---->
            </a>
            <div class="el-divider el-divider--vertical">
              <!---->
            </div>
            <a class="el-link el-link--info">
              <!---->
              <span class="el-link--inner" @click="changeLoginType('code')">验证码登录</span>
              <!---->
            </a>
          </div>

          <el-form v-show="modalType === 'forget'" class="login-form"
                   status-icon
                   :rules="forgetRules"
                   ref="registerForm"
                   :model="forgetForm"
                   label-width="0">
            <el-form-item prop="phone">
              <el-input size="small"
                        v-model="forgetForm.phone"
                        auto-complete="off"
                        placeholder="请输入您的手机号">
                <i slot="prefix" class="el-icon-user el-icon--right"/>
              </el-input>
            </el-form-item>
            <el-form-item prop="validCode">
              <el-input size="small" placeholder="请输入验证码" v-model="forgetForm.validCode" class="input-with-select">
                <i slot="prefix" class="el-icon-user el-icon--right" style="line-height: 32px;"/>
                <el-button slot="append" @click="sendValidCode">发送验证码</el-button>
              </el-input>
            </el-form-item>
            <el-form-item prop="password">
              <el-input size="small"
                        :type="passwordType"
                        v-model="forgetForm.password"
                        auto-complete="off"
                        placeholder="6-20位密码">
                <i class="el-icon-view el-input__icon" slot="suffix" @click="showPassword"/>
                <i slot="prefix" class="el-icon-lock el-icon--right"/>
              </el-input>
            </el-form-item>
            <el-form-item prop="passwordConfirm">
              <el-input size="small"
                        :type="passwordType"
                        v-model="forgetForm.passwordConfirm"
                        auto-complete="off"
                        placeholder="请输入确认密码">
                <i class="el-icon-view el-input__icon" slot="suffix" @click="showPassword"/>
                <i slot="prefix" class="el-icon-lock el-icon--right"/>
              </el-input>
            </el-form-item>
            <el-form-item>
              <el-row :span="24">
                <el-col :span="12" style="text-align: left;">
                  <el-button type="text"
                             @click="changeLoginType('pwd')"
                             style="width: 100px;color: #606266;"
                             @click.native.prevent="handleLogin"
                             class="login-submit">
                    返回登录
                  </el-button>
                </el-col>
              </el-row>
            </el-form-item>
            <el-form-item>
              <el-row :span="24">
                <el-col :span="24" style="text-align: right;">
                  <el-button type="primary"
                             style="width: 100%;height: 40px;"
                             @click.native.prevent="handleForget"
                             class="login-submit">
                    确认修改
                  </el-button>
                </el-col>
              </el-row>
            </el-form-item>
          </el-form>

        </div>
      </el-dialog>
    </div>
</template>

<script>
    export default {
        name: "login_modal",
      data() {
        return {
          box: false,
          modalType: 'login',
          loginType: 'pwd',
          loginForm: {
            phone: "",
            password: "",
            validCode: "",
            autoLogin: false
          },
          loginRules: {
            phone: [
              {required: true, message: "请输入您的手机号", trigger: "blur"}
            ],
            password: [
              {required: true, message: "请输入您的密码", trigger: "blur"},
              {min: 1, message: "密码长度最少为6位", trigger: "blur"}
            ],
            validCode: [
              {required: false, message: "请输入验证码", trigger: "blur"}
            ],
          },
          registerForm: {
            phone: "",
            validCode: '',
            password: "",
            passwordConfirm: "",
          },
          registerRules: {
            phone: [
              {required: true, message: "请输入您的手机号码", trigger: "blur"}
            ],
            validCode: [
              {required: true, message: "请输入验证码", trigger: "blur"}
            ],
            password: [
              {required: true, message: "请输入密码", trigger: "blur"},
              {min: 1, message: "密码长度最少为6位", trigger: "blur"}
            ],
            passwordConfirm: [
              {required: true, message: "请输入确认密码", trigger: "blur"},
              {min: 1, message: "密码长度最少为6位", trigger: "blur"}
            ]
          },
          forgetForm: {
            phone: "",
            validCode: '',
            password: "",
            passwordConfirm: "",
          },
          forgetRules: {
            phone: [
              {required: true, message: "请输入您的手机号码", trigger: "blur"}
            ],
            validCode: [
              {required: true, message: "请输入验证码", trigger: "blur"}
            ],
            password: [
              {required: true, message: "请输入密码", trigger: "blur"},
              {min: 1, message: "密码长度最少为6位", trigger: "blur"}
            ],
            passwordConfirm: [
              {required: true, message: "请输入确认密码", trigger: "blur"},
              {min: 1, message: "密码长度最少为6位", trigger: "blur"}
            ]
          },
          passwordType: "password",
        };
      },
      watch: {
          'loginType'(){
            if(this.modalType === 'login' && this.loginType === 'code'){
              this.loginRules['validCode'][0].required = true;
            }else{
              this.loginRules['validCode'][0].required = false;
            }
          }
      },
      mounted() {
      },
      methods: {
        //登录模式
        changeModalType(type){
          this.modalType = type;
          if(this.$refs.loginForm){
            this.$refs.loginForm.resetFields();
          }
          if(this.$refs.registerForm){
            this.$refs.registerForm.resetFields();
          }
        },
        //登录模式
        changeLoginType(type){
          this.modalType = 'login';
          this.loginType = type;
          if(this.$refs.loginForm){
            this.$refs.loginForm.resetFields();
          }
          if(this.$refs.registerForm){
            this.$refs.registerForm.resetFields();
          }
        },
        loginModal(){
          this.box = true;
          if(this.$refs.loginForm){
            this.$refs.loginForm.resetFields();
          }
          if(this.$refs.registerForm){
            this.$refs.registerForm.resetFields();
          }
        },
        showPassword() {
          this.passwordType === ""
            ? (this.passwordType = "password")
            : (this.passwordType = "");
        },
        //登录
        handleLogin() {
          this.$refs.loginForm.validate(valid => {
            if (valid) {
              const loading = this.$loading({
                lock: true,
                text: '登录中,请稍后。。。',
                spinner: "el-icon-loading"
              });
              loading.close();
            }
          });
        },
        //发送验证码
        sendValidCode(){
          if(this.registerForm.phone.trim() === ''){
            this.$message.warning('请输入手机号码');
            return;
          }
        },
        //注册
        handleRegister() {
          this.$refs.registerForm.validate(valid => {
            if (valid) {
              const loading = this.$loading({
                lock: true,
                text: '注册中,请稍后。。。',
                spinner: "el-icon-loading"
              });
              loading.close();
            }
          });
        },
        //找回密码
        handleForget() {
          this.$refs.forgetForm.validate(valid => {
            if (valid) {
              const loading = this.$loading({
                lock: true,
                text: '保存中,请稍后。。。',
                spinner: "el-icon-loading"
              });
              loading.close();
            }
          });
        },
      }
    }
</script>

<style scoped>
  .form-dialog .tabs-group {
    display: flex;
    justify-content: center;
    margin: 20px;
  }
  .el-link.el-link--danger {
    color: #f56c6c;
  }
  .form-dialog .tabs-group .tab-link {
    font-size: 16px;
    color: #999;
  }
  .form-dialog .tabs-group .active {
    font-size: 20px;
    color: #f94a3d;
  }
  .el-divider--vertical {
    display: inline-block;
    width: 1px;
    height: 1em;
    margin: 0 8px;
    vertical-align: middle;
    position: relative;
  }
  .form-dialog .tabs-group .tab-divider {
    height: 28px;
  }
  .el-divider {
    background-color: #dcdfe6;
  }
  .form-dialog .login-type-change {
    margin-top: 14px;
    text-align: center;
  }
  .el-link.el-link--info {
    color: #909399;
  }
  .el-link {
    display: inline-flex;
    flex-direction: row;
    align-items: center;
    justify-content: center;
    vertical-align: middle;
    position: relative;
    text-decoration: none;
    outline: none;
    cursor: pointer;
    padding: 0;
    font-size: 14px;
    font-weight: 500;
  }
  .form-dialog .tabs-group .tab-link:hover {
    color: #fa6a64;
  }
  .form-dialog .form-title {
    font-size: 20px;
    color: #666;
    font-weight: 700;
    line-height: 1;
    padding-bottom: 37px;
    text-align: center;
  }
</style>

三、项目结构、设计说明

项目以vue项目创建,前端某些元素使用element,项目启动执行的命令为:

npm install
npm run dev(当然命令可以修改为npm run serve,没啥区别)
注意:npm install 成功了再执行 npm run dev 启动项目
结构如下截图,项目已经集成和实现了需要请求后端接口的一切功能,所以无须花费精力去考虑前端如何去对接后端和接口,可以把一切精力放在实现前端界面设计上来。

这样不懂后端的伙伴也省心省力,接口请求只需按照模板去copy就好,无非就是get/post/delete/put等请求方式和参数传递的差别,当然不明白的可以细问作者。

项目结构还是分为:顶部+具体功能显示容器+底部,页面存放于src/components目录下,看目录命名就能明白其含义,具体功能页面在views目录下。

路由在router目录中。

四、总结

后续不定期将不断完善和增加功能页面(数据分离管理、页面数据通讯交互、参数变化等),敬请期待。

关注作者,及时了解更多好项目!
作者主页也有更多好项目分享!

获取源码或如需帮助,可通过博客后面名片+作者即可!

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

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

相关文章

数据治理的数字画像

随着全网步入大数据时代&#xff0c;企业的目光日益聚焦在利用大数据服务精细化营销、精细化运营上&#xff0c;各类客户画像、员工画像理论如雨后春笋般兴起&#xff0c;而数据应用的底层——数据治理&#xff0c;却鲜有整体的理论体系。如何避免治理工作自身“无的放矢”&…

泛微E8 查询分部总部部门信息

当查询泛微 OA 部门&#xff0c;请使用 HrmDepartment 表&#xff1b;当查询分部信息&#xff0c;请使用 HrmSubCompany 表。当查询总部信息&#xff0c;请使用 HrmCompany 表。 其中&#xff0c;总部信息通过总部 id - 分部 companyid 进行关联&#xff1b;分部信息通过分部 …

在这个砸钱推广都效果甚微的时代,你该如何突出重围

有市场就有竞争&#xff0c;有竞争就有优胜劣汰&#xff0c;不做引领就会被遗忘&#xff0c;近几年&#xff0c;“数字化”、“智能化”一直是业内热议的话题&#xff0c;数据驱动的营销模式是未来市场显著的特征,运营商大数据在营销领域能帮助企业提升销售效率,降低企业获客成…

URL because the SSL module is not available

Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host‘pypi.org’, port443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError(“Can’t connect to HTT PS URL because the…

软件TFN 2K的分布式拒绝攻击(DDos)实战详解

写在前头 本人写这篇博客的目的&#xff0c;并不是我想成为黑客或者鼓励大家做损坏任何人安全和利益的事情。因科研需要&#xff0c;我学习软件TFN 2K的分布式拒绝攻击&#xff0c;只是分享自己的学习过程和经历&#xff0c;有助于大家更好的关注到网络安全及网络维护上。 需要…

微信小程序/vue3/uview-plus form兜底校验

效果图 代码 <template><u-form :model"form" ref"formRole" :rules"rules"><u-form-item prop"nickname"><u-input v-model"form.nickname" placeholder"姓名" border"none" /&…

美国隐私安全人工智能大模型公司【Fantix】160万美元融资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于美国纽约的隐私安全人工智能大模型公司【Fantix】今日宣布已完成160万美元B轮融资。 本轮融资的投资者包括Gaingels&#xff0c;Notion Capital&#xff0c;Founders Factory&#xff0c;F…

scsi MODE SENSE(6)命令 和 MODE SENSE(10)命令总结

一&#xff1a;MODE SENSE(6)命令概述 MODE SENSE(6)命令(参见表73)为设备服务器向应用程序客户机报告参数提供了一种方法。它是MODE SELECT(6)命令的补充命令。执行MODE SENSE(6)命令的设备服务器也应执行MODE SELECT(6)命令。 命令格式 DBD (disable block descriptors) bi…

c++视觉处理-----Laplacian算 子

Laplacian算 子 cv::Laplacian 是 OpenCV 中的一个函数&#xff0c;用于应用Laplacian算子&#xff08;拉普拉斯算子&#xff09;在图像上进行边缘检测。以下是 cv::Laplacian 函数的基本用法&#xff1a; cv::Laplacian(src, dst, ddepth, ksize, scale, delta, borderType)…

sql分组去重计数distinctcountgroup by

count 可以与 distinct 连用&#xff0c;这样可以实现去重计数&#xff1b;加上group by 可实现按某个字段分组&#xff0c;而对其它字段进行去重计数 学习链接 count()和distinct关键字的使用 distinct关键字 distinct关键字是用于去除重复的数据记录。distinct使用情况&a…

09_Webpack打包工具

1 初识Webpack 1.1 什么是Webpack Webpack打包工具对项目中的复杂文件进行打包处理&#xff0c;可以实现项目的自动化构建&#xff0c;并且给前端开发人员带来了极大的便利。 目前&#xff0c;企业中的绝大多数前端项目是基于Webpack打包工具来进行开发的。 1.2 Webpack的安…

ChatGPT,AIGC 数据库应用 Mysql 常见优化30例

使用ChatGPT,AIGC总结出Mysql的常见优化30例。 1. 建立合适的索引:在Mysql中,索引是重要的优化手段,可以提高查询效率。确保表的索引充分利用,可以减少查询所需的时间。如:create index idx_name on table_name(column_name); 2. 避免使用select * :尽可能指定要返回的…

拼多多商品品牌数据采集接口,拼多多商品详情数据接口,拼多多API接口

拼多多商品品牌数据采集的方法如下&#xff1a; 手动数据采集。直接在拼多多平台上搜索并手动复制商品数据&#xff0c;适合采集小批量的商品数据。自动数据采集。通过爬虫来自动获取&#xff0c;具体步骤如下&#xff1a; 选择爬虫框架并安装。Python爬虫框架有很多&#xf…

计算机毕业设计选什么题目好?springboot 校园失物招领平台

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

发布npm包质量分测试

查询质量分接口 https://registry.npmjs.org/-/v1/search?textcanvas-plus v0.0.1 quality 0.2987 新建文件夹 canvas-plus 执行命令 npm init 生成package.json {"name": "3r/canvas-plus","version": "0.0.1","descript…

EXCEL——根据单元格值设置不同色阶

方法&#xff1a;开始—>条件格式—>色阶&#xff08;默认色阶或复杂色阶&#xff09;。 一、默认色阶 如图&#xff0c;可选择自定义的色阶模式。 二、复杂色阶 1、如图&#xff0c;点击"其他规则" 2、选择复杂格式 此时可以看到&#xff0c;支持多种格式…

uniapp 使用和引入 thorui

1. npm install thorui-uni 2. "easycom": { "autoscan": true, "custom": { "tui-(.*)": "thorui-uni/lib/thorui/tui-$1/tui-$1.vue" } }, 3.

spring boot RabbitMq基础教程

RabbitMq 由于RabbitMQ采用了AMQP协议&#xff0c;因此它具备跨语言的特性。任何语言只要遵循AMQP协议收发消息&#xff0c;都可以与RabbitMQ交互。并且RabbitMQ官方也提供了各种不同语言的客户端。 但是&#xff0c;RabbitMQ官方提供的Java客户端编码相对复杂&#xff0c;一般…

如何看待国内PMP考试通过率高达97%?

自认为是虚高&#xff0c;虽然中国人在考试方面的确独树一帜的强&#xff0c;应该也没有这样夸张。 我分析&#xff0c;因为报考的条件有一个“由PMI项目管理协会授权的培训机构开具35学时证明”&#xff0c;这样&#xff0c;就都不得不去报培训班&#xff0c;但大家都知道有可…

Qual+Android方案Unlock学习 以Oneplus7Pro为例

目录 背景 Unpack guacamole_21_H.04_190416.ops Unlock探究 开发者选项–允许解锁 fastboot oem unlock extract LinuxLoader from abl 过程分析 FH读写分区 逆向MSM Download USB抓包 token & pk 逆向结果 尝试修改分区实现unlock VerifiedBoot Protocol 分…