@Massimo and @All concerned Uploaded <https://github.com/valq7711/rapydml_cmp> to github with short manual and examples. Discussion is welcome!
On Wednesday, August 16, 2017 at 6:00:36 AM UTC+3, Massimo Di Pierro wrote: > > I want to know more. > > On Tuesday, 15 August 2017 18:40:57 UTC-5, Val K wrote: >> >> >> Considering the number of views, this issue is quite exciting. >> >> Here is my experience. I use RapydML and RapydScript to generate >> Vue-components. >> >> I wrote brute-force parser + made some hacks of RapydML-compiler so, as >> exhaust I receive single js-file with embeded template as html-string. >> >> If anyone is interested, I can describe in more detail. In gVim it looks >> like this: >> >> >> >> >> >> <https://lh3.googleusercontent.com/-SWHAIsxMvcE/WZOFDZqjxlI/AAAAAAAAAB4/rH3olx6FH8cirbUaZh9M54XMnqU9rQzSgCLcBGAs/s1600/v_hello.png> >> >> >> >> >> >> >> On Tuesday, August 15, 2017 at 8:23:34 AM UTC+3, Limedrop wrote: >>> >>> @Carlos...I don't know if this is better, but it is different. Probably >>> more suited to bigger apps. My basic assumption is that if you're going to >>> use vue.js then, ultimately, it will be a lot easier if you stick to the >>> proper vue.js way of doing things. In general this means letting vue.js do >>> it's stuff with the frontend and leaving web2py with the data and backend. >>> >>> Specifically it means setting up your view files like this: >>> https://vuejs.org/v2/guide/single-file-components.html >>> >>> And using this: >>> https://github.com/vuejs-templates/webpack >>> >>> In development mode I have web2py running on one port and node running >>> on another (node's hot-reloading seems like magic, and you can use the >>> chrome VueDevtools plugin to debug). When I'm ready to commit I run "npm >>> run build". The index file is then compiled to >>> "/views/default/index.html", and the assets are compiled to "/static". >>> >>> In production I get web2py to serve the index file and then get vue.js >>> to load whatever else it needs via ajax (axios). >>> >>> A basic outline of the key files are given below. Note that these are >>> just snippets to show you how you might do it...the code is incomplete and >>> it will NOT work out-of-the-box. >>> >>> >>> ====\web2py\applications\app\controllers\default.py >>> >>> def index(): >>> """ Starts vue.js session >>> >>> The uuid is injected into the html <body> tag as >>> the id. For example: <body >>> id="14e4de39-dc9e-467f-a28e-9c78bd485bc1"> >>> >>> vue.js then uses status_load() to retrieve the session details. >>> """ >>> uuid = session_new() >>> return dict(UUID=uuid) >>> >>> def status_load(): >>> uuid, error = >>> IS_MATCH('[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\Z')(request.vars['uuid']) >>> if error: >>> raise HTTP(403, "Not authorized") >>> query = (db.vue_session.uuid==uuid) >>> session = >>> db(query).select(orderby=~db.vue_session.expiry_datetime).first() >>> if not session: >>> raise HTTP(403, "Not authorized") >>> return response.json(session) >>> >>> >>> ====\web2py\applications\app\views\index.html >>> ## The COMPILED VUE.JS FILE GOES HERE!!! >>> >>> >>> ====\vue\index.html >>> <!DOCTYPE html> >>> <html> >>> <head> >>> </head> >>> <body id="{{=UUID}}"> >>> <div id="app"></div> >>> <!-- built files will be auto injected --> >>> </body> >>> </html> >>> >>> ====\vue\src\App.vue >>> <template> >>> <div id="app" class="OuterWrapper"> >>> <div class="PageContainer"> >>> <router-view></router-view> >>> </div> >>> </div> >>> </template> >>> >>> <script> >>> export default { >>> name: 'app', >>> components: { >>> }, >>> data () { >>> return { >>> } >>> }, >>> computed: { >>> }, >>> methods: { >>> }, >>> mounted: function () { >>> // The uuid is injected into the parentElement by web2py >>> // The store will then use the uuid to get the session from web2py >>> // and may redirect to the restore_point >>> this.$store.dispatch('NEW_UUID', { uuid: this.$el.parentElement.id >>> }) >>> } >>> } >>> </script> >>> >>> ====\vue\src\store\index.js >>> import Vue from 'vue' >>> import Vuex from 'vuex' >>> import axios from 'axios' >>> import router from '../router' >>> Vue.use(Vuex) >>> var axiosi = axios.create({ >>> baseURL: '/myapp/default/', >>> timeout: 5000 >>> }) >>> const store = new Vuex.Store({ >>> state: { >>> // put your session variables here >>> }, >>> actions: { >>> NEW_UUID: function ({ commit, dispatch, state }, { uuid }) { >>> // At the start of each session web2py gives us a uuid >>> // We then go back to web2py and retrieve the session state >>> commit('SET_UUID', { uuid: uuid }) >>> var data = {} >>> data.uuid = uuid >>> axiosi.post('status_load', data).then((response) => { >>> commit('UPDATE_STATUS', { newState: response.data }) >>> }, (err) => { >>> console.log(err) >>> router.push({ name: 'error', params: { errorMessage: >>> err.response.data } }) >>> }) >>> } >>> >>> >>> -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.

