圖書管理系統專案(初學者必看的小專案)
圖書管理系統專案
第一天:準備把整個框架順一遍,第一次獨立寫這個算是我人生中第一個java小專案,不清楚多少天能完成,我會堅持把自己的心得寫在這裡,主要是給自己看(不是學文的,文筆很差見諒,爭取把註釋寫詳細點),如果能幫助其他初學者更好了 一起加油!
DriverManager.getConnection(String url,String user,String password)
我之前不太理解 特意查了下API
第一天搭建一個資料庫實現基本功能 (因為前三步都需要連線資料庫,定義一個資料庫連線)
在類中建立一個建構函式初始化資料庫的連線
(PS: 為什麼要建立資料庫,為了初始化資料庫,在後面會經常用的到)
1.建立資料庫 createDatabase()
2.建立表 createTable()
3.建立檔案 addData(String filename)
我標記紅色的請留意
package javastudy;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
public class DBLib {
//因為三個方法都需要連線資料庫
Connection conn; //定義一個變數
Statement st;
public DBLib() throws ClassNotFoundException//定義一個建構函式 初始化資料庫連線
, SQLException
{
Class.forName("com.mysql.jdbc.Driver"); //載入驅動程式
//需要得到三個引數
String url="jdbc:mysql://127.0.0.1:3306?useUnicode=true&characterEncoding=utf-8";//本機ip地址 本機埠 防止資料庫亂碼(若無亂碼無須新增)
String user="root"; //資料庫的名字
String pwd="521125"; //資料庫密碼
conn=(Connection) DriverManager.getConnection(url, user, pwd); //初始化資料庫 拿到三個引數
st=(Statement) conn.createStatement(); //建立一個 Statement 物件來將 SQL 語句傳送到資料庫。
}
public void createDatabase() throws SQLException //建立一個資料庫
{
String sql="drop database if exists Book;"; //判斷資料庫存在刪除
st.executeUpdate(sql);//執行給定 SQL 語句
sql="create database Book;"; //建立表
st.executeUpdate(sql);//執行
}
public void createTable() throws SQLException //建立一個表
{
String sql="use Book;";//使用表
st.executeQuery(sql);//執行
sql="create table BOOKS";
sql+="(";
sql+=" ID int(4) not null primary key auto_increment,";
sql+=" Name varchar(100),";
sql+=" Author varchar(50),";
sql+=" Price decimal,";
sql+="Publisher varchar(100)";
sql+=") ENGINE=InnoDB DEFAULT CHARSET=utf8;";//我額外加的 因為我安裝資料庫未設定UTF-8 出現亂碼
st.executeUpdate(sql);//執行語句
}
public void addData(String filename) throws SQLException//建立一個文件
, IOException
{
String sql="use Book;";//使用表
st.executeUpdate(sql);//執行
FileReader fr=new FileReader(filename); //讀取
BufferedReader br=new BufferedReader(fr); //緩衝區(包裝類)
String line;
sql=" INSERT INTO BOOKS (Name,Author,Price,Publisher) VALUES(?,?,?,?)"; //sql語句
PreparedStatement ps=conn.prepareStatement(sql);
while((line=br.readLine())!=null) //判斷是否讀完
{
String[] values=line.split(","); //以逗號拆分 用一個字串陣列接收
ps.setString(1, values[0]); //欄位從1陣列從0開始
ps.setString(2, values[1]);
ps.setDouble(3, Double.parseDouble(values[2]));//把字串強制 轉換Double
ps.setString(4, values[3]);
st.executeUpdate(sql);//執行
}
br.close(); //關閉資源
}
}
2.建立一個init 初始化測試建立資料庫是否成功
第一個問題:
遇到一個錯誤 建立資料實現,無法向裡面加入資料,顯示程式碼錯誤
解決方法:
由於粗心,和對程式碼的不熟悉浪費了十分鐘去查錯誤,特意去看了API把
1.executeUpdate() 2.executeQuery();
上面錯誤程式碼我沒有修改!複製時需要注意
第二個問題 資料庫在建立時 生成的不是utf-8
解決方法1:
第3個問題 匯入文字出現亂碼
解決方法1:去根目錄找檔案把屬性改成utf-8 C:\Users\Administrator\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\圖書管理專案 (未成功)
解決方案2:去官網找了一篇大佬的資料
jsp用來顯示結果,用來做頁面呈現
邏輯處理用Servlet來做。
jsp:用來顯示結果
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="javastudy.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="pytjon/jquery-1.11.1.js"></script>
<script type="text/javascript">
$(function(){
$("input[type='button']").click(function(data){ //當按鈕被點選
$.post("initDB.jsp",function(data){ //進入initDB。jsp
$("#info").html(data);
});
});
});
</script>
</head>
<body>
<input type="button" value="初始化資料">
<div id="info"></div>
</body>
servlet:處理邏輯,處理業務,
package javastudy;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class InitIt
*/
@WebServlet("/InitIt")
public class InitIt extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public InitIt() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
DBLib lib;
try {
lib = new DBLib();
lib.createDatabase();
lib.createTable();
lib.addData(this.getServletContext().getRealPath("") + "\\data\\data.txt");
response.setCharacterEncoding("utf-8");
PrintWriter out=response.getWriter();
out.print("初始化成功!");
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
Servlet解決亂碼的方法
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
註解配置Servlet
Annotation=註解
web.xml配置servlet的方法
<servlet>
<servlet-name>a</servlet-name>
<servlet-class>javastudy.InitIt</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>a</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
前面的資料庫建立測試通過,資料庫成功搭建
把整個專案步驟寫一下:
JSP網站開發模式二:JSP+JavaBeans+Servlet Model II MVC的思想(Model=模型,View=檢視,Control=控制)
將控制業務邏輯的程式碼寫到Servlet中,講頁面的展現(HTML)和業務邏輯的控制(Java)分離開來。
步驟:1.建立一個JavaBean,它是一個類Book
package javastudy;
public class Book {
int id;
String name;
String author;
float price;
String publisher;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
}
2.建立一類叫做BookDAO ,這是資料訪問層DAO=Data Access Object=資料訪問介面連線資料庫,實現以下方法。
2.1BookDAO()
Connection conn; //定義公共變數
Statement st;
String sql;
PreparedStatement ps;
public BookDAO() throws ClassNotFoundException,SQLException//定義一個建構函式 初始化資料庫連線
{
Class.forName("com.mysql.jdbc.Driver"); //載入驅動程式
//需要得到三個引數
String url="jdbc:mysql://127.0.0.1:3306/book?useUnicode=true&characterEncoding=utf-8";//本機ip地址 本機埠 防止資料庫亂碼
String user="root"; //資料庫的名字
String pwd="521125"; //資料庫密碼
conn=DriverManager.getConnection(url,user,pwd); //初始化資料庫 拿到三個引數
st=conn.createStatement(); //建立一個 Statement 物件來將 SQL 語句傳送到資料庫。
}
2.2 addBook(Book book)
//增加
public int addBook(Book book) throws Exception
{
sql="insert into BOOKS(name,author,price,publisher) values(?,?,?,?)";
ps=conn.prepareStatement(sql);//建立一個 PreparedStatement 物件來將引數化的 SQL 語句傳送到資料庫。
ps.setString(1,book.getName());
ps.setString(2,book.getAuthor());
ps.setDouble(3,book.getPrice());
ps.setString(4,book.getPublisher());
return ps.executeUpdate();
}
2.3 deleteBook(int id)
//刪除
public int deleteBook(int id) throws Exception //通過ID查詢
{
sql="delete from books where id=?";
ps=conn.prepareStatement(sql);
ps.setInt(1, id);
return ps.executeUpdate();
// 在此 PreparedStatement 物件中執行 SQL 語句,該語句必須是一個 SQL 資料操作語言語句,或者是無返回內容的 SQL 語句
}
2.4 ArrayList<Book> getBooks()
//拿到所有 的圖書
public ArrayList<Book> getbooks() throws Exception {
sql="select * from books";
ps=conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
ArrayList<Book> list=new ArrayList<Book>();
while(rs.next()) {
Book book=new Book();
book.setId(rs.getInt(1));
book.setName(rs.getString(2));
book.setAuthor(rs.getString(3));
book.setPrice(rs.getFloat(4));
book.setPublisher(rs.getString(5));
list.add(book);
}
return list;
}
2.5 modifyBook(int id,Book newbook)
//修改一本書
public int modifyBook(int id, Book newbook) throws Exception {
// TODO Auto-generated method stub
sql="update books set name=?,author=?,price=?,publisher=? where id=?";
ps=conn.prepareStatement(sql);
ps.setString(1, newbook.getName());
ps.setString(2, newbook.getAuthor());
ps.setDouble(3, newbook.getPrice());
ps.setString(4, newbook.getPublisher());
ps.setInt(5, id);
return ps.executeUpdate();
}
2.6getBookById(int id)
//通過一本書得到資訊
public Book getBookById(int id) throws SQLException
{
String sql="select * from books where id=?";
ps=conn.prepareStatement(sql);
ps.setInt(1, id);
ResultSet rs=ps.executeQuery();
rs.next();
Book book=new Book();
book.setId(rs.getInt(1));
book.setName(rs.getString(2));
book.setAuthor(rs.getString(3));
book.setPrice(rs.getFloat(4));
book.setPublisher(rs.getString(5));
return book;
}
2.7getBooks(String bookName)
//搜尋圖書
public ArrayList<Book> getBook(String books) throws Exception {
// SELECT * FROM users WHERE username LIKE '%三%'
//sql="select * from books where name=?";
//select * from table_name where id like '83%58193';
//sql:select id,name from tablename where contains( address, '上海' );
/* SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'beijing' )*/
sql="SELECT * FROM books WHERE name LIKE '%?%'";
ps=conn.prepareStatement(sql);
ps.setString(1, books);
ResultSet rs = ps.executeQuery(sql);
ArrayList<Book> list=new ArrayList<Book>();
while(rs.next()) {
Book book=new Book();
book.setId(rs.getInt(1));
book.setName(rs.getString(2));
book.setAuthor(rs.getString(3));
book.setPrice(rs.getFloat(4));
book.setPublisher(rs.getString(5));
list.add(book);
}
return list;
}
搜尋功能待更新
3.做一個jsp頁面,bookList.jsp。
整體給大家看一下:
<input type="hidden" name="id"> 隱藏
booklist.jsp,頁面載入時,列表顯示所有的圖書
3.1【樣式表+Js程式碼】
<script type="text/javascript">
function altRows(id){
if(document.getElementsByTagName){
var table = document.getElementById(id);
var rows = table.getElementsByTagName("tr");
for(i = 0; i < rows.length; i++){
if(i % 2 == 0){
rows[i].className = "evenrowcolor";
}else{
rows[i].className = "oddrowcolor";
}
}
}
}
window.onload=function(){
altRows('gridtable');
}
</script>
<style type="text/css">
table.gridtable {
font-family: verdana,arial,sans-serif;
font-size:11px;
color:#333333;
border-width: 1px;
border-color: #a9c6c9;
border-collapse: collapse;
}
table.gridtable th {
border-width: 1px;
padding: 8px;
border-style: solid;
border-color: #a9c6c9;
}
table.gridtable td {
border-width: 1px;
padding: 8px;
border-style: solid;
border-color: #a9c6c9;
}
.oddrowcolor{
background-color:#d4e3e5;
}
.evenrowcolor{
background-color:#c3dde0;
}
*{margin:0;padding:0;}
body{overflow:hidden;background:url("images/2.jpg");}
</style>
3.2【增】頁面有一個增加圖書按鈕,可以增加圖書
$("#btnAdd").click(function(){
location.href="add.jsp";
});
<embed src="music/4.mp3" width="0.01" height="0.01"></embed>
<form method="post" action="AddIt">
<table class="gridtable" id="gridtable">
<tr><td colspan="2">新增圖書資訊</td></tr>
<tr><td>名稱</td><td><input type="text" name="name" ></td></tr>
<tr><td>作者</td><td><input type="text" name="author" ></td></tr>
<tr><td>價格</td><td><input type="text" name="price" ></td></tr>
<tr><td>出版社</td><td><input type="text" name="publisher"></td></tr>
<tr><td colspan="2"><input type="submit" value="新增圖書資訊"><div id="info"> </div></td></tr>
</table>
</form>
</body>
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
//int id=Integer.parseInt(request.getParameter("id")); //得到ID
String name=request.getParameter("name");
String author=request.getParameter("author");
float price=Float.parseFloat(request.getParameter("price"));
String publisher=request.getParameter("publisher");
Book newbook=new Book();
newbook.name=name;
newbook.author=author;
newbook.price=price;
newbook.publisher=publisher;
BookDAO dao;
try {
dao=new BookDAO();
dao.addBook(newbook);
response.sendRedirect("BookList.jsp");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
3.2【刪】頁面上有一個刪除按鈕,可以刪除圖書
$("#btnDelete").click(function(){
//將被選中的圖書的id收集起來
var ids="";
var i=0;
$("input[type='checkbox'][name='selectit']").each(function(index, element) {
if(index>0)
{
if($(this).prop("checked"))
{
var id= $(this).parent().parent().children()
.eq(0).children().eq(0).val();
ids+=id;
i++;
if(!$(this).is(":last"))
{
ids+=",";
}
}
}
});
var answer=confirm("你確定要刪除選定的這" + i+ "本圖書嗎?");
if(!answer)
{
return;
}
location.href="DeleteIt?ids=" + ids;
});
response.setCharacterEncoding("utf-8");
String ids=request.getParameter("ids");
String [] id=ids.split(",");
try {
BookDAO dao =new BookDAO();
for(int i=0;i<id.length;i++)
{
dao.deleteBook(Integer.parseInt(id[i]));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
response.sendRedirect("BookList.jsp");
//response.getWriter().append("Served at: ").append(request.getContextPath());
}
3.3【改】每本圖書後面有一個修改按鈕,可以修改圖書
$("input[type='button'][name='modifyit']").click(function(){
//獲取id
var id= $(this).parent().parent().children()
.eq(0).children().eq(0).val();
//頁面跳轉
location.href="modify.jsp?id="+id;
});
<body>
<embed src="music/3.mp3" width="0.01" height="0.01"></embed>
<%
int id=Integer.parseInt(request.getParameter("id")); //需要封裝
BookDAO dao=new BookDAO();
Book book=dao.getBookById(id); //得到ID
%>
<form method="post" action="Modify">
<table class="gridtable" id="gridtable" >
<tr><td colspan="2">修改圖書資訊</td></tr>
<tr><td><input type="hidden" name="id" value="<%=book.getId()%>"></td></tr>
<tr><td>名稱</td><td><input type="text" name="name"value="<%=book.getName() %>"></td></tr>
<tr><td>作者</td><td><input type="text" name="author"value="<%=book.getAuthor() %>"></td></tr>
<tr><td>價格</td><td><input type="text" name="price"value="<%=book.getPrice() %>"></td></tr>
<tr><td>出版社</td><td><input type="text" name="publisher"value="<%=book.getPublisher() %>"></td></tr>
<tr><td colspan="2"><input type="submit" value="修改圖書資訊"><div id="info"></div></td></tr>
</table>
</form>
</body>
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
int id=Integer.parseInt(request.getParameter("id")); //得到ID
String name=request.getParameter("name");
String author=request.getParameter("author");
float price=Float.parseFloat(request.getParameter("price"));
String publisher=request.getParameter("publisher");
Book newbook=new Book();
newbook.name=name;
newbook.author=author;
newbook.price=price;
newbook.publisher=publisher;
BookDAO dao;
try {dao=new BookDAO();
dao.modifyBook(id,newbook);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
response.sendRedirect("BookList.jsp");
//response.getWriter().append("Served at: ").append(request.getContextPath());
}
3.4【查】頁面上有一個選中按鈕,可以根據圖書的是否被選中查詢顯示圖書
$("#query").click(function(){
//將被選中的圖書的id收集起來
/* var ids="";
var i=0;
var
$("input[type='checkbox'][name='selectit']").each(function(index, element) {
if(index>0)
{
if($(this).prop("checked"))
{
var id= $(this).parent().parent().children()
.eq(0).children().eq(0).val();
ids+=id;
i++;
if(!$(this).is(":last"))
{
ids+=",";
}
}
}
});
*/
var arr=[];
$("input[type='checkbox']:checked").each(function(){
arr.push(this.value);
})
var json = JSON.stringify(arr);//陣列轉換成json,都在了,陣列和json
alert(json + arr);
var answer=confirm("你確定要查詢選定的這" + arr.length + "本圖書嗎?");
if(!answer)
{
return;
}
location.href="reveal.jsp?ids="+arr;
});
無須處理 只需要判斷選中多少 遍歷出來 沒用到Servlet3.5【搜】頁面上有一個搜尋按鈕,可以根據圖書的名稱和作者,來搜尋並顯示圖書
(待)修改
$("#search").click(function(){
location.href="search.jsp";
});
<body>
<center>
<marquee width="300" direction=left height="50"><center><font color="pink" size="7" face="華文彩雲"><b>圖書資訊</b></font></center></marquee>
<embed src="music/3.mp3" width="0.01" height="0.01"></embed>
<table class="gridtable" id="gridtable" height="400" width="30%">
<%
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String name=request.getParameter("name");
String condition=request.getParameter("condition");
out.print(name);
%>
<%
BookDAO dao=new BookDAO();
ArrayList<Book> list=dao.getbooks();
for(int i=0;i<list.size();i++){
Book book=list.get(i);
%>
<tr>
<td><%=i+1 %><input type="hidden" name="id" value="<%=book.getId()%>"></td>
<td><h3><%=book.getName() %></h3></td>
<td><h3><%=book.getAuthor() %></h3></td>
<td><h3><%=book.getPrice() %></h3></td>
<td><h3><%=book.getPublisher() %></h3></td>
</tr>
<%
}
%>
</table>
</center>
</body>
建立一個BookDAO的類實現資料庫的基本功能 增刪改查,新建個類aaa做測試
package javastudy;
import java.util.ArrayList;
public class aaa {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
BookDAO dao=new BookDAO();
ArrayList<Book> list = dao.getbooks();
for (Book book : list) {
System.out.println(book);
}
dao.getbooks();
}
}
基本框架已經實現,開始寫其功能 可能會遇到很多問題加油!
目前是1.0 等今後有時間升級2.0 有興趣的可以問我要程式碼 專案沒完成就不在這發了 下週一在去完善
通宵把我之前寫的東西重新捋一遍 好累 會的太少 完成2.0 就準備往下學 等以後在此基礎上 升級
看我部落格的同學 如果有興趣的可以和我一起研究 今天通宵把其他功能全部實現,就差最後一步(搜尋還有點小BUG) 加了很多圖片音樂 加了個數字時鐘 我打算以後做一個UI使用者登入 今後學到新的知識再往上加 (本人菜鳥一隻 希望大佬指點一二)
<body>
<center>
<marquee width="300" direction=left height="50"><center><font color="pink" size="7" face="華文彩雲"><b>圖書資訊</b></font></center></marquee>
<embed src="music/3.mp3" width="0.01" height="0.01"></embed>
<table class="gridtable" id="gridtable" height="400" width="30%">
<%
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String name=request.getParameter("name");
//name+="%"+name+"%";
String condition=request.getParameter("condition");
// out.print(name);
BookDAO dao=new BookDAO();
ArrayList<Book> list=dao.serachBook(name);
if(list==null || list.size()==0){
out.print("沒用找到相應的圖書");
}
for(int i=0;i<list.size();i++){
Book book=list.get(i);
%>
<tr>
<td><%=i+1 %><input type="hidden" name="id" value="<%=book.getId()%>"></td>
<td><h3><%=book.getName() %></h3></td>
<td><h3><%=book.getAuthor() %></h3></td>
<td><h3><%=book.getPrice() %></h3></td>
<td><h3><%=book.getPublisher() %></h3></td>
</tr>
<%
}
%>
</table>
</center>
</body>
<body>
<embed src="music/3.mp3" width="0.01" height="0.01"></embed>
<center>
<div class="divMain">
<marquee width="300" direction=left height="50"><center><font color="#0000ff" size="7" face="華文彩雲"><b>跟小劉學java 從入門到精通!</b></font></center></marquee>
<h1 align="center" class="STYLE1">請輸入要查詢的關鍵字</h1>
<form action="seek.jsp" method="post">
<h2><span class="STYLE2"> 請選擇查詢條件</span></h2>
<select name="condition">
<option value ="author">作者</option>
<option value ="name" selected="selected">書名</option>
</select>
<span class="STYLE3">請輸入</span>
<input type="text" name="name" /><br />
<input type="submit" value="提交資訊 " />
</form>
</div>
</center>
</body>
搜尋功能完善。 圖書管理就這麼告一段落! 感謝任老師,範老師的細心指導答疑
在觀看遇到問題的可以聯絡我 我QQ1443509763
全部程式碼都放在我部落格上了,可以去下載完整的專案
相關文章
- 圖書管理系統-專案介紹
- 實驗專案四:圖書管理系統
- 適合ionic初學者的小專案
- 最適合Java基礎練手的Java小專案「圖書管理系統」Java
- 產品開發專案管理初學者指南專案管理
- 專案管理系統中的任務和專案專案管理
- 考勤系統+(小專案)
- java版工程專案管理系統原始碼+系統管理+系統設定+專案管理Java專案管理原始碼
- Django學習筆記《一》圖書管理系統專案掛載到阿里雲Django筆記阿里
- EasyWork專案管理系統專案管理
- 專案風險管理系統有哪些?分享11款主流專案管理系統專案管理
- 給Python初學者的最好練手專案Python
- 傳統專案管理VS敏捷專案管理專案管理敏捷
- 專案微管理35 - 系統
- 微專案:名片管理系統
- 《系統整合專案管理》第九章 專案成本管理專案管理
- 資訊系統專案管理系列之三:專案管理過程專案管理
- 資訊系統專案管理系列之五:專案整體管理專案管理
- 資訊系統專案管理系列之六:專案範圍管理專案管理
- 專案管理--PMBOK 讀書筆記(4)【專案整合管理】專案管理筆記
- Golang初學:新建專案 及 gin web 專案GolangWeb
- 初學者必看!如何學習好Linux系統?Linux
- 什麼是專案管理系統?專案管理
- 鴻仁科研專案管理系統專案管理
- 測試專案管理系統 — TPA專案管理
- 專案管理系統使用指南專案管理
- java版工程專案管理系統原始碼+系統管理+系統設定+專案管理+合同管理+二次開發Java專案管理原始碼
- 系統整合專案管理師和高階專案管理師考試心得專案管理
- 8條專案管理知識庫,小白必看!專案管理
- 2024年最優秀的10款專案管理工具,專案經理必看!專案管理
- [譯] 為 GitHub 專案做出貢獻的初學者指南Github
- 初學docker部署springboot專案DockerSpring Boot
- flask專案之圖書案例Flask
- 企業專案管理系統是何?專案管理
- 圖書管理系統(小程式)
- 傳統ERP管理專案有哪些問題?專案ERP系統哪個好?
- 專案管理小結(如何做好一個百萬級專案甚至千萬級別的專案)專案管理
- 什麼是專案溝通管理? 藉助系統軟體管理專案溝通
- 工程管理系統原始碼-專注專案數字化管理-工程管理原始碼