- 开发避坑短篇(7):Vue+window.print()打印实践
帧栈
避坑指南vue.js前端elementui
需求vue项目中如何打印当前页面内容?解决办法使用浏览器原生APIwindow.print(),这是最简单直接的方式,通过调用window.print()方法触发浏览器打印功能。在vue项目中直接调用print()方法即可,无须引入任何插件。如下:functionhandlePrint(){setTimeout(_=>print(),500)}打印页面样式控制可以使用@mediaprint来控制
- 从手写 Promise 到 Event Loop:前端异步面试题全解读
你真的搞懂了JS的异步吗?面试官一个“nextTick和微任务的区别”,别说新手,连三年经验的工程师也常答不上来。开场:异步机制,就是面试里的“送命题”你是不是也有过这样的经历:“你能手写一个Promise吗?”“你知道async/await背后是怎么工作的?”“setTimeout(fn,0)一定最先执行吗?”听起来是基础题,但很多人答得云里雾里。异步是JS的灵魂,但也因为它涉及事件循环、任务队
- Promise的allSettled,all,race
大猫会长
前端
下列代码证实了:无论是for或是forof循环,都会等上一个请求彻底完成,才会开始下一个//模拟一个获取用户数据的api请求functionfetchUser(id){returnnewPromise(resolve=>{setTimeout(()=>{console.log(`获取到用户${id}`);//模拟网络请求resolve({id:id,name:`用户${id}`});},1000)
- 如何实现打印功能
代码续发
Vue前端
一、AI赋能提供思路基本框架退货单打印内容exportdefault{methods:{handlePrint(){//临时显示打印内容document.getElementById('print-container').style.display='block';//调用打印window.print();//打印完成后隐藏(需延迟执行,确保打印已触发)setTimeout(()=>{docume
- el-select移动端唤不出软键盘
汪叽家的兔子羡
elementuivuejavascript前端
一、场景:移动端使用elementUI,select组件点击未唤起软键盘二、原因:el-select组件在移动端会默认加上readonly属性在ElementPlus中已经优化了该问题三、解决办法:获取对应select组件,手动移除readonly属性,代码如下:clear(async){this.$nextTick(()=>{if(!async){//ios手机有延迟问题setTimeout((
- Promise入门
m0dw
javascript前端开发语言
文章目录为什么使用PromisePromise介绍为什么使用Promise在ES5中使用回调函数来处理异步任务,当多个异步任务有依赖关系时(如下定时器的层层嵌套),就需要回调函数互相嵌套,当嵌套结构多了后,就出现了回调地狱的问题,难以维护setTimeout(function(){console.log('a1');setTimeout(function(){console.log('a2');s
- 2019-05-16
海牙kyogre
前端优化动画性能之requestAnimationFrame@(技术分享)在前端做动画很多人第一人的反应是用定时器,比如setInterval、setTimeout,除此之外css3可以使用transition和animation来实现。而编写动画循环的关键是要知道延迟时间多长合适。一方面,循环间隔必须足够短,这样才能让不同的动画效果显得平滑流畅;另一方面,循环间隔还要足够长,这样才能确保浏览器有
- 记一次错:bind() 和 call() 一起用就懵逼了
写代码的海怪
今天看到一篇博客是讲怎么用bind()的。大家都知道讲bind()嘛,不就是绑定this这个鬼东西嘛,然后在setTimeout里用用就好了。哎,我也是这么想的,直到看到最后一个例子:因为NodeList原型不是Array,所以要用forEach的话,我们可以从Array.prototype里把forEach偷过来用。varunboundForEach=Array.prototype.forEac
- JavaScript知识归纳——面试题
Dream_Lee_1997
JavaScriptjs面试题
JavaScript面试题总结JavaScript知识点1、JavaScript中settimeout与setinteval两个函数的区别?2、编写JavaScript脚本生成1-6之间的整数?3、在JavaScript脚本中,isNaN的作用是什么?4、JavaScript中获取某个元素有哪几种方式?5、Ajax的优缺点都有什么?6、简述一下Ajax的工作原理。7、JavaScript中的数据类
- 双击重复请求的方法
北北~Simple
vue2vue
1、限制点击次数2、vue中可以自定义一个属性指令preventReClick.js中定义:importVuefrom'vue'Vue.directive('preventReClick',{inserted:(el,binding)=>{el.addEventListener('click',()=>{if(!el.disabled){el.disabled=truesetTimeout(()=
- 【JavaScript】setTimeout和setInterval中的陷阱
秀秀_heo
JavaScriptjavascript前端vue.js
✅一、核心区别回顾setTimeout(fn,delay)//delay毫秒后执行fn,一次setInterval(fn,delay)//每隔delay毫秒执行fn,循环执行⚠️二、常见陷阱和注意事项1.定时不准(延时不准确)现象:你设置了setTimeout(fn,1000),但实际执行时间可能远远大于1000ms。原因:JavaScript是单线程的,setTimeout和setInterva
- 深入浅出JavaScript定时器:掌握异步编程的核心工具
coding随想
JavaScriptjavascript开发语言ecmascript
深入浅出JavaScript定时器:掌握异步编程的核心工具在前端开发中,JavaScript定时器是一个看似简单却功能强大的工具。它不仅是实现延时操作和周期性任务的基础,更是理解JavaScript事件循环机制的关键。本文将带你全面了解JavaScript定时器的原理、用法以及最佳实践。一、什么是JavaScript定时器?JavaScript定时器是通过setTimeout和setInterva
- 【JavaScript 事件循环实战解析】
Gazer_S
jsjavascript开发语言ecmascript
JavaScript事件循环实战解析引言JavaScript的事件循环机制是理解异步编程的关键。本文通过实际代码示例和详细解析,帮助你掌握事件循环的工作原理,准确预测代码执行顺序。事件循环基础JavaScript是单线程语言,通过事件循环处理异步操作。事件循环由以下几个关键部分组成:调用栈(CallStack):执行同步代码宏任务队列(MacrotaskQueue):存放setTimeout等AP
- 微信小程序在用户拒绝授权后无法使用wx.opensetting再次获取定位授权
一渊之隔
jQuery微信小程序微信小程序小程序
_getLocation(callback,errCall){if(app.globalData.isLocationIng){setTimeout(()=>{this._getLocation(callback);},100);return;}app.globalData.isLocationIng=true;wx.getSetting({success:(resData)=>{//检查永久拒绝
- JavaScript 异步编程的几种方式
在JavaScript中,异步编程是处理延迟操作(如网络请求、文件读写等)的关键技术,确保用户界面保持响应同时处理后台任务。以下是几种主要的异步编程解决方案,包括示例代码:1.回调(Callback)简介:最早的异步处理方式,通过将一个函数(回调函数)作为参数传递给另一个函数,在异步操作完成后执行回调。示例代码:functionfetchData(callback){setTimeout(()=>
- vue 防抖节流
浮桥
scsstypescriptvue.js
//防抖一定时间内事件只执行一次exportfunction_debounce(fn,delay){vardelay=delay||200;vartimer;returnfunction(){varth=this;varargs=arguments;if(timer){clearTimeout(timer);}timer=setTimeout(function(){timer=null;fn.ap
- Vue 防抖节流函数与指令
qq_36193912
Vuevue.jsjavascriptecmascript
直接上代码:/***防抖*@param{*}func*@param{*}wait*@returns*/functiondebounce(func,wait=300){lettimeout;returnfunction(...args){constcontext=this;clearTimeout(timeout);timeout=setTimeout(()=>{func.apply(context
- 事件循环(Event Loop)机制对比:Node.js vs 浏览器
1.共同点:基本事件循环模型两者都基于"任务队列+循环处理"的机制:主线程执行同步代码。异步任务(如I/O、定时器)完成后,回调函数被放入任务队列。事件循环不断检查队列,按规则取出任务执行。2.核心区别(1)任务队列类型不同浏览器Node.js宏任务(Macrotask):•script(整体代码)•setTimeout/setInterval•DOM事件回调(如点击)•requestAnimat
- JavaScript 事件循环竟还能这样玩!
前端javascript
JavaScript是一种单线程的编程语言,这意味着它一次只能执行一个任务。为了能够处理异步操作,JavaScript使用了一种称为事件循环(EventLoop)的机制。本文将深入探讨事件循环的工作原理,并展示如何基于这一原理实现一个更为准确的setTimeout、setInterval什么是事件循环?事件循环是JavaScript运行时环境中处理异步操作的核心机制。它允许JavaScript在执
- JavaScript中,异步获取数据通常使用回调函数
貂蝉空大
JavaScript前端javascript开发语言
在JavaScript中,异步获取数据通常使用回调函数、Promise对象或者async/await来处理。以下是几种常见的方法:1.回调函数:可以在异步请求完成后,将获取到的数据作为参数传递给回调函数。例如:functiongetData(callback){ //异步请求数据 setTimeout(function(){ constdata='这是获取到的数据'; callback(dat
- selenium弹框元素定位-冻结界面
测开成长笔记
selenium
有些网站上面的元素,我们鼠标放在上面,会动态弹出一些内容。但是当我们的鼠标从音乐图标移开,这个栏目就整个消失了,就没法查看其对应的HTML。怎么办?在开发者工具栏console里面执行如下js代码:setTimeout(function(){debugger},5000)这句代码什么意思呢?表示在5000毫秒后,执行debugger命令执行该命令浏览器会进入debug状态。debug状态有个特性,
- 【前端怪谈】为什么要用setTimeout模拟setInterval
hhhhhhhssss
技术文章前端怪谈js前端
文章目录前言一、setInterval存在的问题1.问题复现2.问题分析二、setInterval缺点及setTimeout1.setInterval缺点2.为什么setTimeout能取代setTimeout实现setInterval总结前言大家都知道,setTimeout是延迟执行函数,而setInterval就像一个定时器,每间隔一定时间就触发一次回调。今日面试中,面试官问了我一个问题,为什
- JavaScript 中的计时器(如 setTimeout 和 setInterval)无法做到精确计时,如何做?
GISer_Jinger
前端基础javascript开发语言ecmascript
JavaScript中的计时器(如setTimeout和setInterval)无法做到精确计时,这是由JavaScript的单线程运行机制、事件循环(EventLoop)的调度策略以及操作系统的底层限制共同决定的。以下是具体原因:⏱️核心原因分析单线程阻塞(MainThreadBlocking)JavaScript是单线程语言,所有任务(包括计时器回调)共享同一个主线程。如果主线程被其他任务(如
- 解决微信小程序渲染层网络层错误 Failed to load media
学途路漫漫
小程序控制台报错处理微信小程序小程序
微信小程序引入网络视频的时候:出现渲染层网络层错误Failedtoloadmedia给组件加入autoplay后错误消失,但是一进入页面就播放不是我想要的效果添加下面代码:setTimeout(()=>{wx.createVideoContext('myVideo').pause();},200)一进来就自动播放趁他没反应过来在Load()中添加如上代码把他暂停。
- lua udp mysql_lua - UDP
EthicalML
luaudpmysql
UDPsocket.udp()创建并返回一个无连接的UDP对象。该无连接对象支持以下函数:sendto、receive、receivefrom、getsockname、setoption、settimeout、setpeername、setsockname、close。其中的setpeername被用作连接对象(待解释)。connected:close()unconnected:close()关闭
- 第九节 高频代码题-实现Sleep函数(异步控制)
泽泽爱旅行
TypeScript前端javascripttypescript
⚙️一、基础实现方案1.Promise+setTimeout标准实现functionsleep(ms:number):Promise{returnnewPromise(resolve=>setTimeout(resolve,ms));}原理:返回一个Promise对象,在指定毫秒(ms)后调用resolve结束等待。通过setTimeout实现异步调度,避免阻塞主线程。2.使用示例(async/a
- linux watchdog
xuanwojiuxin
linux
devm_watchdog_register_devicewatchdog_register_device__watchdog_register_devicewatchdog_dev_registerwatchdog_cdev_registerfd=open/dev/watchdogioctlsettimeout--->ops->set_timeoutwhile(1)writefd--->ops-
- vue的这两个特性:数据驱动视图 与 双向数据绑定的区别
WZMeiei
Web前端javascriptvue.js前端
目录一、概念本质二、作用范围三、实现原理一句话总结一、概念本质数据驱动视图(更宽泛的思想)是Vue等框架的底层逻辑:数据变了,视图自动更新。只要数据(如data里的变量)修改,框架会自动找到对应的DOM并更新,开发者不用手动操作DOM。比如://Vue里数据变了,视图自动更新data(){return{msg:'你好'}},mounted(){//1秒后修改数据setTimeout(()=>{th
- try...catch可以捕获到异步代码中的错误吗
程序员流年大运
JavaScriptjavascript前端
在JavaScript中,try...catch的错误捕获能力取决于异步代码的实现方式。以下是详细分析:一、基本结论异步场景try...catch是否能捕获错误?Promise内部错误❌不能直接捕获,需配合.catch()async/await错误✅可以捕获(使用await时)setTimeout/setInterval❌不能捕获(回调在新执行上下文中)事件监听回调❌不能捕获(回调在新执行上下文中
- js : uniapp 同步
FakeOccupational
服务化&架构javascript前端开发语言
JavaScriptPromise对象varmyFirstPromise=newPromise(function(resolve,reject){//当异步代码执行成功时,我们才会调用resolve(...),当异步代码失败时就会调用reject(...)//在本例中,我们使用setTimeout(...)来模拟异步代码,实际编码时可能是XHR请求或是HTML5的一些API方法.setTimeou
- jQuery 跨域访问的三种方式 No 'Access-Control-Allow-Origin' header is present on the reque
qiaolevip
每天进步一点点学习永无止境跨域众观千象
XMLHttpRequest cannot load http://v.xxx.com. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access. test.html:1
- mysql 分区查询优化
annan211
java分区优化mysql
分区查询优化
引入分区可以给查询带来一定的优势,但同时也会引入一些bug.
分区最大的优点就是优化器可以根据分区函数来过滤掉一些分区,通过分区过滤可以让查询扫描更少的数据。
所以,对于访问分区表来说,很重要的一点是要在where 条件中带入分区,让优化器过滤掉无需访问的分区。
可以通过查看explain执行计划,是否携带 partitions
- MYSQL存储过程中使用游标
chicony
Mysql存储过程
DELIMITER $$
DROP PROCEDURE IF EXISTS getUserInfo $$
CREATE PROCEDURE getUserInfo(in date_day datetime)-- -- 实例-- 存储过程名为:getUserInfo-- 参数为:date_day日期格式:2008-03-08-- BEGINdecla
- mysql 和 sqlite 区别
Array_06
sqlite
转载:
http://www.cnblogs.com/ygm900/p/3460663.html
mysql 和 sqlite 区别
SQLITE是单机数据库。功能简约,小型化,追求最大磁盘效率
MYSQL是完善的服务器数据库。功能全面,综合化,追求最大并发效率
MYSQL、Sybase、Oracle等这些都是试用于服务器数据量大功能多需要安装,例如网站访问量比较大的。而sq
- pinyin4j使用
oloz
pinyin4j
首先需要pinyin4j的jar包支持;jar包已上传至附件内
方法一:把汉字转换为拼音;例如:编程转换后则为biancheng
/**
* 将汉字转换为全拼
* @param src 你的需要转换的汉字
* @param isUPPERCASE 是否转换为大写的拼音; true:转换为大写;fal
- 微博发送私信
随意而生
微博
在前面文章中说了如和获取登陆时候所需要的cookie,现在只要拿到最后登陆所需要的cookie,然后抓包分析一下微博私信发送界面
http://weibo.com/message/history?uid=****&name=****
可以发现其发送提交的Post请求和其中的数据,
让后用程序模拟发送POST请求中的数据,带着cookie发送到私信的接入口,就可以实现发私信的功能了。
- jsp
香水浓
jsp
JSP初始化
容器载入JSP文件后,它会在为请求提供任何服务前调用jspInit()方法。如果您需要执行自定义的JSP初始化任务,复写jspInit()方法就行了
JSP执行
这一阶段描述了JSP生命周期中一切与请求相关的交互行为,直到被销毁。
当JSP网页完成初始化后
- 在 Windows 上安装 SVN Subversion 服务端
AdyZhang
SVN
在 Windows 上安装 SVN Subversion 服务端2009-09-16高宏伟哈尔滨市道里区通达街291号
最佳阅读效果请访问原地址:http://blog.donews.com/dukejoe/archive/2009/09/16/1560917.aspx
现在的Subversion已经足够稳定,而且已经进入了它的黄金时段。我们看到大量的项目都在使
- android开发中如何使用 alertDialog从listView中删除数据?
aijuans
android
我现在使用listView展示了很多的配置信息,我现在想在点击其中一条的时候填出 alertDialog,点击确认后就删除该条数据,( ArrayAdapter ,ArrayList,listView 全部删除),我知道在 下面的onItemLongClick 方法中 参数 arg2 是选中的序号,但是我不知道如何继续处理下去 1 2 3
- jdk-6u26-linux-x64.bin 安装
baalwolf
linux
1.上传安装文件(jdk-6u26-linux-x64.bin)
2.修改权限
[root@localhost ~]# ls -l /usr/local/jdk-6u26-linux-x64.bin
3.执行安装文件
[root@localhost ~]# cd /usr/local
[root@localhost local]# ./jdk-6u26-linux-x64.bin&nbs
- MongoDB经典面试题集锦
BigBird2012
mongodb
1.什么是NoSQL数据库?NoSQL和RDBMS有什么区别?在哪些情况下使用和不使用NoSQL数据库?
NoSQL是非关系型数据库,NoSQL = Not Only SQL。
关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。
在处理非结构化/半结构化的大数据时;在水平方向上进行扩展时;随时应对动态增加的数据项时可以优先考虑使用NoSQL数据库。
在考虑数据库的成熟
- JavaScript异步编程Promise模式的6个特性
bijian1013
JavaScriptPromise
Promise是一个非常有价值的构造器,能够帮助你避免使用镶套匿名方法,而使用更具有可读性的方式组装异步代码。这里我们将介绍6个最简单的特性。
在我们开始正式介绍之前,我们想看看Javascript Promise的样子:
var p = new Promise(function(r
- [Zookeeper学习笔记之八]Zookeeper源代码分析之Zookeeper.ZKWatchManager
bit1129
zookeeper
ClientWatchManager接口
//接口的唯一方法materialize用于确定那些Watcher需要被通知
//确定Watcher需要三方面的因素1.事件状态 2.事件类型 3.znode的path
public interface ClientWatchManager {
/**
* Return a set of watchers that should
- 【Scala十五】Scala核心九:隐式转换之二
bit1129
scala
隐式转换存在的必要性,
在Java Swing中,按钮点击事件的处理,转换为Scala的的写法如下:
val button = new JButton
button.addActionListener(
new ActionListener {
def actionPerformed(event: ActionEvent) {
- Android JSON数据的解析与封装小Demo
ronin47
转自:http://www.open-open.com/lib/view/open1420529336406.html
package com.example.jsondemo;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
impor
- [设计]字体创意设计方法谈
brotherlamp
UIui自学ui视频ui教程ui资料
从古至今,文字在我们的生活中是必不可少的事物,我们不能想象没有文字的世界将会是怎样。在平面设计中,UI设计师在文字上所花的心思和功夫最多,因为文字能直观地表达UI设计师所的意念。在文字上的创造设计,直接反映出平面作品的主题。
如设计一幅戴尔笔记本电脑的广告海报,假设海报上没有出现“戴尔”两个文字,即使放上所有戴尔笔记本电脑的图片都不能让人们得知这些电脑是什么品牌。只要写上“戴尔笔
- 单调队列-用一个长度为k的窗在整数数列上移动,求窗里面所包含的数的最大值
bylijinnan
java算法面试题
import java.util.LinkedList;
/*
单调队列 滑动窗口
单调队列是这样的一个队列:队列里面的元素是有序的,是递增或者递减
题目:给定一个长度为N的整数数列a(i),i=0,1,...,N-1和窗长度k.
要求:f(i) = max{a(i-k+1),a(i-k+2),..., a(i)},i = 0,1,...,N-1
问题的另一种描述就
- struts2处理一个form多个submit
chiangfai
struts2
web应用中,为完成不同工作,一个jsp的form标签可能有多个submit。如下代码:
<s:form action="submit" method="post" namespace="/my">
<s:textfield name="msg" label="叙述:">
- shell查找上个月,陷阱及野路子
chenchao051
shell
date -d "-1 month" +%F
以上这段代码,假如在2012/10/31执行,结果并不会出现你预计的9月份,而是会出现八月份,原因是10月份有31天,9月份30天,所以-1 month在10月份看来要减去31天,所以直接到了8月31日这天,这不靠谱。
野路子解决:假设当天日期大于15号
- mysql导出数据中文乱码问题
daizj
mysql中文乱码导数据
解决mysql导入导出数据乱码问题方法:
1、进入mysql,通过如下命令查看数据库编码方式:
mysql> show variables like 'character_set_%';
+--------------------------+----------------------------------------+
| Variable_name&nbs
- SAE部署Smarty出现:Uncaught exception 'SmartyException' with message 'unable to write
dcj3sjt126com
PHPsmartysae
对于SAE出现的问题:Uncaught exception 'SmartyException' with message 'unable to write file...。
官方给出了详细的FAQ:http://sae.sina.com.cn/?m=faqs&catId=11#show_213
解决方案为:
01
$path
- 《教父》系列台词
dcj3sjt126com
Your love is also your weak point.
你的所爱同时也是你的弱点。
If anything in this life is certain, if history has taught us anything, it is
that you can kill anyone.
不顾家的人永远不可能成为一个真正的男人。 &
- mongodb安装与使用
dyy_gusi
mongo
一.MongoDB安装和启动,widndows和linux基本相同
1.下载数据库,
linux:mongodb-linux-x86_64-ubuntu1404-3.0.3.tgz
2.解压文件,并且放置到合适的位置
tar -vxf mongodb-linux-x86_64-ubun
- Git排除目录
geeksun
git
在Git的版本控制中,可能有些文件是不需要加入控制的,那我们在提交代码时就需要忽略这些文件,下面讲讲应该怎么给Git配置一些忽略规则。
有三种方法可以忽略掉这些文件,这三种方法都能达到目的,只不过适用情景不一样。
1. 针对单一工程排除文件
这种方式会让这个工程的所有修改者在克隆代码的同时,也能克隆到过滤规则,而不用自己再写一份,这就能保证所有修改者应用的都是同一
- Ubuntu 创建开机自启动脚本的方法
hongtoushizi
ubuntu
转载自: http://rongjih.blog.163.com/blog/static/33574461201111504843245/
Ubuntu 创建开机自启动脚本的步骤如下:
1) 将你的启动脚本复制到 /etc/init.d目录下 以下假设你的脚本文件名为 test。
2) 设置脚本文件的权限 $ sudo chmod 755
- 第八章 流量复制/AB测试/协程
jinnianshilongnian
nginxluacoroutine
流量复制
在实际开发中经常涉及到项目的升级,而该升级不能简单的上线就完事了,需要验证该升级是否兼容老的上线,因此可能需要并行运行两个项目一段时间进行数据比对和校验,待没问题后再进行上线。这其实就需要进行流量复制,把流量复制到其他服务器上,一种方式是使用如tcpcopy引流;另外我们还可以使用nginx的HttpLuaModule模块中的ngx.location.capture_multi进行并发
- 电商系统商品表设计
lkl
DROP TABLE IF EXISTS `category`; -- 类目表
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `category` (
`id` int(11) NOT NUL
- 修改phpMyAdmin导入SQL文件的大小限制
pda158
sqlmysql
用phpMyAdmin导入mysql数据库时,我的10M的
数据库不能导入,提示mysql数据库最大只能导入2M。
phpMyAdmin数据库导入出错: You probably tried to upload too large file. Please refer to documentation for ways to workaround this limit.
- Tomcat性能调优方案
Sobfist
apachejvmtomcat应用服务器
一、操作系统调优
对于操作系统优化来说,是尽可能的增大可使用的内存容量、提高CPU的频率,保证文件系统的读写速率等。经过压力测试验证,在并发连接很多的情况下,CPU的处理能力越强,系统运行速度越快。。
【适用场景】 任何项目。
二、Java虚拟机调优
应该选择SUN的JVM,在满足项目需要的前提下,尽量选用版本较高的JVM,一般来说高版本产品在速度和效率上比低版本会有改进。
J
- SQLServer学习笔记
vipbooks
数据结构xml
1、create database school 创建数据库school
2、drop database school 删除数据库school
3、use school 连接到school数据库,使其成为当前数据库
4、create table class(classID int primary key identity not null)
创建一个名为class的表,其有一