NodeJS學習筆記(一)——搭建開發框架Express,實現Web網站登錄驗證

?

目錄

  •   開發環境
  •   1、建立工程
  •   2、目錄結構
  •   3、Express配置文件
  •   4、Ejs模板
  •   5、安裝常用庫及頁面分離
  •   6、路由
  •   7、session
  •   8、頁面訪問控制及提示

  JS是腳本語言,腳本語言都需要一個解析器才能運行。對于寫在HTML頁面里 的JS,瀏覽器充當了解析器的角色。而對于需要獨立運行的JS,NodeJS就是一個解析器。每一種解析器都是一個運行環境,不但允許JS定義各種數據結 構,進行各種計算,還允許JS使用運行環境提供的內置對象和方法做一些事情。例如運行在瀏覽器中的JS的用途是操作DOM,瀏覽器就提供了 document之類的內置對象。而運行在NodeJS中的JS的用途是操作磁盤文件或搭建HTTP服務器,NodeJS就相應提供了fs、http等內 置對象。Express作為NodeJS的Web應用框架,可以幫助我們快速開發Web網站。


  開發環境

  • NodeJS:v0.10.30
  • npm:1.4.21
  • OS:Win7旗艦版 32bit
  • Express:4.2.0
  • MongoDB:2.6.3
    1
    2
    E:\project> node -v
    v0.10.30 E:\project> npm -v 1.4.21 E:\project> express -V 4.2.0

    ?

    ?


  1、建立工程

  使用express命令建立工程,并支持ejs:


?

  根據提示下載依賴包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
E:\project> cd .\nodejs-demo
E:\project\nodejs-demo> npm install
npm WARN deprecated static-favicon@1.0.2: use serve-favicon module
static-favicon@1.0.2 node_modules\static-favicon
debug@0.7.4 node_modules\debug
ejs@0.8.8 node_modules\ejs
cookie-parser@1.0.1 node_modules\cookie-parser
├── cookie-signature@1.0.3 └── cookie@0.1.0 morgan@1.0.1 node_modules\morgan
└── bytes@0.3.0 body-parser@1.0.2 node_modules\body-parser
├── qs@0.6.6 ├── raw-body@1.1.7 (bytes@1.0.0, string_decoder@0.10.25-1)
└── type-is@1.1.0 (mime@1.2.11)
express@4.2.0 node_modules\express
├── parseurl@1.0.1 ├── utils-merge@1.0.0 ├── cookie@0.1.2 ├── merge-descriptors@0.0.2 ├── escape-html@1.0.1 ├── range-parser@1.0.0 ├── fresh@0.2.2 ├── cookie-signature@1.0.3 ├── debug@0.8.1 ├── methods@1.0.0 ├── buffer-crc32@0.2.1 ├── serve-static@1.1.0 ├── path-to-regexp@0.1.2 ├── qs@0.6.6 ├── send@0.3.0 (debug@0.8.0, mime@1.2.11)
├── accepts@1.0.1 (negotiator@0.4.7, mime@1.2.11)
└── type-is@1.1.0 (mime@1.2.11)
E:\project\nodejs-demo>

?

?

  工程建立成功,啟動服務:

1
E:\project\nodejs-demo> npm start > nodejs-demo@0.0.1 start E:\project\nodejs-demo > node ./bin/www

?

?

?

  本地3000端口被打開,在瀏覽器地址欄輸入localhost:3000,訪問成功。


  2、目錄結構

  • bin——存放命令行程序。
  • node_modules——存放所有的項目依賴庫。
  • public——存放靜態文件,包括css、js、img等。
  • routes——存放路由文件。
  • views——存放頁面文件(ejs模板)。
  • app.js——程序啟動文件。
  • package.json——項目依賴配置及開發者信息。
1
2
3
4
5
6
7
8
9
10
11
E:\project\nodejs-demo> dir
????目錄: E:\project\nodejs-demo
Mode??????????????? LastWriteTime???? Length Name ----??????????????? -------------???? ------ ---- d----???????? 2014/8/16???? 21:55 bin
d----???????? 2014/8/16???? 22:03 node_modules
d----???????? 2014/8/16???? 21:55 public
d----???????? 2014/8/16???? 21:55 routes
d----???????? 2014/8/16???? 21:55 views -a---???????? 2014/8/16???? 21:55?????? 1375 app.js -a---???????? 2014/8/16???? 21:55??????? 327 package.json

?

?


  3、Express配置文件

  打開app.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var users = require('./routes/users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
app.use('/users', users);
/// catch 404 and forward to error handler
app.use(function(req, res, next) {
????var err = new Error('Not Found');
????err.status = 404;
????next(err);
});
/// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
????app.use(function(err, req, res, next) {
????????res.status(err.status || 500);
????????res.render('error', {
????????????message: err.message,
????????????error: err
????????});
????});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
????res.status(err.status || 500);
????res.render('error', {
????????message: err.message,
????????error: {}
????});
});
module.exports = app;

?

?


  4、Ejs模板

  修改app.js,讓ejs模板文件使用擴展名為html的文件:

1
2
3
4
5
13 // view engine setup
14 app.set('views', path.join(__dirname, 'views'));
15 //app.set('view engine', 'ejs');
16 app.engine('html', require('ejs').renderFile);
17 app.set('view engine', 'html');

?

?

?

  修改完成后,重命名views/index.ejs為views/index.html。重啟服務,訪問成功。


  5、安裝常用庫及頁面分離

  添加bootstrap和jQuery:

E:\project\nodejs-demo> npm install bootstrap
bootstrap@3.2.0 node_modules\bootstrap
E:\project\nodejs-demo> npm install jquery
jquery@2.1.1 node_modules\jquery
E:\project\nodejs-demo>

  接下來,把index.html分成三個部分:

  • header.html——頁面頭部區域。
  • index.html——頁面內容區域。
  • footer.html——頁面底部區域。

  header.html

1
2
3
4
5
6
7
8
9
<!DOCTYPE html>
<html lang="en">
<head>
????<meta charset="utf-8">
????<title><%= title %></title>
????<!-- Bootstrap -->
????<link href="/stylesheets/bootstrap.min.css" rel="stylesheet" media="screen">
</head>
<body screen_capture_injected="true">

?

?

  index.html

1
2
3
4
1 <% include header.html %>
2 <h1><%= title %></h1>
3 <p>Welcome to <%= title %></p>
4 <% include footer.html %>

?

?

footer.html

?

1
2
3
4
5
6
<script src="/javascripts/jquery.min.js"></script>
?<script src="/javascripts/bootstrap.min.js"></script>
?</body>
?</html>
 

?

?


?

 重啟服務,訪問成功。


  6、路由

  登錄設計:

訪問路徑頁面描述
/index.html不需要登錄,可以直接訪問。
/homehome.html必須用戶登錄以后,才可以訪問。
/loginlogin.html登錄頁面,用戶名密碼輸入正確,自動跳轉到home.html。
/logout退出登錄后,自動跳轉到index.html。

  打開app.js文件,增加路由配置:

1
2
3
4
5
26 app.use('/', routes);
27 app.use('/users', users);
28 app.use('/login', routes);
29 app.use('/logout', routes);
30 app.use('/home', routes);

?

?

打開routes/index.js文件,添加對應方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res) {
??res.render('index', { title: 'Express' });
});
router.route('/login')
.get(function(req, res) {
????res.render('login', { title: '用戶登錄' });
})
.post(function(req, res) {
????var user={
????????username: 'admin',
????????password: '123456'
????}
????if(req.body.username === user.username && req.body.password === user.password){
????????res.redirect('/home');
????}
????res.redirect('/login');
});
router.get('/logout', function(req, res) {
????res.redirect('/');
});
router.get('/home', function(req, res) {
????var user={
????????username:'admin',
????????password:'123456'
????}
????res.render('home', { title: 'Home', user: user });
});
module.exports = router;

?

?

  創建views/login.html和views/home.html兩個文件:

  login.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<% include header.html %>
<div class="container">
????<form class="col-sm-offset-4 col-sm-4 form-horizontal" role="form" method="post">
????????<fieldset>
????????????<legend>用戶登錄</legend>
????????????<div class="form-group">
????????????????<label class="col-sm-3 control-label" for="username">用戶名</label>
????????????????<div class="col-sm-9">
????????????????????<input type="text" class="form-control" id="username" name="username" placeholder="用戶名" required>
????????????????</div>
????????????</div>
????????????<div class="form-group">
????????????????<label class="col-sm-3 control-label" for="password">密碼</label>
????????????????<div class="col-sm-9">
????????????????????<input type="password" class="form-control" id="password" name="password" placeholder="密碼" required>
????????????????</div>
????????????</div>
????????????<div class="form-group">
????????????????<div class="col-sm-offset-3 col-sm-9">
????????????????????<button type="submit" class="btn btn-primary">登錄</button>
????????????????</div>
????????????</div>
????????</fieldset>
????</form>
</div>
<% include footer.html %>

?

?

  home.html

1
2
3
4
1 <% include header.html %>
2 <h1>Welcome <%= user.username %>, 歡迎登錄!!</h1>
3 <a class="btn" href="/logout">退出</a>
4 <% include footer.html %>

?

?

 修改index.html,增加登錄鏈接:

?

1
2
3
4
1 <% include header.html %>
2???? <h1>Welcome to <%= title %></h1>
3???? <p><a href="/login">登錄</a></p>
4 <% include footer.html %>

?

?

路由及頁面已準備好,重啟服務,訪問成功。

?


  7、session

  安裝中間件express-session:

1
2
3
4
5
E:\project\nodejs-demo> npm install express-session
express-session@1.7.5 node_modules\express-session
├── cookie@0.1.2 ├── cookie-signature@1.0.4 ├── on-headers@1.0.0 ├── utils-merge@1.0.0 ├── parseurl@1.3.0 ├── buffer-crc32@0.2.3 ├── depd@0.4.4 ├── debug@1.0.4 (ms@0.6.2)
└── uid-safe@1.0.1 (base64-url@1.0.0, mz@1.0.0)
E:\project\nodejs-demo>

?

?

  安裝中間件connect-mongodb:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
E:\project\nodejs-demo> npm install connect-mongodb
\ > kerberos@0.0.3 install E:\project\nodejs-demo\node_modules\connect-mongodb\nod
e_modules\mongodb\node_modules\kerberos > (node-gyp rebuild 2> builderror.log) || (exit 0) | E:\project\nodejs-demo\node_modules\connect-mongodb\node_modules\mongodb\node_mo
dules\kerberos>node "C:\Program Files\nodejs\node_modules\npm\bin\node-gyp-bin\\
..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild |
> bson@0.2.11 install E:\project\nodejs-demo\node_modules\connect-mongodb\node_m
odules\mongodb\node_modules\bson > (node-gyp rebuild 2> builderror.log) || (exit 0)
E:\project\nodejs-demo\node_modules\connect-mongodb\node_modules\mongodb\node_mo
dules\bson>node "C:\Program Files\nodejs\node_modules\npm\bin\node-gyp-bin\\..\.
.\node_modules\node-gyp\bin\node-gyp.js" rebuild
connect-mongodb@1.1.5 node_modules\connect-mongodb
├── connect@1.9.2 (mime@1.2.11, formidable@1.0.15, qs@1.2.2)
└── mongodb@1.4.8 (kerberos@0.0.3, readable-stream@1.0.27-1, bson@0.2.11)
E:\project\nodejs-demo>

?

?

  安裝中間件mongodb:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
E:\project\nodejs-demo> npm install mongodb -
> kerberos@0.0.3 install E:\project\nodejs-demo\node_modules\mongodb\node_module
s\kerberos > (node-gyp rebuild 2> builderror.log) || (exit 0) - E:\project\nodejs-demo\node_modules\mongodb\node_modules\kerberos>node "C:\Progr
am Files\nodejs\node_modules\npm\bin\node-gyp-bin\\..\..\node_modules\node-gyp\b
in\node-gyp.js" rebuild |
> bson@0.2.11 install E:\project\nodejs-demo\node_modules\mongodb\node_modules\b
son > (node-gyp rebuild 2> builderror.log) || (exit 0)
E:\project\nodejs-demo\node_modules\mongodb\node_modules\bson>node "C:\Program F
iles\nodejs\node_modules\npm\bin\node-gyp-bin\\..\..\node_modules\node-gyp\bin\n
ode-gyp.js" rebuild
mongodb@1.4.8 node_modules\mongodb
├── kerberos@0.0.3 ├── readable-stream@1.0.27-1 (isarray@0.0.1, string_decoder@0.10.25-1, inheri
ts@2.0.1, core-util-is@1.0.1)
└── bson@0.2.11 (nan@1.2.0)
E:\project\nodejs-demo>

?

?

  添加database/settings.js和database/msession.js這兩個文件:

  settings.js

1
2
3
4
5
6
7
8
9
module.exports = {
????COOKIE_SECRET: 'ywang1724.com',
????URL: 'mongodb://127.0.0.1:27017/nodedb',
????DB: 'nodedb',
????HOST: '127.0.0.1',
????PORT: 27017,
????USERNAME: 'admin',
????PASSWORD: '123456'
};

?

?

  msession.js

?

1
2
3
4
5
6
1 var Settings = require('./settings');
2 var Db = require('mongodb').Db;
3 var Server = require('mongodb').Server;
4 var db = new Db(Settings.DB, new Server(Settings.HOST, Settings.PORT, {auto_reconnect:true, native_parser: true}),{safe: false});
5
6 module.exports = db;

?

?

?

  修改app.js文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
//采用connect-mongodb中間件作為Session存儲?
var session = require('express-session');?
var Settings = require('./database/settings');?
var MongoStore = require('connect-mongodb');?
var db = require('./database/msession');
var routes = require('./routes/index');
var users = require('./routes/users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
//app.set('view engine', 'ejs');
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
//session配置
app.use(session({
????cookie: { maxAge: 600000 },
????secret: Settings.COOKIE_SECRET,
????store: new MongoStore({?
????????username: Settings.USERNAME,
????????password: Settings.PASSWORD,
????????url: Settings.URL,
????????db: db})
}))
app.use(function(req, res, next){
????res.locals.user = req.session.user;
????next();
});
app.use(express.static(path.join(__dirname, 'public')));
......

?

?

  修改index.js文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res) {
????res.render('index', { title: 'Express' });
});
router.route('/login')
.get(function(req, res) {
????res.render('login', { title: '用戶登錄' });
})
.post(function(req, res) {
????var user = {
????????username: 'admin',
????????password: '123456'
????}
????if(req.body.username === user.username && req.body.password === user.password){
????????req.session.user = user;
????????res.redirect('/home');
????} else {
????????res.redirect('/login');
????}
});
router.get('/logout', function(req, res) {
????req.session.user = null;
????res.redirect('/');
});
router.get('/home', function(req, res) {
????res.render('home', { title: 'Home' });
});
module.exports = router;

?

?

  本地安裝數據庫MongoDB,新建用戶nodedb。重啟服務,訪問成功。


  8、頁面訪問控制及提示

  訪問控制設計:

訪問路徑描述
/任何人都可以訪問,不需要認證。
/home攔截get請求,調用authentication()進行認證,不通過則自動跳轉到登錄頁面。
/login任何人都可以訪問,不需要認證。
/logout任何人都可以訪問,不需要認證。

  修改index.js文件:

1
2
3
4
5
6
7
8
9
10
router.get('/home', function(req, res) {
????authentication(req, res);
????res.render('home', { title: 'Home' });
});
function authentication(req, res) {
????if (!req.session.user) {
????????return res.redirect('/login');
????}
}

?

?

  重啟服務,訪問成功。

  添加頁面提示,修改app.js文件,增加res.locals.message:

1
2
3
4
5
6
7
8
9
10
app.use(function(req, res, next) {
????res.locals.user = req.session.user;
????var err = req.session.error;
????delete req.session.error;
????res.locals.message = '';
????if (err) {
????????res.locals.message = '<div class="alert alert-warning">' + err + '</div>';
????}
????next();
});

?

?

  修改index.js文件,增加req.session.error:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res) {
????res.render('index', { title: 'Express' });
});
router.route('/login')
.get(function(req, res) {
????if (req.session.user) {
????????res.redirect('/home');
????}
????res.render('login', { title: '用戶登錄' });
})
.post(function(req, res) {
????var user = {
????????username: 'admin',
????????password: '123456'
????}
????if (req.body.username === user.username && req.body.password === user.password) {
????????req.session.user = user;
????????res.redirect('/home');
????} else {
????????req.session.error='用戶名或密碼不正確';
????????res.redirect('/login');
????}
});
router.get('/logout', function(req, res) {
????req.session.user = null;
????res.redirect('/');
});
router.get('/home', function(req, res) {
????authentication(req, res);
????res.render('home', { title: 'Home' });
});
function authentication(req, res) {
????if (!req.session.user) {
????????req.session.error='請先登錄';
????????return res.redirect('/login');
????}
}
module.exports = router;

?

?

  修改login.html,增加<%- message %>:

?

1
2
3
5 <legend>用戶登錄</legend>
6 <%- message %>
7 <div class="form-group">

?

?

?

  重啟服務,訪問成功。輸入錯誤用戶名密碼:

轉載于:https://www.cnblogs.com/winyh/p/6681422.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393270.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393270.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393270.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode-208 Implement Trie (Prefix Tree)

題目描述 Implement a trie with insert, search, and startsWith methods. 題目大意 實現對一棵樹的插入、搜索以及前序查找操作。 &#xff08;樹的每個節點代表一個小寫字母&#xff0c;從根節點到葉節點代表一個完整的單詞&#xff09; 示例 E Trie trie new Trie();trie.…

react組件生命周期_React組件生命周期-掛鉤/方法介紹

react組件生命周期React components have several lifecycle methods that you can override to run your code at a particular time in the process.React組件具有幾種生命周期方法&#xff0c;您可以重寫它們以在流程中的特定時間運行代碼。 In this video, Nick Karnik de…

(馬世龍)Linux下CACTI完全搭建技術文檔二

續&#xff08;馬世龍&#xff09;Linux下CACTI完全搭建技術文檔一 6.完成cacti的安裝1. 首先檢查一下rra/下面&#xff0c;有沒有數據2. snmpwalk -v 2c -c public ServerIP if 用來測試被控對象(serverIP)是否開啟了SNMP服務3. snmpwalk -v 2c ServerIP -c public .1.3.6.1.4…

項目經理如何管理情緒?這三本書管理書籍你必須要看

本文主要是介紹三本管理的書籍&#xff0c;需要全部書籍的可以加Q群375508415去拿走。里面很多大神的PMP資料。 大家有沒有覺得項目經理有時像個政委&#xff0c;做員工思想工作&#xff1b; 有時像個HR&#xff0c;操心員工的穩定和發展&#xff1b; 有時像個咨詢顧問&#xf…

java 外部接口調用 設計模式_《Java設計模式》之接口模式

-----------模式是思想的體現&#xff0c;而非具體的實現。抽象的講&#xff0c;類的接口是類允許其他類對象訪問的方法與字段集。接口通常代表一種承諾&#xff0c;即方法需要實現接口方法名表示的操作&#xff0c;遵循代碼注釋和其他文檔說明&#xff0c;類的實現就是方法體中…

BFS(廣度優先搜索)

Catch That Cow Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer …

leetcode111. 二叉樹的最小深度(隊列)

給定一個二叉樹&#xff0c;找出其最小深度。最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。說明: 葉子節點是指沒有子節點的節點。示例:給定二叉樹 [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回它的最小深度 2.代碼 /*** Definition for a binary tree no…

企業網站6個常見的優化漏洞

導讀&#xff1a;企業做營銷網站目的&#xff0c;就是希望通過網絡營銷&#xff0c;挖掘目標客戶。目標客戶怎么來&#xff0c;那就需要通過網站優化&#xff0c;把網站關鍵詞優化排名到首頁&#xff0c;這樣才能更多的機會被潛在客戶點擊。很多企業網站上線之前&#xff0c;沒…

aspx 微型_最初的十億分鐘:正在向世界授課的微型非營利組織背后的數字

aspx 微型by Quincy Larson昆西拉爾森(Quincy Larson) 最初的十億分鐘&#xff1a;正在向世界授課的微型非營利組織背后的數字 (The First Billion Minutes: The Numbers Behind the Tiny Nonprofit That’s Teaching the World to Code) People have now spent more than 1 b…

[RN] React Native 自定義導航欄隨滾動漸變

React Native 自定義導航欄隨滾動漸變 實現效果預覽&#xff1a; 代碼實現&#xff1a; 1、定義導航欄 NavPage.js import React, {Component} from react; import {View, Text, Image, StyleSheet, TouchableOpacity, Platform, Dimensions} from react-native;/*** 自定義導航…

【CSS 技能提升】 :before和:after的使用

前幾天的晚上較全面的去看了下css的一些文檔和資料&#xff0c;大部分的樣式運用都沒什么大問題了&#xff0c;只是有些許較陌生&#xff0c;但是也知道他們的存在和實現的是什么樣式。今天主要想在這篇學習筆記中寫的也不多&#xff0c;主要是針對:before和:after寫一些內容&a…

c語言模擬java面向對象_純c語言實現面向對象分析與示例分享

#include #include //接口#ifndef Interface#define Interface struct#endif//類#ifndef Class#define Class struct#endif//抽象形狀類Class Shape;typedef Class Shape shape;//抽象形狀類的方法聲明shape* Shape(int edges);int shape_getEdges(shape *);int shape_getArea(…

leetcode152. 乘積最大子數組

給你一個整數數組 nums &#xff0c;請你找出數組中乘積最大的連續子數組&#xff08;該子數組中至少包含一個數字&#xff09;&#xff0c;并返回該子數組所對應的乘積。 示例 1: 輸入: [2,3,-2,4] 輸出: 6 解釋: 子數組 [2,3] 有最大乘積 6。 代碼 class Solution {publi…

成功試驗基于C#/.NET的Android開發

今天最開心事情莫過于摸索驗證了一個事情&#xff0c;C#也能進行Android和IOS開發&#xff0c;白天安裝了開發環境&#xff0c;晚上進行測試&#xff0c;直到此時此刻&#xff0c;已經成功的導出一款基于C#/.NET的安卓APK&#xff0c;并且能夠成功的導入到安卓手機運行&#xf…

使用機器學習預測天氣_如何使用機器學習根據文章標題預測喜歡和分享

使用機器學習預測天氣by Flavio H. FreitasFlavio H.Freitas著 如何使用機器學習根據文章標題預測喜歡和分享 (How to predict likes and shares based on your article’s title using Machine Learning) Choosing a good title for an article is an important step in the …

深入理解了MySQL,你才能說熟悉數據庫

先拋出幾個問題 1.為什么不建議使用訂單號作為主鍵?2.為什么要在需要排序的字段上加索引?3.for update 的記錄不存在會導致鎖住全表?4.redolog 和 binlog 有什么區別?5.MySQL 如何回滾一條 sql ?6.char(50) 和 varchar(50) 效果是一樣的么?索引知識回顧 對于 MySQL 數據庫…

ibatis mysql 自增_mybatis自增主鍵

簡單介紹&#xff1a;在使用mybats插入數據是&#xff0c;有很多需要和id關聯的其他數據&#xff0c;所以在插入一條信息時獲取其主鍵信息是很常見的操作。一 mysql數據庫的主鍵自增(int類型的主鍵)1 創建一個表&#xff0c;設置表的id(此id必須是int類型)&#xff0c;設置為au…

DataGridView控件用法二:常用屬性

通常會設置的DataGridView的屬性如下&#xff1a; AllowUserToAddRows - False指示是否向用戶顯示用于添加行的選項&#xff0c;列標題下面的一行空行將消失。一般讓其消失。AllowUserToDeleteRows - False指示是否允許用戶從DataGridView刪除行。一般不允許。AllowUserToOrder…

leetcode面試題 16.21. 交換和(二分查找)

給定兩個整數數組&#xff0c;請交換一對數值&#xff08;每個數組中取一個數值&#xff09;&#xff0c;使得兩個數組所有元素的和相等。 返回一個數組&#xff0c;第一個元素是第一個數組中要交換的元素&#xff0c;第二個元素是第二個數組中要交換的元素。若有多個答案&…

談談IP和MAC捆綁的破解之道

來源:[url]http://l-y.vicp.net[/url]我們學校最近將MAC和IP進行了捆綁&#xff0c;又在服務器&#xff08;2K&#xff09;上進行了上網時間的限制&#xff0c;真是煩死人了&#xff0c;我想我可是一個從不受限制的人啊&#xff0c;怎么可以就這樣束手就擒呢&#xff01;古話說…