sajjad_talkhabi 3 years ago
parent a842fa3ad7
commit af97b05281

5
package-lock.json generated

@ -6824,6 +6824,11 @@
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
"dev": true "dev": true
}, },
"izitoast": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/izitoast/-/izitoast-1.4.0.tgz",
"integrity": "sha512-Oc1X2wiQtPp39i5VpIjf3GJf5sfCtHKXZ5szx7RareyEeFLUlcEW0FSfBni28+Ul6KNKZRKzhVuWzSP4Xngh0w=="
},
"javascript-stringify": { "javascript-stringify": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.nlark.com/javascript-stringify/download/javascript-stringify-2.1.0.tgz", "resolved": "https://registry.nlark.com/javascript-stringify/download/javascript-stringify-2.1.0.tgz",

@ -11,6 +11,7 @@
"axios": "^0.21.4", "axios": "^0.21.4",
"bootstrap": "^4.6.0", "bootstrap": "^4.6.0",
"core-js": "^3.6.5", "core-js": "^3.6.5",
"izitoast": "^1.4.0",
"jquery": "^3.6.0", "jquery": "^3.6.0",
"meta-router": "^4.0.1", "meta-router": "^4.0.1",
"popper.js": "^1.16.1", "popper.js": "^1.16.1",

@ -0,0 +1,15 @@
import axios from "axios";
import url from "@/router/url";
import {
getArray,
} from "../resources/programResource";
export default class ProgramRepository {
async index() {
let response = await axios.get(url("indexProgram"), {
headers: { 'accept-language': 'en' },
});
if (response.status === 200) {
return getArray(response.data);
}
}
}

@ -0,0 +1,22 @@
import { SetPagination } from "@/utils/setQueriesObject";
import { getJsonTrainer } from './trainerProgramResource';
import { getJsonSportCategory } from './sportCategoryPorgramResource';
export const getJson = (data) => ({
id: data.id,
trainer: data.trainer ? getJsonTrainer(data.trainer) : {},
sport_category: data.trainer ? getJsonSportCategory(data.trainer) : {},
sport_category_id: data.sport_category_id,
status: data.status,
title: data.title,
description: data.description,
created_at: data.created_at,
updated_at: data.updated_at,
series_count: data.series_count
});
export const getArray = ({ data, meta }) => {
const pagination = SetPagination(meta);
data = data.map((program) => getJson(program));
return { data, pagination };
};

@ -0,0 +1,6 @@
export const getJsonSportCategory = (data) => ({
id: data.sport_category.id,
name: data.sport_category.name,
local_name: data.sport_category.local_name,
language_id: data.sport_category.language_id,
})

@ -0,0 +1,11 @@
export const getJsonTrainer = (data) => ({
id: data.trainer.id,
first_name: data.trainer.first_name,
last_name: data.trainer.last_name,
birthday: data.trainer.birthday,
weight: data.trainer.weight,
height: data.trainer.height,
arm_diameter: data.trainer.arm_diameter,
leg_diameter: data.trainer.leg_diameter,
details: data.trainer.details
})

@ -31,7 +31,14 @@
</div> </div>
</div> </div>
<v-row class="mt-4"> <v-row class="mt-4">
<v-col cols="12" sm="4" v-for="program in programs" :key="program.id" class="mb-3"><ProgramItem :program="program" /></v-col> <v-col
cols="12"
sm="4"
v-for="program in programs"
:key="program.id"
class="mb-3"
><ProgramItem :program="program"
/></v-col>
</v-row> </v-row>
</div> </div>
</main-back> </main-back>
@ -44,11 +51,22 @@ import ThirdImage from "../../assets/5595849.jpg";
import FourthImage from "../../assets/28-284379_photo-wallpaper-man-workout-gym-working-gym-workout.jpg"; import FourthImage from "../../assets/28-284379_photo-wallpaper-man-workout-gym-working-gym-workout.jpg";
import SectionTitle from "../Global/Section/SectionTitle.vue"; import SectionTitle from "../Global/Section/SectionTitle.vue";
import ProgramItem from "./Item.vue"; import ProgramItem from "./Item.vue";
import { mapGetters, mapActions } from "vuex";
export default { export default {
components: { components: {
SectionTitle, SectionTitle,
ProgramItem, ProgramItem,
}, },
computed: {
...mapGetters("programs", ["getPrograms"]),
},
methods: {
...mapActions("programs", ["loadPrograms"]),
},
created() {
this.loadPrograms();
console.log("getPrograms", this.getPrograms);
},
data: () => ({ data: () => ({
programs: [ programs: [
{ {

@ -7,7 +7,7 @@ import './utils/GlobalComponents';
import "./styles/global.scss"; import "./styles/global.scss";
import './mixins/Global.js'; import './mixins/Global.js';
import ApiService from '@/utils/axios/api'; import ApiService from '@/utils/axios/api';
ApiService.init('https://www.champya-dev.ir'); ApiService.init('https://app.champya-dev.ir');
import '@/utils/axios/errorHandler'; import '@/utils/axios/errorHandler';
Vue.config.productionTip = false Vue.config.productionTip = false

@ -1,7 +1,11 @@
import { urlGenerator } from "@/utils/urlGenerator"; import { urlGenerator } from "@/utils/urlGenerator";
const urls = { const urls = {
login: "auth/login" login: "auth/login",
register: "auth/register",
resetPassword: "auth/forget-password",
logout: "auth/logout",
indexProgram: 'courses'
}; };
export default urlGenerator(urls); export default urlGenerator(urls);

@ -1,5 +1,5 @@
import AuthRepository from "../../../abstraction/repository/authRepository"; import AuthRepository from "../../../abstraction/repository/authRepository";
import {TokenStorage, UserStorage} from "@/utils/storage"; import { TokenStorage, UserStorage } from "@/utils/storage";
import ApiService from "@/utils/axios/api"; import ApiService from "@/utils/axios/api";
function setTokenHeader(commit, response) { function setTokenHeader(commit, response) {
@ -10,7 +10,8 @@ function setTokenHeader(commit, response) {
} }
export default { export default {
async login({commit}, data) { async login({ commit }, data) {
console.log(data);
let repository = new AuthRepository(); let repository = new AuthRepository();
const response = await repository.login(data); const response = await repository.login(data);
if (response) { if (response) {
@ -25,7 +26,7 @@ export default {
TokenStorage.removeToken(); TokenStorage.removeToken();
return true; return true;
}, },
async register({commit}, data) { async register({ commit }, data) {
let repository = new AuthRepository(); let repository = new AuthRepository();
const response = await repository.register(data); const response = await repository.register(data);
setTokenHeader(commit, response); setTokenHeader(commit, response);

@ -0,0 +1,15 @@
import ProgramRepository from "@/abstraction/repository/programRepository";
export default {
async loadPrograms({ state, commit }) {
try {
let data = { pagination: state.pagination };
let repository = new ProgramRepository();
const resource = await repository.index(data);
console.log(resource.data);
commit("SET_PROGRAMS", resource.data);
commit("SET_PAGINATION", resource.pagination);
} catch (e) {
return e;
}
},
};

@ -0,0 +1,3 @@
export default {
getPrograms: state => state.programs,
};

@ -0,0 +1,11 @@
import Vue from "vue";
export default {
SET_PROGRAMS(state, data) {
Vue.set(state, "programs", data);
},
SET_PAGINATION(state, pagination) {
pagination = { ...state.pagination, ...pagination };
Vue.set(state, "pagination", pagination);
},
};

@ -0,0 +1,6 @@
export default {
programs: [],
pagination: {
itemsPerPage: 12
},
};

@ -1,6 +1,6 @@
import axios from "axios"; import axios from "axios";
import store from "@/store"; import store from "@/store";
// import toast from "../toast"; import toast from "../toast";
import Vue from "vue"; import Vue from "vue";
import { TokenStorage } from "../storage"; import { TokenStorage } from "../storage";
import ApiService from "./api"; import ApiService from "./api";
@ -20,17 +20,17 @@ function errorResponseHandler(error) {
ApiService.removeAuthHeader(); ApiService.removeAuthHeader();
store.commit('auth/logout', {}, { root: true }); store.commit('auth/logout', {}, { root: true });
window.location.href = '/'; window.location.href = '/';
// toast.error('Wrong username or password.', 'Error'); toast.error('Wrong username or password.', 'Error');
} else if (error.response.status === 422) { } else if (error.response.status === 422) {
if (typeof error.response.data.errors !== 'undefined') { if (typeof error.response.data.errors !== 'undefined') {
for (const key in error.response.data.errors) { for (const key in error.response.data.errors) {
if (Object.prototype.hasOwnProperty.call(error.response.data.errors, key)) { if (Object.prototype.hasOwnProperty.call(error.response.data.errors, key)) {
// toast.error(error.response.data.errors[key], 'Error'); toast.error(error.response.data.errors[key], 'Error');
} }
} }
} }
} else if (error.response.status === 500) { } else if (error.response.status === 500) {
// toast.error('Server Error', 'Error'); toast.error('Server Error', 'Error');
} }
} }
return Promise.reject(error); return Promise.reject(error);
@ -38,7 +38,7 @@ function errorResponseHandler(error) {
function successHandler(response) { function successHandler(response) {
if (response.status === 200 || response.status === 201) { if (response.status === 200 || response.status === 201) {
if (typeof response.data.message !== 'undefined' && typeof response.data.message.content !== 'undefined') { if (typeof response.data.message !== 'undefined' && typeof response.data.message.content !== 'undefined') {
// toast.success(response.data.message.content, response.data.message.title || 'Success'); toast.success(response.data.message.content, response.data.message.title || 'Success');
} }
} }
return response; return response;

@ -37,6 +37,7 @@ const UserStorage = {
save(user = null) { save(user = null) {
user = qs.stringify(user); user = qs.stringify(user);
localStorage.setItem(USER, user); localStorage.setItem(USER, user);
console.log('user saved');
}, },
remove() { remove() {

@ -0,0 +1,23 @@
import "izitoast/dist/css/iziToast.min.css";
import iZtoast from "izitoast";
const toast = {
error: (message, title = "Error") => {
return iZtoast.error({
title: title,
message: message,
rtl: true,
position: "bottomCenter"
});
},
success: (message, title = "Success") => {
return iZtoast.success({
title: title,
message: message,
rtl: true,
position: "bottomCenter"
});
}
};
export default toast;

@ -1,5 +1,5 @@
const urlGenerator = (urls) => { const urlGenerator = (urls) => {
return function(routeAddress, parameters) { return function (routeAddress, parameters) {
let urlPath = urls[routeAddress].split("/"); let urlPath = urls[routeAddress].split("/");
let newPath = []; let newPath = [];
for (const iterator of urlPath) { for (const iterator of urlPath) {
@ -15,7 +15,7 @@ const urlGenerator = (urls) => {
newPath.push(iterator); newPath.push(iterator);
} }
} }
return '/api/' + newPath.join("/"); return '/api/v1/' + newPath.join("/");
} }
}; };

@ -48,7 +48,7 @@
height="25" height="25"
:text-mode="true" :text-mode="true"
text="sign in" text="sign in"
@click.native="login" @click.native="doLogin"
/></router-link> /></router-link>
</div> </div>
</v-col> </v-col>
@ -105,10 +105,11 @@ export default {
methods: { methods: {
...mapActions("auth", ["login"]), ...mapActions("auth", ["login"]),
async doLogin() { async doLogin() {
const response = await this.login(this.form); console.log(this.form);
if (response) { this.login(this.form);
this.$router.push(this.$route.query.redirect || "/"); // if (response) {
} // this.$router.push(this.$route.query.redirect || "/");
// }
}, },
}, },
}; };

@ -22,6 +22,8 @@
placeholder="your email address" placeholder="your email address"
label="your email address" label="your email address"
class="no-error-msg" class="no-error-msg"
dark
v-model="form.email"
></v-text-field> ></v-text-field>
</v-col> </v-col>
</v-row> </v-row>
@ -33,6 +35,7 @@
height="25" height="25"
:text-mode="true" :text-mode="true"
text="send the code" text="send the code"
@click.native="resetPassword"
/> />
</v-col> </v-col>
<v-col cols="12" class="pt-0"> <v-col cols="12" class="pt-0">
@ -62,9 +65,19 @@
</template> </template>
<script> <script>
import AuthBasic from "../components/Global/Section/AuthBasic.vue"; import AuthBasic from "../components/Global/Section/AuthBasic.vue";
import AuthRepository from "../abstraction/repository/authRepository";
export default { export default {
components: { components: {
AuthBasic, AuthBasic,
}, },
data: () => ({
form: {},
}),
methods: {
async resetPassword() {
let repository = new AuthRepository();
await repository.resetPassword(this.form);
},
},
}; };
</script> </script>

@ -20,17 +20,28 @@
placeholder="your email address" placeholder="your email address"
label="your email address" label="your email address"
class="no-error-msg" class="no-error-msg"
dark
v-model="form.email"
></v-text-field> ></v-text-field>
</v-col> </v-col>
</v-row> </v-row>
<v-row> <v-row>
<v-col class="pt-0" cols="12"> <v-col class="pt-0" cols="6">
<v-text-field <v-text-field
placeholder="your full name" placeholder="your first name"
label="your full name" label="your first name"
class="no-error-msg" class="no-error-msg"
dark
v-model="form.first_name"
></v-text-field>
</v-col>
<v-col class="pt-0" cols="6">
<v-text-field
placeholder="your last name"
label="your last name"
class="no-error-msg"
dark
v-model="form.last_name"
></v-text-field> ></v-text-field>
</v-col> </v-col>
</v-row> </v-row>
@ -40,7 +51,8 @@
placeholder="password" placeholder="password"
label="password" label="password"
class="no-error-msg" class="no-error-msg"
dark
v-model="form.password"
></v-text-field> ></v-text-field>
</v-col> </v-col>
</v-row> </v-row>
@ -50,7 +62,8 @@
placeholder="your password again" placeholder="your password again"
label="your password again" label="your password again"
class="no-error-msg" class="no-error-msg"
dark
v-model="form.password_confirmation"
></v-text-field> ></v-text-field>
</v-col> </v-col>
</v-row> </v-row>
@ -63,6 +76,7 @@
height="25" height="25"
:text-mode="true" :text-mode="true"
text="do sign up" text="do sign up"
@click.native="register(form)"
/></router-link> /></router-link>
</div> </div>
</v-col> </v-col>
@ -107,9 +121,16 @@
</template> </template>
<script> <script>
import AuthBasic from "../components/Global/Section/AuthBasic.vue"; import AuthBasic from "../components/Global/Section/AuthBasic.vue";
import { mapActions } from "vuex";
export default { export default {
components: { components: {
AuthBasic, AuthBasic,
}, },
data: () => ({
form: {},
}),
methods: {
...mapActions("auth", ["register"]),
},
}; };
</script> </script>
Loading…
Cancel
Save