diff --git a/front/vue-project/src/App.vue b/front/vue-project/src/App.vue index e864195..8b32809 100644 --- a/front/vue-project/src/App.vue +++ b/front/vue-project/src/App.vue @@ -1,85 +1,19 @@ - + \ No newline at end of file diff --git a/front/vue-project/src/components/Components.vue b/front/vue-project/src/components/Components.vue new file mode 100644 index 0000000..857e6ed --- /dev/null +++ b/front/vue-project/src/components/Components.vue @@ -0,0 +1,71 @@ + + + \ No newline at end of file diff --git a/front/vue-project/src/components/Favors.vue b/front/vue-project/src/components/Favors.vue new file mode 100644 index 0000000..eaee443 --- /dev/null +++ b/front/vue-project/src/components/Favors.vue @@ -0,0 +1,175 @@ + + + \ No newline at end of file diff --git a/front/vue-project/src/components/Header.vue b/front/vue-project/src/components/Header.vue new file mode 100644 index 0000000..ad4f017 --- /dev/null +++ b/front/vue-project/src/components/Header.vue @@ -0,0 +1,35 @@ + + + + + \ No newline at end of file diff --git a/front/vue-project/src/components/HelloWorld.vue b/front/vue-project/src/components/HelloWorld.vue deleted file mode 100644 index 0a0988b..0000000 --- a/front/vue-project/src/components/HelloWorld.vue +++ /dev/null @@ -1,43 +0,0 @@ - - - - - diff --git a/front/vue-project/src/components/TheWelcome.vue b/front/vue-project/src/components/TheWelcome.vue deleted file mode 100644 index 5e64625..0000000 --- a/front/vue-project/src/components/TheWelcome.vue +++ /dev/null @@ -1,86 +0,0 @@ - - - diff --git a/front/vue-project/src/components/ToolBar.vue b/front/vue-project/src/components/ToolBar.vue new file mode 100644 index 0000000..32c7b1d --- /dev/null +++ b/front/vue-project/src/components/ToolBar.vue @@ -0,0 +1,46 @@ + + + + + \ No newline at end of file diff --git a/front/vue-project/src/components/WelcomeItem.vue b/front/vue-project/src/components/WelcomeItem.vue deleted file mode 100644 index a5eca70..0000000 --- a/front/vue-project/src/components/WelcomeItem.vue +++ /dev/null @@ -1,85 +0,0 @@ - - - diff --git a/front/vue-project/src/main.js b/front/vue-project/src/main.js index eedade8..db79b45 100644 --- a/front/vue-project/src/main.js +++ b/front/vue-project/src/main.js @@ -1,11 +1,20 @@ import { createApp } from 'vue' +import { createRouter, createWebHistory } from 'vue-router' import App from './App.vue' -import router from './router' +import Cabinets from './components/Components.vue' +import Computers from './components/Favors.vue.vue' +import Monitors from './components/Orders.vue' -import './assets/main.css' +const routes = [ + { path: '/', redirect: '/components' }, + { path: '/components', component: Components, meta: { label: 'Компоненты' } }, + { path: '/favors', component: Favors, meta: { label: 'Услуги' } }, + { path: '/orders', component: Orders, meta: { label: 'Заказы' } } +] -const app = createApp(App) - -app.use(router) - -app.mount('#app') +const router = createRouter({ + history: createWebHistory(), + linkActiveClass: 'active', + routes +}) +createApp(App).use(router).mount('#app') \ No newline at end of file diff --git a/front/vue-project/src/mixins/CatalogMixins.js b/front/vue-project/src/mixins/CatalogMixins.js new file mode 100644 index 0000000..3c700ba --- /dev/null +++ b/front/vue-project/src/mixins/CatalogMixins.js @@ -0,0 +1,102 @@ +import ToolBar from '../components/ToolBar.vue'; +import DataTable from '../components/DataTable.vue'; +import Modal from '../components/Modal.vue'; +import DataService from '../services/DataService'; + +const CatalogMixin = { + components: { + ToolBar, DataTable, Modal + }, + data() { + return { + getAllUrl: undefined, + dataUrl: undefined, + transformer: undefined, + headers: [], + items: [], + selectedItems: [], + modal: { + header: undefined, + confirm: undefined, + }, + modalShow: false, + data: undefined, + isEdit: false + } + }, + created() { + this.loadItems(); + }, + methods: { + loadItems() { + this.getItems(); + this.data = this.transformer(); + }, + getItems() { + DataService.readAll(this.getAllUrl, this.transformer) + .then(data => { + this.items = data; + }); + }, + showAddModal() { + this.isEdit = false; + this.data = this.transformer(); + this.modal.header = 'Добавление элемента'; + this.modal.confirm = 'Добавить'; + this.modalShow = true; + }, + showEditModal() { + if (this.selectedItems.length === 0) { + return; + } + this.showEditModalDblClick(this.selectedItems[0]); + }, + showEditModalDblClick(editId) { + DataService.read(this.dataUrl + "/" + editId, this.transformer) + .then(data => { + this.data = data; + this.isEdit = true; + this.modal.header = 'Редактирование элемента'; + this.modal.confirm = 'Сохранить'; + this.modalShow = true; + }); + }, + saveItem() { + if (!this.isEdit) { + DataService.create(this.dataUrl + "/", this.data) + .then(() => { + this.getItems(); + }); + } else { + DataService.update(this.dataUrl + "/" + this.data.id, this.data) + .then(() => { + this.getItems(); + }); + } + }, + removeSelectedItems() { + if (this.selectedItems.length === 0) { + return; + } + if (confirm('Удалить выбранные элементы?')) { + const promises = []; + const self = this; + this.selectedItems.forEach(item => { + promises.push(DataService.delete(this.dataUrl + "/" + item)); + }); + Promise.all(promises).then((results) => { + results.forEach(function (id) { + const index = self.selectedItems.indexOf(id); + if (index === - 1) { + return; + } + self.selectedItems.splice(index, 1); + }); + this.getItems(); + }); + } + } + } +} + +export default CatalogMixin; \ No newline at end of file diff --git a/front/vue-project/src/models/Component.js b/front/vue-project/src/models/Component.js index 801e415..3a9f7c5 100644 --- a/front/vue-project/src/models/Component.js +++ b/front/vue-project/src/models/Component.js @@ -2,6 +2,7 @@ export default class Component { constructor(data) { this._id = data?.id; this._amount = data?.amount; + this._componentName = data?.componentName; this._favorIds = data?._favorIds; } @@ -17,7 +18,18 @@ export default class Component { if (typeof value !== 'string' || value === null || value.length == 0) { throw 'New amount value ' + value + ' is not a string or empty'; } - this._number = value; + this._amount = value; + } + + get componentName() { + return this._componentName; + } + + set componentName(value) { + if (typeof value !== 'string' || value === null || value.length == 0) { + throw 'New name value ' + value + ' is not a string or empty'; + } + this._componentName = value; } get favorIds() { diff --git a/front/vue-project/src/models/Favor.js b/front/vue-project/src/models/Favor.js index 45e221e..0ea8167 100644 --- a/front/vue-project/src/models/Favor.js +++ b/front/vue-project/src/models/Favor.js @@ -1,6 +1,7 @@ export default class Favor { constructor(data) { this._id = data?.id; + this._favorName = data?.favorName; this._price = data?.price; this._componentIds = data?.componentIds; this._orderIds = data?.orderIds; @@ -11,6 +12,17 @@ export default class Favor { return this._id; } + get favorName() { + return this._favorName; + } + + set favorName(value) { + if (typeof value !== 'string' || value === null || value.length == 0) { + throw 'New name value ' + value + ' is not a string or empty'; + } + this._favorName = value; + } + get price() { return this._price; } diff --git a/front/vue-project/src/services/DataService.js b/front/vue-project/src/services/DataService.js new file mode 100644 index 0000000..54810c9 --- /dev/null +++ b/front/vue-project/src/services/DataService.js @@ -0,0 +1,42 @@ +import axios from 'axios'; + +function toJSON(data) { + const jsonObj = {}; + const fields = Object.getOwnPropertyNames(data); + for (const field of fields) { + if (data[field] === undefined) { + continue; + } + jsonObj[field.substring(1)] = data[field]; + } + return jsonObj; +} + +export default class DataService { + static dataUrlPrefix = 'http://localhost:8080/'; + + static async readAll(url, transformer) { + const response = await axios.get(this.dataUrlPrefix + url); + return response.data.map(item => transformer(item)); + } + + static async read(url, transformer) { + const response = await axios.get(this.dataUrlPrefix + url); + return transformer(response.data); + } + + static async create(url, data) { + const response = await axios.post(this.dataUrlPrefix + url, toJSON(data)); + return true; + } + + static async update(url, data) { + const response = await axios.put(this.dataUrlPrefix + url, toJSON(data)); + return true; + } + + static async delete(url) { + const response = await axios.delete(this.dataUrlPrefix + url); + return response.data.id; + } +} \ No newline at end of file