Angular and Laravel - Отображение и сохранение в базе данных на основе логина и идентификатора пользователя - PullRequest
0 голосов
/ 26 мая 2019

Я разрабатываю приложение для управления результатами с использованием Laravel Endpoint и Angular7 Frontend. Когда я сохраняю в базу данных, я хочу сохранить логин / идентификатор пользователя. Кроме того, он будет отображать данные на основе идентификатора входа. То есть, если UserId равен 1 (пользователь - Admin), он отобразит все данные, но если идентификатор пользователя - это любое другое число, кроме 1, он отобразит данные на основе логина / идентификатора пользователя в таблице

Я разработал эти таблицы:

  1. Пользователь: id, имя пользователя, адрес электронной почты, пароль
  2. Экзамен: id, имя_экзамена, идентификатор_пользователя
  3. Результат: идентификатор, идентификатор экзамена, идентификатор пользователя, оценка.

Кроме того, я разработал конечную точку Laravel и внешний интерфейс Angular7.

Конечная точка Laravel: Контроллер

    public function login(Request $request)
    {
        $credentials = $request->json()->all();

        try
        {
            if(! $token = JWTAuth::attempt($credentials))
            {
                return response()->json(['error' => 'invalid_credentials'], 400);
            } else {
                // Generate token from user 
                $token = JWTAuth::attempt($credentials);
                //return response()->json(compact('token'));
                return response()->json(                [
                    'access_token' => $token,
                    'token_type' => 'bearer'
                ]   );

            }
        }
        catch(JWTException $e)
        {
            return response()->json(['error' => 'could_not_create_token'], 500);
        }
    } 

Экзамен: Laravel EndPoint

    public function index()
    {
        $exams = Exam::all();
        return response()->json($exams);
    }

    public function store(Request $request)
    {
        $request->validate([
            'exam_name' => 'required'
        ]);

        $exam = Exam::create($request->all());

        return response()->json([
            'message' => 'Great success! New Exam created',
            'exam => $exam
        ]);
    }

    public function show(Exam $exam)
    {
        return $exam;
    }

апи

Route::get('/exams', 'ExamController@index')->name('exams.index');

Route::post('/exams', 'ExamController@store')->name('exams.store');

Route::get('/exams/{exam}', 'ExamController@show')->name('exams.show');

Angular: exam.service.ts

const apiUrl = "http://localhost/schoolbackend/public/api/exams";

  getExams (): Observable<Exam[]> {
    return this.http.get<Exam[]>(apiUrl)
      .pipe(
        tap(exams => console.log('Fetch exams')),
        catchError(this.handleError('getExams', []))
      );
  }

  addExam (exam): Observable<Exam> {
    return this.http.post<Exam>(apiUrl, exam, httpOptions).pipe(
      tap((exam: Exam) => console.log(`added exam w/ id=${exam._id}`)),
      catchError(this.handleError<Exam>('addExam'))
    );
  }

экзамен-display.component.ts

  ngOnInit() {

    this.api.getExams()
      .subscribe(res => {
        this.data = res;
        console.log(this.data);
        this.isLoadingResults = false;
      }, err => {
        console.log(err);
        this.isLoadingResults = false;
      });
  }

экзамен-add.component.ts

  onFormSubmit(form:NgForm) {
    this.isLoadingResults = true;
    this.api.addExam(form)
      .subscribe(res => {
         // let id = res['_id'];
          this.isLoadingResults = false;
          this.router.navigate(['/examlist']);
        }, (err) => {
          console.log(err);
          this.isLoadingResults = false;
        });
  }  

Когда пользователь входит в систему:

  1. Если user_id равен 1, то он является администратором и должен иметь возможность просматривать все данные в exam-display.ts, иначе следует видеть только его экзамен (на основе его user_id).
  2. Когда пользователь сохраняет в базу данных из exam-add.component.ts, его логин / user_id должен быть сохранен в экзаменационную таблицу

1 Ответ

0 голосов
/ 26 мая 2019

Ну, во-первых, я думаю, что вы должны создать отдельный столбец, такой как is_admin(boolean) в пользовательской таблице. Непосредственно узнавать по id не очень хорошая идея.

  1. Когда вы входите в систему с помощью Laravel, вы можете взять объект пользователя из auth::user() функция.
  2. Основываясь на этом результате, вы можете проверить, является ли пользователь администратором или нет.
  3. Если это администратор, вы можете получить все данные, иначе получите user_id.
  4. Аналогично, при сохранении в экзаменационной таблице вы снова можете получить пользователя из аутентификации.

Пример:

// exam controller

// for fetching exams
public function index()
{
    $userId = auth()->id();

    if ($userId == 1) {
       $exams = Exam::all();
    } else {
       $exams = Exam::where('user_id', $userId)->get(); 
    }

    return response()->json($exams);
}

// for creating new exam
public function store(Request $request)
{
    $request->validate([
        'exam_name' => 'required'
    ]);

    $exam = new Exam;
    $exam->exam_name = $request->exam_name;
    $exam->user_id = auth()->id()
    $exam->save();

    return response()->json([
        'message' => 'Great success! New Exam created',
        'exam => $exam
    ]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...