精华内容
下载资源
问答
  • pyweb-dev-tools是使用pyqt+vue开发的实用工具脚手架,利用业余时间把工作中遇到的一些问题总结起来,打包进小工具集中,供大家在程序开发过程中参考和使用,同时支持二次开发,只要会python+web基础,就能进行...

    pyweb-dev-tools

    项目简介

    pyweb-dev-tools是使用pyqt+vue开发的实用工具脚手架,利用业余时间把工作中遇到的一些问题总结起来,打包进小工具集中,供大家在程序开发过程中参考和使用,同时支持二次开发,只要会python+web基础,就能进行自定义的工具集开发,开发好的工具集可以提交到工具集仓库,然后发布分享给其他用户,不断扩展转达工具集功能。

    每一个工具集可以用web开发开发界面实现一些功能,在web开发不满足条件情况下,比如需要获取设备能力时,可以使用python定义后端接口函数,插件按命名空间封装了web端和python端的通信,js很方便进行调用python函数

    项目地址

    添加链接描述

    项目示例图

    在这里插入图片描述

    支持平台

    支持window,mac平台

    环境安装

    1 安装python环境 3.7版本或以上

    2 安装nodejs环境 10.8版本或以上

    开始开发

    本项目为插件开发脚手架,已上传到pypi仓库 无需手工安装

    以下为基于该脚手架的插件二次开发步骤

    1 新建一个插件工程

    工程以获取系统cpu序列号和mac地址为例,以下均以该工程做示例,实际可自定义

    工程名 plugin_sys_info

    2 根目录初始化前端项目

    以vue为例,初始化vue项目 vue init webpack vuedev

    调整打包配置项 vuedev/config/index.js 修改如下代码便于打包

    build:{
        index: path.resolve(__dirname, '../dist/index.html'), //改为../dist/index.html
        // Paths
        assetsRoot: path.resolve(__dirname, '../dist'), //改为../
        assetsSubDirectory: 'static',
        assetsPublicPath: './', //改为./
    //other
    }
    

    建议使用iview管理端框架统一样式

    安装 qt-channel 用于javascript调用后端python接口 ,如果无需调用python后台可不添加

    npm qt-channel vue -S
    
    3 创建插件配置文件

    根目录新建一个 config.ini 配置文件,添加如下配置:

    [base]
    ;前端项目IP地址
    webpack_server_ip = localhost 
    ;前端项目端口
    webpack_server_port = 8080
    ;前端项目根目录
    webpack_root_path = /vuedev
    ;前端项目插件目录
    webpack_plugin_path = /src/plugin
    
    4 安装python依赖

    新建依赖配置文件 requirements.txt,添加如下内容 :

    PyQt5==5.13.2
    PyQtWebEngine==5.13.2
    requests==2.22.0
    PyInstaller==3.5
    numpy==1.16.4
    pywin32==224
    wmi==1.4.9
    pyweb-dev-tools==0.0.2
    

    pyweb-dev-tools==0.0.2 为插件脚手架版本,后边会不定期更新 可在pypi搜索

    根目录执行依赖安装命令:

    pip install pipreqs && pip install -r requirements.txt
    
    5 创建python启动脚本

    根目录新建一个 app.py 配置文件,添加如下配置:

    # -*- coding: utf-8 -*-
    from pyWebDevTool.main import App
    
    if __name__ == "__main__":    
        App()
    

    至此 脚手架已经搭建完毕,运行该脚本,程序启动如下

    在这里插入图片描述

    6 插件模块开发

    在脚手架基础上,可以进行插件工具的开发

    6.1 插件属性定义

    vuedev/src/plugin目录下 新建python包(注意是python包不是目录,需要包含________init________.py), 建议安装公司名+项目名结构命名

    例如 vuedev/src/plugin/com/github/luanhy/sysinfo

    新建一个插件属性定义文件 package-info.js

    export default {
      "groupId": "com.github.luanhy",//公司名
      "artifactId": "sysinfo",//项目名
      "version": "1.0.0",//版本号
      "router": "router.py",//后端入口文件
      "indexPath": "/",//前端入口路径
      "name": "系统信息获取工具",//项目名称
      "description": "包含mac地址获取和cpu信息获取",//项目描述
      "class": "系统工具" //项目分类
    }
    
    6.2 插件后台开发

    如果需要调用后台

    vuedev/src/plugin/com/github/luanhy/sysinfo目录添加后台路由router.py文件,示例为定义获取mac地址和cpu序列号的函数接口

    # -*- coding: utf-8 -*-
    from pyWebDevTool.router.routeContext import rc
    
    import wmi
    
    from pyWebDevTool.util.loggerFactory import Logger
    
    logger = Logger()
    
    __sys_info = {
      "cpuCode": None,
      "mac": None
    }
    
    
    @rc.route("/get_mac")
    def get_mac(params):
      """获取本机mac地址"""
      return getMac()
    
    
    @rc.route("/get_cpu_info")
    def get_cpu_info(params):
      """获取设备CPU序列号"""
      return getCpuCode()
    
    
    def __getCpuCode():
      """获取cpu序列号多个竖线分隔"""
      cpuId = ""
      for processor in wmi.WMI().Win32_Processor():
        cpuId += processor.ProcessorId.strip() + "|"
      return cpuId[0: len(cpuId) - 1]
    
    
    def getCpuCode():
      cpuCode = __sys_info['cpuCode']
      if cpuCode is None:
        cpuCode = __getCpuCode()
        logger.info("获取到的cpu序列号为:%s" % cpuCode)
        __sys_info['cpuCode'] = cpuCode
      return cpuCode
    
    
    def getMac():
      mac = __sys_info['mac']
      if mac is None:
        mac = __getMac()
        logger.info("获取到的mac地址为:%s" % mac)
        __sys_info['mac'] = mac
      return mac
    
    
    def __getMac():
      """获取mac地址多个竖线分隔"""
      macs = ""
      for mac in wmi.WMI().Win32_NetworkAdapter():
        if mac.MACAddress is not None:
          macs += mac.MACAddress + "|"
      return macs[0: len(macs) - 1]
    
    
    6.3 插件前端开发

    vuedev/src/plugin/com/github/luanhy/sysinfo/web/目录 创建vue页面文件index.vue

    <template>
      <div style="padding: 20px">
        <div>
          <button @click="getMac" :disabled="disabled">获取MAC地址</button>
          你的MAC地址是:<br>
          <input v-model="msg" style="width: 100%;"/>
        </div>
        <div>
          <button @click="getCpuInfo" :disabled="disabled">获取CPU序列号</button>
          你的PC CPU序列号是:<br>
          <input v-model="cpuMsg" style="width: 100%;"/>
        </div>
      </div>
    </template>
    
    <script>
    
      import {QtRequest} from 'qt-channel'
      import packageInfo from "../package-info"
    
      export default {
        name: "sysInfo",
        data() {
          return {
            msg: '',
            cpuMsg: "",
            disabled: false
          }
        },
        mounted() {
          console.log(packageInfo)
        },
        methods: {
          async getMac() {
            this.disabled = true
            this.msg = await QtRequest({
              path: "/get_mac",//此处和后台router.py的router路径相对应
              packageInfo,
            })
            this.disabled = false
          },
          async getCpuInfo() {
            this.disabled = true
            this.cpuMsg = await QtRequest({
              path: "/get_cpu_info",//此处和后台router.py的router路径相对应
              packageInfo,
            })
            this.disabled = false
    
          },
        }
      }
    </script>
    
    <style scoped>
    
    </style>
    

    配置页面路由 vuedev/src/router/index.js

    import Vue from 'vue'
    import Router from 'vue-router'
    
    Vue.use(Router)
    
    export default new Router({
      routes: [
         {path: '/', redirect: '/index'},
        {
          path: '/index',
          name: 'index',
          component: () => import('../plugin/com/github/luanhy/sysinfo/web/index'),
        },
      ]
    })
    
    6.4 插件结构

    完成后插件包整体目录示例如下:
    在这里插入图片描述

    7 开发模式启动脚手架运行示例程序

    至此,一个简单点的获取mac地址和cpu序列号的插件就完成了。

    启动 app.py 时增加参数 -p=dev

    表示开发环境 程序将一并启动前端dev环境,启动速度稍慢,显示调试页面

    启动中如图:

    在这里插入图片描述
    启动完毕显示插件调式页面:

    在这里插入图片描述

    点击获取mac地址按钮和获取CPU序列号可以调用后端接口获取到信息

    在这里插入图片描述

    8 插件打包

    点击 开始-构建插件 开始插件打包

    片刻后弹出构建成功对话框

    在这里插入图片描述
    点击打开插件目录可以找到构建好的插件文件

    在这里插入图片描述

    9 插件安装

    上一步的插件打包后可以分享给其他用户安装,

    点击 开始-安装插件,选择上传插件包, 选择上一步的插件包文件

    在这里插入图片描述
    片刻后显示插件安装完成

    在这里插入图片描述
    点击重新加载 点击 我的插件-系统工具-系统信息获取工具菜单即可预览插件效果。

    10 正常模式启动脚手架运行示例程序

    启动参数 -p=dev 去除后运行app.py即可 ,程序加载快,不启动前端环境,只显示已安装的插件。

    11 传送门

    脚手架: https://gitee.com/luanhaoyu_admin/py-web-dev-tools

    示例项目:https://gitee.com/luanhaoyu_admin/plugin_sys_info

    已集成工具

    后续将补充一个插件仓库站,提供平台供插件开发者分享插件

    1. pc设备 mac地址获取 cpu序列号获取

    待集成工具

    1. windows注册表管理
    2. windows开机启动项管理

    联系作者

    QQ:250985725

    邮箱: 15951963820@163.com

    博客地址:https://blog.csdn.net/v2sking

    展开全文
  • Vue使用1. 生成Vue实例和DOM中元素绑定2. app.$el -->取出该vue实例绑定的DOM标签3. app.$data -->取出该vue实例绑定的data属性2. 模板语法1. {{name}} -->在标签中间引用data属性中的变量2. v-...

    昨日内容回顾

    1. Vue使用1. 生成Vue实例和DOM中元素绑定2. app.$el -->取出该vue实例绑定的DOM标签3. app.$data -->取出该vue实例绑定的data属性2. 模板语法1. {{name}} -->在标签中间引用data属性中的变量2. v-html='msg' -->在页面上显示我定义的标签元素3. v-if='ok' -->控制标签在不在DOM中4. v-show='!ok' -->控制标签的display属性的值(是否显示)5. v-bind:href='url' -->将标签的属性和vue实例的data属性绑定起来6. v-on:click='dianwo'-->给标签绑定一个点击事件,方法需要在vue实例的methods中定义7. v-model='article' -->用在input标签和textarea标签中,将用户输入和vue实例中的数据属性建立双向绑定3. 计算属性和侦听器1. 计算属性

    (字符串翻转的例子)1. 计算属性需要定义在vue实例的 computed 中2. 多用于对变量做一些自定义的操作3. 我们在页面上像使用普通data属性一样使用计算属性2. 侦听器

    多用于一些复杂的运算或者异步操作

    侦听器需要放在 vue实例的 watch 中4. class和style属性1. 基于对象的绑定2. 基于数组的绑定5. 条件渲染

    v-if如果想控制多个标签的显示与否,可以使用 template 标签把它们包起来

    v-if/v-elsev-if/v-else if /v-else

    6. 列表渲染

    v-for循环7. 事件处理

    详见2.模板语法8. 表单绑定

    详见2.模板语法

    二. 小清单1. 对象的深拷贝2. 根据索引删除数组中的元素

    splice(索引,删除个数,插入的元素)

    View Code

    一、Vue组件

    组件基础

    组件的组织

    通常一个应用会以一棵嵌套的组件树的形式来组织:

    将上图理解为一个网页

    例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。

    为了能在模板中使用,这些组件必须先注册以便 Vue 能够识别。这里有两种组件的注册类型:全局注册和局部注册。至此,我们的组件都只是通过 Vue.component 全局注册的:

    Vue.component('my-component-name', {//... options ...

    })

    全局注册的组件可以用在其被注册之后的任何 (通过 new Vue) 新创建的 Vue 根实例,也包括其组件树中的所有子组件的模板中。

    到目前为止,关于组件注册你需要了解的就这些了,如果你阅读完本页内容并掌握了它的内容,我们会推荐你再回来把组件注册读完。

    组件注册

    组件名

    在注册一个组件的时候,我们始终需要给它一个名字。比如在全局注册时:

    Vue.component('my-component-name', { /* ... */ })

    该组件名就是 Vue.component 的第一个参数。

    你给予组件的名字可能依赖于你打算拿它来做什么。当直接在 DOM 中使用一个组件 (而不是在字符串模板或单文件组件) 的时候,我们强烈推荐遵循 W3C 规范中的自定义组件名 (字母全小写且必须包含一个连字符)。这会帮助你避免和当前以及未来的 HTML 元素相冲突。

    你可以在风格指南中查阅到关于组件名的其它建议。

    组件名大小写

    定义组件名的方式有两种:

    使用 kebab-case

    Vue.component('my-component-name', { /* ... */ })

    当使用 kebab-case (短横线分隔命名) 定义一个组件时,你也必须在引用这个自定义元素时使用 kebab-case,例如 。

    使用 PascalCase

    Vue.component('MyComponentName', { /* ... */ })

    当使用 PascalCase (驼峰式命名) 定义一个组件时,你在引用这个自定义元素时两种命名法都可以使用。也就是说  和 都是可接受的。注意,尽管如此,直接在 DOM (即非字符串的模板) 中使用时只有 kebab-case 是有效的。

    全局注册

    到目前为止,我们只用过 Vue.component 来创建组件:

    Vue.component('my-component-name', {//... 选项 ...

    })

    这些组件是全局注册的。也就是说它们在注册之后可以用在任何新创建的 Vue 根实例 (new Vue) 的模板中。比如:

    js代码:

    Vue.component('component-a', { /* ... */})

    Vue.component('component-b', { /* ... */})

    Vue.component('component-c', { /* ... */})

    new Vue({ el:'#app' })

    html代码:

    在所有子组件中也是如此,也就是说这三个组件在各自内部也都可以相互使用。

    常规举例:

    Title

    弹弹弹

    el:"#app",

    data:{},

    methods:{//自定义方法

    ttt:function () {

    alert('弹走鱼尾纹');

    }

    }

    })

    View Code

    访问网页,点击按钮,效果如下:

    如果页面其他地方,也需要弹框效果呢?代码复制一遍?

    这不符合编程习惯,需要使用组件

    组件是可复用的 Vue 实例,且带有一个名字

    组件举例:

    Title

    //注册自定义组件,组件名为tankuang

    Vue.component('tankuang',{

    template:`弹弹弹`,

    methods:{

    ttt:function(){

    alert('弹走鱼尾纹');

    }

    }

    })

    var app=new Vue({

    el:"#app",

    data:{},

    })

    View Code

    刷新网页,效果同上!

    在这个例子中是 ,就是一个自定义组件。它作为一个自定义元素来使用!

    因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 data、computed、watch、methods 以及生命周期钩子等。仅有的例外是像 el 这样根实例特有的选项。

    组件的复用

    你可以将组件进行任意次数的复用:

    View Code

    注意当点击按钮时,每个组件都会各自独立维护它的 count。因为你每用一次组件,就会有一个它的新实例被创建。

    刷新网页,效果如下:

    data必须是一个函数

    当我们定义这个  组件时,你可能会发现它的 data 并不是像这样直接提供一个对象:

    data: {

    count: 0

    }

    取而代之的是,一个组件的 data 选项必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝:

    data: function () {return{

    count: 0

    }

    }

    如果 Vue 没有这条规则,点击一个按钮就可能会影响到其它所有实例:

    举例:点击按钮,数字加1

    Title

    //注册自定义组件,组件名为tankuang

    Vue.component('tankuang',{//监听点击事件,引用count变量

    template:`弹弹弹{{count}}`,

    data:function(){return{//默认值为0

    count: 0

    }

    },

    methods:{

    ttt:function(){//自增

    this.count+=1}

    }

    })

    var app=new Vue({

    el:"#app",

    data:{},

    })

    View Code

    刷新网页,效果如下:

    局部注册

    全局注册往往是不够理想的。比如,如果你使用一个像 webpack 这样的构建系统,全局注册所有的组件意味着即便你已经不再使用一个组件了,它仍然会被包含在你最终的构建结果中。这造成了用户下载的 JavaScript 的无谓的增加。

    在这些情况下,你可以通过一个普通的 JavaScript 对象来定义组件:

    js代码

    var ComponentA = { /* ... */}

    var ComponentB= { /* ... */}

    var ComponentC= { /* ... */ }

    然后在 components 选项中定义你想要使用的组件:

    new Vue({

    el:'#app'components: {'component-a': ComponentA,'component-b': ComponentB

    }

    })

    对于 components 对象中的每个属性来说,其属性名就是自定义元素的名字,其属性值就是这个组件的选项对象。

    注意局部注册的组件在其子组件中不可用。例如,如果你希望 ComponentA 在 ComponentB 中可用,则你需要这样写:

    var ComponentA = { /* ... */}

    var ComponentB={

    components: {'component-a': ComponentA

    },//...

    }

    举例:

    Title

    //定义常量tankuangComponent

    const tankuangComponent={

    template:`弹弹弹{{count}}`,

    data:function(){return{

    count: 0

    }

    },

    methods:{

    ttt:function(){//自增

    this.count+=1}

    }

    }//注册自定义的局部组件

    var app=new Vue({

    el:"#app",

    data:{},//components表示组件

    components:{

    tankuang:tankuangComponent

    },

    });

    View Code

    刷新网页,效果同上!

    总结:

    注意事项:

    组件中的data属性必须设置成一个函数!!!1. 注册全局组件

    Vue.component(组件名,{

    template: ``,

    data: function(){return{}

    },

    methods: {...}

    })2. 注册局部组件(当前vue实例才能使用的组件)

    new Vue({

    el:'#app',

    components: {

    alert: {

    template: ``,

    data: function(){return{}

    },

    methods: {...}

    }

    }

    })

    View Code

    通过 Prop 向子组件传递数据

    早些时候,我们提到了创建一个博文组件的事情。问题是如果你不能向这个组件传递某一篇博文的标题或内容之类的我们想展示的数据的话,它是没有办法使用的。这也正是 prop 的由来。

    Prop 是你可以在组件上注册的一些自定义特性。当一个值传递给一个 prop 特性的时候,它就变成了那个组件实例的一个属性。为了给博文组件传递一个标题,我们可以用一个 props 选项将其包含在该组件可接受的 prop 列表中:

    js代码:

    Vue.component('blog-post', {

    props: ['title'],

    template:'

    {{ title }}

    '})

    一个组件默认可以拥有任意数量的 prop,任何值都可以传递给任何 prop。在上述模板中,你会发现我们能够在组件实例中访问这个值,就像访问 data中的值一样。

    一个 prop 被注册之后,你就可以像这样把数据作为一个自定义特性传递进来:

    html代码:

    效果图

    然而在一个典型的应用中,你可能在data 里有一个博文的数组:

    js代码:

    new Vue({

    el:'#blog-post-demo',

    data: {

    posts: [

    { id:1, title: 'My journey with Vue'},

    { id:2, title: 'Blogging with Vue'},

    { id:3, title: 'Why Vue is so fun'}

    ]

    }

    })

    View Code

    并想要为每篇博文渲染一个组件:

    html代码:

    v-for="post in posts"v-bind:key="post.id"v-bind:title="post.title"

    >

    View Code

    如上所示,你会发现我们可以使用 v-bind 来动态传递 prop。这在你一开始不清楚要渲染的具体内容,比如

    到目前为止,关于 prop 你需要了解的大概就这些了,如果你阅读完本页内容并掌握了它的内容,我们会推荐你再回来把 prop 读完。

    举例:公司客服,每点击一次,表示接待了一个客户

    Title

    //定义常量tankuangComponent

    const tankuangComponent={//默认渲染,使用{{name}}{{count}}

    template:`{{name}}{{count}}`,//使用props声明 我这个组件需要外边给我传一个字符串格式的name变量//父子传值,使用props

    props:{//声明变量name,类型必须是String//name:String做了一次校验,通过之后,才会给上面的{{name}}

    name:String

    },

    data:function(){return{

    count: 0

    }

    },

    methods:{

    ttt:function(){//自增

    this.count+=1}

    }

    }//注册自定义的局部组件

    var app=new Vue({

    el:"#app",

    data:{//客服列表

    list:['1號-林志玲','2号-柳岩','3호-宋慧乔',

    ]

    },//components表示组件

    components:{

    tankuang:tankuangComponent

    },

    });

    View Code

    刷新网页,效果如下:

    父子传值,一定要使用props。这里说的父,指的是网页整体。子,指的是tankuang局部组件。

    网页点击之后,需要将值传给button按钮,最终展示数据!

    关键步骤如下:

    1.定义了一个列表list,使用for循环遍历每一个元素

    2.将值赋给item

    3.item动态赋值给name

    4.name传给props里面的name,name必须是字符串。

    5.通过校验后,将值传给{{name}},前端来渲染。

    子组件向父组件传值

    需要统计每一个客服,一共接待了多少客户。每增加一个客户,总数加1。

    Title

    本月接待客户数:{{totalCount}}

    //定义常量tankuangComponent

    const tankuangComponent={//默认渲染,使用{{name}}{{count}}

    template:`{{name}}{{count}}`,//使用props声明 我这个组件需要外边给我传一个字符串格式的name变量//父子传值,使用props

    props:{//声明变量name,类型必须是String//name:String做了一次校验,通过之后,才会给上面的{{name}}

    name:String

    },

    data:function(){return{//每一个客服自己的

    count: 0

    }

    },

    methods:{

    ttt:function(){//自增

    this.count+=1}

    }

    }//注册自定义的局部组件

    var app=new Vue({

    el:"#app",

    data:{

    totalCount: 0,//总数//客服列表

    list:['1號-林志玲','2号-柳岩','3호-宋慧乔',

    ]

    },//components表示组件

    components:{

    tankuang:tankuangComponent

    },

    });

    View Code

    刷新网页,效果如下:

    发现一个问题,总数没有变动?为什么呢?

    因为这一段代码

    methods:{

    ttt:function(){//自增

    this.count+=1}

    }

    改变时,没有把外面的总数加1。那么如何改变父层的元素呢?需要使用自定义事件

    自定义事件

    事件名

    跟组件和 prop 不同,事件名不存在任何自动化的大小写转换。而是触发的事件名需要完全匹配监听这个事件所用的名称。举个例子,如果触发一个 camelCase 名字的事件:

    js代码:

    this.$emit('myEvent')

    则监听这个名字的 kebab-case 版本是不会有任何效果的:

    html代码:

    跟组件和 prop 不同,事件名不会被用作一个 JavaScript 变量名或属性名,所以就没有理由使用 camelCase 或 PascalCase 了。并且 v-on事件监听器在 DOM 模板中会被自动转换为全小写 (因为 HTML 是大小写不敏感的),所以 v-on:myEvent将会变成 v-on:myevent——导致 myEvent不可能被监听到。

    因此,我们推荐你始终使用 kebab-case 的事件名。

    举例:

    Title

    本月接待客户数:{{totalCount}}

    //定义常量tankuangComponent

    const tankuangComponent={//默认渲染,使用{{name}}{{count}}

    template:`{{name}}{{count}}`,//使用props声明 我这个组件需要外边给我传一个字符串格式的name变量//父子传值,使用props

    props:{//声明变量name,类型必须是String//name:String做了一次校验,通过之后,才会给上面的{{name}}

    name:String

    },

    data:function(){return{//每一个客服自己的

    count: 0

    }

    },

    methods:{

    ttt:function(){//自增

    this.count+=1

    //告诉外层,总数加1,执行方法jiedai。$emit是关键字,表示自定义事件

    this.$emit('jiedai')

    }

    }

    }//注册自定义的局部组件

    var app=new Vue({

    el:"#app",

    data:{

    totalCount: 0,//总数//客服列表

    list:['1號-林志玲','2号-柳岩','3호-宋慧乔',

    ]

    },//components表示组件

    components:{

    tankuang:tankuangComponent

    },//方法

    methods:{//增加总数

    add:function () {//总数自增

    this.totalCount+=1}

    }

    });

    View Code

    刷新网页,效果如下:

    这样设计的好处是,子组件只能修改自己的。如果需要修改父组件,必须通过自定义事件来完成!

    插槽

    插槽内容

    Vue 实现了一套内容分发的 API,这套 API 基于当前的  元素作为承载分发内容的出口。

    它允许你像这样合成组件:

    html代码:

    Your Profile

    然后你在 的模板中可能会写为:

    html代码:

    v-bind:href="url"

    class="nav-link"

    >

    当组件渲染的时候,这个 元素将会被替换为"Your Profile"。插槽内可以包含任何模板代码,包括 HTML:

    Your Profile

    甚至其它的组件:

    html代码:

    Your Profile

    如果  没有包含一个 元素,则任何传入它的内容都会被抛弃。

    举例:

    Title

    本月接待客户数:{{totalCount}}

    上班了!

    //定义常量tankuangComponent

    const tankuangComponent={//默认渲染,使用{{name}}{{count}}//必须使用闭合标签,比如div,p...等等

    template: `

    {{name}}{{count}}
    `,//使用props声明 我这个组件需要外边给我传一个字符串格式的name变量//父子传值,使用props

    props: {//声明变量name,类型必须是String//name:String做了一次校验,通过之后,才会给上面的{{name}}

    name: String

    },

    data: function () {return{//每一个客服自己的

    count: 0

    }

    },

    methods: {

    ttt: function () {//自增

    this.count+= 1

    //告诉外层,总数加1,执行方法jiedai。$emit是关键字,表示自定义事件

    this.$emit('jiedai')

    }

    }

    }//注册自定义的局部组件

    var app=new Vue({

    el:"#app",

    data: {

    totalCount: 0,//总数//客服列表

    list: ['1號-林志玲','2号-柳岩','3호-宋慧乔',

    ]

    },//components表示组件

    components: {

    tankuang: tankuangComponent

    },//方法

    methods: {//增加总数

    add: function () {//总数自增

    this.totalCount+= 1}

    }

    });

    View Code

    刷新网页,效果如下:

    注意:template必须包含一个 元素,否则中的内容会被丢弃掉,网页不展示!

    网页无法展示。template必须使用闭合标签,否则报错!

    具名插槽

    有些时候我们需要多个插槽。例如,一个假设的组件多模板如下:

    html代码:

    View Code

    对于这样的情况,元素有一个特殊的特性:name。这个特性可以用来定义额外的插槽:

    View Code

    在向具名插槽提供内容的时候,我们可以在一个父组件的  元素上使用slot特性:

    Here might be a page title

    A paragraph for the main content.

    And another one.

    Here's some contact info

    View Code

    另一种 slot特性的用法是直接用在一个普通的元素上:

    Here might be a page title

    A paragraph for the main content.

    And another one.

    Here's some contact info

    View Code

    我们还是可以保留一个未命名插槽,这个插槽是默认插槽,也就是说它会作为所有未匹配到插槽的内容的统一出口。上述两个示例渲染出来的 HTML 都将会是:

    Here might be a page title

    A paragraph for the main content.

    And another one.

    Here's some contact info

    View Code

    举例:

    Title

    本月接待客户数:{{totalCount}}

    上班了!

    打卡!

    哼哼!

    //定义常量tankuangComponent

    const tankuangComponent={//默认渲染,使用{{name}}{{count}}//必须使用闭合标签,比如div,p...等等//slot定义name属性,表示具名插槽

    template: `

    {{name}}{{count}}
    `,//使用props声明 我这个组件需要外边给我传一个字符串格式的name变量//父子传值,使用props

    props: {//声明变量name,类型必须是String//name:String做了一次校验,通过之后,才会给上面的{{name}}

    name: String

    },

    data: function () {return{//每一个客服自己的

    count: 0

    }

    },

    methods: {

    ttt: function () {//自增

    this.count+= 1

    //告诉外层,总数加1,执行方法jiedai。$emit是关键字,表示自定义事件

    this.$emit('jiedai')

    }

    }

    }//注册自定义的局部组件

    var app=new Vue({

    el:"#app",

    data: {

    totalCount: 0,//总数//客服列表

    list: ['1號-林志玲','2号-柳岩','3호-宋慧乔',

    ]

    },//components表示组件

    components: {

    tankuang: tankuangComponent

    },//方法

    methods: {//增加总数

    add: function () {//总数自增

    this.totalCount+= 1}

    }

    });

    View Code

    刷新网页,效果如下:

    总结:

    1. 父组件 -传值->子组件

    v-bind:变量='值'注意事项:

    子组件接收值需要在props里面声明2. 子组件 -传值->父组件

    触发自定义事件的方式,为了确保父组件的值不会被子组件直接修改

    子组件触发事件:

    this.$emit('事件名')

    父组件监听事件:

    v-on:事件名='处理的方法'

    3. 插槽和带名字的插槽

    引用子组件的时候,我可以传递一些额外的标签元素

    View Code

    二、前端开发工具包

    node.js

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。

    Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。

    Node.js 的包管理器 npm,是全球最大的开源库生态系统。

    官网:

    下载最新版本

    安装,疯狂点击下一步,就可以了!

    安装完成后,打开cmd控制台,输入命令node -v查看版本:

    C:\Users\xiao>node -v

    v10.7.0

    本质上还是JS,跑在V8引擎上的,让JS能够和操作系统进行交互

    和Python\php类似的脚本语言

    npm

    npm 是 JavaScript 世界的包管理工具,并且是 Node.js 平台的默认包管理工具。通过 npm 可以安装、共享、分发代码,管理项目依赖关系。

    NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题

    打开cmd控制台,输入命令npm -v 查看版本:

    C:\Users\xiao>npm -v6.1.0

    类似于Python中的pip,帮助我们解决包和包之间版本的依赖关系

    webpack

    webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。

    安装webpack,使用一下命令:

    npm install webpack -g

    npm install webpack-cli -g

    关闭cmd窗口,再次打开,查看版本

    C:\Users\xiao>webpack -v4.16.2

    准备文件

    新建a.js

    (function(){//定义全局变量//这种方式经常被用到一个匿名函数执行后将一些函数公开到全局

    window.ryf= 'ruanyifeng';

    })();

    View Code

    一般定义需要被导入的变量或者方法,使用function定义。

    如果直接使用var 声明,那么html导入js之后,就直接有了全局变量,可能会影响当前html的全局变量,会被覆盖!

    推荐使用方法,调用时,才使用变量

    新建test.html,引入a.js

    View Code

    访问网页,效果如下:

    发现Console打印出变量了

    Nodejs 编写模块相当的自由,开发者只需要关注 require,exports,module 等几个变量就足够,而为了保持模块的可读性,很推荐把不同功能的代码块都写成独立模块,减少各模块耦合。

    module.exports

    用来导出代码,初始值为一个空对象 {}

    修改a.js

    (function(){//定义全局变量//这种方式经常被用到一个匿名函数执行后将一些函数公开到全局

    window.ryf= 'ruanyifeng';

    })();//当前这个包 向外提供一个变量:ryf//module.exports 则用来导出代码,初始值为一个空对象 {}

    module.exports={

    ryf: ryf

    }

    View Code

    require

    webpack中可以写commonjs格式的require同步语法

    经典的commonjs同步语法

    新建b.js

    var obj = require('./a.js');

    此时webpack会将a.js打包进引用它的文件中,这是最普遍的情形!

    正式使用Webpack

    webpack可以在终端中使用,在基本的使用方法如下:

    #{extry file}出填写入口文件的路径,本文中就是上述main.js的路径,#{destination for bundled file}处填写打包文件的存放路径#填写路径的时候不用添加{}

    webpack {entry file} {destination for bundled file}

    指定入口文件后,webpack将自动识别项目所依赖的其它文件,不过需要注意的是如果你的webpack不是全局安装的,那么当你在终端中使用此命令时,需要额外指定其在node_modules中的地址。

    在终端中输入如下命令:

    必须先进入到b.js文件的目录

    C:\Users\xiao>e:

    C:\Users\xiao>cd E:\python_script\Vue

    再执行命令

    webpack b.js

    效果如下:

    由于没有指定打包文件的存放路径,执行完成之后,会在当前目录生成dist目录,里面有一个文件main.js

    查看main.js

    !function(e){var r={};function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=r,t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:n})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,r){if(1&r&&(e=t(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var o in e)t.d(n,o,function(r){return e[r]}.bind(null,o));return n},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},t.p="",t(t.s=0)}([function(e,r,t){t(1)},function(e,r){window.ryf="ruanyifeng",e.exports={ryf:ryf}}]);

    View Code

    发现代码被压缩成一行了,代码被打乱了,看不懂的

    修改test.html,改为导入mian.js

    View Code

    刷新网页,效果如下:

    发现变量依然有效!

    展开全文
  • 不过,很多初学Python的小白都一定有过这样的体验,因为没有好用的Python开发工具而吃了很多苦头。工欲善其事必先利其器,这道理只有在实践中才会深有体会。那么初Python用什么工具好?各个开发工具又有哪些特点?...

    在人工智能开启的时代,Python作为人工智能的首选语言,前景可以预见。因此学习Python的人越来越多。不过,很多初学Python的小白都一定有过这样的体验,因为没有好用的Python开发工具而吃了很多苦头。工欲善其事必先利其器,这道理只有在实践中才会深有体会。那么初Python用什么工具好?各个开发工具又有哪些特点?本文我就以上的问题,为初学者们介绍一下比较受欢迎且好用的工具。
    在这里插入图片描述
    一、最强终端:Upterm

    本来想推荐fish或者zsh,但其实这两个我也主要是贪图自动补全这个特性。最近在用的这个 Upterm 其实很简单好用,它是一个全平台的终端,可以说是终端里的 IDE,有着强大的自动补全功能。之前的名字叫 BlackWindow,有人跟他说这个名字不利于社区推广,改名叫 Upterm 之后现在已经17000+ Star了。

    二、交互式解释器:Ptpython

    一个交互式的 Python 解释器。支持语法高亮、提示甚至是 vim 和 emacs 的键入模式。

    三、包管理必备:Anaconda

    强烈推荐Anaconda ,它能帮你安装好许多麻烦的东西,包括: Python 环境、pip 包管理工具、常用的库、配置好环境路径等等。这些事情小白自己一个个去做的话,容易遇到各种问题,带来挫败感。如果你想用Python搞数据方面的事情,就安装它就好了,它甚至开发了一套JIT的解释器Numba。所以 Anaconda有了JIT之后,对线上科学计算效率要求比较高的东西也可以搞了。

    四、编辑器:Sublime3

    小白的话当然还是推荐从PyCharm开始上手,但有时候写一些轻量的小脚本,就会想用轻量级一点的工具。Sublime3很多地方都有了极大的提升,并且用起来比原来还要简单。配合安装Anaconda或CodeIntel插件,可以让 Sublime拥有近乎IDE的体验。

    五、前端在线编辑器:CodeSandbox

    虽然这个不算是真正意义上的Python开发工具,但如果后端工程师想写前端的话,这个在线编辑器太方便了,简直是节省了后端工程师的生命啊!不用安装npm的几千个包了,它已经在云端完成了,采让你直接就可以上手写代码、看效果。对于 React、Vue这些主流前端框架都支持。算是一个推荐补充吧。

    六、Python Tutor

    Python Tutor 是由 Philip Guo 开发的一个免费教育工具,可帮助学生攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。通过这个工具,教师或学生可以直接在 Web 浏览器中编写 Python 代码,并逐步可视化地运行程序。如果你不知道代码在内存中是如何运行的,不妨把它拷贝到Tutor里可视化执行一遍,加深理解。

    七、IPython

    IPython 是一个 for Humans 的 Python 交互式 shell,用了它之后你就不想再用自带的 Python shell 了,IPython 支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多实用功能和函数,同时它也是科学计算和交互可视化的最佳平台。

    八、Jupyter Notebook

    Jupyter Notebook 就像一个草稿本,能将文本注释、数学方程、代码和可视化内容全部组合到一个易于共享的文档中,以 Web 页面的方式展示。它是数据分析、机器学习的必备工具。

    九、Anaconda

    Python 虽好,可总是会遇到各种包管理和 Python 版本问题,特别是 Windows 平台很多包无法正常安装,为了解决这些问题,Anoconda 出现了,Anoconda 包含了一个包管理工具和一个Python管理环境,同时附带了一大批常用数据科学包,也是数据分析的标配。

    十、Skulpt

    Skulpt 是一个用 Java 实现的在线 Python 执行环境,它可以让你轻松在浏览器中运行 Python 代码。使用 skulpt 结合 CodeMirror 编辑器即可实现一个基本的在线Python编辑和运行环境。

    以上我推荐的十个Python开发工具,虽然都很好用,但是也不必全部都安装,毕竟适合自己的才是最好的,大家可以根据自己的需求进行选择。

    展开全文
  • 喜欢编程,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远! 1.Upterm Upterm 其实很简单好用,它是一个全平台的终端,可以说是终端里的 IDE,有着强大的自动补全功能。之前的名字叫 ...

    喜欢编程,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远!

    1.Upterm

    Upterm 其实很简单好用,它是一个全平台的终端,可以说是终端里的 IDE,有着强大的自动补全功能。之前的名字叫 BlackWindow,有人跟他说这个名字不利于社区推广,改名叫 Upterm 之后现在已经17000+ Star了。

    2.Anaconda

    真的要强烈推荐 Anaconda ,它能帮你安装好许多麻烦的东西,包括: Python 环境、pip 包管理工具、常用的库、配置好环境路径等等。这些事情小白自己一个个去做的话,容易遇到各种问题,带来挫败感。

    如果你想用 Python 搞数据方面的事情,就安装它就好了,它甚至开发了一套 JIT 的解释器 Numba。所以 Anaconda 有了 JIT 之后,对线上科学计算效率要求比较高的东西也可以搞了。我是一名python开发工程师,整理了一套python的学习资料,从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习、面试真题等。想要的可以进群:688244617免费领取!

    3.Altair

    数据转化成更直观的图片,对于理解数据背后的真相很有帮助。如果你有这方面的需求,而且还在使用Python,那么强烈推荐你试一试Altair。

    Altair是一个专为Python编写的可视化软件包,它能让数据科学家更多地关注数据本身和其内在的联系。Altair由华盛顿大学的数据科学家Jake Vanderplas编写,目前在GitHub上已经收获超过3000星。

    4.CodeSandbox

    虽然这个不算是 Python 开发工具,但如果后端工程师想写前端的话,这个在线编辑器太方便了,简直是节省了后端工程师的生命啊!不用安装 npm 的几千个包了,它已经在云端完成了,采让你直接就可以上手写代码、看效果。对于 React、Vue 这些主流前端框架都支持。

    以上这四个工具你觉得如何呢?欢迎大家在评论区分享自己的看法!

     

    展开全文
  • python好用的编程工具

    万次阅读 2018-03-12 21:28:30
    作者:麻瓜编程链接:...最开始学 Python 的时候,因为没有去探索好用的工具,吃了很多苦头。磕磕绊绊走过来之后才知道,好的工具给效率带来的提升不是从 1 到 1.1 倍速,而是从 1 到 10 倍速。在这里推荐...
  • 该项目正在开发中。 安装 pip install pyweaver 注意:根据您的环境,您可能还需要降级下面列出的软件包。 您可以在此找到更多信息。 python-engineio==3.13.2 python-socketio==4.6.0 要运行该应用程序,只需打开...
  • 今天,我就把Python程序员使用频率比较高的5款开发工具推荐给大家,希望对大家的工作和学习有帮助。一、最强终端:Upterm本来想推荐 fish 或者 zsh,但其实这两个我也主要是贪图自动补全这个特性。最近在用的这个 ...
  • 今天,我就把Python程序员使用频率比较高的5款开发工具推荐给大家,希望对大家的工作和学习有帮助。一、最强终端:Upterm本来想推荐 fish 或者 zsh,但其实这两个我也主要是贪图自动补全这个特性。最近在用的这个 ...
  • 1.找不到exe文件 2.版本不匹配 1.Python是个解释器(基本编译环境)。...3.pycharm是为Python编程语言专门打造的一款IDE(集成开发环境)。在pycharm中编写Python程序(pycharm与python的关系就相当于eclipse与j
  • 本篇概述到现在为止,我们虽然已经初步接触了Vue这样的现代前端技术,但还并不知道如何正确的使用编程工具去编写基于类似技术的前端项目。在本期中,我们将一起更近一步的学习现代前端技术的开发,同时结合我们已经...
  • 第一阶段Python与Linux数据这是Python的入段,也是帮助零基础学员打好基础的重要阶段,让零基础学员可以具备基础的编程能力,并掌握MySQL进阶内容。同时,学员还可以通过所学知识完成银行自动提款机系统实战、英汉...
  • 如何用 Vue.js + Electron 把你的 Python 控制台应用套上好看的 GUI[0]引言技术调研基本情况我为什么没有选择 Qt、Tkinter、pyQt 和 MATLAB 的 GUI 工具箱基于 WEB 的技术的优势做出了一个什么东西 引言 通常,捉虫...
  • 不过,很多初学Python的小白都一定有过这样的体验,因为没有好用的Python开发工具而吃了很多苦头。工欲善其事必先利其器,这道理只有在实践中才会深有体会。那么初Python用什么工具好?各个开发工具又有哪些特点?...
  • 今天,我就把Python程序员使用频率比较高的5款开发工具推荐给大家,希望对大家的工作和学习有帮助。一、最强终端:Upterm本来想推荐 fish 或者 zsh,但其实这两个我也主要是贪图自动补全这个特性。最近在用的这个 ...
  • 学会Python技术后,我们在参加工作的时候如果能有辅助工具的话,那么会很大程度的提高我们的工作效率,那么Python都有哪些好用的开发工具呢?下面小编就为大家详细的介绍一下10款超好用的Python开发工具!  Python...
  • python编码工具

    2020-11-28 20:10:19
    广告关闭腾讯云11.11云上盛惠... 图3.1 print过程四 最佳实践 编写python程序时,为避免不同类型字符串混用出现编解码异常,要把编码和解码操作放在程序的最外围来做,程序的核心逻辑统一使用unicode字符类型。 下面...
  • 前面我把vue项目搭建好了,接下来的事情就是对项目进行开发了,不过开发之前我们需要好的工具,这里我特别喜欢vscode这款软件,相当的好用,它支持几乎所有主流的开发语言的语法高亮、智能代码补全、自定义快捷键、...
  • Vue对象通过向bus对象抛出自定义事件的方式在组件间传递信息2. 注意事项:1. bus.$on()应该在组件mounted(挂载在页面上)的时候就执行2. this对象2. Vue实例的生命周期钩子函数(8个)1. beforeCreatedata属性光声明...
  • PyCharm 是一种 Python IDE,可以帮助程序员节约时间,提高生产效率。那么具体如何使用呢?本文从 PyCharm 安装到插件、外部工具、专业版功能等进行了一一介绍,希望能够帮助到大家。 PyCharm,怎样配置环境、怎样 ...
  • 这是「进击的Coder」的第 496篇技术分享作者:星安果来源:AirPython“ 阅读本文大概需要 7 分钟。 ”1. 前言我们都知道 Python 可以用来开发桌面应用,一旦功能开...
  • 安装工具 安装微信开发者工具 下载地址 微信开发者工具 根据系统选择 64 32指系统位数 下载好安装 ...打开服务端口方便和hbulider ...前端:js入门 vue入门 vue开发小程序 等 后端: java入门 springboot入门等 服务器:
  • 对于才开始学习Python的初学者来说,有一些好用的开发工具,...首先,我们要明白Python 是一门新手友好、功能强大、高效灵活的编程语言,学会之后无论是想进入数据分析、人工智能、网站开发这些领域,还是希望掌握第...
  • 有哪些值得推荐的 Python 开发工具

    万次阅读 2018-05-15 18:49:44
    作者:麻瓜编程链接:...最开始学 Python 的时候,因为没有去探索好用的工具,吃了很多苦头。磕磕绊绊走过来之后才知道,好的工具给效率带来的提升不是从 1 到 1.1 倍速,而是从 1 到 10 倍速。在这里推荐...
  • 本门课程重实战,将基础知识拆解到项目里,让你在项目情境里学知识。 这样的学习方式能让你保持兴趣、充满动力,时刻知道学的东西能... 本视频采用了前后端分离的开发模式,前端使用Vue.js+Element UI实现了W...
  • 因此一些好用的软件工具,可以极大地提高开发效率,那么学Python需要安装什么软件呢?本文为大家整理了几款常用的Python软件工具。 1、Upterm 它是一个全平台的终端,可以说是终端里的IDE,有着强大的自动补全功能...
  • 初学Python的小白都一定有过这样的体验,因为没有好用的Python开发工具而吃了很多苦头。工欲善其事必先利其器,这道理只有在实践中才会深有体会。那么初学Python用什么工具好?各个开发工具又有哪些特点?本文就以上...
  • Python Web开发的完整指南

    千次阅读 多人点赞 2020-11-06 09:23:15
    博客:https://somenzz.cn,电脑阅读更方便,阅读原文可访问文中的链接。学了 Python 这么长时间了,终究觉得编程语言仅仅是个工具,要想通过技术实现自己的价值,终究离不...
  • 今天,我就把Python程序员使用频率比较高的5款开发工具推荐给大家,希望对大家的工作和学习有帮助。一、最强终端:Upterm本来想推荐 fish 或者 zsh,但其实这两个我也主要是贪图自动补全这个特性。最近在用的这个 ...
  • 原标题:前端开发入门:什么是VUE?为什么用VUE?版权声明:本文为CSDN博主「晴天Smile」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,860
精华内容 3,144
关键字:

vue开发python编程工具

python 订阅
vue 订阅