软件控制管理 ------> 版本控制 ------> 管理产品文件(代码、文档、脚本、设计稿等)的各个历史版本
1990s —> CVS / VSS —> 锁定模式
2000 —> Subversion —> SVN —> 合并模式 —> 中央服务器
Bash —> Linux系统的人机交互环境(壳程序 - 人机接口),命令跟Windows命令行提示符相差很远。
ls - list directory contents —> 列出文件夹下的内容 —> %ls
-l / -a
pwd - print working directory —> 打印当前工作目录 —> %pwd
cd - change directory —> 切换目录
mkdir - make directory —> 创建文件夹
-p —> --parents
touch —> 创建空文件或者修改文件的最后访问时间
clear —> 清除屏幕上的输出
cat —> 查看文件的内容
-n —> 给每一行添加行号
git init —> 将一个普通的文件夹变成版本控制的仓库
git status —> 查看状态(工作区、暂存区、本地仓库是否同步)
git add —> 将文件从工作区同步到暂存区
git config --global user.email “[email protected]”
git config --global user.name “jackfrued”
git commit -m “…” —> 提交,将暂存区同步到本地仓库
git log —> 查看提交日志(历史)
git restore —> 用暂存区的内容恢复工作区
git reset —> 重置版本
git reflog —> 查看到所有的提交日志(历史和未来)
GitHub:全球最大的代码托管平台(相当于是Git服务器,可以同步文件)
国内:
git remote add origin 服务器仓库地址 —> 添加远端仓库(服务器)
git remote -v —> 查看远端仓库(服务器)
git remote rmeove origin —> 删除远端仓库
git push -u origin master —> 将本地的master分支上推到服务器
git clone 仓库地址 —> 克隆(下载)项目
git pull —> 从远端仓库(服务器)下拉文件
工作成果有冲突如何解决???
1. git pull ---> 将服务器上的代码拿下来 ---> CONFLICT ---> merge conflict
2. git diff ---> 查看有冲突的代码
3. 当面协商解决冲突代码,重新本地提交(git add / git commit)
4. git push ---> 解决冲突以后重新push到服务器
git 基本操作简易
参考链接
桌面右键–> Git Bush Here
–> ssh-keygen -t rsa -C “[email protected]” 命令。连续3次回车
–> cd ~/.ssh
–> ls
–> cat id_rsa.pub
–> 复制公钥到这里
测试是否成功:
git clone [email protected]:four-wings-act-recklessly/heiheihei.git
弹出:Are you sure you want to continue connecting (yes/no/[fingerprint])?
选择 yes
如果没有让输入密码即为成功
从版本控制系统获取代码
点击上图按钮,粘贴项目 ssh 路径(做过免密登录的前提条件下)到 git 选项框 开始clone;或者也可以先右键 -->Git Bush here --> git clone ‘ssh路径’ 先把工程弄下来再放到pycharm中
先创建虚拟环境:注意虚拟环境路径最好是: ./工程名/venv
.gitignore文件
.idea
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
.python-version
# celery beat schedule file
celerybeat-schedule
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
虚拟环境创建好之后导入库
pip install flask
pip install pymysql
pip install freeze
pip freeze > requirements.txt
注意后面导入新库的时候都需要执行这句:pip freeze > requirements.txt
pip install requests
pip freeze > requirements.txt
在服务器端把动态页面生成出来,然后把渲染好的HTML页面给到浏览器。
后端渲染的方式在服务器并发访问量较大的时候,会增加服务器的开销,导致服务器效率低下,响应较慢。
from flask import Flask
app = Flask(__name__)
@app.route('/test') #可以写成 @app.route('/') 我这里不这样写,因为这部分笔记是后来补充的,不能和已经有的@app.route('/')一样
def show_index():
books = [
"Python1",
"Python2",
"Python3",
"Python4",
"Python5",
"Python6"
]
content = 'hello ,world!
'
content += '
'
content += f'今天推荐阅读的书籍是:
'
content += ''
for book in books:
content += f'《{book}》 '
content += ''
return content
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000, debug=True)
前端渲染︰不在服务器端渲染页面,服务器只负责提供数据,渲染页面的操作交给浏览器中的JavaScript来完成。
前端渲染也称为前后端分离的开发,后端开发者不需要有前端知识,因为他们只需要把提供数据的服务做好;同理,前端开发者也不需要有任何后端的知识,他们只需要调用后端提供的数据接口获取数据,
然后通过JavaScript将动态内容渲染到页面上。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页title>
head>
<body>
<h1>
<ul>
<li>{
{ jitang }}li>
ul>
h1>
<hr>
<p>今天推荐阅读的书籍:p>
<ul>
<li>{
{ book }}li>
ul>
<img src="/static/images/guido.jpg" width="150">
body>
html>
静态页面运行时,不能直接点运行
http://127.0.0.1:8000/static/html/index.html
改进:main.py 加入重定向之后可以直接访问了
import random
import requests
from flask import Flask, redirect
app = Flask(__name__)
# http://127.0.0.1:8000/
@app.route('/')
def show_index():
# 请求首页,重定向到 /static/html/index.html
return redirect('/static/html/index.html')
if __name__ == '__main__':
app.run(port=8000, debug=True)
下一步前端请求自己写的接口,申请数据渲染
main.py
import random
import requests
from flask import Flask, redirect
app = Flask(__name__)
# http://127.0.0.1:8000/
@app.route('/')
def show_index():
# 请求首页,重定向到 /static/html/index.html
return redirect('/static/html/index.html')
@app.route('/api/recs')
def get_recommendations():
books = [
"Python1",
"Python2",
"Python3",
"Python4",
"Python5",
"Python6"
]
n = random.randint(2, 5)
selected_books = random.sample(books, n)
resp = requests.get('http://api.tianapi.com/txapi/dujitang/index?key=d116541b64b5ec7f0b93996ec485a7c3')
jitang = '今天没有毒鸡汤'
if resp.status_code == 200:
result = resp.json()
if result['code'] == 200:
jitang = result['newslist'][0]['content']
return {
'books':selected_books,'jitang':jitang}
if __name__ == '__main__':
app.run(port=8000, debug=True)
index.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页title>
head>
<body>
<div id="app">
<h3>{
{ jitang }}h3>
<hr>
<p>今天推荐阅读的书籍:p>
<ul>
<li v-for="book in books">{
{ book }}li>
ul>
div>
<img src="/static/images/guido.jpg" width="150">
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js">script>
<script>
let app = new Vue({
el:'#app',
data:{
jitang:'',
books:[]
},
created:function(){
//Promise 对象
fetch('/api/recs')
.then(resp => resp.json())
.then(json=>{
this.jitang = json.jitang
this.books = json.books
})
}
})
script>
body>
html>
打开浏览器刷新
http://127.0.0.1:8000/static/html/index.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页title>
<style>
#main {
width: 400px;
height: 300px;
border: 1px solid black;
}
style>
head>
<body>
<div id="app">
<h3>{
{ jitang }}h3>
<hr>
<p>今天推荐阅读的书籍:p>
<ul>
<li v-for="book in books">{
{ book }}li>
ul>
div>
<div id="main">div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js">script>
<script>
let app = new Vue({
el:'#app',
data:{
jitang:'',
books:[]
},
created:function(){
//Promise 对象
fetch('/api/recs')
.then(resp => resp.json())
.then(json=>{
this.jitang = json.jitang
this.books = json.books
})
}
})
script>
<script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.1.0/echarts.min.js">script>
<script>
//初始化绘图使用的div标签
let myChart =echarts.init(document.querySelector('#main'))
//
let option = {
//图例
legend: {
data: ['A组销量','B组销量']
},
//x
xAxis: {
data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
},
//y
yAxis: {
},
//数据系列
series: [{
name: 'A组销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
},
{
name: 'B组销量',
type: 'bar',
data: [5, 23, 26, 19, 8, 20]
}
]
}
myChart.setOption(option)
script>
body>
html>
main.py
import random
import requests
from flask import Flask, redirect
app = Flask(__name__)
@app.route('/')
def show_index():
# 请求首页,重定向到/static/html/index.html
return redirect('/static/html/index.html')
@app.route('/api/sales')
def get_sales_data():
group_a = [random.randint(5, 50) for _ in range(6)]
group_b = [random.randint(5, 50) for _ in range(6)]
return {
'legend': ['销售A组', '销售B组'],
'xData': ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子'],
'yData': [group_a, group_b]
}
@app.route('/api/recs')
def get_recommendations():
books = [
'Python从入门到实践',
'MySQL必知必会',
'数据思维',
'人工智能导论',
'PyTorch实战',
'利用Python做数据分析'
]
n = random.randint(2, 5)
selected_books = random.sample(books, n)
# 通过request请求三方服务获取毒鸡汤数据
resp = requests.get('http://api.tianapi.com/txapi/dujitang/index?key=d116541b64b5ec7f0b93996ec485a7c3')
jitang = '今天没有毒鸡汤'
if resp.status_code == 200:
result = resp.json()
if result['code'] == 200:
jitang = result['newslist'][0]['content']
return {
'books': selected_books, 'jitang': jitang}
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000, debug=True)
index.py
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页title>
<style>
#main {
width: 400px;
height: 300px;
border: 1px solid black;
}
style>
head>
<body>
<div id="app">
<h3>{
{ jitang }}h3>
<hr>
<p>今天推荐阅读的书籍是:p>
<ul>
<li v-for="book in books">{
{ book }}li>
ul>
div>
<div id="main">div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js">script>
<script>
// JavaScript
let app = new Vue({
el: '#app',
data: {
jitang: '',
books: []
},
created() {
fetch('/api/recs')
.then(resp => resp.json())
.then(json => {
this.jitang = json.jitang
this.books = json.books
})
}
})
script>
<script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.1.0/echarts.min.js">script>
<script>
// 初始化绘图使用的div标签(初始化绘图用的画布对象)
let myChart = echarts.init(document.querySelector('#main'))
// 创建图表选项对象(绘图时需要使用的数组)
let option = {
// 图例
legend: {
data: []
},
// x轴
xAxis: {
data: []
},
// y轴
yAxis: {
},
// 数据系列
series: [
{
name: '',
type: 'bar',
data: []
},
{
name: '',
type: 'bar',
data: []
}
]
}
function refreshData() {
// 发起获取数据的异步请求
fetch('/api/sales')
.then(resp => resp.json())
.then(json => {
option.legend.data = json.legend
option.xAxis.data = json.xData
for (let i = 0; i < option.series.length; ++i) {
option.series[i].name = json.legend[i]
option.series[i].data = json.yData[i]
}
// 数据准备就绪,将数据渲染到echarts图表上
myChart.setOption(option)
// 5秒钟以后再次调用这个函数
setTimeout(refreshData, 5000)
})
}
refreshData()
script>
body>
html>
数据接口:
http://127.0.0.1:8000/api/sales
在vscode 上编辑代码
找到改文件,拖到VS code 中
之后就可以编辑了,pycham可以同步
作业:
1.连数据库画折线图
2,数据库里建表,所有内容均从数据库里读出来,销售组,类别,销售信息