一个form多个sumit按钮

<script type="text/javacript">
function funButton1(){
document.formName.action
="1.htm";
formName.submit();
}
function funButton2(){
document.formName.action
="2.htm";
formName.submit();
}
</script>
<html>
 
<body>
   
<form name="formName" action="#">
      
<input name="button1" id="button1" value="按钮1" onclick="funButton1()"/>
<input name="button2" id="button2" value="按钮2" onclick="funButton2()"/>
    
</form>
  
</body>
</html>

<think>我们正在设计一个Finops系统的时间账单分摊规则管理功能。根据要求,我们需要支持:1.规则的创建:根据账单条件设置账单范围,一个规则对应多个分摊对象(每个分摊对象有分摊占比)。2.规则的查询:-按分摊规则查询:查看一个规则对应的多个分摊对象及分摊占比。-按分摊对象查询:查看该对象被分摊的所有分摊规则及占比。 由于输出要求为HTML,我们将构建一个简单的Web界面。这里我们使用Python的Flask框架来实现后端,前端使用HTML和Jinja2模板。 ###设计思路1.**数据模型**:-规则(Rule):包含规则ID、规则名称、账单条件等。-分摊对象(CostObject):包含对象ID、对象名称等。-规则与分摊对象的关联(RuleAllocation):包含规则ID、对象ID、分摊占比。2.**功能**:-创建规则:表单输入规则信息,同时可以添加多个分摊对象及其占比。-查询规则:a.按规则查询:输入规则ID或名称,显示该规则下的所有分摊对象及占比。b.按分摊对象查询:输入对象ID或名称,显示该对象参与的所有规则及在该规则中的占比。###实现步骤####1.创建Flask应用安装Flask和SQLAlchemy(如果使用数据库):```bashpipinstall flaskflask-sqlalchemy``` ####2.定义数据模型我们使用SQLite数据库和SQLAlchemyORM。 ####3.创建路由和视图函数-首页:包含创建规则和查询的入口。 -创建规则页面:表单用于输入规则信息和分摊对象。 -按规则查询页面:输入规则信息,展示结果。 -按分摊对象查询页面:输入对象信息,展示结果。####4.HTML模板使用Jinja2模板生成HTML页面。 ###代码实现####文件结构``` finops_app/app.pytemplates/index.htmlcreate_rule.htmlquery_rule.htmlquery_object.htmlrule_detail.htmlobject_detail.html```#### app.py代码```pythonfromflask importFlask,render_template, request, redirect, url_forfrom flask_sqlalchemyimport SQLAlchemyapp= Flask(__name__)app.config['SQLALCHEMY_DATABASE_URI'] ='sqlite:///finops.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS']= Falsedb= SQLAlchemy(app)#数据模型定义classRule(db.Model):id= db.Column(db.Integer,primary_key=True)name= db.Column(db.String(100),nullable=False)condition =db.Column(db.String(255), nullable=False)class CostObject(db.Model):id= db.Column(db.Integer,primary_key=True)name= db.Column(db.String(100),nullable=False) classRuleAllocation(db.Model):id= db.Column(db.Integer,primary_key=True)rule_id =db.Column(db.Integer, db.ForeignKey('rule.id'), nullable=False)object_id =db.Column(db.Integer, db.ForeignKey('cost_object.id'),nullable=False)percentage =db.Column(db.Float,nullable=False)#分摊占比,0-100之间的数rule =db.relationship('Rule',backref='allocations')cost_object= db.relationship('CostObject',backref='allocations')#创建数据库表withapp.app_context():db.create_all() @app.route('/') defindex():returnrender_template('index.html')@app.route('/create_rule', methods=['GET', 'POST'])def create_rule():if request.method =='POST':#获取表单数据rule_name =request.form['rule_name']condition= request.form['condition']#获取分摊对象信息,假设表单中对象名和占比的字段名为object_name和percentage,多个则用相同的name属性object_names= request.form.getlist('object_name')percentages =request.form.getlist('percentage')#创建规则new_rule =Rule(name=rule_name,condition=condition)db.session.add(new_rule)db.session.commit()#为每个分摊对象创建关联for iinrange(len(object_names)):obj_name= object_names[i]percentage =float(percentages[i])#查找或创建分摊对象cost_object= CostObject.query.filter_by(name=obj_name).first()if notcost_object:cost_object= CostObject(name=obj_name)db.session.add(cost_object)db.session.commit()#创建关联allocation =RuleAllocation(rule_id=new_rule.id, object_id=cost_object.id,percentage=percentage)db.session.add(allocation)db.session.commit()returnredirect(url_for('index'))returnrender_template('create_rule.html')@app.route('/query_rule', methods=['GET', 'POST'])def query_rule():if request.method =='POST':rule_name= request.form['rule_name']rule =Rule.query.filter_by(name=rule_name).first()if rule:#获取该规则的所有分摊对象及占比allocations= RuleAllocation.query.filter_by(rule_id=rule.id).all()returnrender_template('rule_detail.html', rule=rule, allocations=allocations)else:return render_template('query_rule.html', error="Rule notfound")returnrender_template('query_rule.html')@app.route('/query_object',methods=['GET','POST']) defquery_object():if request.method =='POST':object_name= request.form['object_name']cost_object= CostObject.query.filter_by(name=object_name).first()if cost_object:#获取该对象的所有分摊规则及占比allocations =RuleAllocation.query.filter_by(object_id=cost_object.id).all()returnrender_template('object_detail.html', cost_object=cost_object, allocations=allocations)else:return render_template('query_object.html',error="Costobject notfound")returnrender_template('query_object.html') if__name__ =='__main__':app.run(debug=True)``` ####模板文件1. **index.html**(首页) ```html<!DOCTYPEhtml><html><head><title>Finops-TimeBilling Allocation</title> </head><body><h1>Finops TimeBillingAllocation</h1><ul><li><ahref="{{url_for('create_rule') }}">CreateRule</a></li><li><a href="{{ url_for('query_rule')}}">Query byRule</a></li><li><a href="{{ url_for('query_object') }}">Queryby CostObject</a></li></ul></body> </html>``` 2. **create_rule.html** (创建规则)```html<!DOCTYPE html> <html> <head><title>CreateRule</title></head> <body><h1>Create AllocationRule</h1><formmethod="POST"><label>Rule Name:</label><inputtype="text"name="rule_name" required><br><label>Condition:</label><inputtype="text"name="condition"required><br><h3>CostObjects</h3><divid="objects"><div><label>ObjectName:</label><input type="text" name="object_name"required><label>Percentage:</label><input type="number" step="0.01" name="percentage" required></div></div><buttontype="button"onclick="addObject()">Add AnotherObject</button><br><input type="submit" value="CreateRule"></form><script>functionaddObject() {constdiv =document.createElement('div');div.innerHTML= `<label>Object Name:</label><inputtype="text"name="object_name" required><label>Percentage:</label><inputtype="number"step="0.01"name="percentage"required>`;document.getElementById('objects').appendChild(div);}</script></body> </html>``` 3. **query_rule.html** (按规则查询)```html<!DOCTYPE html> <html> <head><title>Queryby Rule</title> </head><body><h1>Queryby Rule</h1><form method="POST"><label>RuleName:</label><input type="text" name="rule_name"required><input type="submit" value="Query"></form>{% iferror %}<p style="color:red;">{{error }}</p>{%endif %}</body> </html>``` 4. **query_object.html**(按分摊对象查询)```html<!DOCTYPE html> <html> <head><title>Queryby CostObject</title></head> <body><h1>Query byCost Object</h1><form method="POST"><label>CostObject Name:</label><inputtype="text"name="object_name" required><inputtype="submit"value="Query"></form>{%if error%}<pstyle="color:red;">{{ error}}</p>{% endif%} </body></html> ```5.**rule_detail.html** (规则详情) ```html<!DOCTYPEhtml><html><head><title>Rule Detail</title> </head><body><h1>Rule: {{rule.name}}</h1><p>Condition:{{ rule.condition}}</p><h2>Allocations</h2><table border="1"><tr><th>CostObject</th><th>Percentage</th></tr>{%for allocationin allocations%}<tr><td>{{ allocation.cost_object.name}}</td><td>{{ allocation.percentage}}%</td></tr>{% endfor %}</table><a href="{{ url_for('index')}}">Back toHome</a></body> </html>``` 6. **object_detail.html**(分摊对象详情) ```html<!DOCTYPEhtml><html><head><title>Cost ObjectDetail</title></head> <body><h1>Cost Object: {{cost_object.name }}</h1><h2>Allocations</h2><table border="1"><tr><th>Rule</th><th>Percentage</th></tr>{% forallocation inallocations %}<tr><td>{{allocation.rule.name}}</td><td>{{ allocation.percentage}}%</td></tr>{% endfor %}</table><a href="{{ url_for('index')}}">Back toHome</a></body> </html>``` ###解释1. **数据模型**:- `Rule`:存储规则的基本信息(ID、名称、条件)。- `CostObject`:存储分摊对象(如部门、项目)的基本信息(ID、名称)。-`RuleAllocation`:关联规则和分摊对象,并记录分摊占比(百分比)。 2. **路由**:- `/create_rule`:处理创建规则的GET和POST请求。GET请求返回表单,POST请求处理表单数据,创建规则和分摊对象关联。- `/query_rule`:按规则查询,返回规则详情页面(包含该规则的所有分摊对象及占比)。- `/query_object`:按分摊对象查询,返回对象详情页面(包含该对象参与的所有规则及占比)。3.**模板**:-使用Jinja2模板渲染HTML页面。-在创建规则的表单中,使用JavaScript动态添加分摊对象输入框。-详情页面使用表格展示分摊关系。 ###注意事项-分摊占比的总和应该为100%,但在这个简单实现中,我们并没有在表单提交时进行校验。在实际应用中,应该添加校验逻辑。 -数据库操作没有处理异常,实际应用中需要添加。-分摊对象名称在系统中应该是唯一的,这里通过先查询再创建的方式避免重复。###运行运行`app.py`,访问`http://localhost:5000`即可使用。###相关问题§§相关问题§§:1.如何确保分摊规则中分摊占比的总和为100%? 2.如果账单条件非常复杂(比如多条件组合),应该如何设计规则条件字段? 3.如何扩展这个系统以支持历史规则版本管理? 4.如何优化分摊对象查询,使得同一个对象在不同规则中的分摊占比可以一目了然?</think>### Finops系统时间账单分摊规则管理功能实现 下面是一个完整的Finops系统时间账单分摊规则管理功能的实现方案,使用Python Flask框架和SQLite数据库,并输出HTML页面。 #### 解决方案设计思路: 1. 使用SQLite数据库存储规则、分摊对象和关联关系 2. 实现规则创建功能(支持多分摊对象) 3. 实现两种查询方式: - 按规则查询:显示规则及关联的分摊对象 - 按分摊对象查询:显示对象及关联的规则 4. 使用Bootstrap进行前端美化 #### 完整代码实现: ```python # app.py from flask import Flask, render_template, request, redirect, url_for from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///finops.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) # 数据模型定义 class Rule(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False) condition = db.Column(db.String(255), nullable=False) class CostObject(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False) class RuleAllocation(db.Model): id = db.Column(db.Integer, primary_key=True) rule_id = db.Column(db.Integer, db.ForeignKey('rule.id'), nullable=False) object_id = db.Column(db.Integer, db.ForeignKey('cost_object.id'), nullable=False) percentage = db.Column(db.Float, nullable=False) # 分摊占比 # 创建数据库表 with app.app_context(): db.create_all() @app.route('/') def index(): return render_template('index.html') @app.route('/create_rule', methods=['GET', 'POST']) def create_rule(): if request.method == 'POST': # 创建规则 rule_name = request.form['rule_name'] condition = request.form['condition'] new_rule = Rule(name=rule_name, condition=condition) db.session.add(new_rule) db.session.commit() # 添加分摊对象 object_names = request.form.getlist('object_name') percentages = request.form.getlist('percentage') for i in range(len(object_names)): obj_name = object_names[i] percentage = float(percentages[i]) # 查找或创建分摊对象 cost_object = CostObject.query.filter_by(name=obj_name).first() if not cost_object: cost_object = CostObject(name=obj_name) db.session.add(cost_object) db.session.commit() # 创建关联 allocation = RuleAllocation( rule_id=new_rule.id, object_id=cost_object.id, percentage=percentage ) db.session.add(allocation) db.session.commit() return redirect(url_for('index')) return render_template('create_rule.html') @app.route('/query_rule') def query_rule(): rule_id = request.args.get('rule_id') if rule_id: rule = Rule.query.get(rule_id) allocations = RuleAllocation.query.filter_by(rule_id=rule_id).all() return render_template('rule_detail.html', rule=rule, allocations=allocations) else: rules = Rule.query.all() return render_template('query_rule.html', rules=rules) @app.route('/query_object') def query_object(): object_id = request.args.get('object_id') if object_id: cost_object = CostObject.query.get(object_id) allocations = RuleAllocation.query.filter_by(object_id=object_id).all() return render_template('object_detail.html', cost_object=cost_object, allocations=allocations) else: objects = CostObject.query.all() return render_template('query_object.html', objects=objects) if __name__ == '__main__': app.run(debug=True) ``` ```html <!-- templates/index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Finops - 时间账单分摊规则管理</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container mt-5"> <h1 class="mb-4">时间账单分摊规则管理系统</h1> <div class="card"> <div class="card-body"> <h2 class="card-title">功能导航</h2> <div class="d-grid gap-3"> <a href="/create_rule" class="btn btn-primary btn-lg">创建分摊规则</a> <a href="/query_rule" class="btn btn-info btn-lg">按规则查询</a> <a href="/query_object" class="btn btn-success btn-lg">按分摊对象查询</a> </div> </div> </div> </div> </body> </html> ``` ```html <!-- templates/create_rule.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>创建分摊规则</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container mt-5"> <h1 class="mb-4">创建分摊规则</h1> <form method="POST"> <div class="mb-3"> <label class="form-label">规则名称</label> <input type="text" class="form-control" name="rule_name" required> </div> <div class="mb-3"> <label class="form-label">账单条件</label> <input type="text" class="form-control" name="condition" required> <div class="form-text">例如:部门=IT AND 项目类型=内部</div> </div> <h3 class="mt-4">分摊对象</h3> <div id="objects-container"> <div class="row mb-2 object-row"> <div class="col-md-6"> <input type="text" class="form-control" name="object_name" placeholder="对象名称" required> </div> <div class="col-md-4"> <input type="number" step="0.01" min="0" max="100" class="form-control" name="percentage" placeholder="占比(%)" required> </div> <div class="col-md-2"> <button type="button" class="btn btn-danger remove-btn">删除</button> </div> </div> </div> <button type="button" id="add-object" class="btn btn-secondary mt-2">添加分摊对象</button> <button type="submit" class="btn btn-primary mt-3">创建规则</button> </form> </div> <script> document.getElementById('add-object').addEventListener('click', function() { const container = document.getElementById('objects-container'); const newRow = document.createElement('div'); newRow.className = 'row mb-2 object-row'; newRow.innerHTML = ` <div class="col-md-6"> <input type="text" class="form-control" name="object_name" placeholder="对象名称" required> </div> <div class="col-md-4"> <input type="number" step="0.01" min="0" max="100" class="form-control" name="percentage" placeholder="占比(%)" required> </div> <div class="col-md-2"> <button type="button" class="btn btn-danger remove-btn">删除</button> </div> `; container.appendChild(newRow); // 添加删除事件 newRow.querySelector('.remove-btn').addEventListener('click', function() { container.removeChild(newRow); }); }); // 初始化删除按钮事件 document.querySelectorAll('.remove-btn').forEach(btn => { btn.addEventListener('click', function() { this.closest('.object-row').remove(); }); }); </script> </body> </html> ``` ```html <!-- templates/query_rule.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>按规则查询</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container mt-5"> <h1 class="mb-4">按规则查询</h1> <div class="card mb-4"> <div class="card-body"> <h2 class="card-title">规则列表</h2> <table class="table table-striped"> <thead> <tr> <th>ID</th> <th>规则名称</th> <th>账单条件</th> <th>操作</th> </tr> </thead> <tbody> {% for rule in rules %} <tr> <td>{{ rule.id }}</td> <td>{{ rule.name }}</td> <td>{{ rule.condition }}</td> <td> <a href="/query_rule?rule_id={{ rule.id }}" class="btn btn-sm btn-info">查看详情</a> </td> </tr> {% endfor %} </tbody> </table> </div> </div> <a href="/" class="btn btn-secondary">返回首页</a> </div> </body> </html> ``` ```html <!-- templates/rule_detail.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>规则详情</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container mt-5"> <h1 class="mb-4">规则详情</h1> <div class="card mb-4"> <div class="card-body"> <h2 class="card-title">{{ rule.name }}</h2> <p><strong>账单条件:</strong> {{ rule.condition }}</p> </div> </div> <div class="card"> <div class="card-body"> <h3 class="card-title">分摊对象</h3> <table class="table table-striped"> <thead> <tr> <th>对象名称</th> <th>分摊占比</th> </tr> </thead> <tbody> {% for alloc in allocations %} <tr> <td>{{ alloc.cost_object.name }}</td> <td>{{ alloc.percentage }}%</td> </tr> {% endfor %} </tbody> </table> <div class="mt-3"> <strong>总占比:</strong> {{ allocations|sum(attribute='percentage') }}% </div> </div> </div> <a href="/query_rule" class="btn btn-secondary mt-3">返回规则列表</a> </div> </body> </html> ``` ```html <!-- templates/query_object.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>按分摊对象查询</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container mt-5"> <h1 class="mb-4">按分摊对象查询</h1> <div class="card mb-4"> <div class="card-body"> <h2 class="card-title">分摊对象列表</h2> <table class="table table-striped"> <thead> <tr> <th>ID</th> <th>对象名称</th> <th>操作</th> </tr> </thead> <tbody> {% for obj in objects %} <tr> <td>{{ obj.id }}</td> <td>{{ obj.name }}</td> <td> <a href="/query_object?object_id={{ obj.id }}" class="btn btn-sm btn-info">查看详情</a> </td> </tr> {% endfor %} </tbody> </table> </div> </div> <a href="/" class="btn btn-secondary">返回首页</a> </div> </body> </html> ``` ```html <!-- templates/object_detail.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>对象详情</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container mt-5"> <h1 class="mb-4">分摊对象详情</h1> <div class="card mb-4"> <div class="card-body"> <h2 class="card-title">{{ cost_object.name }}</h2> </div> </div> <div class="card"> <div class="card-body"> <h3 class="card-title">关联规则</h3> <table class="table table-striped"> <thead> <tr> <th>规则名称</th> <th>账单条件</th> <th>分摊占比</th> </tr> </thead> <tbody> {% for alloc in allocations %} <tr> <td>{{ alloc.rule.name }}</td> <td>{{ alloc.rule.condition }}</td> <td>{{ alloc.percentage }}%</td> </tr> {% endfor %} </tbody> </table> <div class="mt-3"> <strong>总分摊占比:</strong> {{ allocations|sum(attribute='percentage') }}% </div> </div> </div> <a href="/query_object" class="btn btn-secondary mt-3">返回对象列表</a> </div> </body> </html> ``` ### 代码解释: 1. **数据模型设计**: - `Rule`:存储分摊规则的基本信息(ID、名称、账单条件) - `CostObject`:存储分摊对象(如部门、项目等) - `RuleAllocation`:关联规则和分摊对象,记录分摊占比 2. **核心功能实现**: - **规则创建**: - 用户输入规则名称和账单条件 - 动态添加多个分摊对象及其占比 - 自动创建或查找已有的分摊对象 - 建立规则与对象的关联关系 - **按规则查询**: - 显示所有规则列表 - 查看单个规则详情时,显示关联的所有分摊对象及占比 - 计算并显示总占比 - **按对象查询**: - 显示所有分摊对象列表 - 查看单个对象详情时,显示关联的所有规则及占比 - 计算并显示总分摊占比 3. **前端设计**: - 使用Bootstrap进行响应式设计 - 动态表单:可动态添加/删除分摊对象输入行 - 表格展示:清晰展示规则、对象和关联关系 - 导航清晰:首页提供三大功能的快速入口 4. **数据处理**: - 表单验证:确保必填字段和数值范围 - 关联管理:自动处理规则与对象的关联关系 - 占比计算:自动计算并显示总占比 ### 使用说明: 1. **运行应用**: ```bash python app.py ``` 2. **访问应用**: 打开浏览器访问 `http://localhost:5000` 3. **功能流程**: - 创建规则:首页 → "创建分摊规则" → 填写规则信息 → 添加分摊对象 → 提交 - 按规则查询:首页 → "按规则查询" → 选择规则 → 查看详情 - 按对象查询:首页 → "按分摊对象查询" → 选择对象 → 查看详情 ### 系统特点: 1. **灵活的分摊规则管理**: - 支持一个规则关联多个分摊对象 - 每个对象可设置不同的分摊占比 2. **双向查询**: - 规则视角:查看规则下的所有分摊对象 - 对象视角:查看对象参与的所有规则 3. **数据完整性**: - 自动计算总占比,确保数据合理性 - 关联关系自动维护 4. **用户友好界面**: - 简洁的导航和布局 - 动态表单交互 - 清晰的数据展示 这个实现满足了Finops系统时间账单分摊规则管理的所有需求,提供了规则创建和双向查询功能,并通过HTML界面直观展示结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值