前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >加点JavaScript魔法

加点JavaScript魔法

作者头像
公众号---人生代码
发布于 2019-12-10 10:55:54
发布于 2019-12-10 10:55:54
4.1K00
代码可运行
举报
文章被收录于专栏:人生代码人生代码
运行总次数:0
代码可运行

01

服务器支持

在深入研究客户端之前,让我们先了解一下支持这些用户弹窗所需的服务器端的工作。用户弹窗的内容将由新路由返回,它是现有个人主页路由的简化版本。视图函数如下:

app/main/routes.py:用户弹窗视图函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@bp.route('/user/<username>/popup')
@login_required
def user_popup(username):
    user = User.query.filter_by(username=username).first_or_404()
    return render_template('user_popup.html', user=user)

该路由将被附加到 /user/<username>/popup URL,并且将简单地加载所请求的用户,然后渲染到模板中。该模板是个人主页的简化版本:

app/templates/user_popup.html:用户弹窗模板

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<table class="table">
    <tr>
        <td width="64" style="border: 0px;"><img src="{{ user.avatar(64) }}"></td>
        <td style="border: 0px;">
            <p>
                <a href="{{ url_for('main.user', username=user.username) }}">
                    {{ user.username }}
                </a>
            </p>
            <small>
                {% if user.about_me %}<p>{{ user.about_me }}</p>{% endif %}
                {% if user.last_seen %}
                <p>{{ _('Last seen on') }}: 
                   {{ moment(user.last_seen).format('lll') }}</p>
                {% endif %}
                <p>{{ _('%(count)d followers', count=user.followers.count()) }},
                   {{ _('%(count)d following', count=user.followed.count()) }}</p>
                {% if user != current_user %}
                    {% if not current_user.is_following(user) %}
                    <a href="{{ url_for('main.follow', username=user.username) }}">
                        {{ _('Follow') }}
                    </a>
                    {% else %}
                    <a href="{{ url_for('main.unfollow', username=user.username) }}">
                        {{ _('Unfollow') }}
                    </a>
                    {% endif %}
                {% endif %}
            </small>
        </td>
    </tr>
</table>

当用户将鼠标指针悬停在用户名上时,随后小节中编写的JavaScript代码将会调用此路由。客户端将服务器端返回的响应中的html内容显示在弹出窗口中。当用户移开鼠标时,弹出窗口将被删除。听起来很简单,对吧?

如果你想了解弹窗像什么样,现在可以运行应用,跳转到任何用户的个人主页,然后在地址栏的URL中追加 /popup 以查看全屏版本的弹出窗口内容

02

popover 组件

在第十一章中,我向你介绍了可便捷地创建精美网页的Bootstrap框架。到目前为止,我只使用了这个框架的一小部分。Bootstrap捆绑了许多常见的UI元素,所有这些元素都在地址为 https://getbootstrap.com 的Bootstrap文档中有demo和示例。其中一个组件是Popover(弹窗),在文档中将其描述为“用于容纳辅助信息的小的覆盖窗口”。这正是我需要的!

大多数bootstrap组件都是通过HTML标记定义的,该标记引用Bootstrap CSS的定义内容来添加漂亮的样式。一些高级的组件还需要JavaScript。应用程序在网页中包含这些组件的标准方式是在适当的位置添加HTML,然后为需要脚本支持的组件调用JavaScript函数,以便初始化或激活它。popover组件确实需要JavaScript的支持。

要做弹窗的HTML部分非常简单,你只需要定义将触发弹窗的元素。就我而言,就是处理每条用户动态中出现的可点击的用户名。 app/templates/_post.html子模板具有已定义的用户名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<a href="{{ url_for('main.user', username=post.author.username) }}">
    {{ post.author.username }}
</a>

现在根据popover文档,我需要调用每个链接上的popover() JavaScript函数,就像上面出现在页面上的链接一样,这才能初始化弹出窗口。初始化调用接受许多配置弹出窗口的选项,包括传递想要在弹出窗口中显示的内容,以及使用什么方法触发弹出窗口出现或消失(单击,悬停在元素上等),如果内容是纯文本或HTML,那么在文档中可以找到更多的选项。不幸的是,在阅读完这些信息之后,我的疑惑更多了,因为这个组件看起来并没有按照我需要的方式工作。以下是我实现此功能需要解决的问题列表:

  • 在页面中会有很多用户名链接,每条用户动态都会显示一个。我需要有一种方法可以在页面渲染后用JavaScript中找到所有这些链接,以便我可以将它们初始化为弹出窗口。
  • Bootstrap文档中的popover示例都将目标HTML元素的data-content属性设置为popover的内容,因此当触发悬停事件时,Bootstrap需要做的只是显示弹出窗口。这对我来说要做的就不止这些了,因为我想对服务器进行Ajax调用以获取内容,并且只有当收到服务器的响应时,我才希望弹出窗口出现。
  • 使用“悬停”模式时,只要你将鼠标指针放在目标元素中,弹出窗口就会保持可见状态。当你移开鼠标时,弹出窗口将消失。这具有糟糕的副作用,即如果用户想要将鼠标指针移动到弹出窗口中,弹出窗口将消失。我需要找出一种方法来将悬停行为扩展为包含弹出窗口,以便用户可以移动到弹出窗口中,例如,单击那里的链接。

在开发基于浏览器的应用程序时,事情变得越来越复杂的情况,实际上并不罕见。你必须非常仔细地考虑DOM元素如何相互作用,并使其行为方式提供良好的用户体验。

03

在页面加载完成后执行函数

很明显,我将需要在每个页面加载后立即运行一些JavaScript代码。我要运行的函数将搜索页面中用户名的所有链接,并使用Bootstrap中的弹出窗口组件配置它们。

jQuery JavaScript库作为Bootstrap的依赖项加载,因此我将利用它。当使用jQuery时,你可以用$(...)封装来注册一个函数,函数将会在页面加载完毕后运行。我可以将它添加到app/templates/base.html模板中,以便它可以在应用程序的每个页面上运行:

app/templates/base.html:页面加载完毕后运行函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
<script>
    // ...

    $(function() {
        // write start up code here
    });
</script>

正如你所看到的,我已经在<script>元素中添加了我的启动函数,而在第十四章中,我已在该元素中定义了中的translate()函数

04

使用 DOM 选择器选中元素

第一个要解决的问题是创建一个JavaScript函数来查找页面中的所有用户链接。这个函数将在页面加载完成时运行,并且当完成时,将为所有页面配置悬停和弹出行为。现在我要集中精力来寻找链接。

回顾第十四章,在实时翻译中被调用的HTML元素具有唯一的ID。例如,ID = 123的用户动态中具有id="post123"属性。然后使用jQuery,在JavaScript中使用表达式$('#post123')在DOM中定位此元素。 $()函数功能非常强大,并且具有相当复杂的查询语言来搜索DOM元素,可以参考CSS Selectors。

我用于翻译功能的选择器旨在使用id属性查找一个具有唯一标识符的特定元素。识别元素的另一种方法是使用class属性,它可以分配给页面中的多个元素。例如,我可以用class="user_popup"标记所有的用户链接,然后我可以通过$('.user_popup')获取这些元素的列表(CSS选择器中,#前缀代表查询id属性,.前缀代表查询class属性)。在本处,返回值将是具有该类的所有元素的集合

05

弹窗和 DOM 元素

通过使用Bootstrap文档中的弹出窗口示例并在浏览器的调试器中检查DOM,我确定Bootstrap将弹出窗口组件创建为DOM中目标元素的同级元素。正如我上面提到的,这会影响悬停事件的行为,只要用户将鼠标从<a>链接移动到弹出窗口本身,就会触发“鼠标移出”事件。

我可以扩展悬停事件以包含弹出窗口,就是将弹出窗口作为目标元素的子元素,这样悬停事件就会继承。通过查看文档中的弹出选项,可以通过在container选项中传递父元素来完成此操作。

将popover作为悬停元素的子元素可以很好地用于按钮或一般的<div><span>元素,但在我的情况下,popover的target将是显示用户名的可点击链接的<a> 元素。使popover成为<a>元素的子元素的问题是,弹出窗口将获得<a>父元素的链接行为。最终的结果是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<a href="..." class="user_popup">
  username
  <div> ... popover elements here ... </div>
</a>

为了避免弹出窗口出现在<a>元素中,我要使用的是另一个技巧。我要将<a>元素封装在<span>元素中,然后将悬停事件和弹出窗口与<span>相关联。由此产生的结构将是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span class="user_popup">
    <a href="...">
        username
    </a>
    <div> ... popover elements here ... </div>
</span>

<div><span>元素是不可见的,因此它们是用于帮助组织和构建DOM的重要元素。 div元素是块元素,有点像HTML文档中的段落,而<span>元素是行内元素,它可以用于字词级别。本处,我决定使用<span>元素,因为我要包装的<a>元素也是行内元素。

因此,我将继续并重构我的app/templates/_post.html子模板以包含<span>元素:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{% set user_link %}
    <span class="user_popup">
        <a href="{{ url_for('main.user', username=post.author.username) }}">
            {{ post.author.username }}
        </a>
    </span>
{% endset %}

如果你想知道弹出式HTML元素在哪里,好消息是我不必操心这一点。当我在刚刚创建的<span>元素上调用popover()初始化函数时,Bootstrap框架会为我动态地插入弹出组件

06

鼠标悬停事件

正如我上面提到的,Bootstrap中的popover组件使用的悬停行为不够灵活,无法满足我的需求,但如果你查看trigger选项的文档,则hover只是其中一个可能的值。一个引起我注意的是manual模式,在这种模式下,可以通过JavaScript调用手动显示或删除弹出窗口,这种模式可以让我自由地实现悬停逻辑,所以我将使用该选项并实现我自己的悬停事件处理程序,并以我需要的方式工作。

所以我的下一步是将一个“hover”事件附加到页面中的所有链接。使用jQuery,可以通过调用element.hover(handlerIn, handlerOut)将悬停事件附加到任何HTML元素。如果在元素集合上调用这个函数,jQuery方便地将事件附加到所有元素上。这两个参数是两个函数,分别在用户将鼠标指针移入和移出目标元素时调用对应的函数。

app/templates/base.html:悬停事件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$(function() {
        $('.user_popup').hover(
            function(event) {
                // mouse in event handler
                var elem = event.currentTarget;
            },
            function(event) {
                // mouse out event handler
                var elem = event.currentTarget;
            }
        )
    });

事件参数是一个事件对象,它包含了一些有用的信息。在本处,我使用event.currentTarget来提取事件的目标元素。

浏览器在鼠标进入受影响的元素后立即调度悬停事件。针对弹出行为,你只想鼠标停留在元素上一段时间才能激活,以防当鼠标指针短暂通过元素但不停留在元素上时出现弹出闪烁。由于该事件不支持延迟,因此这是我需要自己实现的另一件事情。所以我打算在“鼠标进入”事件处理程序中添加一秒计时器:

app/templates/base.html:悬停延迟

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$(function() {
        var timer = null;
        $('.user_popup').hover(
            function(event) {
                // mouse in event handler
                var elem = event.currentTarget;
                timer = setTimeout(function() {
                    timer = null;
                    // popup logic goes here
                }, 1000);
            },
            function(event) {
                // mouse out event handler
                var elem = event.currentTarget;
                if (timer) {
                    clearTimeout(timer);
                    timer = null;
                }
            }
        )
    });

setTimeout()函数在浏览器环境中才可用。它需要两个参数,函数和毫秒单位的时间。 setTimeout()的效果是函数在给定的延迟后被调用。所以我添加了一个函数(现在是空的),将在悬停事件的一秒钟后被调用。由于JavaScript语言中的闭包机制,此函数可以访问在外部作用域中定义的变量,例如elem

我将timer对象存储hover()调用之外定义的timer变量中,以使timer对象也可以被“mouse out”处理程序访问。我需要这么做的原因是为了获得良好的用户体验。如果用户将鼠标指针移动到其中一个用户链接中,并在移动它之前停留了半秒钟,我不希望该timer继续运行并调用显示弹出窗口的函数。所以我的鼠标移出事件处理程序检查是否有一个活动的timer对象,如果有,就取消它

07

Ajax 请求

Ajax请求不是一个新话题了,因为我已经在第十四章中已介绍过这个主题,来作为实时语言翻译功能。当使用jQuery时,$.ajax()函数向服务器发送一个异步请求。

我要发送到服务器的请求将具有类似 /user/<username>/popup 模式的URL,在本章开始时我已经将该URL添加到应用程序中。这个请求的响应将包含我需要在弹出窗口中插入的HTML。

关于这个请求的直接问题是我需要知道包含在URL中的“username”的值是什么。鼠标进入的事件处理函数是通用的,它将在页面中找到的所有用户链接,所以该函数需要从其上下文中确定用户名。

elem变量包含悬停事件中的目标元素,它是包裹<a>元素的<span>元素。为了提取用户名,我可以从<span>开始浏览DOM,移至第一个子元素,即<a>元素,然后从中提取文本,这就是在网址中要使用的用户名 。使用jQuery的DOM遍历函数,可以很简单地做到:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
elem.first().text().trim()

应用于DOM节点的first()函数返回其第一个子节点。 text()函数返回节点的文本内容。该函数不会对文本进行任何修剪,例如,如果在一行中有<a>,在下一行中有文本,在另一行中有</a>text()将返回文本周围的所有空白。为了消除所有空白并只留下文本,我使用了名为trim()的JavaScript函数。

这就是我需要向服务器发出请求的所有信息:

app/templates/base.html:XHR请求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 $(function() {
        var timer = null;
        var xhr = null;
        $('.user_popup').hover(
            function(event) {
                // mouse in event handler
                var elem = $(event.currentTarget);
                timer = setTimeout(function() {
                    timer = null;
                    xhr = $.ajax(
                        '/user/' + elem.first().text().trim() + '/popup').done(
                            function(data) {
                                xhr = null
                                // create and display popup here
                            }
                        );
                }, 1000);
            },
            function(event) {
                // mouse out event handler
                var elem = $(event.currentTarget);
                if (timer) {
                    clearTimeout(timer);
                    timer = null;
                }
                else if (xhr) {
                    xhr.abort();
                    xhr = null;
                }
                else {
                    // destroy popup here
                }
            }
        )
    });

代码中,我在外部范围中定义了一个新变量xhr。这个变量将保存我通过调用$.ajax()来初始化的异步请求对象。不幸的是,当直接在JavaScript端构建URL时,我无法使用Flask中的url_for(),所以在这种情况下,我必须显式连接URL的各个部分。

$.ajax()调用返回一个promise,这是一个代表异步操作的特殊JavaScript对象。我可以通过添加.done(function)来附加一个完成回调函数,所以一旦请求完成,我的回调函数就会被调用。回调函数将接收到的响应作为参数,你可以在上面的代码中看到,我将其命名为data。这将是我要放入popover的HTML内容。

但在我们获得弹窗之前,还有一个细节需要处理,以便给予用户一个良好的体验。回想一下之前添加的逻辑,如果用户在触发鼠标进入事件之后的一秒内将鼠标指针移出<span>,将触发取消弹窗的逻辑。同样的逻辑也需要应用于异步请求,所以我添加了第二个子句来放弃我的xhr请求对象(如果存在)

08

弹窗的创建与销毁

最后我使用在Ajax回调函数中传递给我的data参数来创建我的弹窗组件:

app/templates/base.html:显示弹窗

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function(data) {
    xhr = null;
    elem.popover({
        trigger: 'manual',
        html: true,
        animation: false,
        container: elem,
        content: data
    }).popover('show');
    flask_moment_render_all();
}

弹出窗口的实际创建非常简单,Bootstrap的popover()函数完成设置所需的所有工作。 弹出窗口的选项作为参数给出。 我已经用manual触发模式,HTML内容,没有淡入淡出的动画(这样它就会更快地出现和消失)配置了这个弹出窗口,并且我已经将父元素设置为<span>元素本身,所以悬停行为通过继承扩展到弹出窗口。 最后,我将Ajax回调函数的data参数作为content参数的值。

popover()调用创建了一个弹窗组件,该组件也具有一个名为popover()的方法来显示弹窗。因此我不得不添加第二个popover('show')调用来将弹窗显示到页面中。

弹出窗口的内容包括第十二章中通过Flask-Moment插件生成的“最后访问”日期。 文档中提到,当通过Ajax添加新的Flask-Moment元素时,需要调用flask_moment_render_all()函数来适当地渲染这些元素。

现在剩下的就是完善鼠标移出事件处理程序上的删除弹出窗口逻辑。 如果用户将鼠标移出目标元素,该处理程序已经具有中止弹出操作的逻辑。 如果这些条件都不适用,那么这意味着弹出窗口当前显示并且用户正在离开target区域,所以在这种情况下,对目标元素的popover('destroy')调用将正确地执行移除和清理。

app/templates/base.html:销毁弹窗

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function(event) {
    // mouse out event handler
    var elem = $(event.currentTarget);
    if (timer) {
        clearTimeout(timer);
        timer = null;
    }
    else if (xhr) {
        xhr.abort();
        xhr = null;
    }
    else {
        elem.popover('destroy');
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CryptoCode 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
软件项目研发成本评估用哪些方法?
项目成本是评价一个项目是否成功的第二个关键因素,成本的变化将直接影响项目的成功,如果一味追求项目的功能和进度,忽视成本,将不是搞项目,而是赌博。现在软件项目本身的费用就很高,而且没有公开价格,说多少是多少。但一旦和客户达成一致意见,问题就集中在如何有效利用双方同意的费用达成预期任务目标。
PM吃瓜
2020/07/09
1.5K0
软件项目开发成本经常用到的估算方法有哪些?
  a、依据工作量估算结果和平均人力成本费率直接计算出直接人力成本和间接成本的总和,加直接非人力成本计算软件开发成本;
软件成本造价评估
2019/09/17
1.7K0
软件项目开发成本经常用到的估算方法有哪些?
软件研发成本估算:成本的构成及含义?如何计算?
  我们在对一个软件项目的研发成本进行估算时,除了要使用成本估算常用公式之外,还应该了解一下软件研发成本的构成及含义,这样更有助于我们系统的理解软件研发成本估算的内容及过程。   软件研发成本包含直接成本和间接成本。依据软件行业特点,直接成本又分为直接人力成本和直接非人力成本,而间接成本分为间接人力成本和间接非人力成本。 所谓直接成本是指:项目存在则导致成本发生,项目取消则成本不再发生的成本。如项目成员的人力资源费用(直接人力成本)、由于本项目需要所产生的差旅(直接非人力成本)、培训(直接非人力成本)等费用。 而间接成本为:服务于本组织所有研发项目的联合成本,即只要有研发活动成本就会产生,而所有研发活动都取消则成本不再发生。如研发管理人员的费用分摊(间接人力成本)、研发设备/场地的费用分摊(间接非人力成本)。   直接人力成本根据工作量估算结果(单位通常为人月)和平均人力成本费率(即每人月多少钱)计算;间接成本通常根据项目组的人数和持续时间进行分摊,因而也与工作量相关;直接非人力成本通常在软件项目中所占比例较小,该部分与工作量无关,可参照《规范》中关于直接非人力成本的细项划分(包括办公费、差旅费、培训费、业务费、采购费及其他等六项)分项估算。   因此,对一个软件项目进行成本估算时,我们常用的软件研发成本估算公式为:软件研发成本=工作量×平均人力成本费率(含直接人力成本、间接成本)+直接非人力成本。此公式基本包含了软件研发成本估算的内容和过程。
软件成本造价评估
2018/10/15
4K0
软件研发成本估算:成本的构成及含义?如何计算?
软件项目的规模、工作量和成本是如何进行估算或评估的?
软件开发成本估算过程可进一步细分为软件规模估算、工作量估算、成本估算和确定软件开发成本等四个过程。其中成本估算需要对直接人力成本、间接人力成本、间接非人力成本及直接非人力成本分别进行估算。
软件成本造价评估
2019/09/17
4.4K0
软件项目的规模、工作量和成本是如何进行估算或评估的?
软件开发成本估算之软件开发成本的构成及含义?如何估算成本?
本文主要讲述软件开发成本估算相关的软件开发成本构成和一些术语的含义以及如何去进行软件开发成本估算。
软件造价评估联盟
2023/07/25
1K0
软件开发成本评估怎么做?软件开发成本评估从哪些方面进行?
  软件开发成本(software development cost)是指为达成软件开发项目目标开发方所需付出的各种资源代价总和。这里的资源包括人、财、物和信息等。软件开发成本包括软件开发过程中的所有直接成本和间接成本。
软件成本造价评估
2019/08/26
1.5K0
软件研发成本构成中的直接成本包括哪些?
  我们在估算软件项目成本之前需要先清晰的了解它的成本构成。而软件研发成本的构成仅包括软件研发过程中的所有直接成本和间接成本。   什么是软件研发的直接成本呢?直接成本又包括哪些内容?   软件研发的直接成本是指为了达成特定研发项目所支出的各类资源总和。这些资源与此研发项目是强关联的,一旦该项目结束或中止,则这些成本不再发生。直接成本又分为直接人力成本和直接非人力成本。 直接人力成本 直接人力成本,是指开发方项目组成员的人力资源费用,包括工资、奖金及福利等费用。例如,除了一般意义上的工资及奖金外,项目成员的正常工作餐费也计入直接人力成本。这里的项目成员包括参与该项目研发过程的所有研发或支持人员,如项目经理、需求分析人员、设计人员、开发人员、测试人员、部署人员、用户文档编写人员、质量保证人员、配置管理人员等。而对于非全职投入该项目研发工作的人员,按照项目工作量所占其总工作量比例折算其人力资源费用。 直接非人力成本 直接非人力成本,是指为研发项目支付的非人力费用。一般包括办公费、差旅费、培训费、业务费、采购费等,这些费用必须是为特定研发项目所支出的。例如:   a)    办公费,即开发方为研发此项目而产生的行政办公费用,如办公用品、通讯、邮寄、印刷、会议等;   b)    差旅费,即开发方为研发此项目而产生的差旅费用,如交通、住宿、差旅补贴等;   c)    培训费,即开发方为研发此项目而安排的特别培训产生的费用,这种培训是为了提升项目成员的相关研发技能,来更好地完成本项目研发工作;   d)    业务费,即开发方为完成此项目研发工作所需辅助活动产生的费用,如招待费、评审费、团队建设活动经费、验收费等;   e)    采购费,即开发方为研发此项目而需特殊采购专用资产或服务的费用,如专用设备费、专用软件费、技术协作费、专利费等;   f)    其他,即未在以上项目列出但确系开发方为研发此项目所需花费的费用。   示例1:项目成员因项目加班而产生的餐费宜计入直接非人力成本的办公费中,而项目成员的工作午餐费宜计入直接人力成本。   示例2:项目组封闭开发租用会议室而产生的费用宜计入直接非人力成本中的办公费,而研发部例会租用会议室产生的费用宜按照间接非人力成本分摊。   示例3:为项目采购专用测试软件的成本宜计入直接非人力成本中的采购费,而日常办公软件的成本宜按照间接非人力成本进行分摊。   我们在进行软件成本估算过程中,一定要正确区分哪些费用是直接人力成本,哪些是非直接人力成本。   而在区分直接成本与间接成本时,可以假设当前项目中止或取消,未发生的相关费用是否还会继续产生,如果是,则属于间接成本,而如果相关费用不会发生,则属于直接成本。
软件成本造价评估
2018/12/13
7.2K0
软件研发成本构成中的直接成本包括哪些?
软件开发工作量及费用量化评估方法在金融行业的应用
  随着国内金融行业市场化进程持续加快以及互联网金融的兴起,信息技术尤其是软件技术的应用对于金融科技创新至关重要。各大金融机构在持续加大科技创新力度的同时,如何科学、高效地管控应用开发的投入并充分利用现有资源,进一步提升交付质量和IT治理水平变得尤为关键。
软件造价评估联盟
2019/07/19
1.7K0
如何测算信息化项目软件运维费?
信息化项目软件运维费用测算的基本过程包括:测算规模、测算工作量、测算费用。如图2所示。
软件成本造价评估
2018/12/04
4.1K0
如何测算信息化项目软件运维费?
国家标准《软件工程 软件开发成本度量规范》GB/T 36964-2018正式发布
  2018年12月28日,国家市场监督管理总局、国家标准化管理委员会发布2018年第17号中国国家标准公告,批准《软件工程 软件开发成本度量规范》国家标准正式发布,标准号为GB/T 36964-2018。
软件成本造价评估
2019/01/07
7.6K0
国家标准《软件工程 软件开发成本度量规范》GB/T 36964-2018正式发布
软件研发成本构成中的间接成本包括哪些?
  软件研发的间接成本为组织级成本,服务于整体研发活动,只要该组织还有软件研发活动,该成本就会发生,而不会因某个特定项目的结束或中止而不再发生。间接成本又分为间接人力成本和间接非人力成本。 间接人力成本   间接人力成本,是指服务于整体研发活动的非项目组人员的工资、奖金及福利等费用分摊。这些人员一般是组织级的研发管理人员,包括研发部门经理、项目管理办公室人员、工程过程组人员、产品规划人员、组织级质量保证人员、组织级配置管理人员等,他们并不承担特定研发项目工作,他们的费用分摊后计入间接人力成本。 间接非人力成本   间接非人力成本,是指服务于整体研发活动的非人力成本分摊。这部分包括研发场地房租、水电、物业,研发人员日常办公费用分摊及各种研发办公设备的租赁、维修、折旧分摊。例如:   a)    研发部门日常办公用的设备及软件成本,这部分费用可以按照间接非人力成本进行分摊。   b)    研发部门办公场地的租用会议室产生的费用,可以按照间接非人力成本进行分摊。   我们在估算软件成本过程中,若要正确区分直接成本与间接成本,可以假设当前项目中止或取消,未发生的相关费用是否还会继续产生,如果是,则属于间接成本,而如果相关费用不会发生,则属于直接成本。
软件成本造价评估
2018/12/13
1.9K0
软件研发成本构成中的间接成本包括哪些?
估算一个软件项目成本时如何正确估算直接人力成本?
  在软件项目成本估算过程中,应根据工作量估算结果和项目人员直接人力成本费率估算直接人力成本。通常在早期估算时,可根据平均人力成本费率确定人力成本,平均人力成本费率受物价指数、行业、人力资源供给状况、企业所在地、工作性质、人员级别等因素影响,如可根据不同角色进行估算,一般情况下总体架构师高于需求分析师,需求分析师高于编程工程师,而同种角色会有多个人员级别设置,级别越高,平均人力成本费率越高。
软件成本造价评估
2019/05/30
1.8K0
软件研发成本估算过程之估算软件项目工期概述
在工作量估算结束后可根据工作量,采用科学的方法进行软件项目工期估算过程。在估算工期的过程中,需要注意的情况是:
软件成本造价评估
2018/11/26
9300
软件研发成本估算过程之估算软件项目工期概述
软件项目管理知识点总结
项目的定义和特征: (1)美国项目管理权威机构--项目管理协会(Project Management Institute,PMI)认为,项目是为完成某一独特的产品或服务所做的一次性努力. (2)德国DIN(德国工业标准)69901认为,项目是指在总体上符合下列条件的唯一性任务: ①具有预定的目标; ②具有时间、财务、人力和其他限制条件; ③具有专门的组织. (3)《项目管理质量指南(ISO10006)》定义项目为:“具有独特的过程,有开始和结束日期,由一系列相互协调和受控的活动组成.过程的实施是为了达到规定的目标,包括满足时间、费用和资源等约束条件”. (4)中国项目管理知识体系纲要(2002版)中对项目的定义为:项目是创造独特产品、服务或其他成果的一次性工作任务. (5)联合国工业发展组织《工业项目评估手册》对项目的定义是:“一个项目是对一项投资的一个提案,用来创建、扩建或发展某些工厂企业,以便在一定周期内增加货物的生产或社会的服务.” (6)世界银行认为:“所谓项目,一般系指同一性质的投资,或同一部门内一系列有关或相同的投资,或不同部门内的一系列投资”. (7)一般地说,所谓项目就是指在一定约束条件下(主要是限定资源、限定时间、限定质量),具有特定目标的一次性任务. 共同特征: (1)一次性 (2)独特性 (3)目标的明确性 (4)活动的整体性 (5)组织的临时性和开放性 (6)开发与实施的渐进性 常见的习题都是选出符合项目定义的事物,如:创建一个具有特定功能的软件是项目,但是日常打扫卫生就不属于项目 项目的特征: 1.有明确的目标 2.项目之间的活动具有相关性 3.限定的周期 4.有独特性 5.资源成本的约束性 6.项目的不确定性 项目与日常运作有什么不同: 1.项目是一次性的,日常运作是重复进行的 2.项目是以目标为导向的,日常运作是通过效率和有效性体现的 3.项目是通过项目经理及其团队工作完成的,而日常运作是职能式的线性管理 4.项目存在大量的变更管理,而日常运作则基本保持连贯性
全栈程序员站长
2022/08/25
1.7K0
软件项目管理知识点总结
软件研发成本度量规范应用范围有哪些?
软件研发成本度量规范主要应用于软件企业以下场景:战略规划、制订预算、招投标、项目策划、变更管理、组织过程性能度量、过程改进、行业数据比对等场景。
软件造价评估联盟
2019/04/25
8420
软件研发成本度量规范应用范围有哪些?
如何对一个软件项目的成本进行评估或估算?
  在对一个软件项目进行成本估算或评估时,应该包括从项目立项直至项目研发活动结束所花费的资源总和,并且可以按阶段进行估算或测量。 软件成本估算的基本过程是什么呢?   软件成本估算的过程可分为:估算规模、估算工作量、估算工期和估算成本这4个过程,最终确定软件成本。其中成本估算需要对直接人力成本、间接人力成本、间接非人力成本及直接非人力成本分别进行估算。    1、估算规模   通常情况下,软件规模的估算是软件成本估算过程的起点。估算规模是后续计算软件项目的工作量、成本和进度的主要依据,是项目范围管理的关键,因此,在条件允许的情况下,应该进行软件项目规模估算。   规模估算时,要根据可行性研究报告或类似文档明确项目需求及系统边界。选择估算方法时,要依据项目特点和需求详细程度来决定。   若当前项目的需求不确定,可跳过这一环节,进入下个一环节。   2、估算工作量   软件项目工作量估算可采用方程法、类比法和类推法。   类推法:软件项目需求极其模糊或不确定时,如果有高度相似的历史项目,可采用此方法,利用历史项目数据来粗略估算工作量。   类比法:软件项目需求极其模糊或不确定时,如果有与本项目部分属性类似的一组基准数据,可采用类比法,利用基准数据来粗略估算工作量。   方程法:已经开展了规模估算的项目,可以采用方程法,通过各项参数来确定待估算项目的工作量。   项目工作量估算都应该采用两种估算方法来对估算结果进行交叉验证,以追求估算的准确性。工作量的估算结果是一个范围,不是单一的值。   3、估算工期   软件项目工期的估算同样可以采用类推法、类比法和方程法。   4、估算成本   类比法和类推法同样适用于需求极期模糊或不确定时的成本估算。   成本估算结果通常为一个范围。   在获得工作量和工期后,采用科学的方法来进行成本估算。中基数联做为北京软件造价评估技术创新联盟的授权合作伙伴,在对软件成本估算时,采用快速功能点法进行成本估算。
软件成本造价评估
2018/10/15
1.8K0
如何对一个软件项目的成本进行评估或估算?
浅析软件项目成本估算之间接人力成本估算
一个软件项目在开发过程中,它的研发成本包含直接成本和间接成本。而间接成本又分为间接人力成本和间接非人力成本。如何估算间接人力成本呢?下面我们举例来说明间接人力成本的估算方法。
软件成本造价评估
2019/05/30
1.3K0
浅析软件项目成本估算之间接人力成本估算
信息化项目软件运维费用都有哪些构成?
信息化项目软件运维费用应包括软件运维中供方的所有直接成本、间接成本和毛利润,如图1所示。
软件成本造价评估
2018/11/26
8.5K0
信息化项目软件运维费用都有哪些构成?
如何评估一个软件的项目费用?
经常会遇到一些朋友微信发我个信息说:“我想做个xx类型的app,大概需要多少钱?”
石云升
2022/08/25
1.9K0
能源行业软件成本度量评估应用案例分析
应用部门简介:该公司为某大型石油集团的下属子公司,主要业务是为集团公司提供信息系统技术开发和咨询服务,专注于地理信息系统(GIS)、综合业务管理信息系统、图形图像及网络应用软件的研究、设计、开发与建设,以及数字管道、数字油气田和工程设计集成整体解决方案。研发团队主要包括需求分析师、软件开发人员等约上百人。
软件成本造价评估
2018/11/08
6040
能源行业软件成本度量评估应用案例分析
推荐阅读
相关推荐
软件项目研发成本评估用哪些方法?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档