前言

最近在 GitHub 学生包里发现了一个好东西——GitHub Copilot CLI…

Copilot CLI

听说这个产品是 Claude Code 的竞品,刚看新闻说微软让员工从Claude Code转用它
正好对比体验一下

Copilot CLI 运行截图

大一 C 语言实践作业

翻到之前大一的 C 语言作业——学生管理系统…

大一C语言作业截图

当时懵懂无知,完全不懂什么是 agent…
用 DeepSeek 改了又改,虽然(but still)仍然不会古法编程…

现在用 Copilot CLI,几分钟就能写好,完全不用手。
搭一个网页版吧 生成的文件

核心代码

from flask import Flask, g, render_template, request, redirect, url_for
import sqlite3
import os

BASE_DIR = os.path.dirname(__file__)
DB_PATH = os.path.join(BASE_DIR, 'student.db')

app = Flask(__name__, instance_path=BASE_DIR)

def get_db():
    db = getattr(g, '_database', None)
    if db is None:
        db = g._database = sqlite3.connect(DB_PATH)
        db.row_factory = sqlite3.Row
    return db

def init_db():
    db = get_db()
    cur = db.cursor()
    cur.execute('''
        CREATE TABLE IF NOT EXISTS students (
            id TEXT PRIMARY KEY,
            name TEXT,
            gender TEXT,
            birth TEXT,
            address TEXT,
            phone TEXT,
            email TEXT
        )
    ''')
    cur.execute('''
        CREATE TABLE IF NOT EXISTS courses (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            sid TEXT,
            cid TEXT,
            name TEXT,
            credit REAL
        )
    ''')
    cur.execute('''
        CREATE TABLE IF NOT EXISTS scores (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            ssid TEXT,
            sname TEXT,
            scid TEXT,
            cname TEXT,
            score REAL
        )
    ''')
    db.commit()

@app.teardown_appcontext
def close_connection(exception):
    db = getattr(g, '_database', None)
    if db is not None:
        db.close()

with app.app_context():
    init_db()

@app.route('/')
def index():
    return render_template('index.html')

# Students
@app.route('/students')
def students():
    db = get_db()
    cur = db.execute('SELECT * FROM students ORDER BY id')
    rows = cur.fetchall()
    return render_template('students.html', students=rows)

@app.route('/students/add', methods=['GET', 'POST'])
def add_student():
    if request.method == 'POST':
        form = request.form
        db = get_db()
        try:
            db.execute('INSERT INTO students(id,name,gender,birth,address,phone,email) VALUES (?,?,?,?,?,?,?)',
                       (form['id'], form['name'], form.get('gender',''), form.get('birth',''), form.get('address',''), form.get('phone',''), form.get('email','')))
            db.commit()
        except sqlite3.IntegrityError:
            return '学号已存在', 400
        return redirect(url_for('students'))
    return render_template('student_form.html', student=None)

@app.route('/students/edit/<sid>', methods=['GET','POST'])
def edit_student(sid):
    db = get_db()
    if request.method == 'POST':
        form = request.form
        db.execute('UPDATE students SET id=?,name=?,gender=?,birth=?,address=?,phone=?,email=? WHERE id=?',
                   (form['id'], form['name'], form.get('gender',''), form.get('birth',''), form.get('address',''), form.get('phone',''), form.get('email',''), sid))
        db.commit()
        return redirect(url_for('students'))
    cur = db.execute('SELECT * FROM students WHERE id=?', (sid,))
    student = cur.fetchone()
    return render_template('student_form.html', student=student)

@app.route('/students/delete/<sid>', methods=['POST'])
def delete_student(sid):
    db = get_db()
    db.execute('DELETE FROM students WHERE id=?', (sid,))
    db.execute('DELETE FROM courses WHERE sid=?', (sid,))
    db.execute('DELETE FROM scores WHERE ssid=?', (sid,))
    db.commit()
    return redirect(url_for('students'))

# Courses
@app.route('/courses')
def courses():
    db = get_db()
    cur = db.execute('SELECT * FROM courses ORDER BY sid, cid')
    rows = cur.fetchall()
    return render_template('courses.html', courses=rows)

@app.route('/courses/add', methods=['GET','POST'])
def add_course():
    if request.method == 'POST':
        f = request.form
        db = get_db()
        db.execute('INSERT INTO courses(sid,cid,name,credit) VALUES (?,?,?,?)', (f['sid'], f['cid'], f['name'], float(f.get('credit',0))))
        db.commit()
        return redirect(url_for('courses'))
    return render_template('course_form.html', course=None)

@app.route('/courses/delete/<int:id>', methods=['POST'])
def delete_course(id):
    db = get_db()
    # delete related scores
    cur = db.execute('SELECT sid,cid,name FROM courses WHERE id=?', (id,))
    row = cur.fetchone()
    if row:
        db.execute('DELETE FROM scores WHERE scid=? AND ssid=?', (row['cid'], row['sid']))
    db.execute('DELETE FROM courses WHERE id=?', (id,))
    db.commit()
    return redirect(url_for('courses'))

# Scores
@app.route('/scores')
def scores():
    db = get_db()
    cur = db.execute('SELECT * FROM scores ORDER BY ssid')
    rows = cur.fetchall()
    return render_template('scores.html', scores=rows)

@app.route('/scores/add', methods=['GET','POST'])
def add_score():
    if request.method == 'POST':
        f = request.form
        db = get_db()
        db.execute('INSERT INTO scores(ssid,sname,scid,cname,score) VALUES (?,?,?,?,?)', (f['ssid'], f['sname'], f['scid'], f['cname'], float(f.get('score',0))))
        db.commit()
        return redirect(url_for('scores'))
    return render_template('score_form.html', score=None)

@app.route('/scores/delete/<int:id>', methods=['POST'])
def delete_score(id):
    db = get_db()
    db.execute('DELETE FROM scores WHERE id=?', (id,))
    db.commit()
    return redirect(url_for('scores'))

# Stats
@app.route('/stats')
def stats():
    sid = request.args.get('sid')
    db = get_db()
    if not sid:
        return render_template('stats.html', sid=None, stats=None)
    # calculate avg, total credits passed
    cur = db.execute('SELECT score, scid FROM scores WHERE ssid=?', (sid,))
    rows = cur.fetchall()
    if not rows:
        return render_template('stats.html', sid=sid, stats=None)
    total = 0.0
    cnt = 0
    credits = 0.0
    for r in rows:
        total += r['score']
        cnt += 1
        if r['score'] >= 60:
            c = db.execute('SELECT credit FROM courses WHERE sid=? AND cid=?', (sid, r['scid'])).fetchone()
            if c:
                credits += c['credit']
    avg = total / cnt if cnt else 0
    return render_template('stats.html', sid=sid, stats={'avg':avg,'credits':credits,'count':cnt})

# Course ranking
@app.route('/rank/<cid>')
def rank(cid):
    db = get_db()
    cur = db.execute('SELECT sname, score FROM scores WHERE scid=? ORDER BY score DESC', (cid,))
    rows = cur.fetchall()
    return render_template('rank.html', cid=cid, rows=rows)

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=5000, debug=True)

是用flask搭的

代码不详说,就是一个非常简单的项目,.db文件是数据库,用的sqlite,打开试试,在5000端口跑起来 cmd

优雅且流畅,不禁感慨AI可以取代多少之前人工的工作,从有这个想法到落地实现这个项目仅用了20分钟不到。。。 web web web

但是在想想,以后最重要的可能就是那个想法。。。

Claude Code

cc 最近通过Vidar的老学长搞到了ClaudeCode的key,每天有一些额度,正好让我这个穷人体验一下。

感受

目前的感受是快,比那个垃圾的Copilot不知道准确了多少,降低了不少重复工作
本人还在使用中,等我之后的文章详细说说,以后他就是主力了