对不起了豆包MarsCode,我只能用通义灵码

683 阅读7分钟

我的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框架:用于构建后端APIVue.js:用于构建前端界面。
数据库:可以选择SQLiteMySQLPostgreSQL等。
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.安装依赖:确保你已经安装了 FlaskSQLAlchemy,如果没有安装,可以使用以下命令安装:
pip install Flask SQLAlchemy
2.配置数据库:在 backend/config.py 中配置数据库连接。
3.定义模型:在 backend/models.py 中定义 Daily 模型。
4.创建 API 路由:在 backend/app.py 中创建一个 API 路由来处理生成打卡数据的请求

详细实现
1. 配置数据库
在 backend/config.py 中配置数据库连接:
。。。。。。

接下来就按照它的步骤一步步粘代码-调试-报错-改代码-调试-报错-改代码,折腾了几个小时,终于运行成功了。

image.png

核心代码如下

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吧!