diff --git a/app/Http/Controllers/JobController.php b/app/Http/Controllers/JobController.php index 647e6d7..d841c9c 100644 --- a/app/Http/Controllers/JobController.php +++ b/app/Http/Controllers/JobController.php @@ -14,15 +14,26 @@ class JobController extends Controller } public function getByComputerId(Request $request){ + $request->validate([ + 'computer_id' => 'required|exists:computers,id' + ]); return Job::select()->where('computer_id', '=', $request->get('computer_id'))->get(); } + public function getById(Request $request){ + $request->validate([ + 'id' => 'required|exists:jobs,id' + ]); + return Job::find($request->get('id')); +// return Job::select()->where('id', '=', $request->get('id'))->get(); + } + public function create(Request $request) { $request->validate([ 'computer_id' => 'required|exists:computers,id', 'description' => 'required|string|max:256', - 'status' => 'nullable|boolean' + 'status' => 'required|string|max:256' ]); $job = Job::create($request->all()); @@ -35,7 +46,7 @@ class JobController extends Controller 'id' => 'required|exists:jobs,id', 'computer_id' => 'required|exists:computers,id', 'description' => 'required|string|max:256', - 'status' => 'nullable|boolean' + 'status' => 'required|string|max:256' ]); $job = Job::find($request->get('id')); diff --git a/database/migrations/2024_10_31_091129_create_jobs_table.php b/database/migrations/2024_10_31_091129_create_jobs_table.php index 4485e8f..727214e 100644 --- a/database/migrations/2024_10_31_091129_create_jobs_table.php +++ b/database/migrations/2024_10_31_091129_create_jobs_table.php @@ -16,7 +16,7 @@ return new class extends Migration $table->unsignedBigInteger('computer_id'); $table->foreign('computer_id')->references('id')->on('computers'); $table->string('description', length: 256); - $table->boolean('status')->default(false); + $table->string('status', length: 256); $table->timestamps(); }); } diff --git a/resources/App.vue b/resources/App.vue index 2474133..c989048 100644 --- a/resources/App.vue +++ b/resources/App.vue @@ -89,7 +89,6 @@ export default { mounted() { this.resizeEventHandler(); window.addEventListener("resize", this.resizeEventHandler, { passive: true }); - this.userStore.checkUser(); watch(this.userStore, (newStore)=>{ this.authenticated = newStore.user !== null && newStore.user !== undefined; if (!this.authenticated){ @@ -98,6 +97,7 @@ export default { this.$router.push('/'); } }); + this.userStore.checkUser(); } } diff --git a/resources/store/auth.js b/resources/store/auth.js index 905e9f3..abe66d1 100644 --- a/resources/store/auth.js +++ b/resources/store/auth.js @@ -33,6 +33,7 @@ export const useUserStore = defineStore('user', { }) }, async login(email, password, rememberMe) { + let responce = false; await axios.post( '/api/auth/login', { @@ -42,15 +43,17 @@ export const useUserStore = defineStore('user', { }).then((res) => { this.setUser(res.data.user); this.setToken(res.data.accessToken); - return true; + responce = true; }).catch((error) => { if (!error.response) { - return false; + responce = false; } - return error.response.data.message; + responce = error.response.data.message; }) + return responce; }, async registration(login, email, password, repeatPassword) { + let responce = false; await axios.post( '/api/auth/register', { @@ -61,13 +64,14 @@ export const useUserStore = defineStore('user', { }).then((res) => { this.setUser(res.data.user); this.setToken(res.data.accessToken); - return true; + responce = true; }).catch((error) => { if (!error.response) { - return false; + responce = false; } - return error.response.data.message; + responce= error.response.data.message; }) + return responce; }, logout() { axios.get('/api/auth/logout', diff --git a/resources/store/computers.js b/resources/store/computers.js index 19f45bf..f855fc1 100644 --- a/resources/store/computers.js +++ b/resources/store/computers.js @@ -12,9 +12,11 @@ export const useComputersStore = defineStore('computers', { this.token = token; localStorage.setItem('auth_token', token); }, + checkToken(){ this.token = useUserStore().token; }, + async getById(id){ if (this.token === null){ this.checkToken(); @@ -36,6 +38,7 @@ export const useComputersStore = defineStore('computers', { }); return result; }, + async getComputerList(user_id){ if (this.token === null){ this.checkToken(); @@ -55,6 +58,114 @@ export const useComputersStore = defineStore('computers', { this.computers = response.data; }) }, + + async getJobsByComputerId(computerId){ + if (this.token === null){ + this.checkToken(); + } + let result = null; + await axios.get( + '/api/data/jobs/byComputer', + { + headers: { + Authorization: `Bearer ${this.token}`, + token: this.token + }, + params: { + computer_id: computerId + } + } + ).then((response)=>{ + result = response.data; + }); + return result; + }, + + async getJobsById(id){ + if (this.token === null){ + this.checkToken(); + } + let result = null; + await axios.get( + '/api/data/jobs/byId', + { + headers: { + Authorization: `Bearer ${this.token}`, + token: this.token + }, + params: { + id: id + } + } + ).then((response)=>{ + result = response.data; + }); + return result; + }, + + async createJob(computerId, description, status){ + if (this.token === null){ + this.checkToken(); + } + await axios.post('/api/data/jobs/create', { + computer_id: computerId, + description: description, + status: status + }, { + headers: { + Authorization: `Bearer ${this.token}`, + token: this.token + }, + }).then(()=>{ + return true; + }).catch(()=>{ + return false; + }); + }, + + async updateJob(id, computerId, description, status){ + if (this.token === null){ + this.checkToken(); + } + await axios.post('/api/data/jobs/save', { + id: id, + computer_id: computerId, + description: description, + status: status + }, { + headers: { + Authorization: `Bearer ${this.token}`, + token: this.token + }, + }).then(()=>{ + this.getComputerList(useUserStore().user['id']); + return true; + }).catch(()=>{ + return false; + }); + }, + + async deleteJob(id){ + if (this.token === null){ + this.checkToken(); + } + let result = false; + await axios.post('/api/data/jobs/delete', { + id: id, + }, { + headers: { + Authorization: `Bearer ${this.token}`, + token: this.token + }, + }).then(()=>{ + this.getComputerList(useUserStore().user['id']); + result = true; + }).catch(()=>{ + result = false; + }); + return result; + }, + async create(name, cpu, ram, motherboard, gpu, additional_info){ if (this.token === null){ this.checkToken(); @@ -79,6 +190,7 @@ export const useComputersStore = defineStore('computers', { return false; }); }, + async update(id, name, cpu, ram, motherboard, gpu, additional_info){ if (this.token === null){ this.checkToken(); @@ -103,6 +215,7 @@ export const useComputersStore = defineStore('computers', { return false; }); }, + async delete(id){ if (this.token === null){ this.checkToken(); diff --git a/resources/views/Computers/EditForm.vue b/resources/views/Computers/EditForm.vue index b9e594c..3927168 100644 --- a/resources/views/Computers/EditForm.vue +++ b/resources/views/Computers/EditForm.vue @@ -78,10 +78,10 @@ export default { \ No newline at end of file + diff --git a/resources/views/ComputersList.vue b/resources/views/ComputersList.vue index ff4cf28..3706e1f 100644 --- a/resources/views/ComputersList.vue +++ b/resources/views/ComputersList.vue @@ -52,7 +52,7 @@ export default { } }, mounted() { - this.userStore.checkUser(); + this.computerList = this.computersStore.computers; watch(this.userStore, (newStore)=>{ this.fetching = true; this.authenticated = newStore.user !== null && newStore.user !== undefined; diff --git a/resources/views/Jobs/CreateJobForm.vue b/resources/views/Jobs/CreateJobForm.vue new file mode 100644 index 0000000..0719502 --- /dev/null +++ b/resources/views/Jobs/CreateJobForm.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/resources/views/Jobs/EditJobForm.vue b/resources/views/Jobs/EditJobForm.vue new file mode 100644 index 0000000..a53b12b --- /dev/null +++ b/resources/views/Jobs/EditJobForm.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/resources/views/JobsList.vue b/resources/views/JobsList.vue index 8329039..a07c064 100644 --- a/resources/views/JobsList.vue +++ b/resources/views/JobsList.vue @@ -1,20 +1,86 @@ @@ -25,12 +91,51 @@ export default { Назад -
- +
+
+ + {{ job['description'] }} + + + + +
+ +
+
+ +
+
+
+ + + +
+ + + + + + + + + + Вы уверены? + Это действие удалит запись +
+ Да + Нет +
+
+
+
diff --git a/resources/views/Login.vue b/resources/views/Login.vue index 354d4ac..ec255a4 100644 --- a/resources/views/Login.vue +++ b/resources/views/Login.vue @@ -14,6 +14,7 @@ @click:append="showPassword = !showPassword" required> + {{ errorMessage }}
Войти @@ -53,7 +54,6 @@ export default { if (isLogged){ this.errorMessage = ''; this.errorMessageContainerStyle = 'display: none;'; - this.$router.push('/'); } else { this.errorMessage = 'Authentication error'; this.errorMessageContainerStyle = ''; @@ -63,7 +63,6 @@ export default { this.errorMessageContainerStyle = ''; } }); - this.$router.push('/'); }, } } diff --git a/resources/views/Register.vue b/resources/views/Register.vue index cf4664a..f81dfa4 100644 --- a/resources/views/Register.vue +++ b/resources/views/Register.vue @@ -29,7 +29,6 @@ export default { if (isRegistred){ this.errorMessage = ''; this.errorMessageContainerStyle = 'display: none;'; - this.$router.push('/'); } else { this.errorMessage = 'Registration error'; this.errorMessageContainerStyle = ''; diff --git a/routes/api.php b/routes/api.php index 9ca164c..975f3f2 100644 --- a/routes/api.php +++ b/routes/api.php @@ -44,6 +44,7 @@ Route::group(['prefix' => 'data'], function () { Route::group(['prefix' => 'jobs'], function () { Route::get('all', [JobController::class, 'index']); Route::get('byComputer', [JobController::class, 'getByComputerId']); + Route::get('byId', [JobController::class, 'getById']); Route::post('create', [JobController::class, 'create']); Route::post('save', [JobController::class, 'update']); Route::post('delete', [JobController::class, 'destroy']);