Отображение справочных / реляционных данных в v-data-таблице с помощью Vue и SQLServer - PullRequest
1 голос
/ 17 октября 2019

Я создал приложение Node с Vue.js, Vuetify (клиентская часть приложения) и Express (серверная сторона приложения), и данные хранятся в базе данных SQL Server (реляционная база данных).

Всена моей машине разработки работает, и соединение между клиентом, сервером и базой данных работает.

Я просто не знаю, как отобразить «Поиск данных / реляционные данные» в таблицах, которые я использую.

3 таблицы моей базы данных:

Relational tables

Поэтому я хотел бы отобразить Имя поля AssetMake и AssetModel INSTEAD для FKAssetMake и FKAssetModel.

Это скриншот моей таблицы в браузере:

Table display

Как видите, значения FK отображаются, но не имена.

Таблицы поиска и данные, которые должны отображаться:

Lookup table data

Объект данных в Chrome:

enter image description here

Шаблон My Vue:

<template>
  <div id="app">
    <v-app id="inspire">
      <v-card>
        <v-card-title>
          Asset (Vehicle/Vessel)
          <v-spacer></v-spacer>
          <v-text-field
            v-model="search"
            label="Search"
            append-icon="mdi-card-search-outline"
            single-line
            hide-details
          ></v-text-field>
        </v-card-title>

        <v-data-table dense
        :headers="headers"
        :items="assets"
        :search="search"
        sort-by="Name"
        class="elevation-1"
      >
        <template v-slot:top>
          <v-toolbar flat color="white">
            <v-toolbar-title>{{ tabelHeader }}</v-toolbar-title>

            <v-spacer></v-spacer>
            <v-dialog v-model="dialog" max-width="500px">
              <template v-slot:activator="{ on }">
                <v-btn color="primary" dark class="mb-2" v-on="on">New Item</v-btn>
              </template>
              <v-card>
                <v-card-title>
                  <span class="headline">{{ formTitle }}</span>
                </v-card-title>

                <v-card-text>
                  <v-container>
                    <v-row>
                      <v-col cols="12" sm="6" md="4">
                        <v-text-field v-model="editedItem.Name" label="Name"></v-text-field>
                      </v-col>
                      <v-col cols="12" sm="6" md="4">
                        <v-text-field v-model="editedItem.FKMake" label="Make"></v-text-field>
                      </v-col>
                      <v-col cols="12" sm="6" md="4">
                        <v-text-field v-model="editedItem.FKModel" label="Model"></v-text-field>
                      </v-col>
                      <v-col cols="12" sm="6" md="4">
                        <v-text-field v-model="editedItem.Registration" label="Registration"></v-text-field>
                      </v-col>
                      <v-col cols="12" sm="6" md="4">
                        <v-text-field v-model="editedItem.Description" label="Description"></v-text-field>
                      </v-col>
                      <v-col cols="12" sm="6" md="4">
                        <v-text-field v-model="editedItem.Year" label="Year"></v-text-field>
                      </v-col>
                      <v-col cols="12" sm="6" md="4">
                        <v-text-field v-model="editedItem.Capacity" label="Capacity"></v-text-field>
                      </v-col>
                      <v-col cols="12" sm="6" md="4">
                        <v-text-field v-model="editedItem.isVessel" label="Is Vessel"></v-text-field>
                      </v-col>
                    </v-row>
                  </v-container>
                </v-card-text>

                <v-card-actions>
                  <v-spacer></v-spacer>
                  <v-btn color="blue darken-1" text @click="close">Cancel</v-btn>
                  <v-btn color="blue darken-1" text @click="save">Save</v-btn>
                </v-card-actions>
              </v-card>
            </v-dialog>
          </v-toolbar>
        </template>
        <template v-slot:item.Action="{ item }">
          <v-icon
            small
            class="mr-2"
            @click="editItem(item)"
          >
            edit
          </v-icon>
          <v-icon
            small
            @click="deleteItem(item)"
          >
            delete
          </v-icon>
        </template>
      </v-data-table>
      </v-card>
    </v-app>
  </div>
</template>

Часть сценария:

<script>

import appConfig from '../config/appConfig.js'

const baseURL = "http://" + appConfig.server.ip + ":" + appConfig.server.port

export default {
  data: () => ({
    search: '',
    dialog: false,
    tabelHeader: '',
    assets: [],
    headers: [
      { text: 'Name', value: 'Name'},
      { text: 'Make', value: 'FKMake'},
      { text: 'Model', value: 'FKModel'},
      { text: 'Registration', value: 'Registration'},
      { text: 'Description', value: 'Description' },
      { text: 'Year', value: 'Year' },
      { text: 'Capacity', value: 'Capacity' },
      { text: 'Vessel', value: 'IsVessel' },
      { text: 'Actions', value: 'Action', sortable: false }
      ],

    editedIndex: -1,
    editedItem: {
      Name: '',
      FKMake: -1,
      FKModel: -1,
      Registration: null,
      Year: null,
      Capacity: null,
      Description: '',
      IsVessel: null
    },
    defaultItem: {
      Name: '',
      FKMake: -1,
      FKModel: -1,
      Registration: null,
      Year: null,
      Capacity: null,
      Description: '',
      IsVessel: null
    }
  }),

  watch: {
    dialog (val) {
      val || this.close()
    },
  },

  methods:{
    editItem (item) {
      this.editedIndex = this.assets.indexOf(item)
      this.editedItem = Object.assign({}, item)
      this.dialog = true
    },

    deleteItem (item) {
      const index = this.assets.indexOf(item)
      var isDelete = confirm('Are you sure you want to delete this item?')

      if (isDelete) {
        this.deleteAssetMake(item, index)
      }
    },

    close () {
      this.dialog = false
      setTimeout(() => {
        this.editedItem = Object.assign({}, this.defaultItem)
        this.editedIndex = -1
      }, 300)
    },

    save () {
      if (this.editedIndex > -1) {
        Object.assign(this.assets[this.editedIndex], this.editedItem)
        this.updateAssetMake(this.editedItem)
      } 
      else {
        this.assets.push(this.editedItem)
        this.addAssetMake(this.editedItem)
      }
      this.close()
    },



    deleteAssetMake (asset, index) {
      fetch(baseURL + '/api/asset/' + asset.ID, {
        method: 'DELETE'
        })
        .then(() => {
          this.assets.splice(index, 1)
          })
          },

    updateAssetMake (asset) {
      fetch(baseURL + '/api/asset/' + asset.ID, {
        body: JSON.stringify(asset),
        method: 'PUT',
        headers: {
        'Content-Type': 'application/json'
        }
      })
      .then(() => {

      })
    },

    addAssetMake (asset) {
      fetch(baseURL + '/api/asset/', {
        body: JSON.stringify(asset),
        method: 'POST',
        headers: {
          'Content-Type': 'application/json'
        }
      })
    }
  },

  mounted () {
        fetch(baseURL + '/api/asset')
            .then(response => response.json())
            .then((data) => {
                this.assets = data.resultMessage
                console.log(data.resultMessage)
            })

            //.catch(() => console.log('Can’t access  response. Blocked by browser?'))
    },

    computed: {
    formTitle () {
      return this.editedIndex === -1 ? 'New Item' : 'Edit Item'
    },
  }
}
</script>
  1. Как отобразить поле «Имя» в указанной таблице вместо внешнего ключа.

  2. Есть ли "лучший" способ выполнить задачу с дизайном базы данных "веб-типа"?

Ответы [ 2 ]

1 голос
/ 20 октября 2019
Ответ

@ chans поставил меня на правильный путь.

Поскольку пользователи не будут редактировать данные в таблице «in-line», можно изменить запрос, чтобы показать необходимые данные (AssetMake. Name и AsseteModel.Name).

Я использую диалог с формой для редактирования и добавления активов. Затем я использую v-select дляотобразить данные поиска следующим образом:

<v-col cols="12" sm="6" md="4">
  <v-select v-model="editedItem.FKModel" :items="assetModels" item-text="Name" item-value="ID" label="Model" autocomplete></v-select>
</v-col>

assetModels содержит все модели активов и было выбрано из базы данных при смонтированном событии.

Спасибо всем, кто принял участие.

0 голосов
/ 17 октября 2019

Убедитесь, что ваш ответный объект API имеет свойства AssetMake и AssetModel, затем внесите следующие изменения в html и css. Тогда все будет работать как положено

    <v-col cols="12" sm="6" md="4">
                        <v-text-field v-model="editedItem.AssetMake" label="Make"></v-text-field>
                      </v-col>
                      <v-col cols="12" sm="6" md="4">
                        <v-text-field v-model="editedItem.AssetModel" label="Model"></v-text-field>
                      </v-col>
                      <v-col cols="12" sm="6" md="4">      


{ text: 'Name', value: 'Name'},
      { text: 'Make', value: 'AssetMake'},
      { text: 'Model', value: 'AssetModel'},
      { text: 'Registration', value: 'Registration'},
      { text: 'Description', value: 'Description' },
      { text: 'Year', value: 'Year' },
      { text: 'Capacity', value: 'Capacity' },
      { text: 'Vessel', value: 'IsVessel' },
      { text: 'Actions', value: 'Action', sortable: false }
      ],

    editedIndex: -1,
    editedItem: {
      Name: '',
      AssetMake: '',
      AssetModel: '',
      Registration: null,
      Year: null,
      Capacity: null,
      Description: '',
      IsVessel: null
    },
    defaultItem: {
      Name: '',
      AssetMake: '',
      AssetModel: '',
      Registration: null,
      Year: null,
      Capacity: null,
      Description: '',
      IsVessel: null
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...