全部用nodejs写的公司官网,真正的商业例子,供大家参考
发布于 1年前 作者 bizhisoft 7898 次浏览

从去年7月份开始做的公司官方网站,

  • 使用了express框架
  • jade模版
  • node-cavans做了验证码
  • 支持makedown的博客
  • 后台jquery文件上传功能
  • 集成了单点登陆功能

用户注册的功能我把它屏蔽了,你们看不到,呵呵.

公司官方网站链接: http://www.bizhisoft.com/

ps: 请同行们手下留情,不要恶意攻击我的网站啊.

72 回复

其实我还用nodejs做了一个失败的企业应用产品,发现nodejs不适合做逻辑复杂的企业应用,特别是在生成报表的时候,由于nodejs天生的异步调用,导致按逻辑顺序处理多个数据集合是非常头疼,需要用变量来保证函数的执行顺序.这个对编程能力要求很高,不适合团队开发,不过nodejs实现权限控制的功能没有问题的.

我习惯用sublime做nodejs开发,边写代码边查看网站的显示效果,出现bug就用console.log抓一下变量,完全不用其他的开发工具,因为像eclipse这种开发工具都太大,运行太慢了.

公司名字有亮点,,请允许我的调皮~呵呵~

呵呵,同音问题,的确会让人想到… 某出名饭店还叫小憩饭店呢

你服务器的22端口没锁。。。建议用iptables锁住,很容易被暴力破解的 :p

我要用ssh远程连服务器啊,锁住22端口怎么连服务器?买的阿里云服务器

nodejs的商业应用就在于做公司官网

不是有promise吗

@yakczh ,函数式编程比面向对象编程虽然减少了全局变量,但是遇到合并的问题就头大了,比如要将两个数据源的数据同步并合并,这个promise是解决不了的,promise只是把函数层层嵌套的写法变成顺序的写法.本质上是解决不了合并的问题,具体推荐你阅读SCIP关于函数式编程的章节

这个也就是相当于hello world了

啥意思哩,牛烘烘的样子,哥们攻击型的把

我觉得吧 先找个美工挺好的 嘿嘿

有了bootstrap给你们省了很大的力气啊,都不用找设计师了

async 处理异步合并挺好呀。

usherwong眼尖,被你看穿了,呵呵,刚开始是用bootstrap 2,后来升级到bootstrap 3,有兼容问题,要改动的地方还不少,特别是表单那一块。

做这个官方网站总的工作量也不大,我就是一个人利用开发产品的业余时间断断续续改了改,用nodejs开发主要的难点就是要用异步编程的方式去设计程序。还有网站的架构要不断自己摸索改进。不像asp.net那么成熟,不过asp.net框架太死了,做一个http handle模块太麻烦,而nodejs是直接在express框架里的app.use引入一个函数就解决问题了。

eventproxy 试试

用 pubkey ,开22没事

一大早起床发现网站里一篇文章会弹出对话框,原来是评论部分有xxs漏洞,迅速更新网站,直接用简单粗暴的方式转义了html,搞定,上班去。 顺便谢谢某位同行的善意提醒。

不错~好像是用nodejs做了一层前台的宣传,产品还是C/S结构的。没有用Nodejs做一些核心的业务

以前尝试把产品做成BS结构的,做到一半放弃了,一是花的effort有点大,二是没办法做详细的测试,质量不可靠,三是javascript源代码得不到很好的保护,因为最终产品是要给客户的,而nodejs都是动态读取js文件,虽然我也用C++ addon专门写了源代码保护的组件,但是高手还是可以通过修改入口文件或是截获解密后的文本绕过去的,最重要的一点是要用户装nodejs环境和模拟,简直不可能的事情,而我们公司的产品就这点价格,跑去帮客户装linux系统,装软件,卖一套产品的钱还不够来回车费和住宿费用.

用老雷的xss 模块不是挺好的吗…

@youxiachai 没时间研究怎么用啊,等有空再看看

@youxiachai 那效率,那regex写的

@weakish 已经改了端口了 :)

具体说说你的合并,使用promise无法完成这种类型的工作,我深表怀疑

不是无法完成,而是实现起来比较复杂,稍有不慎,就是死循环,mongodb直接down掉。 例如,航班订阅系统中有两张表,一个是舱单表,记录了所有乘客的航班订单的信息(出发地,目的地),另一张表是关于乘客的详细信息(姓名,所在地区),现在要用nodejs读取mongodb中这两张表的数据,统计出2014年每个季度中,总航班数量大于10次的乘客所在地区的分布情况。

使用 xss 模块:

  • 先安装: npm install xss
  • 在代码中使用:
var xss = require('xss');

// 直接调用xss函数即可
console.log(xss('<a onclick="alert(/xss/)">click me</a>'));

@alsotang xss 模块速度还可以,自我感觉良好

我想说界面好丑

@bizhisoft 这个是mongodb的局限性吧。用relational db咯。

@coderek 听都没听说过的数据库,不敢用

没米,请不起设计师

@bizhisoft 嗯,设计师我只有崇拜的份儿:)

建议用1920的显示器看看,网站有错误!!!

没有这么高端大气上档次的显示器啊,没办法测了,呜~~

@bizhisoft

他意思是关系型数据库,我觉得这块不是问题,用mongodb一样可以解决,两张表一定是有ID进行关联的,我首先查找乘坐10次以上的乘客,然后在关联用户表进行下一步的查询。为代码就是

航班大于10次.then(function(results){ if(results) for -> 用户id return ids return Promise.reject(err); }).then(function(ids){ return mongodb in ids }).then(function(results) { //这里就是结果。 }

@crossmaya

给段我们公司项目真实的代码让你看看,看完之后就知道为什么函数式编程实现合并的困难之处

这段代码是用来得出可用性分析的报表的,从日历表,班次表,系统表,模块表,事件表读取数据并合并处理, 其中moduleIterator,systemIterator使用来控制正确的处理顺序的。

exports.analysis = function(req, res, systems, startDay, endDay, interval) { Calendar.find().exec(function(err, calendars) { Shift.find().exec(function(err, shifts) { var result = new Array(); var systemIterator = 0; systems.forEach(function(system) { var resultItem = {}; resultItem.system = system.system_code; result.push(resultItem); resultItem.modules = new Array(); Module.find({ system_code: system.system_code }).exec(function(err, modules) { var moduleIterator = 0; modules.forEach(function(module) { Event.find({ module_code: module.module_code, event_date_time: { $gt: startDay, $lt: endDay } }).exec(function(err, events) { var resultItemItem = {}; resultItem.modules.push(resultItemItem); resultItemItem.module_code = module.module_code; (省略代码…) resultItemItem.schedule_time = (省略代码…) (省略代码…) resultItemItem.intervals = new Array(); var intervalArray = (省略代码…) intervalArray.forEach(function(intervalItem) { var resultItemItemItem = {}; resultItemItem.intervals.push(resultItemItemItem); (省略代码…) resultItem.eventtypeLength = eventtypes.length; eventtypes.forEach(function(eventtype) { var resultItemItemItemItem = {}; resultItemItemItem.eventtypes.push(resultItemItemItemItem); (省略代码…)

     var eventFilters = _.filter(events, function(event) {
      return event.event_type == eventtype.code && event.start_date_time >= resultItemItemItem.start_day && event.start_date_time <= resultItemItemItem.end_day
     })
     eventFilters.forEach(function(eventFilter) {
      resultItemItemItemItem.event_time += (省略代码...)
     (省略代码...)
    })
   })
   (省略代码...)
   
   moduleIterator++;
   if (moduleIterator == modules.length) {
    systemIterator++;
    if (systemIterator === systems.length) {
     var report = (省略代码...)
     report.save(function(err) {
      if (err) {
       res.send(500)
      } else {
       res.json({
        url: '/reports/result?ID=' + report._id
       })
      }
     })
    }
   }
  })

 })

})

})

}) }) }

@crossmaya 这样的代码写的人维护起来都很吃力

没有用node写过太复杂的逻辑。ebay里的逻辑应该不简单吧,但是node也能应付。尝试用一些流程控制的框架,重构下代码,应该会好很多的。 那一堆}}}}}}}}}}}}}}}}}}}}}}}}}太泯灭人性了。

这颜色。。。。可以看出楼主很用心了,但是还是觉得。。。 色差有点大,风格不固定————个人观点。。。 功能上没看到什么问题,毕竟也不复杂,发展空间还是很广阔的,觉得会受到中小企业的青睐。 支持一下。 最后也忍不住吐槽一下公司名字。。。确实有点亮~~~

@bizhisoft 没有前端逼死人啊…前端狗滚过…

忽然想到可以用浏览器的缩放功能模拟不同的分辨率,发现首页的图片没有自动伸展,是不是这个问题,昨晚改好了,你看看这个问题还存在吗?谢谢。

可以问下lz的jquery后台上传图片大致是怎么做的么

前端用 jquery file upload 组件,后台用nodejs实现接口就行了,有开源的组件,不过要修改,集成进自己的框架里面,什么文件都可以传,1G大小的文件都没问题,我现在基本上把它当存储中心。计划将其改造成电子档案中心,呵呵,可以检索,不同的用户有不同的文件夹和权限。。。

同想歪了,捂脸

@bizhisoft = = 干嘛要写成这样,过俩月鬼才知道这段代码在干嘛

“Write small modules that each do one thing, and assemble them into other modules that do a bigger thing. You can’t get into callback hell if you don’t go there.”

http://callbackhell.com/

header.jade里if(req.user != null)这样写会不会有问题呢

写一个中间件含有如下代码,注册到app.use里面

res.locals.req = req

就可以在jade里面使用req了

同意, 顺道说一句, nodejs真的不适合做页面, 做高IO, 低cpu的interface比较合适~~

@bizhisoft 怎么没处理err呢

@kopes18 没关系的,在最外层捕捉了err, 服务器会返回500错误

@bizhisoft 这个不会的 err需要手动处理才行

@kopes18

可以的,route是注册到express框架里面,express框架带错误处理。 请看下面代码

// Require Dependencies
var express = require('express');
var app = express();

// Middleware
app.use(app.router); // you need this line so the .get etc. routes are run and if an error within, then the error is parsed to the ned middleware (your error reporter)
app.use(function(err, req, res, next) {
    if(!err) return next(); // you also need this line
    console.log("error!!!");
    res.send("error!!!");
});

// Routes
app.get('/', function(request, response) {
    throw "some exception";
    response.send('Hello World!');
});

// Listen
app.listen(5000, function() {
  console.log("Listening on 5000");
});

@bizhisoft 比如你这行 Module.find({ system_code: system.system_code }).exec(function(err, modules) { var moduleIterator = 0;

如果这个 err 你不处理的话是不会抛出异常的

这个是你从前到后一个人负责的吗?

@kopes18 有道理,我比较懒,呵呵,这种情况的err不处理,后面的代码执行也会出错的.

本人在大公司有正式工作,只是利用业余时间搞搞副业,所以开了个小公司,目前光棍司令一个,公司的网站和产品都是我一个人做的,工作快六年了吧,大学时代学的是教育技术专业,自学计算机,考过高级程序员, 曾猛啃C++和算法,毕业设计用UML做了个系统的分析和设计,工作开始用C#,慢慢工作的重心转向 javascript, 业余时间学了linux和数学和Lisp,喜欢使用debian linux. 因公司外派出过一趟国,回国开始思考创业. 目前我写的软件DACAAS是用C#做的,最值得称赞的是自带scheme语言解释器,可惜总感觉使用难度有点高,用户用不来,还有只是单机版,没有数据可视化的功能. 我计划再利用一年时间,将nodejs和node-webkit融入到DACAAS这个产品中,做出超越SPSS的产品,希望有一天中国人也有自己的通用强大的数据分析软件吧,下一代的软件的架构和设计已经在规划中了,细节我就不多说了,等产品做出来再说吧.

美工、网页互动还有提升空间。

总感觉nodejs是用来处理数据的,做展示类型的官网。。有点怪怪的。。

楼主,需要美术和前端不?

真心需要,可是没项目没米啊, 同行们有什么好项目介绍点给我啊, qq: 1036389464

顶这样有实践经验的帖子

怎么打不开?

@bizhisoft “由于nodejs天生的异步调用,导致按逻辑顺序处理多个数据集合是非常头疼,需要用变量来保证函数的执行顺序”-异步书序调用有很多方法解决,搜搜就有了

貌似打不开了~~~

已经挂了。楼主用的mongoose?怎么不populate。。。实践下来感觉mongo的数据结构设计要事先考虑到查询,不然会有点坑。

为什么打不开?

回到顶部