Confluence与PostgreSQL整合及用户输入写入DB的技术求助(REST API优先)
解决思路:Confluence前端表单数据写入PostgreSQL(基于现有空间数据源)
针对你已通过空间数据源+SQL宏实现数据读取,但无法写入的问题,以下是几种无需大幅改动Confluence后端的可行方案,按推荐优先级排序:
1. 自定义用户宏(User Macro)+ 前端JS(推荐,复用现有空间数据源)
利用Confluence的用户宏能力,结合前端JS处理表单提交,直接调用已配置的空间数据源执行写入操作,完全复用现有数据库连接,无需额外后端改动。
实现步骤:
步骤1:创建用户宏
在Confluence空间的「宏管理」中新建用户宏,设置宏类型为「渲染HTML」,允许使用JavaScript,然后填入以下模板代码(根据你的表结构调整):
## User Macro: SubmitToDatabase ## 宏描述:接收前端表单数据,写入PostgreSQL #set($formId = "db-submit-form") #set($macroActionUrl = "$actionContext/macros/execute?macroId=submit-to-database") <!-- 前端表单 --> <form id="$formId"> <label>用户名:</label> <input type="text" name="username" required placeholder="请输入用户名"> <br> <button type="button" onclick="handleSubmit()">提交数据</button> </form> <!-- 提交逻辑JS --> <script> function handleSubmit() { const form = document.getElementById("$formId"); const formData = new FormData(form); fetch("$macroActionUrl", { method: "POST", body: formData }) .then(res => res.text()) .then(result => { alert(result); form.reset(); }) .catch(err => console.error("提交失败:", err)); } </script> <!-- 后端处理POST请求 --> #if($request.method == "POST") #set($username = $esc.xml($request.getParameter("username"))) <!-- 转义避免SQL注入 --> #if($username) #set($sql = "INSERT INTO your_table(username) VALUES ('$username')") #set($affectedRows = $spaceDataSource.executeUpdate($sql)) <!-- 调用空间数据源执行写入 --> #if($affectedRows > 0) 数据写入成功! #else 写入失败,请检查数据源权限或SQL语句 #end #else 请填写必填字段 #end #end
步骤2:配置注意事项
- 确保空间数据源的数据库账号拥有INSERT/UPDATE权限;
- 必须用
$esc.xml()转义用户输入,避免SQL注入风险; - 宏创建后,直接在Confluence页面插入该宏即可使用。
2. 第三方表单+数据库集成宏插件
如果不想写代码,可以直接在Atlassian Marketplace搜索支持「表单提交+数据库写入」的宏插件(如Form Builder for Confluence、Database Forms & Reports),这类插件:
- 可直接关联你已配置的空间数据源;
- 通过拖拽配置表单字段与数据库表字段的映射;
- 无需编写任何代码,直接在页面配置提交动作即可实现写入。
3. 轻量中间层服务(完全不改动Confluence后端)
如果上述方案受限,可以搭建一个极简的中间层服务(如Python Flask/Java Spring Boot小服务),负责接收Confluence前端的AJAX请求,执行数据库写入操作。
示例(Python Flask):
from flask import Flask, request import psycopg2 app = Flask(__name__) @app.route('/submit-to-db', methods=['POST']) def submit_data(): username = request.form.get('username') if not username: return "请输入用户名", 400 try: # 连接PostgreSQL(替换为你的数据库信息) conn = psycopg2.connect( dbname="your_db", user="your_user", password="your_pass", host="your_db_host" ) cur = conn.cursor() # 参数化查询避免SQL注入 cur.execute("INSERT INTO your_table(username) VALUES (%s)", (username,)) conn.commit() cur.close() conn.close() return "数据写入成功" except Exception as e: return f"写入失败:{str(e)}", 500 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
然后在Confluence页面添加前端代码,调用该中间层API:
<form id="db-form"> <input type="text" name="username" placeholder="用户名"> <button type="button" onclick="sendData()">提交</button> </form> <script> function sendData() { const formData = new FormData(document.getElementById('db-form')); fetch('http://your-middle-server:5000/submit-to-db', { method: 'POST', body: formData }) .then(res => res.text()) .then(msg => alert(msg)); } </script>
内容的提问来源于stack exchange,提问作者tonyStark
相关产品推荐
相关产品推荐

