当前位置: 首页 > news >正文

程序员和网站开发如何进行营销型企业网站的优化

程序员和网站开发,如何进行营销型企业网站的优化,阿里云注销网站,网站建设需要多少钱小江网页设计Go语言网络库net/http Http 协议(Hyper Text Transfer Protocol#xff0c;超文本传输协议)是一个简单的请求-响应协议#xff0c;它通常运行在 TCP 之 上。超文本传输协议是互联网上应用最为广泛的一种网络传输协议#xff0c;所有的WWW文件都必须遵守这个标准。 Http 协…Go语言网络库net/http Http 协议(Hyper Text Transfer Protocol超文本传输协议)是一个简单的请求-响应协议它通常运行在 TCP 之 上。超文本传输协议是互联网上应用最为广泛的一种网络传输协议所有的WWW文件都必须遵守这个标准。 Http 协议是基于客户端 Cilent /服务器 Server 模式且面向连接的。简单的来说就是客户端 Cilent 向服务器 Server 发送 http 请求 Request服务器 Server 接收到 http 服务请求 Request 后会在 http 响应Response 中回 送所请求的数据。 Go语言内置的 net/http 包十分的优秀提供了HTTP客户端和服务端的实现。 官网地址https://pkg.go.dev/net/http 1、HTTP客户端 通过 Get、Head、Post 和 PostForm 函数发出 HTTP/HTTPS 请求。 resp, err : http.Get(http://example.com/)resp, err : http.Post(http://example.com/upload, image/jpeg, buf)resp, err : http.PostForm(http://example.com/form,url.Values{key: {Value}, id: {123}})1.1 发送Get请求 不带请求参数 package mainimport (fmtio/ioutilnet/http )func main() {resp, err : http.Get(http://www.baidu.com)if err ! nil {fmt.Printf(get failed, err:%v\n, err)return}// 程序在使用完response后必须关闭回复的主体defer resp.Body.Close()body, err : ioutil.ReadAll(resp.Body)if err ! nil {fmt.Printf(read from resp.Body failed, err:%v\n, err)return}fmt.Print(string(body)) }带参数参数需要使用到 net/url 来处理。 package mainimport (fmtio/ioutilnet/httpnet/url )func main() {apiUrl : http://127.0.0.1:9090/get// URL paramdata : url.Values{}data.Set(name, mi)data.Set(age, 18)u, err : url.ParseRequestURI(apiUrl)if err ! nil {fmt.Printf(parse url requestUrl failed, err:%v\n, err)}// URL encodeu.RawQuery data.Encode()// http://127.0.0.1:9090/get?age18namemifmt.Println(u.String())resp, err : http.Get(u.String())if err ! nil {fmt.Printf(post failed, err:%v\n, err)return}defer resp.Body.Close()b, err : ioutil.ReadAll(resp.Body)if err ! nil {fmt.Printf(get resp failed, err:%v\n, err)return}// {status: ok}fmt.Println(string(b)) }对应 server 端的处理 package mainimport (fmtnet/http )func getHandler(w http.ResponseWriter, r *http.Request) {defer r.Body.Close()data : r.URL.Query()// mifmt.Println(data.Get(name))// 18fmt.Println(data.Get(age))answer : {status: ok}w.Write([]byte(answer)) }func main() {http.HandleFunc(/get, getHandler)err : http.ListenAndServe(:9090, nil)if err ! nil {fmt.Printf(http server failed, err:%v\n, err)return} }带 header 头部信息 package mainimport (fmtnet/httpnet/http/httputil )func main() {url : http://127.0.0.1:9090/getrequest, err : http.NewRequest(http.MethodGet, url, nil)if err ! nil {panic(err)}request.Header.Add(Authorization, jhs8723sd2dshd2)request.Header.Add(User-Agent, User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1)resp, err : http.DefaultClient.Do(request)if err ! nil {panic(err)}defer resp.Body.Close()// //获取网页内容s, err : httputil.DumpResponse(resp, true)if err ! nil {panic(err)}fmt.Printf(%s, s) }1.2 发送POST请求 package mainimport (fmtio/ioutilnet/httpstrings )func main() {url : http://127.0.0.1:9090/post// 表单数据// contentType : application/x-www-form-urlencoded// data : namemiage18// jsoncontentType : application/jsondata : {name:mi,age:18}resp, err : http.Post(url, contentType, strings.NewReader(data))if err ! nil {fmt.Printf(post failed, err:%v\n, err)return}defer resp.Body.Close()b, err : ioutil.ReadAll(resp.Body)if err ! nil {fmt.Printf(get resp failed, err:%v\n, err)return}// {status: ok}fmt.Println(string(b)) }对应 server 端 package mainimport (fmtio/ioutilnet/http )func postHandler(w http.ResponseWriter, r *http.Request) {defer r.Body.Close()// 1. 请求类型是application/x-www-form-urlencoded时解析form数据r.ParseForm()// 打印form数据// map[]fmt.Println(r.PostForm)fmt.Println(r.PostForm.Get(name), r.PostForm.Get(age))// 2. 请求类型是application/json时从r.Body读取数据b, err : ioutil.ReadAll(r.Body)if err ! nil {fmt.Printf(read request.Body failed, err:%v\n, err)return}// {name:mi,age:18}fmt.Println(string(b))answer : {status: ok}w.Write([]byte(answer)) }func main() {http.HandleFunc(/post, postHandler)err : http.ListenAndServe(:9090, nil)if err ! nil {fmt.Printf(http server failed, err:%v\n, err)return} }1.3 PostForm方式 package mainimport (fmtio/ioutilnet/httpnet/url )func main() {resp, err : http.PostForm(http://127.0.0.1:9090/post,url.Values{key: {Value}, id: {123}})if err ! nil {fmt.Println(err)}defer resp.Body.Close()body, err : ioutil.ReadAll(resp.Body)if err ! nil {fmt.Println(err)}fmt.Println(string(body)) }json package mainimport (bytesencoding/jsonfmtio/ioutilnet/http )func main() {data : make(map[string]interface{})data[site] www.baidu.comdata[name] tombytesData, _ : json.Marshal(data)resp, _ : http.Post(http://httpbin.org/post, application/json, bytes.NewReader(bytesData))body, _ : ioutil.ReadAll(resp.Body)fmt.Println(string(body)) }带有 headers 参数 package mainimport (fmtio/ioutilnet/httpstrings )func main() {client : http.Client{}req, err : http.NewRequest(POST, http://www.01happy.com/demo/accept.php, strings.NewReader(namecjb))if err ! nil {fmt.Println(err)}req.Header.Set(Content-Type, application/x-www-form-urlencoded)req.Header.Set(Cookie, nameanny)resp, err : client.Do(req)defer resp.Body.Close()body, err : ioutil.ReadAll(resp.Body)if err ! nil {fmt.Println(err)}fmt.Println(string(body)) }1.4 自定义Client 要管理 HTTP 客户端的头域、重定向策略和其他设置创建一个 Client package mainimport (fmtnet/httpnet/http/httputil )func main() {request, err : http.NewRequest(http.MethodGet, http://www.baidu.com, nil)if err ! nil {panic(err)}client : http.Client{CheckRedirect: func(req *http.Request, via []*http.Request) error {fmt.Println(Redirect:, req)return nil},}request.Header.Add(User-Agent, User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1)resp, err : client.Do(request)if err ! nil {panic(err)}defer resp.Body.Close()s, err : httputil.DumpResponse(resp, true)fmt.Printf(%s, s) }1.5 自定义Transport 要管理代理、TLS 配置、keep-alive、压缩和其他设置创建一个Transport package mainimport (crypto/tlscrypto/x509fmtio/ioutilnet/http )// 使用匹配的证书方法 func main() {// *.pem文件的内容rootCA : roots : x509.NewCertPool()ok : roots.AppendCertsFromPEM([]byte(rootCA))if !ok {panic(failed to parse root certificate)}client : http.Client{Transport: http.Transport{TLSClientConfig: tls.Config{RootCAs: roots},DisableCompression: true,},}resp, err : client.Get(http://baidu.com)if err ! nil {panic(err)}defer resp.Body.Close()body, err : ioutil.ReadAll(resp.Body)if err ! nil {panic(err)}if err ! nil {fmt.Printf(read from resp.Body failed, err:%v\n, err)return}fmt.Print(string(body)) }Client 和 Transport 类型都可以安全的被多个 goroutine 同时使用。出于效率考虑应该一次建立、尽量重用。 package mainimport (crypto/tlsfmtio/ioutilnet/http )// 跳过安全检查 func main() {tr : http.Transport{TLSClientConfig: tls.Config{InsecureSkipVerify: true},}client : http.Client{Transport: tr}resp, err : client.Get(https://localhost:8081)if err ! nil {fmt.Println(error:, err)return}defer resp.Body.Close()body, err : ioutil.ReadAll(resp.Body)fmt.Println(string(body)) }2、服务端 2.1 默认的Server ListenAndServe 使用指定的监听地址和处理器启动一个 HTTP 服务端处理器参数通常是 nil这表示采用包变量 DefaultServeMux 作为处理器。 Handle 和 HandleFunc 函数可以向 DefaultServeMux 添加处理器。 package mainimport (lognet/http )type httpServer struct { }func (server httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {w.Write([]byte(r.URL.Path)) }func main() {var server httpServerhttp.Handle(/foo, server)http.HandleFunc(/bar, func(w http.ResponseWriter, r *http.Request) {w.Write([]byte(r.URL.Path))})log.Fatal(http.ListenAndServe(:9090, nil)) }事件处理器的 Handler 接口定义如下 type Handler interface {ServeHTTP(ResponseWriter, *Request) }只要实现了这个接口就可以实现自己的 handler 处理器。 如果 ListenAndServe() 传入的第一个参数地址为空则服务器在启动后默认使用 http://127.0.0.1:8080 地址 进行访问。 如果这个函数传入的第二个参数为 nil则服务器在启动后将使用默认的多路复用器DefaultServeMux。 2.2 默认的Server示例 使用 Go 语言中的 net/http 包来编写一个简单的接收 HTTP 请求的 Server 端示例net/http 包是对 net 包的 进一步封装专门用来处理 HTTP 协议的数据。具体的代码如下 package mainimport (fmtnet/http )func sayHello(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, Hello shanghai) }func main() {http.HandleFunc(/, sayHello)err : http.ListenAndServe(:9090, nil)if err ! nil {fmt.Printf(http server failed, err:%v\n, err)return} }将上面的代码编译之后执行打开你电脑上的浏览器在地址栏输入127.0.0.1:9090回车 # 输出 Hello shanghaipackage mainimport (encoding/json_ encoding/jsonfmtio/ioutilnet/httpnet/urlstrings )var (api http://127.0.0.1:9090/token 9adf92861 )type Result struct {Code int json:codeMsg string json:msg }type Resp struct {Code string json:codeMsg string json:msg }func wechatUrlHandle(w http.ResponseWriter, r *http.Request) {// 获取链接地址var wechatUrl stringvalues : r.URL.Query()wechatUrl values.Get(url)// 验证URL的正确性targetUrl, err : url.ParseRequestURI(wechatUrl)if err ! nil {fmt.Printf(parse url failed, err:%v\n, err)}fmt.Printf(fmt.Sprintf(url: %v, targetUrl))// 拼接参数发起请求data : fmt.Sprintf(token%surl%s, token, targetUrl.String())headers : application/x-www-form-urlencodedres, err : http.Post(api, headers, strings.NewReader(data))if err ! nil {fmt.Printf(post failed, err: %v\n, err)return}// 关闭请求资源defer res.Body.Close()body, err : ioutil.ReadAll(res.Body)if err ! nil {fmt.Fprintf(w, fmt.Sprintf(get resp failed. err: %v\n, err))return}var info Resultvar ress Respw.Header().Set(Content-Type, application/json)if err : json.Unmarshal(body, info); err nil {fmt.Println(info.Code, info.Msg)ress.Code 200ress.Msg Successt, _ : json.Marshal(ress)w.Write(t)} else {ress.Code 200ress.Msg failuret, _ : json.Marshal(ress)fmt.Println(err: , err)w.Write(t)} }func main() {http.HandleFunc(/wechat/url, wechatUrlHandle)// 处理器参数一般为nilerr : http.ListenAndServe(:9090, nil)if err ! nil {fmt.Printf(Http server failed. err: %v\n, err)return}}2.3 自定义Server 要管理服务端的行为可以创建一个自定义的 Server。 用户可以通过 Server 结构体对服务器进行更详细的配置包括设置地址为请求读取操作设置超过时间等等。 package mainimport (lognet/httptime )type httpServer struct { }func (server httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {w.Write([]byte(r.URL.Path)) }func main() {s : http.Server{Addr: :9090,Handler: httpServer{},ReadTimeout: 10 * time.Second,WriteTimeout: 10 * time.Second,MaxHeaderBytes: 1 20,}log.Fatal(s.ListenAndServe()) }2.4 多路复用器 多路复用器的基本原理根据请求的 URL 地址找到对应的处理器调用处理器对应的 ServeHTTP() 方法处理请 求。 DefaultServeMux 是 net/http 包的默认多路复用器其实就是 ServeMux 的一个实例。 HandleFunc() 函数用于为指定的 URL 注册一个处理器HandleFunc() 处理器函数会在内部调用 DefaultServeMux 对象对应的 HandleFunc 方法。 2.4.1 ServeMux与DefaultServeMux 我们可以使用默认多路复用器注册多个处理器达到与处理器一样的作用。 下面演示如何通过默认多路复用器创建自己的服务器。 package mainimport (fmtnet/http )//定义多个处理器 type handle1 struct{}func (h1 *handle1) ServeHTTP(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, handle one) }type handle2 struct{}func (h2 *handle2) ServeHTTP(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, handle two) }func main() {handle1 : handle1{}handle2 : handle2{}// Handler:nil表明服务器使用默认的多路复用器DefaultServeMuxs : http.Server{Addr: 127.0.0.1:8080,Handler: nil,}// Handle函数调用的是多路复用器DefaultServeMux.Handle方法http.Handle(/handle1, handle1)http.Handle(/handle2, handle2)s.ListenAndServe() }我们通过使用自己的 handle1 和 handle2 来指定两个处理器http.Handle() 函数可以调用 DefaultServeMux.Handle() 方法来处理请求。 Handle: nil 对应的是处理器是DefaultServeMux。 在ServeMux对象的ServeHTTP()方法中根据URL查找我们注册的服务器然后请求交给它处理。 虽然默认的多路复用器很好用但仍然不推荐使用因为它是一个全局变量所有的代码都可以修改它。有些第三 方库中可能与默认复用器产生冲突。所以推荐的做法是自定义。 2.4.2 自定义多路复用器 package mainimport (fmtnet/http )func newservemux(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, NewServeMux) }func main() {mux : http.NewServeMux()mux.HandleFunc(/, newservemux)s : http.Server{Addr: :8081,Handler: mux,}s.ListenAndServe() }NewServeMux 实质上还是 ServeMux。 2.4.3 ServeMux的路由匹配 我们现在需要绑定三个URL分别为//happy/bad。 package mainimport (fmtnet/http )func newservemux(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, NewServeMux) }func newservemuxhappy(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, Newservemuxhappy) }func newservemuxbad(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, NewServeMuxbad) } func main() {mux : http.NewServeMux()mux.HandleFunc(/, newservemux)mux.HandleFunc(/happy, newservemuxhappy)mux.HandleFunc(/bad, newservemuxbad)s : http.Server{Addr: :8080,Handler: mux,}s.ListenAndServe() }2.5 HttpRouter ServeMux 的一个缺陷是无法使用变量实现 URL 模式匹配而 HttpRouter 可以HttpRouter 是一个高性能的第 三方 HTTP 路由包弥补了 net/http 包中的路由不足问题。 $ go get github.com/julienschmidt/httprouterhttprouter 的使用首先得使用 New() 函数生成一个 *Router 路由对象然后使用 GET()方法去注册匹配的函 数最后再将这个参数传入 http.ListenAndServe 函数就可以监听服务。 package mainimport (net/httpgithub.com/julienschmidt/httprouter )func Hello(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {w.Write([]byte(Hello,httprouter!)) }func main() {router : httprouter.New()router.GET(/, Hello)http.ListenAndServe(:8080, router) }更为重要的是它为 URL 提供了两种匹配模式 /user/:pac精准匹配 /user/pac/user/*pac匹配所有模式 /user/hello Pattern: /user/:user/user/gordon match/user/you match/user/gordon/profile no match/user/ no matchPattern: /src/*filepath/src/ match/src/somefile.go match/src/subdir/somefile.go matchpackage mainimport (fmtlognet/httpgithub.com/julienschmidt/httprouter )func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {fmt.Fprint(w, Welcome!\n) }func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {fmt.Fprintf(w, hello, %s!\n, ps.ByName(name)) }func main() {router : httprouter.New()router.GET(/, Index)router.GET(/hello/:name, Hello)log.Fatal(http.ListenAndServe(:8080, router)) }当然这里还有 POST()DELETE() 函数的详情就不一一介绍了。 3、其它应用 3.1 DNS package mainimport (fmtlognet )func main() {// 根据域名返回ip地址addr, err : net.ResolveIPAddr(ip, devops.miliantech.com)if err ! nil {return}// 2023/07/24 20:45:43 devops.miliantech.com 对应地址ip地址---- 172.21.6.96log.Println(devops.miliantech.com 对应地址ip地址----, addr)// 查找DNS A记录iprecords, _ : net.LookupIP(devops.miliantech.com)for _, ip : range iprecords {// LookupIP ----- 172.21.6.96fmt.Println(LookupIP -----, ip)}//查找DNS CNAME记录canme, _ : net.LookupCNAME(devops.miliantech.com)// LookupCNAME ----- devops.miliantech.com.fmt.Println(LookupCNAME -----, canme)//查找DNS PTR记录ptr, e : net.LookupAddr(172.21.6.96)if e ! nil {// lookup 172.21.6.96: dnsquery: DNS name does not exist.fmt.Println(e)} else {fmt.Println(ptr)}for _, ptrval : range ptr {fmt.Println(ptrval)}//查找DNS NS记录 名字服务器记录nameserver, _ : net.LookupNS(baidu.com)for _, ns : range nameserver {/*ns记录 {ns3.baidu.com.}ns记录 {ns2.baidu.com.}ns记录 {ns7.baidu.com.}ns记录 {ns4.baidu.com.}ns记录 {dns.baidu.com.}*/fmt.Println(ns记录, ns)}//查找DNS MX记录 邮件服务器记录mxrecods, _ : net.LookupMX(google.com)for _, mx : range mxrecods {fmt.Println(mx:, mx)}//查找DNS TXT记录 域名对应的文本信息txtrecords, _ : net.LookupTXT(baidu.com)for _, txt : range txtrecords {/*txt: _globalsign-domain-verificationqjb28W2jJSrWj04NHpB0CvgK9tle5JkOq-EcyWBgnEtxt: google-site-verificationGHb98-6msqyx_qqjGl5eRatD3QTHyVB6-xQ3gJB5UwMtxt: vspf1 include:spf1.baidu.com include:spf2.baidu.com include:spf3.baidu.com include:spf4.baidu.com mx ptr -all*/fmt.Println(txt:, txt)}//查看本地IP地址addrs, err : net.InterfaceAddrs()if err ! nil {return}for _, address : range addrs {// 检查ip地址判断是否回环地址if ipnet, ok : address.(*net.IPNet); ok !ipnet.IP.IsLoopback() {if ipnet.IP.To4() ! nil {/*本地地址 -- 169.254.124.27本地地址 -- 169.254.27.66本地地址 -- 169.254.158.118本地地址 -- 192.168.223.1本地地址 -- 192.168.132.1本地地址 -- 192.168.226.185*/fmt.Println(本地地址 -- , ipnet.IP.String())}}} }3.2 简单的tcp请求实现 3.2.1 服务端 package mainimport (bufioiolognet )func pes(conn net.Conn) {defer conn.Close()read : bufio.NewReader(conn)for {var p [512]byten, err : read.Read(p[:])if err ! nil {if err io.EOF {log.Println(客户端关闭链接, conn.RemoteAddr().String())return}log.Println(读取失败, err.Error())return}log.Println(客户端发送消息为, string(p[:n]))conn.Write([]byte(ok))} }func main() {lis, err : net.Listen(tcp, 127.0.0.1:20003)if err ! nil {log.Println(listen ,err , err.Error())return}for {conn, err : lis.Accept()if err ! nil {log.Println(建立链接异常, err.Error())}go pes(conn)} }3.2.2 客户端 package mainimport (bufioiolognetosstrings )func main() {conn, err : net.Dial(tcp, 127.0.0.1:20003)if err ! nil {log.Println(conn err, err.Error())return}defer conn.Close()inputreader : bufio.NewReader(os.Stdin)for {input, _ : inputreader.ReadString(\n)input strings.Trim(input, \r\n)if input q || input Q {log.Println(退出链接)return}conn.Write([]byte(input))var p [512]byten, err : conn.Read(p[:])if err ! nil {if err io.EOF {log.Println(服务端关闭链接, conn.RemoteAddr().String())return}log.Println(读取失败, err.Error())return}log.Println(服务端发送消息为, string(p[:n]))}}3.3 粘包问题 一次只能读取固定长度的数据解决方案 package mainimport (bufiobytesencoding/binaryfmt )func Encode(massge string) ([]byte, error) {len_for_msaaget : int32(len(massge))pkg : new(bytes.Buffer)err : binary.Write(pkg, binary.LittleEndian, len_for_msaaget)if err ! nil {return nil, err}err binary.Write(pkg, binary.LittleEndian, []byte(massge))if err ! nil {return nil, err}return pkg.Bytes(), nil }func Decode(reader *bufio.Reader) (string, error) {peek, err : reader.Peek(4)if err ! nil {return , err}lengthBuff : bytes.NewBuffer(peek)var length int32err binary.Read(lengthBuff, binary.LittleEndian, length)if err ! nil {return , err}if int32(reader.Buffered()) 4length {return , fmt.Errorf(err)}p : make([]byte, int(4length))_, err reader.Read(p)if err ! nil {return , err}return string(p[4:]), nil }3.4 简单的udp请求实现 3.4.1 服务端 package mainimport (lognet )func main() {udp, err : net.ListenUDP(udp, net.UDPAddr{IP: net.IPv4(0, 0, 0, 0),Port: 30000,})if err ! nil {return}defer udp.Close()for {var p [1024]byten, addr, err : udp.ReadFromUDP(p[:])if err ! nil {log.Println(udp 请求处理异常 , err.Error())return}log.Println(请求信息, string(p[:n]), addr.String())_, err udp.WriteToUDP([]byte(get), addr)if err ! nil {log.Println(返回信息失败, err.Error())return}} }3.4.2 客户端 package mainimport (lognet )func main() {udp, err : net.DialUDP(udp, nil, net.UDPAddr{IP: net.IPv4(0, 0, 0, 0),Port: 30000,})if err ! nil {log.Println(err.Error())return}defer udp.Close()_, err udp.Write([]byte(我是服务端 hello server))if err ! nil {log.Println(err.Error())return}data : make([]byte, 4096)fromUDP, u, err : udp.ReadFromUDP(data)if err ! nil {log.Println(接收失败, err)return}log.Println(接收信息返回成功 , string([]byte(data[:fromUDP])), u)}
http://www.w-s-a.com/news/602510/

相关文章:

  • 网站调整方案适合平面设计师的网站
  • 免费服务器建立网站用html5做的旅游网站代码
  • 学校英语网站栏目名称WordPress禁用邮件注册
  • 手机qq网页版网站沧州手机网站开发
  • 深圳罗湖网站设计公司建设的网站属于无形资产吗
  • 网站开发python西安网站建站品牌
  • 网站开发商标属于哪一类做网站还有钱赚吗
  • 做设计的搜素材上什么网站好设计公司画册设计哪家好
  • 视频网站开发需要什么语言做ui设计一年后年薪多少
  • 网站服务器维护费用统一企业官方网站
  • 网站如何调用手机淘宝做淘宝客呼和浩特网站运营公司
  • 做推广可以上那些网站网页游戏排行榜2014前十名
  • 国外网站备案流程企业网站 流程
  • 重庆网站建设letide童程童美少儿收费价目表
  • 苏州建站仿站东莞排名推广
  • 大中小网站的区分wordpress个人主页主题
  • 商务网站建设的可行性分析包括小程序源码网免费
  • 永州网站建设收费标准重庆网站建设公司夹夹虫专业
  • python做网站多少钱wordpress 2.8
  • 深圳网站平台网站开发工作程序怎么写
  • 自己可以接单做网站吗wordpress 添加自定义按钮
  • 网站首页权重宣传页制作
  • 智能网站建设软件有哪些方面网页的建设
  • 石铜路网站建设生鲜电商网站开发
  • 怎么提高网站加载速度慢网站的轮播怎么做的
  • 网络网站推广优化建筑工程教育网官方网站
  • 旅行社网站策划做网站编辑好还是美工好
  • 珠海做网站找哪家好在线磁力搜索神器
  • 做网站优化有必要wordpress导航栏字体
  • 中山网站建设半江红沈阳免费网站建站模板