当前位置: 首页 > 软件库 > 云计算 > >

sinn-server

授权协议 Readme
开发语言 Java
所属分类 云计算
软件类型 开源软件
地区 不详
投 递 者 酆鸿哲
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

sinn-server

sinn-serversinn的后端实现,支持async/await,docker一键部署,Resful风格API,支持阿里云oss和七牛云存储,自带管理后台。

如果觉得可以,右上角点颗星星噢~

也欢迎来我的社区蹦迪:探知社区

主要技术栈

nodejs, koa2, mongoose, docker, es6, async/await,  Resful API

HOW TO USE?

一,node版本要求

  • node版本7.x,推荐使用最新版本

  • 使用koa2,默认支持async/await,7.x以上node版本

二,项目配置

  • 前提: 确定本地已安装和启动mongodb,并可正常访问 (配置远程数据库可忽略)

  • 数据库配置: 在/config/common.js中配置你的数据库信息,分development/production,默认mongodb://localhost:27017/sinn

# 默认配置 
mongo: {
    uri: 'mongodb://localhost:27017/sinn'
 }    
   

# 连接远程数据库示例
   
mongo: {
    uri: 'mongodb://10.0.10.10:27017/sinn'
 }      
    
# 带验证数据库连接示例
   
mongo: {
    uri: 'mongodb://用户名:密码@10.0.10.10:27017/sinn'
 }      
  • 端口号port: 在/config/common.js中配置你的port,默认8080端口

  • 管理后台默认账户配置: 在/config/admin.js中配置你的管理员账户,用于管理后台登录

    # 默认账户   
    {
       name: 'sinn',
       password: md5('admin')  // md5用于加密,登录时输入admin即可
    }
    

三,启动

  • 首先拉代码
git clone git@github.com:sessionboy/sinn-server.git
  • 安装依赖
npm install

或者使用淘宝镜像(推荐)

npm install --registry=https://registry.npm.taobao.org
  • 开发环境启动
npm run dev
  • 生产环境启动
npm start
  • 浏览器打开
http://localhost:8080
  • 管理后台可用你在/config/admin.js配置的账号登录,登录后可在用户管理中添加新管理账户
  • 前端上传功能需要先配置好sdk,在/config/common.js中配置,默认采用阿里云oss
  • 如果你使用七牛云,请先配置好七牛云的sdk,并在/rest/routes/frontend.js修改上传接口的中间件为七牛中间件,如下:
 ……
 post('/api/article/create_upload', upload.qiniu, ArticleController.create_upload)
 ……
 post('/api/user/put_avatar', upload.qiniu, UserController.put_avatar)
 ……

三,项目结构

  • 入口文件: app.js

  • 项目配置文件: /config/*

  • 静态资源目录: /public/*

  • 管理后台视图 : /views/*

  • rest api : /rest/*

  • 工具库 : /rest/utils/*

  • 接口router配置 : /rest/routes/*

  • schema/数据库 : /rest/models/*

  • 接口逻辑层 : /rest/controllers/*

  • 公共中间件 : /rest/middlewares/*

提示:在rest中,frontend是为前端sinn准备的API, 而backend则是为sinn-server管理后台准备的API

统一处理响应请求 (成功/失败)

为了方便统一处理,封装了统一响应中间件response.js
响应中间件规定了数据响应格式,是与前台约定的规则
具体请看/rest/middlewares/response.js 的注释详解

# 返回错误
调用 ctx.error({
       msg: '响应的错误提示',
       status: '自定义错误码,默认为400',
       data: '响应错误时可返回的数据',
       error: '响应的具体错误信息'
     })      
   
# 返回成功    
调用 ctx.success({
    msg: '响应的成功提示',
    data: '响应的数据',
  })

统一错误处理

错误分两种,一种是api的错误,另一种则是内部错误 ,api错误需要手动处理, 内部错误则使用try/catch捕获

一,api错误

api错误很常见,可分场景,类型也很多种,对于api错误,可在代码逻辑中使用ctx.error()方法作响应处理 , 示例:

  async login(){
   
    const { username, password } = ctx.request.body; 

    if( !username || !password ) return ctx.error({ msg: '信息填写错误!', status: 403 })     
    
    ……

  }

二, 内部错误

  • 所谓内部错误,即由node内部throw机制抛出的异常错误,比如500错误。

  • 对于这类错误,则需要使用try/catch来捕获,但如果每个接口逻辑中都try/catch一遍,那是极其繁琐的,也不雅观。为此可以封装一个try/catch中间件,用于捕获这类异常,并对客户端作出响应

  • try/catch中间件: /rest/middlewares/filter.js

该中间件使用了tracer处理错误日志,你并不需要做什么

如果你需要自定义拓展,比如改用log4js处理错误日志,可自行修改

文件上传 ( 支持阿里云oss / 七牛云 )

本人使用阿里云服务器,于是使用阿里云oss作为cdn存储空间

鉴于很多人习惯使用七牛云,于是多封装了个七牛云上传中间件(个人推荐强大的阿里云)

一,阿里云oss上传

  • 信息配置:/config/common.js 示例:
// 图片上传到阿里云oss
alioss: { 
       region: 'oss-cn-shenzhen',     // 仅做参考
  
       accessKeyId: 'ALALsdfSLdfgSD',     // 仅做参考

       accessKeySecret: '5jWRVV8DVFDV8D67F6D6G76G7F6GD764',     // 仅做参考

       bucket: 'sinn',    // 空间名, 仅做参考

       folder: 'images/'  // 上传到空间下指定文件夹,需要提前创建。不填则会上传到空间根目录下。

 }
  • sdk封装: /rest/utils/alioss.js (已封装好,你不需要做修改)

  • ali-oss上传中间件: /rest/middlewares/upload.js —— alioss

  • 中间件使用:只需要在定义接口时加入alioss中间件即可。该上传中间件会返回两个字段

    url: 文件上传成功后返回的可访问该文件的url

    id: 登录用户的id ( 前端调用上传接口时需要提供用户id字段 )

中间件会把这两个字段用upload对象 { url, id } 挂载在ctx传递给下个中间件,具体实现:

 ……
   ctx.upload = { url , id }  // 上传结果挂载在ctx,传递给下个中间件  
 ……

因此,你可以在API逻辑层中直接获取到上传结果 ,上传的逻辑已经由中间件处理完成

示例:

 import upload from '../middlewares/upload'; // 引入上传中间件

 const router = require('koa-router')();

 router.post('/api/upload',upload.alioss, async (ctx)=>{
    
   const { url, id } = ctx.upload;   // 可直接在ctx获取到上传结果upload对象
   
   ……
})    
   

二,七牛云上传中间件

  • 信息配置: /config/common.js (和阿里云oss不同的是七牛不支持在空间下自定义文件夹,因此不需要配置folder)

  • sdk封装: /rest/utils/qiniu.js (已封装好,你不需要做修改)

  • qiniu上传中间件: /rest/middlewares/upload.js —— qiniu

    qiniu中间件的用法和alioss中间件用法相同,不同在于它们调用的sdk不同

项目部署

  • server端使用docker进行部署,如果你不了解docker,可先自行学习一番,相信用过之后你会着迷

  • 当然你也可以不使用docker部署,完全可以手工搭建各种环境来实现部署,具体看个人情况

  • 个人推荐使用docker

一, docker 脚本

本开源项目提供四个docker脚本(仅供参考), 分别是build.sh, push.sh , release.sh, Dockerfile

# node基础镜像可根据自身需要来调整,你可以采用你自己的
# 默认采用我仓库的node镜像(docker官方node镜像,node版本7.5),你可以直接使用   

* Dockerfile  镜像构建配置脚本 
    
* build.sh   构建项目镜像   
   
* push.sh  推送项目镜像     
   
* release.sh   启动项目镜像 (跑项目)

请根据你自己的服务器配置,对以上脚本做相应的配置更改

二, 一键部署——update-release.sh (仅供参考)

  • 这个脚本使用rsync实现代码同步,并执行上面四个脚本,最终实现一键部署

  • 需要根据自己的使用环境作相应的更改

  • 选择 SQL Server 的一个版本: 1) Evaluation (免费,无生产许可,180 天限制) 2) Developer (免费,无生产许可) 3) Express (免费) 4) Web (付费版) 5) Standard (付费版) 6) Enterprise (付费版) 7) Enterprise Core (付费版) 8) 我通过零售渠道购买了许可证并具有要输入的产品密钥。 为

  •                                        Citrix 服务器虚拟化之一  网络部署Xenserver 6.2     思杰的XenServer®是完整的服务器虚拟化平台。 XenServer软件包中包含所有你需要创建和管理部署的虚拟x86计算机上运行的Xen,开放源码,准虚拟化的虚拟机管理程序与近乎完美的性能。 XenServer是对Windows和Linux

 相关资料
  • 简介 sinn是一个基于react+koa2+docker技术栈开发的,从零开始构建的个人开源项目。 目标是打造一个小型社区,目前是一个雏形。 测试demo: http://test.boyagirl.com 测试体验账号—用户: sinn 密码:123456 已上线地址:http://sinn.boyagirl.com ( 开源重点在于技术分享和交流,如果觉得可以,右上角点颗星星喔~ ) 也欢迎

  • 问题内容: 我想将 DataDable 传递给 存储过程作为 以下各列的 参数 : 现在,我想在存储过程中使用此数据表,并要在其上声明一个游标。然后使用该光标将值顺序插入数据库表中。 请告诉我如何在存储过程中 声明datatable参数* ,然后在该 参数 上使用 游标 ? * 问题答案: 首先,您需要创建一个类型: 现在,您的存储过程可以将其声明为只读输入参数: 我不确定为什么要在这里使用游标,

  • 问题内容: 好的,问题是需要在2个表上进行合并或联接。一个文件的内容存储为[image]类型或varbinary(max),另一个文件的内容存储为十六进制字符串。如果我将相同的内容上传到两个表中 内容为字符串(从bytearray到字符串)看起来像这样… 图像的内容看起来像(这最终就是我想要的样子) 如果我选择我得到 看起来转换似乎已达到目标,但在每个之间放置了两个零(00),由于缺少更好的字词,

  • 问题内容: 我的SQL Reporting Services报表有问题。我为报表标题使用了自定义字体,并且在部署到服务器时,当我打印或导出为PDF /TIFF时,它无法正确呈现。我已经在服务器上安装了字体。为了使用自定义字体,我还有什么需要做的吗? 在浏览器中查看字体时,它看起来是正确的-因为所有客户端计算机都安装了字体… 感谢Ryan,您在FAQ上的帖子解决了该问题。在服务器上安装字体可以解决打

  • 问题内容: 我正在尝试使用try-catch捕获SQL查询(而不是存储过程)中的错误。 由于某种原因,这无法处理我的错误,但我仍然得到: 消息213,级别16,状态1,第29行列名或提供的值数与表定义不匹配。 有什么帮助吗? 问题答案: 您有一个编译时错误,无法在try-catch中捕获。 BooksOnline: 编译和语句级重新编译错误 如果错误在与TRY-ATCH构造相同的执行级别中发生,则

  • 问题内容: 我需要在数据库中填充纬度和经度列,但是原始信息存储为单个字符串 例如。 我猜想TRIM命令在这里很有用,但是我不知道如何告诉它每半个部分都精确地停在逗号上。 我希望能够提出一个简单的UPDATE查询,如下所示: 但是显然在LTRIM和RTRIM部分中需要做一些额外的工作,因此我只选择数据,但不包括UDFChar1中的逗号。 关于如何实现这一目标的任何想法? 问题答案: 请试试: 和 样