四、个人项目系统搭建
文章目录
- 一、python写的后端代码
- 二、html代码
- 三、index.css
- 四、js代码
效果图:

一、python写的后端代码
后端代码使用Flask编写,如下所示:
# app.py
from flask import Flask, render_template, request, jsonify, g
import sqlite3
import os
from datetime import datetimeapp = Flask(__name__)# ----------------------------------------------------------------------------
# 默认配置与默认函数
# ----------------------------------------------------------------------------
connection = 'example.db' # 连接数据库@app.route('/')
def index():return render_template('index.html')def get_db():if not hasattr(g, 'db'):g.db = sqlite3.connect(connection)g.db.row_factory = sqlite3.Row # 将查询结果以字典形式返回return g.db
@app.teardown_appcontext
def close_db(error=None):"""请求结束时关闭数据库连接"""if hasattr(g, 'db'):g.db.close()
# 返回当前数据库的最大ID,离线函数
def maxID():conn1 = get_db()cursor = conn1.cursor()try:cursor.execute("SELECT * FROM projectTable")rows = cursor.fetchall()ID = []for row in rows:ID.append(int(row[0]))if ID == []:ID = [0]maxid = max(ID)return maxidexcept Exception as e:return jsonify({"message": "maxID发生错误"}), 500finally:# 确保关闭连接conn1.close()# ----------------------------------------------------------------------------
# 获得当前表中所有的项目名称(去重过的)
# ----------------------------------------------------------------------------
@app.route('/projectNameOptions', methods=['POST'])
def projectNameOptions():conn = get_db()cursor = conn.cursor()# 表格如果不存在就创建print("projectNameOptions正在运行……")cursor.execute("SELECT DISTINCT(projectName) FROM projectTable")rows = cursor.fetchall()results = []for row in rows:results.append(row['projectName'])return jsonify({"projects": results})# ----------------------------------------------------------------------------
# 前端页面默认返回的数据
# ----------------------------------------------------------------------------
@app.route('/default', methods=['POST'])
def default():conn = get_db()cursor = conn.cursor()# 表格如果不存在就创建print("default正在运行……")if os.path.exists('example.db'):print("Database file exists!")else:print("Database file does not exist.")cursor.execute('''CREATE TABLE IF NOT EXISTS projectTable (id INTEGER PRIMARY KEY AUTOINCREMENT,projectName TEXT,submitPersonName TEXT,Process TEXT,StartTime TEXT,EndTime TEXT, neirong TEXT)''')cursor.execute("SELECT * FROM projectTable")rows = cursor.fetchall()results = []for row in rows:results.append({'id': row['id'],'projectName': row['projectName'],'submitPersonName': row['submitPersonName'],'Process': row['Process'],'StartTime': row['StartTime'],'EndTime': row['EndTime'],"neirong" : row['neirong']})print(results)return jsonify(results)# ----------------------------------------------------------------------------
# 根据所给条件(projectname专案名称, personname提交人, projectquery专案进度)查询数据
# ----------------------------------------------------------------------------
@app.route('/searchfor', methods=['POST'])
def searchfor():conn = get_db()cursor = conn.cursor()# 返回的数据data = request.get_json()print("查询条件 = ", data)if data["projectname"] == "":projectquery = "projectName LIKE '%'"else:projectquery = "projectName LIKE '%{}%'".format(data["projectname"])if data["personname"] == "":personNamequery = "submitPersonName LIKE '%'"else:personNamequery = "submitPersonName LIKE '%{}%'".format(data["personname"])Processquery = "Process LIKE '%{}%'".format(data["stateSelectionValue"])print(Processquery)query = "SELECT * FROM projectTable WHERE {} AND {} AND {}".format(projectquery, personNamequery, Processquery)print("searchFor query:", query)cursor.execute(query)rows = cursor.fetchall()results = []for row in rows:results.append({'id': row['id'],'projectName': row['projectName'],'submitPersonName': row['submitPersonName'],'Process': row['Process'],'StartTime': row['StartTime'],'EndTime': row['EndTime'],"neirong" : row['neirong']})print("查询结果:", results)return jsonify(results)# ----------------------------------------------------------------------------
# 保存数据
# ----------------------------------------------------------------------------
@app.route('/saveData', methods=['POST'])
def receive_data():try:conn = get_db()cursor = conn.cursor()data = request.get_json()# 当前更新的时间currenttime = datetime.now()formatted_time = currenttime.strftime("%Y-%m-%d")if data:print("收到的表格数据:", data)# 启动事务for updated_data in data:query = '''UPDATE projectTableSET projectName = ?,neirong = ?,submitPersonName = ?, process = ?, startTime = ?, endTime = ?WHERE id = ?'''cursor.execute(query, (updated_data['projectName'],updated_data['projectNeirong'],updated_data['submitPersonName'],updated_data['process'],updated_data['startTime'],# formatted_time,updated_data['endTime'],updated_data['id']))conn.commit()cursor.execute("SELECT * FROM projectTable")rows = cursor.fetchall()print("查询结果==========================================================")for row in rows:print(f"ID: {row[0]}, Project Name: {row[1]}, Submitter: {row[2]}, Process: {row[3]}, Start Time: {row[4]}, End Time: {row[5]}, Neirong: {row[6]}")print("已更改!")return jsonify({"message": "数据接收成功", "receivedData": data}), 200except Exception as e:# 如果有任何异常,回滚事务conn.rollback()print("发生错误:", e)return jsonify({"message": "处理数据时发生错误"}), 500finally:# 确保关闭连接conn.close()# ----------------------------------------------------------------------------
# 删除指定的一行
# ----------------------------------------------------------------------------
@app.route('/delectable', methods=['POST'])
def delete_data():conn = get_db()cursor = conn.cursor()# 返回数据示例:{'id': 1, 'flag': True}data = request.get_json()if data:print("收到的表格数据:", data)try:if data["flag"]:query = '''DELETE FROM projectTable WHERE id = ?'''# 使用参数化查询cursor.execute(query, (data['id'], ))conn.commit()cursor.execute("SELECT * FROM projectTable")rows = cursor.fetchall()print("查询结果==========================================================")for row in rows:print(f"ID: {row[0]}, Project Name: {row[1]}, Submitter: {row[2]}, Process: {row[3]}, Start Time: {row[4]}, End Time: {row[5]}, Neirong: {row[6]}")print("已删除!")return jsonify({"message": "数据接收成功", "receivedData": data}), 200except Exception as e:# 如果有任何异常,回滚事务conn.rollback()print("发生错误:", e)return jsonify({"message": "处理数据时发生错误"}), 500finally:# 确保关闭连接conn.close()else:return jsonify({"message": "无效的数据"}), 400# ----------------------------------------------------------------------------
# 插入一行
# ----------------------------------------------------------------------------
@app.route('/insertTable', methods=['POST'])
def insert_data():print("insertTable正在运行!")conn = get_db()cursor = conn.cursor()data = request.get_json()print("data = ", data)# 获得当前时间currenttime = datetime.now()formatted_time = currenttime.strftime("%Y-%m-%d")try:cursor.execute("SELECT MAX(id) FROM projectTable")max_id = cursor.fetchone()[0] # 获取查询结果的第一列if max_id is None:max_id = 0 # 如果表中没有记录,则最大ID是0ids = max_id + 1insertData = {'id': ids, 'projectName': '在这里填写专案名称', 'submitPersonName': '','process': '', 'startTime': '2023-11-10', 'endTime': '2023-11-10', 'projectNeirong': '在这里填写专案内容'}insertData["endTime"] = formatted_timeprint(insertData)query = '''INSERT INTO projectTable (projectName, neirong, submitPersonName, process, startTime, endTime, id)VALUES (?, ?, ?, ?, ?, ?, ?)'''cursor.execute(query, (insertData['projectName'],insertData['projectNeirong'],insertData['submitPersonName'],insertData['process'],insertData['startTime'],insertData['endTime'],insertData['id']))conn.commit()cursor.execute("SELECT * FROM projectTable")rows = cursor.fetchall()show_data = []for row in rows:show_data.append({'id': row[0], 'projectName': row[1], 'submitPersonName': row[2],'Process': row[3], 'StartTime': row[4], 'EndTime': row[5],'neirong': row[6]})print("插入操作已执行!")return jsonify({"message": "数据插入成功", "data": show_data})except Exception as e:return jsonify({"message": "处理数据时发生错误"}), 500finally:# 确保关闭连接conn.close()# ----------------------------------------------------------------------------
# 主函数
# ----------------------------------------------------------------------------
if __name__ == '__main__':app.run(debug=True)
二、html代码
<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>专案管理页面</title><link rel="stylesheet" href="{{ url_for('static', filename='index.css') }}"><script src="https://cdn.jsdelivr.net/npm/chart.js"></script><link rel="stylesheet" href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css"><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script><script src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script>
</head>
<div class="header"><h1>专案管理系统</h1><span id="clock"></span>
</div>
<script>function updateClock() {const now = new Date();const hours = String(now.getHours()).padStart(2, '0');const minutes = String(now.getMinutes()).padStart(2, '0');const seconds = String(now.getSeconds()).padStart(2, '0');const currentTime = `${hours}:${minutes}:${seconds}`;document.getElementById('clock').textContent = currentTime;}setInterval(updateClock, 1000);updateClock(); // Initialize the clock immediately
</script><div class="container"><div class="form-container" id="login-form"><form id="projectForm" action="/" method="POST"><!-- 把专案名称更换为 --><label for="projectname">专案名称:</label><select id="projectname" name="projectname"><!-- 选项由JS动态添加 --></select><!-- <label for="projectname">专案名称:</label><input type="text" id="projectname" name="projectname"> --><label for="personname">提交人:</label><input type="text" id="personname" name="personname"><label for="stateSelection">专案状态:</label><select id="stateSelection" name="stateSelection"><option value=""></option><option value="Ongoing">正在进行</option><option value="shunyan">顺延(本周无进度)</option><option value="achieved">已经完成</option></select><button id="addRowBtn" type="button">增加一行</button> <!-- 添加按钮--><button type="submit">查询</button><button type="button" onclick="clearFormat()">清除格式</button> </form></div><div class="assiantFre_container"><table id="projectTable"><thead id="tableHeader"><!-- 动态生成的表头将插入这里 --></thead><tbody id="tableBody"><!-- 动态生成的表格数据将插入这里 --></tbody></table></div><script src="{{ url_for('static', filename='index.js') }}"></script>
</div>
</html>
三、index.css
/* styles.css *//* 基本样式重置 */
* {margin: 0;padding: 0;box-sizing: border-box;
}/* h1 {text-align: center;margin-bottom: 20px;color: #444;
} */.header {display: flex;justify-content: space-between;/* 将内容两端对齐 */align-items: center;/* 垂直居中对齐 */padding: 20px;/* 添加内边距 */background-color: #f8f8f8;/* 背景颜色 */
}.header h1 {margin: 0 auto;/* 使标题居中 */
}.header #clock {font-size: 24px;margin-left: 120px;color: white; /* 设置文字颜色 */background-color: #343a40; /* 设置背景颜色 */padding: 10px 20px; /* 添加内边距 */border-radius: 5px; /* 添加圆角 */box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); /* 添加阴影 */background: linear-gradient(135deg, #4285f4, #673ab7);animation: blink 1s infinite alternate; /* 添加闪烁动画 */
}@keyframes blink {from {opacity: 1;}to {opacity: 0.5;}
}.container {font-family: Arial, sans-serif;background-color: #f4f4f4;color: #333;line-height: 1.6;padding: 20px;border-radius: 8px;box-shadow: 0 0 1px rgba(0, 0, 0, 0.1);
}.form-container {display: flex;/* 使用 Flexbox 布局 */align-items: center;/* 垂直居中对齐 */justify-content: flex-start;/* 控制子元素在容器内的水平排列方式 */gap: 20px;/* 控制每个控件之间的间距 */
}form {display: flex;/* 使表单内的控件排列在一行 */gap: 20px;/* 控制控件之间的间距 */align-items: center;/* 垂直对齐控件 */
}#projectname {padding: 10px;/* 设置内边距,让内容不与边框紧贴 */border: 1px solid #ccc;/* 设置边框颜色和样式 */border-radius: 4px;/* 设置圆角效果 */font-size: 16px;/* 设置字体大小 */width: 200px;/* 设置宽度为 200px */height: 40px;/* 设置高度为 40px */background-color: #fff;/* 设置背景颜色为白色 */
}#projectname option {padding: 8px;/* 设置选项的内边距,避免文字与边缘过于紧密 */
}/* #projectname {width: 200px; /* 设置宽度 */
/* height: 40px; 设置高度} */
*/ label {font-weight: bold;color: #555;margin: 0;/* 去掉默认的 margin */
}input[type="text"] {padding: 10px;border: 1px solid #ccc;border-radius: 4px;font-size: 16px;width: 200px;/* 你可以调整输入框的宽度 */
}#stateSelection {padding: 10px;/* 设置内边距,让内容不与边框紧贴 */border: 1px solid #ccc;/* 设置边框颜色和样式 */border-radius: 4px;/* 设置圆角效果 */font-size: 16px;/* 设置字体大小 */width: 200px;/* 设置宽度为 200px */height: 40px;/* 设置高度为 40px */background-color: #fff;/* 设置背景颜色为白色 */
}#stateSelection option {padding: 8px;/* 设置选项的内边距,避免文字与边缘过于紧密 */
}button {width: 100px;padding: 10px;background-color: #007bff;color: #fff;border: none;border-radius: 4px;font-size: 16px;cursor: pointer;transition: background-color 0.3s ease;
}.assiantFre_container {color: #333;padding: 20px;/* 上下之间的距离 */border-radius: 8px;font-size: 20px;max-width: 100%;/* 修改最大宽度为100% */width: 100%;
}table {width: 100%;/* 设置表格占据100%宽度 */border-collapse: collapse;/* 合并表格边框 */margin-top: 30px;/* 设置表格与上方元素的间距 */
}table th,
table td {padding: 12px 15px;text-align: left;border: 1px solid #ddd;/* 为表头和单元格添加边框 */word-wrap: break-word;/* 自动换行,避免内容溢出 */white-space: normal;/* 允许正常换行 */
}table th {background-color: #f2f2f2;font-weight: bold;color: #444;
}table tr:nth-child(even) {background-color: #f9f9f9;
}table tr:hover {background-color: #e9e9e9;
}
四、js代码
console.log("index.js 文件已加载");document.addEventListener('DOMContentLoaded', function () {/********************************************* 获取表单和表格元素*********************************************/const form = document.getElementById('projectForm');const tableHeader = document.getElementById('tableHeader');const tableBody = document.getElementById('tableBody');const addRowbtn = document.getElementById('addRowBtn');/********************************************* 创建单元格的函数*********************************************/function createTableCell(content) {const td = document.createElement('td');td.textContent = content; // 设置单元格的文本内容td.setAttribute('contenteditable', 'true'); // 设置单元格可编辑return td;}/********************************************* 控制显示表格的函数*********************************************/function populateTable(data) {tableHeader.innerHTML = `<tr><th>ID</th><th>专案名称</th><th>专案内容</th><th>提交人</th><th>状态</th><th>项目起始日期</th><th>更改时间</th><th>操作</th> <!-- 用于显示删除按钮 --></tr>`;data.forEach(function (row) {const tr = document.createElement('tr'); // 创建一行// console.log("row_neirong", row.neirong)const createTableCell = (content) => {const td = document.createElement('td');td.innerHTML = content; // 使用 innerHTML 插入带有 HTML 标签的内容td.contentEditable = true; // 确保单元格是可编辑的return td;};tr.appendChild(createTableCell(row.id));tr.appendChild(createTableCell(row.projectName));tr.appendChild(createTableCell(row.neirong));tr.appendChild(createTableCell(row.submitPersonName));tr.appendChild(createTableCell(row.Process));tr.appendChild(createTableCell(row.StartTime));tr.appendChild(createTableCell(row.EndTime));// 创建删除按钮的单元格const deleteCell = document.createElement('td');const deleteButton = document.createElement('button');deleteButton.textContent = '删除'; // 设置按钮文本deleteButton.classList.add('delete-btn'); // 添加样式类,可以自定义按钮样式// 为删除按钮绑定点击事件,删除当前行deleteButton.addEventListener('click', function (event) {event.preventDefault();const confirmDelete = window.confirm('是否确定删除这一行?');if (confirmDelete) {const tr = deleteButton.closest('tr'); // 获取当前按钮所在的行const id = tr.querySelector('td:nth-child(1)').textContent.trim()console.log(id)const deleteData = { 'flag': true, 'id': id }tr.remove(); // 删除该行fetch('/delectable', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify(deleteData)}).then(response => response.json()).then(data => {console.log('成功发送数据到delete接口:', data);}).catch(error => {console.error('失败发送数据到delete接口:', error);});}});deleteCell.appendChild(deleteButton); // 将按钮添加到单元格中tr.appendChild(deleteCell); // 将单元格添加到行中tableBody.appendChild(tr); // 将完整的行添加到表格主体});}/********************************************* 默认显示当前表中的数据*********************************************/fetch('/default', {method: 'POST',headers: {'Content-Type': 'application/json'},}).then(response => response.json()) // 解析返回的 JSON 数据.then(data => {const defaultData = data;// 初始化表格console.log(defaultData)populateTable(defaultData);}).catch(error => {console.error('Error:', error);});/********************************************* 筛选条件接口*********************************************/fetch('/projectNameOptions', {method: 'POST',headers: {'Content-Type': 'application/json'},}).then(response => {if (!response.ok) {throw new Error('网络响应不正常');}return response.json();}).then(data => {let exeuted = falseconsole.log("正在查询")const selectElement = document.querySelector('select[id="projectname"]'); // 使用 id 属性选择器// 添加默认选项const defaultOption = document.createElement('option');defaultOption.value = "";defaultOption.textContent = "请选择项目";selectElement.appendChild(defaultOption);data.projects.forEach(projectName => {const option = document.createElement('option');option.value = projectName;option.textContent = projectName; // selectElement.appendChild(option); // });// 监听 select 元素的 change 事件selectElement.addEventListener('change', function () {const SelectedProjectname = selectElement.value; // 获取当前选中的值console.log('当前选中的项目名称:', SelectedProjectname);search(SelectedProjectname); // 调用 search 函数并传递选中的值exeuted = true});if (!exeuted){search(defaultOption.value)}}).catch(error => {console.error(error);});function search(SelectedProjectname) {// 查询if (form) {form.addEventListener('submit', function (event) {event.preventDefault();console.log("查询表单已提交", SelectedProjectname);const projectName = SelectedProjectnameconst personname = document.getElementById('personname').value;const stateSelectionValue = document.getElementById('stateSelection').value;const formData = {projectname: projectName, // 获取专案名称personname: personname, // 获取提交人stateSelectionValue: stateSelectionValue // 获取专案进度};// 将对象转换为 JSON 字符串const JsonData = JSON.stringify(formData);console.log("JsonData:", JsonData);fetch('/searchfor', {method: 'POST',headers: {'Content-Type': 'application/json', // 设置请求的内容类型为 JSON},body: JsonData}).then(response => response.json()) // 解析响应的 JSON 数据.then(data => {console.log("searchfor被触发!!"); // 处理接收到的数据console.log('searchfordata:', data); // 处理接收到的数据// 模拟查询结果const queryResult = datatableHeader.innerHTML = ''tableBody.innerHTML = ''// 显示表格populateTable(queryResult);}).catch(error => {console.error('发送数据时发生错误:', error); // 错误处理});})}elseconsole.log("不存在form!")}/********************************************* 插入一行*********************************************/addRowbtn.addEventListener('click', function () {event.preventDefault();console.log("click提交事件被触发了");fetch('/insertTable', {method: 'POST',headers: {'Content-Type': 'application/json', // 设置请求的内容类型为 JSON},body: JSON.stringify({name: 'John Doe',age: 30,})}).then(response => response.json()) // 解析响应的 JSON 数据.then(data => {const newData = data['data']; // 想要插入的新数据console.log('newdata:', newData); // 处理接收到的数据tableHeader.innerHTML = ''tableBody.innerHTML = ''// 填充表格populateTable(newData);}).catch(error => {console.error('发送数据时发生错误:', error); // 错误处理});});/********************************************* 保存当前表格到数据库*********************************************/window.addEventListener('keydown', function (event) {// 检查是否按下了 Ctrl + Sif (event.ctrlKey && event.key === 's') {// 阻止默认行为(防止浏览器弹出保存对话框)event.preventDefault();console.log("表格信息已保存!");const jsonData = getTableDataAsJson(tableBody) // 从页面上获得当前所有的项目console.log(jsonData)if (jsonData === '[]' || jsonData.length === 0) {console.log("jsonData 是空的");} else {console.log("jsonData 不是空的");fetch('/saveData', {method: 'POST',headers: {'Content-Type': 'application/json'},body: jsonData}).then(response => response.json()).then(data => {console.log('成功发送数据到后端:', data);}).catch(error => {console.error('发送数据失败:', error);});}}});function getTableDataAsJson(tableBody) {const rows = tableBody.querySelectorAll('tr'); // 获取所有的行const tableData = [];rows.forEach(function (row) {const cells = row.querySelectorAll('td'); // 获取每一行的所有单元格if (cells.length === 0) return; // 如果这一行是空的,则跳过const rowData = {id: cells[0].textContent.trim(),projectName: cells[1].textContent.trim(),projectNeirong: cells[2].innerHTML.trim(),submitPersonName: cells[3].textContent.trim(),process: cells[4].textContent.trim(),startTime: cells[5].textContent.trim(),endTime: cells[6].textContent.trim()};tableData.push(rowData); // 将每一行的数据添加到数组中});// 将数组转换为 JSON 格式并返回return JSON.stringify(tableData);}});function clearFormat() {var table = document.getElementById('projectTable');var selection = window.getSelection();var selectedText = selection.toString();if (selectedText.length === 0) {alert("请先选择要清除格式的文本。");return;}// 获取选中的范围var range = selection.getRangeAt(0);var startContainer = range.startContainer;var endContainer = range.endContainer;// 创建一个新的文本节点,替换选中的内容var plainText = selectedText.replace(/<[^>]*>/g, '');var textNode = document.createTextNode(plainText);// 替换选中的内容range.deleteContents();range.insertNode(textNode);// 重新设置选中的范围range.setStart(textNode, 0);range.setEnd(textNode, plainText.length);selection.removeAllRanges();selection.addRange(range);
}
相关文章:
四、个人项目系统搭建
文章目录 一、python写的后端代码二、html代码三、index.css四、js代码 效果图: 一、python写的后端代码 后端代码使用Flask编写,如下所示: # app.py from flask import Flask, render_template, request, jsonify, g import sqlite3 import…...
长沙理工大学《2024年825自动控制原理真题》 (完整版)
本文内容,全部选自自动化考研联盟的:《长沙理工大学825自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2024年真题 Part1:2024年完整版真题 2024年真题...
Linux上安装Anaconda
查看版本 lsb_release -a uname -m x86_64:表示系统是64位。i686、i386:表示系统是32位。 到连接安装对应版本 连接到ldhttps://repo.anaconda.com/archive/ 配置对应的conda环境,export PATH/对应目录/anaconda3/bin:$PATH *注意为bi…...
HTTP常见的请求头有哪些?都有什么作用?在 Web 应用中使用这些请求头?
HTTP 请求头(Request Headers)用于在 HTTP 请求中携带额外的信息,帮助服务器更好地处理请求。以下是一些常见的 HTTP 请求头及其作用: 常见请求头及其作用 1. Accept 作用:告知服务器客户端可以接受的内容类型。示例…...
扩展tinyplay使其自适应不同声道数量的媒体
android原来的tinyplay代码,如果遇到播放媒体的升到数量与打开pcm的声道数量不匹配的情况,会没法继续播放。 本例扩展了tinyplay的代码,将不同声道的音频数据展开/压缩到pcm设备支持的数据,再写入pcm设备。 bplay.c #include &l…...
[Unity] AppLovin Max接入Native 广告 IOS篇
NativeIOS构建流程 (接入之前备份之前打包得Xcode工程) 下载资源 1.将以下文件放入Unity Assets->Plugins->IOS文件夹下 2.Unity更新max版本至12.4.1 UnityPlugin 6.4.3以上(很重要) 3.NativeSDKManager.CS根据以下附…...
跨平台开发技术的探索:从 JavaScript 到 Flutter
随着多平台支持和用户体验一致性在应用程序开发中变得越来越重要,开发者面临的挑战是如何在不同平台上保持代码的可维护性和高效性。本文将探讨如何利用现代技术栈,包括 Flutter、JavaScript、HTML5、WebAssembly、TypeScript 和 Svelte,在统一的平台上进行高效的跨平台开发…...
计算机网络技术基础:2.计算机网络的组成
计算机网络从逻辑上可以分为两个子网:资源子网和通信子网。 一、资源子网 资源子网主要负责全网的数据处理业务,为全网用户提供各种网络资源与网络服务。资源子网由主机、终端、各种软件资源与信息资源等组成。 1)主机 主机是资源子网的主要…...
PKCS#7、Bit padding(位填充)、Byte padding(字节填充)、Zero padding(零填充)
PKCS#7、Bit padding(位填充)、Byte padding(字节填充)、Zero padding(零填充)是密码学常见的填充方式。 Bit padding(位填充): 位填充可以应用于任意长度的消息。在消息…...
在 Kibana 中为 Vega Sankey 可视化添加过滤功能
作者:来自 Elastic Tim Bosman 及 Miloš Mandić 有兴趣在 Kibana 中为 Vega 可视化添加交互式过滤器吗?了解如何利用 “kibanaAddFilter” 函数轻松创建动态且响应迅速的 Sankey 可视化。 在这篇博客中,我们将了解如何启用 Vega Sankey 可视…...
快速部署一套K8s集群-v1.28
快速部署一套K8s集群-v1.28 1.前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式: kubeadmKubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。 二进制包从github下载发行版的二进…...
python3验证有效正则表达式
Python 中字符串类型本质上没有标记“是否原始”的特性,原始字符串只是为了书写方便。运行时,原始字符串与普通字符串的表现是相同的,唯一的区别是编写代码时是否进行了转义。 因此,如果需要确保某些输入是有效正则表达式&#x…...
Dify+Xinference本地部署Embedding和Rerank模型
文章目录 1、Xinference介绍2、Xinference安装2.1 Xinference Docker安装2.2 pip安装2.3 设置开启自启动(仅针对pip安装用户) 3、部署Embedding和Rerank模型4、Dify调用Xinference模型 1、Xinference介绍 Xinference是一个性能强大且功能全面的分布…...
是时候戒掉小游戏了
玩儿这东西没够!去年本来是要备考CPA,但是赶上写毕业论文,就以此为由,没有去备考,结果论文没完成,考试也没准备,都是游戏惹的祸!今年计划备考,看了两个月书,结…...
ECMAScrip 与 ES2015(ES6):JavaScript 现代化编程的里程碑
在 JavaScript 的发展历程中,ECMASCript 和 ES2015(也称为 ES6)无疑是最具革命性的版本之一。它们不仅引入了大量的新特性和语法糖,还极大地提升了代码的可读性、可维护性和性能。本文将深入探讨 ECMASCrip 和 ES2015 的新特性及其…...
iOS swift开发系列 -- tabbar问题总结
1.单视图如何改为tabbar,以便显示2个标签页 右上角➕,输入tabbar 找到控件,然后选中,把entrypoint移动到tabbar控件 2.改成tabbar,生成两个item,配置各自视图后,启动发现报错 Thread 1: “-[p…...
nginx 部署 ModSecurity3
一、查看本地nginx版本 nginx是yum安装的 # nginx -v nginx version: nginx/1.26.2 二、安装依赖工具 # yum install -y gcc-c flex bison yajl lmdb lua curl-devel curl GeoIP-devel zlib-devel pcre-devel pcre2-devel libxml2-devel ssdeep-devel libtool autoconf aut…...
websocket_asyncio
WebSocket 和 asyncio 指南 简介 本指南涵盖了使用 Python 中的 websockets 库进行 WebSocket 编程的基础知识,以及 asyncio 在异步非阻塞 I/O 中的作用。它提供了构建高效 WebSocket 服务端和客户端的知识,以及 asyncio 的特性和优势。 1. 什么是 WebS…...
一级考试真题(2019)
一级考试真题(2019)...
OpenCV相机标定与3D重建(20)将单应性矩阵分解为旋转矩阵、平移向量和法向量函数decomposeHomographyMat()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将单应性矩阵分解为旋转矩阵、平移向量和法向量。 cv::decomposeHomographyMat 是 OpenCV 库中的一个函数,用于将单应性矩阵…...
题解 - 取数排列
题目描述 取1到N共N个连续的数字(1≤N≤9),组成每位数不重复的所有可能的N位数,按从小到大的顺序进行编号。当输入一个编号M时,就能打印出与该编号对应的那个N位数。例如,当N=3时,可…...
LVGL9.2 鼠标悬停处理
文章目录 前言鼠标悬停处理功能简介使用场景1. **按钮悬停效果**2. **图标高亮**3. **动态工具提示** 实现原理使用方法1. 设置控件样式2. 监听悬停事件 功能亮点注意事项总结 前言 在 v9.2 版本中,新增了许多功能,其中鼠标悬停处理(Mouse H…...
每日计划-1213
1. 完成 SQL2 查询多列 https://www.nowcoder.com/exam/oj?page1tabSQL%E7%AF%87topicId199 2. 八股部分 1) C 中面向对象编程如何实现数据隐藏? 在c中,可以将数据成员声明为私有或受保护,并提供公有的成员函数来访问和修改这些数据成员&am…...
gz中生成模型
生成模型 通过服务调用生成 还记得parameter_bridge 吗? 我们在生成桥接的时候调用了这个cpp文件。 一个 parameter_bridge 实例用于消息传递(传感器数据)。之前的例子 另一个 parameter_bridge 实例用于服务桥接(动态生成模型…...
三相电机不转,如何判断好坏?
在现代工业生产中,三相电机被广泛应用于各类机械设备中,由于其高效能和稳定性,成为驱动设备的首选。然而,在实际使用过程中,三相电机有时会出现不转动的情况,这不仅会影响生产效率,还可能对设备…...
使用观测云排查数据库死锁故障
故障发现 核心应用 pod 发生重启,同时接收到对应使用者反馈业务问题,开始排查。 观测云排查现场 1、根据重启应用信息,查询 APM 执行数据库 update 操作大量报错,执行时间在 5min 以上。 分析 APM 链路异常,发现是触…...
STM32 USB通信知识与应用详解
在嵌入式系统开发中,STM32作为一款性能卓越的微控制器,其USB通信功能的应用十分广泛。本文将深入探讨STM32 USB的相关知识,从基础概念到实际应用,为读者呈现一个全面的STM32 USB通信知识体系。 一、USB基础知识 USB(…...
IoTDB 集群扩容方法
问题 问题1:当时序数据库 IoTDB 集群的存储占用达到多少时,建议增加节点?是等到存储完全满,还是达到一半时就进行扩容?如果集群存储已满,是否需要手动进行数据清理,比如设置 TTL,还…...
控制台报错:Uncaught (in promise):XXXXX问题定位以及前端文件流excel文件下载方法
今天对接上传文件的接口时,明明接口是通的,也正常返回了文件流,然而,控制台就是打印不出返回值,而且一直报错Uncaught (in promise):XXXXX 去查看axios的封装函数,这个internal error是从返回值…...
.NET平台使用C#设置Excel单元格数值格式
设置Excel单元格的数字格式是创建、修改和格式化Excel文档的关键步骤之一,它不仅确保了数据的正确表示,还能够增强数据的可读性和专业性。正确的数字格式可以帮助用户更直观地理解数值的意义,减少误解,并且对于自动化报告生成、财…...
6.2 MapReduce工作原理
MapReduce工作原理涉及将大数据集分割成小块并行处理。Map任务读取数据块并输出中间键值对,而Reduce任务则处理这些排序后的数据以生成最终结果。MapTask工作包括读取数据、应用Map函数、收集输出、内存溢出时写入磁盘以及可选的Combiner局部聚合。ReduceTask工作则…...
C语言指针
1,指针是什么 指针是内存中一个最小内存单元(一个字节)的编号,也就是地址通常口语中说的指针,通常是指指针变量也就是用来存放内存中地址的变量 每个内存单元都有一个地址,这个地址不需要存起来࿰…...
前端(async 和await)
1 async async 将 function 变为成为 async 函数 ●async 内部可以使用 await,也可以不使用,因此执行这个函数时,可以使用 then 和 catch 方法 ●async 函数的返回值是一个 Promise 对象 ●Promise 对象的结果由 async 函数执行的返回值决…...
打造高效的HIS与DAT文件解析工具
在工业数据采集和存储中,HIS 和 DAT 文件是非常常见的二进制数据格式。然而,解析这些固定块大小的二进制文件并将其转换为易读的 CSV 格式并非易事。本文将深入讲解如何使用 Python 和 PyQt5 打造一款图形化工具,轻松解析和转换这些文件&…...
YOLO系列:二、基于yolov8和labelme制作数据集及模型训练
YOLO系列:二、基于yolov8和labelme制作数据集及模型训练 1.新建一个项目1.数据集标注及类型转换1. 1 使用labelme进行数据标注1.1.1打开labelme1.1.2图像标注及存储 1. 2 将数据集转换成yolo类型 2.模型训练的配置文件2. 1打开labelme标注图像2.1.1三级目录 3.模型训…...
PHP搭建环境
一、安装apache 1、获取Apache安装软件 2、双击安装即可:指定对应的路径:E:server/apache 3、选择安装模式:使用自定义模式 4、选择安装位置 二、Apache的目录结构说明 三、Httpd.exe的详细应用 1、服务器进程:运行之后才能够工作...
LeetCode hot100-69-N
https://leetcode.cn/problems/valid-parentheses/description/?envTypestudy-plan-v2&envIdtop-100-liked 20. 有效的括号 已解答 简单 相关标签 相关企业 提示 给定一个只包括 (,),{,},[,] 的字符串 s &#x…...
14:00面试,14:06就出来了,问的问题有点变态。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到5月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...
ubuntu20.04复现 Leg-KILO
这里写目录标题 opencv版本问题下载3.2.0源代码进入解压后的目录创建构建目录运行 CMake 配置 配置时指定一个独立的安装目录,例如 /opt/opencv-3.2:出错: 使用多线程编译错误1: stdlib.h: 没有那个文件或目录错误2:er…...
Redis应用—1.在用户数据里的应用
大纲 1.社区电商的业务闭环 2.Redis缓存架构的典型生产问题 3.用户数据在读多写少场景下的缓存设计 4.热门用户数据的缓存自动延期机制 5.缓存惊群与穿透问题的解决方案 6.缓存和数据库双写不一致问题分析 7.基于分布式锁保证缓存和数据库双写一致性 8.缓存和数据库双写…...
MySQL InnoDB 中的数据页
文章目录 1. 数据库的存储结构概述1.1 表空间(Tablespace)1.2 段(Segment)1.3 区(Extent)1.4 页(Page) 2. InnoDB 数据页的深入解析2.1 数据页的物理结构2.2 数据页中的行存储2.3 数…...
React Fiber
React Fiber 是 React 16 引入的全新重写的协调(Reconciliation)算法的实现,旨在改善 React 的更新机制和性能,尤其是在复杂应用和大量更新的场景下。它使得 React 更加灵活、可调度,能够实现优先级控制和中断更新等特…...
hive 小文件分析
1、获取fsimage文件: hdfs dfsadmin -fetchImage /data/xy/ 2、从二进制文件解析: hdfs oiv -i /data/xy/fsimage_0000000019891608958 -t /data/xy/tmpdir -o /data/xy/out -p Delimited -delimiter “,” 3、创建hive表 create database if not exists…...
大模型运用-Prompt Engineering(提示工程)
什么是提示工程 提示工程 提示工程也叫指令工程,涉及到如何设计、优化和管理这些Prompt,以确保AI模型能够准确、高效地执行用户的指令,如:讲个笑话、java写个排序算法等 使用目的 1.获得具体问题的具体结果。(如&…...
Linux(网络协议和管理)
后面也会持续更新,学到新东西会在其中补充。 建议按顺序食用,欢迎批评或者交流! 缺什么东西欢迎评论!我都会及时修改的! 在这里真的很感谢这位老师的教学视频让迷茫的我找到了很好的学习视频 王晓春老师的个人空间…...
前端项目打包部署
打包和部署前端项目是将开发环境中的代码转化为生产环境可直接运行的静态文件,并将其部署到服务器上的过程。 # 项目打包 pnpm run build# 上传文件至远程服务器 将本地打包生成的 dist 目录下的所有文件拷贝至服务器的 /usr/share/nginx/html 目录。# nginx.cofig…...
Linux驱动开发(12):中断子系统–按键中断实验
本章我们以按键为例讲解在驱动程序中如何使用中断, 在学习本章之前建议先回顾一下关于中断相关的裸机部分相关章节, 这里主要介绍在驱动中如何使用中断,对于中断的概念及GIC中断控制器相关内容不再进行讲解。 本章配套源码和设备树插件位于“…...
C语言(函数指针与指针函数)
函数指针 定义:函数指针本质上是指针,它是函数的指针(定义了一个指针变量,变量中存储了函数的地 址)。函数都有一个入口地址,所谓指向函数的指针,就是指向函数的入口地址。这里函数名就代 表入…...
中国计算机学会计算机视觉专委会携手合合信息举办企业交流活动,为AI安全治理打开“新思路”
近期,《咬文嚼字》杂志发布了2024年度十大流行语,“智能向善”位列其中,过去一年时间里,深度伪造、AI诈骗等话题屡次登上热搜,AI技术“野蛮生长”引发公众担忧。今年9月,全国网络安全标准化技术委员会发布了…...
MacOs 日常故障排除troubleshooting
1. 关闭开机自启动 app X macOs 15.1 System settings -> General -> Login Items & Extensions->Open at Login -> Select app X and click -...