implement vuex et authent #2
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,4 +1,4 @@
|
||||
__*
|
||||
__pycache__
|
||||
env
|
||||
venv
|
||||
dist
|
0
backend/__init__.py
Normal file
0
backend/__init__.py
Normal file
0
backend/chainetv/__init__.py
Normal file
0
backend/chainetv/__init__.py
Normal file
34
backend/chainetv/api.py
Normal file
34
backend/chainetv/api.py
Normal file
@ -0,0 +1,34 @@
|
||||
from flask import Blueprint, jsonify, request,make_response,redirect,url_for,render_template
|
||||
from chainetv.Jsonfile import JSONfile
|
||||
from chainetv import emission
|
||||
data= JSONfile("chaine.json")
|
||||
|
||||
|
||||
api = Blueprint("api", __name__)
|
||||
@api.route('/ping', methods=['GET'])
|
||||
def ping_pong():
|
||||
return jsonify('pong!')
|
||||
|
||||
@api.route('/chaine/<num>', methods=['GET'])
|
||||
def get_chaine(num):
|
||||
chaine=data.get_chaine(num)
|
||||
if (chaine == "numero de chaine inconnue"):
|
||||
return make_response("",204)
|
||||
else:
|
||||
return jsonify(chaine)
|
||||
|
||||
@api.route('/chaine/', methods=['put'])
|
||||
def update_list():
|
||||
status=data.parsechaine()
|
||||
if(status=='ok'):
|
||||
return jsonify("OK")
|
||||
else:
|
||||
return make_response('Error during Chaine Update',500)
|
||||
|
||||
@api.route('/chaine/<num>/emission', methods=['GET'])
|
||||
def get_emmission(num):
|
||||
chaine=data.get_chaine(num)
|
||||
if (chaine == "numero de chaine inconnue"):
|
||||
return make_response("",204)
|
||||
else:
|
||||
return jsonify(emission.parse_emmission(chaine))
|
21
backend/chainetv/app.py
Normal file
21
backend/chainetv/app.py
Normal file
@ -0,0 +1,21 @@
|
||||
from flask import Flask,render_template
|
||||
from flask_cors import CORS
|
||||
|
||||
#from ReverseProxied import ReverseProxied
|
||||
def create_app(app_name=__name__):
|
||||
app=Flask(__name__, static_folder= "../dist/static",template_folder="../dist")
|
||||
app.config.from_object('chainetv.config.BaseConfig')
|
||||
#app.wsgi_app = ReverseProxied(app.wsgi_app)
|
||||
CORS(app)
|
||||
from chainetv.api import api
|
||||
app.register_blueprint(api, url_prefix="/api/v1")
|
||||
@app.route('/')
|
||||
@app.route('/<path:path>')
|
||||
def index(path="/"):
|
||||
return render_template('index.html')
|
||||
return app
|
||||
|
||||
|
||||
##@app.errorhandler(404)
|
||||
##def ma_page_404(error):
|
||||
## return redirect("https://www.ducamps.win/404/404.html", 307)
|
3
backend/chainetv/config.py
Normal file
3
backend/chainetv/config.py
Normal file
@ -0,0 +1,3 @@
|
||||
class BaseConfig(object):
|
||||
DEBUG = True
|
||||
SECRET_KEY = 'mysecretkeyg'
|
@ -24,14 +24,22 @@ def parse_emmission(strsearch):
|
||||
html = response.read()
|
||||
parse=BeautifulSoup(html,"html.parser")
|
||||
divcasting=parse.select_one(".descriptif")
|
||||
casting=divcasting.find_all(href=re.compile("biographie"))
|
||||
count=0
|
||||
for actor in casting:
|
||||
casting[count]=actor.text
|
||||
count+=1
|
||||
if (divcasting):
|
||||
casting=divcasting.find_all(href=re.compile("biographie"))
|
||||
count=0
|
||||
for actor in casting:
|
||||
casting[count]=actor.text
|
||||
count+=1
|
||||
else:
|
||||
casting= None
|
||||
divsynopsis=parse.select_one(".episode-synopsis")
|
||||
img=divsynopsis.find_next('img')['data-src']
|
||||
synopsis=divsynopsis.select_one(".d-b").text
|
||||
if (divsynopsis):
|
||||
img=divsynopsis.find_next('img')['data-src']
|
||||
synopsis=divsynopsis.select_one(".d-b").text
|
||||
else:
|
||||
img=None
|
||||
synopsis=""
|
||||
|
||||
return {'title':link['title'],'href':href,'casting':casting,'synopsis':remove_first_space(synopsis),'img':img}
|
||||
|
||||
|
@ -1,52 +1,5 @@
|
||||
from flask import Flask,request,make_response,redirect,url_for,render_template,jsonify
|
||||
from flask_cors import CORS
|
||||
from Jsonfile import JSONfile
|
||||
#from ReverseProxied import ReverseProxied
|
||||
import emission
|
||||
data= JSONfile("chaine.json")
|
||||
app=Flask(__name__,static_folder = "./dist/static",template_folder="./dist")
|
||||
#app.wsgi_app = ReverseProxied(app.wsgi_app)
|
||||
CORS(app)
|
||||
|
||||
@app.route('/', defaults={'path': ''})
|
||||
@app.route('/<path:path>')
|
||||
def index(path):
|
||||
return render_template('index.html')
|
||||
|
||||
@app.route('/api/v1/ping', methods=['GET'])
|
||||
def ping_pong():
|
||||
return jsonify('pong!')
|
||||
|
||||
@app.route('/api/v1/chaine/<num>', methods=['GET'])
|
||||
def get_chaine(num):
|
||||
chaine=data.get_chaine(num)
|
||||
if (chaine == "numero de chaine inconnue"):
|
||||
return make_response("",204)
|
||||
else:
|
||||
return jsonify(chaine)
|
||||
|
||||
@app.route('/api/v1/chaine/', methods=['put'])
|
||||
def update_list():
|
||||
status=data.parsechaine()
|
||||
if(status=='ok'):
|
||||
return jsonify("OK")
|
||||
else:
|
||||
return make_response('Error during Chaine Update',500)
|
||||
|
||||
@app.route('/api/v1/chaine/<num>/emission', methods=['GET'])
|
||||
def get_emmission(num):
|
||||
chaine=data.get_chaine(num)
|
||||
if (chaine == "numero de chaine inconnue"):
|
||||
return make_response("",204)
|
||||
else:
|
||||
return jsonify(emission.parse_emmission(chaine))
|
||||
|
||||
##@app.errorhandler(404)
|
||||
##def ma_page_404(error):
|
||||
## return redirect("https://www.ducamps.win/404/404.html", 307)
|
||||
|
||||
|
||||
|
||||
|
||||
from chainetv.app import create_app
|
||||
app= create_app()
|
||||
if __name__ == '__main__':
|
||||
app.run(debug=True)
|
||||
app.run()
|
5
client/package-lock.json
generated
5
client/package-lock.json
generated
@ -11773,6 +11773,11 @@
|
||||
"integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
|
||||
"dev": true
|
||||
},
|
||||
"vuex": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/vuex/-/vuex-3.1.0.tgz",
|
||||
"integrity": "sha512-mdHeHT/7u4BncpUZMlxNaIdcN/HIt1GsGG5LKByArvYG/v6DvHcOxvDCts+7SRdCoIRGllK8IMZvQtQXLppDYg=="
|
||||
},
|
||||
"watchpack": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
|
||||
|
@ -14,7 +14,8 @@
|
||||
"axios": "^0.18.0",
|
||||
"bulma": "^0.7.4",
|
||||
"vue": "^2.5.2",
|
||||
"vue-router": "^3.0.1"
|
||||
"vue-router": "^3.0.1",
|
||||
"vuex": "^3.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"autoprefixer": "^7.1.2",
|
||||
|
20
client/src/api/index.js
Normal file
20
client/src/api/index.js
Normal file
@ -0,0 +1,20 @@
|
||||
import axios from "axios";
|
||||
|
||||
const API_PATH=`${process.env.ROOT_API}/api/v1`;
|
||||
|
||||
export function fetchchaine(num){
|
||||
|
||||
return axios.get(`${API_PATH}/chaine/${num}`)
|
||||
}
|
||||
|
||||
export function fetchemission(num){
|
||||
|
||||
return axios.get(`${API_PATH}/chaine/${num}/emission`)
|
||||
|
||||
}
|
||||
|
||||
export function putparsechaine(){
|
||||
|
||||
return axios.put(`${API_PATH}/chaine/`);
|
||||
|
||||
}
|
@ -29,8 +29,8 @@
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="container">
|
||||
<ul class v-if="arrayresultchaines">
|
||||
<li class="box" v-for="result in arrayresultchaines" v-bind:key="result.chaine">
|
||||
<ul class v-if="this.$store.state.arrayresultchaines">
|
||||
<li class="box" v-for="result in this.$store.state.arrayresultchaines" v-bind:key="result.chaine">
|
||||
<h3 class="title is-5">{{result.chaine}} : {{result.name}}</h3>
|
||||
<ul v-if="(result.emission!='can\'t find channel' && result.emission)">
|
||||
<li>
|
||||
@ -74,63 +74,34 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import axios from "axios";
|
||||
import {putparsechaine} from "../api";
|
||||
|
||||
export default {
|
||||
name: "chainetv",
|
||||
data() {
|
||||
return {
|
||||
arrayresultchaines: [],
|
||||
chaine: ""
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
getchaine(num) {
|
||||
let path = process.env.ROOT_API + "/api/v1/chaine/";
|
||||
axios
|
||||
.get(path + num)
|
||||
.then(res => {
|
||||
if (res.status === 200) {
|
||||
axios
|
||||
.get(path + num + "/emission")
|
||||
.then(res_emission => {
|
||||
this.arrayresultchaines.push({
|
||||
chaine: num,
|
||||
name: res.data,
|
||||
emission: res_emission.data
|
||||
});
|
||||
console.log(this.arrayresultchaines);
|
||||
})
|
||||
.catch(error => {
|
||||
this.arrayresultchaines.push({ chaine: num, name: res.data });
|
||||
});
|
||||
} else if (res.status === 204) {
|
||||
this.arrayresultchaines.push({ chaine: num, name: "inconnue" });
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
// eslint-disable-next-line
|
||||
console.error(error);
|
||||
});
|
||||
},
|
||||
|
||||
checkchaine() {
|
||||
if (this.chaine === "") {
|
||||
alert("rentrer un numéro");
|
||||
return;
|
||||
}
|
||||
this.arrayresultchaines = [];
|
||||
this.$store.state.arrayresultchaines = [];
|
||||
const arraychaine = [...new Set(this.chaine.split(" "))];
|
||||
|
||||
arraychaine.forEach(element => {
|
||||
if (element != "") {
|
||||
this.getchaine(element);
|
||||
this.$store.dispatch('getchaine',{num:element});
|
||||
}
|
||||
});
|
||||
},
|
||||
parsechaine() {
|
||||
const path = process.env.ROOT_API + "/api/v1/chaine/";
|
||||
axios
|
||||
.put(path)
|
||||
|
||||
return putparsechaine()
|
||||
.then(res => {
|
||||
if (res.data == "OK") {
|
||||
alert("update database OK");
|
||||
|
@ -3,6 +3,7 @@
|
||||
import Vue from 'vue';
|
||||
import App from './App';
|
||||
import router from './router';
|
||||
import store from './store'
|
||||
import './../node_modules/bulma/css/bulma.css'
|
||||
Vue.config.productionTip = false;
|
||||
|
||||
@ -10,6 +11,7 @@ Vue.config.productionTip = false;
|
||||
new Vue({
|
||||
el: '#app',
|
||||
router,
|
||||
store,
|
||||
components: { App },
|
||||
template: '<App/>',
|
||||
});
|
||||
|
63
client/src/store/index.js
Normal file
63
client/src/store/index.js
Normal file
@ -0,0 +1,63 @@
|
||||
// src/store/index.js
|
||||
|
||||
import Vue from 'vue'
|
||||
import Vuex from 'vuex'
|
||||
import { fetchchaine, fetchemission } from '../api';
|
||||
Vue.use(Vuex)
|
||||
const state = {
|
||||
// single source of data
|
||||
arrayresultchaines: [],
|
||||
}
|
||||
const API_PATH=`${process.env.ROOT_API}/api/v1`;
|
||||
const actions = {
|
||||
// asynchronous operations
|
||||
getchaine(context,{num}) {
|
||||
|
||||
return fetchchaine(num)
|
||||
.then( res => {
|
||||
if (res.status === 200){
|
||||
context.dispatch('getemission',{chaine:num,name:res.data})
|
||||
}else{
|
||||
context.commit('push_chaine',{chaine:num,name:res.data})
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
// eslint-disable-next-line
|
||||
console.error(error);
|
||||
});
|
||||
},
|
||||
getemission(context,{chaine,name}){
|
||||
return fetchemission (chaine)
|
||||
.then(res_emission => {
|
||||
context.commit('push_chaine',{chaine:chaine,name:name,emission:res_emission.data})
|
||||
})
|
||||
.catch(error => {
|
||||
console.error(error);
|
||||
});
|
||||
},
|
||||
|
||||
}
|
||||
|
||||
const mutations = {
|
||||
// isolated data mutations
|
||||
push_chaine(state,payload){
|
||||
if(!payload.name){
|
||||
state.arrayresultchaines.push({ chaine: payload.chaine, name: "inconnue" });
|
||||
}else{
|
||||
state.arrayresultchaines.push({chaine: payload.chaine,name: payload.name,emission: payload.emission});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const getters = {
|
||||
// reusable data accessors
|
||||
}
|
||||
|
||||
const store = new Vuex.Store({
|
||||
state,
|
||||
actions,
|
||||
mutations,
|
||||
getters
|
||||
})
|
||||
|
||||
export default store
|
Loading…
Reference in New Issue
Block a user