├── README.md
├── Users
└── apple
│ └── www
│ └── project
│ └── muxibook
│ └── search.db
│ └── Book
│ ├── MAIN_8jt3wjhytygtom9m.seg
│ ├── MAIN_WRITELOCK
│ ├── MAIN_esyubvd4jjmxm689.seg
│ ├── MAIN_liyu72e8hxeoj8oq._stored.col
│ ├── MAIN_liyu72e8hxeoj8oq.pst
│ ├── MAIN_liyu72e8hxeoj8oq.trm
│ ├── MAIN_vl6mcotnvdl8xjhe.seg
│ ├── MAIN_yq6i0v69xesbr0fb._stored.col
│ ├── MAIN_yq6i0v69xesbr0fb.pst
│ ├── MAIN_yq6i0v69xesbr0fb.trm
│ └── _MAIN_92.toc
├── ajax
├── README.md
├── ajax.py
└── templates
│ ├── index.html
│ └── layout.html
├── app
├── __init__.py
├── forms.py
├── models.py
├── static
│ ├── css
│ │ ├── First.css
│ │ ├── new_First.css
│ │ └── reset.css
│ ├── image
│ │ ├── bgimage.png
│ │ ├── book.png
│ │ ├── book_1.png
│ │ ├── borrow.png
│ │ ├── boss.jpg
│ │ ├── images.png
│ │ ├── logo.png
│ │ ├── logo_input.png
│ │ ├── next.png
│ │ ├── prev.png
│ │ └── search.png
│ └── js
│ │ ├── jquery-1.3.2.min.js
│ │ ├── login.js
│ │ └── shouye.js
├── templates
│ ├── base.html
│ ├── bookin.html
│ ├── home.html
│ ├── info.html
│ ├── login.html
│ ├── r.html
│ ├── search.html
│ ├── search_results.html
│ ├── upload.html
│ ├── user.html
│ └── zhuye.html
└── views.py
├── data.sqlite
├── manage.py
├── migrations
├── README
├── alembic.ini
├── env.py
├── env.pyc
├── script.py.mako
└── versions
│ ├── 34333ffb9060_v23.py
│ ├── 34333ffb9060_v23.pyc
│ ├── 7e8d57e44be_v1.py
│ └── 7e8d57e44be_v1.pyc
├── requirment.txt
└── search.db
└── Book
├── MAIN_86jf48sb81rrdczv.seg
├── MAIN_WRITELOCK
├── MAIN_csh9s5peyn8nlqdh.seg
├── MAIN_geilisqde0ks3i8q.seg
├── MAIN_ja9eqfdgzgqfvpyd.seg
├── MAIN_ppqyedz6jly8tqz1.seg
├── MAIN_vdjw066zrgl6b0e3.seg
├── MAIN_zka4sbuen3z7bgdm.seg
├── _MAIN_192.toc
└── _MAIN_194.toc
/README.md:
--------------------------------------------------------------------------------
1 | # 木犀图书github开发版本
2 | 木犀图书的开发版本
3 | 数据库为测试数据库
4 |
5 | ## 木犀图书
6 | 用于管理木犀团队的书籍,提供书籍借阅、借阅归还、图书详情🔎功能。
7 | 
8 | ### 测试url
9 | CLOSE
10 |
11 | ### 运行
12 | clone 该仓库到本地
13 | 更改数据库路径
14 | python manage.py runserver 运行
15 |
16 | ### 备注
17 | 2015年9月30日,项目已迁移至bitbucket
18 |
--------------------------------------------------------------------------------
/Users/apple/www/project/muxibook/search.db/Book/MAIN_8jt3wjhytygtom9m.seg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/Users/apple/www/project/muxibook/search.db/Book/MAIN_8jt3wjhytygtom9m.seg
--------------------------------------------------------------------------------
/Users/apple/www/project/muxibook/search.db/Book/MAIN_WRITELOCK:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/Users/apple/www/project/muxibook/search.db/Book/MAIN_WRITELOCK
--------------------------------------------------------------------------------
/Users/apple/www/project/muxibook/search.db/Book/MAIN_esyubvd4jjmxm689.seg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/Users/apple/www/project/muxibook/search.db/Book/MAIN_esyubvd4jjmxm689.seg
--------------------------------------------------------------------------------
/Users/apple/www/project/muxibook/search.db/Book/MAIN_liyu72e8hxeoj8oq._stored.col:
--------------------------------------------------------------------------------
1 | B
--------------------------------------------------------------------------------
/Users/apple/www/project/muxibook/search.db/Book/MAIN_liyu72e8hxeoj8oq.pst:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/Users/apple/www/project/muxibook/search.db/Book/MAIN_liyu72e8hxeoj8oq.pst
--------------------------------------------------------------------------------
/Users/apple/www/project/muxibook/search.db/Book/MAIN_liyu72e8hxeoj8oq.trm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/Users/apple/www/project/muxibook/search.db/Book/MAIN_liyu72e8hxeoj8oq.trm
--------------------------------------------------------------------------------
/Users/apple/www/project/muxibook/search.db/Book/MAIN_vl6mcotnvdl8xjhe.seg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/Users/apple/www/project/muxibook/search.db/Book/MAIN_vl6mcotnvdl8xjhe.seg
--------------------------------------------------------------------------------
/Users/apple/www/project/muxibook/search.db/Book/MAIN_yq6i0v69xesbr0fb._stored.col:
--------------------------------------------------------------------------------
1 | B
--------------------------------------------------------------------------------
/Users/apple/www/project/muxibook/search.db/Book/MAIN_yq6i0v69xesbr0fb.pst:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/Users/apple/www/project/muxibook/search.db/Book/MAIN_yq6i0v69xesbr0fb.pst
--------------------------------------------------------------------------------
/Users/apple/www/project/muxibook/search.db/Book/MAIN_yq6i0v69xesbr0fb.trm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/Users/apple/www/project/muxibook/search.db/Book/MAIN_yq6i0v69xesbr0fb.trm
--------------------------------------------------------------------------------
/Users/apple/www/project/muxibook/search.db/Book/_MAIN_92.toc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/Users/apple/www/project/muxibook/search.db/Book/_MAIN_92.toc
--------------------------------------------------------------------------------
/ajax/README.md:
--------------------------------------------------------------------------------
1 | ## 只是占位
2 |
--------------------------------------------------------------------------------
/ajax/ajax.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | """
3 | jQuery Example
4 | ~~~~~~~~~~~~~~
5 | A simple application that shows how Flask and jQuery get along.
6 | :copyright: (c) 2015 by Armin Ronacher.
7 | :license: BSD, see LICENSE for more details.
8 | """
9 | from flask import Flask, jsonify, render_template, request
10 | app = Flask(__name__)
11 |
12 |
13 | @app.route('/_add_numbers')
14 | def add_numbers():
15 | """Add two numbers server side, ridiculous but well..."""
16 | a = request.args.get('a', 0, type=int)
17 | b = request.args.get('b', 0, type=int)
18 | return jsonify(result=a + b)
19 |
20 |
21 | @app.route('/')
22 | def index():
23 | return render_template('index.html')
24 |
25 | if __name__ == '__main__':
26 | app.run()
27 |
--------------------------------------------------------------------------------
/ajax/templates/index.html:
--------------------------------------------------------------------------------
1 | {% extends "layout.html" %}
2 | {% block body %}
3 |
24 |
jQuery Example
25 |
26 | +
27 | =
28 | ?
29 |
calculate server side
30 | {% endblock %}
31 |
--------------------------------------------------------------------------------
/ajax/templates/layout.html:
--------------------------------------------------------------------------------
1 |
2 |
jQuery Example
3 |
5 |
8 | {% block body %}{% endblock %}
9 |
--------------------------------------------------------------------------------
/app/__init__.py:
--------------------------------------------------------------------------------
1 | # coding: utf-8
2 | """
3 | muxibook 木犀图书管理系统
4 | ~~~~~~~~~~~~~~~~~~~~~~~~~
5 |
6 | 实现图书借阅管理功能
7 | """
8 | from flask import Flask
9 | from flask.ext.sqlalchemy import SQLAlchemy
10 | from flask.ext.login import LoginManager
11 |
12 |
13 | app = Flask(__name__)
14 | app.config['SECRET_KEY'] = "I hate flask!"
15 | # app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///path/to/data.sqlite" # 系统相应替换
16 | app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:////path/to/data.sqlite" # 系统相应替换
17 | app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
18 | app.config['WHOOSH_BASE'] = "search.db"
19 | app.config['MAX_SEARCH_RESULTS'] = 100 # 最大加载5个搜索结果
20 | app.config['UPLOAD_FOLDER'] = '/Users/apple/www/project/MuxiBookManagement/app/static/image/'
21 |
22 |
23 | db = SQLAlchemy(app)
24 | login_manager = LoginManager(app)
25 | login_manager.session_protection = 'strong'
26 | login_manager.login_view = 'login'
27 |
28 |
29 | from . import models, views, forms
30 |
--------------------------------------------------------------------------------
/app/forms.py:
--------------------------------------------------------------------------------
1 | # coding: utf-8
2 |
3 | """
4 | forms.py
5 | ~~~~~~~~
6 |
7 | 木犀表单文件
8 | """
9 | from flask.ext.wtf import Form
10 | from wtforms import IntegerField, StringField, SubmitField, PasswordField, \
11 | BooleanField
12 | from wtforms.validators import Required, EqualTo
13 |
14 |
15 | class SearchForm(Form):
16 | """搜索表单🔍"""
17 | search = StringField('完整书名or类别名', validators=[Required()])
18 | status1 = BooleanField('可借')
19 | status2 = BooleanField('全部')
20 | submit = SubmitField('搜索')
21 |
22 |
23 | class BookForm(Form):
24 | """录入表单"""
25 | bookname = StringField('书名', validators=[Required()])
26 | tag = StringField('类别(后台、设计、前端、互联网、其他)', \
27 | validators=[Required()])
28 | submit = SubmitField('录入')
29 |
30 |
31 | class LoginForm(Form):
32 | """登录表单"""
33 | username = StringField('用户名', validators=[Required()])
34 | password = PasswordField('密码', validators=[Required()])
35 | remember_me = BooleanField('记住我')
36 | submit = SubmitField('登录')
37 |
38 |
39 | class GetForm(Form):
40 | """借阅表单"""
41 | status = BooleanField('借阅')
42 | day = IntegerField('借阅天数')
43 | submit = SubmitField('确定借阅')
44 |
45 |
46 | class BackForm(Form):
47 | """归还表单"""
48 | status = BooleanField('归还')
49 | back = SubmitField('归还此书')
50 |
51 |
52 | class RterForm(Form):
53 | """注册表单"""
54 | username = StringField('用户名')
55 | password = PasswordField('密码', validators=[Required(), EqualTo('password1', message="密码匹配")])
56 | password1 = PasswordField('确认密码', validators=[Required()])
57 | submit = SubmitField('注册')
58 |
--------------------------------------------------------------------------------
/app/models.py:
--------------------------------------------------------------------------------
1 | # coding: utf-8
2 | """
3 | models.py
4 | ~~~~~~~~~
5 |
6 | 数据库文件
7 |
8 | 木犀图书是一个图书借阅管理网站,所以数据库主要提供图书、用户信息以及图书借阅状态与信息的存储
9 |
10 | 数据库tables:
11 | books
12 |
13 | id Integer, primary_key 主键
14 | url String url 对应豆瓣API的get url
15 | name String 书名
16 | summary String(编码) resp['summary']返回值 概要,豆瓣API获取
17 | image String(编码) resp['image']返回值 url 封面图,API获取
18 | user_id Integer,ForeignKey 外键 与users表的id相关联 与借阅者关联
19 | end String, 书籍到期时间
20 | status Boolean, 书籍的借阅状态,如果为True则被借阅
21 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
22 | users
23 |
24 | id Integer, primary_key 主键
25 | username String 用户名
26 | password password_hash 密码散列值
27 | book relationship 借阅书籍的属性
28 | """
29 | from . import db, login_manager, app
30 | from flask.ext.login import UserMixin
31 | from werkzeug.security import generate_password_hash, check_password_hash
32 | import sys
33 |
34 |
35 | # python 3搜索的不兼容
36 | if sys.version_info[0] == 3:
37 | enable_search = False
38 | else:
39 | enable_search = True
40 | import flask.ext.whooshalchemy as whooshalchemy
41 |
42 |
43 |
44 |
45 | class Book(db.Model):
46 | """图书类"""
47 | __searchable__ = ['name', 'tag', 'summary']
48 | __tablename__ = "books"
49 | id = db.Column(db.Integer, primary_key = True)
50 | url = db.Column(db.String(164))
51 | name = db.Column(db.Text)
52 | author = db.Column(db.Text)
53 | tag = db.Column(db.String(164))
54 | summary = db.Column(db.Text)
55 | image = db.Column(db.String(164))
56 | user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
57 | status = db.Column(db.Boolean)
58 | start = db.Column(db.String(164))
59 | end = db.Column(db.String(164))
60 |
61 | def __repr__(self):
62 | return "%r :The instance of class Book" % self.name
63 |
64 |
65 | class User(db.Model, UserMixin):
66 | """用户类"""
67 | __tablename__ = "users"
68 | id = db.Column(db.Integer, primary_key = True)
69 | username = db.Column(db.String(164))
70 | password_hash = db.Column(db.String(164))
71 | book = db.relationship('Book', backref="user", lazy="dynamic")
72 |
73 | @login_manager.user_loader
74 | def load_user(user_id):
75 | """flask-login要求实现的用户加载回调函数
76 | 依据用户的unicode字符串的id加载用户"""
77 | return User.query.get(int(user_id))
78 |
79 | @property
80 | def password(self):
81 | """将密码方法设为User类的属性"""
82 | raise AttributeError('无法读取密码原始值!')
83 |
84 | @password.setter
85 | def password(self, password):
86 | """设置密码散列值"""
87 | self.password_hash = generate_password_hash(password)
88 |
89 | def verify_password(self, password):
90 | """验证密码散列值"""
91 | return check_password_hash(self.password_hash, password)
92 |
93 | def __repr__(self):
94 | return "%r :The instance of class User" % self.username
95 |
96 |
97 | if enable_search:
98 | whooshalchemy.whoosh_index(app, Book)
99 |
--------------------------------------------------------------------------------
/app/static/css/First.css:
--------------------------------------------------------------------------------
1 | .bgimage{
2 | background: transparent url(../image/bgimage.png) no-repeat;
3 | background-size: 100%;
4 | height: 20%;
5 | width: 100%;
6 | z-index: -999;
7 |
8 |
9 | }
10 | .bgimage img{
11 | width: 100%;
12 | }
13 | .container{
14 | margin: 70px auto;
15 | width: 1094px;
16 | background-color: #eee;
17 | border: transparent solid;
18 | overflow: hidden;
19 | margin: -10px auto 0 ;
20 | padding-bottom: 30px;
21 | }
22 | a{
23 | text-decoration: none;
24 | }
25 | a:hover{
26 | color: #fff843;
27 | }
28 | .nav_image{
29 | height: 100px;
30 | width: 240px;
31 | position: absolute;
32 | z-index: 1002;
33 | }
34 | .header{
35 | width: 1100px;
36 | position: relative;
37 | margin: 80px auto 0;
38 | height: 100px;
39 |
40 | }
41 | .header .menu{
42 | background-color: #332a1c;
43 | height: 75px;
44 | right: 0;
45 | top: 14%;
46 | left: 7%;
47 | position: absolute;
48 | }
49 | .menu{
50 | padding-left:455px;
51 |
52 | }
53 | .menu .nav{
54 | display: inline-block;
55 | list-style:none;
56 | text-align: center;
57 | margin-top: 3px;
58 | width: 125px;
59 | z-index: 1001;
60 | }
61 | .menu .nav a{
62 | display: block;
63 | color: white;
64 | font-size: 15px;
65 | line-height: 70px;
66 | text-decoration: none;
67 | }
68 | .menu .nav a:hover{
69 | border-top: #eee 5px solid;
70 | margin-top: -5px;
71 | background-color: #44351d;
72 | }
73 | .menu li:visited{
74 | color: #fff843;
75 |
76 | }
77 |
78 | .new_book{
79 | margin-top: 30px;
80 | float: left;
81 | margin-right: 43px;
82 | width: 170px;
83 | height: 235px;
84 | position: relative;
85 | overflow: hidden;
86 | }
87 | .book{
88 | width: 100%;
89 | height: 100%;
90 | }
91 | .book_information{
92 | background-color: #332a1c;
93 | opacity: 0.9;
94 | text-align: center;
95 | position: absolute;
96 | top: 78%;
97 | width: 100%;
98 | height: 100%;
99 | transition:all 0.5s;
100 | }
101 | .book_information:hover{
102 | top: 0;
103 | }
104 | .title{
105 | font-size: 15px;
106 | color: #fff843;
107 | padding: 11px 0 4px;
108 | overflow: hidden;
109 | text-overflow: ellipsis;
110 | width: 167px;
111 | white-space:nowrap;
112 | }
113 | .title:hover{
114 | font-size: 15px;
115 | color: #fff843;
116 | padding: 11px 0 4px;
117 | width: 167px;
118 | }
119 | .author{
120 | font-size: 12px;
121 | color: #6e6961;
122 | }
123 | .author_hid{
124 | font-size: 12px;
125 | color: #6e6961;
126 | width: 167px;
127 | }
128 | .book_back{
129 | color: #eee;
130 | font-size: 15px;
131 | margin-bottom: 5px;
132 | }
133 | .right{
134 | width: 190px;
135 | float: left;
136 | margin:60px 0 5px 98px;
137 | }
138 | .book_tags{
139 | border-top:#6e6961 2px solid;
140 | margin-top: 10px;
141 | font-size: 12px
142 | }
143 | .book_tags p{
144 | color: white;
145 | margin-top:40px;
146 | }
147 | .bar{
148 | width: 100%;
149 | height: 8px;
150 | position: absolute;
151 | top: 0;
152 | }
153 | .progress{
154 | height: 100%;
155 | background-color: #fff843;
156 | border-radius: 5px;
157 | width: 0;
158 | }
159 | .footer{
160 | width: 100%;
161 | text-align: center;
162 | background-color: #332a1c;
163 | }
164 | .footer_word a:hover{
165 | color: #fff843;
166 |
167 | }
168 | .word_first a{
169 | color: #eee;
170 | font-size: 15px;
171 | line-height: 60px;
172 | }
173 | .word_second a{
174 | color: #eee;
175 | font-size: 12px;
176 | line-height: 50px;
177 | }
178 | /*首页最新录入类别导航*/
179 | .left{
180 | float: left;
181 | width:640px;
182 | margin: 60px 0 0 50px;
183 | position: relative;
184 | }
185 | .content{
186 | display:block;
187 | font-size: 21px;
188 | color: #332a1c;
189 | font-weight: 600;
190 | border-bottom: #332a1c 2px solid;
191 | padding-bottom: 14px;
192 | width: 640px;
193 | }
194 | .content_right{
195 | width: 210px;
196 | }
197 | .showbox{
198 | width: 640px;
199 | height: 630px;
200 | overflow: hidden;
201 | position: relative;
202 | }
203 | .slide{
204 | position: absolute;
205 | top: 0;
206 | }
207 | .slide li{
208 | float: left;
209 | overflow: hidden;
210 | display: block;
211 | }
212 | #prev,#prev_ever{
213 | background:transparent url(../image/prev.png) no-repeat 100%;
214 | }
215 | #next,#next_ever{
216 | background: transparent url(../image/next.png) no-repeat 100%;
217 | }
218 | .content .btn{
219 | width: 25px;
220 | height: 25px;
221 | float: right;
222 | margin: 0 35px 0 -10px;
223 | }
224 | .show_users{
225 | height:280px;
226 | }
227 | .ever{
228 | margin-top: 50px;
229 | }
230 | .flashes{
231 | background-color: #fff843;
232 | color: #332a1c;
233 | text-align: center;
234 | width: 100%;
235 | height: 20px;
236 | position: absolute;
237 | top: 0;
238 | }
239 |
--------------------------------------------------------------------------------
/app/static/css/new_First.css:
--------------------------------------------------------------------------------
1 | .black_overlay{
2 | display: none;
3 | position: fixed;
4 | top:0%;
5 | left:0%;
6 | width:100%;
7 | height:100%;
8 | background-color:black;
9 | z-index:2015;
10 | -moz-opacity:0.5;
11 | opacity:0.5;
12 | filter:alpha(opacity=50);
13 | }
14 | .light_content{
15 | display:none;
16 | position:fixed;
17 | top:50%;
18 | left:50%;
19 | transform:translate(-50%,-50%);
20 | z-index: 2016;
21 | border: 1px #dad33e solid;
22 | background-color: #dad33e;
23 | border-radius: 10px;
24 | text-align: center;
25 | width:500px;
26 | height:320px;
27 | }
28 |
29 | .close{
30 | position: fixed;
31 | top: 5%;
32 | right: 5%;
33 | width: 40px;
34 | height: 5px;
35 | background: #fff;
36 | -webkit-transform: rotate(45deg);
37 | -moz-transform: rotate(45deg);
38 | z-index: 2016;
39 | display: none;
40 | }
41 | .close:after{
42 | content: "";
43 | width: 40px;
44 | height: 5px;
45 | background: #fff;
46 | -webkit-transform: rotate(90deg);
47 | -moz-transform: rotate(90deg);
48 | z-index: 2016;
49 | top: 5%;
50 | right: 5%;
51 | position: absolute;
52 | }
53 | .close:hover{
54 |
55 |
56 | }
57 | .search_word{
58 | line-height: 110px;
59 | font-size: 31px;
60 | font-weight: 600;
61 | }
62 | .search_ipt{
63 | position: relative;
64 | height: 66px;
65 |
66 | }
67 | .ipt{
68 | width: 284px;
69 | padding:25px;
70 | border: #fff843;
71 | border-radius: 5px;
72 | font-size: 14px;
73 | }
74 | .search_logo{
75 | position: absolute;
76 | top: 30%;
77 | right: 20%;
78 | background: url(../image/search.png) no-repeat 100%;
79 | width: 30px;
80 | height:35px;
81 | border: none;
82 | }/*
83 | .choose{
84 | margin:18px;
85 | }
86 | .choose label{
87 | margin:0 20px;
88 | font-weight:600;
89 | }*/
90 | .tags li{
91 | display: inline-block;
92 | margin-left: -9px;
93 | }
94 |
95 | .tags li a{
96 | font-size: 20px;
97 | font-weight: 600;
98 | float: left;
99 | color: black;
100 | margin:40px 0;
101 | width: 70px;
102 | line-height: 25px;
103 |
104 | }
105 | .tags li a:hover{
106 | background-color:#332a1c ;
107 | color: white;
108 | border-radius: 3px;
109 | }
110 | .dengLu{
111 | font-family: adobe heiti std;
112 | font-size: 38px;
113 | margin-top: 35px;
114 | }
115 | .logOn_input{
116 | position: relative;
117 | margin: 17px auto;
118 | }
119 | .logo{
120 | display: block;
121 | position: absolute;
122 | width: 40px;
123 | height: 38px;
124 | top: 9px;
125 | left: 110px;
126 | border-radius:5px;
127 | }
128 | .name{
129 | background: transparent url(../image/logo_input.png) no-repeat 0 0;
130 | }
131 | .code{
132 | background: transparent url(../image/logo_input.png) no-repeat 0 -38px;
133 | }
134 | .logOn_input_text input{
135 | height: 55px;
136 | width: 185px;
137 | border: none;
138 | border-radius: 5px;
139 | padding: 0 55px;
140 | font-size: 19px;
141 | }
142 | .logOn_text{
143 | position: absolute;
144 | right: 110px;
145 | top: 35%;
146 | font-size: 20px;
147 | font-family: adobe heiti std;
148 | }
149 | .btn{
150 | width: 77px;
151 | height: 36px;
152 | background-color: #332a1c;
153 | border: none;
154 | border-radius: 5px;
155 | color: #fff;
156 | font-size:18px;
157 | font-family:adobe heiti std;
158 | cursor: pointer;
159 | }
160 | .btn a{
161 | width: 77px;
162 | height: 35px;
163 | }
164 | .go{
165 | position: absolute;
166 | left: 25%;
167 |
168 | }
169 | .cancel{
170 | position: absolute;
171 | right: 25%
172 | }
173 | .cancel a{
174 | color: #fff;
175 | display: inline-block;
176 | line-height: 38px;
177 | }
178 | .prompt{
179 | margin: 70px auto 100px;
180 | font-size: 35px;
181 | }
182 | .promptbox{
183 | width: 120px;
184 | height: 180px;
185 | position: absolute;
186 | left: 100px;
187 | bottom: 15px;
188 | }
189 | .promptbox img{
190 | width: 100%;
191 | height: 100%;
192 | }
193 | /*搜索结果页*/
194 | .result_bgc{
195 | width: 100%;
196 | background-color: #fff843;
197 | margin-top: 30px;
198 | padding-top: 17px;
199 | padding-bottom: 20px;
200 | min-height: 400px;
201 | }
202 | .result_bookinformation{
203 | background-color: #332a1c;
204 | width: 880px;
205 | margin: 17px auto 65px;
206 | height: 120px;
207 | position: relative;
208 | color: #eee;
209 | }
210 | .result_book{
211 | width: 120px;
212 | height: 155px;
213 | position: absolute;
214 | top: 8px;
215 | right: 50px;
216 | }
217 | .result_book_content{
218 | width: 100%;
219 | height: 45px;
220 | text-align: center;
221 | color: #eee;
222 | position: absolute;
223 | bottom: 0;
224 | background-color: #332a1c;
225 | overflow: hidden;
226 | }
227 | .result_bookinformation>.left{
228 | width: 510px;
229 | height: 100%;
230 | margin: 10px 0 10px 50px;
231 |
232 | }
233 | .result_bookinformation>.left p{
234 | text-indent: 2em;
235 | font-size: 15px;
236 | line-height: 18px;
237 | }
238 | .result_bookinformation>.left p a{
239 | color: #fff843;
240 | }
241 | .result_borrow{
242 | background-color: #fff843;
243 | border-radius: 2px;
244 | color: #332a1c;
245 | display: inline-block;
246 | line-height: 30px;
247 | text-align: center;
248 | margin: 50px;
249 | width: 40px;
250 | }
251 | /*书籍信息页面*/
252 |
253 | .info_right_top{
254 | width: 100%;
255 | height: 230px;
256 | text-align: center;
257 | }
258 | .info_right_buttom{
259 | width: 100%;
260 | height: 180px;
261 | text-align: center;
262 | }
263 | .info_right_form{
264 | display: inline-block;
265 | line-height:40px;
266 | }
267 | .info_input input{
268 | height: 55px;
269 | width: 185px;
270 | border: none;
271 | border-radius: 5px;
272 | padding: 0 55px;
273 | font-size: 19px;
274 | }
275 | .info_b{
276 | position: relative;
277 |
278 | }
279 | .info_logo{
280 | width: 40px;
281 | height: 30px;
282 | background: transparent url(../image/borrow.png) no-repeat;
283 | -webkit-background-size: 100%;
284 | background-size: 100%;
285 | position: absolute;
286 | top: 12%;
287 | right: 5%;
288 | }
289 | .result_sub{
290 | line-height: 35px;
291 | color: white;
292 | background-color: #332a1c;
293 | width: 70px;
294 | border: none;
295 | border-radius: 5px;
296 | font-size: 18px;
297 | margin-top: 7%;
298 | cursor: pointer;
299 | }
300 | .info_left{
301 | display: inline-block;
302 | width: 50%;
303 | background: #332a1c;
304 | color: #eee;
305 | }
306 | .info_content{
307 | width: 490px;
308 | margin: 20px 34px;
309 | }
310 | .info_content h2{
311 | color: #fff843;
312 | font-size: 25px;
313 | }
314 | .info_content p {
315 | text-indent: 2em;
316 | line-height: 25px;
317 | }
318 | .info_right{
319 | width: 50%;
320 | float: right;
321 | }
322 | .info_book{
323 | position: relative;
324 | display: inline-block;
325 | top: 0;
326 | right: 0;
327 | width: 150px;
328 | height: 200px;
329 | }
330 | .info_borrowed p{
331 | line-height: 30px;
332 | }
333 | /*头像上传*/
334 | .avanter{
335 | width: 200px;
336 | height: 250px;
337 | position: relative;
338 | overflow: hidden;
339 | transition:all,fast;
340 | margin-top:30px;
341 | }
342 | .avanter img{
343 | width: 100%;
344 | height: 100%;
345 | }
346 | .ava_button{
347 | width: 100%;
348 | height: 20%;
349 | background-color: #332a1c;
350 | text-align: center;
351 | color: #eee;
352 | position: absolute;
353 | top: 90%;
354 | color: #eee;
355 | }
356 | .ava_button:hover{
357 | top: 80%;
358 |
359 | }
360 |
361 | .error{
362 | font-size: 200px;
363 | font-weight: 900;
364 | color: black;
365 | margin-bottom: 100px
366 | }
367 | #avanter_iframe{
368 | display: none;
369 | width: 300px;
370 | height: 200px;
371 | position: absolute;
372 | background-color: white;
373 | top: 50%;
374 | right: 10%;
375 | }
376 | #avanter_iframe iframe{
377 | width: 100%;
378 | height: 100%;
379 | border: none;
380 | }
--------------------------------------------------------------------------------
/app/static/css/reset.css:
--------------------------------------------------------------------------------
1 | html, body, div, span,h1, h2, h3, h4, h5, h6, p,ul,ol{
2 | margin: 0;
3 | padding: 0;
4 | border: 0;
5 | font-size: 100%;
6 | font: "Microsoft Yahei","微软雅黑","heiti";
7 | vertical-align: baseline;
8 | }
9 | nav{
10 | display:block;
11 | }
12 | a,a:link,a:hover{
13 | text-decoration: none;
14 | }
15 | body {
16 | line-height: 1;
17 | }
18 | ol, ul {
19 | list-style: none;
20 | }
21 | table {
22 | border-collapse: collapse;
23 | border-spacing: 0;
24 | }
--------------------------------------------------------------------------------
/app/static/image/bgimage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/app/static/image/bgimage.png
--------------------------------------------------------------------------------
/app/static/image/book.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/app/static/image/book.png
--------------------------------------------------------------------------------
/app/static/image/book_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/app/static/image/book_1.png
--------------------------------------------------------------------------------
/app/static/image/borrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/app/static/image/borrow.png
--------------------------------------------------------------------------------
/app/static/image/boss.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/app/static/image/boss.jpg
--------------------------------------------------------------------------------
/app/static/image/images.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/app/static/image/images.png
--------------------------------------------------------------------------------
/app/static/image/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/app/static/image/logo.png
--------------------------------------------------------------------------------
/app/static/image/logo_input.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/app/static/image/logo_input.png
--------------------------------------------------------------------------------
/app/static/image/next.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/app/static/image/next.png
--------------------------------------------------------------------------------
/app/static/image/prev.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/app/static/image/prev.png
--------------------------------------------------------------------------------
/app/static/image/search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/app/static/image/search.png
--------------------------------------------------------------------------------
/app/static/js/jquery-1.3.2.min.js:
--------------------------------------------------------------------------------
1 | /*
2 | * jQuery JavaScript Library v1.3.2
3 | * http://jquery.com/
4 | *
5 | * Copyright (c) 2009 John Resig
6 | * Dual licensed under the MIT and GPL licenses.
7 | * http://docs.jquery.com/License
8 | *
9 | * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
10 | * Revision: 6246
11 | */
12 | (function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,""]||!O.indexOf("
",""]||(!O.indexOf(" | ","
"]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div","
"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
13 | /*
14 | * Sizzle CSS Selector Engine - v0.9.3
15 | * Copyright 2009, The Dojo Foundation
16 | * Released under the MIT, BSD, and GPL Licenses.
17 | * More information: http://sizzlejs.com/
18 | */
19 | (function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(Fa';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("").append(M.responseText.replace(/
114 |
115 | {% endblock %}
116 |
--------------------------------------------------------------------------------
/app/templates/info.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% block title %}图书信息{% endblock %}
3 |
4 | {% block css_file %}
5 |
6 |
7 |
8 | {% endblock %}
9 |
10 | {% block page_content %}
11 |
12 |
13 |
14 |
15 |
16 |
{{ book.name }}
17 |
{{ book.author }}
18 |
{{ book.summary}}
19 |
20 |
21 |
22 |
23 |
24 |

25 |
26 |
{{ book.name}}
27 |
{{ book.author }}
28 |
29 |
30 |
31 |
32 | {% if current_user.is_authenticated %}
33 | {% if book.status == False %}
34 |
35 |
46 | {% else %}
47 |
48 |
借阅者:{{ book.user.username}}
49 |
到期时间:{{ book.end }}
50 |
51 | {% endif %}
52 | {% endif %}
53 |
54 |
55 |
56 |
57 |
58 |
59 | {% endblock%}
60 |
61 | {% block form_content %}
62 |
63 | 到首页登陆后才能使用哦!
64 |
65 |
67 | {% endblock %}
68 |
69 |
70 | {% block script_file %}
71 |
72 |
73 | {% endblock %}
74 |
--------------------------------------------------------------------------------
/app/templates/login.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | 登录
4 |
24 |
25 |
--------------------------------------------------------------------------------
/app/templates/r.html:
--------------------------------------------------------------------------------
1 | {% extends 'base.html' %}
2 | {% block page_content %}
3 |
4 |
11 |
12 | {% endblock %}
13 |
--------------------------------------------------------------------------------
/app/templates/search.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% block title %}木犀搜索{% endblock %}
3 |
4 | {% block css_file %}
5 |
6 |
7 | {% endblock %}
8 |
9 | {% block page_content %}
10 |
11 |
18 |
19 |
20 | 关于搜索:搜索支持两种模式:1.全名搜索(ex: Python核心编程(第二版)),
21 | 2.类别搜索(ex: 后台),目前类别(后台、前端、设计、互联网、其他)
22 |
23 |
24 | {% endblock %}
25 |
26 | {% block script_file %}
27 |
28 |
29 | {% endblock %}
30 |
--------------------------------------------------------------------------------
/app/templates/search_results.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block css_file %}
4 |
5 |
6 |
7 | {% endblock %}
8 |
9 | {% block page_content %}
10 |
11 |
12 | {% for book in get_book_list %}
13 |
35 | {% endfor %}
36 |
37 |
38 | {% endblock %}
39 | {% block form_content %}
40 |
41 | 到首页登陆后才能使用哦!
42 |
43 |
44 | {% endblock %}
45 |
46 |
47 | {% block script_file %}
48 |
49 |
50 | {% endblock %}
51 |
--------------------------------------------------------------------------------
/app/templates/upload.html:
--------------------------------------------------------------------------------
1 | 木犀头像
2 |
3 |
4 |
16 |
17 |
18 | 木犀图书头像上传
19 |
118 | {% endblock %}
119 |
120 | {% block script_file %}
121 |
122 |
123 | {% endblock %}
124 |
--------------------------------------------------------------------------------
/app/templates/zhuye.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 木犀图书
6 |
7 |
8 |
9 |
10 |
11 |
17 |
18 |
19 |
20 |
58 |
59 |
新增图书
60 | {% for book in new_book_list %}
61 |
62 |

63 |
64 |
84 |
85 | {% endfor %}
86 |
87 |
88 |
89 |
最近借阅
90 | {% for book in get_book_list %}
91 |
92 |

93 |
111 |
112 | {% endfor %}
113 |
114 |
115 |
木犀工作室出品
116 |
117 |
118 |
119 |
120 |
121 |
--------------------------------------------------------------------------------
/app/views.py:
--------------------------------------------------------------------------------
1 | # coding: utf-8
2 |
3 | """
4 | views.py
5 | ~~~~~~~~
6 |
7 | 木犀图书视图函数
8 | url func
9 | /;/home 1.最近录入(6条), 2.最近借阅
10 | /logout 登出
11 | /bookin 录入新书(只有管理员可见)
12 | /search 站内搜索(支持两种模式)
13 | /search_results 搜索结果页(提供借阅表单) 关于借阅状态
14 | /admin 后台管理(只有管理员可见)
15 | /rter 注册接口 (只有管理员可见)
16 | / 个人信息页(最近借阅)(快要到期 3天)
17 | 已过期的图书会flash消息提示
18 | 有情怀的flash提示
19 | """
20 |
21 | from . import app, db
22 | from werkzeug import secure_filename
23 | from functools import wraps
24 | from app.models import User, Book
25 | from app.forms import BookForm, GetForm, LoginForm, RterForm
26 | from flask import render_template, redirect, url_for, flash, request, session
27 | from flask.ext.login import login_user, logout_user, login_required, current_user
28 | from urllib2 import urlopen
29 | import json
30 | import datetime
31 | import os
32 |
33 | """
34 | |
35 | /------------/\-------------\
36 | / \
37 | | 木犀团队棒棒嗒 |
38 | """
39 | # ------------------------------------------------------
40 | # """ 我们在路上 前方不会太远 """
41 | # ------------------------------------------------------
42 |
43 |
44 | # 允许上传的文件扩展名
45 | ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
46 |
47 |
48 | def allowed_file(filename):
49 | """检查文件扩展名函数"""
50 | return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
51 |
52 |
53 | # 对所有访客可见
54 | @app.route('/', methods=["POST", "GET"])
55 | def home():
56 | """
57 | 首页视图函数
58 |
59 | 1. 最近录入
60 | 2. 最近借阅
61 |
62 | new_book_list: 最近录入新书列表(默认为6本, 依据时间[id]排序)
63 | """
64 | form = LoginForm()
65 | new_book_list = Book.query.order_by('-id').all()
66 | get_book_list = Book.query.filter_by(status=True).order_by('start desc').all()[:2]
67 |
68 | if form.validate_on_submit():
69 | user = User.query.filter_by(username=form.username.data).first()
70 | if user is not None and user.verify_password(form.password.data):
71 | login_user(user)
72 | return redirect(url_for('user', id=current_user.id))
73 | flash('用户名或密码错误!')
74 |
75 | range_book_count = range(len(new_book_list)/6 + 1)
76 |
77 | return render_template('home.html', new_book_list=new_book_list,
78 | get_book_list=get_book_list, form=form,
79 | range_book_count=range_book_count)
80 |
81 |
82 | # 对所有访客可见
83 | @app.route('/search', methods=["POST", "GET"])
84 | def search():
85 | """
86 | 搜索视图函数
87 |
88 | 1. 搜索表单
89 | 2. 显示搜索结果列表(最多加载5条搜索结果)
90 |
91 | 搜索模式:
92 | 1. 书名搜索(书名必须正确)
93 | 2. 类别搜索(返回类别的图书:后台、前端、设计、互联网、其他)
94 | """
95 | if request.methos == 'POST':
96 | """前端 input 标签 action 实现重定向
97 | 递交 search_results 处理"""
98 | pass
99 |
100 |
101 | # 对所有访客可见
102 | @app.route('/search_results/', methods=["POST", "GET"])
103 | def search_results():
104 | """
105 | 搜索结果页
106 |
107 | 提供书籍借阅表单
108 | """
109 | form2 = LoginForm()
110 | get_book_list = []
111 | search = request.args.get('search')
112 | results = Book.query.whoosh_search(search, app.config['MAX_SEARCH_RESULTS'])
113 |
114 | for book in results[:]:
115 | """
116 | # 默认搜索结果全部为可借阅图书
117 | if request.args.get('range') == 'can':
118 | if book.status != True:
119 | # 跳过不可借阅图书
120 | get_book_list.append(book)
121 | if request.args.get('range') == 'all':
122 | get_book_list.append(book)
123 | """
124 | get_book_list.append(book)
125 |
126 | return render_template('search_results.html',
127 | get_book_list=get_book_list,
128 | search=search,
129 | form2=form2)
130 |
131 |
132 | # 对所有访客可见,但只有登录用户可以借阅(html改动)
133 | @app.route('/info/', methods=["POST", "GET"])
134 | def info(name):
135 | form = GetForm()
136 | form2 = LoginForm()
137 | book = Book.query.filter_by(name=name).first()
138 | if form.validate_on_submit():
139 | day = form.day.data
140 | if int(day) >= 0:
141 | start = datetime.datetime.now()
142 | book.start = start
143 | book.user_id = current_user.id
144 | book.status = True # 已被借
145 | book.end = (start + datetime.timedelta(day)).strftime("%Y-%m-%d %H:%M:%S")
146 | return redirect(url_for('user', id=current_user.id))
147 | else:
148 | flash('光阴似箭、岁月如梭,时间-你不能篡改她,更不能逆转她!')
149 | return render_template('info.html', book=book, form=form, form2=form2)
150 |
151 |
152 | # 只对管理员可见
153 | @app.route('/rter', methods=["POST", "GET"])
154 | @login_required
155 | def rter():
156 | """用户注册接口"""
157 | if current_user.username == 'neo1218':
158 | form = RterForm()
159 | if form.validate_on_submit():
160 | u = User(username=form.username.data, password=form.password.data)
161 | db.session.add(u)
162 | db.session.commit()
163 | return render_template('r.html', form=form)
164 | else:
165 | return redirect(url_for('home'))
166 |
167 |
168 | # 只对管理员可见
169 | @app.route('/bookin', methods=["POST", "GET"])
170 | @login_required
171 | def bookin():
172 | """
173 | 书籍录入
174 |
175 | 输入书籍的名字,将书籍的
176 |
177 | 书名, 封面, 简介 录入数据库
178 | """
179 | if current_user.username == 'neo1218':
180 | form = BookForm()
181 |
182 | if form.validate_on_submit():
183 | bookname = form.bookname.data
184 | get_url = "https://api.douban.com/v2/book/search?q=%s" % bookname
185 | resp_1 = json.loads(urlopen(get_url).read().decode('utf-8'))
186 | book_id = resp_1['books'][0]['id']
187 | url = "https://api.douban.com/v2/book/%s" % book_id
188 | resp_2 = json.loads(urlopen(url).read().decode('utf-8'))
189 | book = Book(url=url, name=resp_2['title'], author=resp_2['author'][0], \
190 | tag=form.tag.data, summary=resp_2['summary'], \
191 | image=resp_2['images'].get('large'), user_id=None, end=None, \
192 | status=False)
193 | db.session.add(book)
194 | db.session.commit()
195 | flash('书籍已录入!')
196 | return redirect(url_for('bookin'))
197 | return render_template('bookin.html', form=form)
198 | else:
199 | return redirect(url_for('home'))
200 |
201 |
202 | # 对所有登录用户可见
203 | @app.route('/logout')
204 | @login_required
205 | def logout():
206 | """退出视图函数"""
207 | logout_user()
208 | return redirect(url_for('home'))
209 |
210 |
211 | # 对登录用户可见
212 | @app.route('/user/', methods=["POST", "GET"])
213 | def user(id):
214 | """
215 | 用户个人信息页
216 | 显示该用户历史借阅
217 | 显示该用户快要过期的书(3天为界)
218 |
219 | 提供用户还书按钮
220 |
221 | 借阅图书默认按归还时间顺序排序
222 | """
223 | book_list = Book.query.filter_by(user_id=current_user.id).order_by('end').all()
224 | time_done_book = []
225 | time_dead_book = []
226 |
227 | for book in book_list:
228 | delta = (datetime.datetime.strptime(book.end, "%Y-%m-%d %H:%M:%S") - \
229 | datetime.datetime.now()).total_seconds()
230 | if delta <= 3*24*60*60 and delta > 0:
231 | time_done_book.append(book)
232 | if delta <= 0:
233 | time_dead_book.append(book)
234 |
235 | if request.method == "POST":
236 | """在前端input标签的重定向页面进行处理"""
237 | return redirect(url_for('user', id=current_user.id))
238 |
239 | books = Book.query.filter_by(name=request.args.get('back'), user_id=current_user.id).all()
240 | for book in books:
241 | book.status = False
242 | book.start = None
243 | book.end = None
244 | book.user_id = None
245 | flash('%s 已归还!' % book.name)
246 | return redirect(url_for('user', id=current_user.id))
247 |
248 | range_book_count = range(len(book_list)/3 + 1)
249 | range_timedonebook_count = range(len(time_done_book)/3 + 1)
250 |
251 | return render_template('user.html',
252 | time_done_book=time_done_book[:2],
253 | book_list=book_list,
254 | range_book_count=range_book_count,
255 | range_timedonebook_count=range_timedonebook_count,
256 | session=session)
257 |
258 |
259 | @app.route('/upload', methods=["POST", "GET"])
260 | @login_required
261 | def upload_file():
262 | """上传文件函数"""
263 | session['fileurl'] = 'http://127.0.0.1:5000/static/image/logo.png'
264 | if request.method == 'POST':
265 | file = request.files['file']
266 | if file and allowed_file(file.filename):
267 | filename = secure_filename(file.filename)
268 | file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
269 | session['fileurl'] = 'http://121.0.0.1:5000/static/image/%s' % filename
270 | return redirect(url_for('user', username=current_user.username))
271 | return render_template('upload.html')
272 |
--------------------------------------------------------------------------------
/data.sqlite:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/data.sqlite
--------------------------------------------------------------------------------
/manage.py:
--------------------------------------------------------------------------------
1 | # coding:utf-8
2 | # !/usr/bin/python
3 |
4 | """
5 | manage.py
6 | ~~~~~~~~
7 |
8 | 木犀图书后台管理文件
9 |
10 | 1>服务器启动运行
11 | 2>python shell(Ipython) 配置
12 | 自动加载环境
13 | 数据库迁移
14 | 数据库更新
15 | 3>运行测试
16 | 4>管理界面配置
17 |
18 | 定义的命令:
19 | python manage.py --help 显示帮助
20 | python manage.py runserver: 启动服务器
21 | python manage.py db init: 创建迁移文件夹
22 | python manage.py db migrate -m "" 执行数据库迁移
23 | python manage.py db upgrade 执行数据库更新
24 | """
25 |
26 | import sys
27 | from app import app, db
28 | from app.models import Book, User
29 | from flask.ext.script import Manager, Shell
30 | from flask.ext.migrate import Migrate, MigrateCommand
31 | from flask.ext.admin import Admin
32 | from flask.ext.admin.contrib.sqla import ModelView
33 |
34 |
35 | """编码设置"""
36 | reload(sys)
37 | sys.setdefaultencoding('utf-8')
38 |
39 |
40 | manager = Manager(app)
41 | migrate = Migrate(app, db)
42 | admin = Admin(app, name='MuxiBook')
43 |
44 |
45 | def make_shell_context():
46 | """自动加载环境"""
47 | return dict(
48 | app=app,
49 | db=db,
50 | Book=Book,
51 | User=User
52 | )
53 |
54 |
55 | manager.add_command("shell", Shell(make_context=make_shell_context))
56 | manager.add_command('db', MigrateCommand)
57 | admin.add_view(ModelView(Book, db.session))
58 | admin.add_view(ModelView(User, db.session))
59 |
60 |
61 | @manager.command
62 | def test():
63 | """运行测试"""
64 | import unittest
65 | tests = unittest.TestLoader().discover('test')
66 | unittest.TextTestRunner(verbosity=2).run(tests)
67 |
68 |
69 | if __name__ == '__main__':
70 | app.debug = True
71 | manager.run()
72 |
--------------------------------------------------------------------------------
/migrations/README:
--------------------------------------------------------------------------------
1 | Generic single-database configuration.
--------------------------------------------------------------------------------
/migrations/alembic.ini:
--------------------------------------------------------------------------------
1 | # A generic, single database configuration.
2 |
3 | [alembic]
4 | # template used to generate migration files
5 | # file_template = %%(rev)s_%%(slug)s
6 |
7 | # set to 'true' to run the environment during
8 | # the 'revision' command, regardless of autogenerate
9 | # revision_environment = false
10 |
11 |
12 | # Logging configuration
13 | [loggers]
14 | keys = root,sqlalchemy,alembic
15 |
16 | [handlers]
17 | keys = console
18 |
19 | [formatters]
20 | keys = generic
21 |
22 | [logger_root]
23 | level = WARN
24 | handlers = console
25 | qualname =
26 |
27 | [logger_sqlalchemy]
28 | level = WARN
29 | handlers =
30 | qualname = sqlalchemy.engine
31 |
32 | [logger_alembic]
33 | level = INFO
34 | handlers =
35 | qualname = alembic
36 |
37 | [handler_console]
38 | class = StreamHandler
39 | args = (sys.stderr,)
40 | level = NOTSET
41 | formatter = generic
42 |
43 | [formatter_generic]
44 | format = %(levelname)-5.5s [%(name)s] %(message)s
45 | datefmt = %H:%M:%S
46 |
--------------------------------------------------------------------------------
/migrations/env.py:
--------------------------------------------------------------------------------
1 | from __future__ import with_statement
2 | from alembic import context
3 | from sqlalchemy import engine_from_config, pool
4 | from logging.config import fileConfig
5 |
6 | # this is the Alembic Config object, which provides
7 | # access to the values within the .ini file in use.
8 | config = context.config
9 |
10 | # Interpret the config file for Python logging.
11 | # This line sets up loggers basically.
12 | fileConfig(config.config_file_name)
13 |
14 | # add your model's MetaData object here
15 | # for 'autogenerate' support
16 | # from myapp import mymodel
17 | # target_metadata = mymodel.Base.metadata
18 | from flask import current_app
19 | config.set_main_option('sqlalchemy.url', current_app.config.get('SQLALCHEMY_DATABASE_URI'))
20 | target_metadata = current_app.extensions['migrate'].db.metadata
21 |
22 | # other values from the config, defined by the needs of env.py,
23 | # can be acquired:
24 | # my_important_option = config.get_main_option("my_important_option")
25 | # ... etc.
26 |
27 |
28 | def run_migrations_offline():
29 | """Run migrations in 'offline' mode.
30 |
31 | This configures the context with just a URL
32 | and not an Engine, though an Engine is acceptable
33 | here as well. By skipping the Engine creation
34 | we don't even need a DBAPI to be available.
35 |
36 | Calls to context.execute() here emit the given string to the
37 | script output.
38 |
39 | """
40 | url = config.get_main_option("sqlalchemy.url")
41 | context.configure(url=url)
42 |
43 | with context.begin_transaction():
44 | context.run_migrations()
45 |
46 |
47 | def run_migrations_online():
48 | """Run migrations in 'online' mode.
49 |
50 | In this scenario we need to create an Engine
51 | and associate a connection with the context.
52 |
53 | """
54 | engine = engine_from_config(config.get_section(config.config_ini_section),
55 | prefix='sqlalchemy.',
56 | poolclass=pool.NullPool)
57 |
58 | connection = engine.connect()
59 | context.configure(connection=connection,
60 | target_metadata=target_metadata,
61 | **current_app.extensions['migrate'].configure_args)
62 |
63 | try:
64 | with context.begin_transaction():
65 | context.run_migrations()
66 | finally:
67 | connection.close()
68 |
69 | if context.is_offline_mode():
70 | run_migrations_offline()
71 | else:
72 | run_migrations_online()
73 |
74 |
--------------------------------------------------------------------------------
/migrations/env.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/migrations/env.pyc
--------------------------------------------------------------------------------
/migrations/script.py.mako:
--------------------------------------------------------------------------------
1 | """${message}
2 |
3 | Revision ID: ${up_revision}
4 | Revises: ${down_revision}
5 | Create Date: ${create_date}
6 |
7 | """
8 |
9 | # revision identifiers, used by Alembic.
10 | revision = ${repr(up_revision)}
11 | down_revision = ${repr(down_revision)}
12 |
13 | from alembic import op
14 | import sqlalchemy as sa
15 | ${imports if imports else ""}
16 |
17 | def upgrade():
18 | ${upgrades if upgrades else "pass"}
19 |
20 |
21 | def downgrade():
22 | ${downgrades if downgrades else "pass"}
23 |
--------------------------------------------------------------------------------
/migrations/versions/34333ffb9060_v23.py:
--------------------------------------------------------------------------------
1 | """v23
2 |
3 | Revision ID: 34333ffb9060
4 | Revises: 7e8d57e44be
5 | Create Date: 2015-08-28 22:45:05.199330
6 |
7 | """
8 |
9 | # revision identifiers, used by Alembic.
10 | revision = '34333ffb9060'
11 | down_revision = '7e8d57e44be'
12 |
13 | from alembic import op
14 | import sqlalchemy as sa
15 |
16 |
17 | def upgrade():
18 | ### commands auto generated by Alembic - please adjust! ###
19 | pass
20 | ### end Alembic commands ###
21 |
22 |
23 | def downgrade():
24 | ### commands auto generated by Alembic - please adjust! ###
25 | pass
26 | ### end Alembic commands ###
27 |
--------------------------------------------------------------------------------
/migrations/versions/34333ffb9060_v23.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/migrations/versions/34333ffb9060_v23.pyc
--------------------------------------------------------------------------------
/migrations/versions/7e8d57e44be_v1.py:
--------------------------------------------------------------------------------
1 | """v1
2 |
3 | Revision ID: 7e8d57e44be
4 | Revises: None
5 | Create Date: 2015-08-27 13:34:49.727233
6 |
7 | """
8 |
9 | # revision identifiers, used by Alembic.
10 | revision = '7e8d57e44be'
11 | down_revision = None
12 |
13 | from alembic import op
14 | import sqlalchemy as sa
15 |
16 |
17 | def upgrade():
18 | ### commands auto generated by Alembic - please adjust! ###
19 | op.create_table('users',
20 | sa.Column('id', sa.Integer(), nullable=False),
21 | sa.Column('username', sa.String(length=164), nullable=True),
22 | sa.Column('password_hash', sa.String(length=164), nullable=True),
23 | sa.PrimaryKeyConstraint('id')
24 | )
25 | op.create_table('books',
26 | sa.Column('id', sa.Integer(), nullable=False),
27 | sa.Column('url', sa.String(length=164), nullable=True),
28 | sa.Column('name', sa.Text(), nullable=True),
29 | sa.Column('author', sa.Text(), nullable=True),
30 | sa.Column('tag', sa.String(length=164), nullable=True),
31 | sa.Column('summary', sa.Text(), nullable=True),
32 | sa.Column('image', sa.String(length=164), nullable=True),
33 | sa.Column('user_id', sa.Integer(), nullable=True),
34 | sa.Column('status', sa.Boolean(), nullable=True),
35 | sa.Column('start', sa.String(length=164), nullable=True),
36 | sa.Column('end', sa.String(length=164), nullable=True),
37 | sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
38 | sa.PrimaryKeyConstraint('id')
39 | )
40 | ### end Alembic commands ###
41 |
42 |
43 | def downgrade():
44 | ### commands auto generated by Alembic - please adjust! ###
45 | op.drop_table('books')
46 | op.drop_table('users')
47 | ### end Alembic commands ###
48 |
--------------------------------------------------------------------------------
/migrations/versions/7e8d57e44be_v1.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/migrations/versions/7e8d57e44be_v1.pyc
--------------------------------------------------------------------------------
/requirment.txt:
--------------------------------------------------------------------------------
1 | flask
2 | flask-sqlalchemy
3 | flask-script
4 | flask-login
5 | flask-wtf
6 | flask-migrate
7 | flask-admin
8 | flask-whooshalchemy
9 |
--------------------------------------------------------------------------------
/search.db/Book/MAIN_86jf48sb81rrdczv.seg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/search.db/Book/MAIN_86jf48sb81rrdczv.seg
--------------------------------------------------------------------------------
/search.db/Book/MAIN_WRITELOCK:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/search.db/Book/MAIN_WRITELOCK
--------------------------------------------------------------------------------
/search.db/Book/MAIN_csh9s5peyn8nlqdh.seg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/search.db/Book/MAIN_csh9s5peyn8nlqdh.seg
--------------------------------------------------------------------------------
/search.db/Book/MAIN_geilisqde0ks3i8q.seg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/search.db/Book/MAIN_geilisqde0ks3i8q.seg
--------------------------------------------------------------------------------
/search.db/Book/MAIN_ja9eqfdgzgqfvpyd.seg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/search.db/Book/MAIN_ja9eqfdgzgqfvpyd.seg
--------------------------------------------------------------------------------
/search.db/Book/MAIN_ppqyedz6jly8tqz1.seg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/search.db/Book/MAIN_ppqyedz6jly8tqz1.seg
--------------------------------------------------------------------------------
/search.db/Book/MAIN_vdjw066zrgl6b0e3.seg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/search.db/Book/MAIN_vdjw066zrgl6b0e3.seg
--------------------------------------------------------------------------------
/search.db/Book/MAIN_zka4sbuen3z7bgdm.seg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/search.db/Book/MAIN_zka4sbuen3z7bgdm.seg
--------------------------------------------------------------------------------
/search.db/Book/_MAIN_192.toc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/search.db/Book/_MAIN_192.toc
--------------------------------------------------------------------------------
/search.db/Book/_MAIN_194.toc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Still-not-satisfied-projects/MuxiBookManagement/87080666c86f4f909e2227ca5e80a74b02adca72/search.db/Book/_MAIN_194.toc
--------------------------------------------------------------------------------