天刷到了一個(gè)這樣的短視頻,我尋思我是不是也可以寫一個(gè)類似的上課點(diǎn)名程序,想法經(jīng)不起等待,說寫就寫~
私信小編01即可獲取大量Python學(xué)習(xí)資源
Tkinter 是 python 內(nèi)置的 TK GUI 工具集。TK 是 Tcl 語(yǔ)言的原生 GUI 庫(kù)。作為 python 的圖形設(shè)計(jì)工具,它所使用的 Tcl 語(yǔ)言環(huán)境已經(jīng)完全嵌入到了 python 解釋器中。
我們使用Tkinter開發(fā)GUI界面。
PIL(Python Image Library)庫(kù)是Python語(yǔ)言的第三方庫(kù),需要通過pip工具安裝。安裝PIL庫(kù)的方法如下,需要注意,安裝庫(kù)的名字是pillow。
PIL庫(kù)支持圖像儲(chǔ)存、顯示和處理,他能夠處理幾乎所有圖片格式,可以完成對(duì)圖像的縮放、剪裁、疊加以及向圖像添加線條、圖像和文字等操作。
使用PIL中的Image,ImageTk處理、引入一張圖片,可以使用下面代碼安裝一下。
pip install pillow
雙擊打開后,進(jìn)入軟件主界面,所有功能一目了然。程序會(huì)自動(dòng)識(shí)別軟件目錄下的names.txt,將里面的名字導(dǎo)入。
選擇順序點(diǎn)名后,點(diǎn)擊開始,屏幕上就開始滾動(dòng)出現(xiàn)人名,人名出現(xiàn)的概率是相同的,點(diǎn)擊停止,人名就停止?jié)L動(dòng),點(diǎn)名結(jié)束。
點(diǎn)擊隨機(jī)點(diǎn)名,程序就會(huì)進(jìn)行隨機(jī)點(diǎn)名,人名出現(xiàn)的概率是隨機(jī)的。
可以自己手動(dòng)選擇人名單,前提是人名單格式為txt,且每個(gè)名字占一行。
用Pyqt5也寫了一個(gè)版本,實(shí)現(xiàn)邏輯與TK版本相同,界面可能更好看了一些,但是文件大了許多,大家可以在后面總結(jié)部分自取。
import random
import re
import time
import threading
from tkinter import *
from tkinter import ttk
from base64 import b64decode
from PIL import Image,ImageTk
from tkinter import messagebox
from tkinter.filedialog import askopenfilename
""""
2021-11-10點(diǎn)名/抽獎(jiǎng)程序
主要亮點(diǎn):
1.兩種模式:
①順序點(diǎn)名
②隨機(jī)點(diǎn)名
2.自動(dòng)識(shí)別人名單
3.支持手動(dòng)導(dǎo)入人名單
4.人名單導(dǎo)入校驗(yàn)
5.人名顯示位置自動(dòng)矯正
6.最多顯示五個(gè)大字
"""
imgs=['./point_name.png']
class APP:
def __init__(self):
self.root = Tk()
self.running_flag=False #開始標(biāo)志
self.time_span=0.05 #名字顯示間隔
self.root.title('Point_name-V1.0')
width = 680
height = 350
left = (self.root.winfo_screenwidth() - width) / 2
top = (self.root.winfo_screenheight() - height) / 2
self.root.geometry("%dx%d+%d+%d" % (width, height, left, top))
self.root.resizable(0,0)
self.create_widget()
self.set_widget()
self.place_widget()
self.root.mainloop()
def create_widget(self):
self.label_show_name_var=StringVar()
self.label_show_name=ttk.Label(self.root,textvariable=self.label_show_name_var,font=('Arial', 100,"bold"),foreground = '#1E90FF')
self.btn_start=ttk.Button(self.root,text="開始",)
self.btn_load_names=ttk.Button(self.root,text="手動(dòng)加載人名單",)
self.lf1=ttk.LabelFrame(self.root,text="點(diǎn)名方式")
self.radioBtn_var=IntVar()
self.radioBtn_var.set(1)
self.radioBtn_sequence=ttk.Radiobutton(self.lf1,text="順序點(diǎn)名",variable=self.radioBtn_var, value=1)
self.radioBtn_random=ttk.Radiobutton(self.lf1,text="隨機(jī)點(diǎn)名",variable=self.radioBtn_var, value=2)
self.label_show_name_num=ttk.Label(self.root,font=('Arial', 20),foreground = '#FF7F50')
paned = PanedWindow(self.root)
self.img = imgs
img_=b'iVBORw0KGgoAAAANSUhEUgAAALQAAAB4CAIAAADUhU+qAAAACXBIWXMAAAsTAAALEwEAmpwYAAAgAElEQVR4nO196XNbx5Vvd9+LfSU2EgD3fRNJbZRkyVJseY9sP7scOy+ZTCqpVKXm8/wp+TA1X2amJjWZSXksy1Ik27IsWXIsRpK1kCIpLgBJkAAXrMQO3K3fh0O0rkBKkaONzvOJSwGBu3b/+uznNKaUoh/oyZB6bDHG2+RSD0/807mNmth7ql/ymbz8EyL2LvdbeH/bC245bk+UHgQOSik8x8O85P0eHb5XX4pSSghRX7Pq+nAwxhi+3zwWlFJFURBC7Dr3G68tv3/0UYYnZC91P8IYw3NSSjmO23zTv/okbPTYaz7NlXMXHJtf+AHTw05hn9kxVaewi9AKVX2z+Sz1uQ+4KaVUlmVUGTIGvs2j/52e/6/SZlg/4PqKokiSVPWQD39TgFfVuD1tzgGvUbWg2dPcj7b8VT09DAQIIVmWy+VyqVSSZVl9I/bmWq1Wr9drNJrNs7uZtbAVqYbFlkey5atmXewF1S/7kC+oZlqMC255uqIoq6urgUDAYrF0dnaaTKa/OqRVd69aP9/p9Eene8CBNjE6NUNDD4FZOB5YKLsmQkiW5ZWVlatXrwaDQUIIx3HqSVUURRAEo9F44MCBoaEhQgicxR4JnoHN8fr6+urqqt1udzqdWq2WUipJEntCRVFEUczn85IkAWthj8Fux54NY2w0Gu12u06ne/DbMSjALWRZhj8VRaliCer5m5mZ+dd//Ve/3/9P//RPzc3NVQdseRYDgSzLmUwmm80aDAan0wnDAndnQ/RXRdujEM+eEu4hy3I4HI7H436/v6amplQqlUolk8lEKZ2enl5eXsYYGwwGs9lss9lqamqsVqtWqyWEwKip51uNelEU79y58/vf/x5j/NZbbxmNRhhZODifz1+7du369euyLPf29vI8rx6pbDa7vLxMKYX5SyQSly5dmp2dfemllw4ePGg2m3meRwhxHMdmLhwOX7p0aXV1tVgsptPpQqFgNBoNBgOs8mKxuL6+Til1OBw2m627u/vIkSN1dXVMLWCkZoFAsiwrilIqlTDGOp1uM7tSLwmMsc1mk2X55s2bx48fr6+v12g0Wq3W4/F0dHTU1NSoeR4ATpZleLxIJBIMBgOBQKlU2r9//0svvWSxWAAW6oX6RAXNXc4BA5fNZr/44ouRkZF33323r69vZGQklUodPXrU4/Gk0+lIJCIIQrlczmazuVzOaDQODg4+99xzdXV1VaKkimRZTqfTsVisr6/v9ddft9vtsDgURVEUJZlMrq6ufv3118B11FeQJGlpaenMmTPz8/OCIFBKE4nE3NwcAGJubs5ut1utVrPZ3NnZ2dTUBG9hNBqbmppsNlsikRgbGwsEAkePHu3r6wM2Mz8//5e//CWfz//iF78YGhpyu916vf5hBgseeGlp6ZtvvnE4HLt373Y4HADKKimJKuzKZDLZbLY7d+4EAgGEEMZYFMVoNOrxeOx2OzA2WCSCIMzPz09PTweDweXl5WKxuLKyMj8/73K53G53Z2dnS0uLRqPhOE69eJ4o3eUc8D6ZTObOnTuxWIzn+Xw+/5e//GVxcbG/v7+5ufm5557bvXu3LMuFQiGVSt25c+fEiRNXrlyRZfntt9+G8QUeK4pisVhkiphWq5VlGd4KY8zzPMgRjUbD8zxw5mw2azQanU4nzLpau6yrq3v++efNZvPJkydnZ2e7urqOHTtmMpkY4HieN5lMdrvd5/NptVqO4zwej9PpxBgvLS19++23Kysr+/bte/PNNzUajaIoo6OjIyMjq6urO3fuPHz4MDCMzeIcljKsVIbjRCJx4sSJTz755NVXX+3t7c3lcuVyGdgSE6aCICwtLYVCIUqpKIrALVwu1wsvvACMhOM4h8Oh5p3AsD/77LNwOOxyufbs2ePz+QghoVAI+Mfvfve7/v7+5557rrOz02KxMGXriSqnPCAdYC7Lci6XW19fNxqNNptNr9frdLpcLlcoFBBCWq1Wq9UqimK1Wl0ulyAIBoNBPXzwrIqiBAKB8+fPz8zMZDIZs9m8c+fOgwcPMsgXCoXx8fErV6709/cfOnTIYDCUSqVUKlVTUwMciC0+JuaLxeLY2FipVHr33XePHTvW2dnJ83ypVCqXy8BpCSE1NTUg4EDnKBQKiqKsr68XCgVRFDOZTDKZBJgmEolisSgIwurqajAY1Gg0NpvNbrczjg0THAqF1tbWmpuba2pqQqHQ+vp6bW3t3Nzc2bNnLRbL0NCQ0WgcGxv78ssv3W73Sy+91NTUBCtEEITLly9/+OGH5XLZ7XZnMhmtVjs2NpbNZmEAGxsbDx8+3NPTA4ISyO12/+hHPyoUCjU1NbW1tSB5BwcHs9lsMBgcGRn54osvbt68+bOf/ezgwYNwIwYOtRbyRMCRTqeTyeTk5GQkEiGEzMzMxGKxVCqVSqVGR0fr6+ubm5vhmSRJCoVCJ0+eDAQChw8f3rVrF8wKu6jH4xkcHIxGo+fPn3e73Tt37uQ4Tq/XG41GhFCxWLx9+/bFixeNRuP+/fthtqLRqN1ud7vdbJnCjdbW1r766quPP/74xo0b3d3dr7/++t69e3U6nSzLqVRqbGzM7/f39PQwQwAoHA5fvnw5n8+vra0tLCwkk8k///nPqVSK4zhBEBYXFyORSC6X+/TTTycnJ81m8969e/fv328wGBgo8/n8119/febMmXfeeWdoaOjMmTMTExNHjhwJhULhcPjIkSM6nW5hYQGMkdOnTweDwX/8x3/s6ekBvlgqlRKJRGtr67vvvutyuUADK5fL4XD42rVrH330UTabra2tBfYAg2az2Twez6VLl65cudLU1NTa2gpqUKFQkCRJo9EQQnK5XC6Xo/c6jZ4c/9iQXuVy+dtvvx0ZGZmcnJyfn8cYnzp1ymazTU1NJZPJa9euNTY2ulwurVYrimIul5uamrp165Yoih6PBzCOVBaNyWRqaGjw+/0cx1mt1vr6ep7nLRZLR0cHsNNYLAbcGCEkiuLKykoymRwYGHA6neyFZVkOhULHjx+/fPmyLMtOp1NRlHw+v7CwUCwWC4XCyMjIf//3fw8PD7///vs+nw+ku8FgQAjpdDqbzYYxFgTBZrOtra3BrxqNRpIkURTNZjPG+PDhw3v37gWRBBKHUppMJuPx+MrKytTU1NTU1Llz55aWlm7dujU/P6/VakG3jUQi//Vf/wUMRpIkr9e7vLwcDAYbGhosFgvHcUajked5h8MBAgLmT5KkfD7v8/ng4Gg0Wltby8AB4+Z0Om/evHnu3Dmj0djf328ymRYXF2OxGMdx+/btO3ToUF9fH7wjw/ETtFbg0hzHeb3ePXv21NbWZrNZhND777/f3Nx8+vTpCxcuvP7660ePHrVarblc7saNG3Nzc7lczuFwzM3N/fGPf4zH4729vRazubGxsaW1VafTLS8vf/HFF+fPn0+lUqIonjhx4sUXX9y9e/evf/1rWFgrKyvZbHZmZubrr7/u7+/3eDwvv/zy0NAQQAd4gCAIIyMjExMTP/rRj3p7ez/88MNAILC8vLywsDA9PV0qlSKRSCQS+fOf/5zP510uV0tLy8svv9zS0sLzvM/nq62tlWUZpiGZTB4+fPiNN97gOE5RlOnp6YmJiVAo1NbW1tPTo9FoUEXnyGazN2/evHz5cjabDYfDAFCHw6HRaNLpdDQaffnll996662VlZVgMGgymfx+v9fr1ev1oih2dXUZDAYQnbW1tVarNZ1OF4tFeCNCiEajsVgsra2tPp9vbW1tbW0NTDOEkCRJYJ9LkuRwOBBCV65cuXLlik6nczqd3d3dnZ2dHo8nHo+HQiFYaVVOqScCDkCuXq/v7e3t6OhYXFycnp5eXFx0Op1tbW319fUwauA5YI4HvV4/MDDgcrlu3rz5xRdfpNNpn88nK0ptXZ1Op9PpdPX19fX19aCIDQwM+P1+i8Xi9/sppePj4+l0OpPJnD59emxs7J//+Z93797d3d1tMBhAJINmp9Vqd+3a1dLS0tbWJsuy3W4XBEFRlAMHDuzevbtcLo+Pj6+urur1+h07dvT09FgsFqvVyngsaLvlcjkajWq1WqfTqdfreZ6XJAmGFXQg8LigilNLr9d3d3e73W6tVjs1NVUqlfx+//vvvw+8ze/3HzhwwO/3nz59enJy0u12cxyXyWSA+c3MzLz99tsdHR2gQNTW1q6urk5MTGg0GngYEJe5XA6U/XQ6DUquLMtra2tff/317OysJEnRaHRtbc1msx0+fNjj8Wg0Gp1Ox/P8zMzM7du329rafvvb3/b09IC7CD2Er/JvBwf8H8YYzCS3293a2jo+Pj41NQUTJknSyMjI8vJya2vr0aNHDx06dOjQIUmSFEUJhUKlUmlxcfGNN97o6+szGo1ms5njOJfLNTw8nEqlzp8/jxCCN4/FYsPDw0ajMRqNFotFl8uVyWRisVg+n9dqtSaTSRTFeDyOMXY6nSBie3t7YdoSiQSYJ6IoNjY22mw2hJDFYjl37lwqlWppaXnxxRfV3g4QEKIoRiKRZDJps9lcLhcbSkmSACJgPdGKFxVcOK2tra2traIoUkq9Xm8mk4lGo7Is63S6+fn5CxcutLW1LS8v5/P5I0eOvPbaazqdbnFx8d/+7d+mp6Z6enqampp4nrfZbH6//9q1a7/73e98Ph9wFPDUlUqlmZkZvV7PfKxge3d1dbW2tlqt1tu3bweDQYvF8qtf/aqrq4t5X0ZGRkZHR6enp9PpNHoqTvS7sRUYHbPZ/MILL4RCoa+//jqVSoXD4UQiMTU11dra2tLSYjabdTodQkir1ebz+cXFxUQiMTg42N3dDYYGjPXCwsJnn3129epVm83mcDhyuZzVarXZbDqdDlZ8oVDYv39/Op0eHR0dHR11OBxmsxlu6vF4PvjgA7/fD7CAaeN53mq18jwP2lkqlcpkMrlczm63B4PB27dvd3R06HQ6kNnMaQE+pba2tra2Nr/fD5NBCNHr9bW1tcDhgOEjlebPpIDL5err67t69eqlS5f0ej3GOB6PX79+nRnboiiy4zUaDa/RwEV4nvd4PPv37x8ZGZmfn9fpdJ2dnT6fb3Jykuf5Xbt2uVwuq9Xa1NSEKoaGxWIZGBhACImiGAwGZVnmeR6sRWYDAv8ol8ssovT0wAEPodVqu7q6fvOb39y4cSOVSpXL5ebm5ra2tnfeeae5uVmn08G6RAjl8/loNLpjx47XXnvN7/fDkMFg2e12cI04nU63222z2YxGI3D1VCpls9kOHDjw4osvajSazz//PBKJnDhxQqvV5nK5UqnU1dWl1WoRQozhcxyn1Wqbm5v7+vpAHl+/fv3y5csgm9xu9/T09H/8x39oNJru7u6XXnoJTAAAwd69e9va2sxmM3AOWKYtLS2//e1vFUVpb28H5lFlCsIE19XVffDBBy+99BLP8xqNZmVlJRAI+Hy+zs7O69evLywsRKPRU6dOgaXtcDiGhobggoSQcrm8vLyczWYHBgZEUVxaWgLlZmVlZXh42O12g2UuSdLg4CAgj90aWFoul7t9+3Y8HgcuKEnSxMRENpt1u92wPmExM0/Jk8DKFuIKpGC5XBYEIRaLTU5OwigbjUZYyvBAYK2BEFEHJsClI0kSyHUWRmHWaTKZlCTJZrNxHJdOp7PZLPBbSilo+GBWqC8IZyWTSavV6nQ6V1dXo9EoOwtECULIarV6vV6j0QgPCTIePqvHDiQ93O4Bg8scX7gSWCiXy2zmkslkuVxmV9BoNCaTyWKxaDQaWZbHxsb+5V/+ZWFh4Ze//GU2m71y5cquXbs4jvvqq6/27dt38ODB27dvX7p0ac+ePT/72c9cLhd7BlmWZ2dnjx8/HggETCaT2l9MKbXZbLt27Tp48CCoO+zVnh44mL0AKBEEAdimeo5hyOBINkDsdOb7U487VUUQUEWNYj4chBAsdzhXrYqzuYSzwOKAU+AzXAQcssAJ4GrqkNiWY4e3CoLTewMl7AnxvdFz9qv6+nBAqVT67LPP/vCHPwCLslqt4XAYjNvl5eWamprGxkZJku7cuWM2m7u7u3U6HZzIUJjNZiF8zV4KdGcQNGzASYX+lpl/CHqQoqtUiL2/2nfJFCV1yK1qTNXfqFcAUs0BG2L1WVjlcq1awVX/0k1BjaoDHgCOhyf1i7Mvq8wE9rlcLs/Ozs7MzNTV1Q0NDRkMBoYqptAghGRZhqVFK/kSjE+wF1G/kXpA2E2rFKbHSw8Ch3pG1V+y2CB9aA//lpfa+oE2gWzLc7dcLpsB97iGTP0M92Mz6i/B1Qbakppxbj5LPfFMxn3Xx3sG4NiS1GP0hESd+l7qsXvIZ3uij/QwpA7Zsye/H6S+0ws+Zfpb/CdbrqHHSA9eo3/1yydNm6d28wGM56kF5ZZH/r2B4wf6/4SeQWnCD/R9oR/AsUHPREJtc/q+gqPKfVIlvDdbffCBmQNVJiK61y79AR9A32Odo8rEpSrfHVJ5ZTZbVZvdKux79YcfILLtOMfDeETAfwqJ4DDNUIUgiqIgCMVisVgslstliADQihcfYvTg/4YCGfhGq9VCEBi8q1gVimOO2vs90oONke87bS9wqN2I6i+RSgQACEqlUiaTgbKORCKRSCQgfSadTq+vr2ezWcCHOr0b0m00Go3BYDAYDOCHtlgsDofD6XTW1tZ6vV6IDxuNRl2F1EKKPdKWjGd7mqOPQk8JHA92T7HVqV6m8CeUE0I6ezqdTqVSsVgsEoksLS0tLS2trq6ur69nMplCoVAul0VRZC5/BrIqxQJjzBI7gDcAaFgljtPpdDqdDofD5/M1NTXV1dXV1NRARA1ydqquqX6FB7zj95Geks7xAHCoMcE+KIpSKBTi8fja2losFltZWYlEIgsLC8vLy7FYjOWUU1U1Inj0WX0AhC02ByPQvbIAq8rX1F9SSvV6PYNIW1ubz+fz+Xxer9flcpnNZnXuJ7syk0ePe/yeDT1VcKhNBnQvhwCCFNxwODw9PT09PT07Ozs/Px+Px1OpVKFQgEgVURGsZnUsF67MYrZqnXTjhVUEDIYF9xmCIRYNUgkSA3Q6XU1NjdfrbWxs7Orq6u/vb29v93q9ZrOZZRcwjvJ3o4g8PXAoqtJntfUIOkQ6nQ6Hw5OTk2NjY1NTUwsLC6lUCtJhGFcA5VGtNqpVAfahittvZhub52wzdwFxxnI8gbWABqPVat1ud3Nzc39//759+3bs2FFXVwcYxZWslKpHQt9PoDw9cFTpE7BS8/l8JBIZHx+/du3a+Pj4/Px8IpEolUqQGgi1YjqdDvI2UCWfgyXvsOVOt4pvoXs51t13fuA8MX1CnWUCP0mSJAhCPp8XRRFjbDAYIOX4hRdeGBgYqK2t1ev17PEYPa4xfPr0VMEBUwhmJ5SUXbhw4csvv5yamorH46Iogj1JCAHzknEIlrZTBYItwbHZ0vlO78jAodY6Ie2KQRwUZKi3g9T2Xbt2vfbaa/v37/f7/ZA8jCqZLo9tEJ86PVlwMCFCVbXFhUIhEAhcunTp3Llzo6OjkKEPyU46nQ6K59RzXGXKbvmnOhWoKi0NfXdwMN2Iqlxq6rxDpq9AiVepVNJoNF6vd+/evceOHTt48KDL5WL55eh7q4U8EXCohQjod2zBhcPhkZGRs2fPfvvtt5DyD3UZzE+lXm14q0wf9ZfsJ7Wl+thfZzNhVRolyJpyuSxJksFgaG5uPnLkyEsvvQQ1WizrVi1lvi8QebLggBUGg5jJZMbHxz/55JNz585FIhFJkiBRCmqZ2IlVrHh7ggNIEARo1AESUBAEMKksFkt/f/+rr7766quvtre3QzKYmh3+AI67imexWITi9LNnz46OjhYKBY1GA5UKLD2dqhL71GYn2kqdfLbgYEIHmhKUSiVCiMFg0Gg0oiiC257n+dra2ueee+7999/fs2cPy6f//x0c6mRxSmkikbhx48aJEycuXLgQjUYppcAt9Hq9eo6pKomySqw84F6bwfF43+V+N6WUAqahy1mpVEIIsYZmxWIRHHRGo3FoaOi999578cUXvV4vyyetUkG2LVYev/scxg70jFgsdurUqQ8//HBiYiKXy0FxB0uuZ1pkleyomvKHoac8vozVsYgdRPtkWTYYDFarVZblfD5fKBT+8pe/rK+vJxKJt99+u7GxEfDB3mubmzOPHxysBHRlZeX48eO///3vg8EgpdRgMAAyUKV6Rb2A2JD9DWbnUyZ2U1YwAWVU0HwMIQRCk+O4UqmUy+UmJibS6XQul3v//ffb29s3e1S3LT2SWKnyMQApilIulxcWFj7++OM//vGP8/PzCCGdTmc0GmFcmBC53zX/hiG7H7a2tCEfiyTdzN4KhQK0MISGegaDAWOczWbT6TSl1O/3Hzt27B/+4R/6+vqYC7XKNHv0p3q89KicQ236w6yXy+XJyckTJ06cOHEiHA5Dzara6EcPHIinOUZqlGx53y1hVIVvdgx0o4MuWeBXhc6qoJKvra2dPHmS47hf/epXLS0tIF+2ISDU9HjECq2QKIqzs7P/+Z//eebMmbW1NRgdNTLUjOF+K/gxDtnDM4ktj/xOPAbKFaEDR6lUAvag0WiAZRYKhVgsdvLkSZ1O9/Of/7y1tRWaxmxnemw6h6IogiBMT0//+7//+6lTp+LxOIgSQAbop5tnffPoP97FdL+lDx/IVs1xthRMm90tainGGCewSVmWS6VSsViEZDOMMSQN5XK5lZWVjz/+2GAw/OQnP2lqagIHz7blH48EDqa0g3CJRCKnTp06c+bM6uoqJFwB81RU/aDVA6HW7DbzWKwK3iKVuQu/stlSSzR6b8pWVXWy+grs4iwtSG1+q/UJdU6y+gGgtJUlkbDvIW9IURTweQB7IITodDrIWgqHwx999JHJZHrvvffq6uoQQuoclG0FlEcCB630d1YUJZPJXLx48fTp06urq0zP4DgOrJItPRZVFp2iakKt9nRVfUaq9cqOB+bEDoaZZuwKnNzMV0tVyR/M88ZyRNiUq+OxVJX2wS4OYX12QUAJM26FCoEuAmMCCSvBYPDkyZN1dXWvvvqqyWRij01UHS62Az2qWGGtRaanp8+ePTs9Pa0oitFohN4SbL63tFCqEMMmHgLiwJPRvQFS9UXUmIPUYvhJFEXIF2SzDudCEEer1UJ7KnDEwQej0WixWEAIwjE6nQ4yidit4ToQSYEOaevr68lkcmVlJRQKLS0t5XI5xkUEQWAZQ8A84MmBf0CzzT/84Q9ut3t4eJg16nwsZtRjpMdjrayvr1++fPn27dvgOQZRCksZ/bWEcjWrB8UFOvCZTCboRclOhw+Q38VycNgHSAsCcWaz2aCVCnSftVqtFoulpqampqbGZrPZbDaLxQI4AI8cBISBZzDxB09VFROhlZQfEBylUimdTl+7du1//ud/rl27Bq3G4DFQpUGZWt7xPA/dTguFwuXLlyGlubOzk3W/2T5sAz06ODDGoigGAoGRkZFYLAbjwlL30AM9xFXSnR0DXYFY5hjwbZALMMQABYhoAJeyWCwWi8Vut7tcLq/X63Q6AQeAMMg1BxyoY7/qLA3gWMwdDqwCDgaWAy+FEFKzE5vN5nQ6i8ViQ0PD6Ogo9OyGmQYPOrsXrURkQMqAC/XChQvd3d0ul8vn8z3iRDwJegycI5fLQR5XsViEQGvVnikPfym1CwFIkiRIFgTpjjE2GAw1NTUej6erq6u7u9vj8bjd7pqaGnA9GY1G6KGD7i0gqEIqmzB2QKlUCoVC4+PjgUAgGo2CkII2h06ns6Ghoampqba21m63w+4LbIkTQiwWS21trcFggBauEBxgUpXeu5cN/Ar3XVtb++yzz7q7u6HP3bbSRtFjMWXj8fjo6GgqlWJyvapDzWZt436k5gqCIMBYI4TMZrPT6YT874aGhtbW1vr6+traWuh3zhgVVrX/YrcGUVWVekhUbR5JZZ+NeDweCATGx8ej0SjEWqHZvslkKpfLmUwGmBCIITWCrVarz+ez2WyxWEwdFiCqhmPMGgIC/lEqlWZnZ69cudLT09PQ0LCtZAp6LAppNBoNBoOgKNBNDtOHvI7adoCLQD8/6ALe1NTU1NTU0NDgcrlMJhPYQcCcSaVXK0MDaKOwu8P6+jqrcykWi9Bltb6+3uFwWCwWZmnD7bxeb3t7e6lUcrvdlFLYFaWlpcXj8cCuLiBi1KYysBCLxdLc3Oz1eufn55nxglTsSm3MQ6tdjuN0Op0oiolE4vLly7t37/Z4PCy/cJvQo5qy5XJ5aWlpbW1NqfTtgwbW35VDssJGUPdqampefPHF9957r7u7GzpVgvHCxh0OYxCBPWwymUwikYjFYlDwEg6Hw+Hw8vLy+vo6tF8G7Q+6RXd3dzc2NkJ7U8AHx3E2m62hoaG+vt7pdDY1NXk8HuiuCZov7NehromCzxqNxu/3t7a2jo6OZjKZcrnMSuXg7Uilby7bywyCc4CPQCBw9erVXbt21dXVPTyXfQr0qE6wUqkUjUYLhQKllOd5sAbBFv1Ol6IqQghBg+y+vr7GxkY1c1Yzc1Rp/5hKpRYXF8fHx8fGxoLBYCqVAqiB0wnylh0OB8i7WCxWLBYjkcjq6urw8HBXV5fVagUDlRAC/f8zmQwhpFgsjo6Owr5VhULBYrH09PT09vbW1dVBUA0eAFhXbW0tdLTNZDKgezEFlj28WpGCOl7IeMpkMhMTE+Fw2O12/11xDsj/A1bJfFlqww/d3z1c5bFACCmKwnqWJ5NJwBy618BjAw0FL6urq9evX7958+bS0pIkST6fDwpJ3G437JEgCAKq8HbYeAXCpMDD4WnBwjQajYqiQN9mqJoJBAJjY2OFQgG60zO7CfgWqL0AaKvVOjQ0NDQ0tLi4mM1mwUhR7wvGlF+w5sAMhlXEcdzq6mokEunv72cZk9uBHoNCqlYGlcruRg+pbahxA8MECmaxWAyHw4+bDmAAACAASURBVLFYrK2tbXMyOlY5v3U6ncfj2bFjx/DwsNPptNvtFosFskZgu7FoNBqLxZLJJM/zDQ0NdXV1ICMcDgdIDbgsiAz43NvbK4piNpsFC1lRlNra2paWlpaWFtgmZ/Pz8Dzf2Ng4PDx869at8fFxCLyBAcJgATIRNGLwkjEMQThGXXX36PPy6PSo4NBoNE6n02Qy5XI5Zimo7YWHpCpZC/vWLC0t7dy5E3oCk03dTuFGBoOhs7Ozs7MTDovH41NTU0tLSysrK6B8JJNJ2FSqra0NqukdDgdAgakCaovXZDLBhialUsnr9Q4ODoL1pNfroZya2WKsagGopqZm//79d+7ciUQi6+vrYO8w4QJcFlpCsNazvb29O3bskGUZNGUwgraPZHlUnUOj0djtdlhMyr2bj37XSzGFA3xTsNFfOp02mUxM28f3JvXQiq8sm82y3fPi8Ti40aDuobOzs62trbW1tbGxsa6uDnYJVRs4SOX/oJUdbhVFgZxhthkb+CewqsiKldqCSNXpdE1NTa+++urq6ipsnAip1LhSqw2YAGvf4XDU1tYeO3bs9ddfhxvV1NSw9svbhB4DOGADUbaemNqhZrz3O33zASBZoOEC7CkGvdXZYmUYAmYOOzFEo9Hl5WVZlsEtZrFYEEKyLJvN5traWpAFMLvqqlfGMNQ6rxoBoiiur6+D9QGTCs5WtVLM3gVjbDQaoUl8S0vLuXPn5ubmQDk1Go0+n89ut9tsNnDVNDY2NjQ0gJwCeUrvrQXfDvSoCinP801NTX19faFQKJfLiaJYlfSFHk4hZfONK1m75XJ5ampqdHQURhBVJo/VziOEoK4aNtPo6OiAdBsQ4eBuh1/ZogeWDu0b4CzmzlK7IpgUUxSlVCqBthiLxQwGQ0dHR09PD3T1V88lU8PNZvPg4KDP5+vp6Tl16tTly5cLhUJ7e/sHH3ywe/duu90OHn3wpDH3HcPl348pC2D3+/1Hjx4dHx+/c+cOOKDYxjNUFVTb8vQtP4PtANsfXb9+fXBw0G63M+WOSXr2AKDDovv3g2PMP5FILC0tZTIZm80GW64wqIEXlW16yjayBINTq9Wurq4uLS1NTEwkk8nh4WG2RwdAhMWfIeLj9/tfe+21pqYmh8Nx9uzZ1dXVmZmZvXv3+v1+9aMSVQ4p2Wpz62dLj8Faga2HgXlAr3/GtNG9+TJVJ96Pu4CaWS6Xi8Xi9evXe3t7YVMw9SJD944sAwSqjDuYJOzKoiguLi5evnw5GAy2tLQMDg6CWpNOp+PxeDQajUajsMcPJAmDFSMIgt1uHxoa6unpaW1thT1HYbdHOIb5ZvCm9AOTyTQ4OAj29oULF06fPq3X6yGBlPEbgMK2EiVqelSdAyEEfu7BwUHYoRjcf1XsUT15D3llrVYLNsvIyAjbN/p+wV41k4Bv1BMgSVI6nZ6ZmQmFQrAd6eeff14ulxOJxPLycjweTyQS0FgBdBqTyQQNfTo6Orq7u3t7exsbGwEKzFBX+/vZjaruDvvPvfXWW2tra998881nn33W2dlZV1fHEnyqjLvtwzOAHgM4EEJGo3FgYKC1tTUcDoP6xlRIvFUO2MNcGZxF+Xx+ampqbGwMHESKajP3KgJkqJtqMI4FHLu+vt7r9fI8H4/HJyYmoIOUIAgcx9ntdo/HA8kfZrPZ7XZDTAd0W9BAYWstfO/WPgwijKvB90pl6yeTyTQwMDA8PDw+Ph4Khc6dO7dr167u7u7Nhsl2QwZ6LIE3UDLa29v3798/NTW1trZWLBbBxFcHWTavjypuXGU7wAbY4J6/fft2JBKxWq0PyNimlRw++FMdnoX4qtVqBWulpaWlr68vnU5DphZ02qCUQpC9XC5DDRLstCWKIjQd9Pl87e3tPp8PfN7qBFX1C7I7Ap4IITabDRhGPB6fn58PBAItLS1MEX7E8X+i9BiSfeCDy+U6fPhwIBD49NNP8/k82HVsBDf3blNzZlqJ5dJKihetJGlyHFcul2dmZkZHR/1+v8vlesCYqsV/1WdoOYoqsTpI1Ein02CGLC8vg8IBmT6SJEGoL5vNwrbTsizDnn6vvPLKwMBATU3NZlaxJVBQRUWFBLBisZjL5cDhsd0M1830GMBBCIHl1dvb+/bbby8sLFy/fr1YLMJkQIUgeAhALjCUABTAnBNFERyIsOUi7PSMENLr9ZDk91e1FrWLAr6hqrgMqaQHw5+ZTGZ2dvbSpUtXr16NRqMIIbvdXldX5/f7YY9tqDQJBoOLi4uwB2w6nQbllKpiBezWVWhg6EQIgT0M7wVenKo2JNuWHtWUhQ+ksv/evn37Pvjgg3w+Pzc3JwgC2LTgckCV+VMqu8SBAgg5eZAhDJ5NCGe73W6/39/Z2dnV1dXb29vb22uz2dhwq+/LiAVHtnSvMZYjCMLc3NyHH354+vTpRCIB0XnAXzwehwZUoihCb1OolNdoND6fb8+ePXv37rXb7YAGdVxty2HBGINBPjk5CUn5fr+/oaFhGyZ9bUmPqpCqzUVCiMvl+vGPf6zT6T799NObN2+m02nw9hgMBo7jCoUCqAXAFZj+CLoecAiXywWuw7a2tpaWFr/fX1NTYzKZmHuAblXfUcVUqjChni24aTabBd0I8Ap7i0IOOoRnQTOFDHVQMuBXyKq/nzeCYRdXtvGen5//9NNPv/zyy1QqVVtbu3///ra2NrZv4f3gtU3oUftzqKU7fCNJUjabnZub++KLLz7//PPZ2VlFUQYHBx0Ox8zMzPLyMlQIQjhmZWVlfX0dIdTQ0PDiiy/u378fIiA1NTVGo5H1gqrSatFDZ2nTe/MUYUpkWQ6Hw9euXRsbG4vH4z6f7+DBg01NTYBg5rhU36JcLufzeZ7nISy3uZmkWpcCEQmtzz755JNPP/10aWnJZrMdO3bsl7/8ZU9PD/OusutsT3oM4Kj6hgWZ0ul0MBj89ttvY7HYgQMHGhoaIpFIPB43m80Oh8NgMAiC8Pnnn//v//4vbKj5xhtv/PznP+/r6wMHVJXFWCWkH5Itq8FBVWVtIM7C4fDMzEw+n2cpg+BoJ5XSJsgRL5VKOp0OcsRramogN4xuCp9C9ii0+wGH2/nz52/cuJFOp30+35tvvvnee+9B9Fi99+ffPvRPnh6btQJEK+EPQojb7XY4HP39/YIggFzo7Oxk7BREEuwwferUqVAo9OWXX0KGVVdXF6tYATsZbfIRqV1hVXfHqoQj9XMy5gHzqtPpzGazJEm3b9+em5tbX18HyxPqblgBgV6vr6+vHxgYgC3p1d01mMCilX7cqVRqYWHh1q1bIyMjt2/fjsVier3+wIEDP/7xj19++eX6+nomHL8XOscTafuENgU41OyXVvyMCCHYyvvChQvHjx8fHx83Go3Q0HPfvn1erxeSJ1hKxOYBvR9cqvxvbJUDV2MBd0EQotEopJpCx0tI4GPuf8hWaW5uhvRBk8kEBhet5KwLgpDL5RKJxOLi4uTk5OTkJGSTFAoFo9HY2tp65MiRI0eO9PT02O32zUbKNofI4weH2opjS3mzwkhVsdBMJvPtt99++OGH0Desra3thRdeOHTo0ODgIITHIPMblNmqkMrGa6jiupvzFKkqvsPAwXgMQgjsKRaUYVXXwEjg7qhibbG89ng8HgqFABPBYHBhYSGbzRoMBqipef75559//vmOjg6TycRuVxVm2uZi5Ym3mkSbPOhq84FNXrlcnpub+/LLL8+cOTMzM0Mp9Xq9AwMDO3bs6OjoaGxsdDqdZrOZlZXez1jAWzUmrGIq7AHY3KjRgO7NGgFmA2WPqVQKGnzNz88vLCwsLS1BaAYKYh0OR2Nj486dO4eGhjo6OhoaGiAlQI2Mbc4qquhJdTBWr+n7/cr+pRXPdyqVmpiYOH/+/OXLlxcWFiDn2+v11tfXd3V19fX1NTU1gWUL4n/z7ifk3r7jiqpyn5Hay07vLcMHWwN6vUGpdCqVgmrpcDi8urqaSCSy2Szs8ALZYn6/v729vbW1tb29HWxvKHcglYpLSCoAJfd+NvD2pGe5xxubIeZlB56/vr4eCARu3Lhx8eLF2dlZyG7HGIMXBCpE/H6/3W6vqakBPwSkdABW2Ae6KbgPsIDKEUgihIIX4Acw6+l0GjZ5gc/QpgfanAMXgQxhjUbjdrvb2tp6e3v9fj+ltFgsQtowHMxxHGzwU1dXNzAw4Ha7N3fu3ub0LMGhVvWRitkghCAkBsl/oVBoenp6YmIChDpMEttQAdwSsCjhXzA3ABywcNntYHbBGwtKMThDIfwGn6GpBvhqmYQilR3gEEJwa47jWHUupChADMViscAmLFB/cOfOHY/H89vf/nbv3r3qPRWexXh/Z3qWThimkTD9gMFFr9dDJ4XW1tbh4eFcLheLxUKhUCQSuXnz5qVLl9bX1x0Oh8PhKBQKEDZj9SlUlZ1FK+W7jJEw7xZYK6AuEEJYFQk8FVhJcC5jTtDPA1L9AAfgMzWbzWazGf6E+jyEUKFQuHjx4o0bN7RarcViYYLm+4IMtE02AFSjRP09rWzsCBsl+f3+8fHxW7duWSyWgYEB6DxfLBZnZ2dHR0enpqYKhQLHcZIkaTSa2tpa0CJ9Pl9/f7/NZgNWAb1ZMMaQwBwMBmGC19bWeJ5vaWlxuVyAA+jp4HA4oBaGlfBDsS5AhxWegDlDKoVMkiRNTk7evn27WCz29fVBHgna9rZrFW0LcDyA1Fbf6urqn/70p6tXr3Z3dz///PMulwsqPhoaGjo6Os6ePXv9+vVMJgNthP1+fz6fFwShrq5u3759bW1tVNVXCWMci8Ugd7BcLkNOcm9v769//es9e/ZArjlwL9aTmvk2mJ8DRA9W+fQYvrPZLJRner3e3bt322y2ZzmIfyttd3Cw4c5kMl999dWlS5ccDsfOnTs9Hg9WZfQ3NDT86Ec/0ul0t27dWltbg1o3pHJ7sPxCiPnhyj5LDocjEolAgQnkBTY0NMDqZ8YFraSboEpZHlXV1zCDGfJ3wN4JhULXr1/PZrNvvPFGT0/PtipyfHja1uBg4y7LcjAYvHTpUqFQOHDgQH19Pax1pHKHNzc3Q0D14sWLqVQqHo9DNRR4t9hhpFJzoNFoPB6Pw+EIh8OiKDocjvb2dqfTWeWQYOgkqpIqIBZTZWYRHJDP52/cuHHr1q2GhoZDhw45nU7mQ2PHo++DiNnW4GBe1PX19YsXL05NTTU3N3d1dbEERMbJwXT0+XyDg4Ng1IA7nFIKtS2QWQJ2LLQdy+fzKysrCCHoLEsphVBtU1OTz+dzuVzqMnms8sCyZ0OV7GW4O6udn5mZuXLliiRJR48e7e3thetsLjugf/dpgk+aGJe+evVquVxubGy02WwsFMf4B6tmA4OC53kwUBFCRqMRAiKlUimZTAaDwWAwCC14QKWAclyNRhOPx3//+9+Lojg0NPTuu+/u2LFDr9fDY+D7pEkzcZNIJMbHxycnJ6G54Pj4eGtr6759+0Db2NIX94BXZp+fLXq2OzgQQoVCATaYhdZb6m50qKJVQCeIQCBw586d2dlZSZJgXiHfDIoPZmZmIMBmNpu7uro6OzvBoQlObrjRjRs3Pvroo3PnzkFpgro+tsqri1SRmlQqdfbs2U8++WR5edlgMBQKhUwmk8vlwLOuzp+t8sxWvWlVVAHd3457OrTdwaEoCuR7xuPxzs5OyOyFsnfQJzKZTDgcXlxcXFhYWFxchEYrkMoFIdOlpaXPP/+8UCiApfrKK6/s3LkTTFamNED0ZH5+PhaLpdNpcHmBmKjywaB7VzYE4a5evXr8+PHFxcUDBw4cPHiwUCh88cUXU1NTf/7zn7u7u/1+P/N9YZWnX63WsBgCUqWgQgb/5tzHp0bbHRwIIUEQkslkqVSCPrIIoVKpBNH2UCi0uLgI5kZ9ff1zzz0XDodHR0dhcKHCMRwOZ7PZrq6uvXv3dnR01NXVabXaUCg0NTWVTqfz+TxCSJKkaDQ6NjZ28+bN9fV1v98/Ojoai8VAuaniFlV6Q6FQmJycvHXrlslkSiQSExMTkO+Ty+VGRkYEQQCFVB2AVV+TsSWQj8xHhzH2+/2wxRNrcwunP7VY7rYGB8wxtGex2WwrKytXrlyBbZHS6XQikYCKgSNHjjQ3N/f39+t0ujNnzgQCgWQyCXiClkOgh4LjAaZWlmVRFIrFUsWvipi3tLaullJlfPz2xMQ4pagKHBhjhDBGCCYKYyTLiiAIZrNFo+FnZmaDwTlCSLlc1uv1gA/WCERt9YBJrK7GJgQTwhFCeJ7DmMTjMZvN5vf71dh6ysxjW4MDRsTpdL7wwgsQ0IdNnzQaTVtb2/Dw8MDAABQaQSZwLBYDTzmgQal0+zMYDA0NDU6nU1EUQjDHcxhhhBAmGCOECYHWtaz/OcdxGl7DcYRSJMuKWp3cEC8UUXSP2qgoCpjAGyCgiFKKMFVPKlVltzB84LsVFUij0RCOSJJcLpWvXbsaDAahghBqXqpCRU+BtjU4aKXPQltbW39//8WLFyHB3+v1Hjx48Be/+AUrWockrrW1tUgkQgipra0FVdRisUCHrtra2t7eXowxQpSQu/mkhOMopRgjjnBsquDuGGNFoQwc96xaCrN/d6NT4E9qbwdVVWqpfWVqYxhXYj0YY4TultAV+ILBYBAEMZlMVvUreJq0rcGBKkMZj8eDwSB0lgJuDIEPFlGTZXlychJ2Ddu1a9f6+vrCwkJtbW1zc/PCwnwkEgmFFjweD89z5XKZIkUUhEKhIMkSx/EYphPRyrUJQjDfFFGkti8qHzawAn8TNmcYKYqCUUV7xRj4E8KVzDd0t5cm8AtJlqiCEIKJp4qiUIR4jisUCgsLC+VyiTX1/kGsbE2SJEUikcnJyVKpBKJBFMV0Og2CA2MMbV4+/vjjUqn0yiuvxOPxixcvms3mvr5evV4XCs2LohAIzApCWZKkTDYtioKiKPAnQhv6A7NHMCYcR0A0YMwpLCNJoQhRihClEkIIIUwVRVYU9XxVFBQM800wRymGKa1WXDDGGCmKguiGEgqCiGBMKS2WSoV83uv11tXVPcPyhe0ODkppuVyG7Bu9Xu/1ekVRTKVSsVgMKnIRQuDdamlpaW9vX11dPXv2bDQaHRgYsFqts7PTmcx6W1trY2OjxWqVJanGYaNUqYRF4BbsH4QwospdHwMhPCgXVFEUqiCKKFIolWFeRVGSJHHjOTfgpSCECCYVQBCMCMIbHaqAIVUOr9ySUsLBPhOYKgrhuPVUKrS4qOH5AweeGx4eBjfaD2IFoU2dPCBUEQ6H19fXoSZRkqRMJrO6uhqLxVpaWgghZrN5z549/f39U1NTZ8+enZuba2ho8Hg8c3PB2dkZq83a399X5/UihCgFua4gjHBlqpgRQQjBBCOKZGVjjjHmKuoFopRihBBGmCiKIsOf96ZNq/4HTIJyGBGKKELq4jaqABOiCOONPziOx4jIspxIJqNra3ab7bVXX33vJz9paWn523YZeCy07cBRRZIkQUJvNpuF6llKaTAYXF5eXlpaGhoagmQws9m8srL82Weffnv9W7PZ3NTUlMlkpqYmJVms9/uczhqCqUIVghDhEMwyAiAiShFGMEmYxxQzoYAJYmwEY0Spgja4DQW9kxCsggJCGBGEN2acUkQRIRzBXMW9JQGUKFUQRZg19CUbqglFaHllZXp6GiH042PH3nzzrabGRlZA9UwGfzuCA6sSgyVJisViS0tL4ISApFGz2by6ujoxMXH48GGPx6MoSjKZ+OqrC19/fQlj1NHRRqkcDM7m8/m29lavz8txBFGZIIqoQmTMIUwRoggpWKGIKmhjSjFCiBKYdISRJMtUpkwLlGWFUgVjgtDG7mCEq+zLoVCkILrh5yYEY46QDewoCkaKQmWCFIARABMjSilBGGPCKzLN54uRyPLMzIzdbjt27M033njD5/NpnvX2xNsRHIzAXZFIJBKJBEIIYOFyuZqamtbW1m7fvj09PW2xWERR/Oabb06ePJnJZro6u+x2+8zMTDQa9fv97R3tZrNZUWTME0QpRQqiGGGyISA21AyE4F9ZQQQRniiYlErlTCaTSWcLhYIsy2ybQKZdqrxYGCHEczxHePgTqq7NZrOW4xUqUyqTDbxt3An4AMdxBBFJVvL5wtzcwuzsbEtLywcffAB5TCxl9RkGb7c1OBBCoihCvIPneWAb0GU8nU7Pz89DnW2xWPz87Gdz88HmpmaPx7W4GJqbD9pttr7+HrfbRTAmBFOqIKRgTBFGFAGzAGRUTFKqKJRiRJBM05n09PRMMDhXLBb1Op1Wq6VgiSBEFYrxPT0LEUKIUow2SmYkUZQUubG+obevz+10IKpU1AuKMORRYwX8Y5yGUhqLxWdnA/F4cufOnT/96U+Hh4etVmuV7foDOLYgGO5isVgqlRBCuVxufn4eagVsNlsgEPjTn/70zTffKIqSy2fq632NTfWJZDw4F9Bo+Na2FqfTwXOEUgUAgVGlhzXzfW/MKcYYUYplpIglIZ5Mzs4Gp2dmi6ViV2fnzp27YPsVWZEhWR8jAvoppVQB5UKhiixIolAoFOfn5ycmJhKxeClfQDU1oFHA3FKFYowIxphwCGFRFKOxxMTklCzTV1555Z133unp6YFtoNQZAs8war/dwaFUmnkQQqAnH6TcQU2RJEnhcBgh1NRc39XViTGemwsKQrmrq7O5ucloNIBKSTCquBoowohihCmhCsWUEMwhiqksI0xlQVpeWRkfnwyFw7ls3ma3tba0Dg4MOBwOQRQ2HFwVJRVcm3hDq0VYUTBCgigYDIZQaEGWJUWRCSFoo8qSoooTjHAc5rhcLh9aikxNz5rNtrffefvNN9/yer2ssAU9a54BtK3BAasTahWhptnpdEKqZk1NjdPphO73Lpdr186dJpN+fHw8k0k3Nzd1dLTbbBZMsKLICLHIyIbSSDFCSAEdFFOMEUcRSqfTwbm56ZlALJFQKOU4TqPRarVaRJEoCJRSOI0qCqUywghTosiV3vgIE0ooohwiOo0GUySLElIoTwjCGCFF2WADFCGqyPL6enp6ZmZxKdLe3vl/f/aLvcP7nA7Xs8XBlrRNwVEVFqeV7mHQWAe+yeVymUxGq9U2Nze7PZ5QaH5lZc3hdHZ2dbhcLl7DI0oJ5hSKKHNsEYoxRQhTRBBCiqwQTBVFTqVSd6YmZgKBYrHkrfPqDIalcIQjHEGEYIwoQuwCoLZghMDfVfmSYIwQkRSJIxzBnCAIpWK5LAg8x8HJHMEUEYxQPJmanJqOxuIDAzv/8Ze/3Lt3v9FoAvBst7rq7QgOpp+rwwoQ2aKVjJhSqZRIJAqFAqR8ppLpYGDBoDd3tHe7nB5COEWhBBGCYHNQGWNQQqlMFSyDE4MQjiuVhLWV6PTUTGhxnnBcV3dPW3t7PJlcXlnZCLRiDiGMqCp+xupy0YaDAkMghSKiYII5QjiFIlGWJVnGPMdxPFUUGWNJkuLx2HQgIIjKj4/9nzffequ7q8dgMAG0cIWe6djfQ9sUHOwDrnSr5VR7wKJKGBayPSRJWgovra+v9/X1Njc16TZ62WIFKSALEMaUIoUqCFGCOQSBekxEQQqHw2Ojt6NrMYfD3tHZ2dzSYjSZ0pkMpYgQwm3kXhCEN1RQhO8J1qOKuAB9hiKk1Wo1Wi0qFSmihOM5jqcIEY4IghAORwKBgMVm+8kH7xw9+lJdnVer0YInfrvBAmjbgYNFt2mlah7Sx1lnC7zhadpom7SxA2F0FXZ/NZlMFMkbyp+MKFXAXKCUEKzBhIKFwnN8PleYnZ6dmZ7NZfL19f7OznZfvd9gMHIaXm/UEQ4jpGCCKzZJxXC911eJCYgphBSkIIow0uq0Or0OZZGsKETDcxqNJEnZXG5hYWFtba2jo+vd997dMzxstdp5jseYwBs//XF+GNp24ABiGQwcx0FhaiKRUEfPYfcMjPH6+rogCFqdtr293el0kY2tfilC4P/esCckScEEaQjPc5ws0Xg8FZgNzNyZVhTa0dHR0d5e47BptBpMEMdhjBRCKCF3NybbMElA/1BPJQROKIJbwhNjQkRJyubz8UTSaDQUCsVIJJJKpnbt3vPOO/9nx+CAwWAkhMMIE8IxcDxDZ9f9aNuBQ+1copTq9XqoSwuFQmwjBEopNPajlEI+cGtrS0NDA8/zkigKYlkUBUWREYRJKFVkWZQkEFdiWcyms3Pzc8vhsF5r2NHf39HeYbVawCmOEJUkQZQkQjDHV0quqYIqYRU1MpjyseEWJ1iW5bJQFkUxXywsLCxkczmtVsfxnM1m+/Fbb73x+utNjU0anQbjStjt3jTjpzfKD0fbDhxALO8BXNHqglU4AFcy/WHj6kgkUiwWMMGyLApCWRDKkiQi8GgoiqIgCjYLReWSIJSEXC6HqNLQ1dTS0mKzWTDaiLESgiRFliRBkiUNr+E2Evg21B10/wAY4TBFGINTDGOzxbJv/77DR15wOJ1GgwHaioAdjjBFSAFHyfbDwz20fcHB0KDO0sOqZDudTud0OsvlMiEknU4XiwVwN2GCNvySGLKBOUjZ5TieEGIySIVcTiiXFEXR63VanQ5hQpGCMMIE8jAwVagiyYpGBl0DUYoJ2UDmRt7HXQ6CN0QXUjBBBBGeIxyx2Wv27tv/5ptvQi3FhpKEQUWhCBFFAfm0rdGxTcHB1E8Q+SD1wY/O6k4tFktnZyeqTBomd1M0IDMDV0YfY9VO91Qp5rOiKCZTqbIkirJMCUaIbPjKMEIEs5CqJEkQc0NMHwWzZCN8BjAFryumWEF4I8LLcbxep9cbDBqtFt8bVsWIIIQJR7c5MtA2BAe+d+8SjuNcLldXV9f8/Dx0aLFarUzQgJVLKbi27s4BBmBQ8GdsXBacrRsxUYIpVURJguQfqigbwFIwVTCi7D/KQ2FBRaYQQiCDi6WEKJRyGJKE0AZQRNv3QQAAAltJREFUcWXDF4DjfV70CQ7iY6JtBw6kSuRHCMFOLr/5zW/a2to++uijYDAIO5WKogh7U8iyLMsSxxFWcAC5EhgBMu5axRCpoYokiUI2l5Oh9SBG4NveiI3Rjf8UiiAddKP3hiyrVEe04TlBaMNcIVihgBfgOkSW5YoI2n5GyEPTdgQHqvAP+GwwGPr6+sxm8+zsbLFYfPvttw8dOiRJUjKZhPaPqVQym81kstlcLifLcj6Xg5xTntfY7TWsaq3iPpEJRyD7AvQDBVG8oVXArQnHaTjMUVXquVrF2Ajxb5guuFLKokD8n+c1Gl4jy/SutlkxTL53tE3BgVSmHbdRWrLRVKOxsXHPnj1msxlav0FFa6lUgPYHYNyeOXPm+PHjDQ2NP/3p/21pacGVRmGUUlmRyuXihfPnT548KYiiJMuE48CbhTFRFAVRmSM84TRUoRhKCDjursigaMMEraSQYoIRogBnrFS2tpRkpNIzvqfsY/uCQ02KohSLxWw2C+WNqFJUyAqUFUVWqKzICrjFRkZGYH9oaPh0b48eqVgqrK6unjt3ThCFjU3/FBlTTAiliAIaONAzMKaKQplOitBdpRepvKWVD4QQjVajN+hz+QL6XqgVDyRekqVn/Qz3pQ2GQZWyUM7msphgm92m0fIKVWRZ3ghzKAj0BJD+iqIIolgWBKvNZnfUEI5QpFBEMMZwGCYYEwVhiRIZUyQpgkJFTBBVkILljZCKBhENorKMiCwjUZAo+MEQYlFacJZTvKFXQEiQEEJ4LTEYdbwWK1SQZFGSZXiXeznH9wM2/w8z07TIub6ABQAAAABJRU5ErkJggg=='
the_img = b64decode(img_)#將圖片硬編碼到GUI
paned.image = ImageTk.PhotoImage(data=the_img)
self._img = Label(self.root, image=paned.image,background='black')
def set_widget(self):
default_name_="會(huì)是誰?"
self.label_show_name_var.set(default_name_)
self.label_show_name_adjust(default_name_)
self.btn_start.config(command=lambda :self.thread_it(self.start_point_name))
self.btn_load_names.config(command=self.load_names)
init_names=self.load_names_txt("./names.txt")
self.root.protocol('WM_DELETE_WINDOW',self.quit_window)
self.root.bind('<Escape>',self.quit_window)
if init_names:
self.default_names=init_names #1.文件存在但是無內(nèi)容。2.文件不存在
self.label_show_name_num.config(text=f"一共加載了{(lán)len(self.default_names)}個(gè)姓名")
else:
self.btn_start.config(state=DISABLED)
self.label_show_name_num.config(text=f"請(qǐng)先手動(dòng)導(dǎo)入人名單!")
def place_widget(self):
self.lf1.place(x=300,y=160,width=250,height=50)
self.radioBtn_sequence.place(x=20,y=0)
self.radioBtn_random.place(x=150,y=0)
self.btn_start.place(x=300,y=220,width=100,height=30)
self.btn_load_names.place(x=450,y=220,width=100,height=30)
self._img.place(x=90, y=165, height=120, width=180)
self.label_show_name_num.place(x=300,y=260)
def label_show_name_adjust(self,the_name):
if len (the_name)==1:
self.label_show_name.place(x=280, y=10)
elif len(the_name) == 2:
self.label_show_name.place(x=180, y=10)
elif len(the_name) == 3:
self.label_show_name.place(x=120, y=10)
elif len(the_name) == 4:
self.label_show_name.place(x=80, y=10)
else:
self.label_show_name.place(x=0, y=10)
def start_point_name(self):
"""
啟動(dòng)之前進(jìn)行判斷,獲取點(diǎn)名模式
:return:
"""
if len(self.default_names)==1:
messagebox.showinfo("提示",'人名單就一個(gè)人,不用選了!')
self.label_show_name_var.set(self.default_names[0])
self.label_show_name_adjust(self.default_names[0])
return
if self.btn_start["text"]=="開始":
self.btn_load_names.config(state=DISABLED)
self.running_flag=True
if isinstance(self.default_names,list):
self.btn_start.config(text="就你了")
if self.radioBtn_var.get()==1:
mode="sequence"
elif self.radioBtn_var.get()==2:
mode="random"
else:
pass
self.thread_it(self.point_name_begin(mode))
else:
messagebox.showwarning("警告","請(qǐng)先導(dǎo)入人名單!")
else:
self.running_flag=False
self.btn_load_names.config(state=NORMAL)
self.btn_start.config(text="開始")
def point_name_begin(self,mode):
"""
開始點(diǎn)名,點(diǎn)名主函數(shù)
:param mode:
:return:
"""
if mode == "sequence":
if self.running_flag:
self.always_ergodic()
elif mode=="random":
while True:
if self.running_flag:
random_choice_name=random.choice(self.default_names)
self.label_show_name_var.set(random_choice_name)
self.label_show_name_adjust(random_choice_name)
time.sleep(self.time_span)
else:
break
def always_ergodic(self):
"""
一直遍歷此列表,使用死循環(huán)會(huì)造成線程阻塞
:return:
"""
for i in self.default_names:
if self.running_flag:
self.label_show_name_var.set(i)
self.label_show_name_adjust(i)
time.sleep(self.time_span)
if i==self.default_names[-1]:
self.always_ergodic()
else:
break
def load_names(self):
"""
手動(dòng)加載txt格式人名單
:return:
"""
filename = askopenfilename(
filetypes = [('文本文件', '.TXT'), ],
title = "選擇一個(gè)文本文件",
initialdir="./"
)
if filename:
names=self.load_names_txt(filename)
if names:
self.default_names=names
no_Chinese_name_num=len([n for n in names if not self.load_name_check(n)])
if no_Chinese_name_num==0:
pass
else:
messagebox.showwarning("請(qǐng)注意",f'導(dǎo)入名單有{no_Chinese_name_num}個(gè)不是中文名字')
self.label_show_name_num.config(text=f"一共加載了{(lán)len(self.default_names)}個(gè)姓名")
default_name_ = "會(huì)是誰?"
self.label_show_name_var.set(default_name_)
self.label_show_name_adjust(default_name_)
self.btn_start.config(state=NORMAL)
else:
messagebox.showwarning("警告","導(dǎo)入失敗,請(qǐng)檢查!")
def load_names_txt(self,txt_file):
"""
讀取txt格式的人名單
:param txt_file:
:return:
"""
try:
with open(txt_file,'r',encoding="utf-8")as f:
names=[name.strip() for name in f.readlines()]
if len(names)==0:
return False
else:
return names
except:
return False
def load_name_check(self,name):
"""
對(duì)txt文本中的人名進(jìn)行校驗(yàn)
中文漢字->True
非中文漢字->False
:param name:
:return:
"""
regex = r'[\u4e00-\u9fa5]+'
if re.match(regex,name):
return True
else:
return False
def thread_it(self,func,*args):
t=threading.Thread(target=func,args=args)
t.setDaemon(True)
t.start()
def quit_window(self,*args):
"""
程序退出觸發(fā)此函數(shù)
:param args:
:return:
"""
ret=messagebox.askyesno('退出','確定要退出?')
if ret:
self.root.destroy()
if __name__ == '__main__':
a=APP()
本次使用Tkinter開發(fā)了一款上課點(diǎn)名程序,此程序可以用于點(diǎn)名、抽獎(jiǎng)…代碼不到200行,程序簡(jiǎn)單又實(shí)用,主要有以下六個(gè)亮點(diǎn):
1.兩種模式:
2.自動(dòng)識(shí)別人名單
3.支持手動(dòng)導(dǎo)入人名單
4.人名單導(dǎo)入校驗(yàn)
5.人名顯示位置自動(dòng)矯正
6.最多顯示五個(gè)大字
據(jù)庫(kù)測(cè)試,似乎是被人遺忘的數(shù)據(jù)庫(kù)職業(yè),但依然是不錯(cuò)的選擇。底下是我在某站找的招聘啟事,就連螞蟻金服都在積極尋找數(shù)據(jù)庫(kù)測(cè)試人:
要說我經(jīng)歷的項(xiàng)目,大大小小也有幾十個(gè),從 C/S, B/S, 再到 B/C/S, M/S. 無論怎么變化,總也離不開 UI/DB 這種框架。
以前 C/S,B/S,自己動(dòng)手寫寫沒問題,就拿很早的 C/S 架構(gòu)來說,C 代表了客戶端,S 代表了服務(wù)器。客戶端可以使用 vb, vfp, delphi, c#, java 來寫,邏輯都放在數(shù)據(jù)庫(kù)服務(wù)器上,具體來說,就是封裝在存儲(chǔ)過程里。
而 B/S 時(shí)代,客戶端換成了 Browser,也就是瀏覽器,而 S 端還是數(shù)據(jù)庫(kù)服務(wù)器。那么 B/S 時(shí)代,語(yǔ)言從強(qiáng)編譯性語(yǔ)言,逐步向弱編譯傾斜。Javascript 和 JQuery 就在這個(gè)時(shí)候應(yīng)運(yùn)而生。
如果說 C/S,B/S 時(shí)代還有全棧程序員,現(xiàn)在如此復(fù)雜的時(shí)代,要做到真正全棧,就特別不容易。僅從測(cè)試來說,需要的功底一下子就變得豐富至極。
鑒于前端變化太快,我很明智地選擇了 S 端,即數(shù)據(jù)庫(kù)服務(wù)器。數(shù)據(jù)庫(kù)的測(cè)試,相對(duì)前端來說,穩(wěn)定得多。
一些不同的聲音
大部分反對(duì)給數(shù)據(jù)庫(kù)做測(cè)試的理由,來自兩大類:
一是沒有時(shí)間。在開發(fā)和調(diào)優(yōu)上花費(fèi)的時(shí)間夠多了,為什么還要去寫大量的測(cè)試用例。
二是測(cè)試案例復(fù)雜。針對(duì)業(yè)務(wù)復(fù)雜的測(cè)試,對(duì)數(shù)據(jù)質(zhì)量要求很高,一個(gè)沒有設(shè)置好地區(qū),折扣,渠道的訂單,測(cè)試出來的結(jié)果肯定不令人滿意,那么做好一份質(zhì)量高的測(cè)試數(shù)據(jù),本身就需要花費(fèi)很長(zhǎng)時(shí)間和精力,對(duì)于團(tuán)隊(duì)資源是種低收成的回報(bào)。
有個(gè)搞笑的段子,大家聽聽:
我們從來不做數(shù)據(jù)庫(kù)測(cè)試,要做就在生產(chǎn)環(huán)境做
可,認(rèn)真看過這張圖的朋友,大概是笑不出來的。
在各個(gè)階段做測(cè)試,出現(xiàn)Bug后,修復(fù)所花的代價(jià)是天壤之別。
但做好測(cè)試,可以收獲下面這些益處,至于要不要做,完全取決于當(dāng)前你的團(tuán)隊(duì):
早發(fā)現(xiàn),早治療在數(shù)據(jù)庫(kù)開發(fā)領(lǐng)域,手工測(cè)試和一次性腳本測(cè)試,是最常用的。
但不利于找出是否有破壞性的功能缺陷因?yàn)樾录拥奶匦远搿S辛俗詣?dòng)化的測(cè)試工具,任何時(shí)候針對(duì)任何數(shù)據(jù)庫(kù)版本,都可隨時(shí)完成測(cè)試。
往往尋找一個(gè)bug的產(chǎn)生,需要耗費(fèi)8-16小時(shí),甚至更多,僅僅是因?yàn)槟硞€(gè)開發(fā)嵌入了一個(gè)新模塊的代碼,針對(duì)數(shù)據(jù)庫(kù)開發(fā)來說,沒有特別好的debug工具,只能靠人肉眼去逐行掃描代碼,最終才能定位到某個(gè)可疑的地方。
減少重構(gòu)風(fēng)險(xiǎn)網(wǎng)上有個(gè)玩笑,中年(35歲)程序員如何才能保住自己的飯碗?將SQL寫的越長(zhǎng)越好,越少人看得懂越好。碰到這樣的祖?zhèn)鞔a,很多新人都是要問候原作者的直系親屬的。我上次說5000行代碼的維護(hù),就已經(jīng)有讀者受不了了。
那么怎么規(guī)避這種毫無設(shè)計(jì)感的代碼呢?還是測(cè)試。假如一開始,一個(gè)用戶需求就是一套測(cè)試用例,那么放心的去重構(gòu)吧,愛怎么重構(gòu)就怎么構(gòu),完了跑下測(cè)試就行。但如果沒有測(cè)試,你敢動(dòng)這大幾千行的代碼么,即使你拍著胸脯說,你敢,你老板敢么?
保障團(tuán)隊(duì)協(xié)作如果說程序員比較宅,不喜歡旅游,可以天天上線解決代碼問題,那么誰還能不生個(gè)病呢。如果生病的時(shí)候,你負(fù)責(zé)的代碼出問題了,誰來解決呢?全組都要等一個(gè)人才能繼續(xù)往下工作,這種風(fēng)險(xiǎn)也太大了。
如果有了測(cè)試策略,一個(gè)人斷了線,另一個(gè)人接上,接著往下碼。只要大家都是同一個(gè)平臺(tái),接手完全沒有問題。這對(duì)數(shù)據(jù)庫(kù)開發(fā)就更有利了。無論是sql server, oracle,mysql, 只要測(cè)試用例都在,我們的目標(biāo)就是編寫出通過測(cè)試用例的代碼,至于T-SQL, PL/SQL的轉(zhuǎn)換,文檔查查,一點(diǎn)問題沒有。
那么數(shù)據(jù)庫(kù)怎么做測(cè)試呢,特別是看到上千行的存儲(chǔ)過程,一大堆的 ETL 程序?作為開發(fā),完成功能的實(shí)現(xiàn)就萬事大吉,但作為測(cè)試,既沒有實(shí)現(xiàn)功能的大快人心,還必須提心吊膽為最后的質(zhì)量把關(guān),弄不好,老板認(rèn)為測(cè)試不具備生產(chǎn)力,還要壓低你的薪水,徹底悲劇了你。
既然測(cè)試這么難,那么我們?cè)趺幢U献约簻y(cè)試的質(zhì)量呢?下面說說我的一些個(gè)人看法。
就跟看書一樣,如果拿起一本書從頭看到尾(曾經(jīng)我也是這樣么像教科書一樣看計(jì)算機(jī)的圖書),那么我敢打賭,一本800頁(yè)的數(shù)據(jù)結(jié)構(gòu),99.99%的人,看到300頁(yè)的時(shí)候,絕對(duì)放棄了,頂多再往后多翻 5 頁(yè),即305頁(yè)。然后不停的翻翻后面,數(shù)數(shù)還有多少 頁(yè)沒看,還需要花多少時(shí)間,不用問為什么我知道,你懂得。
那么我從什么時(shí)候開始不這么看書了呢?從看完《CLR Via C#》開始.本書777頁(yè),我花了近 5 個(gè)多月,每個(gè)禮拜天就躲在家里看,看不下去了,就喝杯星巴克,繼續(xù)看,邊看邊畫。最終一頁(yè)不落,全部看完。有些地方還看了不止5遍。還有本手冊(cè),《Oracle Concepts》,大概看了不少于 6 遍,邊看邊畫,每個(gè)晚上8點(diǎn)準(zhǔn)時(shí)看,一直到看不動(dòng)為止。
那么為什么看完這兩本之后,再也不相信從頭到尾的看書方式了呢?因?yàn)楹玫臅渖虾玫慕Y(jié)構(gòu),你看任何 一章,都是可以不需要前面章節(jié)的知識(shí),依舊可以讀的很愉快。如果讀不懂,通過想象力和搜索引擎,反而能解決當(dāng)下最重要的問題。
因此,讀書最重要的是明白自己想要什么。測(cè)試也一樣,必須根據(jù)測(cè)試內(nèi)容,而制定測(cè)試計(jì)劃。如果要測(cè)試并發(fā)壓力,就不能用單元測(cè)試;要測(cè)試新功能,就不能執(zhí)行回歸測(cè)試。
那么,數(shù)據(jù)庫(kù)測(cè)試主要有哪些分類呢?
有的同學(xué)會(huì)覺得數(shù)據(jù)庫(kù)測(cè)試很簡(jiǎn)單,先 R(retrieve) 一下,在CUD(Create Update Delete) 一波,最后在 R 以下,如果滿足結(jié)果就算測(cè)試通過。
畫個(gè)圖介紹下,不就是這樣么:
其實(shí),正確的測(cè)試應(yīng)該做到這樣:
將測(cè)試封裝在一個(gè)存儲(chǔ)過程里。
單元測(cè)試:?jiǎn)卧獪y(cè)試的目的,就是取最小單元的程序,比如一個(gè)存儲(chǔ)過程,用測(cè)試數(shù)據(jù)來測(cè)試它是否完成了我們需要完成的功能。
那我們就來好好研究,數(shù)據(jù)庫(kù)性能測(cè)試的評(píng)測(cè)方法。也就是怎么去設(shè)計(jì)一套評(píng)測(cè)數(shù)據(jù)庫(kù)性能的軟件。我的數(shù)據(jù)庫(kù)性能好不好,必須由我說了算。
這套軟件的特點(diǎn)必須是:
1)分布式:模擬從不同設(shè)備訪問數(shù)據(jù)庫(kù),以達(dá)到真實(shí)的用戶訪問。
2)實(shí)時(shí)監(jiān)控:如果性能弱的時(shí)候沒有及時(shí)抓住,那么很可能呢下次帶來更大麻煩的時(shí)候,我們依然手足無措。所以在測(cè)試階段就必須一擊即中。
說實(shí)話,這篇論文對(duì)于我來說,很有收獲。
設(shè)計(jì)數(shù)據(jù)庫(kù)測(cè)試軟件,不是一朝一夕的事情,它是一個(gè)體系,值得作為職業(yè)。
錄
第一章 諸論
第一節(jié) 開發(fā)工具的選用及介紹
第二節(jié) ASP技術(shù)訪問WEB數(shù)據(jù)庫(kù)
第二章 系統(tǒng)分析與總體設(shè)計(jì)
第一節(jié) 系統(tǒng)功能描述
第二節(jié) 系統(tǒng)功能模塊劃分
第三節(jié) 系統(tǒng)流程分析
第三章 數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)與實(shí)現(xiàn)
第一節(jié) 創(chuàng)建數(shù)據(jù)庫(kù)
第二節(jié) 數(shù)據(jù)庫(kù)邏輯結(jié)構(gòu)設(shè)計(jì)
第三節(jié) 創(chuàng)建表的腳本文件
第四章 目錄結(jié)構(gòu)與通用模塊
第一節(jié) 目錄結(jié)構(gòu)
第二節(jié) 通用模塊
第五章 系統(tǒng)主界面與登錄程序設(shè)計(jì)
第一節(jié) 設(shè)計(jì)主界面
第二節(jié) 登錄程序設(shè)計(jì)
第三節(jié) 設(shè)計(jì)管理界面
第六章 新聞?lì)悇e管理模塊設(shè)計(jì)
第一節(jié) 設(shè)計(jì)新聞?lì)悇e管理界面
第二節(jié) 添加新聞?lì)悇e
第三節(jié) 修改新聞?lì)悇e
第四節(jié) 刪除新聞?lì)悇e
第七章 新聞發(fā)布管理模塊設(shè)計(jì)
第一節(jié) 添加新聞
第二節(jié) 修改新聞
第三節(jié) 刪除新聞
第四節(jié) 新聞查詢管理
第八章 調(diào)試與安裝
第一節(jié) 安裝IIS
第二節(jié) ASP硬件要求
結(jié)束語(yǔ)
參 考 文 獻(xiàn)
后 記
摘要
【摘要】我們從建站的實(shí)際情況出發(fā),經(jīng)過對(duì)有關(guān)網(wǎng)站新聞發(fā)布事項(xiàng)的一番考察和分析,確立了新聞發(fā)布系統(tǒng)的具體實(shí)現(xiàn)功能。并闡述系統(tǒng)的結(jié)構(gòu)設(shè)計(jì)和功能設(shè)計(jì),實(shí)現(xiàn)新聞的分類顯示,最近新聞的提示,新聞滾動(dòng)功能等。經(jīng)過授權(quán)的用戶可以通過Web瀏覽器,以人機(jī)交互式的客戶端程序?qū)崿F(xiàn)對(duì)學(xué)校新聞的發(fā)布、管理、實(shí)時(shí)的進(jìn)行行為統(tǒng)計(jì)和記錄。本系統(tǒng)是學(xué)校網(wǎng)站的一個(gè)子系統(tǒng),具有很好的外部接口,能夠很好的配合站點(diǎn)的其它子系統(tǒng)服務(wù)于網(wǎng)站的新聞發(fā)布.該系統(tǒng)是一個(gè)基于新聞發(fā)布和內(nèi)容管理的全站管理系統(tǒng);基于B/S模式WEBMIS系統(tǒng),本系統(tǒng)可以將雜亂無章的信息(包括文字、圖片和影音)經(jīng)過組織,合理而且有序地呈現(xiàn)在大家面前。簡(jiǎn)單的說,新聞發(fā)布系統(tǒng)就是充當(dāng)一個(gè)網(wǎng)絡(luò)新聞媒介的功能。
主要實(shí)現(xiàn)對(duì)新聞的分類,審核,發(fā)布,模擬了一般新聞媒介的發(fā)布的過程
【Abstract】 we embark from the station construction actual situation,pass through to a related website news issue item inspection and theanalysis, has established the news issue system concrete realizationfunction. And the elaboration system structural design and thefunctional design, realize the news classification to demonstratethat, the recent news prompt, the news rolls the function and so on.After the authorized user may through the Web browser, by theman-machine interactive customer end procedure realization to theschool news issue, the management, real-time carry on the behaviorstatistics and the record. This system is a school website sub-system, has the very good exterior connection, can the very goodcoordinate stand other subsystems serve the website news issue This system is based on the news issue and the content managemententire station management system management system; Based on B/S thepattern WEBMIS system, this system may the chaotic information(including writing, picture and video and music) the processorganization, reasonably has the foreword to present in front ofeverybody. Simple saying, the news issued the system is acts as a NetNews medium the function, the main realization to the newsclassification, the verification, the issue, has simulated the commonnews medium news issue process
前言
在Internet飛速發(fā)展的今天,互聯(lián)網(wǎng)成為人們快速獲取、發(fā)布和傳遞信息的重要渠道,它在人們政治、經(jīng)濟(jì)、生活等各個(gè)方面發(fā)揮著重要的作用。Internet上發(fā)布信息主要是通過網(wǎng)站來實(shí)現(xiàn)的,獲取信息也是要在Internet“海洋”中按照一定的檢索方式將所需要的信息從網(wǎng)站上下載下來。因此網(wǎng)站建設(shè)在Internet應(yīng)用上的地位顯而易見,它已成為政府、企事業(yè)單位信息化建設(shè)中的重要組成部分,從而倍受人們的重視。
由于時(shí)間有限,加之信息系統(tǒng)開發(fā)經(jīng)驗(yàn)的缺少和編程能力的有限,所以本系統(tǒng)難免存在各種各樣的缺點(diǎn)。敬請(qǐng)指導(dǎo)老師能夠提出批評(píng)和寶貴意見,也希望各位讀者提出寶貴意見并進(jìn)行指正,謝謝!
1. ASP的優(yōu)勢(shì):Active Server Pages:“動(dòng)態(tài)服務(wù)器網(wǎng)頁(yè)”,一般簡(jiǎn)稱為“ASP”,ASP之所以能受到大家的重視與使用的原因,主要在于所產(chǎn)生的執(zhí)行結(jié)果都是標(biāo)準(zhǔn)的HTML格式,而且這些程序是在網(wǎng)絡(luò)服務(wù)端中執(zhí)行,使用一般的瀏覽器(如IE 或Netscape)都可以正確地獲得ASP的“執(zhí)行”結(jié)果,并且將這ASP執(zhí)行的結(jié)果直接在瀏覽器中“瀏覽”,不像VBScript或 JavaScript是在客戶端(Client)的瀏覽器上執(zhí)行,若使用VBScript來設(shè)計(jì)程序,客戶端(Client)在IE瀏覽器中可以顯示程序執(zhí)行的結(jié)果,可是,客戶端(Client)若使用Netscape瀏覽器就無法顯示VBScript的執(zhí)行結(jié)果。
2.ASP的特點(diǎn):任何開發(fā)工具皆可發(fā)展ASP。只要使用一般的文書編輯程序,如Windows記事本,就可以編輯。當(dāng)然,其他網(wǎng)頁(yè)發(fā)展工具,例如,F(xiàn)rontPage Express、 FrontPage等也都可以;不過還是建議你用記事本來寫,既省錢又方便,若是使用那些所見即所得的網(wǎng)頁(yè)編輯來寫ASP,可能會(huì)發(fā)生一些意想不到的離奇狀態(tài)。
3.通吃各家瀏覽由于ASP程序是在網(wǎng)絡(luò)服務(wù)器端中執(zhí)行,執(zhí)行結(jié)果所產(chǎn)生的HTML文件適用于不同的瀏覽器。
4.語(yǔ)言相容性高:ASP與所有的ActiveX Script語(yǔ)言都相容,除了可結(jié)合HTML,VBScript、Java Script、Active X服務(wù)器組件來設(shè)計(jì)外,并可經(jīng)由“plug-In(外掛組件模組)的方式,使用其他廠商(Third Party)所提供的語(yǔ)言。
隱密安全性高。如果我們?cè)跒g覽器中直接查看網(wǎng)頁(yè)的原始代碼,就只能看到HTML文件,原始的ASP程序代碼是看不到的!這是因杰ASP程序先于網(wǎng)站服務(wù)(Web Server)端執(zhí)行后,將結(jié)果轉(zhuǎn)換成標(biāo)準(zhǔn)HTML文件,再傳送到客戶端(Client)的瀏覽器上,因此,我們所辛苦撰寫的ASP程序并不會(huì)輕易地被看見進(jìn)而被盜用。
5.易于操控?cái)?shù)據(jù)庫(kù):ASP可以輕易地通過ODBC(Open Database Connectivity)驅(qū)動(dòng)程序連接各種不同的數(shù)據(jù)庫(kù),例如:Acess、Foxpro、dBase、Oracle等等,另外,ASP亦可將“文本文件”或是”Excel” 文件當(dāng)成數(shù)據(jù)庫(kù)用。
6.面向?qū)ο髮W(xué)習(xí)容易:ASP具備有面向?qū)ο螅∣bject-Oriented)功能,學(xué)習(xí)容易,ASP提供了五種方便能力強(qiáng)大的內(nèi)建對(duì)象:Request、Response、Sever、Application以及Session,同時(shí),若使用ASP內(nèi)建的“Application”對(duì)象或”Session”對(duì)象所撰寫出來的ASP程序可以在多個(gè)網(wǎng)頁(yè)之間暫時(shí)保存必要的信息。
ASP的六大內(nèi)部對(duì)象Request、Response、Server、Session、Application、ObjectContext 從客戶端取得信息將信息送給客戶端提供一些Web服務(wù)器工具儲(chǔ)存在一個(gè)Session內(nèi)的用戶信息,該信息僅可被該用戶訪問在一個(gè)ASP-Application中讓不同的客戶端共享信息可以用來配合Microsoft Transaction 服務(wù)器進(jìn)行分布式事務(wù)處理。
所以我選擇了ASP結(jié)合Frontpage架構(gòu)網(wǎng)站。在此期間本人將使用Macromedia Dreamweaver MX 2004進(jìn)行ASP頁(yè)面的編碼,并使用IIS6.0對(duì)頁(yè)面進(jìn)行調(diào)試。
一.訪問WEB數(shù)據(jù)庫(kù)的多種方案
目前在WINDOWS環(huán)境下有多種訪問WEB數(shù)據(jù)庫(kù)的技術(shù),主要有:
(1).公共網(wǎng)關(guān)接口CGI(Common Gateway Interface)
CGI是較早實(shí)現(xiàn)的技術(shù)。適用于多種服務(wù)器平臺(tái),如UNIX、WINDOWS等,但CGI的開發(fā)成本高、維護(hù)困難、功能有限、不具備事務(wù)處理功能、占用服務(wù)器資源較多。
(2). INTERNET數(shù)據(jù)庫(kù)連接器IDC(Internet Database Connector)。
IDC集成在ISAPI(Internet Server API)中,充分利用了DLL技術(shù),易擴(kuò)充,但編程較CGI更為復(fù)雜,只適用于小型數(shù)據(jù)庫(kù)系統(tǒng)。
(3). 先進(jìn)數(shù)據(jù)庫(kù)連接器ADC(Advance Database Connector)
ADC提供了ActiveX Control來訪問數(shù)據(jù)庫(kù),它的主要特點(diǎn)是數(shù)據(jù)查詢由用戶端瀏覽器執(zhí)行,因而需將服務(wù)器端數(shù)據(jù)庫(kù)中的部分記錄下載到用戶端,系統(tǒng)開銷較大、響應(yīng)慢,只適用于特別頻繁的數(shù)據(jù)庫(kù)查詢操作。
(4). JAVA/JDBC語(yǔ)言編程
JAVA語(yǔ)言是一種面向?qū)ο蟆⒁滓浦病⒍嗑€程控制的語(yǔ)言,可通過JDBC去連接數(shù)據(jù)庫(kù)。用JAVA/JDBC編寫的軟件可移植性強(qiáng),適用于多種操作系統(tǒng),但其執(zhí)行效率和執(zhí)行速度還不理想,目前無法建立高效、高速的應(yīng)用。
(5). 動(dòng)態(tài)服務(wù)器頁(yè)面ASP(Active Server Page)
ASP是微軟公司最新推出的WEB應(yīng)用開發(fā)技術(shù),著重于處理動(dòng)態(tài)網(wǎng)頁(yè)和WEB數(shù)據(jù)庫(kù)的開發(fā),編程靈活、簡(jiǎn)潔,具有較高的性能,是目前訪問WEB數(shù)據(jù)庫(kù)的最佳選擇。
二.ASP簡(jiǎn)介
1.ASP訪問數(shù)據(jù)庫(kù)的原理
ASP是服務(wù)器端的腳本執(zhí)行環(huán)境,可用來產(chǎn)生和執(zhí)行動(dòng)態(tài)的高性能的WEB服務(wù)器程序。
當(dāng)用戶使用瀏覽器請(qǐng)求ASP主頁(yè)時(shí),WEB服務(wù)器響應(yīng),調(diào)用ASP引擎來執(zhí)行ASP文件,并解釋其中的腳本語(yǔ)言(JScript 或VBScript),通過ODBC連接數(shù)據(jù)庫(kù),由數(shù)據(jù)庫(kù)訪問組件ADO(ActiveX Data Objects)完成數(shù)據(jù)庫(kù)操作,最后ASP生成包含有數(shù)據(jù)查詢結(jié)果的HTML主頁(yè)返回用戶端顯示。
由于ASP在服務(wù)器端運(yùn)行,運(yùn)行結(jié)果以HTML主頁(yè)形式返回用戶瀏覽器,因而ASP源程序不會(huì)泄密,增加了系統(tǒng)的安全保密性。此外,ASP是面向?qū)ο蟮哪_本環(huán)境,用戶可自行增加ActiveX組件來擴(kuò)充其功能,拓展應(yīng)用范圍。
2.ASP頁(yè)面的結(jié)構(gòu):
ASP的程序代碼簡(jiǎn)單、通用,文件名由.asp結(jié)尾,ASP文件通常由四部分構(gòu)成:
(1) 標(biāo)準(zhǔn)的HTML標(biāo)記:所有的HTML標(biāo)記均可使用。
(2) ASP語(yǔ)法命令:位于<% %> 標(biāo)簽內(nèi)的ASP代碼。
(3) 服務(wù)器端的include語(yǔ)句:可用#include語(yǔ)句調(diào)入其它ASP代碼,增強(qiáng)了編程的靈活性。
(4) 腳本語(yǔ)言:ASP自帶JScript和VBScript兩種腳本語(yǔ)言,增加了ASP的編程功能,用戶也可安裝其它腳本語(yǔ)言,如Perl、Rexx等。
3.ASP的運(yùn)行環(huán)境
目前ASP可運(yùn)行在三種環(huán)境下。
(1) WINDOWS NT server 4.0運(yùn)行IIS 3.0(Internet Information Server)以上。
(2) WINDOWS NT workstation 4.0運(yùn)行Peer Web Server 3.0以上。
(3) WINDOWS 95/98運(yùn)行PWS(Personal Web Server)。
其中以NT server上的IIS功能最強(qiáng),提供了對(duì)ASP的全面支持,是創(chuàng)建高速、穩(wěn)定的ASP主頁(yè)的最佳選擇。
4.ASP的內(nèi)建對(duì)象
ASP提供了六個(gè)內(nèi)建對(duì)象,供用戶直接調(diào)用:
(1) Application對(duì)象:負(fù)責(zé)管理所有會(huì)話信息,可用來在指定的應(yīng)用程序的所有用戶之間共享信息。
(2) Session對(duì)象:存貯特定用戶的會(huì)話信息,只被該用戶訪問,當(dāng)用戶在不同WEB頁(yè)面跳轉(zhuǎn)時(shí),Session中的變量在用戶整個(gè)會(huì)話過程中一直保存。Session對(duì)象需cookie支持。
(3) Request對(duì)象:從用戶端取得信息傳遞給服務(wù)器,是ASP讀取用戶輸入的主要方法。
(4) Response對(duì)象:服務(wù)器將輸出內(nèi)容發(fā)送到用戶端。
(5) Server對(duì)象:提供對(duì)服務(wù)器有關(guān)方法和屬性的訪問。
(6) Object Context對(duì)象:IIS 4.0新增的對(duì)象,用來進(jìn)行事務(wù)處理。此項(xiàng)功能需得到MTS(Microsoft Transcation Server)管理的支持。
5. ASP的主要內(nèi)置組件:
(1) Ad Rotator組件:用來按指定計(jì)劃在同一頁(yè)上自動(dòng)輪換顯示廣告,用于WWW上日益重要的廣告服務(wù)。
(2) Browser Capabilities組件:確定訪問WEB站點(diǎn)的用戶瀏覽器的功能數(shù)據(jù),包括類型、性能、版本等。
(3) Database Access組件:提供ADO (ActiveX Data Objects)來訪問支持ODBC的數(shù)據(jù)庫(kù)。
(4) File Access組件:提供對(duì)服務(wù)器端文件的讀寫功能。
(5) Content Linking組件:生成WEB頁(yè)內(nèi)容列表,并將各頁(yè)順序連接,用于制作導(dǎo)航條。
此外,還可安裝Myinfo、Counters、Content Rotator、Page Count等組件,用戶也可自行編制Actiive組件,以提高系統(tǒng)的實(shí)用性。
6. Database Access組件ADO
WWW上很重要的應(yīng)用是訪問WEB數(shù)據(jù)庫(kù),用ASP訪問WEB數(shù)據(jù)庫(kù)時(shí),必須使用ADO組件,ADO是ASP內(nèi)置的ActiveX服務(wù)器組件(ActiveX Server Component),通過在WEB服務(wù)器上設(shè)置ODBC和OLEDB可連接多種數(shù)據(jù)庫(kù):如SYBASE、ORACLE、INFORMIX、SQL SERVER、ACCESS、VFP等,是對(duì)目前微軟所支持的數(shù)據(jù)庫(kù)進(jìn)行操作的最有效和最簡(jiǎn)單直接的方法。
ADO組件主要提供了以下七個(gè)對(duì)象和四個(gè)集合來訪問數(shù)據(jù)庫(kù)。
(1) Connection對(duì)象:建立與后臺(tái)數(shù)據(jù)庫(kù)的連接。
(2) Command對(duì)象:執(zhí)行SQL指令,訪問數(shù)據(jù)庫(kù)。
(3) Parameters對(duì)象和Parameters集合:為Command對(duì)象提供數(shù)據(jù)和參數(shù)。
(4) RecordSet對(duì)象:存放訪問數(shù)據(jù)庫(kù)后的數(shù)據(jù)信息,是最經(jīng)常使用的對(duì)象。
(5) Field對(duì)象和Field集合:提供對(duì)RecordSet中當(dāng)前記錄的各個(gè)字段進(jìn)行訪問的功能。
(6) Property對(duì)象和Properties集合:提供有關(guān)信息,供Connection、Command、RecordSet、Field對(duì)象使用。
(7) Error對(duì)象和Errors集合:提供訪問數(shù)據(jù)庫(kù)時(shí)的錯(cuò)誤信息。
很多網(wǎng)站都提供新聞欄目,例如搜狐、新浪等著名網(wǎng)站的新聞專欄。許多企業(yè)和個(gè)人網(wǎng)站也需要定期發(fā)布一些關(guān)于企業(yè)或網(wǎng)站的新聞。因?yàn)榫W(wǎng)絡(luò)中新聞發(fā)布的頻率非常高,如果使用靜態(tài)網(wǎng)頁(yè)作為新聞頁(yè)面,則維護(hù)工作將非常繁瑣,管理員每天需要制作大量的網(wǎng)頁(yè),從而浪費(fèi)很多時(shí)間和精力。使用新聞發(fā)布及管理系統(tǒng)可以使新聞發(fā)布和管理變得很輕松,管理員只需設(shè)置標(biāo)題、內(nèi)容和圖片等新聞就可以了,系統(tǒng)將自動(dòng)生成對(duì)應(yīng)的網(wǎng)頁(yè)。本文將對(duì)新聞發(fā)布及管理系統(tǒng)進(jìn)行系統(tǒng)分析與總體設(shè)計(jì)。
新聞發(fā)布及管理系統(tǒng)包括新聞?lì)悇e管理、新聞發(fā)布管理、圖片處理、新聞查詢、網(wǎng)友評(píng)論和用戶管理等模塊。具體描述如下:
1.新聞?lì)悇e管理:
(1)新聞?lì)悇e的錄入,包括類別編號(hào)和類別名稱等信息;
(2)新聞?lì)悇e的修改;
(3)新聞?lì)悇e的刪除;
(4)新聞?lì)悇e的查詢。
2.新聞發(fā)布管理:
(1)基本新聞信息的錄入,包括新聞標(biāo)題、新聞內(nèi)容和所屬類別等;
(2)基本新聞信息的修改;
(3)基本新聞信息的刪除;
3.圖片處理模塊:
(1)選擇圖片文件;
(2)上傳圖片文件;
(3)存儲(chǔ)圖片新聞;
(4)修改新聞圖片;
(5)刪除新聞圖片;
(6)在網(wǎng)頁(yè)中瀏覽新聞圖片。
4.新聞查詢模塊:
(1)按照新聞?lì)悇e分頁(yè)顯示新聞; -
(2)按照日期分頁(yè)顯示新聞。
5.網(wǎng)友留言模塊:
(1)網(wǎng)友對(duì)某條新聞發(fā)表評(píng)論;
(2)管理員可以刪除新聞評(píng)論。
6.系統(tǒng)用戶管理功能:
(1)系統(tǒng)用戶信息的錄入,包括用戶名和密碼等信息;
(2)系統(tǒng)用戶信息的修改;
(3)系統(tǒng)用戶信息的刪除。
從功能描述的內(nèi)容可以看到,本實(shí)例可以實(shí)現(xiàn)6個(gè)完整的功能。我們根據(jù)這些功能,設(shè)計(jì)出系統(tǒng)的功能模塊,如圖1所示。
圖1 新聞發(fā)布及管理系統(tǒng)功能模塊示意圖
新聞發(fā)布及管理系統(tǒng)的功能模塊之間的關(guān)系如圖2所示。
圖2 新聞發(fā)布及管理系統(tǒng)的功能模塊關(guān)系圖
在本系統(tǒng)中,用戶管理模塊的功能比較簡(jiǎn)單。在系統(tǒng)初始化時(shí),有一個(gè)默認(rèn)的“系統(tǒng)管理員”用戶Admin,由程序設(shè)計(jì)人員手動(dòng)地添加到數(shù)據(jù)庫(kù)中。Admin用戶可以創(chuàng)建用戶、修改和刪除用戶;普通用戶則只能修改自己的用戶名和密碼。
用戶管理功能模塊的關(guān)系如圖3所示。
圖3 用戶管理功能模塊的關(guān)系圖
為了使讀者進(jìn)一步了解本實(shí)例系統(tǒng)的設(shè)計(jì),本小節(jié)將對(duì)系統(tǒng)進(jìn)行流程分析。多用戶系統(tǒng)的工作流程都是從用戶登錄模塊開始,對(duì)用戶的身份進(jìn)行認(rèn)證。身份認(rèn)證可以分為以下兩個(gè)過程:
(1)確認(rèn)用戶是否是有效的系統(tǒng)用戶。
(2)確定用戶的類型。
第1個(gè)過程決定用戶能否進(jìn)入系統(tǒng)。第2個(gè)過程根據(jù)用戶的類型決定用戶的操作權(quán)限,從而決定用戶的工作界面。
本系統(tǒng)分為前臺(tái)系統(tǒng)和后臺(tái)系統(tǒng)兩個(gè)部分。前臺(tái)系統(tǒng)不需要進(jìn)行身份認(rèn)證,任何人都可以通過瀏覽器閱讀已經(jīng)發(fā)布的新聞、發(fā)表網(wǎng)友評(píng)論。
后臺(tái)系統(tǒng)的流程分析如圖4所示。Admin用戶擁有所有的權(quán)限,普通用戶只能對(duì)自己發(fā)布的新聞進(jìn)行管理,包括修改新聞內(nèi)容、刪除新聞和刪除網(wǎng)友評(píng)論。
圖4 后臺(tái)系統(tǒng)的流程分析
這一章將介紹系統(tǒng)的數(shù)據(jù)庫(kù)表結(jié)構(gòu)和創(chuàng)建表的腳本。
首先創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)news,用來保存本系統(tǒng)的所有數(shù)據(jù)。創(chuàng)建數(shù)據(jù)庫(kù)的腳本代碼如下:
CREATE DATABASE news
GO
可以在SQL查詢分析器中執(zhí)行該語(yǔ)句,創(chuàng)建數(shù)據(jù)庫(kù)。
本系統(tǒng)定義的數(shù)據(jù)庫(kù)中包含以下4個(gè)表:新聞?lì)悇e表:Category、新聞基本信息表:News、網(wǎng)友評(píng)論信息表:Discuss和用戶信息表:users。
下面分別介紹這些表的結(jié)構(gòu)。
1.新聞?lì)悇e表Category
新聞?lì)悇e表Category用來保存新聞?lì)悇e數(shù)據(jù),結(jié)構(gòu)如表1所示。
表1 表Category的結(jié)構(gòu)
編號(hào) | 字段名稱 | 數(shù)據(jù)結(jié)構(gòu) | 說明 |
1 | CateId | int | 新聞?lì)悇e編號(hào) |
2 | CateName | varchar (50) | 新聞?lì)悇e名稱 |
在設(shè)計(jì)數(shù)據(jù)庫(kù)結(jié)構(gòu)時(shí),很多表都需要設(shè)計(jì)一個(gè)整型字段作為標(biāo)識(shí)列,這幾乎已經(jīng)成為慣例,例如表Category中的CateId字段。所謂標(biāo)識(shí)列,就是可以惟一標(biāo)識(shí)一行記錄的列,在表中不會(huì)存在兩條標(biāo)識(shí)列相同的記錄。如果其他表需要引用表Category中的數(shù)據(jù),則在表中添加一個(gè)CateId字段就可以了。有的程序設(shè)計(jì)人員習(xí)慣于直接使用名稱字段作為標(biāo)識(shí)列,例如表Category中的CateName字段。這樣,如果修改CateName字段的值,就需要同時(shí)修改其他所有表的相應(yīng)字段的值,從而造成不必要的麻煩。在系統(tǒng)中,CateId字段對(duì)于用戶來說是透明的,用戶感覺不到它的存在,也無法對(duì)其進(jìn)行修改。
2.基本新聞表News
基本新聞表News用來保存網(wǎng)上新聞的基本信息,結(jié)構(gòu)如表2所示。
表2表News的結(jié)構(gòu)
編號(hào) | 字段名稱 | 數(shù)據(jù)結(jié)構(gòu) | 說明 |
1 | Id | int | 新聞編號(hào) |
2 | Title | varchar(100) | 新聞標(biāo)題 |
3 | Content | text | 新聞內(nèi)容 |
4 | PostTime | datetime | 提交時(shí)間 |
5 | Poster | varchar(50) | 提交人 |
6 | CateId | int | 新聞?lì)悇e編號(hào) |
7 | Attpic | bit | 是否有圖片標(biāo)記(0沒有;1有) |
8 | Readcount | int | 閱讀次數(shù) |
在SQL Server 2000中,可以使用char、varchar和text等3種數(shù)據(jù)類型存儲(chǔ)非Unicode字符數(shù)據(jù)。char和varchar只能存儲(chǔ)最多8000個(gè)字符,其中char用于存儲(chǔ)固定長(zhǎng)度的字符數(shù)據(jù),varchar用于存儲(chǔ)可變長(zhǎng)度的字符數(shù)據(jù)。如果需要存儲(chǔ)的數(shù)據(jù)很大,則可以使用text數(shù)據(jù)類型,例如表News中的Content字符,因?yàn)樾侣剝?nèi)容的數(shù)據(jù)量通常會(huì)超過8000個(gè)字符。text數(shù)據(jù)類型也是可變長(zhǎng)度的,最多可為2147483647個(gè)字符。
3.網(wǎng)友評(píng)論信息表Discuss
網(wǎng)友評(píng)論信息表Discuss用來保存網(wǎng)友對(duì)新聞的評(píng)論信息,結(jié)構(gòu)如表3所示。
表3 表Discuss的結(jié)構(gòu)
編號(hào) | 字段名稱 | 數(shù)據(jù)結(jié)構(gòu) | 說明 |
1 | id | int | 評(píng)論編號(hào) |
2 | UserId | varchar(20) | 評(píng)論人名稱 |
3 | Posttime | sinaildatetime | 提交時(shí)間 |
4 | Content | varchar(4000) | 評(píng)論內(nèi)容 |
5 | Newsld | int | 新聞編號(hào) |
在SQL Server 2000中,可以使用datetime和smalldatetime兩種數(shù)據(jù)類型存儲(chǔ)日期時(shí)間數(shù)據(jù)。datetime數(shù)據(jù)類型用于存儲(chǔ)從1753年1月1日到9999年12月31日的日期和時(shí)間數(shù)據(jù),精確到3.33ms;smalldatetime數(shù)據(jù)類型用于存儲(chǔ)從1900年1月1日到2079年6月6日的日期和時(shí)間數(shù)據(jù),精確到分鐘。有些程序員習(xí)慣于使用datetime數(shù)據(jù)類型存儲(chǔ)日期時(shí)間數(shù)據(jù),其實(shí)在精確度要求不高的情況下,使用smalldatetime數(shù)據(jù)類型是足夠了。
4..用戶信息表Users
用戶信息表Users用來保存用戶的基本信息,結(jié)構(gòu)如表8.4所示。
編號(hào) | 字段名稱 | 數(shù)據(jù)結(jié)構(gòu) | 說明 |
1 | UserId | int | 用戶ID號(hào) 。 |
2 | UserName | varchar(50) | 用戶名 |
3 | UserPwd | varcahr(50) | 密碼 |
4 | Ename | varchar(50) | 用戶姓名 |
5 | varchar(50) | 電子郵箱 |
本節(jié)將介紹創(chuàng)建表的腳本文件,可以在“查詢分析器”中執(zhí)行這些腳本,在數(shù)據(jù)庫(kù)news中創(chuàng)建表。
1.創(chuàng)建表Category
創(chuàng)建表category的腳本文件為Category.sql,它的代碼如下:
USE news
GO
CREATE TABLE Category
(
CateId Int IDENTITY PRIMARY KEY,
CateName Varchar(50) NOT NULL
)
GO
在使用CREATE TABLE指令創(chuàng)建表時(shí),應(yīng)該注意使用PRIMARY KEY關(guān)鍵字定義表的主鍵。表中每一行的主鍵都有惟一值,可以使用主鍵惟一地標(biāo)識(shí)一行數(shù)據(jù)。
2.創(chuàng)建表News
創(chuàng)建表News的腳本文件為News.sql,它的代碼如下:
USE news
GO
CREATE TABLE News
(
Id Int IDENTITY PRIMARY KEY,
Title Varchar(100) NOT NULL,
Content Text,
PostTime Datetime,
Poster Varchar(50),
CateId Int,
Attpic Int DEFAULT 0,
ReadCount Int DEFAULT 0
)
GO
在使用CREATE TABLE指令創(chuàng)建表時(shí),應(yīng)該注意使用NOT NULL關(guān)鍵字定義表的未空字段。使用NOT NULL定義的字段將不允許為空,這樣就可以避免表中出現(xiàn)無效的數(shù)據(jù),影響系統(tǒng)運(yùn)行。例如,表News中的Title字段將不能為空,否則在新聞列表中將出現(xiàn)一個(gè)空行。
在使用CREATE TABLE指令創(chuàng)建表時(shí),使用DEFAULT關(guān)鍵字可以字義字段的默認(rèn)值,例如表News中,Attpic和ReadCount字段的默認(rèn)值為0。
3.創(chuàng)建表Discuss
創(chuàng)建表Discuss的腳本文件為Discuss.sql,它的代碼如下:
USE news
GO
CREATE TABLE Discuss
(
Id Int IDENTITY PRIMARY KEY,
UserId Varchar(20),
Posttime Smalldatetime,
Content Varchar(4000),
NewsId Int
)
GO
在使用CREATE TABLE指令創(chuàng)建表時(shí),通常可以使用IDENTITY關(guān)鍵字與PRIMARY KEY關(guān)鍵字相結(jié)合,創(chuàng)建標(biāo)識(shí)字段。每次增加新記錄時(shí),標(biāo)識(shí)字段自動(dòng)遞增。程序員在編寫程序的過程申,無需考慮標(biāo)識(shí)字段的值。
4.創(chuàng)建表Users
創(chuàng)建表Users的腳本文件為Users.sql,它的代碼如下:
USE news
GO
CREATE TABLE Users
( UserId Int Primary Key IDENTITY,
UserName Varchar(50) NOT NULL,
UserPwd Varchar(50) NOT NULL,
Ename Varchar(50),
Email Varchar(50)
)
GO
INSERT INTO Users (UserName, UserPwd, Ename, Email) VALUES('Admin', '111111', '', '')
GO
在創(chuàng)建表users的同時(shí),將默認(rèn)的用戶Admin插入到表中,默認(rèn)的密碼為“l(fā)lllll”。
在執(zhí)行這些腳本之前,請(qǐng)確定數(shù)據(jù)庫(kù)news已經(jīng)存在,否則會(huì)產(chǎn)生錯(cuò)誤。如果要?jiǎng)?chuàng)建的表已經(jīng)存在,則需要先將表刪除。
在運(yùn)行實(shí)例時(shí),需要將web目錄復(fù)制到IIS/PWS的根目錄下,例如
目錄下包含下面兩個(gè)子目錄:
images用于存儲(chǔ)上傳的新聞圖片;
pic用于存儲(chǔ)網(wǎng)頁(yè)中的圖片文件;
其他ASP和HTM文件都保存在web目錄下。
本實(shí)例中包含一些通用模塊,這些模塊以文件的形式保存,可以在其他文件中使用#include語(yǔ)句包含這些模塊,使用其中定義的功能。
1.ConnDB.asp
ConnDB.asp的功能是實(shí)現(xiàn)到數(shù)據(jù)庫(kù)的連接,因?yàn)樵诤芏嗑W(wǎng)頁(yè)中都有連接數(shù)據(jù)庫(kù)的操作,所以把它保存在文件ConnDB.asp中,這樣可以避免重復(fù)編程。ConnDB.asp的代碼如下:
<%
dim Conn
dim ConnStr
set Conn=server.createobject("adodb.connection")ConnStr="driver={SQL Server};server=(local);UID=sa;PWD=yourpassword;Database=news"
Conn.Open ConnStr
%>
在文件中引用此文件作為頭文件就可以訪問數(shù)據(jù)庫(kù),代碼如下:
<!--#include File="ConnDB.asp"-->
2.IsAdmin.asp
因?yàn)楸緦?shí)例中有些功能只有Admin用戶才有權(quán)限使用,所以在進(jìn)入這些網(wǎng)頁(yè)之前,需要判斷用戶是否是Admin。IsAdmin.asp的功能是判斷當(dāng)前用戶是否是Admin,如果不是,則中斷執(zhí)行;如果是,則不執(zhí)行任何操作,直接進(jìn)入包含它的網(wǎng)頁(yè)。
IsAdmin.asp的代碼如下:
<%
If Session("UserName") <> "Admin" Then
Response.Write("不是Admin用戶,沒有此權(quán)限")
Response.End
End If
%>
在文件中引用此文件作為頭文件,代碼如下:
<!--#include File="IsAdmin.asp"-->
3.IsAuthor.asp
在修改和刪除新聞時(shí),除了Admin用戶擁有所有權(quán)限外,其他用戶只能修改自己創(chuàng)建的新聞。所以在修改和刪除新聞時(shí),需要判斷當(dāng)前用戶是否是Admin或指定新聞的作者。
IsAuthor.asp可以實(shí)現(xiàn)此功能,代碼如下:
<%
If Session("UserName") <> "Admin" Then
NewsId = Request("Id")
'根據(jù)新聞編號(hào)讀取新聞信息
set rsNews = Server.CreateObject("ADODB.RecordSet")
sql = "SELECT * FROM News WHERE Id=" & Trim(NewsId)
set rsNews=Conn.Execute(sql)
Set Rs=conn.Execute(sql)
If rsNews.EOF Then
Response.Write "指定新聞不存在"
Response.End
Else
'判斷用戶權(quán)限,是否可以維護(hù)新聞,管理員可以編輯所有新聞,編輯者只能修改自己的新聞
If rsNews("Poster") <> Session("UserName") Then
Response.Write "不是Admin或新聞的作者,無權(quán)修改!"
Response.End
End If
End If
End If
%>
如果當(dāng)前用戶是Admin,則IsAuthor.asp不做任何操作;否則,程序?qū)⒏鶕?jù)參數(shù)Id讀取新聞信息,并將Poster字段的值與當(dāng)前用戶名進(jìn)行比較。在兩種情況下,IsAuthor.asp將阻止程序繼續(xù)執(zhí)行:
(1)指定新聞不存在;
(2)當(dāng)前用戶不是指定新聞的作者。
使用Response.End可以結(jié)束網(wǎng)頁(yè)的輸出。
在文件中引用此文件作為頭文件,代碼如下:
<!--#include File=" IsAuthor.asp"-->
4.template.asp
在添加和修改新聞內(nèi)容時(shí),需要對(duì)字體、字號(hào)、顏色和排列位置等屬性進(jìn)行設(shè)置。Template.asp可以實(shí)現(xiàn)這些功能。
Template.asp的設(shè)計(jì)界面如圖5所示。
圖5 Template.asp的設(shè)計(jì)界面
在使用template.asp時(shí),設(shè)置指定的選項(xiàng),將會(huì)在新聞內(nèi)容中生成相應(yīng)的HTML代碼。例如,選中正文abc,然后選擇“楷體”、“1號(hào)字”,將生成如下代碼:
<font[space]face=楷體_GB2312><font[space]size=1>abc</font></font>
[space]是自定義的符號(hào),因?yàn)榭崭裨谵D(zhuǎn)換成HTML格式時(shí),將被替換為“ ;”,所以這里使用[space]表示空格。在顯示新聞內(nèi)容時(shí),程序?qū)?huì)自動(dòng)將[space]轉(zhuǎn)換為空格。
因?yàn)閠emplate.asp的代碼較多,這里僅以字體控制的代碼為例說明。相關(guān)代碼如下:
字體 <SELECT onChange="var c=this.options[this.selectedIndex].value; if(selection.createRange().text!='')
{selection.createRange().text='<font[space]face='+c+'>'+selection.createRange().text+'</font>'}else
{myform.txtcontent.value = '<font[space]face='+c+'>'+myform.txtcontent.value+'</font>'}" name=font style='FONT-SIZE: 9pt'>
<OPTION selected value=宋體>宋體</OPTION>
<OPTION value=楷體_GB2312>楷體</OPTION>
<OPTION value=新宋體>新宋體</OPTION>
<OPTION value=黑體>黑體</OPTION>
<OPTION value=隸書>隸書</OPTION>
<OPTION value="Andale Mono">Andale Mono</OPTION>
<OPTION value=Arial>Arial</OPTION>
<OPTION value="Arial Black">Arial Black</OPTION>
<OPTION value="Book Antiqua">Book Antiqua</OPTION>
<OPTION value="Century Gothic">Century Gothic</OPTION>
<OPTION value="Comic Sans MS">Comic Sans MS</OPTION>
<OPTION value="Courier New">Courier New</OPTION>
<OPTION value=Georgia>Georgia</OPTION>
<OPTION value=Impact>Impact</OPTION>
<OPTION value=Tahoma>Tahoma</OPTION>
<OPTION value="Times New Roman">Times New Roman</OPTION>
<OPTION value="Trebuchet MS">Trebuchet MS</OPTION>
<OPTION value="Script MT Bold">Script MT Bold</OPTION>
<OPTION value=Stencil>Stencil</OPTION>
<OPTION value=Verdana>Verdana</OPTION>
<OPTION value="Lucida Console">Lucida Console</OPTION></SELECT>
在下拉菜單中,定義了系統(tǒng)支持的字體名稱,下拉菜單的值與字體名稱相同。
當(dāng)下拉菜單的選擇發(fā)生變化時(shí),將觸發(fā)onChange事件,程序中直接定義了對(duì)應(yīng)的JavaScript代碼。This表示字體下拉菜單,this.selectedlndex表示當(dāng)前選擇的菜單項(xiàng)目索引,This.options[this.selectedlndex].value則表示選擇下拉菜單的值,程序?qū)⑵浔4孀兞緾中。
Selection.createRangeO.text表示當(dāng)前選擇字符的內(nèi)容,如果它不為空,則將其替換為如下代碼:
selection.createRange().text='<font[space]face='+c+'>'+selection.createRange().text+'</font>'
也就是在它的兩側(cè)添加字體標(biāo)識(shí)<font>和</font>。
如果沒有選擇字符,則在輸入新聞內(nèi)容的文本域中直接加入字體標(biāo)識(shí),用戶可以在<font>和</font>之問添加相應(yīng)的文字,代碼如下:
myform.txtcontent.value='<font[space]face='+c+'>'+myform.txtcontent.value+'</font>
在添加和修改新聞內(nèi)容的網(wǎng)頁(yè)中,必須將表單定義為myform,輸入新聞內(nèi)容的滾動(dòng)文本框定義為txtcontent,否則此功能將無法實(shí)現(xiàn)。
本主界面為default.asp,它的功能是顯示新聞?lì)悇e和每個(gè)類別中的10條新聞,并提供進(jìn)入管理界面(index.asp)的鏈接。
錄入新聞?lì)悇e和新聞內(nèi)容后,default.asp的界面如圖5-6所示。
圖5-6 default.asp的界面
下面介紹default.asp的主要代碼。
1.顯示新聞?lì)悇e鏈接
default.asp將新聞按照分類顯示,每個(gè)新聞?lì)悇e只顯示最新的10條新聞。如果新聞?lì)悇e
較多,則網(wǎng)頁(yè)會(huì)被拉長(zhǎng),給用戶閱讀帶來不便。為了解決這個(gè)問題,本實(shí)例使用書簽來定義新
聞?lì)悇e的位置,書簽格式為#a<類別編號(hào)>。例如,類別編號(hào)為1的新聞?lì)悇e的書簽名稱為#al。下面的代碼將在網(wǎng)頁(yè)中生成所有新聞?lì)悇e的鏈接,每個(gè)鏈接都指相應(yīng)新聞?lì)悇e的書簽。這樣,用戶就可以通過單擊鏈接直達(dá)新聞?lì)悇e了。
<%
'=====顯示所有新聞?lì)悇e供點(diǎn)擊,點(diǎn)擊不同類別顯示該類別的新聞=====
'按順序讀取所有新聞?lì)悇e,保存在記錄集rsCate中
sql = "SELECT * FROM Category ORDER BY CateId"
Set rsCate = conn.Execute(sql)
'顯示所有新聞?lì)悇e鏈接
Do While Not rsCate.EOF
stitle = rsCate("CateName")
cid = rsCate("CateId")
'每個(gè)新聞?lì)悇e標(biāo)題被定義為一個(gè)書簽,名為 #a類別編號(hào)
%>
<a href="#a<%=cid%>"><font style='TEXT-DECORATION: none;color:black'><%=stitle%></font></a> |
<%
rsCate.MoveNext
Loop
%>
如果網(wǎng)頁(yè)中顯示的內(nèi)容較多,通常需要通過定義書簽的方法使用戶快速到達(dá)指定的位置。書簽是網(wǎng)頁(yè)中被標(biāo)記的位置或被標(biāo)記的選中文本。在FrontPage中選擇“插入”/“書簽”菜單項(xiàng),可以在指定位置插入書簽。在本例中,因?yàn)闀炍恢檬莿?dòng)態(tài)變化的,所以需要使用代碼定義,方法如下:
<a name=書簽名></a>
2.“新聞管理”鏈接
系統(tǒng)管理員Admin或其他用戶可以通過“新聞管理”鏈接進(jìn)入新聞管理頁(yè)面index.asp
<a href="index.asp"><font color=red style='TEXT-DECORATION: none'>新聞管理</font></a>
3.顯示各新聞?lì)悇e中的最新新聞
default.asp的主要內(nèi)容是顯示新聞?lì)悇e中的最新10條新聞,并將3天內(nèi)的新聞使用new圖片標(biāo)記。當(dāng)然,如果新聞的內(nèi)容經(jīng)常更新,則可以將3天改為1天。
這部分代碼如下:
<%
'=====顯示所有新聞?lì)悇e供點(diǎn)擊,點(diǎn)擊不同類別顯示該類別的新聞=====
'按順序讀取所有新聞?lì)悇e,保存在記錄集rsCate中
sql = "SELECT * FROM Category ORDER BY CateId"
Set rsCate = conn.Execute(sql)
'顯示所有新聞?lì)悇e鏈接
Do While Not rsCate.EOF
stitle = rsCate("CateName")
cid = rsCate("CateId")
'每個(gè)新聞?lì)悇e標(biāo)題被定義為一個(gè)書簽,名為 #a類別編號(hào)
%>
<a href="#a<%=cid%>"><font style='TEXT-DECORATION: none;color:black'><%=stitle%></font></a> |
<%
rsCate.MoveNext
Loop
%>
<a href='search.asp'><font color=red>新聞查詢</font></a>
| <a href="index.asp"><font color=red style='TEXT-DECORATION: none'>新聞管理</font></a>
</div>
<table align="center" width="100%" cellspacing="0" cellpadding="0" border="0">
<tr>
<td width="*" valign="TOP">
<%
'將指針移至開始位置,分別顯示每個(gè)分類中的新聞
If rsCate.BOF = False Then
rsCate.MoveFirst
End If
'依次顯示每個(gè)新聞?lì)悇e中最新的10條新聞
DO WHILE Not rsCate.EOF
stitle = rsCate("CateName")
cid = rsCate("CateId")
'變量cnt用來記錄
cnt = 0
'生成表格
Response.Write "<table width='100%' cellspacing=1 cellpadding=2><tr>"
'顯示新聞?lì)悇e,并設(shè)置書簽
Response.Write "<td bgcolor=#ceceff><a name=""a"&cid&"""></a> == "
'顯示新聞?lì)悇e標(biāo)題
Response.Write stitle + " ==</td></tr>"
'生成另一個(gè)表格,用于顯示新聞標(biāo)題
Response.Write"<table width='100%' border=0 cellspacing=0 cellpadding=0>"
'按提交時(shí)間的降序顯示新聞標(biāo)題
sql = "SELECT * FROM News WHERE CateId=" & cid & " ORDER BY Posttime DESC"
rs.Open sql, conn, 1, 1
DO WHILE Not rs.EOF
'計(jì)數(shù)
cnt = cnt + 1
'只顯示10條新聞
If cnt < 11 Then
Dim ndate
ndate = DateAdd("d",-3,date())
'顯示新聞標(biāo)題及鏈接,查看新聞的腳本文件為NewsView.asp
Response.Write "<tr><td width='50%'><a onClick='return newwin(this.href);' href='NewsView.asp?id=" + cstr(rs("id")) + "'>" + rs("Title") +""
'如果新聞中有圖片,則在標(biāo)題中顯示(附圖)
If rs("Attpic") Then Response.Write "(附圖)" End If
Response.Write "</a>"
'3天內(nèi)新聞標(biāo)記new圖片
If datediff("d", rs("Posttime"), ndate+time()) <= 0 Then
Response.Write "<img SRC='pic/new.gif' ALT='最新的新聞!' border=0></td>"
End If
'顯示新聞提交的時(shí)間
Response.Write "<td width='20%'>(" + CStr(rs("Posttime")) + ")</td></tr>"
End If
rs.MoveNext
Loop
Response.Write"</table>"
'設(shè)置返回頂部鏈接,跳轉(zhuǎn)到書簽#top
Response.Write "<p align=right><a href=""#top"">返回頂部</a> "
'生成“更多新聞”鏈接,查看指定類別所有新聞的腳本為Category.asp
Response.Write "<a target='_self' href='Category.asp?flag=" + CStr(cid) + "'>更多新聞...</a></p>"
Response.Write "</td></tr></table></td></table>"
rs.Close
rsCate.MoveNext
loop
%>
因?yàn)樵诘趌步中已經(jīng)將各新聞?lì)悇e的標(biāo)題讀取到記錄集rsCate中,所以只需要使用執(zhí)行rsCate.MoveFirst語(yǔ)句將指針復(fù)位就可以了。使用DO WHIIlE循環(huán)語(yǔ)句依次處理每個(gè)新聞?lì)悇e,讀取此類別中的所有新聞信息到記錄集rs中,并在表格中顯示新聞標(biāo)題。請(qǐng)參照注釋理解。
在對(duì)系統(tǒng)進(jìn)行管理之前,需要通過系統(tǒng)的身份認(rèn)證。本站中使用chkpwd.asp進(jìn)行身份驗(yàn)證。對(duì)于需要登陸才能察看的網(wǎng)頁(yè)可以在網(wǎng)頁(yè)的最前端加上如下代碼:
<!--#include file=”chkpwd.asp”-->
這樣為登陸的用戶將看到如下界面:
管理界面的功能是對(duì)新聞?lì)悇e和新聞提供管理界面,只有有權(quán)限的用戶才能進(jìn)入管理界面。本節(jié)將介紹管理界面index.asp的實(shí)現(xiàn)方法。
錄入新聞?lì)悇e和新聞內(nèi)容后,index.asp的界面如圖5-7所示。
下面介紹index.asp的主要代碼。
(1)包含文件
在index.asp的開始部分添加下面的代碼,這樣在打開網(wǎng)頁(yè)時(shí),程序會(huì)自動(dòng)連接到數(shù)據(jù)庫(kù),并進(jìn)行身份驗(yàn)證。
<!--#include file="ConnDB.asp"-->
<!--#include file="ChkPwd.asp"-->
(2)顯示新聞?lì)悇e鏈接
index.asp將新聞按照分類顯示,每個(gè)新聞?lì)悇e只顯示最新的20條新聞。顯示新聞?lì)悇e的代碼如下:
<%
Dim rs,rsCate
Set rs = Server.CreateObject("ADODB.RecordSet")
set rsCate = Server.CreateObject("ADODB.RecordSet")
'定義變量
Dim iflag,sql_where
'參數(shù)flag表示指定的新聞?lì)悇e
iflag = Request.QueryString("flag")
'設(shè)置SQL語(yǔ)句,讀取所有的新聞?lì)悇e到rs.Cate
sql = "SELECT * FROM Category ORDER BY CateId"
Set rsCate = conn.Execute(sql)
'顯示新聞?lì)悇e鏈接,注意根據(jù)類別編號(hào)設(shè)置參數(shù)flag
DO WHILE Not rsCate.EOF
stitle = rsCate("CateName")
cid = rsCate("CateId")
%>| <a href='index.asp?flag=<%=cid%>'><font style='TEXT-DECORATION: none;color:black'><%=stitle%></font></a>
<%
rsCate.MoveNext
Loop
%>
在調(diào)用index.asp時(shí),參數(shù)flag表示新聞?lì)悇e。如果flag=0,則顯示全部新聞,否則顯示指定類別的新聞。
(3)顯示管理鏈接
在index.asp中,將根據(jù)用戶類型顯示管理鏈接,包括“更改密碼”、“類別管理”、“用戶管理”和“退出登錄”,只有Admin用戶才能看到“類別管理”和“用戶管理”鏈接。顯示管理鏈接的代碼如下:
<%
'如果為管理員則顯示類別管理和用戶管理
If Session("UserName") = "Admin" Then
Response.Write " <a href='Cate_Admin.asp'><font color=red>類別管理</font></a>"
Response.Write " <a href='UserList.asp'><font color=red>用戶管理</font></a>"
sql_where = ""
Else
'如果不是系統(tǒng)管理員,則只能管理自己提交的新聞,所以在這里設(shè)置WHERE子句的條件
sql_where = " Poster='" & Session("UserName") & "'"
End If
%>
Session(”UserName”)中保存著當(dāng)前登錄用戶的用戶名。當(dāng)Session(”UserName”)=”Admin”時(shí),才能顯示“類別管理”和“用戶管理”超級(jí)鏈接。
從程序中可以看到,各項(xiàng)管理功能對(duì)應(yīng)的頁(yè)面如下:
(1)更改密碼PwdChange.asp;
(2)類別管理Cate—Admin.asp;
(3)用戶管理UserList.asp;
(4)退出登錄logout.asp。
變量sql_where用來記錄查詢條件。如果當(dāng)前用戶是Admin,則sql_where=“”,即顯示所有新聞;否則設(shè)置查詢條件為“Poster=“”&Session(“UserName”)&“””,即只能管理自己創(chuàng)建的新聞。
(4)分頁(yè)顯示新聞信息
下面將根據(jù)指定的新聞?lì)悇e和頁(yè)碼顯示新聞標(biāo)題列表,代碼如下:
<%
'根據(jù)參數(shù)iflag和sql_where變量設(shè)置SQL語(yǔ)句,讀取新聞數(shù)據(jù)
If iflag = "" Then
If sql_where = "" Then
sql = "SELECT * FROM News ORDER BY Posttime DESC"
Else
sql = "SELECT * FROM News WHERE " & sql_where & " ORDER BY Posttime DESC"
End If
Else
If sql_where = "" then
sql = "SELECT * FROM News WHERE CateId=" & iflag & " ORDER BY Posttime DESC"
Else
sql = "SELECT * FROM News WHERE CateId=" & iflag & " And " & sql_where & " ORDER BY Posttime DESC"
End If
End If
rs.Open sql,conn,1,1
'如果記錄集rs為空,則顯示“目錄還沒有記錄”
If rs.EOF Then
Response.Write "<tr><td colspan=4 align=center>目前還沒有記錄。</td></tr></table>"
Else
'設(shè)置分頁(yè)顯示,每頁(yè)顯示20條新聞?dòng)涗?/p>
rs.PageSize = 20
'讀取參數(shù)page,表示當(dāng)前的頁(yè)碼,使用CLng將其轉(zhuǎn)換為長(zhǎng)整型
Page = CLng(Request("Page"))
'處理不合法的頁(yè)碼
If Page < 1 Then Page = 1
If Page > rs.PageCount Then Page = rs.PageCount
'設(shè)置當(dāng)前頁(yè)碼為Page
rs.AbsolutePage = Page
'循環(huán)顯示當(dāng)前頁(yè)的記錄
For i = 1 to rs.PageSize
'如果到達(dá)記錄集結(jié)尾,則跳出循環(huán)
if rs.EOF then Exit For
%>
<tr><td><a href="newsView.asp?id=<%=rs("id")%>" onClick="return newwin(this.href)"><%=rs("title")%></a>
<%If rs("attpic")=true then Response.write "(附圖)" End If%></td>
<td align="center"><%=rs("posttime")%></td>
<td align="center"><a href="newsedit.asp?id=<%=rs("id")%>" onClick="return newwin(this.href)">修 改</a></td>
<td align="center"><input type="checkbox" name="News" id="<%=rs("id")%>" style="font-size: 9pt" value="ON"></td>
</tr>
<%
rs.MoveNext()
Next
%>
</table>
<% '顯示分頁(yè)頁(yè)碼
If rs.pagecount>1 then
Response.Write "<table border='0'><tr><td><b>分頁(yè):</b></td>"
For i = 1 To rs.PageCount
Response.Write "<td><a href='index.asp?flag=" & iflag & "&page=" & i & "'>"
Response.Write "[<b>" & i & "</b>]</a></td>"
Next
Response.Write "</tr></table>"
End If
End If
%>
這部分代碼的關(guān)鍵部分是根據(jù)新聞?lì)悇e和用戶類型生成sELECT語(yǔ)句,查詢指定的新聞?dòng)涗洝T谡{(diào)試程序時(shí),可以使用下面的語(yǔ)句顯示sELECT語(yǔ)句的內(nèi)容。
Response.write sql
新聞?lì)悇e管理模塊可以實(shí)現(xiàn)以下功能:
(1)添加新的新聞?lì)悇e記錄;
(2)修改新聞?lì)悇e記錄;
(3)刪除新聞?lì)悇e記錄。
只有Admin用戶才有權(quán)限進(jìn)入新聞?lì)悇e管理模塊,在index.asp中,單擊“類別管理”超級(jí)鏈接,可以打開類別管理頁(yè)面cate_Admin.asp。
打開新聞?lì)悇e管理界面,如圖6-9所示。
圖6-9 新聞?lì)悇e管理界面
下面將介紹Cate_Admin.asp中與界面顯示相關(guān)的部分代碼。
1.顯示新聞?lì)悇e信息
為了便于用戶管理新聞?lì)悇e,Cate_Admin.asp以表格的形式顯示新聞?lì)悇e名稱,并在后面顯示修改鏈接和刪除復(fù)選框,代碼如下:
<p align='center'><font style="FONT-SIZE: 12pt"><b>新 聞 類 別 管 理</b></font></p>
<center>
<table border="0" cellspacing="0" width="90%">
<tr>
<td align=right>
<a href="index.asp"><font color="red">新聞管理</font></a>
<a href="User_admin.asp"><font color="red">用戶管理</font></a>
</td>
</tr>
</table>
<table border="1" cellspacing="0" width="90%" bgcolor="#F0F8FF" bordercolorlight="#4DA6FF" bordercolordark="#ECF5FF">
<tr>
<td width="60%" align="center" bgcolor="#FEEC85"><strong>類 別</strong></td>
<td width="20%" align="center" bgcolor="#FEEC85"><strong>修 改</strong></td>
<td width="20%" align="center" bgcolor="#FEEC85"><strong>選 擇</strong></td>
</tr>
<%
Set rs = Server.CreateObject("ADODB.RecordSet")
'讀取所有的新聞?lì)悇e數(shù)據(jù)到記錄集rs中
sql = "SELECT * FROM Category ORDER BY CateId"
rs.Open sql, conn, 1, 1
If rs.EOF Then
'如果記錄集為空,則顯示“目前還沒有記錄”
Response.Write "<tr><td colspan=3 align=center><font style='COLOR:Red'>目前還沒有記錄。</font></td></tr></table>"
Else
'在表格中顯示新聞?lì)悇e名稱
DO WHILE Not rs.EOF
%>
<tr>
<td><%=rs("CateName")%></td>
<td align="center"><a href="Cate_Admin.asp?Oper=update&cid=<%=rs("CateId")%>&name=<%=rs("C
ateName")%>">修 改</a></td>
<td align="center"><input type="checkbox" name="Cate" id="<%=rs("CateId")%>"></td>
</tr>
<%
rs.MoveNext()
LOOP
%>
</table>
可以看到,修改新聞?lì)悇e的頁(yè)面也是Cate_Admin.a(chǎn)sp。參數(shù)Oper的值為update,表示當(dāng)前操作為修改新聞?lì)悇e;參數(shù)cid表示要修改的新聞?lì)悇e編號(hào);參數(shù)name表示要修改的新聞?lì)悇e名稱。新聞?lì)悇e后面的復(fù)選框名為Cate,它的id值與對(duì)應(yīng)新聞?lì)悇e的編號(hào)相同。
通常刪除功能也可以通過超級(jí)超級(jí)鏈接來實(shí)現(xiàn),就像本例中的‘‘修改’’
超級(jí)鏈接。但是一次只能刪除一條記錄。本實(shí)例介紹一種更方便的方法,即通
過復(fù)選框選擇要?jiǎng)h除的記錄,然后單擊cc刪除,,按鈕,這樣可以同時(shí)刪除多
條記錄。
2.顯示功能按鈕
如果存在新聞?lì)悇e記錄,則在表格下面顯示“全選”、“清空”和“刪除”
按鈕,這些按鈕是為刪除新聞?lì)悇e記錄服務(wù)的,代碼如下:
'如果記錄數(shù)大于0,則顯示全選、清空和刪除等按鈕
If rs.RecordCount>0 then
%>
<input type="button" value="全 選" onclick="sltAll()">
<input type="button" value="清 空" onclick="sltNull()">
<input type="submit" value="刪 除" name="tijiao" onclick="SelectChk()">
<%End If%>
rs.RecordCount返回當(dāng)前記錄集的記錄數(shù)量。
3.顯示添加或修改新聞?lì)悇e的表單
在功能按鈕的下面,將顯示添加或修改新聞?lì)悇e的表單。當(dāng)flag=update
時(shí),將顯示修改新聞?lì)悇e的表單;否則顯示添加新聞?lì)悇e的表單,代碼如下:
<%
'如果當(dāng)前狀態(tài)為修改,則顯示修改的表單,否則顯示添加的表單
If Soperate = "update" Then
sTitle = Request.QueryString("name")
%>
<form name="UFrom" method="post" action="Cate_Admin.asp?cid=<%=Operid%>&Oper=edit">
<div align="center">
<input type="hidden" name="sOrgTitle" value="<%=sTitle%>">
<font color="#FFFFFF"><b><font color="#000000">類別名稱</font></b></font>
<input type="text" name="txttitle" size="20" value="<%=sTitle%>">
<input type="submit" name="Submit" value=" 修 改 ">
</div>
</form>
<%Else%>
<form name="AForm" method="post" action="Cate_Admin.asp?Oper=add">
<div align="center">
<font color="#FFFFFF"><b><font color="#000000">類別名稱</font></b></font>
<input type="text" name="txttitle" size="20">
<input type="submit" name="Submit" value=" 添 加 ">
</div>
</form>
<%End If%>
添加和修改新聞?lì)悇e的腳本都是Cate_Admin.asp,只是參數(shù)不同。當(dāng)參數(shù)0per等于edit
時(shí),程序?qū)⑻幚硇薷牡男侣勵(lì)悇e數(shù)據(jù);當(dāng)參數(shù)Oper等于add時(shí),程序?qū)⑻幚硖砑拥男侣勵(lì)悇e
數(shù)據(jù)。
在執(zhí)行Cate_Admin.a(chǎn)sp時(shí),如果參數(shù)Oper不等于update,頁(yè)面的下方將顯示添加數(shù)據(jù)的表單Aform。在文本域txttitle中輸入新聞?lì)悇e的名稱,然后單擊“添加’,按鈕,將調(diào)用Cate_Admin.asp,參數(shù)Oper等于add,表示插入新記錄。
下面將介紹相關(guān)的代碼。
在執(zhí)行Cate_Admin.asp時(shí),可以在url中包含參數(shù),程序?qū)⒏鶕?jù)參數(shù)Oper的值決定進(jìn)行的操作,與添加數(shù)據(jù)相關(guān)的代碼如下:
<%
'處理添加、修改和刪除操作
dim Soperate
Soperate = Request.QueryString("oper")
Operid = Request.QueryString("cid")
'刪除
If Soperate="delete" Then
sql = "SELECT * FROM News WHERE CateId In (" & CStr(Operid) & ")"
Set rs = Conn.Execute(sql)
If rs.EOF Then
sqldelt = "DELETE FROM Category WHERE CateId In(" & CStr(Operid) & ")"
Conn.Execute(sqldelt)
Response.Write "新聞?lì)悇e已經(jīng)成功刪除!"
Else
Response.Write "新聞?lì)悇e中包含新聞,不能刪除"
End If
'添加
ElseIf Soperate = "add" then
CateName = Request("txttitle")
'判斷是否已經(jīng)存在此類別名稱
sql = "SELECT * FROM Category WHERE CateName='" & CateName & "'"
Set rs = Conn.Execute(sql)
'如果沒有此類別名稱,則創(chuàng)建新記錄
If Rs.EOF Then
sql = "INSERT INTO Category(CateName) VALUES('" & CateName & "')"
Conn.Execute(sql)
Response.Write"新聞?lì)悇e已經(jīng)成功添加!"
Else
Response.Write "已經(jīng)存在此類別名稱!"
End If
Set rs = Nothing
ElseIf Soperate = "edit" Then
CateName = Request("txttitle")
'如果新類別名稱與舊名稱不同,則判斷是否存在此類別名稱
sql = "SELECT * FROM Category WHERE CateName = '" & CateName & "' And CateId=" & Operid
Set rs = conn.Execute(sql)
If Rs.EOF Then '如果原類別編號(hào)和新類別名稱不存在,則表示類別名稱發(fā)生變化
Set rs = Nothing
'此時(shí)判斷是否存在此類別名稱
sql = "SELECT * FROM Category WHERE CateName='" & CateName & "'"
Set rs = Conn.Execute(sql)
If Rs.EOF Then '新類別不存在
conn.Execute("UPDATE Category SET CateName='" & CateName & "' WHERE CateId=" & Operid)
Response.Write "新聞?lì)悇e已經(jīng)成功修改!"
Else
Response.Write "已經(jīng)存在此類別名稱"
End if
End If
End If
%>
注意,在插入新聞?lì)悇e之前,應(yīng)該判斷此新聞?lì)悇e是否已經(jīng)存在。這樣可以避免出現(xiàn)重復(fù)的新聞?lì)悇e。
在Cate_Admin.asp中,單擊新聞?lì)悇e后面的“修改’,超級(jí)鏈接,將再次執(zhí)行Cate_Admin.asp,
參數(shù)Oper等于update。此時(shí),頁(yè)面的下方將顯示修改數(shù)據(jù)的表單Uform。在文本域txttitle中輸入新聞?lì)悇e的名稱,然后單擊“修改”按鈕,將調(diào)用Cate_Admin.asp,參數(shù)Oper等于edit,表示修改記錄。下面將介紹相關(guān)的代碼。在執(zhí)行Cate_Admin.asp時(shí),可以在url中包含參數(shù),程序?qū)⒏鶕?jù)參數(shù)Oper的值決定進(jìn)行的操作。
注意,在修改新聞?lì)悇e之前,應(yīng)該判斷新的新聞?lì)悇e是否已經(jīng)存在。這樣可以避免出現(xiàn)重復(fù)的新聞?lì)悇e。
在刪除新聞?lì)悇e之前,需要選中相應(yīng)的復(fù)選框。下面介紹幾個(gè)與選擇復(fù)選框相關(guān)的javaScript函數(shù)。
1.選擇全部復(fù)選框
在Care_Admin.asp中,定義“全選”按鈕的代碼如下:
<input type="button" value="全 選" onclick="sltAll()">
當(dāng)單擊“全選”按鈕時(shí),將執(zhí)行sltAll()函數(shù),代碼如下:
function sltAll()
{
var nn = self.document.all.item("Cate");
for(j=0;j<nn.length;j++)
{
self.document.all.item("Cate",j).checked = true;
}
}
self對(duì)象指當(dāng)前頁(yè)面,self.document.a11.item("Cate")返回當(dāng)前頁(yè)面中Cate復(fù)選框的數(shù)量。程序通過for循環(huán)語(yǔ)句將所有的Cate復(fù)選框值設(shè)置為true。
2.全部清除選擇
在Cate_Admin.asp中,定義“清空”按鈕的代碼如下:
<input type="button" value="清 空" onclick="sltNull()">
當(dāng)單擊“清空”按鈕時(shí),將執(zhí)行sltNull()函數(shù),代碼如下:
function sltNull()
{
var nn = self.document.all.item("Cate");
for(j=0;j<nn.length;j++)
{
self.document.all.item("Cate",j).checked = false;
}
}
3.生成并提交刪除編號(hào)列表
在Cate_Admin.asp中,定義“刪除”按鈕的代碼如下:
<input type="submit" value="刪 除" name="tijiao" onclick="SelectChk()">
當(dāng)單擊“刪除”按鈕時(shí),將執(zhí)行SelectChk()函數(shù),代碼如下:
function SelectChk()
{
var s = false; //用來記錄是否存在被選中的復(fù)選框
var Cateid, n=0;
var strid, strurl;
var nn = self.document.all.item("Cate"); //返回復(fù)選框Cate的數(shù)量
for (j=0; j<nn.length; j++) {
if (self.document.all.item("Cate",j).checked) {
n = n + 1;
s = true;
Cateid = self.document.all.item("Cate",j).id+""; //轉(zhuǎn)換為字符串
//生成要?jiǎng)h除新聞?lì)悇e編號(hào)的列表
if(n==1) {
strid = Cateid;
}
else {
strid = strid + "," + Cateid;
}
}
}
strurl = "Cate_Admin.asp?Oper=delete&cid=" + strid;
if(!s) {
alert("請(qǐng)選擇要?jiǎng)h除的新聞?lì)悇e!");
return false;
}
if (confirm("你確定要?jiǎng)h除這些新聞?lì)悇e嗎?")) {
form1.action = strurl;
form1.submit();
}
}
程序?qū)γ總€(gè)復(fù)選框進(jìn)行判斷,如果復(fù)選框被選中,則將復(fù)選框的id值轉(zhuǎn)換為字符串,并追加到變量strid中。因?yàn)閺?fù)選框的id值與對(duì)應(yīng)的新聞?lì)悇e編號(hào)相同,所以最后strid中保存的是以逗號(hào)為分隔符的待刪除的新聞?lì)悇e編號(hào)。以strid的值為參數(shù)執(zhí)行Cate_Admin.asp,參數(shù)Oper等于delete,就可以刪除選中記錄了。
在刪除新聞?lì)悇e之前,應(yīng)該判斷此新聞?lì)悇e中是否包含新聞,如果有新聞,則不能刪除,否則會(huì)產(chǎn)生沒有新聞?lì)悇e的垃圾新聞。
系統(tǒng)用戶都可以發(fā)布新聞,新聞發(fā)布管理模塊包含以下功能:
(1)發(fā)布新新聞;
(2)修改新聞;
(3)刪除新聞。
在index.asp中,“添加新聞”按鈕的定義代碼如下:
<input type="button" value="添加新聞" onclick="newwin('NewsAdd.asp')" name=add>
當(dāng)單擊“添加新聞”按鈕時(shí),將觸發(fā)onclick事件,并調(diào)newwin
('NewsAdd.asp')函數(shù),即在彈出的新窗口中執(zhí)行News.Add.a(chǎn)sp。
NewsAdd.asp的運(yùn)行界面如圖7-10所示。
圖7-10 NewsAdd.asp的運(yùn)行界面
將新聞?lì)悇e添加到下拉菜單中,代碼如下:
<%
Set rs = Server.CreateObject("ADODB.RecordSet")
'將新聞?lì)悇e裝入下拉菜單中
sql = "SELECT * FROM Category ORDER BY CateId"
Set rsCate = Conn.Execute(sql)
DO WHILE Not rsCate.EOF
stitle = rsCate("CateName")
cid = rsCate("CateId")
%>
<option value="<%=cid%>"><%=stitle%></option>
<%
rsCate.movenext
LOOP
%>
下拉菜單名為Cate,值為新聞?lì)悇e編號(hào),顯示的內(nèi)容是新聞?lì)悇e名稱。編輯新聞內(nèi)容表單的定義代碼如下:
<form action="newsSave.asp" method="POST" name="myform" align="center" onsubmit="return ValidationPassed">
可以看到,表單名為myfom,表單提交后,將由newsSave.asp處理表單數(shù)據(jù)。在提交表單數(shù)據(jù)之前,程序?qū)?duì)ValidationPassed變量進(jìn)行判斷,只有當(dāng)ValidationPassed=True時(shí),才執(zhí)行提交操作。變量ValidationPassed的值將在對(duì)數(shù)據(jù)有效性進(jìn)行驗(yàn)證時(shí)被賦值。在.NewsAdd.asp中,定義“確定”按鈕的代碼如下:
<input type="submit" value=" 確 定 " name="B1" onclick="return form_onsubmit(this.form)">
在單擊“確定”按鈕時(shí),將執(zhí)行form_onsubmit(this.form),進(jìn)行數(shù)據(jù)有效性驗(yàn)證,代碼如下:
function form_onsubmit(obj)
{
ValidationPassed = true;
if(obj.Cate.selectedIndex <0) {
alert("請(qǐng)選擇新聞?lì)悇e")
ValidationPassed = false;
return ValidationPassed;
}
if(obj.title.value == "") {
alert("請(qǐng)?zhí)顚懶侣剺?biāo)題");
ValidationPassed = false;
return ValidationPassed;
}
if(obj.txtcontent.value == "") {
alert("請(qǐng)?zhí)顚懶侣剝?nèi)容!");
ValidationPassed = false;
return ValidationPassed;
}
}
這是一段JavaScript代碼,參數(shù)obj接受this.form的值,表示表單myfom。程序?qū)⒎謩e對(duì)新聞?lì)悇e、新聞標(biāo)題和新聞內(nèi)容進(jìn)行判斷,這些信息是必須填寫的。如果沒有填寫前面提到的信息,將彈出相關(guān)的對(duì)話框,ValidationPassed=false,這樣表單數(shù)據(jù)將無法提交。
在NewsAdd.asp頁(yè)面的相關(guān)位置使用#include命令包括template.asp,將可以顯示控制模板。
下面介紹newSave.asp的部分代碼。在newSave.asp中,有一個(gè)函數(shù)ChangeStr(),它的功能是替換新聞?wù)闹械墓δ茏址康氖鞘蛊淠軌虺蔀镠TML網(wǎng)頁(yè)的一部分,在瀏覽網(wǎng)頁(yè)時(shí)被正常顯示。被替換的功能字符串包括以下內(nèi)容:
[upload] 上傳新聞 圖片標(biāo)記, 需要將其替換為 “<div[space]align=center><img[space]src=images/”,其中[space]是空格標(biāo)記,需要在顯示新聞?wù)臅r(shí)轉(zhuǎn)換:
[/upload] 與[upload]匹配使用,標(biāo)記上傳新聞圖片的結(jié)束。需要將其替換為 “[space]border=0[space]width=300></img></div>”;空格(””) 空格將被替換為“ ;”;chr(13) 回車符將被替換為<BR>。
函數(shù)ChangeStr()的代碼如下:
Function ChangeChr(str)
ChangeChr = Replace( str, "[upload]", "<div[space]align=center><img[space]src=images/")
ChangeChr=Replace( ChangeChr, "[/upload]", "[space]border=0[space]width=300></img></div>")
ChangeChr = Replace( ChangeChr, " ", " ")
ChangeChr = Replace( ChangeChr, chr(13), "<br>")
End Function
新聞?wù)男枰4嬖跀?shù)據(jù)庫(kù)中,當(dāng)從數(shù)據(jù)庫(kù)中讀取新聞?wù)牡膬?nèi)容在網(wǎng)頁(yè)中顯示時(shí),空格將被自動(dòng)過濾掉,這樣<imgsrc=images/>將無法被正確顯示。為了避免這種情況發(fā)生,這里將空格表示為[space],并存入數(shù)據(jù)庫(kù),在讀取數(shù)據(jù)時(shí)再將其轉(zhuǎn)換為空格。
下面程序?qū)⒔邮諒腘ewsAdd.asp傳遞來的數(shù)據(jù),并將它們轉(zhuǎn)換為能夠保存到數(shù)據(jù)庫(kù)中的格式,代碼如下:
Dim title '新聞標(biāo)題
Dim content '新聞內(nèi)容
Dim category '新聞?lì)悇e
Dim sql 'sql語(yǔ)句字符串
Dim rs '記錄集變量
title = Request("title")
title = Replace(title,"'","‘")
attpic = Request("attpic")
rqtContent = ChangeChr(request("txtcontent")) '替換函數(shù)
rqtContent = Replace(rqtContent,"'","‘")
因?yàn)樵趕ql語(yǔ)句中,單引號(hào)(')是特殊字符,所以需要將新聞標(biāo)題和正文中
的單引號(hào)替換為全角單引號(hào)(‘),并使用ChangeChr()函數(shù)對(duì)新聞?wù)倪M(jìn)行轉(zhuǎn)換。
接下來程序?qū)⒈4嫘侣剶?shù)據(jù),代碼如下:
Set rs = Server.CreateObject("ADODB.RecordSet")
'定義sql語(yǔ)句,為插入新聞?dòng)涗浂x記錄集
sql="SELECT * FROM News"
rs.Open sql, Conn, 1, 3
'使用AddNew和Update插入新記錄
rs.AddNew
rs("CateId") = CInt(Request("Cate"))
rs("Title") = title
rs("Content") = rqtContent
rs("Posttime") = now()
rs("Poster") = Session("UserName")
rs("ReadCount") = 0
If attpic <> "" Then
rs("attpic") = attpic
End If
rs.Update
'釋放資源,顯示提示信息
set rs = nothing
Response.Write "<h2>添加成功!</h2>"
本節(jié)前面介紹插入新數(shù)據(jù)時(shí),都是采用定義INSERT語(yǔ)句的方法。這里使
用一種新方法,在記錄集中使用rs.AddNew插入新記錄,然后依次對(duì)rs中各字段賦值,最后使用rs.Update方法保存記錄。
在index.asp中,每條新聞?dòng)涗浀暮竺娑加幸粋€(gè)修改超級(jí)鏈接。單擊此鏈接,將打開NewsEdit.asp,對(duì)指定新聞進(jìn)行編輯。參數(shù)id表示新聞編號(hào)。
本節(jié)將介紹如何使用NewsEdit.asp修改新聞內(nèi)容。在NewsEdit.asp的開始部分,將使用下面的代碼包含相關(guān)文件,從而連接到數(shù)據(jù)庫(kù),并判斷用戶的編輯權(quán)限。
<!--#include file="ConnDB.asp"-->
<!--#include file="isAuthor.asp"-->
在Newsedit.asp中程序?qū)⑹紫雀鶕?jù)參數(shù) ID的值讀取新聞數(shù)據(jù),代碼如下:
Set rsNews = Server.CreateObject("ADODB.RecordSet")
Set rsCate = Server.CreateObject("ADODB.RecordSet")
'讀取指定新聞數(shù)據(jù)
Set rsNews = Conn.Execute("SELECT * FROM News WHERE id = " & Request.QueryString("id"))
因?yàn)樾侣務(wù)臄?shù)據(jù)在存儲(chǔ)前進(jìn)行過替換處理,所以這里需要將數(shù)據(jù)還原,代碼如下:
If Not rsNews.EOF Then
'對(duì)新聞內(nèi)容進(jìn)行替換
txtcontent = rsNews("content")
txtcontent = replace(txtcontent, "<br>", chr(13))
txtcontent = replace(txtcontent, " ", " ")
rqtContent = replace(txtcontent, "''", "'")
替換數(shù)據(jù)的目的是使它能夠在表單的滾動(dòng)文本域txtcontent中正確顯示。代碼中省略的部分包括生成新聞?lì)悇e下拉菜單,以及根據(jù)新聞數(shù)據(jù)對(duì)表單中的各組件賦值。
在NewsEdit.asp中,定義了一個(gè)隱藏域,代碼如下:
<input type="hidden" name="id" value="<%=rsNews("id")%>">
它的作用是記錄當(dāng)前編輯新聞的編號(hào)。
編輯新聞信息表單的定義代碼如下:
<form action="newsUpdate.asp" method="POST" name="myform" align="center" onsubmit="return ValidationPassed">
與userAdd.asp相似,在提交新聞信息時(shí),需要首先執(zhí)行form_onsubmit函數(shù),對(duì)用戶輸入數(shù)據(jù)的有效性進(jìn)行驗(yàn)證。
數(shù)據(jù)提交后,將由。newsupdate.asp進(jìn)行處理,它的主要代碼如下:
<%
'對(duì)新聞?wù)倪M(jìn)行替換的函數(shù)
Function ChangeChr(str)
ChangeChr = Replace( str, "[upload]", "<div[space]align=center><img[space]src=images/")
ChangeChr=Replace( ChangeChr, "[/upload]", "[space]border=0[space]width=300></img></div>")
ChangeChr = Replace( ChangeChr, " ", " ")
ChangeChr = Replace( ChangeChr, chr(13), "<br>")
End Function
rqtContent = ChangeChr(request("txtcontent")) '替換函數(shù)
rqtContent = Replace(rqtContent,"'","‘")
'替換新聞標(biāo)題中的半角單引號(hào)
Dim title
title = Request.Form("title")
title = replace(title,"'","‘")
'設(shè)置附圖標(biāo)記
If Request.Form("attpic")<>"" Then
attpic = 1
Else
attpic = 0
End If
'設(shè)置UPDATE語(yǔ)句,更新新聞信息
sql = "UPDATE News SET Posttime='" & now() &"', Attpic=" & attpic & ", Title = '" & title _
& "', CateID = " & CInt(Request("Cate")) & "," & "Content='" & rqtContent & "' WHERE Id=" & CInt(Request("Id"))
conn.Execute(sql)
Response.Write "<h2>修改成功!</h2>"
%>
程序首先定義了替換函數(shù)ChangeChr(),然后接收從NewsEdit.asp中傳遞來的新聞數(shù)據(jù),最后定義了update語(yǔ)句,根據(jù)接收到的數(shù)據(jù)更新新聞信息。
NewsEdit.asp的顯示界面與NewsAdd.asp相似,處理過程也有相同之處,請(qǐng)讀者參照理解。
在刪除新聞之前,需要選中相應(yīng)的復(fù)選框。這與刪除新聞?lì)悇e時(shí)的操作相似,所以在index.asp中,也定義了操作復(fù)選框的函數(shù),包括選擇全部復(fù)選框的sltAll()清除全部選擇的sltNull()和生成并提交刪除編號(hào)列表的SelectChk()等。
處理刪除新聞操作的腳本為NewsDelt.asp,參數(shù)id表示要?jiǎng)h除的新聞編號(hào)。NewsDelt.asp的主要代碼如下:
<%
Dim ids
ids = Request.QueryString("id")
sql = "DELETE FROM News WHERE Id IN (" & ids & ")"
conn.Execute(sql)
%>
<script language="JavaScript">
alert("成功刪除!");
location.href = "index.asp";
</script>
在DELETE語(yǔ)句中使用WHERE…in…字句的功能是刪除新聞編號(hào)列表IDS中出現(xiàn)的所有的新聞。
如果系統(tǒng)中新聞數(shù)量比較多,那么只按照分類察看新聞顯然是不夠的。為了方便網(wǎng)友使用,本站中設(shè)計(jì)了新聞管理功能。
新聞查詢管理頁(yè)面的腳本是search.asp,運(yùn)行界面如圖所示
可以看到,新聞查詢可以分為下面幾種情況:
(1)按發(fā)布日期查詢。
(2)查詢新聞標(biāo)題和新聞內(nèi)容中包括的文字。
在search.asp中,用于編輯查詢條件的表單為Form1,它的定義代碼如下:
<form name="form1" method="POST" action="searchResult.asp">
當(dāng)表單數(shù)據(jù)提交時(shí),將執(zhí)行searchResult.asp。為了驗(yàn)證用戶錄入數(shù)據(jù)的有效性,在search.asp中定義了一些函數(shù),下面介紹這些函內(nèi)容。
1.IsEmpty()函數(shù)
IsEmpty()函數(shù)的功能是判斷字符串是否為空,代碼如下:
function isEmpty (str) {
if ((str==null)||(str.length==0)) return true;
else return(false);
}
參數(shù)str表示要判斷的字符串,如果它為空或長(zhǎng)度為0則返回true,否則返回false。
2.IsDigital()函數(shù)
IsDigital()函數(shù)的功能是判斷字符串是否是數(shù)字類型,代碼如下:
function isDigit(s)
{
var patrn=/^[0-9]{1,20}$/;
if (!patrn.exec(s)) return false
return true
}
參數(shù)s表示要判斷的字符串。變量patrn是一個(gè)正則表達(dá)式,正則表達(dá)式是由普通字符以及特殊字符組成的文字模式。該模式描述在查找文字主體時(shí)待匹配的一個(gè)或多個(gè)字符串。正則表達(dá)式作為一個(gè)模板,將某個(gè)字符模式與所搜索的字符串進(jìn)行匹配。正則表達(dá)式中的Execute方法對(duì)指定的字符串執(zhí)行正則表達(dá)式搜索。/^表示正則表達(dá)式的開始,$/表示正則表達(dá)式的結(jié)束,[0.9]表示以0~9的數(shù)字為開始和結(jié)束,{1,20}表示長(zhǎng)度為1~20。
3.IsInt()函數(shù)
IsInt()函數(shù)的功能是判斷指定的字符串是否是整型數(shù)據(jù),代碼如下:
function isInt (theStr) {
var flag = true;
if (isEmpty(theStr)) { flag=false; }
else
{ for (var i=0; i<theStr.length; i++) {
if (isDigit(theStr.substring(i,i+1)) == false) {
flag = false; break;
}
}
}
return(flag);
}
參數(shù)theStr表示要判斷的字符串。如果theStr為空,則返回false;否則對(duì)theStr中的每個(gè)字符進(jìn)行判斷,如果有一個(gè)字符不是數(shù)字類型(使用IsDigital函數(shù)判斷)則返回false。如果上述情況都沒有返回false,則返回true。
4.IsBetween(、)函數(shù)
IsBetween()函數(shù)的功能是判斷指定數(shù)據(jù)是否在兩個(gè)數(shù)字之間,代碼如下:
function isBetween (val, lo, hi) {
if ((val < lo) || (val > hi)) { return(false); }
else { return(true); }
}
參數(shù)val表示要比較的數(shù)值,參數(shù)lo表示比較范圍的下限,參數(shù)hi表示比較范圍的上限。程序?qū)al與lo、hi進(jìn)行比較,如果val的值不在它們之間,則返回false,否則返回true。
5.IsIDate()函數(shù)
IsDate()函數(shù)的功能是判斷指定數(shù)據(jù)是否是日期型數(shù)據(jù),代碼如下:
function isDate (theStr) {
var the1st = theStr.indexOf('-');
var the2nd = theStr.lastIndexOf('-');
if (the1st == the2nd) { return(false); }
else {
var y = theStr.substring(0,the1st);
var m = theStr.substring(the1st+1,the2nd);
var d = theStr.substring(the2nd+1,theStr.length);
var maxDays = 31;
if (isInt(m)==false || isInt(d)==false || isInt(y)==false)
return(false);
else if (y.length < 4) return(false);
else if (!isBetween (m, 1, 12)) return(false);
else if (m==4 || m==6 || m==9 || m==11) maxDays = 30;
else if (m==2) {
if (y % 4 > 0) maxDays = 28;
else if (y % 100 == 0 && y % 400 > 0) maxDays = 28;
else maxDays = 29;
}
if (isBetween(d, 1, maxDays) == false) { return(false); }
else { return(true); }
}
}
可以看到前面定義的函數(shù)都是為了實(shí)現(xiàn)Isdate()函數(shù)的功能。
在search.asp中,定義“開始”按鈕的代碼如下:
<input type="submit" value=" 開 始 " language=javascript name="tijiao" onclick="return button2_onclick()">
當(dāng)用戶單擊“開始”按鈕時(shí),將觸發(fā)onclick事件,并執(zhí)行Button2_onclick()函數(shù),代碼如下:
function button2_onclick()
{
// 字段不能都為空,如果發(fā)布日期為空,則查詢條件不能空
if (form1.sdate.value=="" && form1.edate.value=="" && form1.searchcontent.value == "")
{
alert("查詢條件不能都為空!");
form1.searchcontent.focus();
return (false);
}
// 檢查日期格式是否正確
if (form1.sdate.value.length>0)
{
if(!isDate(form1.sdate.value))
{
alert("開始日期格式不正確,請(qǐng)重新輸入!");
form1.sdate.focus();
return (false);
}
}
if (form1.edate.value.length>0)
{
if(!isDate(form1.edate.value))
{
alert("截至日期格式不正確,請(qǐng)重新輸入!");
form1.edate.focus();
return (false);
}
}
}
這段程序?qū)⑴袛嘤脩糨斎氲牟樵儣l件是否為空,并使用自定義函數(shù)IsDate()驗(yàn)證日期是否有效。
下面介紹searchResult.asp的實(shí)現(xiàn)方法。它的主要功能是根據(jù)用戶提交的查詢條件生成SELECT語(yǔ)句,并以表格的形式顯示查詢結(jié)果。在searchResuIt.asp中,定義了一個(gè)函數(shù)GetUserName(),它的功能是根據(jù)用戶名返回用戶的真實(shí)姓名,代碼如下:
<%
'根據(jù)用戶名讀取用戶姓名
Function GetUserName(UserId)
Dim RsUser,sql
Set RsUser = Server.CreateObject("ADODB.RecordSet")
sql= "SELECT * FROM Users WHERE UserName='" & Trim(UserId) & "'"
Set rsUser = Conn.Execute(sql)
If NOT rsUser.EOF Then
GetUserName = rsUser("Ename")
Else
GetUserName = "無名"
End If
End Function
%>
這里使用GetuserName()函數(shù)的作用是取得新聞提交人的姓名,并在查詢結(jié)果中顯示。如果將本系統(tǒng)用于企業(yè)內(nèi)部的新聞發(fā)布平臺(tái),則通常需要顯示提交人姓名。如果不需要此功能,也可以將相關(guān)代碼去掉。
searchResult.asp的最重要部分就是生成查詢新聞的SELECT語(yǔ)句,代碼如下:
<%
' 提取發(fā)布時(shí)間查詢范圍
sDate = Request("sdate")
eDate = Request("edate")
' 根據(jù)時(shí)間字段設(shè)置查詢語(yǔ)句,需要把時(shí)間字符串轉(zhuǎn)換為日期型
If Len(sDate)>0 And Len(eDate)>0 Then
strSqlPTime = " WHERE PostTime>='" & sDate & "'"
strSqlPTime = strSqlPTime & " And PostTime<='" & eDate & "'"
ElseIf Len(sDate)>0 And Len(eDate)=0 Then
strSqlPTime = " WHERE PostTime>='" & sDate & "'"
ElseIf Len(sDate)=0 And Len(eDate)>0 Then
strSqlPTime = " WHERE PostTime<='" & eDate & "'"
End If
' 取得查詢模式(精確查詢或模糊查詢),參見search.asp中的定義
searchcontent1 = Request("searchcontent")
fanwei = Request("fanwei")
If fanwei ="all" Then '精確查詢
searchcontent = searchcontent1
Else '模糊查詢
searchcontent = "%" & searchcontent1 & "%"
End If
' 取得查詢范圍值
searchfanwei = Request("D1")
If searchfanwei="title" Then '只在新聞標(biāo)題中查詢
Response.Write "<h4><font color=#7966C6>按 信息標(biāo)題 查詢的結(jié)果</font></h4><br>"
strSQL = " Title LIKE '" & searchcontent & "' ORDER BY PostTime DESC"
ElseIf searchfanwe="content" Then '只在新聞內(nèi)容中查詢
Response.Write "<h4><font color=#7966C6>按 信息內(nèi)容 查詢的結(jié)果</font></h4><br>"
strSQL = " Content LIKE '" & searchcontent1 & "' ORDER BY PostTime DESC"
End If
'合并查詢條件
If Len(strSqlPTime)=0 Then
strSQL = " WHERE " & strSQL
Else
strSQL = strSqlPTime & " And " & strSQL
End If
'記錄查找到的新聞序號(hào)
Dim ncnt
ncnt = 0
'輸出表格
Response.Write "<table width='100%'>"
Response.Write "<tr>"
Response.Write "<td align=middle width='10%'><b>序號(hào)</b></td>"
Response.Write "<td align=left width='30%'><b>信息標(biāo)題</b></td>"
Response.Write "<td align=middle width='14%'><b>所屬類別</b></td>"
Response.Write "<td align=middle width='10%'><b>內(nèi)容長(zhǎng)度</b></td>"
Response.Write "<td align=middle width='16%'><b>提交人</b></td>"
Response.Write "<td align=middle width='20%'><b>提交時(shí)間</b></td>"
Response.Write "</tr>"
Dim rsSearch,rsCate
Set rsSearch= Server.CreateObject("ADODB.RecordSet")
Set rsCate = Server.CreateObject("ADODB.RecordSet")
'生成查詢語(yǔ)句
strSQL = "SELECT * FROM News " & strSQL
'Response.Write "sql :"& strSQL
rsSearch.Open strSQL, Conn, 1, 3
以上代碼的工作過程如下:
根據(jù)參數(shù)sdate和edate生成與日期相關(guān)的查詢條件;根據(jù)查詢模式(精確查詢或模糊查詢)生成相關(guān)的查詢條件。如果是精確查詢,則使用“=”;如果是模糊查詢,則使用LIKE和通配符%;根據(jù)查詢范圍生成相關(guān)的查詢條件;將所有查詢條件合并成WHERE子句;生成顯示查詢結(jié)果的表頭;生成并執(zhí)行SELECT語(yǔ)句。
-接著程序?qū)⑹褂醚h(huán)語(yǔ)句依次處理每條查詢記錄,代碼如下:
'依次處理查詢結(jié)果
Do While Not rsSearch.EOF
ncnt = ncnt + 1
Response.Write "<tr bgColor=Lavender style='COLOR:Purple;'>"
Response.Write "<td align=middle>"&ncnt&"</td>"
'輸出新聞標(biāo)題及鏈接
Response.Write "<td><a href=NewsView.asp?id="&rsSearch("Id")&" onClick='return newwin(this.href)'>"&rsSearch("Title")&"</a>"
' 判斷是否有圖片
If rsSearch("attpic") Then
Response.Write "(附圖)"
End If
Response.Write "</td>"
' 取得信息分類名稱
sql = "SELECT * FROM Category WHERE CateId=" & rsSearch("CateId")
Set rsCate = Conn.Execute(sql)
If NOT rsCate.EOF Then
Response.Write "<td align=middle>"&rsCate("CateName")&"</td>"
End If
' 計(jì)算內(nèi)容大小
If rsSearch("Content")="--" Then
nlength=0
Else
nlength = Len(rsSearch("Content"))
' 輸出內(nèi)容大小、提交人姓名
Response.Write "<td align=middle>"&nlength&" Bytes</td>"
' 顯示提交人姓名
Response.Write "<td align=middle>"&GetUserName(rsSearch("Poster"))&"</td>"
' 顯示提交時(shí)間
Response.Write "<td align=middle>"&rsSearch("PostTime")&"</td>"
Response.Write "</tr>"
End If
rsSearch.MoveNext()
LOOP
Response.Write "</table>"
Set rsSearch = Nothing
Set rsCate = Nothing
Set Conn = Nothing
%>
1、在安裝IIS之前,必須安裝TCP/IT協(xié)議。
TCP/IP協(xié)議是執(zhí)行IIS的必要條件,沒有它ASP就不能運(yùn)行,所以必須先安裝TVP/IP協(xié)議(如果已經(jīng)安裝就可以跳過這一節(jié))。
步驟: 控制面板→雙擊"網(wǎng)絡(luò)" →單擊:"添加"按鈕 →選擇"協(xié)議"選項(xiàng) →在廠商列表框中選擇Microsolf選項(xiàng) →在"網(wǎng)絡(luò)協(xié)議"列表框中選擇TCP/CP,單擊"確定"
2、安裝IIS服務(wù)器程序
IIS 的安裝是創(chuàng)建ASP運(yùn)行環(huán)境的關(guān)鍵一步,安裝好它以后,計(jì)算機(jī)就是一臺(tái)Web服務(wù)器了。
步驟:放入光盤,點(diǎn)擊控制面板->添加或刪除程序->添加或刪除windows組件,如圖8-1所示選擇INTERNET信息服務(wù)單擊下一步。
安裝好IIS后,進(jìn)入控制面板下的管理工具找到 INTERNET信息服務(wù)雙擊即可打開。然后建立虛擬目錄,把自己首頁(yè)的目錄寫上去,然后取一個(gè)別名,主要是為了方便,再在默認(rèn)文檔中,寫上主頁(yè)的文件名就可以了,以后在IE瀏覽器中只要打127.0.0.1就會(huì)顯示自己的主頁(yè)。
圖8-1
操作系統(tǒng)Windows 9X、windows NT Workstation/Server4.0、Windows 2000 Server/Professional版。
CPU:沒有大的要求,只要可以運(yùn)行以上的Windows操作系統(tǒng)就可以了。當(dāng)然,速度是越快越好。
內(nèi)存:基于內(nèi)存需要32MB,建議使用64MB以上內(nèi)存,如果使用Windows 2000,建議用128MB內(nèi)存。
硬盤空間:至少有50MB以上的磁盤空間來安裝所需的組件。
ASP軟件要求
Windows 98: PWS4.0版附屬于Windows 98 光盤的add=one\pws目錄,執(zhí)行其中的setup.exe,即可安裝PWS4.0版。
Web服務(wù)器軟件建設(shè)
Web的內(nèi)容保存在Web站點(diǎn)(Web服務(wù)器)中,用戶可以通過瀏覽器(Browser)訪問Web站點(diǎn)。因此,Web是一種基于客戶機(jī)/服務(wù)器的體系結(jié)構(gòu)。也就是說,Web實(shí)際上是一種全球性通信系統(tǒng),該系統(tǒng)通過Intrnet使計(jì)算機(jī)相互傳送基于超媒體的數(shù)據(jù)信息。Web是一個(gè)超文本信息系統(tǒng),它的超文本鏈接使得Web文檔不再象書本一樣的固定的、線性的,而是可以從一個(gè)位置迅速轉(zhuǎn)到另外的位置,從一個(gè)主題到另一個(gè)相關(guān)的主題。Web是分布式的。無論系統(tǒng)的internet訪問WWW。對(duì)于Web,只要通過超鏈接指向所需的站點(diǎn),就可以使物理上放置在不同位置的信息在邏輯上一體化。對(duì)用戶來說這些住處是一體的。
Web具有新聞性。Web站點(diǎn)上的信息是動(dòng)態(tài)的,經(jīng)常更新的。住處的提供者可以經(jīng)常的對(duì)站上的信息進(jìn)行更新,所以用戶(瀏覽者)可以得到最新的信息。
Web是動(dòng)態(tài)的、交互的。以Java為代表的動(dòng)態(tài)技術(shù)使Web從靜態(tài)的頁(yè)面變成可擴(kuò)行程序,從而大大提高了Web的動(dòng)態(tài)性和交互性。可以通過超鏈接,用戶的瀏覽順序和所到站點(diǎn)完全由用戶自行決定。
Web服務(wù)器硬件建設(shè)專線入網(wǎng)具有通信速度高等優(yōu)點(diǎn),但是費(fèi)用相對(duì)較高,投資較大。需要具備入網(wǎng)專線。入網(wǎng)后網(wǎng)上所有終端和工作站均可享受Internet服務(wù)。用戶可向ISP申請(qǐng)X.25聲母或DDN專線。專線速度可達(dá)200bps至2048bps可選。
具有了專線以后,就需要位本地子網(wǎng)選擇一個(gè)路由器以實(shí)現(xiàn)路由功能,然后接入IGS網(wǎng)關(guān);也可以不用路由器,直接接入IGS網(wǎng)關(guān)路由器因?yàn)镮GS具有IP路由軟件,可局域網(wǎng)連上服務(wù)器。
經(jīng)過老師耐心細(xì)致的指導(dǎo),及設(shè)計(jì)小組同學(xué)們的密切合作,同時(shí)翻閱了大量的資料(包括網(wǎng)上資料,書本及學(xué)校的一些相關(guān)資料)經(jīng)過近一個(gè)月的努力,網(wǎng)站的設(shè)計(jì)制作告一段落。總結(jié)這次“藍(lán)球網(wǎng)站設(shè)計(jì)”開發(fā)制作過程,我們綜合使用了目前因特網(wǎng)上的各種靜態(tài)制作方法及交互式動(dòng)態(tài)網(wǎng)站的制作設(shè)計(jì)手段,并對(duì)初步利用后臺(tái)程序完成了網(wǎng)站的動(dòng)態(tài)響應(yīng)與生成網(wǎng)頁(yè)的技術(shù)。同時(shí)也從中學(xué)習(xí)了對(duì)靜態(tài)頁(yè)面的處理風(fēng)格,色彩搭配,頁(yè)面導(dǎo)航方面有了一定經(jīng)驗(yàn)。對(duì)用Javascript語(yǔ)言制作動(dòng)態(tài)效果也有了更進(jìn)一步的認(rèn)識(shí)。在交互式網(wǎng)頁(yè)設(shè)計(jì)學(xué)會(huì)了如何使用MYSQL建立數(shù)據(jù)庫(kù),以及對(duì)數(shù)據(jù)庫(kù)瀏覽,修改,添加,查詢。如何用PHP編寫 程序來方便訪客,讀者在網(wǎng)上查詢學(xué)校各方面的信息。
目前網(wǎng)站的制作技術(shù)與要求,都已經(jīng)告別了因特網(wǎng)初期網(wǎng)站制作的“幼稚”期,隨著各類網(wǎng)站的迅速增加與瀏覽者需求的提高,無不要求網(wǎng)站從立意,策劃,頁(yè)面設(shè)計(jì)到后臺(tái)程序的全面提高。無論是個(gè)人網(wǎng)站還是企業(yè)網(wǎng)站都必須被要求從瀏覽者角度出發(fā),最大限度的滿足用戶的要求,這也是以后各類網(wǎng)站發(fā)展競(jìng)爭(zhēng)的真正實(shí)質(zhì)所在。
本次設(shè)計(jì)由于設(shè)計(jì)時(shí)間較緊,且相關(guān)模塊比較多,加之設(shè)計(jì)經(jīng)驗(yàn)的不足,在網(wǎng)站的整體設(shè)計(jì)及各模塊功能可能設(shè)計(jì)的不完全,有待于進(jìn)一步的完善和改進(jìn)。
1、《FrontPage2000入門與實(shí)戰(zhàn)技術(shù)》,人民郵電出版社2000年5月第1版。 2、互聯(lián)網(wǎng)上提供的網(wǎng)頁(yè)制作素材及特效。
3 ASP+SQLSEVER項(xiàng)目開發(fā)。
網(wǎng)站的建立與發(fā)布,最終離不開計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)平臺(tái)的支持。計(jì)算機(jī)網(wǎng)絡(luò)是計(jì)算機(jī)技術(shù)和現(xiàn)代通信技術(shù)的有機(jī)結(jié)合。計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)是由現(xiàn)代計(jì)算機(jī)處理技術(shù)和現(xiàn)代通信技術(shù)結(jié)合發(fā)展而成的,是社會(huì)信息化的基礎(chǔ)技術(shù)。 計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)經(jīng)過30余年的發(fā)展,已經(jīng)成長(zhǎng)為一棵參天大樹。從它的作用范圍角度講有局域網(wǎng)、城域網(wǎng)和廣域網(wǎng);從傳遞的速率角度講有低速、高速和超高速寬帶網(wǎng)等之分;從連接的形式講有環(huán)形網(wǎng)、星形網(wǎng)、總線網(wǎng)等;從應(yīng)用的類型講可以分成控制網(wǎng)、通訊網(wǎng)、管理網(wǎng)等;并且把最適應(yīng)于人類與外部物理世界溝通的多媒體技術(shù)大量結(jié)合在一起,形成了豐富多彩的綜合運(yùn)行環(huán)境。 通過本次課程設(shè)計(jì)的制作,不但是對(duì)我這三年所學(xué)知識(shí)的一個(gè)檢驗(yàn),也是對(duì)我計(jì)算機(jī)應(yīng)用水平與寫作水平的一個(gè)考核,而且還給了我一個(gè)找出自己不足的機(jī)會(huì)。
由于課程設(shè)計(jì)者水平有限,時(shí)間倉(cāng)促,錯(cuò)誤之處在所難免,希各位讀者批評(píng)指正。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。