3 Commit-ok 9236076b25 ... d734198424

Szerző SHA1 Üzenet Dátum
  kiboky d734198424 주소 수정 기능 추가 5 éve
  kiboky 112c9284de 주소 삭제 기능 추가 5 éve
  kiboky 095b6e1335 주소찾기 오픈 API 적용 5 éve

+ 1 - 1
client/components/Navbar.vue

@@ -28,7 +28,7 @@
                 <div id="nav-packard-glow-loc-icon" class="nav-sprite"></div>
                 <div class="glow-ingress-block">
                   <span id="glow-ingress-line1" class="nav-line-2">Deliver to </span>
-                  <span id="glow-ingress-line2" class="nav-line-2">Califonia</span>
+                  <span id="glow-ingress-line2" class="nav-line-2">{{ $auth.$state.user.address.city }}</span>
                 </div>
               </nuxt-link>
             </div>

+ 239 - 0
client/pages/address/_id.vue

@@ -0,0 +1,239 @@
+<template>
+  <!--MAIN-->
+  <main>
+    <!--REGISTER ADDRESS-->
+    <div class="registerAddress mt-3">
+      <div class="container-fluid c-section">
+        <div class="row">
+          <div class="col-sm-3"></div>
+          <div class="col-sm-6">
+            <div class="a-section a-spacing-medium">
+              <div class="a-subheader a-breadcrumb a-spacing-small">
+                <ul>
+                  <li>
+                    <a href="#">
+                      <span>Your Account</span>
+                    </a>
+                  </li>
+                  <li class="a-breadcrumb-divider">›</li>
+                  <li>
+                    <a href="#">
+                      <span>Your Adresses</span>
+                    </a>
+                  </li>
+                  <li class="a-breadcrumb-divider">›</li>
+                  <li class="active">
+                    <a href="#">
+                      <span>Update Address</span>
+                    </a>
+                  </li>
+                </ul>
+              </div>
+            </div>
+            <div class="a-section">
+              <h2>Update address</h2>
+              <div class="a-section a-spacing-none a-spacing-top-small">
+                <b>
+                  Or pick up your packages at your convenience from our self-service locations. To add an Amazon Pickup Point or Locker, click
+                  <a
+                    href="#"
+                  >here</a>.
+                </b>
+              </div>
+              <!-- Error Message -->
+              <div class="a-section a-spacing-none a-spacing-top-small">
+                <b></b>
+              </div>
+              <form>
+                <div class="a-spacing-medium a-spacing-top-medium">
+                  <!-- Country / Region -->
+                  <div class="a-spacing-top-medium">
+                    <label style="margin-bottom: 0px;">Country/Region</label>
+                    <select v-model="country" class="a-select-option">
+                      <option
+                        v-for="country in countries"
+                        :key="country.alpha2Code"
+                        :value="country.name"
+                      >{{ country.name }}</option>
+                    </select>
+                  </div>
+                  <!-- Full name -->
+                  <div class="a-spacing-top-medium">
+                    <label style="margin-bottom: 0px;">Full Name</label>
+                    <input v-model="fullName" :placeholder="address.fullName" type="text" class="a-input-text" style="width: 100%;" />
+                  </div>
+                  <!-- Street Address -->
+                  <div class="a-spacing-top-medium">
+                    <label style="margin-bottom: 0px;">Street Address</label>
+                    <input
+                      v-model="streetAddress1"
+                      :placeholder="address.streetAddress1"
+                      type="text"
+                      class="a-input-text"
+                      style="width: 100%;"
+                    />
+                    <!-- Street Address 2 -->
+                    <input
+                      v-model="streetAddress2"
+                      :placeholder="address.streetAddress2"
+                      type="text"
+                      class="a-input-text a-spacing-top-small"
+                      style="width: 100%;"
+                    />
+                  </div>
+                  <!-- City -->
+                  <div class="a-spacing-top-medium">
+                    <label style="margin-bottom: 0px;">City</label>
+                    <input v-model="city" :placeholder="address.city" type="text" class="a-input-text" style="width: 100%;" />
+                  </div>
+                  <!-- State -->
+                  <div class="a-spacing-top-medium">
+                    <label style="margin-bottom: 0px;">State / Province / Region</label>
+                    <input v-model="state" :placeholder="address.state" type="text" class="a-input-text" style="width: 100%;" />
+                  </div>
+                  <!-- Zip Code -->
+                  <div class="a-spacing-top-medium">
+                    <label style="margin-bottom: 0px;">Zip Code</label>
+                    <input v-model="zipCode" :placeholder="address.zipCode" type="text" class="a-input-text" style="width: 100%;" />
+                  </div>
+                  <!-- Phone Number -->
+                  <div class="a-spacing-top-medium">
+                    <label style="margin-bottom: 0px;">Phone Number</label>
+                    <input v-model="phoneNumber" :placeholder="address.phoneNumber" type="text" class="a-input-text" style="width: 100%;" />
+                    <div class="a-section a-spacing-none a-spacing-top-micro">
+                      <span class="a-size-mini">May be used to assist delivery</span>
+                    </div>
+                  </div>
+                  <div class="a-spacing-base a-spacing-top-medium">
+                    <h3>Add delivery instructions</h3>
+                  </div>
+                  <!-- Delivery Instruction -->
+                  <div class="a-spacing-top-medium">
+                    <label
+                      style="margin-bottom: 0px;"
+                    >Do we need additional instructions to find this address?</label>
+                    <textarea
+                      v-model="deliverInstructions"
+                      :placeholder="address.deliverInstructions"
+                      style="height:6em; width: 100%;"
+                    ></textarea>
+                  </div>
+                  <!-- Security code -->
+                  <div class="a-spacing-top-medium">
+                    <label
+                      style="margin-bottom: 0px;"
+                    >Do we need a security code or a call box number to access this building?</label>
+                    <input v-model="securityCode" :placeholder="address.securityCode" type="text" class="a-input-text" style="width: 100%;" />
+                  </div>
+                  <div class="a-spacing-top-medium">
+                    <label style="margin-bottom: 0px;">Weekend delivery</label>
+                    <a href="#">
+                      <i class="fas fa-angle-down"></i> Which days can you receive packages?
+                    </a>
+                  </div>
+                  <div class="a-spacing-top-medium"></div>
+                  <hr />
+                  <div class="a-spacing-top-medium">
+                    <span>
+                      <b>Make sure your address is correct</b>
+                    </span>
+                  </div>
+                  <div>
+                    <span>If the address contains typos or other errors, your package may be undeliverable.</span>
+                  </div>
+                  <div class="a-spacing-top-small">
+                    <span>
+                      <a href="#">Tips for entering addresses</a>
+                    </span>
+                    <span>|</span>
+                    <span>
+                      <a href="#">APO/FPO address tips</a>
+                    </span>
+                  </div>
+                  <div class="a-spacing-top-large">
+                    <span class="a-button-register">
+                      <span class="a-button-inner">
+                        <span @click="onUpdateAddress" class="a-button-text">Update address</span>
+                      </span>
+                    </span>
+                  </div>
+                </div>
+              </form>
+            </div>
+          </div>
+          <div class="col-sm-3"></div>
+        </div>
+      </div>
+    </div>
+    <!--/REGISTER ADDRESS-->
+  </main>
+  <!--/MAIN-->
+</template>
+
+
+<script>
+export default {
+  async asyncData ({ $axios, params }) {
+    try {
+      let response =  $axios.$get('/api/countries')
+      let singleAddress =  $axios.$get(`/api/address/${params.id}`)
+
+      let [countriesResponse, addressResponse] = await Promise.all([
+        response,
+        singleAddress
+      ])
+
+      console.log(singleAddress)
+
+      return {
+        countries: countriesResponse,
+        address: addressResponse.address
+      }
+    } catch (err) {
+      console.log(err)
+    }
+  },
+
+  data () {
+    return {
+      country: 'United States of America',
+      fullName: '',
+      streetAddress1: '',
+      streetAddress2: '',
+      city: '',
+      state: '',
+      zipCode: '',
+      phoneNumber: '',
+      deliverInstructions: '',
+      securityCode: ''
+    }
+  },
+
+  methods: {
+    async onUpdateAddress () {
+      try {
+        let data = {
+          country: this.country,
+          fullName: this.fullName,
+          streetAddress: this.streetAddress1 + ' ' + this.streetAddress2,
+          city: this.city,
+          state: this.state,
+          zipCode: this.zipCode,
+          phoneNumber: this.phoneNumber,
+          deliverInstructions: this.deliverInstructions,
+          securityCode: this.securityCode,
+        }
+
+        let response = await this.$axios.$put(`/api/address/${this.$route.params.id}`, data)
+
+        if (response.success) {
+          this.$router.push('/address')
+        }
+      } catch (err) {
+        console.log(err)
+      }
+
+    }
+  }
+}
+</script>

+ 22 - 8
client/pages/address/add.vue

@@ -50,8 +50,11 @@
                   <div class="a-spacing-top-medium">
                     <label style="margin-bottom: 0px;">Country/Region</label>
                     <select v-model="country" class="a-select-option">
-                      <option value>--</option>
-                      <option></option>
+                      <option
+                        v-for="country in countries"
+                        :key="country.alpha2Code"
+                        :value="country.name"
+                      >{{ country.name }}</option>
                     </select>
                   </div>
                   <!-- Full name -->
@@ -150,7 +153,7 @@
                   <div class="a-spacing-top-large">
                     <span class="a-button-register">
                       <span class="a-button-inner">
-                        <span class="a-button-text">Add address</span>
+                        <span @click="onAddAddress" class="a-button-text">Add address</span>
                       </span>
                     </span>
                   </div>
@@ -170,9 +173,21 @@
 
 <script>
 export default {
+  async asyncData ({ $axios }) {
+    try {
+      let response = await $axios.$get('/api/countries')
+
+      return {
+        countries: response
+      }
+    } catch (err) {
+      console.log(err)
+    }
+  },
+
   data () {
     return {
-      country: '',
+      country: 'United States of America',
       fullName: '',
       streetAddress1: '',
       streetAddress2: '',
@@ -191,8 +206,7 @@ export default {
         let data = {
           country: this.country,
           fullName: this.fullName,
-          streetAddress1: this.streetAddress1,
-          streetAddress2: this.streetAddress2,
+          streetAddress1: this.streetAddress1 + ' ' + this.streetAddress2,
           city: this.city,
           state: this.state,
           zipCode: this.zipCode,
@@ -201,13 +215,13 @@ export default {
           securityCode: this.securityCode,
         }
 
-        let response = await $axios.$post('/api/address', data)
+        let response = await this.$axios.$post('/api/address', data)
 
         if (response.success) {
           this.$router.push('/address')
         }
       } catch (err) {
-
+        console.log(err)
       }
 
     }

+ 150 - 0
client/pages/address/index.vue

@@ -0,0 +1,150 @@
+<template>
+  <!--MAIN-->
+  <main>
+    <!--REGISTER ADDRESS-->
+    <div class="registerAddress mt-3">
+      <div class="container-fluid c-section">
+        <div class="row">
+          <div class="col-sm-2"></div>
+          <div class="col-sm-10">
+            <div class="a-section a-spacing-medium">
+              <div class="a-subheader a-breadcrumb a-spacing-small">
+                <ul>
+                  <li>
+                    <a href="#">
+                      <span>Your Account</span>
+                    </a>
+                  </li>
+                  <li class="a-breadcrumb-divider">›</li>
+                  <li class="active">
+                    <a href="#">
+                      <span>Your Adresses</span>
+                    </a>
+                  </li>
+                </ul>
+              </div>
+              <h1 class="a-spacing-medium a-spacing-top-medium">Your Addresses</h1>
+              <!-- Message from Server -->
+              <div class="a-section a-spacing-none a-spacing-top-small">
+                <b>{{ message }}</b>
+              </div>
+              <div class="a-spacing-double-large">
+                <div class="row a-spacing-micro">
+                  <div class="col-lg-4 col-md-5 col-sm-12 pb-2">
+                    <nuxt-link
+                      to="/address/add"
+                      class="a-link-normal add-new-address-button"
+                      style="text-decoration:none;"
+                    >
+                      <div class="a-box first-desktop-address-tile">
+                        <div class="a-box-inner a-padding-extra-large">
+                          <i class="far fa-plus"></i>
+                          <h2 class="a-color-tertiary">Add Address</h2>
+                        </div>
+                      </div>
+                    </nuxt-link>
+                  </div>
+                  <!-- Address -->
+                  <div v-for="(address, index) in addresses" :key="address._id" class="col-lg-4 col-md-4 col-sm-12 pl-md-0 pb-2">
+                    <div class="a-box a-spacing-none normal-desktop-address-tile">
+                      <div class="a-box-inner a-padding-none">
+                        <div class="address-section-no-default">
+                          <div class="a-spacing-small">
+                            <ul class="a-unordered-list a-nostyle a-vertical">
+                              <li>
+                                <h5>
+                                  <!-- Address Fullname -->
+                                  <b>{{ address.fullName }}</b>
+                                </h5>
+                              </li>
+                              <!-- Address street address -->
+                              <li>{{ address.streetAddress }}</li>
+                              <!-- Address city state zip code -->
+                              <li>{{ address.city }}, {{ address.state }} {{ address.zipCode }}</li>
+                              <!-- Address country -->
+                              <li>{{ address.country }}</li>
+                              <!-- Address Phone number -->
+                              <li>Phone number: {{ address.phoneNumber }}</li>
+                            </ul>
+                          </div>
+                        </div>
+                      </div>
+                      <!-- Delete Button -->
+                      <div class="edit-address-desktop-link">
+                        <nuxt-link :to="`/address/${address._id}`">Edit</nuxt-link>
+                        &nbsp; | &nbsp;
+                        <a @click="onDeleteAddress(address._id, index)" href="#">Delete</a>
+                        &nbsp; | &nbsp;
+                        <!-- Set Address as Default -->
+                        <a @click="onSetDefault(address._id)" href="#">Set as Default</a>
+                      </div>
+                    </div>
+                  </div>
+                  <div class="col-lg-4 col-md-3 col-sm-12"></div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!--/REGISTER ADDRESS-->
+  </main>
+  <!--/MAIN-->
+</template>
+
+<script>
+export default {
+  async asyncData ({ $axios }) {
+    try {
+      let response = await $axios.$get('/api/address')
+
+      return {
+        addresses: response.addresses
+      }
+    } catch (err) {
+      console.log(err)
+    }
+  },
+
+  data () {
+    return {
+      message: ''
+    }
+  },
+
+  methods: {
+    async onDeleteAddress (id, index) {
+      try {
+        let response = await this.$axios.$delete(`/api/address/${id}`)
+
+        if (response.success) {
+          this.message = response.message
+          this.addresses.splice(index, 1)
+        }
+      } catch (err) {
+        this.message = err.message
+        console.log(err)
+      }
+    },
+
+    async onSetDefault (id) {
+      try {
+        let response = await this.$axios.$put(`/api/address/set/default`, {
+          id: id
+        })
+
+        if (response.success) {
+          this.message = response.message
+          await this.$auth.fetchUser()
+        }
+      } catch (err) {
+        this.message = err.message
+        console.log(err)
+      }
+    }
+  }
+}
+</script>
+
+

+ 26 - 0
server/package-lock.json

@@ -39,6 +39,14 @@
         "xml2js": "0.4.19"
       }
     },
+    "axios": {
+      "version": "0.19.1",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.1.tgz",
+      "integrity": "sha512-Yl+7nfreYKaLRvAvjNPkvfjnQHJM1yLBY3zhqAwcJSwR/6ETkanUgylgtIvkvz0xJ+p/vZuNw8X7Hnb7Whsbpw==",
+      "requires": {
+        "follow-redirects": "1.5.10"
+      }
+    },
     "base64-js": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
@@ -311,6 +319,24 @@
         "unpipe": "~1.0.0"
       }
     },
+    "follow-redirects": {
+      "version": "1.5.10",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
+      "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
+      "requires": {
+        "debug": "=3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
     "forwarded": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",

+ 1 - 0
server/package.json

@@ -10,6 +10,7 @@
   "license": "ISC",
   "dependencies": {
     "aws-sdk": "^2.596.0",
+    "axios": "^0.19.1",
     "bcrypt-nodejs": "0.0.3",
     "body-parser": "^1.19.0",
     "cors": "^2.8.5",

+ 104 - 0
server/routes/address.js

@@ -1,6 +1,8 @@
 const router = require('express').Router()
 const Address = require('../models/address')
+const User = require('../models/user')
 const virifyToken = require('../middlewares/verify-token')
+const axios = require('axios')
 
 router.post('/address', virifyToken, async (req, res) => {
   try {
@@ -46,4 +48,106 @@ router.get('/address', virifyToken, async (req, res) => {
   }
 })
 
+router.get('/countries', async (req, res) => {
+  try {
+    let response = await axios.get('https://restcountries.eu/rest/v2/all')
+
+    res.json(response.data)
+  } catch (err) {
+    res.status(500).json({
+      success: false,
+      message: err.message
+    })
+  }
+})
+
+router.get('/address/:id', virifyToken, async (req, res) => {
+  try {
+    let address = await Address.findOne({ _id: req.params.id })
+
+    res.json({
+      success: true,
+      address,
+    })
+  } catch (err) {
+    res.status(500).json({
+      success: fail,
+      message: err.message
+    })
+  }
+})
+
+router.put('/address/:id', virifyToken, async (req, res) => {
+  try {
+    let foundAddress = await Address.findOne({ user: req.decoded._id, _id: req.params.id })
+
+    if (foundAddress) {
+      if (req.body.country) foundAddress.country = req.body.country
+      if (req.body.fullName) foundAddress.fullName = req.body.fullName
+      if (req.body.streetAddress) foundAddress.streetAddress = req.body.streetAddress
+      if (req.body.city) foundAddress.city = req.body.city
+      if (req.body.state) foundAddress.state = req.body.state
+      if (req.body.zipCode) foundAddress.zipCode = req.body.zipCode
+      if (req.body.phoneNumber) foundAddress.phoneNumber = req.body.phoneNumber
+      if (req.body.deliverInstructions) foundAddress.deliverInstructions = req.body.deliverInstructions
+      if (req.body.securityCode) foundAddress.securityCode = req.body.securityCode
+    }
+
+    await foundAddress.save()
+
+    res.json({
+      success: true,
+      message: 'success updatea address'
+    })
+  } catch (err) {
+    res.status(500).json({
+      success: false,
+      message: err.message
+    })
+  }
+})
+
+router.delete('/address/:id', virifyToken, async (req, res) => {
+  try {
+    let deleteAddress = await Address.remove({
+      user: req.decoded._id,
+      _id: req.params.id
+    })
+
+    if (deleteAddress) {
+      res.json({
+        success: true,
+        message: 'Addres has been delete'
+      })
+    }
+  } catch (err) {
+    res.status(500).json({
+      success: false,
+      message: err.message
+    })
+  }
+})
+
+router.put('/address/set/default', virifyToken, async (req, res) => {
+  try {
+    const updatedAddressUser = await User.findOneAndUpdate(
+      { _id: req.decoded._id },
+      { $set: { address: req.body.id }}
+    )
+
+    if (updatedAddressUser) {
+      res.json({
+        success: true,
+        message: 'Successfully set this address a default'
+      })
+    }
+  } catch (err) {
+    console.log(err)
+    res.status(500).json({
+      success: false,
+      message: err.message
+    })
+  }
+})
+
 module.exports = router

+ 1 - 1
server/routes/auth.js

@@ -36,7 +36,7 @@ router.post('/auth/signup', async (req, res) => {
 
 router.get('/auth/user', virifyToken, async (req, res) => {
   try {
-    let foundUser = await User.findOne({ _id: req.decoded._id })
+    let foundUser = await (await User.findOne({ _id: req.decoded._id })).populate('address')
     if (foundUser) {
       res.json({
         success: true,