VUE3 添删改查示例代码 包含高级查询 排序 字段筛选 打印 导出

这段实例代码是使用 ElementPlus完成的 由代码生成器生成

包含了表单验证 添删改查 表格排序 字段筛选 JS端的打印与导出

望vue3开发人员 开发越来越顺 赚钱越来越多

 由于使用了自动引用 所以没有import

看好的客观请点赞

<template>
    <!-- 搜索 -->
    <el-card>
        <el-form :inline="true">
            <el-form-item label="姓名">
                <el-input v-model="Ms.searchForm.name" placeholder="请输入姓名" clearable/>
            </el-form-item>
            <el-form-item label="年龄">
                <el-input-number v-model="Ms.searchForm.age" placeholder="请输入年龄" />
            </el-form-item>
            <el-form-item label="邮箱">
                <el-input v-model="Ms.searchForm.email" placeholder="请输入邮箱" clearable/>
            </el-form-item>

            <el-form-item label="加入时间">
                <el-date-picker v-model="Ms.searchForm.enterTime" type="datetimerange" format="YYYY/MM/DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择" clearable range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间"/>
            </el-form-item>
            <el-form-item label="价格">
                <el-input-number v-model="Ms.searchForm.price" placeholder="请输入价格" />
            </el-form-item>
            <el-form-item>
                <el-button @click="searchData()" type="primary" icon="Search">查询</el-button>
                <el-button @click="resetSearchData()">重置</el-button>
            </el-form-item>
        </el-form>
    </el-card>
    <el-card style="margin-top:15px">
        <!-- 工具栏 -->
        <el-button type="primary" @click="addOrUpdateHandle()" icon="CirclePlus">新增</el-button>
        <el-button type="danger" :disabled="Ms.dataListSelections.length <= 0" @click="deleteConfirmHandle()" icon="Delete">批量删除</el-button>
        <el-button type="success" :disabled="Ms.dataListSelections.length <= 0" @click="exportExcel" icon="Download">导出</el-button>
        <el-button type="success" :disabled="Ms.dataListSelections.length <= 0" @click="printTable" icon="Printer">打印</el-button>
        <el-button @click="getDataList()" icon="Refresh">刷新</el-button>
        <el-dropdown :hide-on-click="false" trigger="click" style="float:right">
            <el-button size="small" icon="Grid"></el-button>
            <template #dropdown>
                <el-dropdown-menu>
                    <el-scrollbar style="height:200px;">
                        <el-checkbox-group v-model="Ms.selectedColList">
                            <el-dropdown-item v-for="(item,index) in Ms.colList" :key="index">
                                <el-checkbox :key="item.value" :label="item">{{item.label}}</el-checkbox>
                            </el-dropdown-item>
                        </el-checkbox-group>
                    </el-scrollbar>
                </el-dropdown-menu>
            </template>
        </el-dropdown>
        <!-- 主表 -->
        <el-table style="margin-top:15px;width: 100%;"
                  header-cell-class-name="headerStyle"
                  stripe
                  @cell-dblclick="celldblclick"
                  :data="Ms.dataList"
                  :border="true"
                  sortable="custom"
                  @sort-change="sortChangeHandle"
                  @selection-change="selectionChangeHandle">
            <el-table-column type="selection" header-align="center" align="center" width="50" />
            <el-table-column prop="id" header-align="center" align="center"  label="主键ID" v-if="showCol('id')"  sortable="custom"/>
            <el-table-column prop="name" header-align="center" align="center"  label="姓名" v-if="showCol('name')" />
            <el-table-column prop="age" header-align="center" align="center"  label="年龄" v-if="showCol('age')"  sortable="custom"/>
            <el-table-column prop="email" header-align="center" align="center"  label="邮箱" v-if="showCol('email')" />
            <el-table-column prop="createDate" header-align="center" align="center"  label="创建时间" v-if="showCol('createDate')"  sortable="custom"/>
            <el-table-column prop="photos" header-align="center" align="center"  label="照片" v-if="showCol('photos')" />
            <el-table-column prop="lat" header-align="center" align="center"  label="经度" v-if="showCol('lat')"  sortable="custom"/>
            <el-table-column prop="lng" header-align="center" align="center"  label="纬度" v-if="showCol('lng')"  sortable="custom"/>
            <el-table-column prop="enterTime" header-align="center" align="center"  label="加入时间" v-if="showCol('enterTime')"  sortable="custom"/>
            <el-table-column prop="price" header-align="center" align="center"  label="价格" v-if="showCol('price')"  sortable="custom"/>
            <el-table-column prop="mark" header-align="center" align="center"  label="备注" v-if="showCol('mark')" />
            <el-table-column fixed="right" header-align="center" align="center" width="180" label="操作">
                <template #default="scope">
                    <el-button link type="primary" size="small" @click="showHandle(scope.$index)">查看</el-button>
                    <el-button link type="primary" size="small" @click="addOrUpdateHandle(scope.$index)">修改</el-button>
                    <el-button link type="primary" size="small" @click="deleteConfirmHandle(scope.row.id)">删除</el-button>
                </template>
            </el-table-column>
        </el-table>
        <!-- 翻页器 -->
        <el-pagination
                style="margin-top:15px;width: 100%;"
                background
                :current-page="Ms.pageData.pageIndex"
                :page-sizes="[10, 20, 50, 100]"
                :default-page-size="Ms.pageData.pageSize"
                :total="Ms.pageData.total"
                layout="total, sizes, prev, pager, next, jumper"
                @size-change="sizeChangeHandle"
                @current-change="currentChangeHandle"
        />
    </el-card>

    <!-- 弹窗, 新增 / 修改 -->
    <el-dialog v-model="Ms.editDialog" width="75%" :close-on-click-modal="true" :append-to-body="true" :destroy-on-close="true">
        <el-form ref="formRef" :model="Ms.formData" :rules="Ms.rules" label-width="100px" @keyup.enter.native="submitHandle()">
            <el-row :gutter="15">
                <el-col :span="24">
                    <el-form-item label="姓名" prop="name">
                        <el-input v-model="Ms.formData.name" placeholder="请输入姓名" clearable/>
                    </el-form-item>
                </el-col>
                <el-col :span="24">
                    <el-form-item label="年龄" prop="age">
                        <el-input-number v-model="Ms.formData.age" placeholder="请输入年龄" />
                    </el-form-item>
                </el-col>
                <el-col :span="24">
                    <el-form-item label="邮箱" prop="email">
                        <el-input v-model="Ms.formData.email" type="textarea" :rows="3" placeholder="请输入邮箱" clearable/>
                    </el-form-item>
                </el-col>
                <el-col :span="24">
                    <el-form-item label="创建时间" prop="createDate">
                        <el-date-picker  v-model="Ms.formData.createDate" type="datetime" format="YYYY/MM/DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择" clearable/>
                    </el-form-item>
                </el-col>
                <el-col :span="24">
                    <el-form-item label="加入时间" prop="enterTime">
                        <el-date-picker  v-model="Ms.formData.enterTime" type="datetime" format="YYYY/MM/DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择" clearable/>
                    </el-form-item>
                </el-col>
                <el-col :span="24">
                    <el-form-item label="价格" prop="price">
                        <el-input-number v-model="Ms.formData.price" placeholder="请输入价格" />
                    </el-form-item>
                </el-col>
                <el-col :span="24">
                    <el-form-item label="备注" prop="mark">
                        <el-input v-model="Ms.formData.mark" placeholder="请输入备注" clearable/>
                    </el-form-item>
                </el-col>
            </el-row>
        </el-form>
        <template #footer>
            <el-button @click="Ms.editDialog=false">关闭</el-button>
            <el-button type="primary" @click="submitHandle">确定</el-button>
        </template>
    </el-dialog>

    <!-- 详细信息 -->
    <el-dialog v-model="Ms.showDialog" :close-on-click-modal="true" :append-to-body="true" :destroy-on-close="true">
        <el-descriptions  :column="2" border id="desc">
            <el-descriptions-item label="主键ID">
                {{ Ms.formData.id? Ms.formData.id : " "}}
            </el-descriptions-item>
            <el-descriptions-item label="姓名">
                {{ Ms.formData.name? Ms.formData.name : " "}}
            </el-descriptions-item>
            <el-descriptions-item label="年龄">
                {{ Ms.formData.age? Ms.formData.age : " "}}
            </el-descriptions-item>
            <el-descriptions-item label="邮箱">
                {{ Ms.formData.email? Ms.formData.email : " "}}
            </el-descriptions-item>
            <el-descriptions-item label="创建时间">
                {{ Ms.formData.createDate? Ms.formData.createDate : " "}}
            </el-descriptions-item>
            <el-descriptions-item label="照片">
                {{ Ms.formData.photos? Ms.formData.photos : " "}}
            </el-descriptions-item>
            <el-descriptions-item label="经度">
                {{ Ms.formData.lat? Ms.formData.lat : " "}}
            </el-descriptions-item>
            <el-descriptions-item label="纬度">
                {{ Ms.formData.lng? Ms.formData.lng : " "}}
            </el-descriptions-item>
            <el-descriptions-item label="加入时间">
                {{ Ms.formData.enterTime? Ms.formData.enterTime : " "}}
            </el-descriptions-item>
            <el-descriptions-item label="价格">
                {{ Ms.formData.price? Ms.formData.price : " "}}
            </el-descriptions-item>
            <el-descriptions-item label="备注">
                {{ Ms.formData.mark? Ms.formData.mark : " "}}
            </el-descriptions-item>
        </el-descriptions>
        <template #footer>
            <el-button @click="Ms.showDialog=false">关闭</el-button>
            <el-button type="success" @click="printForm" icon="Printer">打印</el-button>
        </template>
    </el-dialog>
</template>


<script lang="ts" setup>
    import {downloadByJson,printByJson,printById} from '@/utils/excelTools'
    import {useUUID} from '@/hooks/tools'
    //=====================================>data
    const Ms:any = reactive({
        // dataList:[],
        pageData:{
            total:0,
            pageSize:20,
            pageIndex:1,
            sortProp:'createDate',
            sortOrder:'descending',
        },
        defaultSearchForm:{},
        searchForm:{},
        formData:{},
        dictMap:{},
        dataListSelections:[],
        showDialog:false,
        editDialog:false,
        colList:[
            {value:'id',label:'主键ID'},
            {value:'name',label:'姓名'},
            {value:'age',label:'年龄'},
            {value:'email',label:'邮箱'},
            {value:'createDate',label:'创建时间'},
            {value:'photos',label:'照片'},
            {value:'lat',label:'经度'},
            {value:'lng',label:'纬度'},
            {value:'enterTime',label:'加入时间'},
            {value:'price',label:'价格'},
            {value:'mark',label:'备注'},
        ],
        rules:{
            name: [
                { required: true, message: '请输入姓名', trigger: 'blur' }
            ],
            age: [
                { required: true, message: '请输入年龄', trigger: 'blur' }
            ],
            email: [
                { required: true, message: '请输入邮箱', trigger: 'blur' }
            ],
            createDate: [
                { required: true, message: '请输入创建时间', trigger: 'blur' }
            ],
            photos: [
                { required: true, message: '请输入照片', trigger: 'blur' }
            ],
            lat: [
                { required: true, message: '请输入经度', trigger: 'blur' }
            ],
            lng: [
                { required: true, message: '请输入纬度', trigger: 'blur' }
            ],
            enterTime: [
                { required: true, message: '请输入加入时间', trigger: 'blur' }
            ],
            price: [
                { required: true, message: '请输入价格', trigger: 'blur' }
            ],
            mark: [
                { required: true, message: '请输入备注', trigger: 'blur' }
            ],
        },
        // selectedColList:[]
    })


    const {proxy} = getCurrentInstance() as any
    //接受参数 route.query.name
    const route = useRoute()
    //跳转传参 router.push({path:'/path',query:{name:'ligang'}})
    const router = useRouter()

    Ms.selectedColList = [...Ms.colList]

    //=====================================>onMounted
    onMounted(() => {
        getDataList()
    });
    //=====================================>watch
    watch(Ms, (newValue, oldValue) => {
        if(import.meta.env.DEV){
            console.log('Ms 数据发生改变', newValue)
        }
    })
    //=====================================>computed
    Ms._temp=computed(()=>{
        return "bo"+"tan"
    })
    //=====================================>methods
    //获取主表数据
    const getDataList = async() => {
        const sortInfo = Ms.pageData.sortProp + (Ms.pageData.sortOrder === 'descending' ? ' desc' : ' asc')
        const {data} = await http.post("/api/greenelec_demo/findByEntity",Ms.searchForm,{params:{page:Ms.pageData.pageIndex,size:Ms.pageData.pageSize,sort:sortInfo}})
        if(data.success){
            Ms.dataList = data.data.records;
            Ms.pageData.total = data.data.total;
        }
    }

    //重置搜索
    const resetSearchData = () => {
        Ms.searchForm = {...Ms.defaultSearchForm}
        Ms.pageData.pageIndex = 1
        getDataList()
    }


    const showHandle = (index?:any) => {
        Ms.formData = Ms.dataList[index]
        Ms.showDialog=true
    }

    //打开新增或修改窗体
    const addOrUpdateHandle = (index?:any) => {
        if(index===undefined){
            Ms.formData = {}
        }else{
            Ms.formData = {...Ms.dataList[index]}
        }
        Ms.editDialog=true
    }

    //排序发生改变
    const sortChangeHandle = (sort) =>{
        Ms.pageData.sortProp = sort.prop
        Ms.pageData.sortOrder = sort.order
        Ms.pageData.pageIndex = 1
        getDataList()
    }

    //选择主表数据
    const selectionChangeHandle = (selection) =>{
        Ms.dataListSelections = selection
    }

    //搜索
    const searchData = () => {
        Ms.pageData.pageIndex = 1
        getDataList()
    }

    //页面size修改
    const sizeChangeHandle = (size) =>{
        Ms.pageData.pageSize = size
        Ms.pageData.pageIndex = 1
        getDataList()
    }

    //翻页
    const currentChangeHandle = (num) => {
        Ms.pageData.pageIndex = num
        getDataList()
    }

    //显示列
    const showCol = (colName) => {
        return Ms.selectedColList.findIndex(item=>item.value===colName)>=0;
    }

    //双击复制
    const celldblclick = (row,col) => {
        if(!col.property) return
        navigator.clipboard.writeText(row[col.property]).then(() => {
            ElMessage({message: '内容已复制',type: 'success',})
        });
    }


    //提交数据
    const submitHandle = async() =>{
        proxy.$refs['formRef'].validate(async valid => {
            if (!valid) return
            let resp:any = null
            if(!Ms.formData.id){
                resp = await http.post("/api/greenelec_demo/add",Ms.formData)
            }else{
                resp = await http.post("/api/greenelec_demo/updateById",Ms.formData)
            }
            if(resp.data.success){
                Ms.editDialog = false
                getDataList()
                ElNotification({title: '操作成功',message: '更新数据成功',type: 'success'})
            }else{
                ElMessage({type: 'error',message: '错误:'+resp.msg})
            }
        })
    }

    //删除确认
    const deleteConfirmHandle = async(id?:any) => {
        // 处理IDS
        let ids = id ? [id] : Ms.dataListSelections.map(item => {
            return item.id
        })
        ElMessageBox.confirm('确认真的删除吗?','警告',{
            confirmButtonText: '确认',
            cancelButtonText: '取消',
            type: 'warning',
        }).then(async () => {
            const resp = await http.get('/api/greenelec_demo/removeByIds', { params: { ids: ids.join(',') }})
        if(resp.data.success){
            ElNotification({title: '操作成功',message: '删除数据成功',type: 'success'})
            getDataList()
        }
    }).catch((e)=>{})
    }

    //导出excle
    const exportExcel = () => {
        downloadByJson(Ms.selectedColList,Ms.dataListSelections,useUUID()+".xlsx")
    }

    const printTable = () => {
        printByJson(Ms.selectedColList,Ms.dataListSelections,"数据报表")
    }

    const printForm = () => {
        printById("desc")
    }


</script>

<style>
    .el-table {
        --el-table-header-bg-color: #eee;
    }

    .headerStyle .cell{
        color:'#000';
        font-weight: bold !important;
    }
</style>

ExcelTools.ts  工具 使用到了 js库 print-js 和 xlsx 请自行安装


import printJS from 'print-js';
import {utils,writeFile} from 'xlsx'

/**
 * 下载选中的json数据
 * @param selectColList 选中的列
 * @param dataList 数据
 * @param fileName 文件名
 */
const downloadByJson = (selectColList,dataList,fileName) =>{
    let excelData:any = [];
    const excelHead:any = selectColList.map(item=>item.label)
    const excelCol = selectColList.map(item=>item.value)
    excelData.push(excelHead)
    for (let row of dataList) {
        let obj:any = []
        for(let col of excelCol){
            obj.push(row[col])
        }
        excelData.push(obj)
    }
    const ws = utils.json_to_sheet(excelData,{skipHeader: true});
    const wb = utils.book_new();
    utils.book_append_sheet(wb, ws, "sheet1");
    writeFile(wb, fileName);
}


/**
 * 打印选中的数据
 * @param selectColList 选中的列
 * @param dataList 数据
 */
const printByJson = (selectColList,dataList,title) =>{

    let printColumns = selectColList.map(item => {
        return {
          field: item.value,
          displayName: item.label,
        };
      });

      //整理并过滤掉null
      const printData:any = [];
      for (let row of dataList) {
        let obj:any = {}
        for(let col of selectColList){
            obj[col.value] = row[col.value]?row[col.value]:''
        }
        printData.push(obj)
    }

      printJS({
        printable: printData,
        maxWidth: 2500,
        properties: printColumns,
        header: `
          <div class="titleDiv">
            <div class="title">${title}</div>
          </div>
        `,
        //size: landscape;
        style: `@page {  margin: 0.5cm; margin-right: 0.5cm; margin-top: 0.5cm; margin-bottom: 0.3cm; padding-bottom: 0px; }
          .title {
            margin-top: 10px;
            font-size: 20px;
            text-align: center;
            padding:10px;
          }     
          `,
        gridStyle: 'text-align: center; border: 1px solid black;',
        gridHeaderStyle:
          'border-top: 1px solid black; border-right: 1px solid black; border-left: 1px solid black; border-bottom: 0px;',
        type: 'json',
      });
}

const printById = (id) => {
    printJS({
        printable:id, 
        type:'html',
        targetStyles: ['*'],
        header:'',
        style: `@page {  margin: 0.5cm; margin-right: 0.5cm; margin-top: 0.5cm; margin-bottom: 0.3cm; padding-bottom: 0px; }`
    })
}


export{
    downloadByJson,
    printByJson,
    printById
}

<think>好的,我现在需要帮助用户设计一个基于Java的学生成绩管理信息系统,包括数据库结构定义和功能实现。首先,我得仔细分析用户的需求,确保所有提到的功能都被覆盖。用户提到了要使用MySQL创建包含学生基本信息和多科目成绩的表结构,同时需要实现查询排序、增删改操作,以及统计功能如最高最低分、优秀率和不及格率等。 首先,数据库设计是关键。用户需要学生基本信息表和成绩表。学生表可能包括学号、姓名、班级等字段。成绩表则需要关联学生和科目,可能需要科目表和班级表的支持。这里要注意规范化,避免数据冗余。比如,科目单独成表,成绩表用外键关联学生和科目,这样方便扩展和管理。 接下来是功能实现部分。用户需要按姓名、学号、班级、课程查询,这涉及到多表连接查询,比如JOIN学生表和成绩表,再关联科目表。排序功能如单科成绩、总分、平均分以及学号排序,可能需要动态生成SQL的ORDER BY子句,根据用户选择的排序字段进行调整。 增删改操作需要基本的CRUD功能,Java中可以用JDBC或者ORM框架如Hibernate、MyBatis来简化数据库操作。统计功能比较复杂,比如每门课的最高最低分及其对应学生信息,可能需要子查询或者窗口函数。优秀率和不及格率需要计算比例,SQL中可以用COUNT结合CASE语句来实现,然后Java中进行处理计算百分比。 用户可能没有明确提到的点包括用户权限管理,比如教师和学生有不同的操作权限,这在系统设计时需要考虑,比如不同的登录界面和功能菜单。另外,数据的一次性导入导出功能,可能需要处理Excel或CSV文件,使用Apache POI或OpenCSV库来实现。 在技术选型方面,前端可以用Swing或JavaFX,但考虑到现代趋势,可能更推荐使用Spring Boot构建后端,Vue或React做前端,但用户明确要求基于Java,可能需要用Swing做GUI。不过引用[2]提到使用了Swing GUI工具包,所以可能用户希望用Swing实现界面。 数据库连接方面,需要使用JDBC驱动连接MySQL,确保正确的依赖配置,比如mysql-connector-java。事务管理在增删改操作中很重要,特别是删除学生信息时,需要级联删除相关成绩记录,或者在数据库设计中设置外键的级联操作。 在统计功能中,计算优秀率和不及格率可能需要先定义优秀和不及格的分数标准,比如优秀是>=90,不及格是<60。然后通过SQL查询每班每科符合条件的记录数,除以总人数得到比率。这部分可能需要分组查询和聚合函数的使用。 另外,系统的性能要求,比如处理大量数据时的响应速度,可能需要索引优化,比如在学号、班级、科目等字段上创建索引,提高查询效率。 测试阶段需要覆盖各个功能模块,特别是边界情况,如输入非法数据、重复学号等,确保系统的健壮性。引用[2]中提到编程中遇到的粗心问题,提醒我要注意代码的严谨性,比如异常处理、输入验证等。 最后,部署和文档编写也是重要部分,确保用户能够顺利安装和使用系统,同时提供必要的技术文档和维护指南。</think>根据需求,我们将从数据库设计、功能实现、技术选型三个层面分步骤解析学生成绩管理系统的开发流程: 一、数据库设计(MySQL) 1. 学生信息表(student) ```sql CREATE TABLE student ( stu_id VARCHAR(20) PRIMARY KEY COMMENT &#39;学号&#39;, name VARCHAR(50) NOT NULL COMMENT &#39;姓名&#39;, gender ENUM(&#39;男&#39;,&#39;女&#39;) COMMENT &#39;性别&#39;, birthdate DATE COMMENT &#39;出生日期&#39;, class_id VARCHAR(20) NOT NULL COMMENT &#39;班级编号&#39;, contact VARCHAR(50) COMMENT &#39;联系方式&#39; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 2. 课程表(course) ```sql CREATE TABLE course ( course_id INT AUTO_INCREMENT PRIMARY KEY COMMENT &#39;课程ID&#39;, course_name VARCHAR(50) NOT NULL COMMENT &#39;课程名称&#39;, credit DECIMAL(3,1) NOT NULL COMMENT &#39;学分&#39; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 3. 成绩表(score) ```sql CREATE TABLE score ( score_id INT AUTO_INCREMENT PRIMARY KEY, stu_id VARCHAR(20) NOT NULL, course_id INT NOT NULL, score DECIMAL(5,2) CHECK (score BETWEEN 0 AND 100), exam_date DATE, FOREIGN KEY (stu_id) REFERENCES student(stu_id) ON DELETE CASCADE, FOREIGN KEY (course_id) REFERENCES course(course_id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 二、功能实现要点(Java) 1. 数据库连接层 ```java public class DBUtil { private static final String URL = "jdbc:mysql://localhost:3306/score_db?useSSL=false"; private static final String USER = "root"; private static final String PASSWORD = "123456"; public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } } ``` 2. 核心功能实现示例(成绩统计) ```java public class ScoreStatistics { // 统计单科优秀率(>=90分) public double getExcellentRate(String courseId) { String sql = "SELECT (SUM(CASE WHEN score >= 90 THEN 1 ELSE 0 END) / COUNT(*)) * 100 " + "FROM score WHERE course_id = ?"; try (Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, courseId); ResultSet rs = pstmt.executeQuery(); return rs.next() ? rs.getDouble(1) : 0.0; } catch (SQLException e) { e.printStackTrace(); return 0.0; } } // 班级课程排名 public List<StudentScore> getClassRanking(String classId, String courseId) { String sql = "SELECT s.name, sc.score FROM score sc " + "JOIN student s ON sc.stu_id = s.stu_id " + "WHERE s.class_id = ? AND sc.course_id = ? " + "ORDER BY sc.score DESC"; // 执行查询并封装结果集 } } ``` 三、系统架构建议 1. 分层架构设计: - 表现层:Swing/JFX GUI界面 - 业务逻辑层:成绩计算、统计逻辑 - 数据访问层:DAO模式操作数据库 2. 关键技术选型: - JDBC连接MySQL数据库 - Apache Commons CSV处理数据导入导出 - JFreeChart生成统计图表 - Log4j日志记录 3. 安全设计: ```java // 密码加密存储示例 public static String encryptPassword(String password) { return BCrypt.hashpw(password, BCrypt.gensalt()); } // 登录验证 public boolean validateUser(String username, String password) { // 查询数据库获取加密密码 return BCrypt.checkpw(inputPassword, storedHash); } ``` 四、统计功能实现进阶 ```sql -- 各班各科优秀率统计 SELECT s.class_id, c.course_name, COUNT(CASE WHEN sc.score >= 90 THEN 1 END)*100.0/COUNT(*) AS excellent_rate, COUNT(CASE WHEN sc.score < 60 THEN 1 END)*100.0/COUNT(*) AS fail_rate FROM score sc JOIN student s ON sc.stu_id = s.stu_id JOIN course c ON sc.course_id = c.course_id GROUP BY s.class_id, c.course_id ORDER BY excellent_rate DESC; ``` 五、系统优化建议 1. 建立索引提升查询性能: ```sql CREATE INDEX idx_student_class ON student(class_id); CREATE INDEX idx_score_course ON score(course_id); ``` 2. 使用数据库连接池(如HikariCP) 3. 实现分页查询处理大数据量 4. 加事务处理保证数据一致性
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值