钉钉端部署文书档案系统纯干货实操指南
一、前置环境准备
在开始部署之前,你需要准备一台已经安装好CentOS 7或Ubuntu 20.04系统的云服务器。本指南以CentOS 7为例,Node.js版本选用v16.x,Nginx选用1.18+。确保服务器防火墙已开放80、3000、443端口。
登录服务器,执行以下命令安装Node.js和Nginx:
安装Node.js
curl -sL https://rpm.nodesource.com/setup_16.x | bash -
yum install -y nodejs
安装Nginx
yum install -y nginx
启动Nginx并设置开机自启
systemctl start nginx
systemctl enable nginx
二、钉钉开发者后台配置
打开钉钉开放平台:https://open-dev.dingtalk.com/。使用钉钉管理员账号扫码登录。
登录后,进入“应用开发” -> “企业内部开发” -> “H5微应用”。点击“创建应用”,应用类型选择“H5微应用”,应用名称填写“文书档案系统”。
创建成功后,进入应用详情页,在“开发管理”左侧菜单中找到“基本信息与开发配置”。你需要记录以下三个关键信息,后续代码中会直接使用:
- AgentId:应用的唯一标识。
- AppKey:应用的Key。
- AppSecret:应用的密钥。
在“开发管理” -> “H5微应用”配置中,将“首页地址”暂时填写为服务器IP地址,例如:http://你的服务器IP/index.html。注意,此处的IP必须与服务器公网IP一致。
二、后端服务搭建(Node.js)
在服务器上创建项目目录并初始化:
mkdir -p /data/www/archive_system
cd /data/www/archive_system
npm init -y
安装必要的依赖包:
npm install express cors axios body-parser multer --save
创建后端入口文件 server.js,完整代码如下。该代码实现了文件上传、免登验证获取用户信息以及文件列表接口。请将代码中的 YOUR_APPKEY 和 YOUR_APPSECRET 替换为上一步在钉钉后台获取的真实值。

const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');
const multer = require('multer');
const axios = require('axios');
const fs = require('fs');
const path = require('path');
const app = express();
const PORT = 3000;
// 钉钉配置,请替换为真实值
const DINGTALK_CONFIG = {
appKey: 'YOUR_APPKEY',
appSecret: 'YOUR_APPSECRET'
};
// 中间件配置
app.use(cors());
app.use(bodyParser.json());
app.use(express.static(path.join(__dirname, 'public')));
// 配置文件上传存储路径
const upload = multer({ dest: 'uploads/' });
// 获取钉钉AccessToken
async function getAccessToken() {
const url = `https://oapi.dingtalk.com/gettoken?appkey=${DINGTALK_CONFIG.appKey}&appsecret=${DINGTALK_CONFIG.appSecret}`;
const response = await axios.get(url);
if (response.data.errcode !== 0) {
throw new Error('获取AccessToken失败');
}
return response.data.access_token;
}
// 钉钉免登接口:通过authCode获取用户信息
app.post('/api/user/info', async (req, res) => {
const { authCode } = req.body;
try {
const token = await getAccessToken();
// 获取用户UnionId
const userUrl = `https://oapi.dingtalk.com/topapi/v2/user/getuserinfo?access_token=${token}`;
const userRes = await axios.post(userUrl, { auth_code: authCode });
if (userRes.data.errcode !== 0) {
return res.json({ success: false, message: userRes.data.errmsg });
}
const unionid = userRes.data.result.unionid;
// 获取用户详细信息
const detailUrl = `https://oapi.dingtalk.com/topapi/v2/user/get?access_token=${token}`;
const detailRes = await axios.post(detailUrl, { unionid: unionid });
res.json({
success: true,
data: {
name: detailRes.data.result.name,
userid: detailRes.data.result.userid
}
});
} catch (error) {
res.json({ success: false, message: error.message });
}
});
// 文件上传接口
app.post('/api/upload', upload.single('file'), (req, res) => {
if (!req.file) {
return res.status(400).json({ success: false, message: '未上传文件' });
}
// 重命名文件并移动到public目录以便访问
const ext = path.extname(req.file.originalname);
const newFileName = `${Date.now()}${ext}`;
const newPath = path.join(__dirname, 'public', 'files', newFileName);
if (!fs.existsSync(path.join(__dirname, 'public', 'files'))){
fs.mkdirSync(path.join(__dirname, 'public', 'files'));
}
fs.renameSync(req.file.path, newPath);
res.json({ success: true, url: `/files/${newFileName}`, name: req.file.originalname });
});
// 获取文件列表接口(模拟)
app.get('/api/files', (req, res) => {
const dirPath = path.join(__dirname, 'public', 'files');
let files = [];
if (fs.existsSync(dirPath)) {
files = fs.readdirSync(dirPath).map(f => ({
name: f,
url: `/files/${f}`
}));
}
res.json({ success: true, data: files });
});
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
创建必要的目录并启动服务:
mkdir -p /data/www/archive_system/public/files
node /data/www/archive_system/server.js &
三、前端页面开发与免登集成
在 /data/www/archive_system/public 目录下创建 index.html 文件。这是一个包含完整样式、钉钉SDK引入和业务逻辑的单页应用。
文书档案系统
文书档案系统
档案列表
注意: 请将代码中的 你的服务器IP 替换为实际的公网IP地址,并将 你的CorpId 替换为钉钉企业ID(可在钉钉开发者后台首页查看)。
四、Nginx反向代理配置
为了保证访问稳定和端口规范,我们需要配置Nginx作为反向代理。编辑Nginx配置文件:
vi /etc/nginx/conf.d/archive.conf
输入以下完整配置内容:
server {
listen 80;
server_name 你的服务器IP; 或你的域名
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
保存并退出后,检查配置并重启Nginx:
nginx -t
systemctl restart nginx
五、钉钉端发布与验证
回到钉钉开发者后台,在“开发管理” -> “H5微应用”中,将“首页地址”更新为 http://你的服务器IP/index.html。
在左侧菜单找到“版本管理与发布”,点击“创建新版本”。填写版本号(如1.0.0)和更新日志。点击“保存”,然后点击右侧的“发布”。如果是第一次发布,可能需要管理员审核,通常企业内部应用可以直接发布。
发布成功后,打开手机端钉钉,进入“工作台”,找到“文书档案系统”应用。点击进入,系统会自动调用免登接口,页面顶部应显示“欢迎,[你的名字]”。点击“上传档案”按钮,选择一张图片或文档,上传成功后,下方列表会立即显示该文件,点击“下载”即可预览或下载文件。