招生什么是运营管理理选择哪个品‍牌的使用更方便呢?

PMCAFF社区 - PMCAFF产品经理社区 中国第一产品经理人气组织::专注于研究互联网产品基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用 - 伍华聪 - 博客园
随笔 - 565, 文章 - 20, 评论 - 7629, 引用 - 20
在前面介绍了两篇关于我的基于MVC4+EasyUI技术的Web开发框架的随笔,本篇继续介绍其中界面部分的一些使用知识,包括控件的赋值、取值、清空,以及相关的使用。
我们知道,一般Web界面包括的界面控件有:单行文本框、多行文本框、密码文本框、下拉列表Combobox、日期输入控件、数值输入控件、单项选择、复选框、表格控件DataGrid、树形控件、布局控件、弹出式对话框、提示信息、列表控件等,这些界面控件的操作都有哪些不同,下面我们来逐一进行介绍。
1、单行文本框
使用easyui的控件,单行文本可以使用easyui-validatebox样式即可,类型为text的控件。
界面代码如下所示:
&input class="easyui-validatebox" type="text" id="Name" name="Name" /&
&input type="text" ID="txtLoginName" name="txtLoginName" style="width:100px"
赋值给界面控件代码如下:
$("#Name").val(info.Name);
获取界面控件的值代码如下:
var name = $("#Name").val();
如果是标签Lable控件,这需要把val 使用text替代即可,如下代码所示:
$("#Name").text(info.Name);
&对于easyui-validatebox样式的控件,一般来说,有几个常见属性可以设置他们的。
//必输项:
&input class="easyui-validatebox" type="text" name="name" data-options="required:true"&&/input&
//格式的验证:
&input class="easyui-validatebox" type="text" name="email" data-options="validType:'email'"&&/input&
&input class="easyui-validatebox" type="text" name="email" data-options="required:true,validType:'url'"&&/input&
//长度范围的验证:
&input class="easyui-validatebox" data-options="validType:'length[1,3]'"&
2、多行文本框
easyui的界面样式,可以使用easyui-validatebox,或者默认的textarea即可。
界面代码如下所示:
&textarea id="type_Remark" class="easyui-validatebox" required="true" style="height:100"&&/textarea&
&textarea style="height:60width:200px" id="type_Remark" name="Remark"&&/textarea&
赋值给界面控件代码如下:
$("#type_Remark").val(json.Remark);
获取界面控件的值代码如下:
var text = $("#type_Remark").val();
3、密码文本框
密码文本框和常规的文本框一样,只是输入字符的时候,系统做了屏蔽显示而已,把它作为一个来独立说明,也是因为它也是常见输入的一种。
界面代码如下所示:
&input type="password" name="password" style="width:260"&&/input&
赋值给界面控件代码如下:
var password = '123';
$("#Password").val(password)
获取界面控件的值代码如下:
$("#btnLogin").click(function () {
var postData = {
UserName: $("#UserName").val(),
Password: $("#Password").val(),
Code: $("#Code").val()
4、下拉列表Combobox
常见的EasyUI的ComboBox是可以输入,也可以从列表选择的内容的输入控件。
界面代码如下所示:
&input class="easyui-combobox" type="text" id="type_PID1" name="PID" /&
绑定下拉列表的数据源代码如下:
$('#type_PID1').combobox({
url: '/DictType/GetDictJson',
valueField: 'Value',
textField: 'Text'
设置控件的选择的内容代码如下:
$("#type_PID1").combobox('setValue', json.PID);
获取界面控件的值代码如下:
var systemType=
$("#txtSystemType_ID").combobox('getValue');
&而利用标准的Select控件虽然可以实现从列表选择,不过不够ComboBox控件那么灵活方便,Select控件的界面代码如下:
&select id="txtPID" style="width: 100%" & &/select&
5、日期输入控件
easyui使用class=&easyui-datebox&来标识日期控件,从弹出的层中选择正确的日期,是一种非常常见的界面输入控件,可以替代My97DatePicker日期输入控件。
弹出窗体界面效果如下。
它的界面代码如下所示:
&input class="easyui-datebox" type="text" ID="txtLastUpdated" name="txtLastUpdated" style="width:100px"
赋值给界面控件代码如下:
$("#LastUpdated").datebox('setValue', info.LastUpdated);
获取界面控件的值代码如下:
var lastupate = $("#txtLastUpdated").datebox('getValue');
6、数值输入控件
easyui使用样式easyui-numberbox标识为数值类型,其表现为文本框,但只能输入数值。
界面代码如下所示:
&input class="easyui-numberbox" data-options="min:10,max:90,precision:2,required:true"&
或者使用&easyui-numberspinner&样式来标识,可以上下调节数值。
&input class="easyui-numberspinner" data-options="min:10,max:100,required:true" style="width:80"&&/input&
赋值给界面控件代码如下:
$('#nn').numberbox('setValue', 206.12);
$('#ss').numberspinner('setValue', 8234725);
获取界面控件的值代码如下:
var v = $('#nn').numberbox('getValue');
var v = $('#ss').numberspinner('getValue');
7、单项选择Radio控件
单项选择Radio控件,是在多项内容里面选择一个选项进行保存或者显示。
界面代码如下所示:
&label&数据分开方式:&/label&
&input name="SplitType" type="radio" class="easyui-validatebox" checked="checked" required="true" value="Split"&分隔符方式,多个数据中英文逗号,分号,斜杠或顿号[, , ; ; / 、]分开,或一行一个 
&input name="SplitType" type="radio" class="easyui-validatebox" required="true" value="Line"&一行一个记录模式,忽略所有分隔符号
赋值给界面控件代码如下:
$('input:radio[name="SplitType"][value="Split"]').prop('checked', true);
获取界面控件的值代码如下:
$("input[name='SplitType']:checked").val()
或者使用Comobo控件作为单项选择的控件也是可以的,界面效果如下所示。
其界面代码如下所示:
&select id="cc" style="width:150px"&&/select&
&div id="sp"&
&div style="color:#99BBE8;background:#padding:5"&Select a language&/div&
&input type="radio" name="lang" value="01"&&span&Java&/span&&br/&
&input type="radio" name="lang" value="02"&&span&C#&/span&&br/&
&input type="radio" name="lang" value="03"&&span&Ruby&/span&&br/&
&input type="radio" name="lang" value="04"&&span&Basic&/span&&br/&
&input type="radio" name="lang" value="05"&&span&Fortran&/span&
&script type="text/javascript"&
$(function(){
$('#cc').combo({
required:true,
editable:false
$('#sp').appendTo($('#cc').combo('panel'));
$('#sp input').click(function(){
var v = $(this).val();
var s = $(this).next('span').text();
$('#cc').combo('setValue', v).combo('setText', s).combo('hidePanel');
复选框是在一项或多项内容中,选择零项或者多项的一个输入界面控件。
界面代码如下所示:
&input id="chkIsExpire" type="checkbox" &帐号过期
由于复选框的一些特殊性质,在表单提交的时候,如果没有勾选的选型,使用serializeArray()方法构造的数据,复选框的值则不会被提交。
基于这个原因,我们可以使用Select控件进行替代,实现复选项的功能,而不影响
var postData = $("#ffEdit").serializeArray();
以上代码的使用。
使用Select控件的代码如下所示。
id="Visible1" name="Visible"&
&option value="true" selected&正常&/option&
&option value="false"&不可见&/option&
赋值给界面控件代码如下:
$("#Visible1").prop('checked', info.Visible);
获取界面控件的值代码如下:
var visible = $("#txtVisible").val();
9、表格控件DataGrid
easyui的列表控件,可以通过指定table的class属性为easyui-datagrid即可实现表格的定义,界面代码如下所示:
&table class="easyui-datagrid" title="Basic DataGrid" style="width:700height:250px"
data-options="singleSelect:true,collapsible:true,url:'../datagrid/datagrid_data1.json'"&
&th data-options="field:'itemid',width:80"&Item ID&/th&
&th data-options="field:'productid',width:100"&Product&/th&
&th data-options="field:'listprice',width:80,align:'right'"&List Price&/th&
&th data-options="field:'unitcost',width:80,align:'right'"&Unit Cost&/th&
&th data-options="field:'attr1',width:250"&Attribute&/th&
&th data-options="field:'status',width:60,align:'center'"&Status&/th&
不过为了避免使用脚本定义datagrid导致多次初始化的问题,我们一般只需要指定一个table代码即可,界面如下所示
&table id="grid" style="width: 1024px" title="用户操作" iconcls="icon-view"&
而表格控件的数据加载,我们使用javascript进行初始化,初始化后的表格界面显示效果如下所示。
Javascript代码如下所示,其中的width: function () { return document.body.clientWidth * 0.9 }是用来实现宽度自适应的一个操作。
//实现对DataGird控件的绑定操作
function InitGrid(queryData) {
$('#grid').datagrid({
//定位到Table标签,Table标签的ID是grid
url: '/Menu/FindWithPager',
//指向后台的Action来获取当前菜单的信息的Json格式的数据
title: '功能菜单',
iconCls: 'icon-view',
height: 650,
width: function () { return document.body.clientWidth * 0.9 },
nowrap: true,
autoRowHeight: false,
striped: true,
collapsible: true,
pagination: true,
pageSize: 100,
pageList: [50,100,200],
rownumbers: true,
//sortName: 'ID',
//根据某个字段给easyUI排序
sortOrder: 'asc',
remoteSort: false,
idField: 'ID',
queryParams: queryData,
//异步查询的参数
columns: [[
{ field: 'ck', checkbox: true },
{ title: '显示名称', field: 'Name', width: 200},
{ title: '图标', field: 'Icon', width: 150 },
{ title: '排序', field: 'Seq', width: 80 },
{ title: '功能ID', field: 'FunctionId', width: 80 },
{ title: '菜单可见', field: 'Visible', width: 80 },
{ title: 'Winform窗体类型', field: 'WinformType', width: 400 },
{ title: 'Web界面Url地址', field: 'Url', width: 200 },
{ title: 'Web界面的菜单图标', field: 'WebIcon', width: 120 },
{ title: '系统编号', field: 'SystemType_ID', width: 80 }
toolbar: [{
id: 'btnAdd',
text: '添加',
iconCls: 'icon-add',
handler: function () {
ShowAddDialog();//实现添加记录的页面
id: 'btnEdit',
text: '修改',
iconCls: 'icon-edit',
handler: function () {
ShowEditOrViewDialog();//实现修改记录的方法
id: 'btnDelete',
text: '删除',
iconCls: 'icon-remove',
handler: function () {
Delete();//实现直接删除数据的方法
id: 'btnView',
text: '查看',
iconCls: 'icon-table',
handler: function () {
ShowEditOrViewDialog("view");//实现查看记录详细信息的方法
id: 'btnReload',
text: '刷新',
iconCls: 'icon-reload',
handler: function () {
//实现刷新栏目中的数据
$("#grid").datagrid("reload");
onDblClickRow: function (rowIndex, rowData) {
$('#grid').datagrid('uncheckAll');
$('#grid').datagrid('checkRow', rowIndex);
ShowEditOrViewDialog();
对于查询按钮触发的数据后台查询及数据绑定操作,javascript代码如下所示:
//绑定查询按钮的的点击事件
function BindSearchEvent() {
//按条件进行查询数据,首先我们得到数据的值
$("#btnSearch").click(function () {
//得到用户输入的参数,取值有几种方式:$("#id").combobox('getValue'), $("#id").datebox('getValue'), $("#id").val()
//字段增加WHC_前缀字符,避免传递如URL这样的Request关键字冲突
var queryData = {
WHC_ID: $("#txtID").val(),
WHC_Name: $("#txtName").val(),
WHC_Icon: $("#txtIcon").val(),
WHC_Seq: $("#txtSeq").val(),
WHC_FunctionId: $("#txtFunctionId").val(),
WHC_Visible: $("#txtVisible").val(),
WHC_WinformType: $("#txtWinformType").val(),
WHC_Url: $("#txtUrl").val(),
WHC_WebIcon: $("#txtWebIcon").val(),
WHC_SystemType_ID: $("#txtSystemType_ID").val()
//将值传递给
InitGrid(queryData);
return false;
通过构造一些查询参数并传递相应的值,后台根据这些参数,从对应控制器的分页方法&FindWithPager&获取相应的分页数据,并绑定到grid控件中。
另外,如果需要在grid里面增加一些图片或者链接什么的,应该如何操作呢?
如下界面所示的效果:
首先需要在初始化代码里面增加列的formatter回调函数,如下所示。
columns: [[
{ field: 'ck', checkbox: true },
{ title: '显示名称', field: 'Name', width: 200},
{ title: '图标', field: 'Icon', width: 150 },
{ title: '排序', field: 'Seq', width: 80 },
{ title: '功能ID', field: 'FunctionId', width: 80 },
title: '菜单可见', field: 'Visible', width: 80, formatter: function (val, rowdata, index) {
if (val) {
return '&a class="grid_visible" href="javascript:void(0)" &' + val + '&/a&';
return '&a class="grid_unvisible" href="javascript:void(0)" &' + val + '&/a&';
{ title: 'Winform窗体类型', field: 'WinformType', width: 400 },
{ title: 'Web界面Url地址', field: 'Url', width: 200 },
{ title: 'Web界面的菜单图标', field: 'WebIcon', width: 120 },
{ title: '系统编号', field: 'SystemType_ID', width: 80 }
在formatter回调函数里面添加逻辑代码,判断是否可见,其实就是增加两个图片按钮,但是图片按钮的样式设置,必须在加载数据完毕后才能操作,因此需要在函数里面处理。
onLoadSuccess: function () {
$(".grid_visible").linkbutton({ text: '可见', plain: true, iconCls: 'icon-ok' });
$(".grid_unvisible").linkbutton({ text: '不可见', plain: true, iconCls: 'icon-stop' });
如果显示的图片不完整,设置行的自动调整高度属性为true即可。
autoRowHeight: true
10、树形控件
虽然easyui也有Tree控件,不过我较喜欢使用zTree这个树形控件,这个是一个免费的Jquery树控件。
引用代码如下所示:
&link href="~/Content/JQueryTools/JQueryTree/css/zTreeStyle/zTreeStyle.css" rel="stylesheet" type="text/css" /&
&script src="~/Content/JQueryTools/JQueryTree/js/jquery.ztree.core-3.5.min.js" type="text/javascript"&&/script&
初始化在Tree树控件的界面代码如下所示:
&script type="text/javascript"&
var setting = {
simpleData: {
enable: true
callback: {
onClick: onClick,
onDblClick: onDblClick
//重新加载树形结构(异步)
function reloadTree() {
$("#loading").show();
$.getJSON("/DictType/GetTreeJson?r=" + Math.random(), function (json) {
$.fn.zTree.init($("#treeDemo"), setting, json);
$.fn.zTree.getZTreeObj("treeDemo").expandAll(true);
var treeObj = $.fn.zTree.getZTreeObj("treeDemo");
var treeNodes = treeObj.getNodes();
if (treeNodes != null) {
loadTypeData(treeNodes[0].id);
$("#loading").fadeOut(500);
//树单击节点操作
function onClick(event, treeId, treeNode, clickFlag) {
var id = treeNode.
loadTypeData(id);
//树双击节点操作
function onDblClick(event, treeId, treeNode) {
var id = treeNode.
loadTypeData(id);
ShowDictType('edit');
11、布局控件
EasyUI通过DIV层来控制布局的显示,DIV里面增加一个Region的属性用来区分属于哪个区域,如下图是我Web开发框架的界面布局效果图。
界面代码如下所示:
我们详细查看主工作区的代码,如下所示。
&!--主工作区--&
&div id="mainPanle" region="center" title="" style="overflow:"&
&div id="tabs" class="easyui-tabs"
fit="true" border="false" &
&其中字典管理里面还有子布局的展示,我们查看字典管理里面界面代码,如下所示。
&div class="easyui-layout" style="width:700height:700" fit="true"&
&div data-options="region:'west',split:true,title:'字典类别',iconCls:'icon-book'" style="width: 300 padding: 1"&
&div style="padding: 1 border: 1px solid #"&
.......................&/div&
&ul id="treeDemo" class="ztree"&
&div id="tb" data-options="region:'center',title:'字典数据',iconCls:'icon-book'" style="padding:5height:auto"&
&!-------------------------------详细信息展示表格-----------------------------------&
&table id="grid" style="width: 940px" title="用户操作" iconcls="icon-view"&&/table&
12、弹出式对话框
EasyUI弹出式对话框用的很多,对话框的界面代码放在DIV层里面,一般在界面整个界面加载后中已经初始化了,只是我们根据条件相似适当的层即可,这样就形成了弹出式对话框,弹出式对话框有一个遮罩的效果。
界面代码如下所示:
13、提示信息
在常规的Web界面提示里面,我们一般用纯粹的javascript的alert函数来进行信息的提示,如果在基于EasyUI的界面布局和演示里面,使用这个提示显然会和界面演示不够匹配,因此我们使用messager类来进行相应的提示信息处理,简单的脚本提示代码如下。
$.messager.alert("提示", "修改成功");
提示信息也可以更加丰富,添加图标等信息,界面代码如下所示。
function alert1(){
$.messager.alert('My Title','Here is a message!');
function alert2(){
$.messager.alert('My Title','Here is a error message!','error');
function alert3(){
$.messager.alert('My Title','Here is a info message!','info');
function alert4(){
$.messager.alert('My Title','Here is a question message!','question');
function alert5(){
$.messager.alert('My Title','Here is a warning message!','warning');
对于一般的删除操作,一般有一个提示确认的消息框,这个messager类也进行了封装处理,效果也不错。
界面代码如下所示。
$.messager.confirm("删除确认", "您确认删除选定的记录吗?", function (deleteAction) {
if (deleteAction) {
$.get("/DictData/DeletebyIds", postData, function (data) {
if (data == "true") {
$.messager.alert("提示", "删除选定的记录成功");
$("#grid").datagrid("reload");
//当删除完成之后,第二次删除的时候还记得上次的信息,这样是不可以的,所以我们需要清除第一次的信息
rows.length = "";//第一种方法
$("#grid").datagrid("clearSelections");//第二种方法
$.messager.alert("提示", data);
以上就是我Web开发框架里面常用到的一些界面控件展示以及相关的代码介绍,有一些不太常用的控件可能还没有在本文中介绍,欢迎大家进行补充和讨论,以后有时间继续完善这个文章,作为基于MVC+EasyUI的框架界面的一个很好的参考。希望大家喜欢,多多提意见。
基于MVC4+EasyUI的Web开发框架的系列文章:理财平&台哪个好?盈喵喵理财怎么样呢?_百度知道
理财平&台哪个好?盈喵喵理财怎么样呢?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
Johnnywei81
来自经济金融类芝麻团
Johnnywei81
采纳数:1945
获赞数:3314
擅长:暂未定制
参与团队:
不要相信理财平台,任何一个都不靠谱
别爱我我很殇pl
别爱我我很殇pl
采纳数:10
这个票 据 理 财 平 台蛮好的的,这个是ICP许可证的互联网金融企业之一,运营能力和风控能力是很受认可的,自己也是通过他们做的投资,确保安全的同时又获得收益。
1条折叠回答
为你推荐:
您可能关注的内容
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。专访第一企信CTO胡修彪:刚毕业的程序猿尽量不要去大公司
摘要:社区之星第58期采访了佳米科技CTO胡修彪,软件行业奋斗了近20年的他,先通信行业,后互联网,给人打工过,也自己创过业,现在也正在创业的路上奔跑着。今天我们借他第二个创业项目第一企信来看他精彩人生。
首届“最具价值CTO”评选!我们在找你!
进入新一轮技术推动商业发展的时代,CSDN、ITValue共同发起
,评选立足“价值”,评估体系分为战略力、领导力、创新力3大维度。
「编者按」目前在企业级即时消息应用的市场上,有RTX、imo、263云通信等收费应用,但今年佳米科技开发的第一企信应用以更加开放的姿态,集结免费、基于云的架构、移动客户端和互联网思维于一身悄然杀入该市场,目前注册上千家家企业,其中不乏很多知名企业。
该公司的CTO胡修彪把这款应用定义为:互联网产品形态的企业应用,下面我们通过对话佳米CTO胡修彪,来进一步的了解该产品的诞生和40人的技术团队如何造梦,同时也来看下胡修彪如何毅然离开华为、两次创业的心得和感悟,以及他怎样从小小码农到研发总监直至CTO的。
胡修彪,珠海佳米科技有限公司CTO,毕业于华中科技大学,前华为总监,有5年的互联网行业创业经验。
“世界因为我的存在而小有不同”
CSDN:请和大家介绍下你和目前所从事的工作?
胡修彪:我是佳米科技的CTO胡修彪,已经在软件行业奋斗了近20年,先通信行业,后互联网,给人打工过,也自己创过业,现在也正在创业的路上奔跑着。曾入职华为,一呆就是九年,期间做过软件工程师、系统分析师、战略规划、总监等;后来不安分自己创业,创办了拼啦拼车网。再后来,再次不安分,以联合创始人和CTO的身份加入珠海佳米,带领团队设计和开发第一企信。30岁之前足迹也遍布全世界,曾经年少轻狂过,也曾创业失败迷茫过,但是一直不变的是对软件的痴迷和执着。不算技术宅,但算得上是一个轻度技术控,喜欢优雅、极致、简单的编码风格,在云平台、分布式集群、数据库集群、移动客户端开发、研发流程管理(CMM以及敏捷)等方面都有丰富的实践。同时做过战略规划、互联网产品设计,也实操过互联网运营,如果我评价自己算是一个TMT行业非常全面的人,相信认识我的人,不会有人反对。
我每个阶段的梦想都会不一样,不知道这算不算花心。读书的时候的梦想是奥林匹克金牌,毕业刚到华为的梦想是贝尔实验室(当时是通信行业的喜马拉雅),现在我的梦想是世界因为我的存在而小有不同,说得再直接一点,就是能够和我们创业伙伴一起打造一款火爆的、持久给海量用户提供服务和帮助的应用,这个应用,我希望就是第一企信。
我现任珠海佳米科技有限公司的CTO,负责产品研发、架构、测试、团队管理等所有产品研发相关工作。我们的产品是“第一企信”,第一企信是一款SaaS云平台的企业内部沟通平台,运用即时消息、文件传输、网络电话、电话会议等通讯手段向企业用户提供畅通的沟通交流渠道,从而促进企业、团队生产效率提升。
CSDN:你在华为工作9年,从事软件产品和技术相关研发、规划和管理工作,之所以2009年出来创业的原因是什么?
胡修彪:离开华为创业,并不是一个很容易的决定,原因很多种,但是总结下来有如下三点:
1. 为自由,包括心灵自由和时间上的自由。我本身就是一个叛逆和渴望自由的人,但是华为的高强度高压力的工作氛围,对我来说,就像一个精神世界的围墙一样,无法逾越。我需要自己能支配时间,需要时间去看去学习更多的知识和内容,也需要更大更多的空间,对于时间和空间都被束缚,感觉很不自在。出来创业之后,虽然我每天的工作时间比在华为的时候多了很多,一周7*24小时的任何时候都可能是在工作,但是我有自由,任何时候,如果我想休息或者做一些对于自己有意义的工作之外的事情,都是可以实现的。
2. 为属于自己的事业。华为最大最强最成功,那都是集体的成功,我只是千千万万螺丝钉中的一个。从自我实现和自我满足的需求层面来讲,我需要属于自己的事业,哪怕最小,哪怕最不起眼。更进一步来说,如果我把自己的事业能够做大,那对于我来说,就不枉此生。
3. 未来行业的选择。2009年的时候,刚刚全球金融海啸,我认为通信行业的巅峰已过,而互联网特别是移动互联网未来将主宰一切,在当时,只是刚刚萌芽而已,所以未来行业机会是极其巨大和不可预知的,将是下一个产生奇迹的地方。
第一次的创业:让我从懵懂到成熟
CSDN:你的第一个创业项目是拼啦拼车,当初为何选择这个项目作为自己的第一个项目?现在回过头来,你怎么看这次创业经历以及给你带来了什么?
胡修彪:选择做拼啦拼车,是我们慎重考虑和分析的结果,在正式开始做之前,我们都做个快半年的调研和酝酿,主要考虑到以下几个情况:
1. 拼车是用户刚需,而且会在今后2-3年爆发性增长,因为环境污染、限号、塞车等。
2. 拼车是典型的O2O应用。
3. BAT等互联网巨头不会介入到这个领域。
4. 暂时没有无法撼动的竞争对手。
5. 推广营销不需要太多资源和资金。
现在来看,这个项目对我本人来说,更多的是一种历练。我一个人,带着不到10个人的团队,产品、研发以及运营一把抓,在几乎零运营成本的情况下,拼啦拼车一年之内发展50万用户,并成为国内TOP3的拼车应用。在这个过程中,我完全从一个传统的通信人蜕变为互联网人,这其中的差异,包括产品开发模式、流程、需求管理、设计、测试等各个方面,只有确实经历了,才能感受得到。
说出来不怕你笑话,刚刚开始互联网创业的时候,做产品我不知道UE/UI是什么,管研发,不知道敏捷流程为何物,做运营,对SEO/SEM模糊不清。但是我一步一步自己探索,通过各种机会和渠道去学习,几乎每天都是12点,而且没有周末。到今天,我可以开玩笑的说,做产品的,没多少人比我更懂研发,做研发的,没多少人更清楚互联网运营怎么玩。
所以,拼啦拼车可以说是我在互联网行业的初恋,它让我从懵懂到成熟,虽然对我来说,它是一个失败的项目,但是我会一直记得它。
CSDN:在第一次创业的时候,你带着一群刚毕业的程序员,从编码的基础、逻辑、习惯、规范、工具等各个方 面手把手教起,能否给一些在校的准程序员和刚步入开发岗位的程序员一些学习、成长、职业发展方面的建议?
胡修彪:关于这个问题,我简单总结就是三个建议:
1. 刚毕业的程序猿尽量不要去大公司,特别是哪些高大上公司。因为去了之后,其实你很长时间都很难进入到实际的工作状态,你刚开始做的也是边缘或者修修补补的 工作,而且会局限在很小的范围之内,所以成长速度会非常慢。我建议如果有可能,尽量加入创业型公司,特别是创始人有一定背景或者正在快速成长的创业型公 司,在这样的公司,成长速度和成长空间完全不一样,每天都会被市场、客户以及团队牵着往前跑,一般过不了多久,就能快速成为项目组的核心,就能完全独立的
负责重要模块的开发工作。高大上公司收获的是流程、规范以及职业化,但是成长型公司收获的是技术、产品等方面的快速进步。
2. 刚毕业要专注,沉下心来把一个产品做好,把一门编程语言用好,不要天天这山看着那山高。不管是产品开发也好,编程语言也好,都是融会贯通的,一个产品做好 了,理解透彻了,以后做任何产品都会驾轻就熟。编程语言也一样,不要今天看iOS程序员好像很吃香、工资很高,就想转型去做iOS,明天又发现用 Erlang的人工资巨高,也想去尝试,最终会发现,什么都会有,其实什么都用不好。
3. 一定要养好良好的编码风格和习惯,一开始要强迫自己,要养成代码“洁癖”,有时间多去Github上看看别人优秀代码的风格,学习Google等优秀公司 的代码Checkstyle。先僵化,后面再慢慢优化,坚持一定时间之后,你就会发现,对于那些无风格不规范的代码,会有一种不忍直视的感觉。
失败后勇敢再来的「小巨人」
CSDN: 如今,你加入了佳米开始了自己的第二次创业之旅,能简单介绍下目前正在做的事情以及未来的规划?
胡修彪:我们的现在的产品是第一企信,第一企信的定位是在企业的沟通交流上,未来的规划也是要成为企业沟通交流的平台。我们首先要让第一企信成为最适合移动互联网时代的企业沟通工具,除了要具备传统企业应用需要具备的诸如企业通讯录之类的功能之外,还要不断增强移动端和PC端之间的功能同步性,让用户能够使用第一企信真正做到移动办公。并且在产品设计上,带入移动互联网思维,让产品带动产品的用户(企业员工、团队成员)发挥更强的主观能动性,让集体智慧得到充分发挥。
我们的SaaS云平台8.18正式上线运行,到目前为止,注册上千家家企业,其中不乏很多知名企业。而且我们发现,只要企业真正用起来之后,粘性非常强,在上班时间,所有员工基本上都是全部在线,活跃度非常高。
未来我们期望将第一企信发展成企业或团队统一的信息出入口,开放接口将传统企业的OA、ERP、CRM等系统接入第一企信,这样用户就能使用第一企信来接收和处理企业各种办公系统的信息。
CSDN:你目前正在做的产品叫第一企信,目前已有一千家企业用户,相比市场上企业级即时消息软件(RTX、imo、263云通信等),其杀手级功能是什么?
胡修彪:最重要的一点,第一企信是免费的。RTX、imo、263云通信都是收费的,企业用户每年都要对此指出相当高昂的费用。在企业市场上有一个奇怪的现象,就是当你拿着免费的产品向企业用户推广的时候,他反而希望你收费。因为企业用户会觉得免费的东西不可靠,我们也遇到过这种问题。但同时我们发现在我们这一千家企业用户之中有很大一批是过去其他付费产品的深度用户,但是他们都反映过去使用的产品问题多,服务跟不上,反馈的问题好几年也得不到解决。他们抱着试一试的态度使用了第一企信,结果发现这免费的产品质量和服务却都很好,他们反馈的问题我们基本都在一周之内更新解决,于是最后都留在了第一企信上。其实过去那些收费的企业软件,他们的整体路线都还是PC互联网时代卖软件的方式,这种方式有个很大的问题就是当用户签了协议买了单,产品的问题、服务的问题,用户就只能默默忍受了,产品提供商不会过多的管你遇到了什么问题,有那个精力那还不如多发展几个客户多签几单。但免费产品因为用户的进入和退出成本都是零,只要产品不好,服务不好,用户就能马上不用,这就要求我们做免费的产品必须提供最好的产品、最好的服务。
同时,第一企信还是基于云架构的,与以往传统企业软件需要私有化入驻式部署的方式不同,第一企信不需要用户部署服务器,上网下载客户端注册就能使用。这大大降低了企业用户使用的门槛。有些企业对于私有化部署有非常强烈的要求,我们的第一企信整体架构也完全可以私有化部署,并且如果私有化部署的话,第一企信还可以与企业原有的电话系统、办公系统进行对接,当然,这种私有化部署的方式会有服务器成本、工程人员施工成本,所以这种方式是收费的,但在那个公有云上的第一企信是永久免费的。企业可以根据自己的需要选择。
第一企信拥有非常强大的手机客户端,其功能性基本与PC客户端保持一致。这就很好的解决了工作人员移动办公的需求。相比于市场上其他产品,
RTX缺少强大的移动端,imo和263的移动端我们也都研究过,很多设计细节上有问题,用起来并不方便。 举个简单的场景,办公人员经常会遇到上班的时候在电脑前收发了消息或者文件,下班走到路上或者回到家里,使用手机或者家里的电脑还想看下白天的信息,但是却发现那些信息只在自己办公室的电脑有保存,回家根本看不到。第一企信就在这种细节上做了处理,手机、PC之间的信息和文件完全同步,不管是在办公室、在出差还是在家,你都能随时查看过去的消息和文件。即便是你换了手机换了电脑,也能找到过去的信息。同时在产品的稳定性上,我们也研究和使用过很多其他企业软件产品,我们可以很自信的说,我们的产品稳定性是最好的。
最后也是非常重要的一点,第一企信实际是一个互联网产品形态的企业应用,本质上和我们以前看到的RTX,imo,263云通信完全不同。之前我说过他们都是传统卖软件的思维方式,产品迭代速度缓慢,客户服务渠道响应慢。第一企信作为一个互联网形态的产品,我们基本每周一个版本的迭代,处理用户遇到的问题,并且增加一些功能和易用性,这意味着我们的产品优化速度会远远高于其他产品。同时我们将客服工作直接嵌入产品,由客服阿信为用户提供最直接的真人一对一客服,目前为止,阿信已经成为了我们最大最重要的用户声音反馈渠道。对于用户提出的问题和建议,我们早已经有一套闭环的完整处理流程,很多用户反馈问题之后都会很快收到问题受理的通知邮件,里面能看到问题描述,问题反馈时间,问题记录编号。大多数问题在一周后,用户就会收到新的通知邮件,告诉他相关问题已经得到解决,可以更新版本体验一下。反馈过问题的用户都能深切体会到我们有多用心的在做产品和服务。
基于快速的产品迭代,实际上我们对第一企信的未来规划还有一箩筐的设想正在进行讨论和设计,很快大家就会在第一企信上看到一些新鲜玩意。所以不要简单地以为第一企信就是现阶段大家看到的这些功能,未来的它,一定有资格成为一个传奇。
CSDN:上面你提到说第一企信的杀手级功能是免费,但很多企业都认为收费的产品有保障,免费IM在稳定性、可用性和功能方面都有所欠缺有人认为「软件不因免费而美丽,收费才是救赎之路」,也有人说「收费才是王道」,对此你怎么看?
胡修彪:认为免费IM的稳定性、可用性和功能性方面有缺陷这种看法本来就违背了许多实例,比如微信、QQ、陌陌,他们的IM都是免费的,但显然他们的稳定性、功能性都做得不错,不然怎么会有那么大量的用户呢?
未来世界一定是开放,平等,更有效率。免费,也是未来一大最重要的趋势。就像周鸿祎的新书《我的互联网方法论》中提到的:“没有人能打败趋势 ” “商业模 式不是赚钱模式”。360杀毒从2009年的1.0版本发布开始就是免费的,当时惊掉一地眼球,但是现在,它早已完胜曾经收费的国产老牌杀毒软件。免费是 一个大趋势,而我们比这个市场中其他人更早、更清楚地看到了这个趋势,并且比别人更有胆量沿着这个免费的趋势走。
如果说到免费产品与收费产 品哪种更有保障,我是这么认为的,看看我们身边免费的东西:阳光、空气、关爱,这些免费的东西却都是最宝贵的东西。产品也一样,只有做出极致的产品、极致的服务才有资格去说“免费”二字。因为免费虽然对用户来说是零门槛使用,参与成本几乎为零;但是相同的,对用户来说退出成本也是零,只要用户觉得产品不爽,他不必花费任何成本就可以放弃这款产品。而收费的模式下,即便用户觉得产品不好,但毕竟他已经花一大笔钱,就舍不得撤掉了。这就是为什么我们经常说 “免费的,才是最贵的”。选择走免费的路,就意味着我们必须提供最极致的产品、最极致的服务。反而我们从用户中了解到,我们不少用户曾经都是付费软件的深
度用户,可是曾经使用的付费产品却存在诸多质量和服务的问题,最终吸引他们使用第一企信产品的也正是我们比付费产品更可靠的质量和服务。
CSDN:第一企信采用了SaaS云平台,从一开始就上云了?期间的安装、迁移、测试到部署一切顺利吗?你有什么心得和体会可分享?
胡修彪:第一企信并不是一开始就采用SaaS云平台的,之前提到第一企信有入驻式部署的方式。事实上入驻式的第一企信是早于公有云版本的,在今年上半年的时候就已经有几家大型企业(新宝电器、志高空调等)选择了我们的入驻式产品。但同时我们更看到了移动互联的大势所趋,并且看到了所有企业、团队对于沟通的共同需求。于是决定提供基于公有SaaS云平台的第一企信产品。实际上从传统的入驻式产品转变成云平台产品是一项相当大的工作,涉及整个架构的变动。我们当时定下一个目标,在今年五月中旬的时候完成整个云平台的搭建和部署,在这之前的两个多月时间是非常煎熬的,遇到不少问题。当时我们还有很多老同事对于达成这个目标并不看好,认为不可能做到,那几个月时间我们陆续有人离职,最终人力几乎缩减一半。但最终我们还是达成目标,按时完成平台搭建和部署,当时我们离职的老同事还曾打电话联系我们,问我们进度如何了,我们说:“完成了”。他说:“没想到啊,真没想到”。而这段经历也将整个团队拧在了一起,最终坚持下来的团队成员,都成了团队的中坚力量。
要说到心得,我觉得最重要的是一次性把事情做好,保证每个环节不出问题。我们的SaaS云平台,从一开始定位就是要支持千万级的企业用户,并且能够提供7*24小时的不间断服务。所以我们一开始在架构设计的时候,就进行大量的充分论证和分析工作,同时我们也引进了关键的有经验的架构人才。但是云平台架构设计是非常复杂和艰苦的工作,需要足够的技术积累和实操经验,它涉及到内容很广,包括分布式集群、分布式文件系统、内存数据库、数据库集群、负载均衡、弹性扩容、性能设计、优雅降级等等各个方面,哪一个方面,考虑不周或者设计不好,都有可能成为整个系统的最短木板。架构设计好之后,后面开发、测试等环节就水到渠成。在云平台设计开发上,我们没有生搬硬套用互联网快速迭代的敏捷开发流程,而是采用类似华为的IPD/CMM的开发流程,把每个环节一次性做好,最终整体来看,我们用一个很多人觉得不可能的时间完成了一项特别艰难和复杂的任务。
40人技术团队是这样造梦的
CSDN:佳米技术团队构成是怎样的?
胡修彪:我们的技术团队按照各自的分工划分:
有负责整体架构的系统架构师,然后系统的语音服务和即时消息服务各自有一个团队负责。PC、iOS、Android三个客户端分别由三个团队负责。网络通话的语音由一个语音技术攻关小组单独负责语音的质量问题,我们的技术团队目前总人数在40左右。除了这些纯技术团队之外,还有UI设计、产品设计、运营推广以及运维小组。
我们目前采用扁平化管理,我直接管理着各个开发组的组长,这样可以快速进行决策和响应,每个开发组不超过5个人,小而精的自组织团队模式,一直是我对研发团队的要求。互联网企业的竞争,一定会是“班长战争”,每个项目组代表一个班,每个班在技术、管理甚至团队风格都是高度独立的,每个班都有独立自主权,最终一个班的战斗力直接决定了一个模块或者一个子产品的质量,而整个产品的短板由战斗力最差的那个班决定。比如一个强悍Android团队打造出来的Android客户端在用户体验、稳定性、性能等各个方面都会非常棒,但是如果iOS团队不行,iOS客户端就不可能好,那我们流失的肯定是所有iOS客户,最终的结果就是整个产品的失败。所以,当前对我的挑战来说,我需要的做的是既要让每个班都能够高度自主、自管理,同时要能保证每个班都能快速前进和进步,不能成为整个木桶的短木板。
CSDN:今年三、四月,你们在云平台的搭建和部署过程中,陆续有人离职,人力几乎缩减一半,你当时的感受是怎样的?你认为是任务过于艰巨还是管理方面存在问题?(佳米的技术团队目前采用扁平化管理)
胡修彪:说实话,这基本上都是我预料之中的事情,有一些人是我们主动淘汰的,因为他们的技能、经验以及意愿和我们的业务发展方向本身就不相符。我们想要在移动互联网 时代有追求和梦想,必须是要选择和我们志同道合的人一起前行。另外一部分离开的原因是适应不了新的工作环境和氛围,过去的日子应该是过得太安逸了,每天9 点上班6点下班,工作压力和强度都不大,但是突然变成996(9点上班9点下班一周6天)模式了,一下子从身体和心理上无法接受,所以他们选择离开。这是 他们的选择问题,我们也尊重他们的选择,毕竟每个人的诉求都是不一样的,同则聚,不同则分。但是比较幸运的是我们关键核心员工还是选择留下来并且一心向前,所以虽然离职人员很多,但是对我们整体的质量和进度并没有影响,反而是队伍的凝聚力和战斗力提高了很多。
CSDN:你提到华为的文化「为客户服务是我们存在的唯一理由」,能否说说佳米的技术文化?
胡修彪:佳米的文化简单来说就是“技术为产品服务,产品以用户为中心”。我们要提供极致、好用的产品为用户服务,给用户带来价值,而一切技术都是为了提供这种极致的产品和服务。因此我们基本不会因为某件能给用户创造价值事情在技术上难以达到而不去做,这也是为什么我们会花时间将我们的产品打造成一款云平台产品,因为我们确定这样的产品才能给更多用户带来更大的价值,所以即便难,我们也要做。而我们产品中客服阿信的存在,也体现了这一文化,想要打造让用户满意的产品,就必须能听到用户的声音,让用户的意见流畅地传达给我们。所以我们的技术文化和我们的产品文化基本一致“技术为产品服务,产品以用户为中心”。
产品型CTO的职业晋升
CSDN:你是前华为总监,第一次和第二次均是CTO,起初也是从普通的码农做起,这一路走来,你是如何在进行角色转换的?每个时期对于团队(管理)的理解有什么不同?
胡修彪:谈到如何做角色转化,我想最重要的就是“学习”,保持对新知识、新技术、新架构、新理论思想的“饥渴感”,每天再累再忙,也要抽出一定的时间去学习和阅读,以前经常去CSDN、51CTO,现在也经常会去Github、Stack Overflow。
除了保证和当前的技术趋势和潮流同步之外,也会在其他方面也会去思考和了解,比如为了能够管理好团队,我会去看心理学方面的书,包括行为心理学和社会心理学等,为了能够和开发人员沟通更为顺畅、做决策更加准确,我自己也会抽时间去尝试写写iOS和Android代码,虽然这些对我来说都是全新的工具或者语言。总之一句话,只要是能够帮我更好带领团队、更好的做技术决策,我都会愿意去尝试和实践。
关于每个时期对于团队管理的理解,这三个时期确实不一样。
在华为的时候,全部采用IPD/CMM开发模式,整个产品研发系统的每一个人都只是流程体系中的一个角色,不管你是研发总监、产品总监、系统工程师还是项目PL,对于每个人来说,需要做的就是完成流程体系所赋予角色的职责和任务,每个人可发挥的空间和天花板其实比较有限的。所以当我是软件工程师的时候,我要做的是完成属于我的软件开发任务,保证我这个环节质量进度没有问题。当我是研发团队Leader的时候,IPD/CMM流程还是会对其工作任何和职责有严格的定义,所以我还是跳不出也不需要跳出其“五指山”。当我第一次创业的时候,情况就完全不一样,虽然我贵为“CTO”,其实技术团队没有多少人,而且大部分都是刚毕业不久非重点大学的年轻人,所以我基本上是当爹又当妈,几乎每个人都要手把手的教起,包括编码的基础、逻辑、习惯、规范、工具等各个方面。这个时候,我们团队没有天赋,也没有特殊的资源,也缺乏经验,那对我们来说,我们能靠什么,只能靠精神以及梦想,我们靠着笨鸟先飞的精神,同时我内心树立一种信念,我一定要让他们对我有一种“士为知己者死”的感觉,这样团队才能在短期看不到希望以及外界有诱惑的时候,也不会散掉。所以,我对他们百般照顾,不管工作还是生活上,从内心把他们当做自己的兄弟,因为我自己清楚,如果感动不了自己,肯定感动不了他们。最终的情况说明,在这一点上,我是成功的,我们团队的核心人员一直都陪伴着我,即使他们拿到的工资比市场平均水平低很多。当我离开拼啦拼车的时候,有一些兄弟也选择另寻出路,基本出去之后,工资都能Double。对于现在佳米科技的管理,我的方式完全不一样,团队的大部分成员都有非常好的技术积累和产品开发经验,我不需要关注细节,我可以把我的主要精力放在产品定义、架构设计、技术选型、团队管理等方面,我可以把IPD/CMM以及敏捷开发流程相结合和融合后,再应用到我们第一企信的产品开发上,所以从本质上说,我现在才算是真正意义上的研发团队管理者。CSDN:CTO应该是企业技术路线和远景的思想者,你把自己定义为产品型的CTO,能详细说下吗?
胡修彪:把自己定位为产品型CTO,其实原因只有一个,就像上面说到的,技术是为产品服务的。
以前在华为的时候,任正非老爷子经常对研发说,我们不需要院士和科学家,我们需要的是工程师。他的意思其实很明确,不能为了技术而技术,而是要把技术应用到产品研发和满足客户需求上,也许我对自己的定位潜移默化受他的影响。比如说因为我们定位第一企信给亿万企业用户提供沟通交流的平台,所以就要求我们的云平台设计必须是一个稳定可靠、性能高、弹性的分布式集群系统;
另外,由于企业上的办公沟通一刻都不能耽误,所以就要求第一企信能够提供7*24超稳定的服务,那么我们的客户端的稳定性、用户体验就至关重要,我以及我的技术团队必须在这些方面有高要求、严标准,同时我们的服务器集群的每个节点都不能有单点故障、每个节点都能支持在线升级、每个节点都能弹性扩容,这些需求就会及时的驱动我们的架构设计、开发和测试方向和目标。用一句比较时髦的话说,就是“因为要有风,于是便有了风”。除了产品和用户需求来驱动我们技术上要做些什么之外,它也能告诉我们不需要做什么。
第一企信定位于企业级沟通工具,那么沟通信息、用户行为信息等都是企业的隐私甚至是商业机密,所以我们系统后台不会对这些进行记录和统计,这是我们的原则。所以,我们对大数据分析方面就没有需求,我们就不会投入资源和精力在大数据分析上,虽然它是当前一大热点,虽然它能给我们带来很大的商机。
刚刚毕业上班的我,为自己的程序员之路开始记录。
刚刚毕业上班的我,为自己的程序员之路开始记录。开始自己的第一篇博客。即为我程序员成长的开始。...
一个刚毕业大学生的四个月苦逼程序员经历
先来一个自我介绍
(转)给刚毕业的大学生和刚入门的程序员的忠告及图书推荐
原文作者乔纳森·丹尼可(Jonathan Danylko)是一位自由职业的web架构师和程序员,编程经验已超过20年,涉足领域有电子商务、生物技术、房地产、医疗、保险和公用事业。正如乔纳 森在文中所言...
对于刚毕业的学生来说一个月应该拿多少钱
对于刚出校园的毕业生,应聘的需要的都是经验
写给刚毕业的程序员的一点经验教训:
1.如果你进了一家靠关系吃饭的公司,千万不要跟那些你眼中所谓的老板&眼线&过不去,即使你相当的看不惯他,如果他拉拢你
即使你不想参与他们,你应该客...
我是计算机专业的,今年大四了.一般来说现在面临两个选择,一是考研,二是找工作..本想试着考研的,今天和家里沟通了一下,他们都希望我先找工作.我想工作就工作吧。。他们问我现在专业学得怎么样,对以后的工作...
原文地址:http://blog.csdn.net/WuLex/article/details/小韩是一家小公司的软件程序员,而十年后他还在那家公司,依然是一名普通的程序员。算起来,他...
那些 22 岁毕业做程序员的“普通”人,他们 50 岁左右时的人生轨迹是怎样的?看他怎么说:本人今年35了,已经干了14年程序员,是14年不是13年,因为我是专科毕业。一直就是普普通通的程序员,特别纯...
今年 47,快五十了,每天编程时间平均六到八小时。
身体肯定比不上年轻人了,三十岁的时候,我连续编程时间可以在二十小时以上,经常有人第一天上班看见我在公司,第二天上班看见我还在公司。
没有更多推荐了,}

我要回帖

更多关于 如何做好运营管理工作 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信