c# mysql 管理员权限_C# winform 权限管理系统完整源码下载(含数据库)
【實(shí)例簡(jiǎn)介】
【實(shí)例截圖】
【核心代碼】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using IBLL = CodingMouse.CMCSharpSDK.IBLL;
using BLLFactory = CodingMouse.CMCSharpSDK.BLLFactory;
using Model = CodingMouse.CMCSharpSDK.Model;
using Common = CodingMouse.CMCSharpSDK.UI.Common;
namespace CodingMouse.CMCSharpSDK.UI.Forms
{
///
/// 權(quán)限管理界面
///
public partial class frmRightsManager : Form
{
#region Private Members
MenuStrip _msMain = null;
///
/// 主界面被管理的菜單對(duì)象
///
internal MenuStrip MsMain
{
get { return _msMain; }
set { _msMain = value; }
}
frmMain _frmMain = null;
///
/// 主界面對(duì)象
///
public frmMain FrmMain
{
get { return _frmMain; }
set { _frmMain = value; }
}
///
/// 權(quán)限菜單界面管理類對(duì)象
///
Common.RightsMenuUIManager _rmuManager = null;
///
/// 權(quán)限菜單數(shù)據(jù)管理類對(duì)象
///
Common.RightsMenuDataManager _rmdManager = null;
Model.Operator _currentOperator = null;
///
/// 保存當(dāng)前登錄的操作員對(duì)象
///
internal Model.Operator CurrentOperator
{
get { return _currentOperator; }
set { _currentOperator = value; }
}
Dictionary _operatorCollection = null;
///
/// 當(dāng)前加載的所有操作員實(shí)體集合
///
internal Dictionary OperatorCollection
{
get { return _operatorCollection; }
set { _operatorCollection = value; }
}
bool _isRelatingChooseCells = true;
///
/// 是否啟用數(shù)據(jù)視圖關(guān)聯(lián)選擇
///
internal bool IsRelatingChooseCells
{
get { return _isRelatingChooseCells; }
set { _isRelatingChooseCells = value; }
}
///
/// 是否啟用樹視圖子節(jié)點(diǎn)關(guān)聯(lián)選擇
///
bool _isCheckedChildTreeNode = true;
///
/// 保存上一次被選中的操作員列表行
///
DataGridViewRow _dgvOldSelectedRow = null;
///
/// 權(quán)限視圖可勾選狀態(tài)
///
bool _rightsViewIsChecked = false;
#endregion
#region Public Methods
///
/// 帶參構(gòu)造
///
/// 主界面待管理的菜單對(duì)象
/// 主界面對(duì)象
/// 當(dāng)前登錄操作員對(duì)象
public frmRightsManager(MenuStrip msMain, frmMain frmMain, Model.Operator currentOperator)
{
// 構(gòu)建設(shè)計(jì)器控件
InitializeComponent();
// 保存菜單對(duì)象
MsMain = msMain;
// 保存主界面對(duì)象
FrmMain = frmMain;
// 保存當(dāng)前登錄操作員對(duì)象
CurrentOperator = currentOperator;
// 創(chuàng)建權(quán)限菜單界面管理類實(shí)例
_rmuManager = new Common.RightsMenuUIManager();
// 賦予要操作的對(duì)象
_rmuManager.DgvOperatorList = this.dgvOperatorList;
_rmuManager.DgvRightsList = this.dgvRightsList;
_rmuManager.TvRightsView = this.tvRightsView;
_rmuManager.MsMain = _msMain;
_rmuManager.RightsManagerUI = this;
// 創(chuàng)建權(quán)限菜單數(shù)據(jù)管理類實(shí)例
_rmdManager = new Common.RightsMenuDataManager();
}
#endregion
#region Event Handlers
///
/// 窗體初始化事件
///
///
///
private void frmRightsManager_Load(object sender, EventArgs e)
{
// 加載操作員列表
_rmuManager.LoadOperatorList();
// 默認(rèn)為分組模式
tsbtnRightsMode.Text = tsmiGroupMode.Text;
}
///
/// 樹形視圖右鍵菜單公共點(diǎn)擊事件
///
///
///
private void tsmiTreeViewContentMenuItem_Click(object sender, EventArgs e)
{
// 保存當(dāng)前菜單項(xiàng)激發(fā)者
ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
// 勾選所有結(jié)點(diǎn)上的復(fù)選框
if (menuItem == tsmiSelectAll)
{
foreach (TreeNode treeNode in this.tvRightsView.Nodes)
{
treeNode.Checked = true;
// 禁用樹視圖重繪
tvRightsView.BeginUpdate();
// 選中/取消樹節(jié)點(diǎn)及其子節(jié)點(diǎn)勾選狀態(tài)
_rmuManager.CheckOrUnCheckTreeNode(treeNode);
// 啟用樹視圖重繪
tvRightsView.EndUpdate();
}
}
// 取消所有結(jié)點(diǎn)上的復(fù)選
if (menuItem == tsmiCancelAll)
{
foreach (TreeNode treeNode in this.tvRightsView.Nodes)
{
treeNode.Checked = false;
// 禁用樹視圖重繪
tvRightsView.BeginUpdate();
// 選中/取消樹節(jié)點(diǎn)及其子節(jié)點(diǎn)勾選狀態(tài)
_rmuManager.CheckOrUnCheckTreeNode(treeNode);
// 啟用樹視圖重繪
tvRightsView.EndUpdate();
}
}
// 重新加載賬戶權(quán)限結(jié)構(gòu)樹
if (menuItem == tsmiReload)
{
// 如果有選中行
if (dgvOperatorList.SelectedCells.Count > 0)
{
// 保存當(dāng)前選中行的操作員名稱
string operatorName = _dgvOldSelectedRow.Cells["ModelName"].Value.ToString().Trim();
// 指定當(dāng)前編輯的操作員對(duì)象
Model.Operator editOperator = _operatorCollection[operatorName];
// 將數(shù)據(jù)綁定加載到樹形視圖
_rmuManager.BindDataToTreeView(editOperator.RightsCollection);
}
}
// 將 TreeView 樹結(jié)點(diǎn)全部展開
if (menuItem == tsmiExpandAll)
{
this.tvRightsView.ExpandAll();
}
// 將 TreeView 樹結(jié)點(diǎn)全部折疊
if (menuItem == tsmiCollapseAll)
{
this.tvRightsView.CollapseAll();
}
}
///
/// [保存更改]工具欄按鈕點(diǎn)擊事件
///
///
///
private void tsbtnSaveAllChanged_Click(object sender, EventArgs e)
{
// 提交并結(jié)束數(shù)據(jù)視圖的單元格編輯
dgvRightsList.EndEdit();
dgvOperatorList.EndEdit();
// 如果有選中單元格
if (dgvOperatorList.SelectedCells.Count > 0)
{
try
{
// 創(chuàng)建業(yè)務(wù)邏輯層工廠類實(shí)例
BLLFactory.BLLFactory bllFactory = new BLLFactory.BLLFactory();
// 調(diào)用工廠類實(shí)例方法創(chuàng)建操作員管理類實(shí)例
IBLL.IOperatorManager operatorManager = bllFactory.BuildOperatorManager();
// 保存所有操作員權(quán)限信息
foreach (Model.Operator tmpOperator in _operatorCollection.Values)
{
// 保存當(dāng)前操作員所做的修改
operatorManager.ModifyOperator(tmpOperator);
}
// 給出用戶操作提示
MessageBox.Show(
"權(quán)限設(shè)置保存成功!",
"保存提示",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show(
ex.Message,
"保存失敗",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
}
///
/// [刷新權(quán)限]工具欄按鈕點(diǎn)擊事件
///
///
///
private void tsbtnRefreshRightsList_Click(object sender, EventArgs e)
{
// 如果是非超級(jí)管理員
if (_currentOperator.Id != 0)
{
// 將數(shù)據(jù)綁定顯示到數(shù)據(jù)視圖
_rmuManager.BindDataToDataGridView(_currentOperator.RightsCollection);
// 將數(shù)據(jù)綁定加載到樹形視圖
_rmuManager.BindDataToTreeView(_currentOperator.RightsCollection);
}
}
///
/// [刷新用戶]工具欄按鈕點(diǎn)擊事件
///
///
///
private void tsbtnRefreshOperator_Click(object sender, EventArgs e)
{
// 將數(shù)據(jù)綁定顯示到數(shù)據(jù)視圖
_rmuManager.BindOperatorInfoToDataGridView(_operatorCollection);
}
///
/// [關(guān)閉窗口]工具欄按鈕點(diǎn)擊事件
///
///
///
private void tsbtnCloseWindow_Click(object sender, EventArgs e)
{
this.Close();
}
///
/// 權(quán)限列表數(shù)據(jù)視圖單元格啟動(dòng)編輯模式事件
///
///
///
private void dgvRightsList_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
// 如果是權(quán)限狀態(tài)列且節(jié)點(diǎn)不可選則取消勾選事件
if (dgvRightsList.Columns[e.ColumnIndex].Name == "RightsState" && !_rightsViewIsChecked)
e.Cancel = true;
}
///
/// 權(quán)限列表數(shù)據(jù)視圖單元格停止編輯模式事件
///
///
///
private void dgvRightsList_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
// 如果包含操作員信息
if (dgvOperatorList.SelectedCells.Count > 0)
{
// 保存當(dāng)前選中行的操作員名稱
string operatorName = dgvOperatorList.Rows[dgvOperatorList.SelectedCells[0].RowIndex].Cells["ModelName"].Value.ToString().Trim();
// 指定當(dāng)前編輯的操作員對(duì)象
Model.Operator editOperator = _operatorCollection[operatorName];
// 找到當(dāng)前編輯的權(quán)限項(xiàng)
Model.Rights currentEditRights = editOperator.RightsCollection[dgvRightsList.Rows[e.RowIndex].Cells["ModelName"].Value.ToString().Trim()];
// 保存當(dāng)前修改的權(quán)限標(biāo)題和權(quán)限狀態(tài)到權(quán)限集合
currentEditRights.RightsCaption = Convert.ToString(dgvRightsList.Rows[e.RowIndex].Cells["RightsCaption"].Value);
currentEditRights.RightsState = Convert.ToBoolean(dgvRightsList.Rows[e.RowIndex].Cells["RightsState"].Value);
// 將數(shù)據(jù)綁定加載到樹形視圖
_rmuManager.BindDataToTreeView(editOperator.RightsCollection);
}
}
///
/// 操作員列表數(shù)據(jù)視圖單元格停止編輯模式事件
///
///
///
private void dgvOperatorList_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
// 如果包含操作員信息
if (dgvOperatorList.SelectedCells.Count > 0)
{
// 找到當(dāng)前編輯的操作員項(xiàng)
Model.Operator currentEidtOperator = _operatorCollection[dgvOperatorList.Rows[e.RowIndex].Cells["ModelName"].Value.ToString().Trim()];
// 保存當(dāng)前修改的操作員密碼和狀態(tài)到操作員集合
currentEidtOperator.Password = Convert.ToString(dgvOperatorList.Rows[e.RowIndex].Cells["Password"].Value);
currentEidtOperator.State = Convert.ToBoolean(dgvOperatorList.Rows[e.RowIndex].Cells["State"].Value);
}
}
///
/// 權(quán)限列表數(shù)據(jù)視圖所選內(nèi)容更改事件
///
///
///
private void dgvRightsList_SelectionChanged(object sender, EventArgs e)
{
// 僅在有選中單元格且啟用關(guān)聯(lián)選擇時(shí)才執(zhí)行操作
if (dgvRightsList.SelectedCells.Count > 0 && IsRelatingChooseCells)
{
// 遍歷所有選中單元格選中所有同級(jí)權(quán)限項(xiàng)及父項(xiàng)
for (int i = 0; i < dgvRightsList.SelectedCells.Count; i )
{
// 且僅在選中[內(nèi)部名稱]和[父級(jí)權(quán)限]單元格時(shí)才執(zhí)行操作
if (dgvRightsList.SelectedCells[i].OwningColumn.Name == "ModelName"
|| dgvRightsList.SelectedCells[i].OwningColumn.Name == "ParentLevelRightsName")
{
// 同時(shí)選中與選中單元格內(nèi)容相同的所有[內(nèi)部名稱]和[父級(jí)權(quán)限]單元格
foreach (DataGridViewRow dgvRow in this.dgvRightsList.Rows)
{
if (dgvRow.Cells["ModelName"].Value == dgvRightsList.SelectedCells[i].Value)
dgvRow.Cells["ModelName"].Selected = true;
else if (dgvRow.Cells["ParentLevelRightsName"].Value == dgvRightsList.SelectedCells[i].Value)
dgvRow.Cells["ParentLevelRightsName"].Selected = true;
}
}
}
}
}
///
/// 操作員列表數(shù)據(jù)視圖所選內(nèi)容更改事件
///
///
///
private void dgvOperatorList_SelectionChanged(object sender, EventArgs e)
{
if (dgvOperatorList.SelectedCells.Count > 0
&& dgvOperatorList.Rows[dgvOperatorList.SelectedCells[0].RowIndex] != _dgvOldSelectedRow)
{
// 保存當(dāng)前選中的行
_dgvOldSelectedRow = dgvOperatorList.Rows[dgvOperatorList.SelectedCells[0].RowIndex];
// 保存當(dāng)前選中行的操作員名稱
string operatorName = _dgvOldSelectedRow.Cells["ModelName"].Value.ToString().Trim();
// 指定當(dāng)前編輯的操作員對(duì)象
Model.Operator editOperator = _operatorCollection[operatorName];
// 將數(shù)據(jù)綁定顯示到數(shù)據(jù)視圖
_rmuManager.BindDataToDataGridView(editOperator.RightsCollection);
// 將數(shù)據(jù)綁定加載到樹形視圖
_rmuManager.BindDataToTreeView(editOperator.RightsCollection);
}
}
///
/// [權(quán)限視圖]節(jié)點(diǎn)復(fù)選前事件
///
///
///
private void tvRightsView_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
// 如果節(jié)點(diǎn)不可選則取消勾選事件
if (!_rightsViewIsChecked)
e.Cancel = true;
}
///
/// 權(quán)限樹形視圖復(fù)選框狀態(tài)更改事件
///
///
///
private void tvRightsView_AfterCheck(object sender, TreeViewEventArgs e)
{
// 如果已經(jīng)啟用子節(jié)點(diǎn)關(guān)聯(lián)選擇
if (_isCheckedChildTreeNode)
{
// 禁用樹視圖重繪
tvRightsView.BeginUpdate();
// 禁用子節(jié)點(diǎn)關(guān)聯(lián)選擇
_isCheckedChildTreeNode = false;
// 選中/取消樹節(jié)點(diǎn)及其子節(jié)點(diǎn)勾選狀態(tài)
_rmuManager.CheckOrUnCheckTreeNode(e.Node);
// 啟用子節(jié)點(diǎn)關(guān)聯(lián)選擇
_isCheckedChildTreeNode = true;
// 啟用樹視圖重繪
tvRightsView.EndUpdate();
if (dgvOperatorList.SelectedCells.Count > 0)
{
// 保存當(dāng)前選中行的操作員名稱
string operatorName = dgvOperatorList.Rows[dgvOperatorList.SelectedCells[0].RowIndex].Cells["ModelName"].Value.ToString().Trim();
// 將數(shù)據(jù)綁定顯示到數(shù)據(jù)視圖
_rmuManager.BindDataToDataGridView(_operatorCollection[operatorName].RightsCollection);
}
}
}
///
/// 權(quán)限樹形視圖選定內(nèi)容更改事件
///
///
///
private void tvRightsView_AfterSelect(object sender, TreeViewEventArgs e)
{
// 禁用關(guān)聯(lián)選擇
_isRelatingChooseCells = false;
// 清除所有單元格選擇
dgvRightsList.ClearSelection();
// 啟用關(guān)聯(lián)選擇
_isRelatingChooseCells = true;
// 同步數(shù)據(jù)視圖對(duì)應(yīng)項(xiàng)選擇
foreach (DataGridViewRow dgvRow in this.dgvRightsList.Rows)
{
if (dgvRow.Cells["ModelName"].Value.ToString().Trim() == e.Node.Tag.ToString().Trim())
dgvRow.Cells["ModelName"].Selected = true;
}
}
///
/// 用戶編輯權(quán)限樹形視圖節(jié)點(diǎn)文本后事件
///
///
///
private void tvRightsView_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
// 保存當(dāng)前選中行的操作員名稱
string operatorName = dgvOperatorList.Rows[dgvOperatorList.SelectedCells[0].RowIndex].Cells["ModelName"].Value.ToString().Trim();
// 同步修改權(quán)限集合
_operatorCollection[operatorName].RightsCollection[e.Node.Tag.ToString()].RightsCaption = e.Label;
// 將數(shù)據(jù)綁定顯示到數(shù)據(jù)視圖
_rmuManager.BindDataToDataGridView(_operatorCollection[operatorName].RightsCollection);
}
///
/// 窗體指定關(guān)閉原因后且已關(guān)閉事件
///
///
///
private void frmRightsManager_FormClosed(object sender, FormClosedEventArgs e)
{
// 重新加載權(quán)限菜單
_rmdManager.LoadMenuRightsItem(_msMain, _currentOperator.RightsCollection);
}
///
/// [添加用戶]工具欄按鈕點(diǎn)擊事件
///
///
///
private void tsbtnAddOperator_Click(object sender, EventArgs e)
{
frmOperatorManager frmAddOperator = new frmOperatorManager(_currentOperator, _msMain, false);
frmAddOperator.ShowInTaskbar = false;
frmAddOperator.ShowDialog();
// 重新加載操作員列表
_rmuManager.LoadOperatorList();
// 選中最末項(xiàng)并使其滾動(dòng)保持可見
if (dgvOperatorList.Rows.Count > 0)
{
dgvOperatorList.Rows[dgvOperatorList.Rows.Count - 1].Selected = true;
dgvOperatorList.FirstDisplayedScrollingRowIndex = dgvOperatorList.Rows.Count - 1;
}
}
///
/// [刪除用戶]工具欄按鈕點(diǎn)擊事件
///
///
///
private void tsbtnDeleteOperator_Click(object sender, EventArgs e)
{
// 如果有選中單元格
if (dgvOperatorList.SelectedCells.Count > 0)
{
try
{
// 獲取當(dāng)前要?jiǎng)h除的操作員 ID
int operatorId = Convert.ToInt32(dgvOperatorList.SelectedCells[0].OwningRow.Cells["Id"].Value);
// 獲取當(dāng)前要?jiǎng)h除的操作員名稱
string operatorName = Convert.ToString(dgvOperatorList.SelectedCells[0].OwningRow.Cells["ModelName"].Value);
DialogResult result;
result = MessageBox.Show(
string.Format("確實(shí)要?jiǎng)h除操作員 [{0}] 的所有(包括權(quán)限關(guān)系)信息嗎?", operatorName),
"刪除提示",
MessageBoxButtons.OKCancel,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button2);
if (result == DialogResult.Cancel)
return;
// 創(chuàng)建工廠類
BLLFactory.BLLFactory bllFactory = new BLLFactory.BLLFactory();
// 刪除權(quán)限關(guān)系信息
IBLL.IRightsRelationManager rightsRelationManager = bllFactory.BuildRightsRelationManager();
if (rightsRelationManager.GetRightsRelationByOperatorId(operatorId).Count > 0)
{
if (!rightsRelationManager.DeleteRightsRelationByOperatorId(operatorId))
{
MessageBox.Show(
string.Format("未能刪除操作員 [{0}] 的權(quán)限關(guān)系信息!", operatorName),
"刪除失敗",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
return;
}
}
// 刪除操作員信息
IBLL.IOperatorManager operatorManager = bllFactory.BuildOperatorManager();
if (!operatorManager.DeleteOperatorByID(operatorId))
{
MessageBox.Show(
string.Format("未能刪除操作員 [{0}] 的基本信息!", operatorName),
"刪除失敗",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
return;
}
// 重新加載操作員列表
_rmuManager.LoadOperatorList();
}
catch (Exception ex)
{
MessageBox.Show(
ex.Message,
"刪除失敗",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
// 如果操作員信息數(shù)量為零
if (_operatorCollection.Count == 0)
{
// 清空權(quán)限列表、操作員列表和權(quán)限視圖
dgvOperatorList.Rows.Clear();
dgvRightsList.Rows.Clear();
tvRightsView.Nodes.Clear();
}
}
///
/// [分組管理]工具欄按鈕點(diǎn)擊事件
///
///
///
private void tsbtnRightsGroupManager_Click(object sender, EventArgs e)
{
frmRightsGroupManager frmRightsGroupManager = new frmRightsGroupManager(this, this.FrmMain);
frmRightsGroupManager.ShowInTaskbar = false;
frmRightsGroupManager.ShowDialog();
// 加載操作員列表
_rmuManager.LoadOperatorList();
// 刷新數(shù)據(jù)顯示到數(shù)據(jù)視圖
_rmuManager.BindOperatorInfoToDataGridView(_operatorCollection);
}
///
/// [權(quán)限列表]單元格驗(yàn)證事件
///
///
///
private void dgvRightsList_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (dgvRightsList.Columns[e.ColumnIndex].Name == "RightsCaption")
{
if (e.FormattedValue.ToString().Trim() == String.Empty)
{
dgvRightsList.Rows[e.RowIndex].ErrorText =
"權(quán)限標(biāo)題不允許為空字符(空格)!";
MessageBox.Show(
dgvRightsList.Rows[e.RowIndex].ErrorText,
"編輯提示",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
e.Cancel = true;
}
}
}
///
/// [操作員列表]單元格驗(yàn)證事件
///
///
///
private void dgvOperatorList_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (dgvOperatorList.Columns[e.ColumnIndex].Name == "Password")
{
if (e.FormattedValue.ToString().Trim().Length < 6)
{
dgvOperatorList.Rows[e.RowIndex].ErrorText =
"用戶密碼長(zhǎng)度不能小于六位!";
MessageBox.Show(
dgvOperatorList.Rows[e.RowIndex].ErrorText,
"編輯提示",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
e.Cancel = true;
}
}
}
///
/// [分組模式]/[用戶模式]工具欄下拉菜單項(xiàng)點(diǎn)擊事件
///
///
///
private void tsmiRightsMode_Click(object sender, EventArgs e)
{
// 勾選點(diǎn)擊菜單項(xiàng)
(sender as ToolStripMenuItem).Checked = true;
// 提交并結(jié)束對(duì)當(dāng)前單元格的編輯
dgvRightsList.EndEdit();
if ((sender as ToolStripMenuItem).Name == tsmiGroupMode.Name)
{
tsmiOperatorMode.Checked = false;
_rightsViewIsChecked = false;
tsbtnRightsGroupManager.Visible = true;
tsbtnRightsMode.Text = tsmiGroupMode.Text;
tvRightsView.ContextMenuStrip = null;
}
if ((sender as ToolStripMenuItem).Name == tsmiOperatorMode.Name)
{
tsmiGroupMode.Checked = false;
_rightsViewIsChecked = true;
tsbtnRightsGroupManager.Visible = false;
tsbtnRightsMode.Text = tsmiOperatorMode.Text;
tvRightsView.ContextMenuStrip = this.cmsRightsTreeView;
}
}
///
/// [權(quán)限模式]工具欄按鈕點(diǎn)擊事件
///
///
///
private void tsbtnRightsMode_ButtonClick(object sender, EventArgs e)
{
// 下拉彈出菜單選項(xiàng)
tsbtnRightsMode.ShowDropDown();
}
#endregion
}
}
總結(jié)
以上是生活随笔為你收集整理的c# mysql 管理员权限_C# winform 权限管理系统完整源码下载(含数据库)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: scala spark 埋点统计_spa
- 下一篇: python语句x 3 3执行_Pyth