精华内容
下载资源
问答
  • 流程框架设计方法.ppt

    2019-09-16 14:02:15
    以华为、海尔、西门子、联想等知名公司为例,手把手教你如何做流程, 1)设计框架 2)分层分类 3)场景划分 4)相互关联(组织、流程、考核)
  • 借鉴华为的架构化流程框架思想,在某些思想上极具借鉴意义。如何体现市场驱动、客户需求导向、把产品开发作为投资来管理的思想。 架构化流程框架能够解决: 满足客户需求 有差异化竞争力 能商业成功 高质量的...

      借鉴华为的架构化流程框架思想,在某些思想上极具借鉴意义。如何体现市场驱动、客户需求导向、把产品开发作为投资来管理的思想。

    架构化流程框架能够解决:

    • 满足客户需求
    • 有差异化竞争力
    • 能商业成功
    • 高质量的产品和解决方案

    IPD结构化流程框架包含三个中重要流程:

    • 市场管理流程(投资组合流程、优选合适的市场机会及产品\解决方案)
    • IPD流程 (结构化、分阶段商业决策、项目管理和跨部门团队业界最佳实践有机集成)
    • 需求管理流程 (客户需求及内部需求被有效从规划到落实和实现)

     核心点:

    • 做正确的事
    • 正确地做事
    • 把客户需求管好、聚焦需求确认、跟踪落实和实现

     

     

    展开全文
  • 可以预先规划好流程的每一步,如this.setNext('步骤A').setNext('步骤B')……可以在任何一步决定下一步什么,如this.setNext('步骤C'),其实这里的API和上面的一样,只是调用的地方不一样而已。在任何一步中,可以...
  • 如何用python后端写网页-flask框架

    千次阅读 2021-02-21 23:32:34
    如何以python后端写网页-flask框架什么是Flask安装flask模块Hello World更深一步:数据绑定如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右...

    什么是Flask

    Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。以下程序均在自己服务器上运行(在vs code利用ssh进行连接)

    安装flask模块

    首先使用pip进行安装:

    pip install flask
    

    在所在项目文件夹下创建templates文件夹(用于存放html等文件)和app.py,如图:
    在这里插入图片描述

    Hello World

    我们可以在templates文件中新建index.html文件,其内容如下:

    <html>
        <h1>Hello Word!</h1>
    </html>
    

    在上一步建立的app.py文件中,写入:

    from flask import Flask, render_template, request, jsonify
    #创建Flask对象app并初始化
    app = Flask(__name__)
    
    #通过python装饰器的方法定义路由地址
    @app.route("/")
    #定义方法 用jinjia2引擎来渲染页面,并返回一个index.html页面
    def root():
        return render_template("index.html")
    #定义app在8080端口运行
    app.run(port=8080)
    

    我们写好app.py文件后,我们按F5 运行,即终端输出:
    在这里插入图片描述
    我们访问服务器的8080端口,即Hello World出现在眼前!
    在这里插入图片描述

    更深一步:数据绑定

    上一步我们简单地搭建好一个静态网页,它的显示只取决于前端,是固定不变的。我们如何做到从后端传递数值并在前端显示呢?这就需要使用数据绑定.
    数据绑定,顾名思义,是为了实现一种“动态”的效果,后台的数据更新了,前端页面也自动更新;前端页面上的数据更新了,后台的数据也自动更新。在flask框架中,后端先将网页进行加载,并把传入的数据放在合适的位置后使用jinjia2引擎渲染,最后将渲染好的页面返回。

    后端传入数据

    我们首先在render_template函数中传递需要绑定的数据name,age:

    from flask import Flask, render_template, request, jsonify
    #创建Flask对象app并初始化
    app = Flask(__name__)
    
    #通过python装饰器的方法定义路由地址
    @app.route("/")
    #定义方法 用jinjia2引擎来渲染页面,并返回一个index.html页面
    def root():
        return render_template("index.html",name="zxy",age=21)
    #定义app在8080端口运行
    app.run(port=8080)
    

    在前端index.html中,我们获取传入的数据:

    <html>
        <h1>我是{{name}},今年{{age}}岁</h1>
    </html>
    

    我们再按F5运行,并访问服务器的8080端口,页面显示:
    在这里插入图片描述

    从前端获取数据

    那么,前端提交的数据如何传到后端呢?
    在这里,我使用ajax实现数据的异步传输。我们将主要步骤概括为:

    1.在前端页面中引入jQuery
    2.创建两个输入框,一个按钮用于输入数据和事件提交。
    3.在js中编写事件,使用ajax进行数据提交
    4.在后端app.py中编写对应的事件处理函数

    前端index.html内容如下:

    <html>
        <!--引入jQuery包用于使用ajax-->
        <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
        <h1>请输入你的姓名和年龄</h1>
        <!--创建两个input输入框,定义id分别为name,age-->
        <input type="text" id="name" name="name" placeholder="姓名">
        <br>
        <input type="text" id="age" name="age" placeholder="年龄">
        <br>
        <!--创建button按钮,点击则激发submit()事件-->
        <button onclick="submit();">提交</button>
        <script>
            /*在这里编写submit()事件*/
            function submit() {
                $.ajax({
                    url: "submit", /*数据提交到submit处*/
                    type: "POST",  /*采用POST方法提交*/
                    data: { "name": $("#name").val(),"age":$("#age").val()},  /*提交的数据(json格式),从输入框中获取*/
                    /*result为后端函数返回的json*/
                    success: function (result) {
                        if (result.message == "success!") {
                            alert(result.message+"你的名字是"+result.name+",你的年龄是"+result.age)
                        }
                        else {
                            alert(result.message)
                        }
                    }
                });
            }
        </script>
    </html>
    

    当我们完成ajax数据提交后,则在后端app.py处编写对应的处理函数submit()。
    app.py中的内容如下:

    from flask import Flask, render_template, request, jsonify
    #创建Flask对象app并初始化
    app = Flask(__name__)
    
    #通过python装饰器的方法定义路由地址
    @app.route("/")
    #定义方法 用jinjia2引擎来渲染页面,并返回一个index.html页面
    def root():
        return render_template("index.html")
    
    #app的路由地址"/submit"即为ajax中定义的url地址,采用POST、GET方法均可提交
    @app.route("/submit",methods=["GET", "POST"])
    #从这里定义具体的函数 返回值均为json格式
    def submit():
        #由于POST、GET获取数据的方式不同,需要使用if语句进行判断
        if request.method == "POST":
            name = request.form.get("name")
            age = request.form.get("age")
        if request.method == "GET":
            name = request.args.get("name")
            age = request.args.get("age")
        #如果获取的数据为空
        if len(name) == 0 or len(age) ==0:
            return {'message':"error!"}
        else:
            return {'message':"success!",'name':name,'age':age}
    
    #定义app在8080端口运行
    app.run(port=8080)
    

    编写完成后,我们访问服务器8080端口进行测试,结果如下:
    在这里插入图片描述

    数据库连接

    数据库是一个网页不可或缺的部分。前面的例子中,数据都是从前端获取或者随机输入的。如何从数据库中获取数据呢?
    首先我们引入pymysql库 并编写Database类,该类写在database.py中:

    import pymysql
    class Database:
        #设置数据库的连接参数,由于我是在服务器中编写的,所以host是localhost
        host = "localhost"
        user = "root"
        password = "Zhangxy0212!!"
        #类的构造函数,参数db为欲连接的数据库。该构造函数实现了数据库的连接
        def __init__(self,db):
            connect = pymysql.connect(host=self.host,user=self.user,password=self.password,database=db)
            self.cursor = connect.cursor()
        #类的方法,参数command为sql语句
        def execute(self, command):
            try:
                #执行command中的sql语句
                self.cursor.execute(command)
            except Exception as e:
                return e
            else:
                #fetchall()返回语句的执行结果,并以元组的形式保存
                return self.cursor.fetchall()
    
    

    我们可以在templates文件中新建一个data.html文件,用于创建一个新的页面,文件内容如下:

    <html>
    <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <h1>请输入你的名字</h1>
    <input type="text" id="name" name="name">
    <button onclick="show();">提交</button>
    <!--result用来显示提交结果-->
    <p id="result"></p>
    <script>
        function show() {
            $.ajax({
                url: "show",
                type: "POST",
                data: { "name": $("#name").val()},
                /*不要忘记 result为后端处理函数的返回值!*/
                success: function (result) {
                    if (result.status == "success") {
                        $("#result").text($("#name").val() + "是" + result.message)
                    }
                    else {
                        $("#result").text("出错了")
                    }
                }
            });
        }
    </script>
    </html>
    

    按钮的触发事件为show();接下来我们在app.py中编写 渲染data.html页面的函数data()事件处理函数show().
    切记,这两个函数一定要加在 创建app对象定义运行端口之间!!
    由于我们要使用写好的Database类进行数据库的连接,因此需要在app.py顶部进行引入:

    from database import Database
    

    data()函数和show()函数如下:

    #通过python装饰器的方法定义路由地址
    @app.route("/data")
    #定义方法 用jinjia2引擎来渲染页面,并返回一个index.html页面
    def data():
        return render_template("data.html")
    
    #app的路由地址"/show"即为ajax中定义的url地址,采用POST、GET方法均可提交
    @app.route("/show",methods=["GET", "POST"])
    def show():
        #首先获取前端传入的name数据
        if request.method == "POST":
            name = request.form.get("name")
        if request.method == "GET":
            name = request.args.get("name")
        #创建Database类的对象sql,test为需要访问的数据库名字 具体可见Database类的构造函数
        sql = Database("test")
        try:
            #执行sql语句 多说一句,f+字符串的形式,可以在字符串里面以{}的形式加入变量名 结果保存在result数组中
            result = sql.execute(f"SELECT type FROM type WHERE name='{name}'")
        except Exception as e:
            return {'status':"error", 'message': "code error"}
        else:
            if not len(result) == 0:
                #这个result,我觉得也可以把它当成数据表,查询的结果至多一个,result[0][0]返回数组中的第一行第一列
                return {'status':'success','message':result[0][0]}
            else:
                return "rbq"
    

    我们按F5 运行app.py文件后,访问http://121.41.111.94/data
    运行结果如图:
    在这里插入图片描述
    多提一句,数据表type中的内容如下:
    在这里插入图片描述

    screen

    至此,使用flask框架搭建简单网页的基本流程结束啦!
    我想你们心中一定有个疑问,每次运行python程序总是需要按F5运行,如果关掉 VS Code ,那么进程将会被杀掉,服务器页面就无法显示,如图:
    在这里插入图片描述
    那么我们就需要在服务器中使用screen创建一个后台,将app.py程序放在后台中运行,达到持续运行的目的。

    创建后台

    由于我的服务器是Centos,所以我使用 yum install screen的方式下载的screen。
    下载完成后,在服务器的任意位置 输入screen命令即可创建后台,后台如图:
    在这里插入图片描述
    即上面会显示screen 0.
    我们进入工程所在的文件try 输入命令:python app.py 如图:

    在这里插入图片描述
    这样 我们再访问一下121.41.111.94,会发现 网站已经启动啦!我们即使关闭命令行,程序也继续在后台运行。

    查看删除后台

    如果我们需要查看后台的运行情况,在服务器中输入命令:screen -x
    如果需要停止后台运行,则先通过 screen -x [pid号] 进入某一后台。进入之后 Ctrl+C即可停止运行。
    如果删除后台,则先通过 screen -x [pid号] 进入某一后台,进入之后输入exit

    结束

    由于大三下学期做项目需要,临时学了学flask框架。本人第一次写CSDN博客,如有不对的地方,欢迎指正~

    展开全文
  • ##近期准备一下Mybatis的源码解读,...5.Mybatis框架从源码角度来讲执行增,删,改的时候如何保证线程安全? 6.Mybatis框架一条查询语句的执行流程 7.Mybatis的日志&异常体系 8.Mybatis与Spring集成过程 9.Mybat

    ##近期准备做一下Mybatis的源码解读,整个系列大概会有6-7篇文章。
    先释放一下目录:
    1.Mybatis框架组件设计&顶层接口
    ###2.Mybatis框架启动流程分析
    3.Mybatis框架源码Configuration分析
    4.Mybatis框架一条插入语句的执行流程
    5.Mybatis框架从源码角度来讲执行增,删,改的时候如何保证线程安全?
    6.Mybatis框架一条查询语句的执行流程
    7.Mybatis的日志&异常体系
    8.Mybatis与Spring集成过程
    9.Mybatis的CRUD代码生成

    写这篇文章的目的一方面是面试问的频率比较高,也比较难。另一方面也是对Mybatis的启动流程比较感兴趣,希望知道启动过程中的不同阶段做了什么事,如何组织数据结构。
    这里我阅读的是Mybatis3的一些源码,同时会通过test目录里的test-case做一些debug。阅读源码的效率,理解源码内容上会好很多。

    先放一张流程图说明Mybatis启动过程:
    mybatisStartInit.png
    Mybatis的启动过程有两条线,一条明线,一条暗线:
    明线:简单看Mybatis的启动过程是在通过一些工厂创建SqlSession对象,解析配置文件。
    暗线:实际上是在初始化Configuration.看源码可以知道Configuration在很多地方都被依赖了。但是呢却不怎么了解Configuration在Mybatis中的定位。这个会在第三篇文章中专门对Configuration类做解析介绍。
    下面我们通过debug看一下Mybatis的整体启动初始化过程。
    我们重点跟踪一下Mybatis源码中的test case中的:org.apache.ibatis.session.SqlSessionManagerTest#setup()方法
    先以debug方式启动:org.apache.ibatis.session.SqlSessionManagerTest#shouldCommitInsertedAuthor()方法
    debug源码启动开始.png

    准备解析xml初始化Configuration对象.png
    这里有个隐含的问题就是说是初始化Configuration对象,但是从哪初始化的呢,从哪去解析的呢?可以看一下XMLConfigBuilder的构造方法和其父类的构造方法,如下图:
    子类构造方法.png

    父类构造方法.png
    上面几步我们已经创建了Configuration对象,并且一些属性有了默认值,如下图:
    Configuration初始化
    下面我们继续debug,看
    解析mybatis配置文件初始化Configuration的属性值

    这个方法执行结束整个初始化Configuration对象的过程也就结束了,后面会通过这个初始化好的Configuration再创建SqlSessionManager,SqlSessionFactory对象等。
    我们继续跟其中一个方法如:org.apache.ibatis.builder.xml.XMLConfigBuilder#mapperElement

    解析xxDAOMapper的入口.png
    这里继续深入一些看这个方法:org.apache.ibatis.builder.xml.XMLMapperBuilder#parameterMapElement()
    QQ截图20200704233345.png
    解析xxDAOMapper.xml的过程比较隐蔽,因为是逐层解析的,因此不会明显的去解析某文件夹下的某xml文件。解析过程的起点是mybatis的配置文件mapperconfig.xml.
    整个解析过程结束后我们简单看一下sqlSessionManager的创建过程。
    创建sqlsession相关的逻辑.png

    到这里我们通过debug的方式将整个mybatis的启动过程梳理了一遍,由于初始化过程涉及到很多具体的处理细节,这里不再展开,读者可以将mybatis的代码down下来,本地直接跑test-case,然后debug具体看某一方面的实现细节,相信一定能收获很多。

    展开全文
  • 推荐语:  我们平常在事情时,基本都是完一步...JS流程框架。 以下为文章原文: 作者 | 张镇圳 编辑 | 京露 张镇圳,腾讯Web前端高级工程师,对内部系统前端建设有多年经验,喜欢

    推荐语:

       我们平常在做事情时,基本都是做完一步接着下一步,并且这些事情有些是可规划的,有些是需要做完该步才知道下一步该做什么;其实代码运行时也是这样;下面我推荐的这篇文章,就介绍了如何构建这个

    JS流程框架。


    以下为文章原文:

    作者 | 张镇圳
    编辑 | 京露

    张镇圳,腾讯Web前端高级工程师,对内部系统前端建设有多年经验,喜欢钻研捣鼓各种前端组件和框架。

    最近一直在想一个问题,如何能让js代码写起来更语义化和更具有可读性。

    上周末的时候突发奇想,当代码在运行的时候,其实跟我们做事情是类似的,都是做完一步接着下一步,并且这些事情有些是可规划的,有些是需要做完该步才知道下一步该做什么。想到这里一个js框架雏形在我大脑中慢慢形成,暂且命名为flowJS。

    接着说说这个框架应该有哪些API?

    1、可以预先规划好流程的每一步,如this.setNext('步骤A').setNext('步骤B')……

    2、可以在任何一步决定下一步做什么,如 this.setNext('步骤C'),其实这里的API和上面的一样,只是调用的地方不一样而已。

    3、在任何一步中,可以知道当前步是在做什么,前面一步做了什么、下一步准备要做什么,如this.getCurr()this.getPrev()this.getNext()

    4、当前步做完后,能将结果告诉下一步(仅仅是下一步能获取到当前步传递的结果,也就是为了保护变量污染,每一步都只能获取到前一步的结果),如 给下一步传值this.nextData({name1:value1,name2:value2,……})、获取上一步传来的值this.stepData(name1)或this.stepData()

    5、可以设置或获取整个流程的全局变量,这样所有的步骤都能共享该变量,如 设置全局变量值this.flowData({name1:value1,name2:value2,……}),获取全局变量值this.flowData(name1)或this.flowData()

    6、上一步可以知道当前步的执行结果,成功 or 失败,如 在上一步中设置this.setNext('步骤B', successFun, failFun)、当前步中通过this.success(args)、this.fail(args)来告诉上一步。

    7、当前步可以随时通知下一步开始执行,如this.next()

    8、有些步骤能并行执行,并且要都执行完才能执行下一步,如 this.setNext('步骤A').setNext([步骤B1,步骤B2,步骤B3]).setNext('步骤C')

    9、可以在任何时候知道当前代码流程运行过的轨迹,如flowJS.trace,这对于了解页面的执行过程会比较有帮助。

    Talk is cheap, Show me the code!

    1、可以预先规划好流程的每一步,如this.setNext('步骤A').setNext('步骤B')……



    2、可以在任何一步决定下一步做什么,如 this.setNext('步骤C') ,其实这里的API和上面的一样,只是调用的地方不一样而已。


    3、在任何一步中,可以知道当前步是在做什么,前面一步做了什么、下一步准备要做什么,如this.getCurr() 、this.getPrev() 、this.getNext() 。


    4、当前步做完后,能将结果告诉下一步(仅仅是下一步能获取到当前步传递的结果,也就是为了保护变量污染,每一步都只能获取到前一步的结果),如 给下一步传值this.nextData({name1:value1,name2:value2,……})、获取上一步传来的值this.stepData(name1)或this.stepData()


    5、可以设置或获取整个流程的全局变量,这样所有的步骤都能共享该变量,如 设置全局变量值this.flowData({name1:value1,name2:value2,……}),获取全局变量值this.flowData(name1)或this.flowData()


    6、上一步可以知道当前步的执行结果,成功 or 失败,如 在上一步中设置this.setNext('步骤B', successFun, failFun)、当前步中通过this.success(args)、this.fail(args)来告诉上一步。


    7、当前步可以随时通知下一步开始执行,如this.next()


    8、有些步骤能并行执行,并且要都执行完才能执行下一步,如 this.setNext('步骤A').setNext([步骤B1,步骤B2,步骤B3]).setNext('步骤C')


    9、可以在任何时候知道当前代码流程运行过的轨迹,如flowJS.trace,这对于了解页面的执行过程会比较有帮助。


    其实flowJS的用法并不限于上面demo列出的方式,比如你可以试着在某一步中连续调用几次this.next(),你会发现下一步会被触发多次。想要知道更多用法,可以把我们平时看到的流程图信息套用到里面去实现。

    可能有人会用Promise来跟flowJS对比,其实Promise更多的是为了解决JS异步回调的问题,而flowJS不仅也能解决异步回调问题,还能让代码看起来更加语义化和流程化,使得代码更具可读性。

    特别是在处理那种比如提交一个数据前,需要做一连串的校验和接口调用的时候,会更加适合,如果哪天需要在中间穿插一个校验或接口调用,只需要往流程中添加一步就可以了,完全做到松耦合。

    flowJS不仅能用于页面JS开发,同样在nodeJS横行的时代,必须也是支持在服务端的nodeJS来使用的,无任何第三方依赖!

    好了,安利了那么多,现在来看看这个只有99行代码的框架的真面目 ↓

    我真的没有压缩代码,它真的只有99行!

    最后提示: 框架源码和各demo在附件中可下载!




    ——原文出自腾讯云技术社区(链接https://www.qcloud.com/community/article/537217001491374183

    展开全文
  • 单元测试和集成测试在我们的软件开发整个流程中占有举足轻重的地位,一方面,程序员通过编写单元测试来验证自己程序的有效性,另外一方面,管理者通过持续自动的执行单元测试和分析单元测试的覆盖率等来确保软件本身...
  • 如何读开源框架源码

    2011-04-17 13:25:03
    大致流程就是 框架--&gt; 包 --&gt; 接口 --&gt; 实现类 先弄清楚一个项目有多少包,包的结构,每个包是什么的,包和包之间是如何协作的。 然后一个包一个包的读,结合API文档弄清楚包里面接口是干...
  • ##近期准备一下Mybatis的源码解读,...5.Mybatis框架从源码角度来讲执行增,删,改的时候如何保证线程安全? 6.Mybatis框架一条查询语句的执行流程 7.Mybatis的日志&异常体系 8.Mybatis与Spring集成过程 9.Mybat
  • ##近期准备一下Mybatis的源码解读,...5.Mybatis框架从源码角度来讲执行增,删,改的时候如何保证线程安全? ###6.Mybatis框架一条查询语句的执行流程 7.Mybatis的日志&异常体系 8.Mybatis与Spring集成过程 9.Mybat
  • okhttp是一个开源的网络请求框架,由square公司发布,目前比较流行的版本是okHttp3。 本文只对okHttp3大致讲解,不具体分析源码细节等。 就从如何使用开始讲起,okHttp3简单的使用步骤如下: 1.得到OkHttpClient...
  • HTTP ERROR 400产生的流程和应对方法HTTP ERROR 400 Bad Request 产生的流程HTTP ERROR 400 Bad Request 产生的原因400错误为什么不能被自定义的异常处理器捕获并且处理为什么不能自己定制输出内容目前可以的 ...
  • Dubbo分布式系统框架知识点流程化总结 1、为什么要进行系统拆分?如何进行系统拆分?拆分后不用dubbo可以吗? 拆分系统是为了提高复杂系统团队的开发效率 核心意思就是根据情况,先拆分一轮,后面如果系统更复杂了...
  •  RF框架前端自动化时,支持的元素定位方式有:css定位、id定位、name定位、xpath定位和js定位。在介绍如何使用这几种方法之前,你不得不认识并熟悉我们Web测试的基础工具(客户端)——浏览器。  
  • 现代应用开发中或多或少会...那么如何在这类这类框架中找到问题处理的方向,甚至解决方案呢? 昨天帮同事处理了一个uee框架使用的问题,可借鉴。 1.对框架有个基本了解,例如框架的大体结构,层次,work流程。 ...
  • 吃透SSM项目框架搭建流程--史上最全教程--一篇足矣! 写在前面: 本篇详细记录如何创建一个ssm项目,首先博主使用的工具是STS,使用eclipse也是和STS非常相似的哈,推荐使用STS。在这里我使用的是mac环境,但是具体...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,138
精华内容 455
关键字:

如何做流程框架