我的pycharm是2020.3版本,只有通义灵码插件,没有MarsCode插件。
之前是2020.1,连通义灵码都没有,然后试了2024、2021的,都装不上,可能是我的电脑太老了,也可能是我的jdk还是8的原因,最终装上了2020.3——通义灵码支持的最低版本。
和通义灵码一起开发一个造数平台,python+Vue+Flask。
搭建环境搭建了大半天,终于在页面看到了hello vue。
通义灵码有个不好的地方就是隔一天之后它不会接着昨天回答我,昨天环境整了一半,今天继续的时候只能重新描述全面的问题。也许我没找到如何跨天连贯,也许之后它就支持了。
总目标:我要开发一个造数的平台 python语言,后端flask,前台vue。 下面一步一步的开始吧
好的,开发一个造数平台是一个很好的项目。我们将从基础开始,逐步构建这个平台。以下是初步的步骤规划:
1. 环境准备
Python环境:确保安装了Python 3.7+。
Flask框架:用于构建后端API。
Vue.js:用于构建前端界面。
数据库:可以选择SQLite、MySQL或PostgreSQL等。
2. 创建项目结构
创建一个基本的项目结构,包括前后端目录和必要的文件。
number_generator/
├── backend/
│ ├── app.py
│ ├── config.py
│ ├── requirements.txt
│ └── models/
│ └── __init__.py
├── frontend/
│ ├── public/
│ ├── src/
│ │ ├── assets/
│ │ ├── components/
│ │ ├── App.vue
│ │ └── main.js
│ ├── package.json
│ └── vue.config.js
└── README.md
3. 初始化后端
3.1 安装依赖
。。。。。。
照着一步步搭建环境,期间有很多问题,比如文件夹是创建directory还是python package、版本不兼容、缺少一些包等等,都是遇到问题就直接在pycharm右边的通义灵码问,一点一点的解决。pycharm要是没有AI插件,只能去浏览器问Kimi、智普清言、豆包等AI。
有时候它也犯蠢,问个问题还说取决于你的系统、你用的编辑器、用的框架,这里可能忘了前文的一些信息。
环境搭建好了之后,就开始实现功能。
核心需求:为打卡功能构造打卡数据
我之前的做法是直接在mysql中执行sql,如下:
insert into daily (uid,date,time) value
('88888','2024-09-04','2024-09-04 10:19:00'),
('88888','2024-09-05','2024-09-05 10:19:00');
现在我想做一个构造数据的功能,输入用户的uid、打卡起始日期date(如上面示例的2024-09-04、2024-09-05),打卡天数。其中uid和打卡结束日期必填,打卡开始日期、打卡天数两个字段填写其中一个即可。
点击生成sql,则生成sql显示在页面
点击插入,则执行这个sql,插入成功,返回插入成功。失败则给出原因
备注:time中的日期和date一致,时间随机即可
好的,理解了你的需求。我们可以通过一个 Flask API 来实现这个功能。用户可以通过 POST 请求传递 uid 和 start_date,然后后端生成打卡数据并插入到数据库中。
实现步骤
1.安装依赖:确保你已经安装了 Flask 和 SQLAlchemy,如果没有安装,可以使用以下命令安装:
pip install Flask SQLAlchemy
2.配置数据库:在 backend/config.py 中配置数据库连接。
3.定义模型:在 backend/models.py 中定义 Daily 模型。
4.创建 API 路由:在 backend/app.py 中创建一个 API 路由来处理生成打卡数据的请求
详细实现
1. 配置数据库
在 backend/config.py 中配置数据库连接:
。。。。。。
接下来就按照它的步骤一步步粘代码-调试-报错-改代码-调试-报错-改代码,折腾了几个小时,终于运行成功了。
核心代码如下
app.py
from flask import Flask, jsonify, request, render_template_string
from flask_cors import CORS # 引入 CORS
from backend.config import config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
import random
import logging
import os
from dotenv import load_dotenv
from backend.models import db, Daily
from datetime import datetime, timedelta, time # 导入 time
load_dotenv() # 加载 .env 文件
app = Flask(__name__)
app.config.from_object(config[os.getenv('FLASK_ENV', 'development')])
db.init_app(app)
migrate = Migrate(app, db)
# 全局启用 CORS 支持
CORS(app, origins="http://x.x.x.x:x")
# 设置日志
logging.basicConfig(level=app.config['LOG_LEVEL'])
logger = logging.getLogger(__name__)
@app.route('/')
def hello_world():
logger.info("Handling root route")
return 'Hello, World!'
@app.route('/checkin', methods=['GET'])
def checkin_page():
return render_template_string(open('frontend/public/templates/checkin.html').read())
@app.route('/generate_checkin_sql', methods=['POST'])
def generate_checkin_sql():
data = request.json
uid = data.get('uid')
end_date_str = data.get('end_date')
start_date_str = data.get('start_date')
days = data.get('days')
if not uid or not end_date_str:
return jsonify({'error': 'Missing required parameters: uid and end_date'}), 400
try:
end_date = datetime.strptime(end_date_str, '%Y-%m-%d').date()
except ValueError:
return jsonify({'error': 'Invalid end_date format. Please use YYYY-MM-DD'}), 400
if start_date_str:
try:
start_date = datetime.strptime(start_date_str, '%Y-%m-%d').date()
except ValueError:
return jsonify({'error': 'Invalid start_date format. Please use YYYY-MM-DD'}), 400
elif days:
try:
days = int(days)
except ValueError:
return jsonify({'error': 'Invalid days format. Please use an integer'}), 400
start_date = end_date - timedelta(days=days - 1)
else:
return jsonify({'error': 'Either start_date or days must be provided'}), 400
# 生成 daily 表的 SQL
sql = "INSERT INTO daily (uid, date, time) VALUES\n"
values = []
# 生成 daily_task 表的 SQL (词量)
word_sql = "INSERT INTO daily_task (uid, days, word_status, types, amount) VALUES\n"
word_values = []
# 生成 daily_task 表的 SQL (学习时长)
time_sql = "INSERT INTO daily_task(uid, days, word_status, types, amount, amount_v1) VALUES\n"
time_values = []
for i in range((end_date - start_date).days + 1):
date = start_date + timedelta(days=i)
hour = random.randint(8, 18)
minute = random.randint(0, 59)
time = datetime.combine(date, time(hour, minute))
values.append(f"('{uid}', '{date}', '{time}')")
# 生成词量数据
amount = random.randint(20, 2000)
word_values.append(f"('{uid}', '{date}', 1, 1, {amount})")
# 生成学习时长数据
amount_v1 = random.randint(10000, 46837700)
time_values.append(f"('{uid}', '{date}', 1, 2, 0, {amount_v1})")
sql += ",\n".join(values) + ";"
word_sql += ",\n".join(word_values) + ";"
time_sql += ",\n".join(time_values) + ";"
return jsonify({
'daily_sql': sql,
'daily_word_sql': word_sql,
'daily_time_sql': time_sql
}), 200
@app.route('/insert_checkin_data', methods=['POST'])
def insert_checkin_data():
data = request.json
uid = data.get('uid')
end_date_str = data.get('end_date')
start_date_str = data.get('start_date')
days = data.get('days')
if not uid or not end_date_str:
return jsonify({'error': 'Missing required parameters: uid and end_date'}), 400
try:
end_date = datetime.strptime(end_date_str, '%Y-%m-%d').date()
except ValueError:
return jsonify({'error': 'Invalid end_date format. Please use YYYY-MM-DD'}), 400
if start_date_str:
try:
start_date = datetime.strptime(start_date_str, '%Y-%m-%d').date()
except ValueError:
return jsonify({'error': 'Invalid start_date format. Please use YYYY-MM-DD'}), 400
elif days:
try:
days = int(days)
except ValueError:
return jsonify({'error': 'Invalid days format. Please use an integer'}), 400
start_date = end_date - timedelta(days=days - 1)
else:
return jsonify({'error': 'Either start_date or days must be provided'}), 400
checkin_data = []
for i in range((end_date - start_date).days + 1):
date = start_date + timedelta(days=i)
hour = random.randint(8, 18)
minute = random.randint(0, 59)
time = datetime.combine(date, time(hour, minute))
checkin_data.append(Daily(uid=uid, date=date, time=time))
try:
db.session.add_all(checkin_data)
db.session.commit()
return jsonify({'message': 'Check-in data inserted successfully'}), 201
except Exception as e:
db.session.rollback()
return jsonify({'error': str(e)}), 500
@app.route('/generate', methods=['GET'])
def generate_number():
logger.info("Generating random number")
number = random.randint(1, 100)
return jsonify({'number': number})
@app.errorhandler(404)
def not_found_error(error):
logger.error(f"404 Not Found: {request.url}")
return jsonify({'error': 'Not Found'}), 404
@app.errorhandler(500)
def internal_error(error):
logger.error(f"500 Internal Server Error: {request.url}")
return jsonify({'error': 'Internal Server Error'}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=xxx, debug=True)
generate.vue
<template>
<div class="container">
<div class="left-panel">
<h1>生成打卡数据</h1>
<form @submit.prevent="generateSQL">
<div class="form-group">
<label for="uid">UID:</label>
<input type="text" id="uid" v-model="uid" required />
</div>
<div class="form-group">
<label for="end_date">打卡结束日期:</label>
<input type="date" id="end_date" v-model="end_date" required />
</div>
<div class="form-group">
<label for="start_date">打卡开始日期:</label>
<input type="date" id="start_date" v-model="start_date" />
</div>
<div class="form-group">
<label for="days">打卡天数:</label>
<input type="number" id="days" v-model="days" />
</div>
<button type="submit">生成 SQL</button>
</form>
</div>
<div class="right-panel">
<div v-if="sql">
<h2>生成的 SQL:</h2>
<pre>{{ sql }}</pre>
<button @click="insertData">插入数据</button>
</div>
<div v-if="result">
<h2>结果:</h2>
<p>{{ result }}</p>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
uid: '',
end_date: '',
start_date: '',
days: '',
sql: '',
result: ''
};
},
methods: {
async generateSQL() {
try {
const response = await fetch('http://x.x.x.x:x/generate_checkin_sql', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
uid: this.uid,
end_date: this.end_date,
start_date: this.start_date,
days: this.days
})
});
if (!response.ok) {
throw new Error('Network response was not ok');
}
const data = await response.json();
console.log('Response data:', data); // 添加日志输出,方便调试
if (data) {
// 合并所有 SQL 语句
this.sql = [
data.daily_sql,
data.daily_time_sql,
data.daily_word_sql
].join('\n\n');
console.log('Generated SQL:', this.sql); // 添加日志输出,方便调试
} else {
this.result = '生成 SQL 失败: 未找到 SQL 数据';
}
} catch (error) {
this.result = '请求失败: ' + error.message;
console.error('Error generating SQL:', error);
}
},
async insertData() {
try {
const response = await fetch('http://x.x.x.x:x/insert_checkin_data', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
uid: this.uid,
end_date: this.end_date,
start_date: this.start_date,
days: this.days
})
});
if (!response.ok) {
throw new Error('Network response was not ok');
}
const data = await response.json();
if (data && data.message) {
this.result = data.message;
} else {
this.result = '插入数据失败: 未找到消息';
}
} catch (error) {
this.result = '请求失败: ' + error.message;
console.error('Error inserting data:', error);
}
}
}
};
</script>
<style scoped>
.container {
display: flex;
height: 100vh; /* 调整高度以适应整个视口 */
}
.left-panel, .right-panel {
padding: 15px;
box-sizing: border-box;
width: 50%; /* 确保左右面板各占一半宽度 */
}
.left-panel {
background-color: #f4f4f4;
border-right: 1px solid #ddd;
}
.right-panel {
background-color: #fff;
}
.form-group {
display: flex;
align-items: center;
margin-bottom: 20px;
}
.form-group label {
flex: 1;
margin-right: 10px;
}
.form-group input {
flex: 2;
padding: 8px;
box-sizing: border-box;
}
button {
padding: 8px 20px;
font-size: 15px;
cursor: pointer;
}
p {
margin-top: 5px;
font-size: 14px;
}
pre {
background-color: #f9f9f9;
padding: 8px;
border: 1px solid #ddd;
white-space: pre-wrap;
word-wrap: break-word;
}
</style>
全是它给的代码,我一句也没写。
感谢通义灵码,虽然在这个平台上写这句话可能会挨打,那么,就感谢AI吧!