Commit 7ba811d2 authored by Matheu Palheta de Araújo Góes's avatar Matheu Palheta de Araújo Góes
Browse files

Merge branch 'fix/URL' into 'stg'

#49 - Fixar rotas em produção

See merge request !23
parents a6ccbf17 320dfb86
Showing with 279 additions and 127 deletions
+279 -127
FROM node:lts-alpine
# instala um servidor http simples para servir conteúdo estático
RUN npm install -g http-server
RUN npm install -g @vue/cli
# faz da pasta 'app' o diretório atual de trabalho
WORKDIR /app
# copia os arquivos 'package.json' e 'package-lock.json' (se disponível)
COPY package*.json ./
# instala dependências do projeto
......@@ -19,4 +14,4 @@ COPY . .
RUN npm run build
EXPOSE 8080
CMD [ "http-server", "dist" ]
\ No newline at end of file
CMD [ "npm", "run", "serve" ]
......@@ -8,4 +8,4 @@ services:
- "8080:8080"
container_name: vue-app
volumes:
- /app/node_modules
\ No newline at end of file
- /app/node_modules
......@@ -2151,63 +2151,6 @@
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true
},
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"ssri": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
......@@ -2216,28 +2159,6 @@
"requires": {
"minipass": "^3.1.1"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.8.1",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.1.tgz",
"integrity": "sha512-V53TJbHmzjBhCG5OYI2JWy/aYDspz4oVHKxS43Iy212GjGIG1T3EsB3+GWXFm/1z5VwjdjLmdZUFYM70y77vtQ==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
}
}
}
},
......@@ -11689,6 +11610,87 @@
}
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.8.1",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.1.tgz",
"integrity": "sha512-V53TJbHmzjBhCG5OYI2JWy/aYDspz4oVHKxS43Iy212GjGIG1T3EsB3+GWXFm/1z5VwjdjLmdZUFYM70y77vtQ==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"vue-router": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.2.tgz",
......
<template>
<div :class="newclass">
<div :class="newclass" @click="emitClick">
<round-button v-if="icon === 'icon-left'" icon="icon-left"/>
<h1>{{title}}</h1>
<round-button v-if="icon === 'icon-right'" icon="icon-right"/>
......@@ -22,6 +22,11 @@ export default {
type: String,
},
},
methods: {
emitClick(){
this.$emit("click");
}
}
}
</script>
......@@ -60,7 +65,6 @@ export default {
flex-direction: row;
align-items: center;
justify-content: space-between;
padding: 20px;
background-color: var(--primary-input-color);
border: none;
......@@ -72,7 +76,7 @@ export default {
.class h1{
margin: 0px;
font-weight: 600;
font-size: 30px;
font-size: 20px;
color: var(--primary-btn-focus-color);
}
</style>
\ No newline at end of file
......@@ -3,7 +3,7 @@
<template v-slot:header>
<h1 v-if="!link">Qual o nome da sua nova turma?</h1>
<h1 class="link-title" v-if="link">O link da sua turma foi gerado, você pode envia-lo para seus alunos.</h1>
<text-button class="close-button" textButton="X" @click="toggleModal"/>
<text-button class="close-button" textButton="X" @click="exitModal"/>
</template>
<template v-slot:body>
<input-component v-if="!link" v-model="createClassName" class="create-class-name" type="text" placeholder="Escreva o nome"/>
......@@ -37,6 +37,14 @@ export default {
this.$refs.modal.toggleModal()
this.createClassName = ""
},
exitModal() {
if(this.link != "") {
this.$router.go(0);
}else{
this.$refs.modal.toggleModal()
}
this.createClassName = ""
},
createClass() {
this.$emit("createClass", this.createClassName)
},
......
......@@ -6,10 +6,11 @@ import Login from "./screens/Login.vue";
import SignUp from "./screens/SignUp.vue";
import SignUpStudent from "./screens/SignUpStudent.vue";
import SignUpTeacher from "./screens/SignUpTeacher.vue";
import Modules from "./screens/Modules.vue";
import Home from "./screens/Home.vue";
import Activities from "./screens/Activities.vue";
import Module from "./screens/Module.vue";
import Invite from "./screens/Invite.vue"
import Class from "./screens/Class.vue"
import Activity from "./screens/Activity.vue"
Vue.use(VueRouter);
......@@ -20,8 +21,9 @@ const routes = [
{path: "/", component: ScreenStructure, children: [
{path: "/login", component: Login},
{path: "/signup", component: SignUp},
{ path: "/modules", component: Modules, meta: { authRequired: true } },
{ path: "/modules/:moduleId/activities", component: Activities, props: true },
{path: "/module/:moduleId", component: Module, props: true },
{path: "/activity/:activityId", component: Activity, props: true },
{path: "/class/:classId", component: Class, props: true },
{path: "/signup/student", component: SignUpStudent},
{path: "/signup/student/:classId", component: SignUpStudent},
{path: "/signup/teacher", component: SignUpTeacher},
......
<template>
<b-container>
<b-row class="activity-container">
<div class="central-content-class">
<create-class ref="modalCreateClass" :link="this.link"/>
<div class="card-top">
<card @click="toggleModal" class="half-card color-add" title="Adicionar aluno na turma"/>
<card class="half-card" title="Visualizar alunos"/>
</div>
<card title="Personalizar trilha" description="Você pode personalizar as trilhas da maneira que achar melhor" icon="icon-right"/>
<card title="Baixar CSV" description="Você pode baixar os dados estatísticos de desempenho da turma" icon="icon-right"/>
<primary-button class="correct-btn mt-3" text="Corrigir atividades"/>
</div>
<navigation/>
</b-row>
</b-container>
</template>
<script>
import Card from '../components/Card.vue'
import Navigation from "../components/Navigation.vue"
import PrimaryButton from '../components/buttons/PrimaryButton.vue'
import CreateClass from '../components/modals/CreateClass.vue'
import {mapGetters, mapMutations, mapActions} from "vuex"
export default {
components: { Navigation, Card, PrimaryButton, CreateClass },
data() {
return { link: "" }
},
props: {
moduleId: {
type: [String, Number]
},
},
computed: {
...mapGetters(['classObject'])
},
methods:{
...mapMutations(["setPageName", "setBackUrl"]),
...mapActions(["getClassByTeacherId"]),
toggleModal() {
this.$refs.modalCreateClass.toggleModal();
this.link = "http://18.191.60.168:8080" + this.classObject.urlInvite;
},
},
created(){
this.getClassByTeacherId(this.$route.params.classId);
},
mounted(){
this.setPageName(this.classObject.name);
this.setBackUrl("/home");
}
}
</script>
<style>
.central-content-class{
width: calc(100% - var(--bs-gutter-x));
height: calc(100vh - (91px + (var(--bs-gutter-x) * 3)))!important;
overflow-x: scroll;
}
.card-top{
display: flex;
flex-direction: row;
gap: calc(var(--bs-gutter-x) * 0.5);
}
.half-card{
width: 50vw;
height: 40vw;
margin-top: 0px!important;
}
.half-card h5{
text-align: initial;
font-size: 22px!important;
}
.color-add{
background: var(--primary-btn-color)!important;
}
.color-add h5{
color: #ffffff!important;
}
.correct-btn{
font-weight: 700!important;
height: 55px;
width: 100%;
}
</style>
\ No newline at end of file
<template>
<div>
<home-page-professor :key="getUserType" v-if="getUserType=='teacher'"/>
<home-page-aluno :key="getUserType" v-if="getUserType=='student'"/>
<home-teacher :key="getUserType" v-if="getUserType=='teacher'"/>
<home-student :key="getUserType" v-if="getUserType=='student'"/>
</div>
</template>
<script>
import HomePageProfessor from "./HomePageProfessor.vue"
import HomePageAluno from "./HomePageAluno.vue"
import HomeTeacher from "./HomeTeacher.vue"
import HomeStudent from "./HomeStudent.vue"
import {mapGetters} from "vuex"
export default {
components: {HomePageProfessor, HomePageAluno},
components: {HomeTeacher, HomeStudent},
computed: {
...mapGetters(["getUserType"])
}
......
......@@ -5,7 +5,6 @@
<div class="central-content">
<b-row class="home-top mt-3">
<mini-logo/>
<!--<primary-button class="create-class" text="Criar turma"/> -->
</b-row>
<div class="trail-progress">
<div class="progress-title">
......@@ -50,7 +49,7 @@ export default {
...mapMutations(["setPageName", "setBackUrl"]),
goToModule: function(module){
this.setPageName(module.title);
this.$router.push(`/modules/${module.id}/activities`);
this.$router.push(`/module/${module.id}`);
}
},
beforeMount(){
......
......@@ -8,9 +8,9 @@
<primary-button class="create-class" @click="toggleModal" text="Criar turma"/>
</b-row>
<div class="home-teacher-content">
<class-card title="Turmas antigas" class="old-classes" icon="icon-left"/>
<div class="classes-content">
<class-card title="Turma 101" class="class" icon="icon-right"/>
<ClassCard title="Turmas antigas" class="old-classes" icon="icon-left"/>
<div v-if="classesObject.length > 0" class="classes-content">
<ClassCard @click="goToClass(classObject.id)" ref="classesObject" v-for="classObject in classesObject" v-bind:key="classObject.id" :title="classObject.name" class="class" icon="icon-right"/>
</div>
</div>
</div>
......@@ -25,34 +25,47 @@ import PrimaryButton from "../components/buttons/PrimaryButton.vue"
import Navigation from "../components/Navigation.vue"
import ClassCard from "../components/ClassCard.vue"
import CreateClass from "../components/modals/CreateClass.vue"
import { mapActions, mapGetters, } from "vuex"
import {mapGetters, mapActions} from "vuex";
export default {
components: {MiniLogo, PrimaryButton, Navigation, ClassCard, CreateClass},
data() {
return {link: ""}
return {
link: ""
}
},
computed:{
...mapGetters(["actualUserId", "classesObject"])
},
methods: {
...mapActions(["createClassAction"]),
...mapGetters(["actualUserId"]),
...mapActions(["createClassAction", "getClassesByTeacherId"]),
toggleModal() {
this.$refs.modalCreateClass.toggleModal()
this.link = ""
this.$refs.modalCreateClass.toggleModal();
this.link = "";
this.getClassesByTeacherId(this.actualUserId);
},
exitModal() {
this.$refs.modalCreateClass.exitModal();
},
createClass(name) {
let classData = {
name: name,
teacherId: this.actualUserId()
teacherId: this.actualUserId
}
this.createClassAction(classData)
.then(response => {
console.log(response)
this.link = response
})
.catch(error => {
this.link = error
})
},
goToClass: function(classObjectId){
this.$router.push(`/class/${classObjectId}`);
}
},
beforeMount(){
this.getClassesByTeacherId(this.actualUserId);
}
}
</script>
......
......@@ -13,7 +13,6 @@
<div class="activity-content" v-if="activities.length > 0">
<activity v-for="activity in activities" v-bind:key="activity.title" :isBlocked="false" :title="activity.title" :description="activity.description"/>
</div>
</div>
</div>
<navigation/>
......
......@@ -6,8 +6,17 @@ axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*';
Vue.use(Vuex);
const GET_STATES_URL = "https://servicodados.ibge.gov.br/api/v1/localidades/estados";
const GET_CITIES_URL = (UF) => { return `https://servicodados.ibge.gov.br/api/v1/localidades/estados/${UF}/distritos`}
const GET_STATES_URL = "https://servicodados.ibge.gov.br/api/v1/localidades/estados?orderBy=nome";
const GET_CITIES_URL = (UF) => { return `https://servicodados.ibge.gov.br/api/v1/localidades/estados/${UF}/distritos?orderBy=nome`};
// Desenvolvimento local
//const URL_BACK = "http://localhost:8085";
//const URL_FRONT = "http://localhost:8080";
// Em produção
const URL_BACK = "http://18.191.60.168:8085";
const URL_FRONT = "http://18.191.60.168:8080";
export default new Vuex.Store({
state: {
pageName: '',
......@@ -16,7 +25,9 @@ export default new Vuex.Store({
cities: [],
actualUser: {},
modules: [],
actualModule: {}
actualModule: {},
classesObject: {},
classObject: {},
},
mutations: {
setPageName(state, pageName) {
......@@ -40,19 +51,39 @@ export default new Vuex.Store({
},
setModulesOnState(state, modules){
state.modules = modules;
},
setClassesOnState(state, classesObject){
state.classesObject = classesObject;
},
setClassOnState(state, classObject){
state.classObject = classObject;
}
},
actions: {
getClassByTeacherId({commit}, teacherId){
axios.get(`${URL_BACK}/api/class/${teacherId}`).then((classObject)=> {
commit("setClassOnState", classObject.data);
}).catch((error)=> {
console.error(error);
})
},
getClassesByTeacherId({commit}, teacherId){
axios.get(`${URL_BACK}/api/class/`, {params: {teacherId: teacherId}}).then((classesObject)=> {
commit("setClassesOnState", classesObject.data);
}).catch((error)=> {
console.error(error);
})
},
getStoryModules({commit}, idStory){
idStory = 1;
axios.get(`http://18.191.60.168:8085/api/story/${idStory}`).then((modules)=> {
axios.get(`${URL_BACK}/api/story/${idStory}`).then((modules)=> {
commit("setModulesOnState", modules.data);
}).catch((error)=> {
console.error(error);
})
},
getModuleById({commit}, id){
axios.get(`http://18.191.60.168:8085/api/story/modules/${id}`).then((module)=> {
axios.get(`${URL_BACK}/api/module/${id}`).then((module)=> {
commit("setActualModuleOnState", module.data);
}).catch((error)=> {
console.error(error);
......@@ -74,7 +105,7 @@ export default new Vuex.Store({
},
getUserByEmail({commit}, email){
return new Promise((resolve, reject) => {
axios.get("http://18.191.60.168:8085/api/auth", {params: {email: email}}).then(response => {
axios.get(URL_BACK +"/api/auth", {params: {email: email}}).then(response => {
commit("setActualUserOnState", response.data)
sessionStorage.setItem("actualUser", JSON.stringify(response.data));
resolve(response.data)
......@@ -85,11 +116,10 @@ export default new Vuex.Store({
});
},
createStudentAction(_, student){
student.pass = null;
return new Promise((resolve,reject) => {
axios.post("http://18.191.60.168:8085/api/student", student)
axios.post(URL_BACK +"/api/student", student)
.then(response => {
resolve(response);
})
......@@ -102,7 +132,7 @@ export default new Vuex.Store({
createTeacherAction(_, teacher){
teacher.pass = null;
return new Promise((resolve,reject) => {
axios.post("http://18.191.60.168:8085/api/teacher", teacher)
axios.post(URL_BACK +"/api/teacher", teacher)
.then(response => {
resolve(response);
})
......@@ -115,7 +145,7 @@ export default new Vuex.Store({
registerStudentClassAction(_, student){
student.pass = null;
return new Promise((resolve,reject) => {
axios.post("http://18.191.60.168:8085/api/register-student/", student)
axios.post(URL_BACK +"/api/register-student/", student)
.then(response => {
resolve(response);
})
......@@ -126,9 +156,9 @@ export default new Vuex.Store({
},
createClassAction(_, classData){
return new Promise((resolve,reject) => {
axios.post("http://18.191.60.168:8085/api/class/teacher/" + classData.teacherId, {'name': classData.name}, { headers: {'Content-Type': 'application/json'}})
axios.post(URL_BACK +"/api/class/teacher/" + classData.teacherId, {'name': classData.name}, { headers: {'Content-Type': 'application/json'}})
.then(response => {
resolve("http://18.191.60.168:8080" + response.data.urlInvite);
resolve(URL_FRONT + response.data.urlInvite);
})
.catch(error => {
reject(error);
......@@ -174,6 +204,12 @@ export default new Vuex.Store({
},
questions: state => {
return state.actualModule.questions;
}
},
classesObject: state => {
return state.classesObject;
},
classObject: state => {
return state.classObject;
},
}
});
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment