使用 nodejs 编写的公司多人订餐程序

使用 nodejs 编写的公司多人订餐程序

餐库,是一个使用 nodejs 编写的公司多人订餐程序,使用了 express , mongoskin 模块。使用 mongodb 做存储。

餐库的功能:

  1. 用户登录、注册
  2. 店铺、菜单的增删改,菜单支持特定的送餐日(如:周一,周二)
  3. 菜单支持分类功能
  4. 单店的上下午区分的订餐统计,以15时,作上下午的区分
  5. 每订单有运气值功能,当日单店运气值最低的负责打电话点餐

演示地址: http://canku.willerce.com

部署请参考,Noderce AppFog 部署指南:http://willerce.com/post/noderce-deploy-to-appfog


大家点餐后,今天谁打电话这个问题我思考了很久,后来在打 Dota 时,大家敲命令 -roll 扔运气值决定谁这盘包盘包眼,于是想到这个办法。

每个订单都会获得一个随机的运气值,0-100之间,我们觉得挺有意思的,有个同事说:本来想去食堂吃,但就是想看看今天运气才来餐库点餐的。


目前已经在公司内部使用了好几个月了,大家一直要求的新功能,也因为在学习 python 没有时间完善。

所以非常开源出来,如果这个小程序有机会被你们使用,非常非常希望大家能贡献一些代码。

github: https://github.com/willerce/canku


36 回复

使用 Node.js 编写的公司多人订餐程序

餐库(Canku)是一个使用 Node.js 编写的公司多人订餐程序,它利用 Express 和 Mongoskin 模块与 MongoDB 数据库进行交互。以下是餐库的主要功能和一些关键实现代码示例。

功能介绍

  1. 用户登录、注册 用户可以通过注册和登录功能来管理自己的账号。

  2. 店铺、菜单的增删改 支持店铺和菜单的增删改操作,并且可以设置特定的送餐日。

  3. 菜单分类功能 菜单可以根据不同的类别进行分类展示。

  4. 单店的上下午订餐统计 订餐统计功能根据15时作为分界点,区分上下午的订单。

  5. 订单运气值功能 每个订单都有一个随机的运气值,当天单店运气值最低的用户需要负责打电话点餐。

示例代码

以下是一些关键功能的代码示例:

用户注册与登录

const express = require('express');
const app = express();
const bcrypt = require('bcryptjs');
const mongoose = require('mongoose');

// 连接 MongoDB
mongoose.connect('mongodb://localhost/canku', { useNewUrlParser: true, useUnifiedTopology: true });

// 用户模型
const UserSchema = new mongoose.Schema({
  username: String,
  password: String
});

const User = mongoose.model('User', UserSchema);

app.post('/register', async (req, res) => {
  const { username, password } = req.body;
  const hashedPassword = await bcrypt.hash(password, 10);
  const user = new User({ username, password: hashedPassword });
  await user.save();
  res.send('注册成功');
});

app.post('/login', async (req, res) => {
  const { username, password } = req.body;
  const user = await User.findOne({ username });
  if (!user || !await bcrypt.compare(password, user.password)) {
    return res.status(400).send('用户名或密码错误');
  }
  res.send('登录成功');
});

店铺和菜单管理

const ShopSchema = new mongoose.Schema({
  name: String,
  menus: [MenuSchema]
});

const MenuSchema = new mongoose.Schema({
  name: String,
  category: String,
  deliveryDays: [String],
  price: Number
});

const Shop = mongoose.model('Shop', ShopSchema);
const Menu = mongoose.model('Menu', MenuSchema);

app.post('/add-shop', async (req, res) => {
  const { name } = req.body;
  const shop = new Shop({ name });
  await shop.save();
  res.send('店铺添加成功');
});

app.post('/add-menu', async (req, res) => {
  const { shopId, name, category, deliveryDays, price } = req.body;
  const menu = new Menu({ name, category, deliveryDays, price });
  const shop = await Shop.findById(shopId);
  shop.menus.push(menu);
  await shop.save();
  res.send('菜单添加成功');
});

订单运气值功能

const OrderSchema = new mongoose.Schema({
  userId: String,
  shopId: String,
  menuId: String,
  luckValue: Number
});

const Order = mongoose.model('Order', OrderSchema);

app.post('/place-order', async (req, res) => {
  const { userId, shopId, menuId } = req.body;
  const luckValue = Math.floor(Math.random() * 100);
  const order = new Order({ userId, shopId, menuId, luckValue });
  await order.save();
  res.send(`订单已提交,运气值为 ${luckValue}`);
});

总结

餐库是一个实用的公司多人订餐系统,通过 Node.js 和 MongoDB 实现了多种功能。如果您对该项目有兴趣并希望参与开发,欢迎访问 GitHub 并贡献代码。

期待您的反馈和贡献!


谢谢分享。

用什么做得UI?

有点小问题。。。

真挺不错的~!

一看就是bootstrap。。

进去之后都不知道怎么用。这其实是一个用户体验问题

目前比较粗糙,欢迎贡献代码。

不错啊,加点图片就好了,可以介绍餐名

多谢分享 有个问题请教下,每个餐厅的菜名价格什么的,这些信息是抓取过来的,还是一个一个输进去的?

自己输入的。

我觉得你的项目有实际意义,有可能做大

你的web UI 在坑爹的IE下崩溃了

好东西!刚注册了试了下!挺好的

没有测试过,不管IE。

餐库作者,您好,可能你已经发现,我们正在使用您的餐库订餐,非常方便。 非常感谢!!

有个问题想咨询,如何部署到自己的服务器上。我发现目前这个网站很慢

-roll原来是包盘包眼,以后果断不roll

安装完 node mongodb 环境后, node app.js 启动就可以的呀~

请问支付功能什么能分享一下, 非常感谢!!

支付功能其实是一个简单的账户余额功能。

我们设定外卖统一由前台支付。你将钱交给前台妹子,妹子在后台为你的帐号冲值。

所有的账户余额变动(支付、冲值)都会在个人账户余额页面查看到。

module.js:340 throw err; ^ Error: Cannot find module 'underscore’ at Function.Module._resolveFilename (module.js:338:15) at Function.Module._load (module.js:280:25) at Module.require (module.js:364:17) at require (module.js:380:17) at Object.<anonymous> (D:\Program Files\nodejs\canku-master\libs\service.js: 4:9) at Module._compile (module.js:456:26) at Object.Module._extensions…js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Module.require (module.js:364:17)

请问我更新了最新的canku运行报这个错误,如何解决,谢谢!!

我以为我又做错事了。赶紧查看一下 package.json,发现我依赖是写上了的。

所以,你只需要

cd canku_wdir
npm install underscore

谢谢分享了

看起来很不错 ,赞一个

东西写的不错,演示网站太卡了。

今日订单出错Express 500 TypeError: object is not a function at Object.exports.getToday (/root/soft/canku-master/libs/service.js:24:15) at exports.today (/root/soft/canku-master/routes/main.js:22:11) at callbacks (/usr/local/lib/node_modules/express/lib/router/index.js:161:37) at exports.auth (/root/soft/canku-master/routes/main.js:363:12) at callbacks (/usr/local/lib/node_modules/express/lib/router/index.js:161:37) at param (/usr/local/lib/node_modules/express/lib/router/index.js:135:11) at pass (/usr/local/lib/node_modules/express/lib/router/index.js:142:5) at Router._dispatch (/usr/local/lib/node_modules/express/lib/router/index.js:170:5) at Object.router (/usr/local/lib/node_modules/express/lib/router/index.js:33:10) at next (/usr/local/lib/node_modules/express/node_modules/connect/lib/proto.js:190:15)

已经解决

哎,bug

我点了一份主食, 78W元, 账户余额负数了, 我先跑路了…

最近正好突然想写个寝室点餐系统,这个挺给启发的 给力

额。1年多没更新了啊

本来也想写一个,直到后来大家都用上eleme…

很不错,在本地跑起来了。基本功能ok,还有可扩展和优化的地方

对于这样一个涉及多个功能的多人订餐系统,我们可以分步骤地来讨论其核心功能,比如用户管理、店铺与菜单管理以及订单处理等。下面是基于你所描述的需求的一个简化示例。

用户模块

首先,我们需要创建用户登录和注册的功能。这部分可以利用express框架结合mongoose库来实现。

const express = require('express');
const mongoose = require('mongoose');

// 连接到MongoDB数据库
mongoose.connect('mongodb://localhost/canku', { useNewUrlParser: true, useUnifiedTopology: true });

// 定义用户模型
const UserSchema = new mongoose.Schema({
    username: String,
    password: String
});

const User = mongoose.model('User', UserSchema);

// 创建Express应用
const app = express();

app.use(express.json());

// 注册新用户
app.post('/register', async (req, res) => {
    const { username, password } = req.body;
    try {
        const newUser = new User({ username, password });
        await newUser.save();
        res.send('注册成功');
    } catch (err) {
        res.status(400).send(err.message);
    }
});

// 登录验证
app.post('/login', async (req, res) => {
    const { username, password } = req.body;
    try {
        const user = await User.findOne({ username, password });
        if (user) {
            res.send('登录成功');
        } else {
            res.status(401).send('用户名或密码错误');
        }
    } catch (err) {
        res.status(400).send(err.message);
    }
});

店铺和菜单管理

接下来,我们创建API来处理店铺和菜单的CRUD操作,并允许设置特定送餐日和菜单分类。

// 定义店铺模型
const ShopSchema = new mongoose.Schema({
    name: String,
    menus: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Menu' }]
});

const MenuSchema = new mongoose.Schema({
    name: String,
    category: String,
    deliveryDays: [String],
    shop: { type: mongoose.Schema.Types.ObjectId, ref: 'Shop' }
});

const Shop = mongoose.model('Shop', ShopSchema);
const Menu = mongoose.model('Menu', MenuSchema);

// 示例API:添加新菜单
app.post('/shops/:shopId/menus', async (req, res) => {
    const { shopId } = req.params;
    const { name, category, deliveryDays } = req.body;
    try {
        const newMenu = new Menu({ name, category, deliveryDays, shop: shopId });
        await newMenu.save();
        await Shop.findByIdAndUpdate(shopId, { $push: { menus: newMenu._id } });
        res.send(newMenu);
    } catch (err) {
        res.status(400).send(err.message);
    }
});

订单和运气值

为了计算当天的运气值并确定打电话的人选,可以在订单保存后运行一个函数来更新相关统计数据。

// 定义订单模型
const OrderSchema = new mongoose.Schema({
    userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
    shopId: { type: mongoose.Schema.Types.ObjectId, ref: 'Shop' },
    menuId: { type: mongoose.Schema.Types.ObjectId, ref: 'Menu' },
    luckValue: Number // 使用随机数生成器设置运气值
});

const Order = mongoose.model('Order', OrderSchema);

// 创建新订单
app.post('/orders', async (req, res) => {
    const { userId, shopId, menuId } = req.body;
    try {
        const newOrder = new Order({ userId, shopId, menuId, luckValue: Math.floor(Math.random() * 100) });
        await newOrder.save();
        // 更新运气值排名等逻辑...
        res.send(newOrder);
    } catch (err) {
        res.status(400).send(err.message);
    }
});

以上只是该系统的基本结构和部分功能的简单示例。实际开发中还需要考虑更多的细节,如权限控制、安全性增强、性能优化等。

回到顶部